@nexus-cross/design-system 2.0.2 → 2.0.4

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 (55) hide show
  1. package/claude-rules/nexus/CLAUDE.md +109 -0
  2. package/cursor-rules/CLAUDE.md +5 -0
  3. package/cursor-rules/nexus-project-setup.mdc +106 -6
  4. package/cursor-rules/nexus-ui-api.mdc +60 -3
  5. package/dist/chunks/{chunk-JICW6KWH.js → chunk-7G7U4DP2.js} +1 -1
  6. package/dist/chunks/{chunk-3VFBPFZF.mjs → chunk-7WWQ5DS3.mjs} +10 -5
  7. package/dist/chunks/{chunk-HHXDOKXY.js → chunk-F24AY3HI.js} +2 -2
  8. package/dist/chunks/{chunk-6H7V2I3X.mjs → chunk-FY2N42XN.mjs} +6 -1
  9. package/dist/chunks/{chunk-3NSJMG3G.mjs → chunk-JFZLKFFM.mjs} +1 -1
  10. package/dist/chunks/{chunk-XEHFB62A.js → chunk-NRO7I4EI.js} +2 -6
  11. package/dist/chunks/{chunk-LNC3TV6N.mjs → chunk-P4JV4WRB.mjs} +1 -1
  12. package/dist/chunks/{chunk-U53UA76K.js → chunk-R744EATX.js} +26 -21
  13. package/dist/chunks/{chunk-HUPAHDJ7.js → chunk-TAHDSSA6.js} +6 -0
  14. package/dist/chunks/{chunk-YEWKPWK3.mjs → chunk-U6OEUBIF.mjs} +2 -6
  15. package/dist/chunks/{chunk-VCN7DMCQ.js → chunk-USPFWZ7H.js} +1 -1
  16. package/dist/chunks/{chunk-U56AGSLE.mjs → chunk-WBCXHGRL.mjs} +2 -2
  17. package/dist/hooks/useCheckDevice.d.ts.map +1 -1
  18. package/dist/hooks/useCheckDevice.js +2 -2
  19. package/dist/hooks/useCheckDevice.mjs +1 -1
  20. package/dist/hooks/useDraggableBottomSheet.js +2 -2
  21. package/dist/hooks/useDraggableBottomSheet.mjs +1 -1
  22. package/dist/hooks/useModal.js +2 -2
  23. package/dist/hooks/useModal.mjs +1 -1
  24. package/dist/image-upload.js +3 -3
  25. package/dist/image-upload.mjs +1 -1
  26. package/dist/index.js +19 -19
  27. package/dist/index.mjs +5 -5
  28. package/dist/modal/components/ModalContainer.d.ts.map +1 -1
  29. package/dist/modal/components/ModalTemplate.d.ts +1 -0
  30. package/dist/modal/components/ModalTemplate.d.ts.map +1 -1
  31. package/dist/modal/constants.d.ts +14 -0
  32. package/dist/modal/constants.d.ts.map +1 -1
  33. package/dist/modal/index.js +14 -14
  34. package/dist/modal/index.mjs +4 -4
  35. package/dist/schemas/_all.json +9 -4
  36. package/dist/schemas/modal.d.ts +3 -0
  37. package/dist/schemas/modal.d.ts.map +1 -1
  38. package/dist/schemas/modalTemplate.json +9 -4
  39. package/dist/schemas.js +17 -4
  40. package/dist/schemas.mjs +17 -4
  41. package/dist/styles/.generated/built.d.ts +1 -1
  42. package/dist/styles/.generated/built.d.ts.map +1 -1
  43. package/dist/styles/layer.js +2 -2
  44. package/dist/styles/layer.mjs +1 -1
  45. package/dist/styles.css +15 -3
  46. package/dist/styles.js +2 -2
  47. package/dist/styles.layered.css +15 -3
  48. package/dist/styles.mjs +1 -1
  49. package/dist/tokens/company.css +1 -1
  50. package/dist/tokens/css.css +1 -1
  51. package/dist/tokens-domains/gamehub-vars.css +122 -0
  52. package/dist/tokens-domains/gamehub.css +121 -0
  53. package/dist/tokens-domains/prediction-vars.css +1 -1
  54. package/dist/tokens-domains/prediction.css +1 -1
  55. package/package.json +4 -5
@@ -3,10 +3,6 @@
3
3
  var react = require('react');
4
4
 
5
5
  // src/hooks/useCheckDevice.ts
6
- function getMatchMedia(query) {
7
- if (typeof window === "undefined") return false;
8
- return window.matchMedia(query).matches;
9
- }
10
6
  var DEFAULT_BREAKPOINTS = {
11
7
  mobile: 0,
12
8
  tablet: 768,
@@ -47,8 +43,8 @@ function useCheckDevice(breakPoints) {
47
43
  }, [serialized]);
48
44
  const [result, setResult] = react.useState(() => {
49
45
  const init = {};
50
- for (const [key, query] of Object.entries(queries)) {
51
- init[key] = getMatchMedia(query);
46
+ for (const key of Object.keys(queries)) {
47
+ init[key] = false;
52
48
  }
53
49
  return init;
54
50
  });
@@ -209,7 +209,7 @@ var ImageUpload = React.forwardRef(
209
209
  ]
210
210
  }
211
211
  );
212
- const coverPreview = /* @__PURE__ */ jsx("div", { className: "nexus-image-upload__container", children: /* @__PURE__ */ jsxs(
212
+ const coverPreview = /* @__PURE__ */ jsx("div", { className: "nexus-image-upload__container nexus-image-upload__container--preview-cover", children: /* @__PURE__ */ jsxs(
213
213
  "div",
214
214
  {
215
215
  role: "button",
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkHHXDOKXY_js = require('./chunk-HHXDOKXY.js');
3
+ var chunkF24AY3HI_js = require('./chunk-F24AY3HI.js');
4
4
  var chunkNHDGKOAM_js = require('./chunk-NHDGKOAM.js');
5
5
  var chunkT2IY2TSR_js = require('./chunk-T2IY2TSR.js');
6
- var chunkXEHFB62A_js = require('./chunk-XEHFB62A.js');
6
+ var chunkNRO7I4EI_js = require('./chunk-NRO7I4EI.js');
7
7
  var chunkINP2AH3B_js = require('./chunk-INP2AH3B.js');
8
- var chunkHUPAHDJ7_js = require('./chunk-HUPAHDJ7.js');
8
+ var chunkTAHDSSA6_js = require('./chunk-TAHDSSA6.js');
9
9
  var chunkCZC76ZD5_js = require('./chunk-CZC76ZD5.js');
10
10
  var React = require('react');
11
11
  var jsxRuntime = require('react/jsx-runtime');
@@ -51,7 +51,7 @@ var Component = ({
51
51
  };
52
52
  var ModalComponent = React.forwardRef(
53
53
  ({ className, modal, breakPoints, scrollFreeze: scrollFreeze2, scrollRelease: scrollRelease2, deleteModal, resolveModal }, ref) => {
54
- const { isMobile } = chunkXEHFB62A_js.useCheckDevice_default(breakPoints);
54
+ const { isMobile } = chunkNRO7I4EI_js.useCheckDevice_default(breakPoints);
55
55
  const [status, setStatus] = React.useState("");
56
56
  const clickOutSideTarget = React.useMemo(() => {
57
57
  if (modal.props?.clickOutSideRef) {
@@ -190,21 +190,25 @@ var ModalPortal = ({ children, selector }) => {
190
190
  return mounted && element && children ? reactDom.createPortal(children, element) : null;
191
191
  };
192
192
  var ModalPortal_default = ModalPortal;
193
- var ModalContainer = ({ className = "", breakPoints, ...defaultOption }) => {
194
- const [modals, setModals] = React.useState(chunkHUPAHDJ7_js.Modal_default.modalList);
193
+ var ModalContainer = ({
194
+ className = "",
195
+ breakPoints = chunkTAHDSSA6_js.defaultBreakPoints,
196
+ ...defaultOption
197
+ }) => {
198
+ const [modals, setModals] = React.useState(chunkTAHDSSA6_js.Modal_default.modalList);
195
199
  const setModalClose = React.useCallback((params) => {
196
200
  if (!params) return;
197
201
  const { modalId, hasClose, close } = params;
198
202
  if (!hasClose) {
199
- chunkHUPAHDJ7_js.Modal_default.modalList = chunkHUPAHDJ7_js.Modal_default.modalList.map(
203
+ chunkTAHDSSA6_js.Modal_default.modalList = chunkTAHDSSA6_js.Modal_default.modalList.map(
200
204
  (m) => m.id === modalId ? { ...m, close } : m
201
205
  );
202
206
  }
203
207
  }, []);
204
208
  React.useEffect(() => {
205
- chunkHUPAHDJ7_js.Modal_default.observe({ options: defaultOption, observeFunction: setModals });
209
+ chunkTAHDSSA6_js.Modal_default.observe({ options: defaultOption, observeFunction: setModals });
206
210
  return () => {
207
- chunkHUPAHDJ7_js.Modal_default.unobserve();
211
+ chunkTAHDSSA6_js.Modal_default.unobserve();
208
212
  };
209
213
  }, [defaultOption]);
210
214
  return /* @__PURE__ */ jsxRuntime.jsx("div", { id: "modal-wrapper", className, children: modals.map(
@@ -214,8 +218,8 @@ var ModalContainer = ({ className = "", breakPoints, ...defaultOption }) => {
214
218
  ref: setModalClose,
215
219
  modal: m,
216
220
  breakPoints,
217
- deleteModal: (id) => chunkHUPAHDJ7_js.Modal_default.deleteModal(id),
218
- resolveModal: (params) => chunkHUPAHDJ7_js.Modal_default.resolveModal(params),
221
+ deleteModal: (id) => chunkTAHDSSA6_js.Modal_default.deleteModal(id),
222
+ resolveModal: (params) => chunkTAHDSSA6_js.Modal_default.resolveModal(params),
219
223
  scrollFreeze: chunkT2IY2TSR_js.scrollFreeze,
220
224
  scrollRelease: chunkT2IY2TSR_js.scrollRelease
221
225
  },
@@ -226,8 +230,8 @@ var ModalContainer = ({ className = "", breakPoints, ...defaultOption }) => {
226
230
  ref: setModalClose,
227
231
  modal: m,
228
232
  breakPoints,
229
- deleteModal: (id) => chunkHUPAHDJ7_js.Modal_default.deleteModal(id),
230
- resolveModal: (params) => chunkHUPAHDJ7_js.Modal_default.resolveModal(params),
233
+ deleteModal: (id) => chunkTAHDSSA6_js.Modal_default.deleteModal(id),
234
+ resolveModal: (params) => chunkTAHDSSA6_js.Modal_default.resolveModal(params),
231
235
  scrollFreeze: chunkT2IY2TSR_js.scrollFreeze,
232
236
  scrollRelease: chunkT2IY2TSR_js.scrollRelease
233
237
  },
@@ -414,6 +418,7 @@ var ModalTemplate = React.forwardRef(
414
418
  desc,
415
419
  hideHeader = false,
416
420
  hideFooter = true,
421
+ hideCloseBtn = false,
417
422
  dimClose,
418
423
  footer,
419
424
  close,
@@ -427,7 +432,7 @@ var ModalTemplate = React.forwardRef(
427
432
  const { dimCloseEnable } = getModalDefaultOption();
428
433
  const isBottomSheet = layout === "bottom-sheet";
429
434
  const isDraggable = layout === "draggable";
430
- const dragHandlers = chunkHHXDOKXY_js.useDraggableBottomSheet({
435
+ const dragHandlers = chunkF24AY3HI_js.useDraggableBottomSheet({
431
436
  enabled: isBottomSheet && enableDrag,
432
437
  onClose: () => close(false),
433
438
  threshold: 0.5,
@@ -568,7 +573,7 @@ var ModalTemplate = React.forwardRef(
568
573
  ref: modalHeaderRef,
569
574
  onMouseDown: isDraggable && enableDrag ? windowDrag.handleMouseDown : void 0,
570
575
  children: [
571
- /* @__PURE__ */ jsxRuntime.jsx(
576
+ !hideCloseBtn && /* @__PURE__ */ jsxRuntime.jsx(
572
577
  "button",
573
578
  {
574
579
  type: "button",
@@ -619,28 +624,28 @@ var ModalTemplate_default = ModalTemplate;
619
624
  var openModal = ((arg1, arg2 = {}) => {
620
625
  if ("component" in arg1) {
621
626
  const { component, props = {}, options = {} } = arg1;
622
- return chunkHUPAHDJ7_js.Modal_default.openModal({
627
+ return chunkTAHDSSA6_js.Modal_default.openModal({
623
628
  component,
624
629
  props: { ...props, ...options }
625
630
  });
626
631
  } else {
627
- return chunkHUPAHDJ7_js.Modal_default.openModal({
632
+ return chunkTAHDSSA6_js.Modal_default.openModal({
628
633
  component: arg1,
629
634
  props: arg2
630
635
  });
631
636
  }
632
637
  });
633
638
  var closeModal = (id, isAnimation) => {
634
- return chunkHUPAHDJ7_js.Modal_default.closeModal(id, isAnimation);
639
+ return chunkTAHDSSA6_js.Modal_default.closeModal(id, isAnimation);
635
640
  };
636
641
  var checkModal = (params) => {
637
- return chunkHUPAHDJ7_js.Modal_default.checkModal(params);
642
+ return chunkTAHDSSA6_js.Modal_default.checkModal(params);
638
643
  };
639
644
  var resetModal = () => {
640
- return chunkHUPAHDJ7_js.Modal_default.resetModal();
645
+ return chunkTAHDSSA6_js.Modal_default.resetModal();
641
646
  };
642
647
  var getModalDefaultOption = () => {
643
- return chunkHUPAHDJ7_js.Modal_default.getDefaultOption();
648
+ return chunkTAHDSSA6_js.Modal_default.getDefaultOption();
644
649
  };
645
650
 
646
651
  exports.ModalContainer_default = ModalContainer_default;
@@ -10,6 +10,11 @@ var defaultModalOption = {
10
10
  animation: { name: "pop-fade", duration: 300 },
11
11
  dimCloseEnable: true
12
12
  };
13
+ var defaultBreakPoints = {
14
+ isDesktop: "(min-width: 1280px)",
15
+ isTablet: "screen and (min-width: 768px) and (max-width: 1279px)",
16
+ isMobile: "(max-width: 767px)"
17
+ };
13
18
 
14
19
  // src/modal/Modal.ts
15
20
  var Modal = class {
@@ -270,4 +275,5 @@ function useModal() {
270
275
  }
271
276
 
272
277
  exports.Modal_default = Modal_default;
278
+ exports.defaultBreakPoints = defaultBreakPoints;
273
279
  exports.useModal = useModal;
@@ -1,10 +1,6 @@
1
1
  import { useMemo, useState, useEffect } from 'react';
2
2
 
3
3
  // src/hooks/useCheckDevice.ts
4
- function getMatchMedia(query) {
5
- if (typeof window === "undefined") return false;
6
- return window.matchMedia(query).matches;
7
- }
8
4
  var DEFAULT_BREAKPOINTS = {
9
5
  mobile: 0,
10
6
  tablet: 768,
@@ -45,8 +41,8 @@ function useCheckDevice(breakPoints) {
45
41
  }, [serialized]);
46
42
  const [result, setResult] = useState(() => {
47
43
  const init = {};
48
- for (const [key, query] of Object.entries(queries)) {
49
- init[key] = getMatchMedia(query);
44
+ for (const key of Object.keys(queries)) {
45
+ init[key] = false;
50
46
  }
51
47
  return init;
52
48
  });
@@ -231,7 +231,7 @@ var ImageUpload = React__namespace.forwardRef(
231
231
  ]
232
232
  }
233
233
  );
234
- const coverPreview = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "nexus-image-upload__container", children: /* @__PURE__ */ jsxRuntime.jsxs(
234
+ const coverPreview = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "nexus-image-upload__container nexus-image-upload__container--preview-cover", children: /* @__PURE__ */ jsxRuntime.jsxs(
235
235
  "div",
236
236
  {
237
237
  role: "button",
@@ -23,9 +23,9 @@ function useDraggableBottomSheet({
23
23
  if (!enabled) return;
24
24
  const touch = e.touches[0];
25
25
  const target = e.currentTarget;
26
- const modalInner = target.querySelector(".modal-inner");
26
+ const modalInner = target.querySelector(".nexus-modal-inner");
27
27
  if (!modalInner) return;
28
- const scrollableElement = e.target.closest(".modal-body");
28
+ const scrollableElement = e.target.closest(".nexus-modal-body");
29
29
  if (scrollableElement && scrollableElement.scrollTop > 0) return;
30
30
  dragStateRef.current = {
31
31
  isDragging: true,
@@ -1 +1 @@
1
- {"version":3,"file":"useCheckDevice.d.ts","sourceRoot":"","sources":["../../src/hooks/useCheckDevice.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,KAAK,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAoDjD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iBAAS,cAAc,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAClF,iBAAS,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,iBAAiB,CAAC;AACjF,iBAAS,cAAc,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAkDlF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"useCheckDevice.d.ts","sourceRoot":"","sources":["../../src/hooks/useCheckDevice.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,KAAK,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAiDhD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iBAAS,cAAc,IAAI;IACzB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AACD,iBAAS,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,iBAAiB,CAAA;AAChF,iBAAS,cAAc,CACrB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAmD1B,eAAe,cAAc,CAAA"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkXEHFB62A_js = require('../chunks/chunk-XEHFB62A.js');
3
+ var chunkNRO7I4EI_js = require('../chunks/chunk-NRO7I4EI.js');
4
4
 
5
5
 
6
6
 
7
- module.exports = chunkXEHFB62A_js.useCheckDevice_default;
7
+ module.exports = chunkNRO7I4EI_js.useCheckDevice_default;
@@ -1 +1 @@
1
- export { useCheckDevice_default as default } from '../chunks/chunk-YEWKPWK3.mjs';
1
+ export { useCheckDevice_default as default } from '../chunks/chunk-U6OEUBIF.mjs';
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkHHXDOKXY_js = require('../chunks/chunk-HHXDOKXY.js');
3
+ var chunkF24AY3HI_js = require('../chunks/chunk-F24AY3HI.js');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "useDraggableBottomSheet", {
8
8
  enumerable: true,
9
- get: function () { return chunkHHXDOKXY_js.useDraggableBottomSheet; }
9
+ get: function () { return chunkF24AY3HI_js.useDraggableBottomSheet; }
10
10
  });
@@ -1 +1 @@
1
- export { useDraggableBottomSheet } from '../chunks/chunk-U56AGSLE.mjs';
1
+ export { useDraggableBottomSheet } from '../chunks/chunk-WBCXHGRL.mjs';
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkHUPAHDJ7_js = require('../chunks/chunk-HUPAHDJ7.js');
3
+ var chunkTAHDSSA6_js = require('../chunks/chunk-TAHDSSA6.js');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "useModal", {
8
8
  enumerable: true,
9
- get: function () { return chunkHUPAHDJ7_js.useModal; }
9
+ get: function () { return chunkTAHDSSA6_js.useModal; }
10
10
  });
@@ -1 +1 @@
1
- export { useModal } from '../chunks/chunk-6H7V2I3X.mjs';
1
+ export { useModal } from '../chunks/chunk-FY2N42XN.mjs';
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkVCN7DMCQ_js = require('./chunks/chunk-VCN7DMCQ.js');
3
+ var chunkUSPFWZ7H_js = require('./chunks/chunk-USPFWZ7H.js');
4
4
  require('./chunks/chunk-CZC76ZD5.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "ImageUpload", {
9
9
  enumerable: true,
10
- get: function () { return chunkVCN7DMCQ_js.ImageUpload; }
10
+ get: function () { return chunkUSPFWZ7H_js.ImageUpload; }
11
11
  });
12
12
  Object.defineProperty(exports, "imageUploadVariants", {
13
13
  enumerable: true,
14
- get: function () { return chunkVCN7DMCQ_js.imageUploadVariants; }
14
+ get: function () { return chunkUSPFWZ7H_js.imageUploadVariants; }
15
15
  });
@@ -1,2 +1,2 @@
1
- export { ImageUpload, imageUploadVariants } from './chunks/chunk-LNC3TV6N.mjs';
1
+ export { ImageUpload, imageUploadVariants } from './chunks/chunk-P4JV4WRB.mjs';
2
2
  import './chunks/chunk-MCKOWMLS.mjs';
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ var chunkDICN6GKE_js = require('./chunks/chunk-DICN6GKE.js');
9
9
  var chunkDYPPVXQF_js = require('./chunks/chunk-DYPPVXQF.js');
10
10
  var chunkLYPBQI3Y_js = require('./chunks/chunk-LYPBQI3Y.js');
11
11
  var chunkLTS674LF_js = require('./chunks/chunk-LTS674LF.js');
12
- var chunkVCN7DMCQ_js = require('./chunks/chunk-VCN7DMCQ.js');
12
+ var chunkUSPFWZ7H_js = require('./chunks/chunk-USPFWZ7H.js');
13
13
  var chunkQK6NCII4_js = require('./chunks/chunk-QK6NCII4.js');
14
14
  var chunkBLGQHR3M_js = require('./chunks/chunk-BLGQHR3M.js');
15
15
  var chunkDLFV7ZZV_js = require('./chunks/chunk-DLFV7ZZV.js');
@@ -44,13 +44,13 @@ var chunkXGIJZ3NZ_js = require('./chunks/chunk-XGIJZ3NZ.js');
44
44
  var chunk2BINGHGR_js = require('./chunks/chunk-2BINGHGR.js');
45
45
  var chunk4ENXP7WH_js = require('./chunks/chunk-4ENXP7WH.js');
46
46
  var chunkMA2VCCIY_js = require('./chunks/chunk-MA2VCCIY.js');
47
- var chunkU53UA76K_js = require('./chunks/chunk-U53UA76K.js');
48
- var chunkHHXDOKXY_js = require('./chunks/chunk-HHXDOKXY.js');
47
+ var chunkR744EATX_js = require('./chunks/chunk-R744EATX.js');
48
+ var chunkF24AY3HI_js = require('./chunks/chunk-F24AY3HI.js');
49
49
  var chunkNHDGKOAM_js = require('./chunks/chunk-NHDGKOAM.js');
50
50
  var chunkT2IY2TSR_js = require('./chunks/chunk-T2IY2TSR.js');
51
- var chunkXEHFB62A_js = require('./chunks/chunk-XEHFB62A.js');
51
+ var chunkNRO7I4EI_js = require('./chunks/chunk-NRO7I4EI.js');
52
52
  var chunkINP2AH3B_js = require('./chunks/chunk-INP2AH3B.js');
53
- var chunkHUPAHDJ7_js = require('./chunks/chunk-HUPAHDJ7.js');
53
+ var chunkTAHDSSA6_js = require('./chunks/chunk-TAHDSSA6.js');
54
54
  var chunkP3DZKXG4_js = require('./chunks/chunk-P3DZKXG4.js');
55
55
  var chunkWKCXACMZ_js = require('./chunks/chunk-WKCXACMZ.js');
56
56
  var chunkS2GMEC43_js = require('./chunks/chunk-S2GMEC43.js');
@@ -438,11 +438,11 @@ Object.defineProperty(exports, "DatePicker", {
438
438
  });
439
439
  Object.defineProperty(exports, "ImageUpload", {
440
440
  enumerable: true,
441
- get: function () { return chunkVCN7DMCQ_js.ImageUpload; }
441
+ get: function () { return chunkUSPFWZ7H_js.ImageUpload; }
442
442
  });
443
443
  Object.defineProperty(exports, "imageUploadVariants", {
444
444
  enumerable: true,
445
- get: function () { return chunkVCN7DMCQ_js.imageUploadVariants; }
445
+ get: function () { return chunkUSPFWZ7H_js.imageUploadVariants; }
446
446
  });
447
447
  Object.defineProperty(exports, "ClientOnly", {
448
448
  enumerable: true,
@@ -794,43 +794,43 @@ Object.defineProperty(exports, "avatarVariants", {
794
794
  });
795
795
  Object.defineProperty(exports, "ModalContainer", {
796
796
  enumerable: true,
797
- get: function () { return chunkU53UA76K_js.ModalContainer_default; }
797
+ get: function () { return chunkR744EATX_js.ModalContainer_default; }
798
798
  });
799
799
  Object.defineProperty(exports, "ModalPortalTarget", {
800
800
  enumerable: true,
801
- get: function () { return chunkU53UA76K_js.ModalPortalTarget_default; }
801
+ get: function () { return chunkR744EATX_js.ModalPortalTarget_default; }
802
802
  });
803
803
  Object.defineProperty(exports, "ModalTemplate", {
804
804
  enumerable: true,
805
- get: function () { return chunkU53UA76K_js.ModalTemplate_default; }
805
+ get: function () { return chunkR744EATX_js.ModalTemplate_default; }
806
806
  });
807
807
  Object.defineProperty(exports, "checkModal", {
808
808
  enumerable: true,
809
- get: function () { return chunkU53UA76K_js.checkModal; }
809
+ get: function () { return chunkR744EATX_js.checkModal; }
810
810
  });
811
811
  Object.defineProperty(exports, "closeModal", {
812
812
  enumerable: true,
813
- get: function () { return chunkU53UA76K_js.closeModal; }
813
+ get: function () { return chunkR744EATX_js.closeModal; }
814
814
  });
815
815
  Object.defineProperty(exports, "getModalDefaultOption", {
816
816
  enumerable: true,
817
- get: function () { return chunkU53UA76K_js.getModalDefaultOption; }
817
+ get: function () { return chunkR744EATX_js.getModalDefaultOption; }
818
818
  });
819
819
  Object.defineProperty(exports, "modal", {
820
820
  enumerable: true,
821
- get: function () { return chunkU53UA76K_js.openModal; }
821
+ get: function () { return chunkR744EATX_js.openModal; }
822
822
  });
823
823
  Object.defineProperty(exports, "openModal", {
824
824
  enumerable: true,
825
- get: function () { return chunkU53UA76K_js.openModal; }
825
+ get: function () { return chunkR744EATX_js.openModal; }
826
826
  });
827
827
  Object.defineProperty(exports, "resetModal", {
828
828
  enumerable: true,
829
- get: function () { return chunkU53UA76K_js.resetModal; }
829
+ get: function () { return chunkR744EATX_js.resetModal; }
830
830
  });
831
831
  Object.defineProperty(exports, "useDraggableBottomSheet", {
832
832
  enumerable: true,
833
- get: function () { return chunkHHXDOKXY_js.useDraggableBottomSheet; }
833
+ get: function () { return chunkF24AY3HI_js.useDraggableBottomSheet; }
834
834
  });
835
835
  Object.defineProperty(exports, "useDraggableWindow", {
836
836
  enumerable: true,
@@ -846,7 +846,7 @@ Object.defineProperty(exports, "scrollRelease", {
846
846
  });
847
847
  Object.defineProperty(exports, "useCheckDevice", {
848
848
  enumerable: true,
849
- get: function () { return chunkXEHFB62A_js.useCheckDevice_default; }
849
+ get: function () { return chunkNRO7I4EI_js.useCheckDevice_default; }
850
850
  });
851
851
  Object.defineProperty(exports, "useClickOutside", {
852
852
  enumerable: true,
@@ -854,7 +854,7 @@ Object.defineProperty(exports, "useClickOutside", {
854
854
  });
855
855
  Object.defineProperty(exports, "useModal", {
856
856
  enumerable: true,
857
- get: function () { return chunkHUPAHDJ7_js.useModal; }
857
+ get: function () { return chunkTAHDSSA6_js.useModal; }
858
858
  });
859
859
  Object.defineProperty(exports, "Button", {
860
860
  enumerable: true,
package/dist/index.mjs CHANGED
@@ -7,7 +7,7 @@ export { Slider, sliderVariants } from './chunks/chunk-H2G5FMRN.mjs';
7
7
  export { TagInput, tagInputVariants } from './chunks/chunk-H2V7RHYV.mjs';
8
8
  export { NxImage } from './chunks/chunk-WZFKTTVX.mjs';
9
9
  export { DatePicker } from './chunks/chunk-FBC53TOS.mjs';
10
- export { ImageUpload, imageUploadVariants } from './chunks/chunk-LNC3TV6N.mjs';
10
+ export { ImageUpload, imageUploadVariants } from './chunks/chunk-P4JV4WRB.mjs';
11
11
  export { ClientOnly } from './chunks/chunk-AOXXE5UQ.mjs';
12
12
  export { Skeleton } from './chunks/chunk-P2T72N62.mjs';
13
13
  export { Countdown, useCountdown } from './chunks/chunk-LI7SFBUQ.mjs';
@@ -42,13 +42,13 @@ export { TextArea, textAreaVariants } from './chunks/chunk-ZU4AWAFT.mjs';
42
42
  export { NumberInput, numberInputBind, numberInputVariants } from './chunks/chunk-RL5UAEGQ.mjs';
43
43
  export { PriceInput, priceInputVariants } from './chunks/chunk-WGGBE4ZD.mjs';
44
44
  export { Avatar, avatarVariants } from './chunks/chunk-YLO4UKSC.mjs';
45
- export { ModalContainer_default as ModalContainer, ModalPortalTarget_default as ModalPortalTarget, ModalTemplate_default as ModalTemplate, checkModal, closeModal, getModalDefaultOption, openModal as modal, openModal, resetModal } from './chunks/chunk-3VFBPFZF.mjs';
46
- export { useDraggableBottomSheet } from './chunks/chunk-U56AGSLE.mjs';
45
+ export { ModalContainer_default as ModalContainer, ModalPortalTarget_default as ModalPortalTarget, ModalTemplate_default as ModalTemplate, checkModal, closeModal, getModalDefaultOption, openModal as modal, openModal, resetModal } from './chunks/chunk-7WWQ5DS3.mjs';
46
+ export { useDraggableBottomSheet } from './chunks/chunk-WBCXHGRL.mjs';
47
47
  export { useDraggableWindow } from './chunks/chunk-4J3GCZ7W.mjs';
48
48
  export { scrollFreeze, scrollRelease } from './chunks/chunk-54IA2P2Z.mjs';
49
- export { useCheckDevice_default as useCheckDevice } from './chunks/chunk-YEWKPWK3.mjs';
49
+ export { useCheckDevice_default as useCheckDevice } from './chunks/chunk-U6OEUBIF.mjs';
50
50
  export { useClickOutside_default as useClickOutside } from './chunks/chunk-OTGS6BDQ.mjs';
51
- export { useModal } from './chunks/chunk-6H7V2I3X.mjs';
51
+ export { useModal } from './chunks/chunk-FY2N42XN.mjs';
52
52
  export { Button, buttonVariants } from './chunks/chunk-VVXQZ4XH.mjs';
53
53
  export { Chip, chipVariants } from './chunks/chunk-RX5UKRYK.mjs';
54
54
  export { Badge, badgeVariants } from './chunks/chunk-CUTMLBC3.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"ModalContainer.d.ts","sourceRoot":"","sources":["../../../src/modal/components/ModalContainer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAa,MAAM,UAAU,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAM9D,KAAK,KAAK,GAAG,kBAAkB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,8CAAmD,KAAK,4CA4D/E,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"ModalContainer.d.ts","sourceRoot":"","sources":["../../../src/modal/components/ModalContainer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAa,MAAM,UAAU,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAO9D,KAAK,KAAK,GAAG,kBAAkB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,8CAIrB,KAAK,4CA4DP,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -5,6 +5,7 @@ interface PropsType extends ModalTemplatePropsType {
5
5
  layout?: ModalLayout;
6
6
  hideHeader?: boolean;
7
7
  hideFooter?: boolean;
8
+ hideCloseBtn?: boolean;
8
9
  footer?: ReactElement | string;
9
10
  innerClassName?: string;
10
11
  bodyClassName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ModalTemplate.d.ts","sourceRoot":"","sources":["../../../src/modal/components/ModalTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,KAAK,YAAY,EAMlB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAKvD,OAAO,EACL,KAAK,WAAW,EASjB,MAAM,0BAA0B,CAAC;AAElC,UAAU,SAAU,SAAQ,sBAAsB;IAChD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkBD,QAAA,MAAM,aAAa,kFA0PlB,CAAC;AAIF,YAAY,EAAE,SAAS,IAAI,kBAAkB,EAAE,CAAC;AAChD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ModalTemplate.d.ts","sourceRoot":"","sources":["../../../src/modal/components/ModalTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,KAAK,YAAY,EAMlB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAKvD,OAAO,EACL,KAAK,WAAW,EASjB,MAAM,0BAA0B,CAAC;AAElC,UAAU,SAAU,SAAQ,sBAAsB;IAChD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkBD,QAAA,MAAM,aAAa,kFA6PlB,CAAC;AAIF,YAAY,EAAE,SAAS,IAAI,kBAAkB,EAAE,CAAC;AAChD,eAAe,aAAa,CAAC"}
@@ -1,3 +1,17 @@
1
+ import type { BreakPoints } from '../hooks/useCheckDevice';
1
2
  import type { DefaultModalOption } from './types';
2
3
  export declare const defaultModalOption: DefaultModalOption;
4
+ /**
5
+ * ModalContainer 의 기본 breakPoints.
6
+ *
7
+ * useCheckDevice 의 숫자형 default { mobile: 0, tablet: 768, desktop: 1280 } 와
8
+ * 매칭 영역이 동일하다. ModalComponent 가 `isMobile` 키로 디바이스를 판별하므로,
9
+ * 키 이름을 legacy 형식 (`isMobile`, `isTablet`, `isDesktop`) 으로 통일하기 위해
10
+ * 기본값을 별도로 둔다.
11
+ *
12
+ * - mobile : 0 ~ 767px
13
+ * - tablet : 768 ~ 1279px
14
+ * - desktop : 1280px+
15
+ */
16
+ export declare const defaultBreakPoints: Required<BreakPoints>;
3
17
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/modal/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,eAAO,MAAM,kBAAkB,EAAE,kBAGhC,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/modal/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,eAAO,MAAM,kBAAkB,EAAE,kBAGhC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,WAAW,CAIpD,CAAC"}
@@ -1,53 +1,53 @@
1
1
  'use strict';
2
2
 
3
- var chunkU53UA76K_js = require('../chunks/chunk-U53UA76K.js');
4
- require('../chunks/chunk-HHXDOKXY.js');
3
+ var chunkR744EATX_js = require('../chunks/chunk-R744EATX.js');
4
+ require('../chunks/chunk-F24AY3HI.js');
5
5
  require('../chunks/chunk-NHDGKOAM.js');
6
6
  require('../chunks/chunk-T2IY2TSR.js');
7
- require('../chunks/chunk-XEHFB62A.js');
7
+ require('../chunks/chunk-NRO7I4EI.js');
8
8
  require('../chunks/chunk-INP2AH3B.js');
9
- var chunkHUPAHDJ7_js = require('../chunks/chunk-HUPAHDJ7.js');
9
+ var chunkTAHDSSA6_js = require('../chunks/chunk-TAHDSSA6.js');
10
10
  require('../chunks/chunk-CZC76ZD5.js');
11
11
 
12
12
 
13
13
 
14
14
  Object.defineProperty(exports, "ModalContainer", {
15
15
  enumerable: true,
16
- get: function () { return chunkU53UA76K_js.ModalContainer_default; }
16
+ get: function () { return chunkR744EATX_js.ModalContainer_default; }
17
17
  });
18
18
  Object.defineProperty(exports, "ModalPortalTarget", {
19
19
  enumerable: true,
20
- get: function () { return chunkU53UA76K_js.ModalPortalTarget_default; }
20
+ get: function () { return chunkR744EATX_js.ModalPortalTarget_default; }
21
21
  });
22
22
  Object.defineProperty(exports, "ModalTemplate", {
23
23
  enumerable: true,
24
- get: function () { return chunkU53UA76K_js.ModalTemplate_default; }
24
+ get: function () { return chunkR744EATX_js.ModalTemplate_default; }
25
25
  });
26
26
  Object.defineProperty(exports, "checkModal", {
27
27
  enumerable: true,
28
- get: function () { return chunkU53UA76K_js.checkModal; }
28
+ get: function () { return chunkR744EATX_js.checkModal; }
29
29
  });
30
30
  Object.defineProperty(exports, "closeModal", {
31
31
  enumerable: true,
32
- get: function () { return chunkU53UA76K_js.closeModal; }
32
+ get: function () { return chunkR744EATX_js.closeModal; }
33
33
  });
34
34
  Object.defineProperty(exports, "getModalDefaultOption", {
35
35
  enumerable: true,
36
- get: function () { return chunkU53UA76K_js.getModalDefaultOption; }
36
+ get: function () { return chunkR744EATX_js.getModalDefaultOption; }
37
37
  });
38
38
  Object.defineProperty(exports, "modal", {
39
39
  enumerable: true,
40
- get: function () { return chunkU53UA76K_js.openModal; }
40
+ get: function () { return chunkR744EATX_js.openModal; }
41
41
  });
42
42
  Object.defineProperty(exports, "openModal", {
43
43
  enumerable: true,
44
- get: function () { return chunkU53UA76K_js.openModal; }
44
+ get: function () { return chunkR744EATX_js.openModal; }
45
45
  });
46
46
  Object.defineProperty(exports, "resetModal", {
47
47
  enumerable: true,
48
- get: function () { return chunkU53UA76K_js.resetModal; }
48
+ get: function () { return chunkR744EATX_js.resetModal; }
49
49
  });
50
50
  Object.defineProperty(exports, "useModal", {
51
51
  enumerable: true,
52
- get: function () { return chunkHUPAHDJ7_js.useModal; }
52
+ get: function () { return chunkTAHDSSA6_js.useModal; }
53
53
  });
@@ -1,8 +1,8 @@
1
- export { ModalContainer_default as ModalContainer, ModalPortalTarget_default as ModalPortalTarget, ModalTemplate_default as ModalTemplate, checkModal, closeModal, getModalDefaultOption, openModal as modal, openModal, resetModal } from '../chunks/chunk-3VFBPFZF.mjs';
2
- import '../chunks/chunk-U56AGSLE.mjs';
1
+ export { ModalContainer_default as ModalContainer, ModalPortalTarget_default as ModalPortalTarget, ModalTemplate_default as ModalTemplate, checkModal, closeModal, getModalDefaultOption, openModal as modal, openModal, resetModal } from '../chunks/chunk-7WWQ5DS3.mjs';
2
+ import '../chunks/chunk-WBCXHGRL.mjs';
3
3
  import '../chunks/chunk-4J3GCZ7W.mjs';
4
4
  import '../chunks/chunk-54IA2P2Z.mjs';
5
- import '../chunks/chunk-YEWKPWK3.mjs';
5
+ import '../chunks/chunk-U6OEUBIF.mjs';
6
6
  import '../chunks/chunk-OTGS6BDQ.mjs';
7
- export { useModal } from '../chunks/chunk-6H7V2I3X.mjs';
7
+ export { useModal } from '../chunks/chunk-FY2N42XN.mjs';
8
8
  import '../chunks/chunk-MCKOWMLS.mjs';
@@ -1828,6 +1828,11 @@
1828
1828
  "default": true,
1829
1829
  "description": "Hide footer"
1830
1830
  },
1831
+ "hideCloseBtn": {
1832
+ "type": "boolean",
1833
+ "default": false,
1834
+ "description": "Hide the X close button in the header"
1835
+ },
1831
1836
  "footer": {
1832
1837
  "description": "Custom footer (ReactElement)"
1833
1838
  },
@@ -1879,15 +1884,15 @@
1879
1884
  },
1880
1885
  "className": {
1881
1886
  "type": "string",
1882
- "description": "Root wrapper style"
1887
+ "description": "Root wrapper style — applied to the full-screen `position: fixed; inset: 0` flex container that centers the modal. NOTE: width / max-width / height utilities (`w-[400px]`, `max-w-[92vw]`, `h-*`) MUST NOT go here — they will resize the wrap layer, not the panel. Put sizing on `innerClassName` instead."
1883
1888
  },
1884
1889
  "innerClassName": {
1885
1890
  "type": "string",
1886
- "description": "Modal body style"
1891
+ "description": "Modal panel (the actual dialog box) style — apply ALL sizing utilities here: `w-[400px]`, `max-w-[92vw]`, `min-h-*`, `max-h-[80vh]`, `rounded-*`, panel background, etc. This is the most common override point."
1887
1892
  },
1888
1893
  "bodyClassName": {
1889
1894
  "type": "string",
1890
- "description": "Body area style"
1895
+ "description": "Body area style (inside the panel, between header and footer)"
1891
1896
  },
1892
1897
  "footerClassName": {
1893
1898
  "type": "string",
@@ -1903,7 +1908,7 @@
1903
1908
  }
1904
1909
  },
1905
1910
  "additionalProperties": false,
1906
- "description": "Modal template. All modal components must be wrapped with ModalTemplate.\n\nWHEN TO USE:\n • Force user decision (delete confirm, submit confirm, blocking dialog)\n • Long form/flow that needs full attention\n • Side panel that doesn't block main flow → Drawer instead\n • Inline contextual UI → Popover instead\n • Short hint → Tooltip instead\n\nPREFERRED API: use modal() / useModal() imperative API rather than mounting <ModalTemplate> directly. modal() handles stacking, focus return, ESC, and background scroll automatically.\n\nANTI-PATTERNS:\n ✗ Custom <div className=\"fixed inset-0\"> → modal() (loses focus trap, a11y)\n ✗ Direct <ModalTemplate> mount in render tree → wrap with modal()\n ✗ Modal with no title for screen readers → always pass title prop\n ✗ Multiple modals stacking confusingly → use isAlone:true to close prior modals"
1911
+ "description": "Modal template. All modal components must be wrapped with ModalTemplate.\n\nWHEN TO USE:\n • Force user decision (delete confirm, submit confirm, blocking dialog)\n • Long form/flow that needs full attention\n • Side panel that doesn't block main flow → Drawer instead\n • Inline contextual UI → Popover instead\n • Short hint → Tooltip instead\n\nPREFERRED API: use modal() / useModal() imperative API rather than mounting <ModalTemplate> directly. modal() handles stacking, focus return, ESC, and background scroll automatically.\n\nSIZING (must read — most common AI mistake):\n • The modal has TWO layers:\n 1. wrap = full-screen `position: fixed; inset: 0` flex container → controlled by `className`\n 2. panel = the actual dialog box rendered at the center → controlled by `innerClassName`\n • Sizing utilities (`w-*`, `max-w-*`, `min-w-*`, `h-*`, `max-h-*`) MUST go on `innerClassName`.\n • Putting `w-[400px] max-w-[92vw]` on `className` shrinks the wrap (the centering layer), NOT the panel — the panel keeps its default width and the modal looks broken.\n\nANTI-PATTERNS:\n ✗ Custom <div className=\"fixed inset-0\"> → modal() (loses focus trap, a11y)\n ✗ Direct <ModalTemplate> mount in render tree → wrap with modal()\n ✗ Modal with no title for screen readers → always pass title prop\n ✗ Multiple modals stacking confusingly → use isAlone:true to close prior modals\n ✗ <ModalTemplate className=\"w-[400px] max-w-[92vw]\"> → put sizing on `innerClassName` instead"
1907
1912
  }
1908
1913
  },
1909
1914
  "$schema": "http://json-schema.org/draft-07/schema#"