@exem-ui/react 0.3.4-next.20260724103452 → 0.3.4-next.20260727011908
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.
- package/dist/{chunk-6BABIL2T.js → chunk-57QR33TR.js} +0 -2
- package/dist/{chunk-LRZ7FXL5.mjs → chunk-GWP7YKJP.mjs} +0 -2
- package/dist/{chunk-PGJ4JIXU.mjs → chunk-NZR3A6CI.mjs} +1 -3
- package/dist/{chunk-BCWGTFIJ.js → chunk-VPYR4AHX.js} +3 -5
- package/dist/code-editor/index.js +0 -2
- package/dist/code-editor/index.mjs +0 -2
- package/dist/flat/index.js +8 -10
- package/dist/flat/index.mjs +2 -4
- package/dist/icon/index.js +451 -453
- package/dist/icon/index.mjs +1 -3
- package/dist/index.js +49 -51
- package/dist/index.mjs +3 -5
- package/package.json +3 -3
- package/dist/chunk-6BABIL2T.js.map +0 -1
- package/dist/chunk-BCWGTFIJ.js.map +0 -1
- package/dist/chunk-LRZ7FXL5.mjs.map +0 -1
- package/dist/chunk-PGJ4JIXU.mjs.map +0 -1
- package/dist/code-editor/index.js.map +0 -1
- package/dist/code-editor/index.mjs.map +0 -1
- package/dist/flat/index.js.map +0 -1
- package/dist/flat/index.mjs.map +0 -1
- package/dist/icon/index.js.map +0 -1
- package/dist/icon/index.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/picker/color-palette/colorPaletteVariants.ts","../src/picker/color-palette/ColorPalette.tsx","../src/picker/color-palette/colorPaletteUtils.ts","../src/flat/FlatColorPalette.tsx","../src/segment/Segment.tsx","../src/flat/FlatSegment.tsx","../src/overlayList/overlayListVariants.ts","../src/scrollArea/ScrollArea.tsx","../src/input/inputVariants.ts","../src/input/selectVariants.ts","../src/input/Select.tsx","../src/flat/FlatSelect.tsx","../src/tabs/tabsVariants.ts","../src/tabs/Tabs.tsx","../src/flat/FlatTabs.tsx","../src/tooltip/Tooltip.tsx","../src/flat/FlatTooltip.tsx"],"names":["jsx","cva","TabsPrimitive","cn","jsxs","createContext","useContext","forwardRef"],"mappings":";;;;;;;;;;;AAIO,IAAM,wBAAA,GAGT;AAAA,EACF,IAAA,EAAM,EAAE,UAAA,EAAY,cAAA,EAAgB,MAAM,gBAAA,EAAiB;AAAA,EAC3D,GAAA,EAAK,EAAE,UAAA,EAAY,WAAA,EAAa,MAAM,aAAA,EAAc;AAAA,EACpD,MAAA,EAAQ,EAAE,UAAA,EAAY,cAAA,EAAgB,MAAM,gBAAA,EAAiB;AAAA,EAC7D,KAAA,EAAO,EAAE,UAAA,EAAY,aAAA,EAAe,MAAM,eAAA,EAAgB;AAAA,EAC1D,MAAA,EAAQ,EAAE,UAAA,EAAY,cAAA,EAAgB,MAAM,gBAAA,EAAiB;AAAA,EAC7D,IAAA,EAAM,EAAE,UAAA,EAAY,YAAA,EAAc,MAAM,cAAA,EAAe;AAAA,EACvD,KAAA,EAAO,EAAE,UAAA,EAAY,aAAA,EAAe,MAAM,eAAA,EAAgB;AAAA,EAC1D,OAAA,EAAS,EAAE,UAAA,EAAY,eAAA,EAAiB,MAAM,iBAAA,EAAkB;AAAA,EAChE,IAAA,EAAM,EAAE,UAAA,EAAY,YAAA,EAAc,MAAM,cAAA,EAAe;AAAA,EACvD,IAAA,EAAM,EAAE,UAAA,EAAY,YAAA,EAAc,MAAM,cAAA,EAAe;AAAA,EACvD,GAAA,EAAK,EAAE,UAAA,EAAY,WAAA,EAAa,MAAM,aAAA,EAAc;AAAA,EACpD,IAAA,EAAM,EAAE,UAAA,EAAY,YAAA,EAAc,MAAM,cAAA,EAAe;AAAA,EACvD,MAAA,EAAQ,EAAE,UAAA,EAAY,cAAA,EAAgB,MAAM,gBAAA,EAAiB;AAAA,EAC7D,MAAA,EAAQ,EAAE,UAAA,EAAY,cAAA,EAAgB,MAAM,gBAAA,EAAiB;AAAA,EAC7D,MAAA,EAAQ,EAAE,UAAA,EAAY,cAAA,EAAgB,MAAM,gBAAA,EAAiB;AAAA,EAC7D,OAAA,EAAS,EAAE,UAAA,EAAY,eAAA,EAAiB,MAAM,iBAAA,EAAkB;AAAA,EAChE,IAAA,EAAM,EAAE,UAAA,EAAY,YAAA,EAAc,MAAM,cAAA,EAAe;AAAA,EACvD,IAAA,EAAM,EAAE,UAAA,EAAY,YAAA,EAAc,MAAM,cAAA;AAC1C;AAEO,IAAM,iBAAA,GAAoB,GAAA;AAAA,EAC/B,iOAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,yBAAyB,IAAA,CAAK,UAAA;AAAA,QACpC,GAAA,EAAK,yBAAyB,GAAA,CAAI,UAAA;AAAA,QAClC,MAAA,EAAQ,yBAAyB,MAAA,CAAO,UAAA;AAAA,QACxC,KAAA,EAAO,yBAAyB,KAAA,CAAM,UAAA;AAAA,QACtC,MAAA,EAAQ,yBAAyB,MAAA,CAAO,UAAA;AAAA,QACxC,IAAA,EAAM,yBAAyB,IAAA,CAAK,UAAA;AAAA,QACpC,KAAA,EAAO,yBAAyB,KAAA,CAAM,UAAA;AAAA,QACtC,OAAA,EAAS,yBAAyB,OAAA,CAAQ,UAAA;AAAA,QAC1C,IAAA,EAAM,yBAAyB,IAAA,CAAK,UAAA;AAAA,QACpC,IAAA,EAAM,yBAAyB,IAAA,CAAK,UAAA;AAAA,QACpC,GAAA,EAAK,yBAAyB,GAAA,CAAI,UAAA;AAAA,QAClC,IAAA,EAAM,yBAAyB,IAAA,CAAK,UAAA;AAAA,QACpC,MAAA,EAAQ,yBAAyB,MAAA,CAAO,UAAA;AAAA,QACxC,MAAA,EAAQ,yBAAyB,MAAA,CAAO,UAAA;AAAA,QACxC,MAAA,EAAQ,yBAAyB,MAAA,CAAO,UAAA;AAAA,QACxC,OAAA,EAAS,yBAAyB,OAAA,CAAQ,UAAA;AAAA,QAC1C,IAAA,EAAM,yBAAyB,IAAA,CAAK,UAAA;AAAA,QACpC,IAAA,EAAM,yBAAyB,IAAA,CAAK;AAAA;AACtC;AACF;AAEJ,CAAA;ACXA,SAAS,aAAa,EAAE,SAAA,EAAW,aAAA,EAAe,GAAG,OAAM,EAAsB;AAC/E,EAAA,uBACE,GAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA;AAAA,MAC/C,aAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,mBAAmB,EAAE,KAAA,EAAO,WAAW,QAAA,EAAU,GAAG,OAAM,EAA4B;AAC7F,EAAA,uBACE,GAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,KAAA,EAAO,KAAA;AAAA,MACP,YAAA,EAAY,KAAA;AAAA,MACZ,WAAW,EAAA,CAAG,iBAAA,CAAkB,EAAE,KAAA,EAAO,GAAG,SAAS,CAAA;AAAA,MACpD,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAqB,+BAApB,EACE,QAAA,EAAA,QAAA,wBAAa,KAAA,EAAA,EAAU,SAAA,EAAU,iCAAgC,CAAA,EACpE;AAAA;AAAA,GACF;AAEJ;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;AAC3B,kBAAA,CAAmB,WAAA,GAAc,qBAAA;AAEjC,YAAA,CAAa,MAAA,GAAS,kBAAA;;;AClEf,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM;AACR;AAKO,IAAM,gBAAmC,kBAAA,CAAmB;AAG5D,SAAS,WAAA,CACd,OACA,OAAA,EAC4B;AAC5B,EAAA,OAAQ,OAAA,CAA8B,SAAS,KAAK,CAAA;AACtD;AAMO,SAAS,oBAAA,CACd,OACA,OAAA,EACmB;AACnB,EAAA,IAAI,WAAA,CAAY,KAAA,EAAO,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,aAAA;AACvB;ACjBA,SAAS,gBAAA,CAA+D;AAAA,EACtE,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,MAAM,SAAA,GAAY,KAAA;AAClB,EAAA,uBACEA,GAAAA,CAAC,YAAA,EAAA,EAAc,GAAG,SAAA,EACf,kBAAQ,GAAA,CAAI,CAAC,KAAA,qBACZA,IAAC,YAAA,CAAa,MAAA,EAAb,EAAgC,KAAA,EAAA,EAAP,KAAqB,CAChD,CAAA,EACH,CAAA;AAEJ;AAEA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACJ/B,IAAM,mBAAA,GAAsBC,GAAAA;AAAA,EAC1B,kFAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,iBAAA;AAAA,QACP,MAAA,EAAQ,iBAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAEA,IAAM,mBAAA,GAAsBA,GAAAA;AAAA,EAC1B;AAAA,IACE,sDAAA;AAAA,IACA,yEAAA;AAAA,IACA,6BAAA;AAAA,IACA,wHAAA;AAAA,IACA,4FAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,qCAAA;AAAA,QACP,MAAA,EAAQ,mCAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAEA,IAAM,mBAAA,GAAsBA,IAAI,kCAAA,EAAoC;AAAA,EAClE,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,QAAA;AAAA,MACP,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AAED,IAAM,cAAA,GAAiB,cAA+C,MAAS,CAAA;AAE/E,IAAM,oBAAoB,MAAM;AAC9B,EAAA,MAAM,OAAA,GAAU,WAAW,cAAc,CAAA;AACzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,OAAA;AACT,CAAA;AAqBA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CAAC,EAAE,IAAA,GAAO,QAAA,EAAU,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBACxCD,GAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,EAAE,IAAA,EAAK,EACrC,QAAA,kBAAAA,GAAAA,CAAeE,cAAA,CAAA,IAAA,EAAd,EAAmB,GAAA,EAAW,GAAG,KAAA,EAC/B,QAAA,EACH,CAAA,EACF;AAEJ;AAEA,OAAA,CAAQ,IAAA,GAAO,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,iBAAA,EAAkB;AACnC,IAAA,uBACEF,GAAAA;AAAA,MAAeE,cAAA,CAAA,IAAA;AAAA,MAAd;AAAA,QACC,GAAA;AAAA,QACA,WAAWC,EAAAA,CAAG,mBAAA,CAAoB,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,QACrD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AAEA,OAAA,CAAQ,IAAA,GAAO,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AACpD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,iBAAA,EAAkB;AAEnC,IAAA,uBACE,IAAA;AAAA,MAAeD,cAAA,CAAA,OAAA;AAAA,MAAd;AAAA,QACC,GAAA;AAAA,QACA,WAAWC,EAAAA,CAAG,mBAAA,CAAoB,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,QACrD,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA,oBAAYH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,EAAAA,CAAG,mBAAA,CAAoB,EAAE,IAAA,EAAM,CAAC,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,0BAC3EH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAqB,QAAA,EAAS;AAAA;AAAA;AAAA,KAChD;AAAA,EAEJ;AACF,CAAA;AAEA,OAAA,CAAQ,OAAA,GAAU,UAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,wBACxBA,GAAAA;AAAA,IAAeE,cAAA,CAAA,OAAA;AAAA,IAAd;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAWC,EAAAA;AAAA,QACT,4HAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA;AAGV,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AACtB,OAAA,CAAQ,KAAK,WAAA,GAAc,cAAA;AAC3B,OAAA,CAAQ,QAAQ,WAAA,GAAc,iBAAA;AAC9B,OAAA,CAAQ,KAAK,WAAA,GAAc,cAAA;ACzI3B,SAAS,WAAA,CAA4D;AAAA,EACnE,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4B;AAC1B,EAAA,MAAM,SAAA,GAAY,KAAA;AAClB,EAAA,uBACEH,GAAAA,CAAC,OAAA,EAAA,EAAS,GAAG,SAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,OAAA,CAAQ,IAAA,EAAR,EAAa,SAAA,EACX,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,qBACV,aAAA,CAAC,OAAA,CAAQ,IAAA,EAAR,EAAc,GAAG,IAAA,EAAM,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,QAAA,IAAY,IAAA,CAAK,QAAA,EAAU,CAC/E,GACH,CAAA,EACF,CAAA;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AC5CnB,IAAM,mBAAA,GAAsB;AAAA,EACjC,OAAA,EAASG,EAAAA;AAAA,IACP,0HAAA;AAAA,IACA;AAAA,GACF;AAAA,EAEA,QAAA,EAAUA,GAAG,2BAA2B,CAAA;AAAA,EAExC,IAAA,EAAMF,GAAAA;AAAA,IACJ,yOAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAClC,QAAA,EAAU;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ,KAAA;AAAA,UACR,KAAA,EAAO,KAAA;AAAA,UACP,MAAA,EAAQ,KAAA;AAAA,UACR,KAAA,EAAO;AAAA;AACT;AACF;AACF,GACF;AAAA,EACA,QAAA,EAAUA,IAAI,2CAAA,EAA6C;AAAA,IACzD,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAClC,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT;AACF,GACD,CAAA;AAAA,EAED,QAAA,EAAUA,IAAI,6DAAA,EAA+D;AAAA,IAC3E,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAClC,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO,QAAA;AAAA,QACP,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT;AACF,GACD;AACH;AChDA,SAAS,SAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,GAAG;AACL,CAAA,EAAyE;AACvE,EAAA,uBACED,GAAAA;AAAA,IAAqB,mBAAA,CAAA,mBAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,WAAA;AAAA,MACA,SAAA,EAAWG,EAAAA;AAAA,QACT,gDAAA;AAAA,QACA,gBAAgB,UAAA,IACd,0EAAA;AAAA,QACF,gBAAgB,YAAA,IAAgB,qCAAA;AAAA,QAChC;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAH,GAAAA;AAAA,QAAqB,mBAAA,CAAA,eAAA;AAAA,QAApB;AAAA,UACC,WAAA,EAAU,mBAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,GACF;AAEJ;AAeA,SAAS,UAAA,CAAW;AAAA,EAClB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAA,GAAwB,KAAA;AAAA,EACxB,uBAAA,GAA0B,KAAA;AAAA,EAC1B,uBAAA,GAA0B,KAAA;AAAA,EAC1B,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,uBACEI,IAAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAWD,EAAAA;AAAA,QACT,gCAAA;AAAA;AAAA;AAAA,QAGA,uBAAA,IAA2B,iDAAA;AAAA,QAC3B;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAqB,mBAAA,CAAA,QAAA;AAAA,UAApB;AAAA,YACC,WAAA,EAAU,sBAAA;AAAA,YACV,GAAA,EAAK,SAAA;AAAA,YACL,QAAA;AAAA,YACA,SAAA,EAAWG,EAAAA;AAAA,cACT,6BAAA;AAAA,cACA,uBAAA,IAA2B;AAAA,aAC7B;AAAA,YAEC;AAAA;AAAA,SACH;AAAA,QACC,CAAC,yCAAyBH,GAAAA,CAAC,aAAU,WAAA,EAAY,UAAA,EAAW,YAAU,IAAA,EAAC,CAAA;AAAA,QACvE,EAAE,2BAA2B,uBAAA,CAAA,oBAC5BA,IAAC,SAAA,EAAA,EAAU,WAAA,EAAY,YAAA,EAAa,UAAA,EAAU,IAAA,EAAC,CAAA;AAAA,wBAEjDA,GAAAA,CAAqB,mBAAA,CAAA,MAAA,EAApB,EAA2B;AAAA;AAAA;AAAA,GAC9B;AAEJ;AC3FO,IAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,SAAA,EAAWC,IAAI,eAAe,CAAA;AAAA;AAAA,EAG9B,KAAA,EAAOA,IAAI,6CAAA,EAA+C;AAAA,IACxD,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,sBAAA;AAAA,QACR,KAAA,EAAO,sBAAA;AAAA,QACP,MAAA,EAAQ,sBAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACT;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM;AAAA,OACR;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,SAAA,EAAW;AAAA;AACb,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA;AAAS,GACnC,CAAA;AAAA;AAAA,EAGD,WAAA,EAAaA,IAAI,wCAAA,EAA0C;AAAA,IACzD,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,cAAA;AAAA,QACR,KAAA,EAAO,aAAA;AAAA,QACP,MAAA,EAAQ,aAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACT;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM;AAAA,OACR;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,KAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,SAAA,EAAW;AAAA;AAAA;AACb,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA;AAAS,GACnC,CAAA;AAAA;AAAA,EAGD,IAAA,EAAMA,IAAI,UAAA,EAAY;AAAA,IACpB,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO,QAAA;AAAA,QACP,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA;AAAS,GACnC;AACH;;;ACnEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,WAAW,mBAAA,CAAoB,SAAA;AAAA,EAC/B,OAAA,EAASE,EAAAA;AAAA,IACP,mBAAA,CAAoB,OAAA;AAAA,IACpB;AAAA,GACF;AAAA,EAEA,aAAa,mBAAA,CAAoB,WAAA;AAAA,EAEjC,UAAU,mBAAA,CAAoB,QAAA;AAAA,EAE9B,IAAA,EAAM,CAAC,KAAA,KACLA,EAAAA,CAAG,oBAAoB,IAAA,CAAK,KAAK,GAAG,4CAA4C,CAAA;AAAA,EAElF,OAAO,mBAAA,CAAoB,KAAA;AAAA,EAE3B,OAAA,EAASF,GAAAA;AAAA,IACP,gUAAA;AAAA,IACA;AAAA,MACE,gBAAA,EAAkB;AAAA,QAChB;AAAA,UACE,SAAA,EACE,qJAAA;AAAA,UACF,KAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACX;AAAA;AAAA,QAEA;AAAA,UACE,SAAA,EACE,gIAAA;AAAA,UACF,MAAA,EAAQ,IAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA;AAAA,QAEA;AAAA,UACE,SAAA,EACE,qJAAA;AAAA,UACF,MAAA,EAAQ,IAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,QACA;AAAA,UACE,SAAA,EACE,+HAAA;AAAA,UACF,KAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACX;AAAA,QACA;AAAA,UACE,SAAA,EACE,+HAAA;AAAA,UACF,MAAA,EAAQ,IAAA;AAAA,UACR,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,KAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA,EAAU;AAAA,QACR,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,EAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACR;AAAA,QACA,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACR;AAAA,QACA,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,EAAA;AAAA;AAAA,UAEP,IAAA,EAAM;AAAA,SACR;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ,0BAAA;AAAA,UACR,KAAA,EAAO,0BAAA;AAAA,UACP,MAAA,EAAQ,0BAAA;AAAA,UACR,KAAA,EAAO;AAAA,SACT;AAAA,QACA,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,0BAAA;AAAA,UACN,IAAA,EAAM,8BAAA;AAAA,UACN,cAAA,EACE;AAAA;AACJ;AACF;AACF,GACF;AAAA,EAEA,YAAA,EAAcA,IAAI,0BAAA,EAA4B;AAAA,IAC5C,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAClC,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,WAAA;AAAA,QACP,MAAA,EAAQ,WAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT;AACF,GACD,CAAA;AAAA,EACD,UAAU,mBAAA,CAAoB;AAChC,CAAA;ACqCA,IAAM,aAAA,GAAgBI,cAAyC,IAAI,CAAA;AAEnE,IAAM,mBAAmB,MAAM;AAC7B,EAAA,MAAM,OAAA,GAAUC,WAAW,aAAa,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,OAAA;AACT,CAAA;AAEA,IAAM,kBAAA,GAAqBD,cAA8C,IAAI,CAAA;AAE7E,IAAM,wBAAwB,MAAM;AAClC,EAAA,OAAOC,WAAW,kBAAkB,CAAA;AACtC,CAAA;AAEA,IAAM,MAAA,GAASC,UAAAA;AAAA,EACb,CACE;AAAA,IACE,QAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,OAAA,GAAU,MAAA;AAAA,IACV,KAAA,GAAQ,KAAA;AAAA,IACR,QAAA,GAAW,KAAA;AAAA,IACX,KAAA,GAAQ,KAAA;AAAA,IACR,MAAA,GAAS,KAAA;AAAA,IACT,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,WAAW,KAAA,EAAM;AACvB,IAAA,MAAM,EAAA,GAAK,UAAU,QAAQ,CAAA,CAAA;AAE7B,IAAA,uBACEP,GAAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAO,KAAA,EAAO,EAAA,EAAI,IAAA,EAAM,OAAA,IACzE,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAWG,EAAAA,CAAG,cAAA,CAAe,SAAA,EAAU,EAAG,SAAS,CAAA,EAChE,QAAA,kBAAAH,GAAAA,CAAiB,eAAA,CAAA,IAAA,EAAhB,EAAqB,QAAA,EAAqB,GAAG,WAAA,EAC3C,QAAA,EACH,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,KAAA,GAAQO,WAGb,CAAC,EAAE,WAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC5C,EAAA,uBACEP,IAAiB,eAAA,CAAA,KAAA,EAAhB,EAAsB,KAAU,SAAA,EAAuB,GAAG,OACxD,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,MAAA,CAAO,OAAA,GAAUO,UAAAA;AAAA,EACf,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AACpD,IAAA,MAAM,EAAE,MAAM,KAAA,EAAO,EAAA,EAAI,SAAS,KAAA,EAAO,MAAA,KAAW,gBAAA,EAAiB;AACrE,IAAA,MAAM,eAAe,qBAAA,EAAsB;AAE3C,IAAA,MAAM,YAAA,GAAe,YAAA,GACjBJ,EAAAA,CAAG,uBAAA,EAAyB;AAAA,MAC1B,oBAAoB,YAAA,CAAa,YAAA;AAAA,MACjC,oBAAoB,YAAA,CAAa,WAAA;AAAA;AAAA,MAEjC,0HACE,OAAA,KAAY;AAAA,KACf,CAAA,GACD,MAAA;AAEJ,IAAA,uBACEH,GAAAA;AAAA,MAAiB,eAAA,CAAA,OAAA;AAAA,MAAhB;AAAA,QACC,GAAA;AAAA,QACA,EAAA;AAAA,QACA,WAAA,EAAU,gBAAA;AAAA,QACV,SAAA,EAAWG,EAAAA;AAAA,UACT,cAAA,CAAe,QAAQ,EAAE,MAAA,EAAQ,OAAO,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA;AAAA,UAC9D,YAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWD,EAAAA,CAAG,cAAA,CAAe,YAAA,CAAa,EAAE,IAAA,EAAM,CAAC,CAAA,EACrD,QAAA,EAAA;AAAA,UAAA,QAAA,oBACCH,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWG,EAAAA;AAAA,gBACT,cAAA,CAAe,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA;AAAA,gBAChC;AAAA,eACF;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BAEFH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAqC,QAAA,EAAS,CAAA;AAAA,0BAC7DA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,SAAA;AAAA,cACL,SAAA,EAAWG,EAAAA;AAAA,gBACT,cAAA,CAAe,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA;AAAA,gBAChC,sEAAA;AAAA,gBACA;AAAA;AACF;AAAA;AACF,SAAA,EACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,GAAA,GAAMI,UAAAA;AAAA,EACX,CAAC,EAAE,WAAA,EAAa,QAAA,EAAU,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AACvD,IAAA,uBACEP,GAAAA,CAAC,MAAA,CAAO,OAAA,EAAP,EAAe,KAAU,QAAA,EAAoB,SAAA,EAAuB,GAAG,KAAA,EACtE,0BAAAA,GAAAA,CAAC,MAAA,CAAO,KAAA,EAAP,EAAa,aAA0B,CAAA,EAC1C,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,IAAA,GAAOO,UAAAA;AAAA,EACZ,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBAClCP,GAAAA,CAAiB,eAAA,CAAA,MAAA,EAAhB,EACC,QAAA,kBAAAA,GAAAA;AAAA,IAAiB,eAAA,CAAA,OAAA;AAAA,IAAhB;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAWG,EAAAA,CAAG,cAAA,CAAe,OAAA,EAAS,yCAAyC,SAAS,CAAA;AAAA,MACxF,QAAA,EAAS,QAAA;AAAA,MACR,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAH,IAAiB,eAAA,CAAA,QAAA,EAAhB,EAAyB,aAAU,iBAAA,EAAkB,SAAA,EAAU,mBAC9D,QAAA,kBAAAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sEAAA;AAAA,UACV,uBAAA,EAAuB,IAAA;AAAA,UAEvB,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAWG,GAAG,cAAA,CAAe,QAAA,EAAU,QAAQ,CAAA,EAAI,QAAA,EAAS;AAAA;AAAA,OACnE,EACF;AAAA;AAAA,GACF,EACF;AAEJ,CAAA;AAEA,MAAA,CAAO,KAAA,GAAQI,UAAAA;AAAA,EACb,CAAC,EAAE,QAAA,EAAU,QAAA,GAAW,OAAO,IAAA,EAAM,QAAA,EAAU,SAAA,EAAU,EAAG,GAAA,KAAQ;AAClE,IAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,EAAA,KAAO,gBAAA,EAAiB;AAC7D,IAAA,MAAM,eAAe,qBAAA,EAAsB;AAC3C,IAAA,MAAM,IAAA,GAAO,QAAA,IAAY,YAAA,EAAc,IAAA,IAAQ,WAAA;AAE/C,IAAA,uBACEP,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA,EAAS,EAAA;AAAA,QACT,SAAA,EAAWG,EAAAA,CAAG,cAAA,CAAe,KAAA,CAAM,EAAE,UAAU,QAAA,EAAU,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA;AAAA,QAE1E;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,IAAA,GAAOI,UAAAA;AAAA,EACZ,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC1F,IAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAY,GAAI,gBAAA,EAAiB;AAC/C,IAAA,MAAM,eAAe,qBAAA,EAAsB;AAC3C,IAAA,MAAM,IAAA,GAAO,QAAA,IAAY,YAAA,EAAc,IAAA,IAAQ,WAAA;AAE/C,IAAA,uBACEH,IAAAA;AAAA,MAAiB,eAAA,CAAA,IAAA;AAAA,MAAhB;AAAA,QACC,WAAA,EAAU,aAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,EAAWD,GAAG,cAAA,CAAe,IAAA,CAAK,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,QACrD,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA,oBAAYH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,mBAAA,CAAoB,SAAS,EAAE,IAAA,EAAM,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,0BAC/EA,GAAAA,CAAiB,eAAA,CAAA,QAAA,EAAhB,EAAyB,OAAA,EAAO,MAC/B,QAAA,kBAAAI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EAEd,QAAA,EAAA;AAAA,4BAAAJ,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yBAAA;AAAA,gBACV,KAAA,EAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAAA,gBAEhD;AAAA;AAAA,aACH;AAAA,YACC,6BAAaA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,SAAA,EAAU;AAAA,WAAA,EACtD,CAAA,EACF,CAAA;AAAA,UACC,SAAA,oBAAaA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,mBAAA,CAAoB,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA,EAAI,QAAA,EAAA,SAAA,EAAU;AAAA;AAAA;AAAA,KACnF;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,KAAA,GAAQO,UAAAA;AAAA,EACb,CAAC,EAAE,QAAA,GAAW,SAAA,EAAW,SAAA,IAAa,GAAA,KAAQ;AAC5C,IAAA,uBACEP,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAWG,EAAAA,CAAG,8CAAA,EAAgD,SAAS,CAAA,EACpF,0BAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gCAAA,EAAkC,UAAS,CAAA,EAC1D,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,WAAA,GAAcO,UAAAA;AAAA,EACnB,CAAC,EAAE,QAAA,EAAU,MAAM,QAAA,EAAU,SAAA,IAAa,GAAA,KAAQ;AAChD,IAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,QAAA,KAAa,gBAAA,EAAiB;AAChE,IAAA,MAAM,eAAe,qBAAA,EAAsB;AAC3C,IAAA,MAAM,IAAA,GAAO,QAAA,IAAY,YAAA,EAAc,IAAA,IAAQ,WAAA;AAE/C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,uBACEP,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,oBAAA;AAAA,QACV,SAAA,EAAWG,EAAAA,CAAG,cAAA,CAAe,WAAA,CAAY,EAAE,UAAU,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA;AAAA,QAE9E,QAAA,kBAAAH,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAS;AAAA;AAAA,KACf;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,KAAA,GAAQO,UAAAA;AAAA,EACb,CAAC,EAAE,QAAA,EAAU,IAAA,GAAO,QAAA,EAAU,OAAA,GAAU,MAAA,EAAQ,aAAA,GAAgB,KAAA,EAAO,SAAA,EAAU,EAAG,GAAA,KAAQ;AAC1F,IAAA,MAAM,UAAA,GAAmB,KAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAElD,IAAA,uBACEP,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWG,EAAAA;AAAA,UACT,gEAAA;AAAA,UACA,YAAY,MAAA,IAAU,8BAAA;AAAA,UACtB,aAAA,IAAiB,0BAAA;AAAA,UACjB;AAAA,SACF;AAAA,QAEC,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAChC,UAAA,MAAM,UAAU,KAAA,KAAU,CAAA;AAC1B,UAAA,MAAM,MAAA,GAAS,KAAA,KAAU,UAAA,CAAW,MAAA,GAAS,CAAA;AAE7C,UAAA,uBACEC,IAAAA,CAAO,KAAA,CAAA,QAAA,EAAN,EACC,QAAA,EAAA;AAAA,4BAAAJ,GAAAA;AAAA,cAAC,kBAAA,CAAmB,QAAA;AAAA,cAAnB;AAAA,gBACC,OAAO,EAAE,YAAA,EAAc,SAAS,WAAA,EAAa,MAAA,EAAQ,MAAM,OAAA,EAAQ;AAAA,gBAElE,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,YACC,CAAC,MAAA,oBAAUA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EAAsC;AAAA,WAAA,EAAA,EAN9C,KAOrB,CAAA;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AACrB,MAAA,CAAO,MAAM,WAAA,GAAc,cAAA;AAC3B,MAAA,CAAO,QAAQ,WAAA,GAAc,gBAAA;AAC7B,MAAA,CAAO,IAAI,WAAA,GAAc,YAAA;AACzB,MAAA,CAAO,MAAM,WAAA,GAAc,cAAA;AAC3B,MAAA,CAAO,KAAK,WAAA,GAAc,aAAA;AAC1B,MAAA,CAAO,KAAK,WAAA,GAAc,aAAA;AAC1B,MAAA,CAAO,MAAM,WAAA,GAAc,cAAA;AAC3B,MAAA,CAAO,YAAY,WAAA,GAAc,oBAAA;AACjC,MAAA,CAAO,MAAM,WAAA,GAAc,cAAA;AC/V3B,SAAS,UAAA,CAAW;AAAA,EAClB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,MAAM,SAAA,GAAY,OAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAY,GAAI,eAAe,SAAA,EAAW;AAAA,IAC5D,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAkB;AAC1C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,WAAA,EAAY;AAAA,IACd;AACA,IAAA,YAAA,GAAe,IAAI,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAA,EAAW,SAAA,EACnB,QAAA,kBAAAI,IAAAA,CAAC,MAAA,EAAA,EAAQ,GAAG,WAAA,EAAa,YAAA,EAAc,gBAAA,EACpC,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASJ,GAAAA,CAAC,MAAA,CAAO,KAAA,EAAP,EAAa,UAAqB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACnDA,GAAAA,CAAC,MAAA,CAAO,SAAP,EAAe,MAAA,EAAQ,YAAY,OAAA,EAAS,WAAA,EAAa,QAAA,EACxD,QAAA,kBAAAA,IAAC,MAAA,CAAO,KAAA,EAAP,EAAa,WAAA,EAA0B,SAAA,EAAU,YAAW,CAAA,EAC/D,CAAA;AAAA,IACC,+BAAeA,GAAAA,CAAC,MAAA,CAAO,WAAA,EAAP,EAAoB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,oBACjDA,GAAAA,CAAC,MAAA,CAAO,IAAA,EAAP,EAAY,WAAW,aAAA,EACrB,QAAA,EAAA,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBA,GAAAA,CAAC,MAAA,CAAO,OAAP,EAAc,QAAA,EAAA,WAAA,EAAY,IAE3B,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,OAAO,KAAA,EAAO,WAAA,EAAa,GAAG,SAAA,uBAC3CA,GAAAA,CAAC,MAAA,CAAO,IAAA,EAAP,EAAwB,KAAA,EAAe,GAAG,WACxC,QAAA,EAAA,WAAA,EAAA,EADe,KAElB,CACD,CAAA,EAEL;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,cAAA,CACP,cACA,SAAA,EACA;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAsB;AACxC,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,QAAA,CAAS,KAAA,CAAM,aAAqB,CAAA,EAAG;AAC/D,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,SAAA,EAAW,MAAA,IAAS;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,SAAA,EAAW,OAAA,IAAU;AAAA,EACvB,CAAA;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,WAAA,EAAa,SAAA,EAAU;AAC9C;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA;ACtIlB,IAAM,YAAA,GAAe;AAAA,EAC1B,GAAA,EAAKC,IAAI,EAAA,EAAI;AAAA,IACX,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,gCAAA;AAAA,QACT,SAAA,EAAW;AAAA;AACb,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA;AAAU,GACpC,CAAA;AAAA,EAED,IAAA,EAAMA,IAAI,kCAAA,EAAoC;AAAA,IAC5C,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,OAAA;AAAA,QACT,SAAA,EAAW;AAAA;AACb,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA;AAAU,GACpC,CAAA;AAAA,EAED,OAAA,EAASA,GAAAA;AAAA,IACP,kMAAA;AAAA,IACA;AAAA,MACE,QAAA,EAAU;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,OAAA,EAAS;AAAA,YACP,0DAAA;AAAA,YACA,yBAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,4CAAA;AAAA,YACA,yBAAA;AAAA,YACA;AAAA;AACF;AACF,OACF;AAAA,MACA,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA;AAAU;AACrC;AAEJ,CAAA;ACYA,IAAM,WAAA,GAAcI,aAAAA,CAA+B,EAAE,IAAA,EAAM,WAAW,CAAA;AAEtE,IAAM,iBAAiB,MAAM;AAC3B,EAAA,MAAM,OAAA,GAAUC,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAA;AACT,CAAA;AAqBA,IAAM,IAAA,GAAOC,UAAAA;AAAA,EACX,CAAC,EAAE,IAAA,GAAO,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBACzCP,GAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EAAO,EAAE,IAAA,EAAK,EAClC,QAAA,kBAAAA,GAAAA,CAAe,cAAA,CAAA,IAAA,EAAd,EAAmB,GAAA,EAAW,GAAG,KAAA,EAC/B,QAAA,EACH,CAAA,EACF;AAEJ;AAEA,IAAA,CAAK,IAAA,GAAOO,UAAAA;AAAA,EACV,CAAC,EAAE,SAAA,EAAW,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC3C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,cAAA,EAAe;AAEhC,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,uBACEP,GAAAA;AAAA,QAAe,cAAA,CAAA,IAAA;AAAA,QAAd;AAAA,UACC,GAAA;AAAA,UACA,SAAA,EAAWG,EAAAA;AAAA,YACT,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AAAA,YAC1B,YAAA,CAAa,GAAA,CAAI,EAAE,IAAA,EAAM,CAAA;AAAA,YACzB,aAAA;AAAA,YACA;AAAA,WACF;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,IAEJ;AAEA,IAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWD,EAAAA,CAAG,YAAA,CAAa,GAAA,CAAI,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EACnD,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAe,cAAA,CAAA,IAAA;AAAA,QAAd;AAAA,UACC,GAAA;AAAA,UACA,SAAA,EAAWG,GAAG,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,UACnD,GAAG;AAAA;AAAA,OACN;AAAA,sBACAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAA8B,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EACzD,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,IAAA,CAAK,OAAA,GAAUO,UAAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,OAAO,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACtE,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,cAAA,EAAe;AAChC,IAAA,uBACEH,IAAAA;AAAA,MAAe,cAAA,CAAA,OAAA;AAAA,MAAd;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWD,GAAG,YAAA,CAAa,OAAA,CAAQ,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,QACtD,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA,oBAAYH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,0BAChDI,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YACA,yBACCJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEACb,QAAA,EAAA,KAAA,EACH;AAAA,WAAA,EAEJ,CAAA;AAAA,UACC,6BAAaA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAU,QAAA,EAAA,SAAA,EAAU;AAAA;AAAA;AAAA,KACpD;AAAA,EAEJ;AACF,CAAA;AAEA,IAAA,CAAK,OAAA,GAAUO,UAAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxBP,GAAAA,CAAe,cAAA,CAAA,OAAA,EAAd,EAAsB,GAAA,EAAU,SAAA,EAAWG,GAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAE1E,CAAA;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,CAAK,KAAK,WAAA,GAAc,WAAA;AACxB,IAAA,CAAK,QAAQ,WAAA,GAAc,cAAA;AAC3B,IAAA,CAAK,QAAQ,WAAA,GAAc,cAAA;ACxH3B,SAAS,QAAA,CAAqD;AAAA,EAC5D,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,SAAA,GAAY,KAAA;AAClB,EAAA,uBACEH,GAAAA,CAAC,IAAA,EAAA,EAAM,GAAG,WACR,QAAA,kBAAAA,GAAAA,CAAC,IAAA,CAAK,IAAA,EAAL,EAAU,SAAA,EACR,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,GAAG,SAAA,EAAU,qBAC1CA,GAAAA,CAAC,KAAK,OAAA,EAAL,EAAyB,KAAA,EAAe,GAAG,SAAA,EACzC,QAAA,EAAA,EADgB,KAEnB,CACD,GACH,CAAA,EACF,CAAA;AAEJ;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;AC1BvB,IAAM,sBAAA,GAAyBC,GAAAA;AAAA,EAC7B;AAAA;AAAA,IAEE,gDAAA;AAAA,IACA,gBAAA;AAAA,IACA,wBAAA;AAAA,IACA,mDAAA;AAAA,IACA,eAAA;AAAA,IACA,iCAAA;AAAA,IACA,gGAAA;AAAA,IACA,wCAAA;AAAA,IACA,wCAAA;AAAA,IACA,wCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,uBAAA;AAAA,QACN,KAAA,EAAO,yCAAA;AAAA,QACP,MAAA,EAAQ,yCAAA;AAAA,QACR,KAAA,EAAO,yCAAA;AAAA,QACP,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,OAAA;AAAQ;AAErC,CAAA;AAEA,IAAM,uBAAuBA,GAAAA,CAAI;AAAA,EAC/B,kDAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,sBAAsBA,GAAAA,CAAI;AAAA,EAC9B,iDAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,OAAA,GAA2B,gBAAA,CAAA;AAEjC,OAAA,CAAQ,QAAA,GAA4B,gBAAA,CAAA,QAAA;AAEpC,OAAA,CAAQ,OAAA,GAA2B,gBAAA,CAAA,OAAA;AAEnC,OAAA,CAAQ,OAAA,GAAUM,WAGhB,CAAC,EAAE,WAAW,UAAA,GAAa,CAAA,EAAG,MAAM,QAAA,EAAU,eAAA,EAAiB,GAAG,KAAA,EAAM,EAAG,wBAC3EP,GAAAA,CAAkB,yBAAjB,EAAwB,SAAA,EAAW,iBAClC,QAAA,kBAAAA,GAAAA;AAAA,EAAkB,gBAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAWG,GAAG,uBAAA,EAAyB,sBAAA,CAAuB,EAAE,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,IACjF,GAAG,KAAA;AAAA,IAEH;AAAA;AACH,CAAA,EACF,CACD,CAAA;AAED,OAAA,CAAQ,KAAA,GAAQI,UAAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,wBAClCP,GAAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAWG,GAAG,oBAAA,EAAqB,EAAG,SAAS,CAAA,EAAI,GAAG,OAClE,QAAA,EACH;AAEJ,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAcI,UAAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,wBAClCP,GAAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAWG,GAAG,mBAAA,EAAoB,EAAG,SAAS,CAAA,EAAI,GAAG,OACjE,QAAA,EACH;AAEJ,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AACtB,OAAA,CAAQ,QAAQ,WAAA,GAAc,iBAAA;AAC9B,OAAA,CAAQ,MAAM,WAAA,GAAc,eAAA;AAC5B,OAAA,CAAQ,YAAY,WAAA,GAAc,qBAAA;AAClC,OAAA,CAAQ,QAAQ,WAAA,GAAc,iBAAA;AAC9B,OAAA,CAAQ,SAAS,WAAA,GAAc,kBAAA;AC5E/B,IAAM,WAAA,GAAc,CAAC,EAAE,QAAA,EAAU,OAAO,IAAA,EAAM,WAAA,EAAa,GAAG,KAAA,EAAM,KAAwB;AAC1F,EAAA,uBACEH,GAAAA,CAAC,OAAA,CAAQ,QAAA,EAAR,EAAiB,aAAA,EAAe,CAAA,EAAG,iBAAA,EAAmB,CAAA,EACrD,QAAA,kBAAAI,IAAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAJ,IAAC,OAAA,CAAQ,OAAA,EAAR,EAAgB,OAAA,EAAO,MAAE,QAAA,EAAS,CAAA;AAAA,oBACnCI,IAAAA,CAAC,OAAA,CAAQ,SAAR,EAAgB,IAAA,EAAa,GAAG,KAAA,EAC9B,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASJ,GAAAA,CAAC,OAAA,CAAQ,KAAA,EAAR,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC/B,+BAAeA,GAAAA,CAAC,OAAA,CAAQ,WAAA,EAAR,EAAqB,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EACpD;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAiDA,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,OAAA,EAAQ,EAA4B;AAC1E,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,uBACEA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAK,MAAA,EAAO,WAAA,EAAa,SACnC,QAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,IAAY,iBAAiB,OAAA,IAAW,OAAA,CAAQ,QAAQ,KAAA,EAAO;AAC/F,IAAA,uBACEA,IAAC,WAAA,EAAA,EAAY,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA,EAAS,GAAG,OAAA,EAC5C,QAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AAC1B,kBAAA,CAAmB,WAAA,GAAc,oBAAA","file":"chunk-PGJ4JIXU.mjs","sourcesContent":["import { cva } from '@exem-ui/core/utils';\nimport type { ColorPaletteColor } from './colorPaletteUtils';\n\n/** 색 이름 → Tailwind 토큰 class 매핑(배경/텍스트). 컴포넌트 내부 및 소비자용. */\nexport const colorPaletteColorClasses: Record<\n ColorPaletteColor,\n { background: string; text: string }\n> = {\n mono: { background: 'bg-mono-dark', text: 'text-mono-dark' },\n red: { background: 'bg-red-05', text: 'text-red-05' },\n orange: { background: 'bg-orange-05', text: 'text-orange-05' },\n amber: { background: 'bg-amber-05', text: 'text-amber-05' },\n yellow: { background: 'bg-yellow-05', text: 'text-yellow-05' },\n lime: { background: 'bg-lime-05', text: 'text-lime-05' },\n green: { background: 'bg-green-05', text: 'text-green-05' },\n emerald: { background: 'bg-emerald-05', text: 'text-emerald-05' },\n teal: { background: 'bg-teal-05', text: 'text-teal-05' },\n cyan: { background: 'bg-cyan-05', text: 'text-cyan-05' },\n sky: { background: 'bg-sky-05', text: 'text-sky-05' },\n blue: { background: 'bg-blue-05', text: 'text-blue-05' },\n indigo: { background: 'bg-indigo-05', text: 'text-indigo-05' },\n violet: { background: 'bg-violet-05', text: 'text-violet-05' },\n purple: { background: 'bg-purple-05', text: 'text-purple-05' },\n fuchsia: { background: 'bg-fuchsia-05', text: 'text-fuchsia-05' },\n pink: { background: 'bg-pink-05', text: 'text-pink-05' },\n rose: { background: 'bg-rose-05', text: 'text-rose-05' },\n};\n\nexport const colorItemVariants = cva(\n 'flex size-6 items-center justify-center rounded-medium outline-none hover:[outline:3px_solid_#00A6F44D] focus-visible:[outline:3px_solid_#00A6F44D] disabled:opacity-20 disabled:cursor-not-allowed disabled:hover:outline-none',\n {\n variants: {\n color: {\n mono: colorPaletteColorClasses.mono.background,\n red: colorPaletteColorClasses.red.background,\n orange: colorPaletteColorClasses.orange.background,\n amber: colorPaletteColorClasses.amber.background,\n yellow: colorPaletteColorClasses.yellow.background,\n lime: colorPaletteColorClasses.lime.background,\n green: colorPaletteColorClasses.green.background,\n emerald: colorPaletteColorClasses.emerald.background,\n teal: colorPaletteColorClasses.teal.background,\n cyan: colorPaletteColorClasses.cyan.background,\n sky: colorPaletteColorClasses.sky.background,\n blue: colorPaletteColorClasses.blue.background,\n indigo: colorPaletteColorClasses.indigo.background,\n violet: colorPaletteColorClasses.violet.background,\n purple: colorPaletteColorClasses.purple.background,\n fuchsia: colorPaletteColorClasses.fuchsia.background,\n pink: colorPaletteColorClasses.pink.background,\n rose: colorPaletteColorClasses.rose.background,\n },\n },\n },\n);\n","import { cn } from '@exem-ui/core/utils';\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport type React from 'react';\nimport { CheckIcon } from '../../icon';\nimport type { ColorPaletteColor } from './colorPaletteUtils';\nimport { colorItemVariants } from './colorPaletteVariants';\n\ntype ColorPaletteProps = Omit<\n React.ComponentPropsWithRef<typeof RadioGroupPrimitive.Root>,\n 'value' | 'defaultValue' | 'onValueChange'\n> & {\n /** 현재 선택된 색상 (controlled). */\n value?: ColorPaletteColor;\n /** 초기 선택 색상 (비제어). */\n defaultValue?: ColorPaletteColor;\n /** 색상 선택 시 호출되는 핸들러. */\n onValueChange?: (value: ColorPaletteColor) => void;\n};\n\ntype ColorPaletteSwatchProps = Omit<\n React.ComponentPropsWithRef<typeof RadioGroupPrimitive.Item>,\n 'value'\n> & {\n /** 스와치 색상. `ColorPaletteColors` 상수로 지정. */\n color: ColorPaletteColor;\n};\n\n/**\n * 프리셋 색상 팔레트에서 색 하나를 선택하는 컴포넌트입니다.\n * Compound Component 패턴으로 `ColorPalette.Swatch`와 함께 사용합니다.\n * 배열만 전달하는 간소화된 API가 필요하면 `@exem-ui/react/flat`의 `FlatColorPalette`를 사용하세요.\n *\n * @example\n * ```tsx\n * <ColorPalette value={color} onValueChange={setColor}>\n * <ColorPalette.Swatch color={ColorPaletteColors.red} />\n * <ColorPalette.Swatch color={ColorPaletteColors.blue} />\n * </ColorPalette>\n * ```\n *\n * @see {@link ColorPaletteProps} 루트 props 상세\n * @see {@link ColorPaletteSwatchProps} 스와치 props 상세\n */\nfunction ColorPalette({ className, onValueChange, ...props }: ColorPaletteProps) {\n return (\n <RadioGroupPrimitive.Root\n className={cn('flex flex-wrap gap-2', className)}\n onValueChange={onValueChange}\n {...props}\n />\n );\n}\n\nfunction ColorPaletteSwatch({ color, className, children, ...props }: ColorPaletteSwatchProps) {\n return (\n <RadioGroupPrimitive.Item\n value={color}\n aria-label={color}\n className={cn(colorItemVariants({ color }), className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator>\n {children ?? <CheckIcon className=\"size-5 text-icon-static-light\" />}\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n}\n\nColorPalette.displayName = 'ColorPalette';\nColorPaletteSwatch.displayName = 'ColorPalette.Swatch';\n\nColorPalette.Swatch = ColorPaletteSwatch;\n\nexport { ColorPalette };\nexport type { ColorPaletteProps, ColorPaletteSwatchProps };\n","/**\n * ColorPalette에서 사용할 수 있는 유효 색상 상수.\n * 사용처는 문자열 리터럴 대신 이 상수를 참조해 오타를 방지한다.\n * (프리셋 \"팔레트 배열\"이 아니라 색 enum — 팔레트는 소비자가 직접 구성한다.)\n */\nexport const ColorPaletteColors = {\n mono: 'mono',\n red: 'red',\n orange: 'orange',\n amber: 'amber',\n yellow: 'yellow',\n lime: 'lime',\n green: 'green',\n emerald: 'emerald',\n teal: 'teal',\n cyan: 'cyan',\n sky: 'sky',\n blue: 'blue',\n indigo: 'indigo',\n violet: 'violet',\n purple: 'purple',\n fuchsia: 'fuchsia',\n pink: 'pink',\n rose: 'rose',\n} as const;\n\nexport type ColorPaletteColor = (typeof ColorPaletteColors)[keyof typeof ColorPaletteColors];\n\n/** 폴백 기본 색상. */\nexport const DEFAULT_COLOR: ColorPaletteColor = ColorPaletteColors.mono;\n\n/** color가 팔레트에 속하는지 검사하는 타입가드. */\nexport function isInPalette(\n color: string,\n palette: readonly ColorPaletteColor[],\n): color is ColorPaletteColor {\n return (palette as readonly string[]).includes(color);\n}\n\n/**\n * 팔레트에 속하면 해당 색을, 아니면 폴백(palette[0] ?? DEFAULT_COLOR)을 반환.\n * 항상 전달된 팔레트 내 색을 반환한다(팔레트가 비면 DEFAULT_COLOR).\n */\nexport function getColorPaletteColor(\n color: string,\n palette: readonly ColorPaletteColor[],\n): ColorPaletteColor {\n if (isInPalette(color, palette)) {\n return color;\n }\n return palette[0] ?? DEFAULT_COLOR;\n}\n","import {\n ColorPalette,\n type ColorPaletteColor,\n type ColorPaletteProps,\n} from '../picker/color-palette';\n\ntype FlatColorPaletteProps<P extends readonly ColorPaletteColor[] = readonly ColorPaletteColor[]> =\n Omit<ColorPaletteProps, 'value' | 'defaultValue' | 'onValueChange' | 'children'> & {\n /** 표시할 색상 팔레트. 소비자가 직접 구성하며 `ColorPaletteColors` 상수로 작성하면 오타가 잡힙니다. */\n palette: P;\n /** 현재 선택된 색상 (controlled). palette에 없는 값은 컴파일 에러. */\n value?: P[number];\n /** 초기 선택 색상 (비제어). */\n defaultValue?: P[number];\n /** 색상 선택 시 호출되는 핸들러. value 타입은 palette에서 추론됩니다. */\n onValueChange?: (value: P[number]) => void;\n };\n\n/**\n * ColorPalette 컴포넌트의 간소화된 Flat API입니다.\n * palette 배열만 전달하면 Compound Component 없이 스와치 그리드를 구성합니다.\n * palette의 값으로부터 타입이 추론되어, value/onValueChange의 오타가 컴파일 단계에서 잡힙니다.\n *\n * @example\n * ```tsx\n * <FlatColorPalette\n * palette={[ColorPaletteColors.blue, ColorPaletteColors.sky, ColorPaletteColors.rose]}\n * value={color}\n * onValueChange={setColor}\n * />\n * ```\n *\n * @see {@link FlatColorPaletteProps} props 상세\n */\nfunction FlatColorPalette<const P extends readonly ColorPaletteColor[]>({\n palette,\n ...props\n}: FlatColorPaletteProps<P>) {\n const rootProps = props as ColorPaletteProps;\n return (\n <ColorPalette {...rootProps}>\n {palette.map((color) => (\n <ColorPalette.Swatch key={color} color={color} />\n ))}\n </ColorPalette>\n );\n}\n\nFlatColorPalette.displayName = 'FlatColorPalette';\n\nexport { FlatColorPalette };\nexport type { FlatColorPaletteProps };\n","import { cn, cva } from '@exem-ui/core/utils';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport type React from 'react';\nimport { createContext, forwardRef, useContext } from 'react';\n\ntype SegmentSize = 'small' | 'medium' | 'large';\n\ntype SegmentContextValue = {\n size: SegmentSize;\n};\n\ntype SegmentListProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>;\n\ntype SegmentItemProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> & {\n /** 텍스트 왼쪽에 표시할 아이콘 요소 */\n leftIcon?: React.ReactElement<{ className?: string }>;\n};\n\ntype SegmentContentProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>;\n\ntype SegmentRootProps<T extends string = string> = Omit<\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root>,\n 'value' | 'defaultValue' | 'onValueChange'\n> & {\n /**\n * 세그먼트 크기\n * @default 'medium'\n */\n size?: SegmentSize;\n value?: T;\n defaultValue?: T;\n onValueChange?: (value: T) => void;\n};\n\ntype SegmentComponent = {\n <T extends string = string>(\n props: SegmentRootProps<T> & React.RefAttributes<React.ElementRef<typeof TabsPrimitive.Root>>,\n ): React.ReactElement | null;\n displayName?: string;\n List: React.ForwardRefExoticComponent<SegmentListProps>;\n Item: React.ForwardRefExoticComponent<SegmentItemProps>;\n Content: React.ForwardRefExoticComponent<SegmentContentProps>;\n};\n\nconst segmentListVariants = cva(\n 'inline-flex items-center overflow-hidden rounded-medium bg-elevation-elevation-2',\n {\n variants: {\n size: {\n small: 'h-7 gap-0 p-0.5',\n medium: 'h-8 gap-0 p-0.5',\n large: 'h-10 gap-0 p-0.5',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n },\n);\n\nconst segmentItemVariants = cva(\n [\n 'flex flex-1 items-center justify-center rounded-weak',\n 'focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed',\n 'data-[state=active]:bg-component-segmentedOption data-[state=active]:text-text-primary data-[state=active]:shadow-weak',\n 'data-[state=inactive]:text-text-tertiary data-[state=inactive]:disabled:text-text-disabled',\n 'transition-colors duration-200 ease-in-out',\n ],\n {\n variants: {\n size: {\n small: 'h-6 gap-0.5 text-body-3 font-medium',\n medium: 'h-7 gap-1 text-body-2 font-medium',\n large: 'h-9 gap-1.5 text-body-2 font-medium',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n },\n);\n\nconst segmentIconVariants = cva('flex items-center justify-center', {\n variants: {\n size: {\n small: 'size-4',\n medium: 'size-4',\n large: 'size-5',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n});\n\nconst SegmentContext = createContext<SegmentContextValue | undefined>(undefined);\n\nconst useSegmentContext = () => {\n const context = useContext(SegmentContext);\n if (!context) {\n throw new Error('Segment components must be used within a Segment');\n }\n return context;\n};\n\n/**\n * 탭 형태의 세그먼트 컨트롤 컴포넌트입니다.\n * Compound Component 패턴으로 `Segment.List`, `Segment.Item`, `Segment.Content`와 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Segment defaultValue=\"tab1\" size=\"medium\">\n * <Segment.List>\n * <Segment.Item value=\"tab1\">첫 번째</Segment.Item>\n * <Segment.Item value=\"tab2\">두 번째</Segment.Item>\n * </Segment.List>\n * <Segment.Content value=\"tab1\">첫 번째 내용</Segment.Content>\n * <Segment.Content value=\"tab2\">두 번째 내용</Segment.Content>\n * </Segment>\n * ```\n *\n * @see {@link SegmentRootProps} 루트 props 상세\n * @see {@link SegmentItemProps} 아이템 props 상세\n */\nconst Segment = forwardRef<React.ElementRef<typeof TabsPrimitive.Root>, SegmentRootProps>(\n ({ size = 'medium', children, ...props }, ref) => (\n <SegmentContext.Provider value={{ size }}>\n <TabsPrimitive.Root ref={ref} {...props}>\n {children}\n </TabsPrimitive.Root>\n </SegmentContext.Provider>\n ),\n) as unknown as SegmentComponent;\n\nSegment.List = forwardRef<React.ElementRef<typeof TabsPrimitive.List>, SegmentListProps>(\n ({ className, ...props }, ref) => {\n const { size } = useSegmentContext();\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(segmentListVariants({ size }), className)}\n {...props}\n />\n );\n },\n) as SegmentComponent['List'];\n\nSegment.Item = forwardRef<React.ElementRef<typeof TabsPrimitive.Trigger>, SegmentItemProps>(\n ({ className, leftIcon, children, ...props }, ref) => {\n const { size } = useSegmentContext();\n\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(segmentItemVariants({ size }), className)}\n {...props}\n >\n {leftIcon && <span className={cn(segmentIconVariants({ size }))}>{leftIcon}</span>}\n <span className=\"flex items-center\">{children}</span>\n </TabsPrimitive.Trigger>\n );\n },\n) as SegmentComponent['Item'];\n\nSegment.Content = forwardRef<React.ElementRef<typeof TabsPrimitive.Content>, SegmentContentProps>(\n ({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className,\n )}\n {...props}\n />\n ),\n) as SegmentComponent['Content'];\n\nSegment.displayName = 'Segment';\nSegment.List.displayName = 'Segment.List';\nSegment.Content.displayName = 'Segment.Content';\nSegment.Item.displayName = 'Segment.Item';\n\nexport { Segment };\nexport type {\n SegmentComponent,\n SegmentRootProps,\n SegmentItemProps,\n SegmentContentProps,\n SegmentListProps,\n};\n","import { Segment, type SegmentItemProps, type SegmentRootProps } from '../segment/Segment';\n\ntype FlatSegmentItem<V extends string = string> = Pick<\n SegmentItemProps,\n 'children' | 'disabled' | 'leftIcon' | 'className'\n> & {\n value: V;\n};\n\ntype FlatSegmentProps<Items extends readonly FlatSegmentItem[] = readonly FlatSegmentItem[]> = Omit<\n SegmentRootProps,\n 'children' | 'asChild' | 'value' | 'defaultValue' | 'onValueChange'\n> & {\n /** 세그먼트 아이템 배열 */\n items: Items;\n value?: Items[number]['value'];\n defaultValue?: Items[number]['value'];\n onValueChange?: (value: Items[number]['value']) => void;\n /**\n * 전체 비활성화 여부 (개별 아이템의 disabled와 OR 결합)\n * @default false\n */\n disabled?: boolean;\n};\n\n/**\n * Segment 컴포넌트의 간소화된 Flat API입니다.\n * items 배열만 전달하면 Compound Component 없이 간편하게 사용할 수 있습니다.\n * items 의 value 로부터 타입이 추론되어, value/onValueChange 의 오타가 컴파일 단계에서 잡힙니다.\n *\n * @example\n * ```tsx\n * <FlatSegment\n * defaultValue=\"tab1\"\n * size=\"medium\"\n * items={[\n * { value: 'tab1', children: '첫 번째' },\n * { value: 'tab2', children: '두 번째' },\n * ]}\n * />\n * ```\n *\n * @see {@link FlatSegmentProps} props 상세\n */\nfunction FlatSegment<const Items extends readonly FlatSegmentItem[]>({\n items,\n disabled,\n className,\n ...props\n}: FlatSegmentProps<Items>) {\n const rootProps = props as SegmentRootProps<Items[number]['value']>;\n return (\n <Segment {...rootProps}>\n <Segment.List className={className}>\n {items.map((item) => (\n <Segment.Item {...item} key={item.value} disabled={disabled || item.disabled} />\n ))}\n </Segment.List>\n </Segment>\n );\n}\n\nFlatSegment.displayName = 'FlatSegment';\n\nexport { FlatSegment };\nexport type { FlatSegmentProps, FlatSegmentItem };\n","import { cn, cva } from '@exem-ui/core/utils';\n\n/**\n * 오버레이 형태로 표시되는 리스트 UI의 공통 스타일 변형(variants)을 정의합니다.\n *\n * Select, Dropdown 등 팝업/드롭다운 형태의 리스트 컴포넌트에서 공통으로 사용되는\n * 기반 스타일 레이어입니다. 각 컴포넌트는 이 variants를 확장하거나 재사용해\n * 자체 스타일을 구성합니다.\n *\n * @example 사용처\n * - `selectVariants.ts` — Select 컴포넌트의 드롭다운 리스트\n * - `dropdownVariants.ts` — Dropdown 컴포넌트의 메뉴 리스트\n *\n * @property content - 오버레이 컨테이너 (z-index, 배경, 테두리, 그림자, 열기/닫기 애니메이션)\n * @property viewport - 아이템 목록 래퍼 (flex 컬럼, 간격, 패딩)\n * @property item - 개별 리스트 아이템 (크기 variant: xsmall | small | medium | large)\n * @property slotSize - 아이콘/체크마크 등 슬롯 영역 크기 (size variant에 따라 조정)\n */\nexport const overlayListVariants = {\n content: cn(\n 'relative z-50 min-w-[8rem] overflow-hidden rounded-medium border border-border-primary bg-background-overlay shadow-weak',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n ),\n\n viewport: cn('flex flex-col gap-0.5 p-1'),\n\n item: cva(\n 'relative flex w-full gap-0.5 cursor-pointer select-none items-center rounded-weak px-2 text-body-2 text-text-primary outline-none hover:bg-elevation-elevation-2 data-[disabled]:pointer-events-none data-[disabled]:text-text-disabled',\n {\n defaultVariants: { size: 'medium' },\n variants: {\n size: {\n xsmall: 'h-6',\n small: 'h-7',\n medium: 'h-8',\n large: 'h-10',\n },\n },\n },\n ),\n itemText: cva('truncate flex items-center flex-1 min-w-0', {\n defaultVariants: { size: 'medium' },\n variants: {\n size: {\n xsmall: 'h-6',\n small: 'h-7',\n medium: 'h-8',\n large: 'h-10',\n },\n },\n }),\n\n slotSize: cva('shrink-0 flex items-center justify-center text-icon-primary', {\n defaultVariants: { size: 'medium' },\n variants: {\n size: {\n xsmall: 'size-4',\n small: 'size-4',\n medium: 'size-4',\n large: 'size-5',\n },\n },\n }),\n};\n","import { cn } from '@exem-ui/core/utils';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport type React from 'react';\n\ninterface ScrollAreaProps extends React.ComponentProps<typeof ScrollAreaPrimitive.Root> {\n /** 스크롤 뷰포트의 ref. 스크롤 위치 제어 시 사용합니다. */\n scrollRef?: React.ComponentProps<typeof ScrollAreaPrimitive.Viewport>['ref'];\n /** 세로 스크롤바 숨김 여부 */\n hideVerticalScrollbar?: boolean;\n /** 가로 스크롤바 숨김 여부 */\n hideHorizontalScrollbar?: boolean;\n /** 가로 스크롤 비활성화 (overflow-x: hidden) */\n disableHorizontalScroll?: boolean;\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-opacity',\n orientation === 'vertical' &&\n 'w-[10px] p-[2px] opacity-0 duration-300 ease-out group-hover:opacity-100',\n orientation === 'horizontal' && 'h-[10px] flex-col px-[3px] py-[2px]',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-component-scroll\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\n/**\n * 커스텀 스크롤바를 제공하는 스크롤 영역 컴포넌트입니다.\n * 마우스 호버 시 스크롤바가 나타나는 UX를 제공합니다.\n *\n * @example\n * ```tsx\n * <ScrollArea className=\"h-[300px]\">\n * <div>스크롤 가능한 콘텐츠</div>\n * </ScrollArea>\n * ```\n *\n * @see {@link ScrollAreaProps} props 상세\n */\nfunction ScrollArea({\n className,\n children,\n onScroll,\n scrollRef,\n hideVerticalScrollbar = false,\n hideHorizontalScrollbar = false,\n disableHorizontalScroll = false,\n ...props\n}: ScrollAreaProps) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\n 'group relative overflow-hidden',\n // Radix Viewport 내부 wrapper 의 `display: table` (가로 스크롤 감지 트릭) 이\n // 콘텐츠 폭 제약을 무시하므로, 가로 스크롤 비활성일 때만 block 으로 강제한다.\n disableHorizontalScroll && '[&_[data-slot=scroll-area-viewport]>div]:!block',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n ref={scrollRef}\n onScroll={onScroll}\n className={cn(\n 'size-full rounded-[inherit]',\n disableHorizontalScroll && '!overflow-x-hidden',\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {!hideVerticalScrollbar && <ScrollBar orientation=\"vertical\" forceMount />}\n {!(hideHorizontalScrollbar || disableHorizontalScroll) && (\n <ScrollBar orientation=\"horizontal\" forceMount />\n )}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nexport { ScrollArea, ScrollBar };\nexport type { ScrollAreaProps };\n","import { cva } from '@exem-ui/core/utils';\n\n// 공통 Input variants\nexport const commonInputVariants = {\n // Container variants - 전체 컴포넌트 래퍼\n container: cva('flex flex-col'),\n\n // Label variants - 라벨 텍스트\n label: cva('inline-block font-regular text-text-primary', {\n variants: {\n size: {\n xsmall: 'mb-[2px] text-body-3',\n small: 'mb-[4px] text-body-2',\n medium: 'mb-[4px] text-body-2',\n large: 'mb-[6px] text-body-1',\n },\n disabled: {\n true: 'text-text-disabled',\n },\n required: {\n true: 'after:ml-0.5 after:text-text-critical after:content-[\"*\"]',\n },\n },\n compoundVariants: [\n {\n required: true,\n disabled: true,\n className: 'after:text-text-disabled',\n },\n ],\n defaultVariants: { size: 'medium' },\n }),\n\n // Description variants - 설명 텍스트\n description: cva('mt-0.5 inline-block text-text-tertiary', {\n variants: {\n size: {\n xsmall: 'text-caption',\n small: 'text-body-3',\n medium: 'text-body-3',\n large: 'text-body-2',\n },\n error: {\n true: 'text-text-critical',\n },\n disabled: {\n true: 'text-text-disabled',\n },\n },\n compoundVariants: [\n {\n error: true,\n disabled: true,\n className: 'text-text-disabled', // disabled 우선 적용\n },\n ],\n defaultVariants: { size: 'medium' },\n }),\n\n // Icon variants - 아이콘 크기\n icon: cva('shrink-0', {\n variants: {\n size: {\n xsmall: 'size-4',\n small: 'size-4',\n medium: 'size-4',\n large: 'size-5',\n },\n },\n defaultVariants: { size: 'medium' },\n }),\n};\n\n// 공통 타입 정의\nexport type Size = 'xsmall' | 'small' | 'medium' | 'large';\nexport type Variant = 'fill' | 'line' | 'lineBackground';\nexport type Icon = React.ReactElement<{ className?: string }>;\n","import { cn, cva } from '@exem-ui/core/utils';\nimport { overlayListVariants } from '../overlayList/overlayListVariants';\nimport { commonInputVariants } from './inputVariants';\n\nexport const selectVariants = {\n container: commonInputVariants.container,\n content: cn(\n overlayListVariants.content,\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n ),\n\n description: commonInputVariants.description,\n\n iconSize: overlayListVariants.slotSize,\n\n item: (props?: Parameters<typeof overlayListVariants.item>[0]) =>\n cn(overlayListVariants.item(props), 'data-[state=checked]:bg-elevation-accent-0'),\n\n label: commonInputVariants.label,\n\n trigger: cva(\n 'group flex w-full items-center justify-between rounded-medium outline-none disabled:cursor-not-allowed disabled:bg-elevation-elevation-2 disabled:text-text-disabled data-[state=open]:border data-[state=open]:border-border-focused [&>span]:line-clamp-1 [&[data-placeholder]]:text-text-tertiary [&_svg]:text-icon-primary',\n {\n compoundVariants: [\n {\n className:\n 'border-border-accent text-tint-foreground-sky bg-elevation-accent-0 [&[data-placeholder]]:text-tint-foreground-sky [&_svg]:text-tint-foreground-sky',\n focus: true,\n variant: 'line',\n },\n // active + fill: 배경만 accent로 변경\n {\n className:\n 'bg-elevation-accent-0 text-tint-foreground-sky [&[data-placeholder]]:text-tint-foreground-sky [&_svg]:text-tint-foreground-sky',\n active: true,\n variant: 'fill',\n },\n // active + line: 배경 accent + 테두리 accent\n {\n className:\n 'bg-elevation-accent-0 border-border-accent text-tint-foreground-sky [&[data-placeholder]]:text-tint-foreground-sky [&_svg]:text-tint-foreground-sky',\n active: true,\n variant: 'line',\n },\n {\n className:\n 'border-border-accent text-tint-foreground-sky [&[data-placeholder]]:text-tint-foreground-sky [&_svg]:text-tint-foreground-sky',\n focus: true,\n variant: 'lineBackground',\n },\n {\n className:\n 'border-border-accent text-tint-foreground-sky [&[data-placeholder]]:text-tint-foreground-sky [&_svg]:text-tint-foreground-sky',\n active: true,\n variant: 'lineBackground',\n },\n ],\n defaultVariants: {\n active: false,\n error: false,\n focus: false,\n size: 'medium',\n variant: 'fill',\n },\n variants: {\n active: {\n false: '',\n true: '',\n },\n error: {\n false: '',\n true: 'border !border-border-critical',\n },\n focus: {\n false: '',\n // 현재는 line 타입만 focus 가능\n true: '',\n },\n size: {\n xsmall: 'h-6 px-[4px] text-body-3',\n small: 'h-7 px-[6px] text-body-2',\n medium: 'h-8 px-[8px] text-body-2',\n large: 'h-10 px-[10px] text-body-1',\n },\n variant: {\n fill: 'bg-elevation-elevation-2',\n line: 'border-border-primary border',\n lineBackground:\n 'border-border-primary border bg-background-primary disabled:bg-background-primary',\n },\n },\n },\n ),\n\n triggerInner: cva('flex w-full items-center', {\n defaultVariants: { size: 'medium' },\n variants: {\n size: {\n xsmall: 'gap-0',\n small: 'gap-[2px]',\n medium: 'gap-[2px]',\n large: 'gap-[4px]',\n },\n },\n }),\n viewport: overlayListVariants.viewport,\n};\n","import { cn } from '@exem-ui/core/utils';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport * as React from 'react';\nimport { createContext, forwardRef, useContext, useId } from 'react';\nimport { ChevronDownIcon } from '../icon';\n\nimport { overlayListVariants } from '../overlayList/overlayListVariants';\nimport { ScrollArea } from '../scrollArea/ScrollArea';\nimport type { Icon, Size, Variant } from './inputVariants';\nimport { selectVariants } from './selectVariants';\n\ntype SelectContextValue = {\n size: Size;\n error: boolean;\n focus: boolean;\n active: boolean;\n disabled: boolean;\n id: string;\n variant: Variant;\n};\n\n/**\n * SelectGroup에서 사용 가능한 variant.\n * lineBackground는 그룹 디자인에 정의되어 있지 않으므로 제외한다.\n */\ntype GroupVariant = Exclude<Variant, 'lineBackground'>;\n\ntype SelectGroupContextValue = {\n isFirstChild: boolean;\n isLastChild: boolean;\n size?: Size;\n variant?: GroupVariant;\n focus?: boolean;\n};\n\n/** Select 라벨 Props */\ntype SelectLabelProps = {\n children: React.ReactNode;\n required?: boolean;\n size?: Size;\n className?: string;\n};\n\n/** Select 트리거 Props */\ntype SelectTriggerProps = {\n children?: React.ReactNode;\n /** 트리거 왼쪽에 표시할 아이콘 */\n leftIcon?: Icon;\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>, 'children'>;\n\n/** Select Box (Trigger + Value 조합) Props */\ntype SelectBoxProps = {\n placeholder?: string;\n /** 트리거 왼쪽에 표시할 아이콘 */\n leftIcon?: Icon;\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>, 'children'>;\n\n/** Select 아이템 Props */\ntype SelectItemProps = {\n children?: React.ReactNode;\n /** 아이템 왼쪽에 표시할 아이콘 (고정 크기 슬롯) */\n leftIcon?: Icon;\n /** 아이템 오른쪽에 표시할 아이콘 (고정 크기 슬롯) */\n rightIcon?: Icon;\n /** 아이템 오른쪽 가변폭 슬롯 (Tag 등). rightIcon 왼쪽에 배치됨. */\n rightSlot?: React.ReactNode;\n size?: Size;\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>, 'children'>;\n\ntype SelectEmptyProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\ntype SelectDescriptionProps = {\n children?: React.ReactNode;\n size?: Size;\n className?: string;\n};\n\ntype SelectGroupProps = {\n children: React.ReactNode;\n size?: Size;\n /** 셀렉트 그룹 스타일 변형 (lineBackground 미지원) */\n variant?: GroupVariant;\n /** 불투명 배경 (elevation-0) 사용 여부. 반투명 배경이 비쳐보이는 것을 방지합니다. */\n hasBackground?: boolean;\n className?: string;\n};\n\n/** Select 루트 Props */\ntype SelectRootProps = {\n children?: React.ReactNode;\n /** 셀렉트 크기 */\n size?: Size;\n /** 셀렉트 스타일 변형 */\n variant?: Variant;\n /** 에러 상태 */\n error?: boolean;\n /** 포커스 상태 (line variant에서만 적용) */\n focus?: boolean;\n /** 활성화 상태 (필터 적용 등 내부 상태가 활성화됨을 표시) */\n active?: boolean;\n /** 비활성화 상태 */\n disabled?: boolean;\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<typeof SelectPrimitive.Root>, 'disabled' | 'children'>;\n\ntype SelectListProps = Omit<\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>,\n 'position'\n>;\n\ntype SelectComponent = React.ForwardRefExoticComponent<\n SelectRootProps & React.RefAttributes<HTMLDivElement>\n> & {\n Label: React.ForwardRefExoticComponent<SelectLabelProps & React.RefAttributes<HTMLLabelElement>>;\n Trigger: React.ForwardRefExoticComponent<\n SelectTriggerProps & React.RefAttributes<React.ComponentRef<typeof SelectPrimitive.Trigger>>\n >;\n Box: React.ForwardRefExoticComponent<\n SelectBoxProps & React.RefAttributes<React.ComponentRef<typeof SelectPrimitive.Trigger>>\n >;\n Value: React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Value> &\n React.RefAttributes<React.ComponentRef<typeof SelectPrimitive.Value>>\n >;\n List: React.ForwardRefExoticComponent<\n SelectListProps & React.RefAttributes<React.ComponentRef<typeof SelectPrimitive.Content>>\n >;\n Item: React.ForwardRefExoticComponent<\n SelectItemProps & React.RefAttributes<React.ComponentRef<typeof SelectPrimitive.Item>>\n >;\n Empty: React.ForwardRefExoticComponent<SelectEmptyProps & React.RefAttributes<HTMLDivElement>>;\n Description: React.ForwardRefExoticComponent<\n SelectDescriptionProps & React.RefAttributes<HTMLDivElement>\n >;\n Group: React.ForwardRefExoticComponent<SelectGroupProps & React.RefAttributes<HTMLDivElement>>;\n};\n\nconst SelectContext = createContext<SelectContextValue | null>(null);\n\nconst useSelectContext = () => {\n const context = useContext(SelectContext);\n if (!context) {\n throw new Error('Select components must be used within a Select');\n }\n return context;\n};\n\nconst SelectGroupContext = createContext<SelectGroupContextValue | null>(null);\n\nconst useSelectGroupContext = () => {\n return useContext(SelectGroupContext);\n};\n\nconst Select = forwardRef<HTMLDivElement, SelectRootProps>(\n (\n {\n children,\n size = 'medium',\n variant = 'fill',\n error = false,\n disabled = false,\n focus = false,\n active = false,\n className,\n ...selectProps\n },\n ref,\n ) => {\n const uniqueId = useId();\n const id = `select-${uniqueId}`;\n\n return (\n <SelectContext.Provider value={{ active, disabled, error, focus, id, size, variant }}>\n <div ref={ref} className={cn(selectVariants.container(), className)}>\n <SelectPrimitive.Root disabled={disabled} {...selectProps}>\n {children}\n </SelectPrimitive.Root>\n </div>\n </SelectContext.Provider>\n );\n },\n) as SelectComponent;\n\nSelect.Value = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Value>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Value>\n>(({ className, children, ...props }, ref) => {\n return (\n <SelectPrimitive.Value ref={ref} className={className} {...props}>\n {children}\n </SelectPrimitive.Value>\n );\n}) as SelectComponent['Value'];\n\nSelect.Trigger = forwardRef<React.ComponentRef<typeof SelectPrimitive.Trigger>, SelectTriggerProps>(\n ({ className, children, leftIcon, ...props }, ref) => {\n const { size, error, id, variant, focus, active } = useSelectContext();\n const groupContext = useSelectGroupContext();\n\n const groupClasses = groupContext\n ? cn('rounded-none border-0', {\n 'rounded-l-medium': groupContext.isFirstChild,\n 'rounded-r-medium': groupContext.isLastChild,\n // line variant: group이 외곽 border를 제공하므로, open 시 border 대신 inset ring 사용\n 'data-[state=open]:border-0 data-[state=open]:ring-1 data-[state=open]:ring-inset data-[state=open]:ring-border-focused':\n variant === 'line',\n })\n : undefined;\n\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n id={id}\n data-slot=\"select-trigger\"\n className={cn(\n selectVariants.trigger({ active, error, focus, size, variant }),\n groupClasses,\n className,\n )}\n {...props}\n >\n <div className={cn(selectVariants.triggerInner({ size }))}>\n {leftIcon && (\n <span\n className={cn(\n selectVariants.iconSize({ size }),\n 'flex items-center justify-center group-disabled:text-icon-disabled',\n )}\n >\n {leftIcon}\n </span>\n )}\n <div className=\"min-w-0 flex-1 truncate text-left\">{children}</div>\n <ChevronDownIcon\n type=\"regular\"\n className={cn(\n selectVariants.iconSize({ size }),\n 'transition-transform duration-200 group-data-[state=open]:rotate-180',\n 'group-disabled:text-icon-disabled',\n )}\n />\n </div>\n </SelectPrimitive.Trigger>\n );\n },\n) as SelectComponent['Trigger'];\n\nSelect.Box = forwardRef<React.ComponentRef<typeof SelectPrimitive.Trigger>, SelectBoxProps>(\n ({ placeholder, leftIcon, className, ...props }, ref) => {\n return (\n <Select.Trigger ref={ref} leftIcon={leftIcon} className={className} {...props}>\n <Select.Value placeholder={placeholder} />\n </Select.Trigger>\n );\n },\n) as SelectComponent['Box'];\n\nSelect.List = forwardRef<React.ComponentRef<typeof SelectPrimitive.Content>, SelectListProps>(\n ({ className, children, ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n data-slot=\"select-content\"\n className={cn(selectVariants.content, 'w-[var(--radix-select-trigger-width)]', className)}\n position=\"popper\"\n {...props}\n >\n <SelectPrimitive.Viewport data-slot=\"select-viewport\" className=\"w-full max-h-60\">\n <ScrollArea\n className=\"max-h-[inherit] [&_[data-slot=scroll-area-viewport]]:max-h-[inherit]\"\n disableHorizontalScroll\n >\n <div className={cn(selectVariants.viewport, 'w-full')}>{children}</div>\n </ScrollArea>\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n ),\n) as SelectComponent['List'];\n\nSelect.Label = forwardRef<HTMLLabelElement, SelectLabelProps>(\n ({ children, required = false, size: sizeProp, className }, ref) => {\n const { size: contextSize, disabled, id } = useSelectContext();\n const groupContext = useSelectGroupContext();\n const size = sizeProp ?? groupContext?.size ?? contextSize;\n\n return (\n <label\n ref={ref}\n htmlFor={id}\n className={cn(selectVariants.label({ disabled, required, size }), className)}\n >\n {children}\n </label>\n );\n },\n) as SelectComponent['Label'];\n\nSelect.Item = forwardRef<React.ComponentRef<typeof SelectPrimitive.Item>, SelectItemProps>(\n ({ className, children, leftIcon, rightIcon, rightSlot, size: sizeProp, ...props }, ref) => {\n const { size: contextSize } = useSelectContext();\n const groupContext = useSelectGroupContext();\n const size = sizeProp ?? groupContext?.size ?? contextSize;\n\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n ref={ref}\n className={cn(selectVariants.item({ size }), className)}\n {...props}\n >\n {leftIcon && <div className={overlayListVariants.slotSize({ size })}>{leftIcon}</div>}\n <SelectPrimitive.ItemText asChild>\n <span className=\"flex min-w-0 flex-1 items-center gap-1 overflow-hidden\">\n {/* ponytail: string 라벨일 때만 잘린 텍스트 확인용 title 주입 */}\n <span\n className=\"min-w-0 flex-1 truncate\"\n title={typeof children === 'string' ? children : undefined}\n >\n {children}\n </span>\n {rightSlot && <span className=\"shrink-0\">{rightSlot}</span>}\n </span>\n </SelectPrimitive.ItemText>\n {rightIcon && <div className={overlayListVariants.slotSize({ size })}>{rightIcon}</div>}\n </SelectPrimitive.Item>\n );\n },\n) as SelectComponent['Item'];\n\nSelect.Empty = forwardRef<HTMLDivElement, SelectEmptyProps>(\n ({ children = 'No data', className }, ref) => {\n return (\n <div ref={ref} className={cn('flex min-h-8 items-center justify-center p-2', className)}>\n <p className=\"text-body-2 text-text-disabled\">{children}</p>\n </div>\n );\n },\n) as SelectComponent['Empty'];\n\nSelect.Description = forwardRef<HTMLDivElement, SelectDescriptionProps>(\n ({ children, size: sizeProp, className }, ref) => {\n const { size: contextSize, error, disabled } = useSelectContext();\n const groupContext = useSelectGroupContext();\n const size = sizeProp ?? groupContext?.size ?? contextSize;\n\n if (!children) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n data-slot=\"select-description\"\n className={cn(selectVariants.description({ disabled, error, size }), className)}\n >\n <p>{children}</p>\n </div>\n );\n },\n) as SelectComponent['Description'];\n\nSelect.Group = forwardRef<HTMLDivElement, SelectGroupProps>(\n ({ children, size = 'medium', variant = 'fill', hasBackground = false, className }, ref) => {\n const childArray = React.Children.toArray(children);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex w-fit flex-row items-stretch overflow-clip rounded-medium',\n variant === 'line' && 'border border-border-primary',\n hasBackground && 'bg-elevation-elevation-0',\n className,\n )}\n >\n {childArray.map((child, index) => {\n const isFirst = index === 0;\n const isLast = index === childArray.length - 1;\n\n return (\n <React.Fragment key={index}>\n <SelectGroupContext.Provider\n value={{ isFirstChild: isFirst, isLastChild: isLast, size, variant }}\n >\n {child}\n </SelectGroupContext.Provider>\n {!isLast && <div className=\"w-px self-stretch bg-border-primary\" />}\n </React.Fragment>\n );\n })}\n </div>\n );\n },\n) as SelectComponent['Group'];\n\nSelect.displayName = 'Select';\nSelect.Label.displayName = 'Select.Label';\nSelect.Trigger.displayName = 'Select.Trigger';\nSelect.Box.displayName = 'Select.Box';\nSelect.Value.displayName = 'Select.Value';\nSelect.List.displayName = 'Select.List';\nSelect.Item.displayName = 'Select.Item';\nSelect.Empty.displayName = 'Select.Empty';\nSelect.Description.displayName = 'Select.Description';\nSelect.Group.displayName = 'Select.Group';\n\nexport { Select };\nexport type {\n SelectComponent,\n SelectRootProps,\n SelectBoxProps,\n SelectDescriptionProps,\n SelectEmptyProps,\n SelectItemProps,\n SelectLabelProps,\n SelectTriggerProps,\n SelectGroupProps,\n SelectListProps,\n};\n","import type { ComponentProps, FocusEvent, ReactNode, RefObject } from 'react';\nimport { useRef, useState } from 'react';\nimport type { Icon } from '../input/inputVariants';\nimport { Select } from '../input/Select';\n\ntype FlatSelectOption = {\n value: string;\n /** 아이템 라벨 */\n label: ReactNode;\n /** 아이템 왼쪽 고정 크기 아이콘 슬롯 */\n leftIcon?: Icon;\n /** 아이템 오른쪽 고정 크기 아이콘 슬롯 */\n rightIcon?: Icon;\n /** 아이템 오른쪽 가변폭 슬롯 (Tag 등) */\n rightSlot?: ReactNode;\n disabled?: boolean;\n};\n\ninterface FlatSelectProps extends ComponentProps<typeof Select> {\n /** 선택 가능한 옵션 배열 */\n options: FlatSelectOption[];\n /** 값이 선택되지 않았을 때 표시할 텍스트 */\n placeholder?: string;\n /** 드롭다운 열림/닫힘 상태 변경 핸들러 */\n onOpenChange?: (open: boolean) => void;\n /** 포커스 획득 핸들러 */\n onFocus?: () => void;\n /** 포커스 해제 핸들러 */\n onBlur?: () => void;\n /** 트리거 왼쪽에 표시할 아이콘 */\n leftIcon?: ComponentProps<typeof Select.Trigger>['leftIcon'];\n /** 라벨 텍스트 */\n label?: ComponentProps<typeof Select.Label>['children'];\n /** 필수 입력 여부 */\n required?: ComponentProps<typeof Select.Label>['required'];\n /** 설명 텍스트 */\n description?: ComponentProps<typeof Select.Description>['children'];\n /** 드롭다운 리스트 className */\n listClassName?: string;\n}\n\n/**\n * Select 컴포넌트의 간소화된 Flat API입니다.\n * options 배열만 전달하면 Compound Component 없이 간편하게 사용할 수 있습니다.\n *\n * @example\n * ```tsx\n * <FlatSelect\n * options={[\n * { value: '1', label: '옵션 1' },\n * { value: '2', label: '아이콘', leftIcon: <AccountIcon size={16} /> },\n * { value: '3', label: '태그', rightSlot: <Tag color=\"sky\">Active</Tag> },\n * ]}\n * placeholder=\"선택하세요\"\n * label=\"항목\"\n * />\n * ```\n *\n * @see {@link FlatSelectProps} props 상세\n */\nfunction FlatSelect({\n options,\n placeholder,\n onBlur,\n onFocus,\n onOpenChange,\n label,\n description,\n required,\n listClassName,\n leftIcon,\n className,\n ...selectProps\n}: FlatSelectProps) {\n const selectRef = useRef<HTMLDivElement>(null);\n const { handleBlur, handleFocus } = useFocusWithin(selectRef, {\n onBlur,\n onFocus,\n });\n\n const handleOpenChange = (open: boolean) => {\n if (open) {\n handleFocus();\n }\n onOpenChange?.(open);\n };\n\n return (\n <div ref={selectRef} className={className}>\n <Select {...selectProps} onOpenChange={handleOpenChange}>\n {label && <Select.Label required={required}>{label}</Select.Label>}\n <Select.Trigger onBlur={handleBlur} onFocus={handleFocus} leftIcon={leftIcon}>\n <Select.Value placeholder={placeholder} className=\"truncate\" />\n </Select.Trigger>\n {description && <Select.Description>{description}</Select.Description>}\n <Select.List className={listClassName}>\n {options.length === 0 ? (\n <Select.Empty>{placeholder}</Select.Empty>\n ) : (\n options.map(({ value, label: optionLabel, ...itemProps }) => (\n <Select.Item key={value} value={value} {...itemProps}>\n {optionLabel}\n </Select.Item>\n ))\n )}\n </Select.List>\n </Select>\n </div>\n );\n}\n\nfunction useFocusWithin(\n containerRef: RefObject<HTMLElement | null>,\n callbacks?: { onFocus?: () => void; onBlur?: () => void },\n) {\n const [isFocused, setIsFocused] = useState(false);\n\n const handleBlur = (event: FocusEvent) => {\n if (containerRef.current?.contains(event.relatedTarget as Node)) {\n return;\n }\n setIsFocused(false);\n callbacks?.onBlur?.();\n };\n\n const handleFocus = () => {\n if (isFocused) {\n return;\n }\n setIsFocused(true);\n callbacks?.onFocus?.();\n };\n\n return { handleBlur, handleFocus, isFocused };\n}\n\nFlatSelect.displayName = 'FlatSelect';\n\nexport { FlatSelect };\nexport type { FlatSelectProps, FlatSelectOption };\n","import { cva } from '@exem-ui/core/utils';\n\nexport const tabsVariants = {\n bar: cva('', {\n variants: {\n type: {\n primary: 'border-b border-border-primary',\n secondary: '',\n },\n },\n defaultVariants: { type: 'primary' },\n }),\n\n list: cva('flex min-w-0 flex-1 items-center', {\n variants: {\n type: {\n primary: 'gap-5',\n secondary: 'gap-1',\n },\n },\n defaultVariants: { type: 'primary' },\n }),\n\n trigger: cva(\n 'group inline-flex items-center justify-center gap-1.5 whitespace-nowrap font-pretendard font-semibold text-body-2 leading-[140%] transition-all disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n type: {\n primary: [\n 'h-8 border-b-2 border-transparent p-0 text-text-tertiary',\n 'hover:text-text-primary',\n 'data-[state=active]:border-border-focused data-[state=active]:text-text-primary',\n ],\n secondary: [\n 'h-7 rounded-strong px-2 text-text-tertiary',\n 'hover:text-text-primary',\n 'data-[state=active]:rounded-medium data-[state=active]:bg-elevation-elevation-2 data-[state=active]:text-text-primary',\n ],\n },\n },\n defaultVariants: { type: 'primary' },\n },\n ),\n};\n","import { cn } from '@exem-ui/core/utils';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport type React from 'react';\nimport { createContext, forwardRef, useContext } from 'react';\nimport { tabsVariants } from './tabsVariants';\n\ntype TabsType = 'primary' | 'secondary';\n\ntype TabsContextType = {\n type: TabsType;\n};\n\ntype TabsRootProps<T extends string = string> = Omit<\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root>,\n 'value' | 'defaultValue' | 'onValueChange'\n> & {\n /**\n * 탭 스타일 유형\n * @default 'primary'\n */\n type?: TabsType;\n value?: T;\n defaultValue?: T;\n onValueChange?: (value: T) => void;\n};\n\ntype TabsListProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> & {\n /**\n * 탭 바 우측에 표시할 콘텐츠 (검색, 액션 버튼 등).\n * 접근성을 위해 `role=\"tablist\"` 바깥 형제 요소로 렌더됩니다.\n */\n rightSlot?: React.ReactNode;\n};\n\ntype TabsTriggerProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> & {\n /** 텍스트 왼쪽에 표시할 아이콘 요소 */\n leftIcon?: React.ReactElement<{ className?: string }>;\n /** 텍스트 오른쪽에 표시할 아이콘 요소 */\n rightIcon?: React.ReactElement<{ className?: string }>;\n /** 탭 라벨 옆에 표시할 배지 텍스트 */\n badge?: string | number;\n};\n\ntype TabsContentProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>;\n\ntype TabsComponent = {\n <T extends string = string>(\n props: TabsRootProps<T> & React.RefAttributes<React.ElementRef<typeof TabsPrimitive.Root>>,\n ): React.ReactElement | null;\n displayName?: string;\n List: React.ForwardRefExoticComponent<TabsListProps>;\n Trigger: React.ForwardRefExoticComponent<TabsTriggerProps>;\n Content: React.ForwardRefExoticComponent<TabsContentProps>;\n};\n\nconst TabsContext = createContext<TabsContextType>({ type: 'primary' });\n\nconst useTabsContext = () => {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error('useTabsContext must be used within a TabsProvider');\n }\n return context;\n};\n\n/**\n * 탭 형태의 콘텐츠 전환 컴포넌트입니다.\n * Compound Component 패턴으로 `Tabs.List`, `Tabs.Trigger`, `Tabs.Content`와 함께 사용합니다.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\" type=\"primary\">\n * <Tabs.List>\n * <Tabs.Trigger value=\"tab1\">첫 번째</Tabs.Trigger>\n * <Tabs.Trigger value=\"tab2\">두 번째</Tabs.Trigger>\n * </Tabs.List>\n * <Tabs.Content value=\"tab1\">첫 번째 내용</Tabs.Content>\n * <Tabs.Content value=\"tab2\">두 번째 내용</Tabs.Content>\n * </Tabs>\n * ```\n *\n * @see {@link TabsRootProps} 루트 props 상세\n * @see {@link TabsTriggerProps} 트리거 props 상세\n */\nconst Tabs = forwardRef<React.ElementRef<typeof TabsPrimitive.Root>, TabsRootProps>(\n ({ type = 'primary', children, ...props }, ref) => (\n <TabsContext.Provider value={{ type }}>\n <TabsPrimitive.Root ref={ref} {...props}>\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n ),\n) as unknown as TabsComponent;\n\nTabs.List = forwardRef<React.ElementRef<typeof TabsPrimitive.List>, TabsListProps>(\n ({ className, rightSlot, ...props }, ref) => {\n const { type } = useTabsContext();\n\n if (rightSlot == null) {\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n tabsVariants.list({ type }),\n tabsVariants.bar({ type }),\n 'inline-flex',\n className,\n )}\n {...props}\n />\n );\n }\n\n return (\n <div className={cn(tabsVariants.bar({ type }), 'flex')}>\n <TabsPrimitive.List\n ref={ref}\n className={cn(tabsVariants.list({ type }), className)}\n {...props}\n />\n <div className=\"flex shrink-0 items-center\">{rightSlot}</div>\n </div>\n );\n },\n) as TabsComponent['List'];\n\nTabs.Trigger = forwardRef<React.ElementRef<typeof TabsPrimitive.Trigger>, TabsTriggerProps>(\n ({ className, leftIcon, rightIcon, badge, children, ...props }, ref) => {\n const { type } = useTabsContext();\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(tabsVariants.trigger({ type }), className)}\n {...props}\n >\n {leftIcon && <span className=\"size-4\">{leftIcon}</span>}\n <span className=\"flex items-center gap-1\">\n {children}\n {badge && (\n <span className=\"text-text-tertiary group-data-[state=active]:text-text-accent\">\n {badge}\n </span>\n )}\n </span>\n {rightIcon && <span className=\"size-4\">{rightIcon}</span>}\n </TabsPrimitive.Trigger>\n );\n },\n) as TabsComponent['Trigger'];\n\nTabs.Content = forwardRef<React.ElementRef<typeof TabsPrimitive.Content>, TabsContentProps>(\n ({ className, ...props }, ref) => (\n <TabsPrimitive.Content ref={ref} className={cn(className)} {...props} />\n ),\n) as TabsComponent['Content'];\n\nTabs.displayName = 'Tabs';\nTabs.List.displayName = 'Tabs.List';\nTabs.Trigger.displayName = 'Tabs.Trigger';\nTabs.Content.displayName = 'Tabs.Content';\n\nexport { Tabs };\nexport type { TabsComponent, TabsRootProps, TabsListProps, TabsTriggerProps, TabsContentProps };\n","import { Tabs, type TabsRootProps, type TabsTriggerProps } from '../tabs/Tabs';\n\ntype FlatTabItem<V extends string = string> = Pick<\n TabsTriggerProps,\n 'children' | 'disabled' | 'leftIcon' | 'rightIcon' | 'badge' | 'className'\n> & {\n value: V;\n};\n\ntype FlatTabsProps<Items extends readonly FlatTabItem[] = readonly FlatTabItem[]> = Omit<\n TabsRootProps,\n 'children' | 'asChild' | 'value' | 'defaultValue' | 'onValueChange'\n> & {\n /** 탭 아이템 배열 */\n items: Items;\n value?: Items[number]['value'];\n defaultValue?: Items[number]['value'];\n onValueChange?: (value: Items[number]['value']) => void;\n};\n\n/**\n * Tabs 컴포넌트의 간소화된 Flat API입니다.\n * items 배열만 전달하면 Compound Component 없이 탭 목록을 구성합니다.\n * items 의 value 로부터 타입이 추론되어, value/onValueChange 의 오타가 컴파일 단계에서 잡힙니다.\n *\n * @example\n * ```tsx\n * <FlatTabs\n * defaultValue=\"tab1\"\n * type=\"primary\"\n * items={[\n * { value: 'tab1', children: '첫 번째' },\n * { value: 'tab2', children: '두 번째' },\n * ]}\n * />\n * ```\n *\n * @see {@link FlatTabsProps} props 상세\n */\nfunction FlatTabs<const Items extends readonly FlatTabItem[]>({\n items,\n className,\n ...props\n}: FlatTabsProps<Items>) {\n const rootProps = props as TabsRootProps<Items[number]['value']>;\n return (\n <Tabs {...rootProps}>\n <Tabs.List className={className}>\n {items.map(({ value, children, ...itemProps }) => (\n <Tabs.Trigger key={value} value={value} {...itemProps}>\n {children}\n </Tabs.Trigger>\n ))}\n </Tabs.List>\n </Tabs>\n );\n}\n\nFlatTabs.displayName = 'FlatTabs';\n\nexport { FlatTabs };\nexport type { FlatTabsProps, FlatTabItem };\n","import { cn, cva, type VariantProps } from '@exem-ui/core/utils';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport type React from 'react';\nimport { forwardRef } from 'react';\n\ntype TooltipRootProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>;\n\ntype TooltipProviderProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>;\n\ntype TooltipTriggerProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>;\n\ntype TooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> &\n VariantProps<typeof tooltipContentVariants> & {\n portalContainer?: HTMLElement | null;\n };\n\ntype TooltipTitleProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype TooltipDescriptionProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype TooltipComponent = typeof TooltipPrimitive.Root & {\n Provider: typeof TooltipPrimitive.Provider;\n Trigger: typeof TooltipPrimitive.Trigger;\n Content: React.ForwardRefExoticComponent<\n TooltipContentProps & React.RefAttributes<React.ElementRef<typeof TooltipPrimitive.Content>>\n >;\n Title: React.ForwardRefExoticComponent<TooltipTitleProps & React.RefAttributes<HTMLDivElement>>;\n Description: React.ForwardRefExoticComponent<\n TooltipDescriptionProps & React.RefAttributes<HTMLDivElement>\n >;\n};\n\nconst tooltipContentVariants = cva(\n [\n // Base layout\n 'z-50 flex flex-col items-start overflow-hidden',\n 'rounded-medium',\n 'text-text-static-light',\n 'bg-component-tooltip border border-border-primary',\n 'shadow-medium',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n ],\n {\n variants: {\n size: {\n tiny: 'px-2 py-1 text-body-3',\n small: 'w-[160px] gap-[8px] px-[12px] py-[10px]',\n medium: 'w-[240px] gap-[8px] px-[12px] py-[10px]',\n large: 'w-[320px] gap-[8px] px-[12px] py-[10px]',\n xlarge: 'w-[400px] gap-[8px] px-[12px] py-[10px]',\n },\n },\n defaultVariants: { size: 'small' },\n },\n);\n\nconst tooltipTitleVariants = cva([\n 'text-body-1 font-semibold text-text-static-light',\n 'group-data-[size=tiny]/tooltip-content:text-body-3',\n]);\n\nconst tooltipTextVariants = cva([\n 'text-body-2 font-regular text-text-static-light',\n 'group-data-[size=tiny]/tooltip-content:text-body-3',\n]);\n\nconst Tooltip = TooltipPrimitive.Root as TooltipComponent;\n\nTooltip.Provider = TooltipPrimitive.Provider;\n\nTooltip.Trigger = TooltipPrimitive.Trigger;\n\nTooltip.Content = forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(({ className, sideOffset = 4, size, children, portalContainer, ...props }, ref) => (\n <TooltipPrimitive.Portal container={portalContainer}>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n data-size={size}\n className={cn('group/tooltip-content', tooltipContentVariants({ size }), className)}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n)) as TooltipComponent['Content'];\n\nTooltip.Title = forwardRef<HTMLDivElement, TooltipTitleProps>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn(tooltipTitleVariants(), className)} {...props}>\n {children}\n </div>\n ),\n) as TooltipComponent['Title'];\n\nTooltip.Description = forwardRef<HTMLDivElement, TooltipDescriptionProps>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn(tooltipTextVariants(), className)} {...props}>\n {children}\n </div>\n ),\n) as TooltipComponent['Description'];\n\nTooltip.displayName = 'Tooltip';\nTooltip.Content.displayName = 'Tooltip.Content';\nTooltip.Title.displayName = 'Tooltip.Title';\nTooltip.Description.displayName = 'Tooltip.Description';\nTooltip.Trigger.displayName = 'Tooltip.Trigger';\nTooltip.Provider.displayName = 'Tooltip.Provider';\n\nexport { Tooltip };\nexport type {\n TooltipComponent,\n TooltipContentProps,\n TooltipDescriptionProps,\n TooltipProviderProps,\n TooltipRootProps,\n TooltipTitleProps,\n TooltipTriggerProps,\n};\n","import type { ComponentProps } from 'react';\nimport { Tooltip } from '../tooltip/Tooltip';\n\ninterface FlatTooltipProps {\n /** 툴팁을 적용할 자식 요소 */\n children: React.ReactNode;\n /** 툴팁 제목 (선택) */\n title?: React.ReactNode;\n /** 툴팁 크기 */\n size: ComponentProps<typeof Tooltip.Content>['size'];\n /** 툴팁 표시 위치 */\n side?: ComponentProps<typeof Tooltip.Content>['side'];\n /** 툴팁 정렬 */\n align?: ComponentProps<typeof Tooltip.Content>['align'];\n /** 사이드 방향 오프셋 (px) */\n sideOffset?: ComponentProps<typeof Tooltip.Content>['sideOffset'];\n /** 정렬 방향 오프셋 (px) */\n alignOffset?: ComponentProps<typeof Tooltip.Content>['alignOffset'];\n /** 툴팁 설명 텍스트 */\n description: React.ReactNode;\n}\n\n/**\n * Tooltip 컴포넌트의 간소화된 Flat API입니다.\n * Compound Component 없이 props만으로 간편하게 사용할 수 있습니다.\n *\n * @example\n * ```tsx\n * <FlatTooltip size=\"small\" description=\"도움말 텍스트\">\n * <button>호버하세요</button>\n * </FlatTooltip>\n *\n * <FlatTooltip size=\"tiny\" title=\"제목\" description=\"설명\">\n * <span>정보</span>\n * </FlatTooltip>\n * ```\n *\n * @see {@link FlatTooltipProps} props 상세\n */\nconst FlatTooltip = ({ children, title, size, description, ...props }: FlatTooltipProps) => {\n return (\n <Tooltip.Provider delayDuration={0} skipDelayDuration={0}>\n <Tooltip>\n <Tooltip.Trigger asChild>{children}</Tooltip.Trigger>\n <Tooltip.Content size={size} {...props}>\n {title && <Tooltip.Title>{title}</Tooltip.Title>}\n {description && <Tooltip.Description>{description}</Tooltip.Description>}\n </Tooltip.Content>\n </Tooltip>\n </Tooltip.Provider>\n );\n};\n\n/** FlatTooltip 설정 객체 타입 (children 제외) */\ntype TooltipConfig = Omit<ComponentProps<typeof FlatTooltip>, 'children' | 'size'> & {\n /**\n * 툴팁 사용 여부\n * @default true\n */\n use?: boolean;\n size?: ComponentProps<typeof FlatTooltip>['size'];\n};\n\ninterface ConditionalTooltipProps {\n /** 툴팁으로 감쌀 자식 요소 */\n children: React.ReactNode;\n /**\n * 툴팁 설정값\n * - `string`: 기본 tiny 사이즈의 툴팁 description으로 사용\n * - `object`: FlatTooltip props를 직접 전달 (`use: false`로 비활성화 가능)\n */\n tooltip: ComponentProps<typeof FlatTooltip>['description'] | TooltipConfig;\n}\n\n/**\n * 조건부로 FlatTooltip을 적용하는 래퍼 컴포넌트입니다.\n *\n * @description\n * tooltip prop의 타입에 따라 다르게 동작합니다:\n * - `string`: tiny 사이즈의 기본 툴팁으로 렌더링\n * - `object` (`use !== false`): 전달된 props로 FlatTooltip 렌더링\n * - `object` (`use === false`) 또는 기타: children만 반환 (툴팁 없음)\n *\n * @example\n * ```tsx\n * <ConditionalTooltip tooltip=\"도움말 텍스트\">\n * <button>버튼</button>\n * </ConditionalTooltip>\n *\n * <ConditionalTooltip tooltip={{ description: \"설명\", size: \"small\", side: \"top\" }}>\n * <button>버튼</button>\n * </ConditionalTooltip>\n *\n * <ConditionalTooltip tooltip={{ use: false, description: \"\" }}>\n * <button>툴팁 없음</button>\n * </ConditionalTooltip>\n * ```\n *\n * @see {@link ConditionalTooltipProps} props 상세\n */\nfunction ConditionalTooltip({ children, tooltip }: ConditionalTooltipProps) {\n if (typeof tooltip === 'string') {\n return (\n <FlatTooltip size=\"tiny\" description={tooltip}>\n {children}\n </FlatTooltip>\n );\n }\n\n if (tooltip && typeof tooltip === 'object' && 'description' in tooltip && tooltip.use !== false) {\n return (\n <FlatTooltip size={tooltip.size || 'tiny'} {...tooltip}>\n {children}\n </FlatTooltip>\n );\n }\n\n return children;\n}\n\nFlatTooltip.displayName = 'FlatTooltip';\nConditionalTooltip.displayName = 'ConditionalTooltip';\n\nexport { FlatTooltip, ConditionalTooltip };\nexport type { FlatTooltipProps, ConditionalTooltipProps, TooltipConfig };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/codeEditor/CodeEditorSourceProvider.tsx","../../src/codeEditor/format/useControllableViewMode.ts","../../src/codeEditor/format/CodeEditorFormatProvider.tsx","../../src/codeEditor/format/getDisplayValue.ts","../../src/codeEditor/copy/useCopyState.ts","../../src/codeEditor/copy/CopyTrigger.tsx","../../src/codeEditor/format/FormatToggle.tsx","../../src/codeEditor/format/FormatTrigger.tsx","../../src/codeEditor/monacoCodeEditor.ts","../../src/codeEditor/surface/useMonacoLoader.ts","../../src/codeEditor/surface/CodeEditorSurface.tsx","../../src/codeEditor/CodeEditor.tsx","../../src/codeEditor/format/useActiveFormatter.ts","../../src/codeEditor/jsonEditor/formatJsonValue.ts","../../src/codeEditor/jsonEditor/monacoJsonEditor.ts","../../src/codeEditor/jsonEditor/JsonEditor.tsx","../../src/codeEditor/sqlEditor/formatSqlValue.ts","../../src/codeEditor/sqlEditor/monacoSqlEditor.ts","../../src/codeEditor/sqlEditor/tokens.ts","../../src/codeEditor/sqlEditor/useSqlEditorTokenDecorations.ts","../../src/codeEditor/sqlEditor/SqlEditor.tsx","../../src/codeEditor/index.ts"],"names":["React","useState","useCallback","React2","jsx","React3","React4","Fragment","React5","format","React6","loader","useEffect","React7","cn","Editor","React8","React9","React10","useRef","React11","CodeEditor"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react';\n\n// 원본 값과 편집 가능 여부를 하위 컴포넌트에 공유합니다.\ntype CodeEditorSourceContextValue = {\n onSourceValueChange?: (value: string) => void;\n readOnly: boolean;\n sourceValue?: string;\n};\n\ntype CodeEditorSourceProviderProps = CodeEditorSourceContextValue & {\n children: React.ReactNode;\n};\n\nconst CodeEditorSourceContext = React.createContext<CodeEditorSourceContextValue | null>(null);\n\nconst useCodeEditorSource = () => {\n const context = React.useContext(CodeEditorSourceContext);\n\n if (!context) {\n throw new Error('CodeEditor components must be used within CodeEditor');\n }\n\n return context;\n};\n\nconst CodeEditorSourceProvider = ({\n children,\n onSourceValueChange,\n readOnly,\n sourceValue,\n}: CodeEditorSourceProviderProps) => {\n const contextValue = React.useMemo<CodeEditorSourceContextValue>(\n () => ({\n onSourceValueChange,\n readOnly,\n sourceValue,\n }),\n [onSourceValueChange, readOnly, sourceValue],\n );\n\n return (\n <CodeEditorSourceContext.Provider value={contextValue}>\n {children}\n </CodeEditorSourceContext.Provider>\n );\n};\n\nexport { CodeEditorSourceProvider, useCodeEditorSource };\nexport type { CodeEditorSourceContextValue, CodeEditorSourceProviderProps };\n","import { useCallback, useState } from 'react';\nimport type { CodeEditorViewMode } from './types';\n\n// viewMode를 controlled/uncontrolled 방식 모두에서 같은 API로 다룹니다.\ntype UseControllableViewModeOptions = {\n value?: CodeEditorViewMode;\n defaultValue?: CodeEditorViewMode;\n onChange?: (mode: CodeEditorViewMode) => void;\n};\n\nconst useControllableViewMode = ({\n value,\n defaultValue = 'original',\n onChange,\n}: UseControllableViewModeOptions) => {\n const [uncontrolledValue, setUncontrolledValue] = useState<CodeEditorViewMode>(defaultValue);\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : uncontrolledValue;\n\n const setValue = useCallback(\n (nextValue: CodeEditorViewMode) => {\n if (!isControlled) {\n setUncontrolledValue(nextValue);\n }\n\n onChange?.(nextValue);\n },\n [isControlled, onChange],\n );\n\n return [currentValue, setValue] as const;\n};\n\nexport { useControllableViewMode };\n","import * as React from 'react';\nimport type { CodeEditorFormatter, CodeEditorViewMode } from './types';\nimport { useControllableViewMode } from './useControllableViewMode';\n\n// 보기 모드와 현재 사용할 formatter를 하위 컴포넌트에 공유합니다.\ntype CodeEditorFormatContextValue = {\n activeFormatter?: CodeEditorFormatter | null;\n formatter?: CodeEditorFormatter;\n setActiveFormatter: (formatter?: CodeEditorFormatter | null) => void;\n setViewMode: (mode: CodeEditorViewMode) => void;\n viewMode: CodeEditorViewMode;\n};\n\ntype CodeEditorFormatProviderProps = {\n children: React.ReactNode;\n defaultViewMode?: CodeEditorViewMode;\n formatter?: CodeEditorFormatter;\n onViewModeChange?: (mode: CodeEditorViewMode) => void;\n viewMode?: CodeEditorViewMode;\n};\n\nconst CodeEditorFormatContext = React.createContext<CodeEditorFormatContextValue | null>(null);\n\nconst useCodeEditorFormat = () => {\n const context = React.useContext(CodeEditorFormatContext);\n\n if (!context) {\n throw new Error('CodeEditor components must be used within CodeEditor');\n }\n\n return context;\n};\n\nconst CodeEditorFormatProvider = ({\n children,\n defaultViewMode,\n formatter,\n onViewModeChange,\n viewMode: viewModeProp,\n}: CodeEditorFormatProviderProps) => {\n const [viewMode, setViewMode] = useControllableViewMode({\n value: viewModeProp,\n defaultValue: defaultViewMode,\n onChange: onViewModeChange,\n });\n const [activeFormatterOverride, setActiveFormatterOverride] = React.useState<\n CodeEditorFormatter | null | undefined\n >();\n const activeFormatter =\n activeFormatterOverride === undefined ? formatter : activeFormatterOverride;\n const setActiveFormatter = React.useCallback((nextFormatter?: CodeEditorFormatter | null) => {\n setActiveFormatterOverride(() => nextFormatter);\n }, []);\n const contextValue = React.useMemo<CodeEditorFormatContextValue>(\n () => ({\n activeFormatter,\n formatter,\n setActiveFormatter,\n setViewMode,\n viewMode,\n }),\n [activeFormatter, formatter, setActiveFormatter, setViewMode, viewMode],\n );\n\n return (\n <CodeEditorFormatContext.Provider value={contextValue}>\n {children}\n </CodeEditorFormatContext.Provider>\n );\n};\n\nexport { CodeEditorFormatProvider, useCodeEditorFormat };\nexport type { CodeEditorFormatContextValue, CodeEditorFormatProviderProps };\n","import type { CodeEditorFormatter, CodeEditorViewMode } from './types';\n\n// 원본 값과 viewMode를 받아 Monaco에 표시할 값을 만듭니다.\nconst getDisplayValue = (\n value: string | undefined,\n viewMode: CodeEditorViewMode,\n formatter?: CodeEditorFormatter | null,\n) => {\n const currentValue = value ?? '';\n\n if (viewMode !== 'formatted' || !formatter) {\n return currentValue;\n }\n\n return formatter(currentValue);\n};\n\nexport { getDisplayValue };\n","import * as React from 'react';\n\n// 복사 성공 표시를 일정 시간 유지하는 작은 상태 훅입니다.\nconst useCopyState = (copiedDuration: number) => {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const markCopied = React.useCallback(() => {\n setCopied(true);\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(() => {\n setCopied(false);\n timerRef.current = null;\n }, copiedDuration);\n }, [copiedDuration]);\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return { copied, markCopied };\n};\n\nexport { useCopyState };\n","import * as React from 'react';\nimport { useCodeEditorSource } from '../CodeEditorSourceProvider';\nimport { useCodeEditorFormat } from '../format/CodeEditorFormatProvider';\nimport { getDisplayValue } from '../format/getDisplayValue';\nimport type { CodeEditorCopyTriggerProps } from './types';\nimport { useCopyState } from './useCopyState';\n\n// 복사 버튼 UI는 소비자가 만들고, 이 컴포넌트는 상태와 액션만 제공합니다.\nconst CopyTrigger = ({\n children,\n copiedDuration = 1500,\n formatter,\n value,\n}: CodeEditorCopyTriggerProps) => {\n const { activeFormatter, viewMode } = useCodeEditorFormat();\n const { sourceValue } = useCodeEditorSource();\n const copyFormatter = formatter === undefined ? activeFormatter : formatter;\n const displayValue = getDisplayValue(value ?? sourceValue, viewMode, copyFormatter);\n const { copied, markCopied } = useCopyState(copiedDuration);\n\n const copy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(displayValue);\n } catch {\n // Clipboard API는 HTTPS/localhost 같은 secure context에서만 보장됩니다.\n throw new Error('CodeEditor.CopyTrigger: Clipboard copy failed.');\n }\n\n markCopied();\n }, [displayValue, markCopied]);\n\n const getCopyProps = React.useCallback(\n () => ({\n onClick: copy,\n type: 'button' as const,\n }),\n [copy],\n );\n\n return <>{children({ copied, copy, getCopyProps })}</>;\n};\n\nCopyTrigger.displayName = 'CodeEditor.CopyTrigger';\n\nexport { CopyTrigger };\n","import * as React from 'react';\nimport { useCodeEditorFormat } from './CodeEditorFormatProvider';\nimport type { CodeEditorFormatToggleProps } from './types';\n\n// original/formatted 보기 전환 UI를 render prop으로 구성하게 합니다.\nconst FormatToggle = ({ children }: CodeEditorFormatToggleProps) => {\n const { viewMode, setViewMode } = useCodeEditorFormat();\n const formatted = viewMode === 'formatted';\n\n const toggle = React.useCallback(() => {\n setViewMode(formatted ? 'original' : 'formatted');\n }, [formatted, setViewMode]);\n\n const getToggleProps = React.useCallback(\n () => ({\n onClick: toggle,\n 'aria-pressed': formatted,\n type: 'button' as const,\n }),\n [formatted, toggle],\n );\n\n return <>{children({ formatted, toggle, getToggleProps })}</>;\n};\n\nFormatToggle.displayName = 'CodeEditor.FormatToggle';\n\nexport { FormatToggle };\n","import * as React from 'react';\nimport { useCodeEditorSource } from '../CodeEditorSourceProvider';\nimport { useCodeEditorFormat } from './CodeEditorFormatProvider';\nimport type { CodeEditorFormatTriggerProps } from './types';\n\n// 원본 값을 formatter 결과로 바꾸는 포맷 액션을 제공합니다.\nconst FormatTrigger = ({ children }: CodeEditorFormatTriggerProps) => {\n const { onSourceValueChange, readOnly, sourceValue } = useCodeEditorSource();\n const { activeFormatter, setViewMode } = useCodeEditorFormat();\n const disabled = readOnly || !activeFormatter || !onSourceValueChange;\n\n const format = React.useCallback(() => {\n if (readOnly || !activeFormatter || !onSourceValueChange) {\n return;\n }\n\n onSourceValueChange(activeFormatter(sourceValue ?? ''));\n setViewMode('original');\n }, [activeFormatter, onSourceValueChange, readOnly, setViewMode, sourceValue]);\n\n const getFormatProps = React.useCallback(\n () => ({\n disabled,\n onClick: format,\n type: 'button' as const,\n }),\n [disabled, format],\n );\n\n return <>{children({ format, getFormatProps })}</>;\n};\n\nFormatTrigger.displayName = 'CodeEditor.FormatTrigger';\n\nexport { FormatTrigger };\n","import { loader, type Monaco } from '@monaco-editor/react';\nimport type { editor as MonacoEditor } from 'monaco-editor';\n\n// Monaco 전역 로더, 테마, 언어별 색상 규칙을 CodeEditor 기준으로 묶습니다.\nlet localMonacoLoaderPromise: Promise<void> | null = null;\nlet configuredMonaco: Monaco | null = null;\nconst codeEditorSemanticColorStyleId = 'exem-code-editor-semantic-colors';\n\n/**\n * Monaco 테마는 페이지 전역으로 하나만 적용되므로 단일 테마 이름을 사용합니다.\n * 언어별 색 규칙은 registerCodeEditorThemeRules로 이 테마에 합쳐집니다.\n */\nconst codeEditorThemeName = 'exem-code';\n\nconst defaultCodeEditorOptions: MonacoEditor.IStandaloneEditorConstructionOptions = {\n automaticLayout: true,\n bracketPairColorization: { enabled: false },\n domReadOnly: true,\n folding: false,\n fontFamily: 'JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontSize: 14,\n glyphMargin: false,\n guides: {\n highlightActiveIndentation: false,\n indentation: false,\n },\n lineDecorationsWidth: 0,\n lineHeight: 20,\n lineNumbers: 'on',\n lineNumbersMinChars: 4,\n minimap: { enabled: false },\n overviewRulerLanes: 0,\n padding: {\n bottom: 8,\n top: 8,\n },\n readOnly: true,\n renderLineHighlight: 'none',\n renderWhitespace: 'none',\n scrollbar: {\n alwaysConsumeMouseWheel: false,\n horizontal: 'auto',\n horizontalScrollbarSize: 10,\n horizontalSliderSize: 6,\n useShadows: false,\n vertical: 'hidden',\n verticalScrollbarSize: 10,\n verticalSliderSize: 6,\n },\n scrollBeyondLastLine: false,\n stickyScroll: {\n enabled: false,\n },\n wordWrap: 'off',\n};\n\n// 배열 순서가 Monaco mtkN 번호를 결정합니다.\nconst codeEditorSemanticColors = [\n '--color-text-secondary',\n '--color-tint-foreground-violet',\n '--color-tint-foreground-teal',\n '--color-tint-foreground-pink',\n '--color-text-disabled',\n '--color-text-tertiary',\n '--color-tint-foreground-orange',\n] as const;\n\ntype CodeEditorSemanticColorVariable = (typeof codeEditorSemanticColors)[number];\ntype CodeEditorSemanticColorThemeRule = {\n token: string;\n cssVariable: CodeEditorSemanticColorVariable;\n fontStyle?: string;\n};\ntype CodeEditorThemeRuleContributor = () => MonacoEditor.ITokenThemeRule[];\n\nconst codeEditorThemeRuleContributors = new Set<CodeEditorThemeRuleContributor>();\n\n/**\n * 언어별 토큰 색 규칙을 공용 테마에 등록합니다.\n * 각 에디터 폴더(sqlEditor, jsonEditor)가 자신의 규칙을 직접 등록하므로,\n * 폴더를 제거하면 해당 언어의 색 규칙도 함께 사라집니다.\n */\nconst registerCodeEditorThemeRules = (contributor: CodeEditorThemeRuleContributor) => {\n codeEditorThemeRuleContributors.add(contributor);\n\n if (configuredMonaco) {\n configuredMonaco.editor.defineTheme(codeEditorThemeName, buildCodeEditorTheme());\n }\n};\n\nconst withoutHash = (color: string) => color.replace(/^#/, '');\n\n/**\n * Monaco 테마에는 CSS 변수를 직접 넣기 어려워 hex 마커로 슬롯을 고정합니다.\n */\nconst createCodeEditorTokenMarker = (index: number) =>\n `#${String(index + 1).padStart(6, '0')}` as const;\n\nconst getCodeEditorSemanticColorMarker = (cssVariable: CodeEditorSemanticColorVariable) =>\n createCodeEditorTokenMarker(codeEditorSemanticColors.indexOf(cssVariable));\n\n/**\n * 언어 토큰을 Monaco가 받는 foreground 마커로 변환합니다.\n */\nconst createCodeEditorThemeRules = (\n rules: CodeEditorSemanticColorThemeRule[],\n): MonacoEditor.ITokenThemeRule[] =>\n rules.map(({ token, cssVariable, fontStyle }) => {\n const themeRule: MonacoEditor.ITokenThemeRule = {\n token,\n foreground: withoutHash(getCodeEditorSemanticColorMarker(cssVariable)),\n };\n\n if (fontStyle) {\n themeRule.fontStyle = fontStyle;\n }\n\n return themeRule;\n });\n\n/**\n * Monaco가 만든 mtkN class를 실제 시멘틱 CSS 변수에 연결합니다.\n */\nconst getCodeEditorSemanticColorStyleSheet = () =>\n codeEditorSemanticColors\n .map(\n (cssVariable, index) =>\n `.exem-code-editor-monaco .mtk${index + 1} {\\n color: var(${cssVariable});\\n}`,\n )\n .join('\\n\\n');\n\n/**\n * 에디터가 처음 로드될 때 토큰 색 연결 CSS를 한 번만 주입합니다.\n */\nconst ensureCodeEditorSemanticColorStyles = () => {\n if (typeof document === 'undefined' || document.getElementById(codeEditorSemanticColorStyleId)) {\n return;\n }\n\n const styleElement = document.createElement('style');\n styleElement.id = codeEditorSemanticColorStyleId;\n styleElement.textContent = getCodeEditorSemanticColorStyleSheet();\n document.head.append(styleElement);\n};\n\nconst baseCodeEditorThemeRules: MonacoEditor.ITokenThemeRule[] = createCodeEditorThemeRules([\n { token: '', cssVariable: '--color-text-secondary' },\n { token: 'attribute.name', cssVariable: '--color-tint-foreground-violet' },\n { token: 'comment', cssVariable: '--color-text-disabled' },\n { token: 'delimiter', cssVariable: '--color-text-secondary' },\n { token: 'keyword', cssVariable: '--color-tint-foreground-violet' },\n { token: 'number', cssVariable: '--color-tint-foreground-pink' },\n { token: 'string', cssVariable: '--color-tint-foreground-teal' },\n { token: 'string.key', cssVariable: '--color-tint-foreground-violet' },\n { token: 'type', cssVariable: '--color-tint-foreground-violet' },\n { token: 'variable', cssVariable: '--color-text-secondary' },\n]);\n\nconst codeEditorEncodedTokenColors = codeEditorSemanticColors.map((_, index) =>\n createCodeEditorTokenMarker(index),\n);\n\n/**\n * Monaco theme에는 토큰 규칙만 넣고, UI 색은 CSS 변수로 관리합니다.\n */\nconst buildCodeEditorTheme = (): MonacoEditor.IStandaloneThemeData => ({\n base: 'vs',\n inherit: false,\n encodedTokensColors: codeEditorEncodedTokenColors,\n rules: [\n ...baseCodeEditorThemeRules,\n ...[...codeEditorThemeRuleContributors].flatMap((contributor) => contributor()),\n ],\n colors: {},\n});\n\nconst hasCodeEditorLanguage = (monaco: Monaco, languageId: string) =>\n monaco.languages.getLanguages().some((language: { id: string }) => language.id === languageId);\n\nconst setupLocalMonacoLoader = () => {\n localMonacoLoaderPromise ??= import('monaco-editor').then((monaco) => {\n ensureCodeEditorSemanticColorStyles();\n loader.config({ monaco });\n configuredMonaco = monaco;\n monaco.editor.defineTheme(codeEditorThemeName, buildCodeEditorTheme());\n });\n\n return localMonacoLoaderPromise;\n};\n\nexport {\n buildCodeEditorTheme,\n codeEditorThemeName,\n createCodeEditorTokenMarker,\n createCodeEditorThemeRules,\n defaultCodeEditorOptions,\n getCodeEditorSemanticColorStyleSheet,\n hasCodeEditorLanguage,\n registerCodeEditorThemeRules,\n setupLocalMonacoLoader,\n};\nexport type {\n CodeEditorSemanticColorVariable,\n CodeEditorSemanticColorThemeRule,\n CodeEditorThemeRuleContributor,\n};\n","import { useEffect, useState } from 'react';\nimport { setupLocalMonacoLoader } from '../monacoCodeEditor';\n\n// Monaco 로더 준비 상태와 로드 실패를 React 렌더 흐름으로 전달합니다.\nconst useMonacoLoader = () => {\n const [monacoLoaderError, setMonacoLoaderError] = useState<unknown>(null);\n const [monacoLoaderReady, setMonacoLoaderReady] = useState(false);\n\n useEffect(() => {\n let canceled = false;\n\n setupLocalMonacoLoader()\n .then(() => {\n if (!canceled) {\n setMonacoLoaderReady(true);\n }\n })\n .catch((error: unknown) => {\n if (!canceled) {\n setMonacoLoaderError(error);\n }\n });\n\n return () => {\n canceled = true;\n };\n }, []);\n\n return { monacoLoaderError, monacoLoaderReady };\n};\n\nexport { useMonacoLoader };\n","import { cn } from '@exem-ui/core/utils';\nimport { type BeforeMount, Editor, type OnMount } from '@monaco-editor/react';\nimport type { editor as MonacoEditor } from 'monaco-editor';\nimport * as React from 'react';\nimport { useCodeEditorSource } from '../CodeEditorSourceProvider';\nimport { useCodeEditorFormat } from '../format/CodeEditorFormatProvider';\nimport { getDisplayValue } from '../format/getDisplayValue';\nimport type { CodeEditorFormatter, CodeEditorViewMode } from '../format/types';\nimport { codeEditorThemeName, defaultCodeEditorOptions } from '../monacoCodeEditor';\nimport { useMonacoLoader } from './useMonacoLoader';\n\n// 공통 Monaco Surface로 원본 값, 보기 모드, 읽기 전용 규칙을 실제 에디터에 반영합니다.\ntype CodeEditorOptions = Omit<MonacoEditor.IStandaloneEditorConstructionOptions, 'theme'>;\n\ntype CodeEditorSurfaceProps = {\n className?: string;\n editorClassName?: string;\n height?: number | string;\n language?: string;\n value?: string;\n formatter?: CodeEditorFormatter | null;\n onChange?: (value?: string) => void;\n options?: CodeEditorOptions;\n readOnly?: boolean;\n beforeMount?: BeforeMount;\n onMount?: OnMount;\n};\n\ntype GetCodeEditorSurfaceReadOnlyOptions = {\n contextReadOnly: boolean;\n readOnly?: boolean;\n viewMode: CodeEditorViewMode;\n};\n\nconst getCodeEditorSurfaceReadOnly = ({\n contextReadOnly,\n readOnly,\n viewMode,\n}: GetCodeEditorSurfaceReadOnlyOptions) => {\n if (viewMode === 'formatted') {\n return true;\n }\n\n return readOnly ?? contextReadOnly;\n};\n\nconst CodeEditorSurface = React.forwardRef<HTMLDivElement, CodeEditorSurfaceProps>(\n (\n {\n className,\n editorClassName,\n height,\n language = 'plaintext',\n value,\n formatter,\n onChange,\n options,\n readOnly,\n beforeMount,\n onMount,\n },\n ref,\n ) => {\n const { formatter: contextFormatter, viewMode } = useCodeEditorFormat();\n const {\n onSourceValueChange,\n readOnly: contextReadOnly,\n sourceValue: contextValue,\n } = useCodeEditorSource();\n const { monacoLoaderError, monacoLoaderReady } = useMonacoLoader();\n const surfaceFormatter = formatter === undefined ? contextFormatter : formatter;\n const displayValue = getDisplayValue(value ?? contextValue, viewMode, surfaceFormatter);\n const surfaceReadOnly = getCodeEditorSurfaceReadOnly({\n contextReadOnly,\n readOnly,\n viewMode,\n });\n const handleChange = React.useCallback(\n (nextValue?: string) => {\n if (onChange) {\n onChange(nextValue);\n return;\n }\n\n if (surfaceReadOnly) {\n return;\n }\n\n onSourceValueChange?.(nextValue ?? '');\n },\n [onChange, onSourceValueChange, surfaceReadOnly],\n );\n\n if (monacoLoaderError) {\n throw monacoLoaderError;\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'h-[400px] min-h-[160px] overflow-hidden rounded-medium border border-border-primary bg-background-primary',\n className,\n )}\n style={height === undefined ? undefined : { height }}\n >\n {monacoLoaderReady ? (\n <Editor\n beforeMount={beforeMount}\n className={cn('exem-code-editor-monaco size-full', editorClassName)}\n height=\"100%\"\n language={language}\n onChange={handleChange}\n onMount={onMount}\n options={{\n ...defaultCodeEditorOptions,\n ...options,\n domReadOnly: surfaceReadOnly,\n readOnly: surfaceReadOnly,\n }}\n theme={codeEditorThemeName}\n value={displayValue}\n />\n ) : null}\n </div>\n );\n },\n);\n\nCodeEditorSurface.displayName = 'CodeEditor.Surface';\n\nexport { CodeEditorSurface };\nexport { getCodeEditorSurfaceReadOnly };\nexport type { CodeEditorOptions, CodeEditorSurfaceProps, GetCodeEditorSurfaceReadOnlyOptions };\n","import { cn } from '@exem-ui/core/utils';\nimport * as React from 'react';\nimport { CodeEditorSourceProvider } from './CodeEditorSourceProvider';\nimport { CopyTrigger } from './copy/CopyTrigger';\nimport { CodeEditorFormatProvider } from './format/CodeEditorFormatProvider';\nimport { FormatToggle } from './format/FormatToggle';\nimport { FormatTrigger } from './format/FormatTrigger';\nimport type { CodeEditorFormatter, CodeEditorViewMode } from './format/types';\nimport { CodeEditorSurface } from './surface/CodeEditorSurface';\n\n// CodeEditor의 공통 상태와 합성 API를 묶는 루트 컴포넌트입니다.\ntype CodeEditorProps = {\n value?: string;\n onValueChange?: (value: string) => void;\n readOnly?: boolean;\n defaultViewMode?: CodeEditorViewMode;\n viewMode?: CodeEditorViewMode;\n onViewModeChange?: (mode: CodeEditorViewMode) => void;\n formatter?: CodeEditorFormatter;\n className?: string;\n children: React.ReactNode;\n};\n\ntype CodeEditorComponent = React.ForwardRefExoticComponent<\n CodeEditorProps & React.RefAttributes<HTMLDivElement>\n> & {\n Surface: typeof CodeEditorSurface;\n FormatToggle: typeof FormatToggle;\n FormatTrigger: typeof FormatTrigger;\n CopyTrigger: typeof CopyTrigger;\n};\n\nconst CodeEditor = React.forwardRef<HTMLDivElement, CodeEditorProps>(\n (\n {\n value,\n onValueChange,\n readOnly = true,\n defaultViewMode,\n viewMode: viewModeProp,\n onViewModeChange,\n formatter,\n className,\n children,\n },\n ref,\n ) => {\n return (\n <CodeEditorSourceProvider\n onSourceValueChange={onValueChange}\n readOnly={readOnly}\n sourceValue={value}\n >\n <CodeEditorFormatProvider\n defaultViewMode={defaultViewMode}\n formatter={formatter}\n onViewModeChange={onViewModeChange}\n viewMode={viewModeProp}\n >\n <div ref={ref} className={cn('flex min-w-0 flex-col gap-2', className)}>\n {children}\n </div>\n </CodeEditorFormatProvider>\n </CodeEditorSourceProvider>\n );\n },\n) as CodeEditorComponent;\n\nCodeEditor.Surface = CodeEditorSurface;\nCodeEditor.FormatToggle = FormatToggle;\nCodeEditor.FormatTrigger = FormatTrigger;\nCodeEditor.CopyTrigger = CopyTrigger;\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport { CodeEditor };\nexport type { CodeEditorComponent, CodeEditorProps };\nexport type { CodeEditorCopyTriggerProps, CopyTriggerRenderProps } from './copy/types';\nexport type {\n CodeEditorFormatToggleProps,\n CodeEditorFormatTriggerProps,\n CodeEditorFormatter,\n CodeEditorViewMode,\n FormatToggleRenderProps,\n FormatTriggerRenderProps,\n} from './format/types';\nexport type { CodeEditorOptions, CodeEditorSurfaceProps } from './surface/CodeEditorSurface';\n","import * as React from 'react';\nimport { useCodeEditorFormat } from './CodeEditorFormatProvider';\nimport type { CodeEditorFormatter } from './types';\n\n// Surface가 제공하는 formatter를 루트 포맷 컨트롤에 등록합니다.\nconst useActiveFormatter = (formatter?: CodeEditorFormatter | null) => {\n const { setActiveFormatter } = useCodeEditorFormat();\n\n React.useEffect(() => {\n setActiveFormatter(formatter);\n\n return () => {\n setActiveFormatter(undefined);\n };\n }, [formatter, setActiveFormatter]);\n};\n\nexport { useActiveFormatter };\n","import type { CodeEditorFormatter } from '../CodeEditor';\n\n// JSON 값은 파싱 가능한 경우에만 보기 좋게 정렬합니다.\nconst formatJsonValue: CodeEditorFormatter = (value) => {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n // 깨진 JSON은 포맷하지 않고 원본을 그대로 보여준다.\n return value;\n }\n};\n\nexport { formatJsonValue };\n","import type { Monaco } from '@monaco-editor/react';\nimport type { CodeEditorThemeRuleContributor } from '../monacoCodeEditor';\nimport { createCodeEditorThemeRules, hasCodeEditorLanguage } from '../monacoCodeEditor';\n\n// Monaco에 JSON 전용 언어와 디자인 토큰 색상 규칙을 등록합니다.\nconst jsonEditorLanguageId = 'exem-json';\n// Monaco 언어 등록은 페이지 전역이므로 에디터가 여러 개여도 한 번만 수행한다.\nlet isJsonEditorLanguageConfigured = false;\n\nconst defineJsonEditorLanguage = (monaco: Monaco) => {\n if (isJsonEditorLanguageConfigured) {\n return;\n }\n\n if (!hasCodeEditorLanguage(monaco, jsonEditorLanguageId)) {\n monaco.languages.register({ id: jsonEditorLanguageId });\n }\n\n monaco.languages.setMonarchTokensProvider(jsonEditorLanguageId, {\n tokenizer: {\n root: [\n [/\\s+/, ''],\n [/[{}]/, 'delimiter.bracket.json'],\n [/\\[/, 'delimiter.array.json'],\n [/\\]/, 'delimiter.array.json'],\n [/:/, 'delimiter.colon.json'],\n [/,/, 'delimiter.comma.json'],\n [/\\b(?:true|false)\\b/, 'boolean.json'],\n [/\\bnull\\b/, 'keyword.json'],\n [/-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/, 'number.json'],\n // 뒤에 콜론이 오면 key, 아니면 value 문자열로 구분한다.\n [/\"(?:\\\\.|[^\"\\\\])*\"(?=\\s*:)/, 'string.key.json'],\n [/\"(?:\\\\.|[^\"\\\\])*\"/, 'string.value.json'],\n ],\n },\n });\n\n isJsonEditorLanguageConfigured = true;\n};\n\n// JSON 문법 토큰을 Figma 시멘틱 색에 연결합니다.\nconst getJsonEditorThemeRules: CodeEditorThemeRuleContributor = () =>\n createCodeEditorThemeRules([\n { token: 'boolean.json', cssVariable: '--color-text-secondary' },\n { token: 'delimiter.array.json', cssVariable: '--color-text-secondary' },\n { token: 'delimiter.bracket.json', cssVariable: '--color-text-secondary' },\n { token: 'delimiter.colon.json', cssVariable: '--color-text-secondary' },\n { token: 'delimiter.comma.json', cssVariable: '--color-text-secondary' },\n { token: 'keyword.json', cssVariable: '--color-text-tertiary' },\n { token: 'number.json', cssVariable: '--color-tint-foreground-violet' },\n { token: 'string.key.json', cssVariable: '--color-tint-foreground-teal' },\n { token: 'string.value.json', cssVariable: '--color-tint-foreground-orange' },\n ]);\n\nexport { defineJsonEditorLanguage, getJsonEditorThemeRules, jsonEditorLanguageId };\n","import { cn } from '@exem-ui/core/utils';\nimport type { BeforeMount } from '@monaco-editor/react';\nimport * as React from 'react';\nimport { CodeEditor, type CodeEditorFormatter, type CodeEditorSurfaceProps } from '../CodeEditor';\nimport { useActiveFormatter } from '../format/useActiveFormatter';\nimport { registerCodeEditorThemeRules } from '../monacoCodeEditor';\nimport { formatJsonValue } from './formatJsonValue';\nimport {\n defineJsonEditorLanguage,\n getJsonEditorThemeRules,\n jsonEditorLanguageId,\n} from './monacoJsonEditor';\n\n// JSON 전용 Monaco 언어와 formatter를 Surface에 연결합니다.\nregisterCodeEditorThemeRules(getJsonEditorThemeRules);\n\ntype CodeEditorJSONProps = Omit<CodeEditorSurfaceProps, 'language'>;\n\nconst CodeEditorJSON = React.forwardRef<HTMLDivElement, CodeEditorJSONProps>(\n ({ beforeMount, editorClassName, formatter, ...props }, ref) => {\n const jsonFormatter: CodeEditorFormatter | null =\n formatter === undefined ? formatJsonValue : formatter;\n\n useActiveFormatter(jsonFormatter);\n\n const handleBeforeMount = React.useCallback<BeforeMount>(\n (monaco) => {\n defineJsonEditorLanguage(monaco);\n beforeMount?.(monaco);\n },\n [beforeMount],\n );\n\n return (\n <CodeEditor.Surface\n ref={ref}\n {...props}\n beforeMount={handleBeforeMount}\n editorClassName={cn('exem-json-editor-monaco', editorClassName)}\n formatter={jsonFormatter}\n language={jsonEditorLanguageId}\n />\n );\n },\n);\n\nCodeEditorJSON.displayName = 'CodeEditor.JSON';\n\nexport { CodeEditorJSON };\nexport type { CodeEditorJSONProps };\n","import { format, type SqlLanguage } from 'sql-formatter';\n\n// sql-formatter 방언 차이를 흡수해 SQL Surface용 formatter를 만듭니다.\ntype SqlEditorDbType = SqlLanguage | 'oracle';\n\n// sql-formatter에 oracle 방언이 없어서 plsql로 대신한다.\nconst resolveSqlFormatterLanguage = (dbType: SqlEditorDbType): SqlLanguage => {\n return dbType === 'oracle' ? 'plsql' : dbType;\n};\n\n/**\n * 같은 값이 화면 표시·복사 등 여러 곳에서 포맷되므로 마지막 결과를 캐시합니다.\n */\nconst createSqlFormatter = (dbType: SqlEditorDbType = 'sql') => {\n let lastValue: string | null = null;\n let lastResult = '';\n\n return (value: string) => {\n if (value === lastValue) {\n return lastResult;\n }\n\n lastValue = value;\n\n try {\n lastResult = format(value, {\n language: resolveSqlFormatterLanguage(dbType),\n // :region 같은 바인드 변수를 파라미터로 인식시켜 포맷 중 깨지지 않게 한다.\n paramTypes: { named: [':'] },\n });\n } catch {\n // 문법이 깨진 SQL은 포맷하지 않고 원본을 그대로 보여준다.\n lastResult = value;\n }\n\n return lastResult;\n };\n};\n\nexport { createSqlFormatter };\nexport type { SqlEditorDbType };\n","import type { Monaco } from '@monaco-editor/react';\nimport type { CodeEditorThemeRuleContributor } from '../monacoCodeEditor';\nimport { createCodeEditorThemeRules, hasCodeEditorLanguage } from '../monacoCodeEditor';\n\n// Monaco에 SQL 전용 언어와 디자인 토큰 색상 규칙을 등록합니다.\nconst sqlEditorLanguageId = 'exem-sql';\n// Monaco 언어 등록은 페이지 전역이므로 에디터가 여러 개여도 한 번만 수행한다.\nlet isSqlEditorLanguageConfigured = false;\n\nconst sqlEditorKeywords = [\n 'ADD',\n 'ALL',\n 'ALTER',\n 'AND',\n 'AS',\n 'ASC',\n 'BETWEEN',\n 'BY',\n 'CASE',\n 'COUNT',\n 'CREATE',\n 'DELETE',\n 'DESC',\n 'DISTINCT',\n 'DROP',\n 'ELSE',\n 'END',\n 'EXISTS',\n 'FROM',\n 'GROUP',\n 'HAVING',\n 'IN',\n 'INSERT',\n 'IS',\n 'JOIN',\n 'LEFT',\n 'LIKE',\n 'LIMIT',\n 'NOT',\n 'ON',\n 'OR',\n 'ORDER',\n 'RIGHT',\n 'SELECT',\n 'SET',\n 'SUM',\n 'THEN',\n 'UNION',\n 'UPDATE',\n 'VALUES',\n 'WHEN',\n 'WHERE',\n];\n\nconst sqlEditorBooleans = ['FALSE', 'TRUE'];\nconst sqlEditorConstants = ['NULL'];\n\nconst defineSqlEditorLanguage = (monaco: Monaco) => {\n if (isSqlEditorLanguageConfigured) {\n return;\n }\n\n if (!hasCodeEditorLanguage(monaco, sqlEditorLanguageId)) {\n monaco.languages.register({ id: sqlEditorLanguageId });\n }\n\n monaco.languages.setMonarchTokensProvider(sqlEditorLanguageId, {\n ignoreCase: true,\n keywords: sqlEditorKeywords,\n booleans: sqlEditorBooleans,\n constants: sqlEditorConstants,\n tokenizer: {\n root: [\n [/--.*$/, 'comment.sql'],\n [/\\/\\*/, { token: 'comment.quote.sql', next: '@comment' }],\n [/'(?:[^']|'')*'/, 'string.sql'],\n [/\"(?:\"\"|[^\"])*\"/, 'identifier.quote.sql'],\n [/\\b\\d+(?:\\.\\d+)?\\b/, 'number.sql'],\n [/:[A-Za-z_][\\w$#]*/, 'variable.bind.sql'],\n [/[(),;]/, 'delimiter.sql'],\n [/[<>!=]=?|[-+*/%]/, 'operator.sql'],\n [\n /[A-Za-z_][\\w$#]*/,\n {\n cases: {\n '@booleans': 'boolean.sql',\n // 디자인 스펙상 NULL은 숫자와 같은 색이라 number 토큰으로 분류한다.\n '@constants': 'number.sql',\n '@keywords': 'keyword.sql',\n '@default': 'identifier.sql',\n },\n },\n ],\n ],\n comment: [\n [/[^*/]+/, 'comment.quote.sql'],\n [/\\*\\//, { token: 'comment.quote.sql', next: '@pop' }],\n [/[*/]/, 'comment.quote.sql'],\n ],\n },\n });\n\n isSqlEditorLanguageConfigured = true;\n};\n\n// SQL 문법 토큰을 Figma 시멘틱 색에 연결합니다.\nconst getSqlEditorThemeRules: CodeEditorThemeRuleContributor = () =>\n createCodeEditorThemeRules([\n { token: 'identifier.sql', cssVariable: '--color-text-secondary' },\n { token: 'identifier.quote.sql', cssVariable: '--color-text-secondary' },\n { token: 'variable.bind.sql', cssVariable: '--color-tint-foreground-orange' },\n { token: 'boolean.sql', cssVariable: '--color-text-tertiary' },\n { token: 'keyword.sql', cssVariable: '--color-tint-foreground-violet' },\n { token: 'operator.sql', cssVariable: '--color-text-secondary' },\n { token: 'number.sql', cssVariable: '--color-tint-foreground-pink' },\n { token: 'string.sql', cssVariable: '--color-tint-foreground-teal' },\n { token: 'comment.sql', cssVariable: '--color-text-disabled', fontStyle: 'italic' },\n { token: 'comment.quote.sql', cssVariable: '--color-text-disabled', fontStyle: 'italic' },\n { token: 'delimiter.sql', cssVariable: '--color-text-secondary' },\n ]);\n\nexport { defineSqlEditorLanguage, getSqlEditorThemeRules, sqlEditorLanguageId };\n","// SQL 문자열에서 강조 대상 토큰을 찾아 Monaco range로 변환합니다.\ntype SqlEditorTokenRange = {\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n};\n\ntype SqlEditorToken = {\n id?: string;\n match: string;\n className?: string;\n};\n\ntype ParsedSqlEditorToken = {\n token: SqlEditorToken;\n text: string;\n range: SqlEditorTokenRange;\n startOffset: number;\n endOffset: number;\n className?: string;\n};\n\ntype ProtectedSpan = {\n start: number;\n end: number;\n};\n\n// SQL 식별자에 올 수 있는 문자. $와 #은 Oracle 식별자에서 허용된다.\nconst identifierBoundaryPattern = /[A-Za-z0-9_$#]/;\n\nconst escapeRegExp = (value: string) => {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n};\n\nconst isProtectedOffset = (spans: ProtectedSpan[], start: number, end: number) => {\n return spans.some((span) => start < span.end && end > span.start);\n};\n\nconst getLineCommentEnd = (value: string, start: number) => {\n const end = value.indexOf('\\n', start + 2);\n return end === -1 ? value.length : end;\n};\n\nconst getBlockCommentEnd = (value: string, start: number) => {\n const end = value.indexOf('*/', start + 2);\n return end === -1 ? value.length : end + 2;\n};\n\nconst getQuotedSpanEnd = (value: string, start: number) => {\n const quote = value[start];\n let index = start + 1;\n\n while (index < value.length) {\n // 따옴표 두 번('')은 SQL 이스케이프이므로 닫는 따옴표로 보지 않는다.\n if (value[index] === quote && value[index + 1] === quote) {\n index += 2;\n continue;\n }\n\n if (value[index] === quote) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return index;\n};\n\n/** 주석·문자열 내부에서는 토큰을 강조하지 않도록 해당 구간을 수집합니다. */\nconst getProtectedSpans = (value: string): ProtectedSpan[] => {\n const spans: ProtectedSpan[] = [];\n let index = 0;\n\n while (index < value.length) {\n const char = value[index];\n const next = value[index + 1];\n\n if (char === '-' && next === '-') {\n const start = index;\n index = getLineCommentEnd(value, start);\n spans.push({ start, end: index });\n continue;\n }\n\n if (char === '/' && next === '*') {\n const start = index;\n index = getBlockCommentEnd(value, start);\n spans.push({ start, end: index });\n continue;\n }\n\n if (char === \"'\" || char === '\"') {\n const start = index;\n index = getQuotedSpanEnd(value, start);\n spans.push({ start, end: index });\n continue;\n }\n\n index += 1;\n }\n\n return spans;\n};\n\nconst getLineStarts = (value: string) => {\n const lineStarts = [0];\n\n for (let index = 0; index < value.length; index += 1) {\n if (value[index] === '\\n') {\n lineStarts.push(index + 1);\n }\n }\n\n return lineStarts;\n};\n\nconst offsetToPosition = (lineStarts: number[], offset: number) => {\n let low = 0;\n let high = lineStarts.length - 1;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n\n if ((lineStarts[mid] ?? 0) <= offset) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n const lineIndex = Math.max(0, high);\n const lineStart = lineStarts[lineIndex] ?? 0;\n\n return {\n lineNumber: lineIndex + 1,\n column: offset - lineStart + 1,\n };\n};\n\nconst getRangeFromOffsets = (\n lineStarts: number[],\n startOffset: number,\n endOffset: number,\n): SqlEditorTokenRange => {\n const start = offsetToPosition(lineStarts, startOffset);\n const end = offsetToPosition(lineStarts, endOffset);\n\n return {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n };\n};\n\n/** 앞뒤가 식별자 문자가 아니어야 매치로 인정합니다. region이 my_region에 걸리지 않게. */\nconst hasIdentifierBoundary = (value: string, startOffset: number, endOffset: number) => {\n const before = value[startOffset - 1];\n const after = value[endOffset];\n\n return (\n !identifierBoundaryPattern.test(before ?? '') && !identifierBoundaryPattern.test(after ?? '')\n );\n};\n\nconst getSearchableTokens = (tokens: SqlEditorToken[]) => {\n const searchableTokens = new Map<string, SqlEditorToken>();\n\n for (const token of tokens) {\n if (!token.match) {\n continue;\n }\n\n const key = token.match.toLowerCase();\n\n if (!searchableTokens.has(key)) {\n searchableTokens.set(key, token);\n }\n }\n\n // 정규식 alternation은 앞 패턴이 이기므로 긴 match가 먼저 시도되게 정렬한다.\n return [...searchableTokens.values()].sort((a, b) => b.match.length - a.match.length);\n};\n\nconst getSqlEditorTokens = (value: string, tokens: SqlEditorToken[]) => {\n const searchableTokens = getSearchableTokens(tokens);\n\n if (!searchableTokens.length) {\n return [];\n }\n\n const tokenByMatch = new Map(searchableTokens.map((token) => [token.match.toLowerCase(), token]));\n const pattern = new RegExp(\n searchableTokens.map((token) => escapeRegExp(token.match)).join('|'),\n 'gi',\n );\n const protectedSpans = getProtectedSpans(value);\n const lineStarts = getLineStarts(value);\n const parsedTokens: ParsedSqlEditorToken[] = [];\n let match = pattern.exec(value);\n\n while (match !== null) {\n const text = match[0];\n const startOffset = match.index;\n const endOffset = startOffset + text.length;\n const token = tokenByMatch.get(text.toLowerCase());\n\n if (\n token &&\n hasIdentifierBoundary(value, startOffset, endOffset) &&\n !isProtectedOffset(protectedSpans, startOffset, endOffset)\n ) {\n parsedTokens.push({\n token,\n text,\n range: getRangeFromOffsets(lineStarts, startOffset, endOffset),\n startOffset,\n endOffset,\n className: token.className,\n });\n }\n\n match = pattern.exec(value);\n }\n\n return parsedTokens;\n};\n\nexport { getSqlEditorTokens };\nexport type { ParsedSqlEditorToken, SqlEditorToken, SqlEditorTokenRange };\n","import type { Monaco, OnMount } from '@monaco-editor/react';\nimport type { IDisposable, IPosition, editor as MonacoEditor } from 'monaco-editor';\nimport { useCallback, useEffect, useRef } from 'react';\nimport type { ParsedSqlEditorToken, SqlEditorToken } from './tokens';\nimport { getSqlEditorTokens } from './tokens';\n\n// SQL 토큰 range를 Monaco decoration과 클릭 이벤트로 연결합니다.\ntype UseSqlEditorTokenDecorationsOptions = {\n displayValue: string;\n tokens: SqlEditorToken[];\n onTokenClick?: (token: SqlEditorToken) => void;\n onMount?: OnMount;\n};\n\nconst isPositionInToken = (position: IPosition, token: Pick<ParsedSqlEditorToken, 'range'>) => {\n const { range } = token;\n\n if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {\n return false;\n }\n\n if (position.lineNumber === range.startLineNumber && position.column < range.startColumn) {\n return false;\n }\n\n if (position.lineNumber === range.endLineNumber && position.column >= range.endColumn) {\n return false;\n }\n\n return true;\n};\n\n/** tokens prop으로 받은 강조 대상을 Monaco 데코레이션으로 적용하고 클릭 이벤트를 연결합니다. */\nconst useSqlEditorTokenDecorations = ({\n displayValue,\n tokens,\n onTokenClick,\n onMount,\n}: UseSqlEditorTokenDecorationsOptions) => {\n const editorRef = useRef<MonacoEditor.IStandaloneCodeEditor | null>(null);\n const monacoRef = useRef<Monaco | null>(null);\n const decorationsRef = useRef<MonacoEditor.IEditorDecorationsCollection | null>(null);\n const clickHandlerRef = useRef<IDisposable | null>(null);\n\n const applyTokenDecorations = useCallback(() => {\n const editor = editorRef.current;\n const monaco = monacoRef.current;\n\n if (!editor || !monaco) {\n return;\n }\n\n const parsedTokens = getSqlEditorTokens(displayValue, tokens);\n\n decorationsRef.current ??= editor.createDecorationsCollection();\n decorationsRef.current.set(\n parsedTokens.map((token) => ({\n range: new monaco.Range(\n token.range.startLineNumber,\n token.range.startColumn,\n token.range.endLineNumber,\n token.range.endColumn,\n ),\n options: {\n inlineClassName: token.className,\n stickiness: monaco.editor.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges,\n },\n })),\n );\n\n if (clickHandlerRef.current) {\n clickHandlerRef.current.dispose();\n clickHandlerRef.current = null;\n }\n\n if (!onTokenClick) {\n return;\n }\n\n clickHandlerRef.current = editor.onMouseDown((mouseEvent) => {\n const position = mouseEvent.target.position;\n\n if (!position) {\n return;\n }\n\n const parsedToken = parsedTokens.find((token) => isPositionInToken(position, token));\n\n if (!parsedToken) {\n return;\n }\n\n onTokenClick(parsedToken.token);\n });\n }, [displayValue, onTokenClick, tokens]);\n\n const handleMount: OnMount = useCallback(\n (editor, monaco) => {\n editorRef.current = editor;\n monacoRef.current = monaco;\n applyTokenDecorations();\n onMount?.(editor, monaco);\n },\n [applyTokenDecorations, onMount],\n );\n\n useEffect(() => {\n applyTokenDecorations();\n }, [applyTokenDecorations]);\n\n useEffect(() => {\n return () => {\n if (clickHandlerRef.current) {\n clickHandlerRef.current.dispose();\n clickHandlerRef.current = null;\n }\n };\n }, []);\n\n return { handleMount };\n};\n\nexport { useSqlEditorTokenDecorations };\n","import { cn } from '@exem-ui/core/utils';\nimport type { BeforeMount } from '@monaco-editor/react';\nimport * as React from 'react';\nimport { CodeEditor, type CodeEditorFormatter, type CodeEditorSurfaceProps } from '../CodeEditor';\nimport { useCodeEditorSource } from '../CodeEditorSourceProvider';\nimport { useCodeEditorFormat } from '../format/CodeEditorFormatProvider';\nimport { getDisplayValue } from '../format/getDisplayValue';\nimport { useActiveFormatter } from '../format/useActiveFormatter';\nimport { registerCodeEditorThemeRules } from '../monacoCodeEditor';\nimport { createSqlFormatter, type SqlEditorDbType } from './formatSqlValue';\nimport {\n defineSqlEditorLanguage,\n getSqlEditorThemeRules,\n sqlEditorLanguageId,\n} from './monacoSqlEditor';\nimport type { SqlEditorToken } from './tokens';\nimport { useSqlEditorTokenDecorations } from './useSqlEditorTokenDecorations';\n\n// SQL 전용 Monaco 언어, formatter, 토큰 클릭 기능을 Surface에 연결합니다.\nregisterCodeEditorThemeRules(getSqlEditorThemeRules);\n\ntype CodeEditorSQLProps = Omit<CodeEditorSurfaceProps, 'language'> & {\n dbType?: SqlEditorDbType;\n onTokenClick?: (token: SqlEditorToken) => void;\n tokens?: SqlEditorToken[];\n};\n\nconst CodeEditorSQL = React.forwardRef<HTMLDivElement, CodeEditorSQLProps>(\n (\n {\n beforeMount,\n dbType,\n editorClassName,\n formatter,\n onMount,\n onTokenClick,\n tokens = [],\n ...props\n },\n ref,\n ) => {\n const { viewMode } = useCodeEditorFormat();\n const { sourceValue: contextValue } = useCodeEditorSource();\n const sqlFormatter = React.useMemo<CodeEditorFormatter>(\n () => createSqlFormatter(dbType),\n [dbType],\n );\n const surfaceFormatter = formatter === undefined ? sqlFormatter : formatter;\n const surfaceValue = props.value ?? contextValue ?? '';\n // 토큰 강조 범위는 화면에 보이는 값 기준으로 계산한다.\n const surfaceDisplayValue = getDisplayValue(surfaceValue, viewMode, surfaceFormatter);\n\n useActiveFormatter(surfaceFormatter);\n\n const { handleMount } = useSqlEditorTokenDecorations({\n displayValue: surfaceDisplayValue,\n tokens,\n onTokenClick,\n onMount,\n });\n\n const handleBeforeMount = React.useCallback<BeforeMount>(\n (monaco) => {\n defineSqlEditorLanguage(monaco);\n beforeMount?.(monaco);\n },\n [beforeMount],\n );\n\n return (\n <CodeEditor.Surface\n ref={ref}\n {...props}\n beforeMount={handleBeforeMount}\n editorClassName={cn('exem-sql-editor-monaco', editorClassName)}\n formatter={surfaceFormatter}\n language={sqlEditorLanguageId}\n onMount={handleMount}\n />\n );\n },\n);\n\nCodeEditorSQL.displayName = 'CodeEditor.SQL';\n\nexport { CodeEditorSQL };\nexport type { CodeEditorSQLProps };\n","import type { CodeEditorComponent as BaseCodeEditorComponent } from './CodeEditor';\nimport { CodeEditor as BaseCodeEditor } from './CodeEditor';\nimport { CodeEditorJSON } from './jsonEditor/JsonEditor';\nimport { CodeEditorSQL } from './sqlEditor/SqlEditor';\n\n// 기본 CodeEditor에 SQL/JSON 전용 Surface를 붙여 공개 API를 만듭니다.\ntype CodeEditorComponent = BaseCodeEditorComponent & {\n JSON: typeof CodeEditorJSON;\n SQL: typeof CodeEditorSQL;\n};\n\nconst CodeEditor = BaseCodeEditor as CodeEditorComponent;\n\nCodeEditor.JSON = CodeEditorJSON;\nCodeEditor.SQL = CodeEditorSQL;\n\nexport { CodeEditor };\nexport type {\n CodeEditorCopyTriggerProps,\n CodeEditorFormatToggleProps,\n CodeEditorFormatTriggerProps,\n CodeEditorFormatter,\n CodeEditorOptions,\n CodeEditorProps,\n CodeEditorSurfaceProps,\n CodeEditorViewMode,\n CopyTriggerRenderProps as CodeEditorCopyTriggerRenderProps,\n FormatToggleRenderProps as CodeEditorFormatToggleRenderProps,\n FormatTriggerRenderProps as CodeEditorFormatTriggerRenderProps,\n} from './CodeEditor';\nexport type { CodeEditorComponent };\nexport type { CodeEditorJSONProps } from './jsonEditor/JsonEditor';\nexport type { SqlEditorDbType } from './sqlEditor/formatSqlValue';\nexport type { CodeEditorSQLProps } from './sqlEditor/SqlEditor';\nexport type { ParsedSqlEditorToken, SqlEditorToken, SqlEditorTokenRange } from './sqlEditor/tokens';\nexport { getSqlEditorTokens } from './sqlEditor/tokens';\n"]}
|