@orderly.network/ui-order-entry 2.8.0-alpha.0 → 2.8.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -13
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/orderEntry.ui.tsx","../src/components/additional/additionalConfigButton.tsx","../src/components/additional/additionalInfo.tsx","../src/components/additional/pinButton.tsx","../src/components/advancedTPSLResult/index.tsx","../src/components/assetInfo/index.tsx","../src/components/fee/fees.widget.tsx","../src/components/fee/effectiveFee/effectiveFee.ui.tsx","../src/components/fee/effectiveFee/icons/effectiveFee.tsx","../src/components/fee/effectiveFee/effectiveFee.widget.tsx","../src/components/fee/regularFee/regularFees.ui.tsx","../src/components/fee/regularFee/regularFees.widget.tsx","../src/components/slippage/components/slippageCell.tsx","../src/components/slippage/components/slippageEditor.tsx","../src/components/slippage/slippage.ui.tsx","../src/components/available/index.tsx","../src/components/LTVRiskTooltip/LTVRiskTooltip.ui.tsx","../src/components/LTVRiskTooltip/LTVRiskTooltip.script.ts","../src/components/LTVRiskTooltip/LTVRiskTooltip.widget.tsx","../src/components/dialog/confirm.ui.tsx","../src/utils.ts","../src/components/dialog/maxQtyConfirm.tsx","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.ui.tsx","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.script.ts","../src/hooks/useAskAndBid.ts","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.widget.tsx","../src/components/header/index.tsx","../src/components/orderTypeSelect/index.tsx","../src/components/header/LeverageBadge.tsx","../src/components/orderEntryProvider.tsx","../src/components/orderEntryContext.tsx","../src/components/orderInput/index.tsx","../src/components/orderInput/limit/priceInput.tsx","../src/components/customInput/index.tsx","../src/components/orderInput/limit/bboOrderTypeSelect.tsx","../src/components/orderInput/limit/limitPriceSuffix.tsx","../src/components/orderInput/qtyAndTotal/qtyAndTotalInput.tsx","../src/components/orderInput/qtyAndTotal/quantityInput.tsx","../src/components/orderInput/qtyAndTotal/totalInput.tsx","../src/components/orderInput/qtyAndTotal/totalTypeSelect.tsx","../src/components/orderInput/scaledOrder/index.tsx","../src/components/orderInput/scaledOrder/quantityDistributionInput.tsx","../src/components/orderInput/scaledOrder/scaledPriceInput.tsx","../src/components/orderInput/scaledOrder/scaledQuantityInput.tsx","../src/components/orderInput/scaledOrder/scaledQuantityUnit.tsx","../src/components/orderInput/scaledOrder/skewInput.tsx","../src/components/orderInput/scaledOrder/totalOrdersInput.tsx","../src/components/orderInput/stop/triggerPriceInput.tsx","../src/components/orderInput/trailingStop/activePriceInput.tsx","../src/components/orderInput/trailingStop/trailingCallbackInput.tsx","../src/components/orderInput/trailingStop/callbackRatePercentages.tsx","../src/components/orderInput/trailingStop/trailingCallbackSelect.tsx","../src/components/orderInput/trailingStop/index.tsx","../src/components/quantitySlider/index.tsx","../src/components/reduceOnlySwitch/index.tsx","../src/components/tpsl.tsx","../src/components/pnlInput/pnlInput.ui.tsx","../src/components/pnlInput/useBuilder.script.ts","../src/components/pnlInput/pnlInputContext.tsx","../src/components/pnlInput/pnlInput.widget.tsx","../src/components/pnlInput/pnlInputProvider.tsx","../src/orderEntry.script.ts","../src/hooks/useBBOState.ts","../src/hooks/useFocusAndBlur.ts","../src/hooks/usePriceInputContainer.ts","../src/orderEntry.widget.tsx"],"names":["useCallback","useEffect","useId","useMemo","useState","useLocalStorage","useMemoizedFn","useOrderlyContext","useTranslation","useOrderEntryFormErrorMsg","OrderSide","OrderType","PositionType","Box","cn","Divider","Flex","modal","SimpleSheet","Switch","ThrottledButton","toast","useScreen","TPSLAdvancedWidget","Decimal","PopoverContent","PopoverRoot","PopoverTrigger","Checkbox","Fragment","jsx","jsxs","AdditionalInfo","props","pinned","orderTypeExtra","t","onTypeToggle","type","checked","AdditionalConfigButton","open","setOpen","defaultPath","PinButton","path","setPath","Text","AdvancedTPSLResult","formattedOrder","symbolInfo","onEdit","onDelete","errors","getErrorMsg","renderTp","error","renderSl","DeleteIcon","EditIcon","useFeeState","useRwaSymbolsInfoStore","Tooltip","useModal","AuthGuard","useScaffoldContext","React","EffectiveFee","ref","linearId","EffectiveFeeBody","routerAdapter","onClose","e","EffectiveFeeMobileContent","hide","EffectiveFeeSection","isMobile","EffectiveFeeUI","taker","maker","EffectiveFeesWidget","RegularFeesUI","RegularFeesWidget","isEffective","val","FeesWidget","symbol","refereeRebate","others","isRwa","useRef","useBoolean","SimpleDialog","forwardRef","useImperativeHandle","ExclamationFillIcon","Input","inputFormatter","TooltipTrigger","options","SlippageEditor","value","setValue","customValue","setCustomValue","setError","onClick","onValueChange","d","toolTipButton","item","SlippageItem","isActive","SlippageCell","setClose","toggle","slippageRef","onConfirm","SlippageUI","AssetInfo","canTrade","disableFeatures","orderType","InfoCircleIcon","Button","removeTrailingZeros","calculateLTVColor","LTVRiskTooltipUI","ltv_threshold","negative_usdc_threshold","isThresholdLoading","holdingData","currentLtv","onConvert","asset","index","useComputedLTV","useHoldingStream","useIndexPricesStream","useQuery","useTokensInfo","account","zero","useConvertThreshold","data","isLoading","useLTVTooltipScript","holdingList","isHoldingLoading","tokensInfo","getIndexPrice","tokenInfo","token","indexPrice","collateralRatio","collateralContribution","LTVRiskTooltipWidget","state","Available","quote","freeCollateral","showLTV","usePositionStream","i18n","BBOOrderType","Badge","Grid","registerSimpleDialog","textVariants","getBBOType","OrderLevel","isBBOOrder","order_type","order_type_ext","isBBO","getOrderTypeByBBO","size","getOrderLevelByBBO","getScaledPlaceOrderMessage","result","rows","totalCount","successCount","row","safeNumber","OrderConfirmDialog","order","onCancel","quote_dp","base_dp","side","level","positions","positionQty","_","setNeedConfirm","renderPositionType","renderPrice","bboType","label","renderTPSLPrice","price","isOrderPrice","isEnable","colorType","renderTPSLQty","qty","renderPriceAndTotal","activated_price","callback_value","callback_rate","callbackView","OrderItem","header","OrderTypeTag","quantityItem","triggerPriceItem","tpslTriggerPrice","orderConfirmCheckbox","buttons","title","unit","dp","typeStr","Dialog","close","resolve","reject","rest","orderConfirmDialogId","memo","MaxQtyConfirm","DataTable","TokenIcon","ScaledOrderConfirm","dataSource","national","askAndBid","totalQuantity","base","columns","record","showWarning","TooltipIcon","useDebouncedCallback","useEventEmitter","useAskAndBid","ee","setAskAndBid","onOrderBookUpdate","ask0","bid0","useScaledOrderConfirmScript","orders","acc","ScaledOrderConfirmWidget","scaledOrderConfirmDialogId","Select","OrderTypeSelect","displayLabelMap","option","o","useSymbolLeverage","SymbolLeverageDialogId","SymbolLeverageSheetId","LeverageBadge","symbolLeverage","maxLeverage","curLeverage","showModal","modalId","OrderEntryHeader","setOrderValue","createContext","useContext","OrderEntryContext","useOrderEntryContext","OrderEntryProvider","errorMsgVisible","onFocus","onBlur","setOrderValues","currentFocusInput","priceInputRef","priceInputContainerRef","triggerPriceInputRef","activatedPriceInputRef","lastQuantityInputType","leverage","memoizedValue","EMPTY_LIST","CustomInput","placeholder","InputLabel","event","BBOOrderTypeSelect","LimitPriceSuffix","bbo","fillMiddleValue","PriceInput","readOnly","suffix","QuantityInput","TotalTypeSelect","TotalInput","total","margin","setMargin","totalType","setTotalType","onMarginChange","prefix","QtyAndTotalInput","DistributionType","QuantityDistributionInput","showHint","QuantityDistributionHint","QuantityDistribution","setType","content","FlatQuantity","AscendingQuantity","DescendingQuantity","currentContent","PriceChart","onChange","distributionTypeMap","ScaledPriceInput","valueRenderer","ScaledQuantityUnit","ScaledQuantityInput","quantityUnit","setQuantityUnit","isBase","SkewInput","TotalOrdersInput","ScaledOrderInput","values","showSkewInput","TriggerPriceInput","ActivePriceInput","TrailingCallbackType","percentages","CallbackRatePercentages","TrailingCallbackSelect","TrailingCallbackInput","lastCallbackValueRef","lastCallbackRateRef","callbackType","setCallbackType","onCallbackTypeChange","TrailingStopInput","OrderInput","showTriggerPrice","showPrice","triggerPriceInput","priceInput","utils","Slider","SLIDER_MIN","SLIDER_MAX","QuantitySlider","order_quantity","maxQty","sliderValue","setSliderValue","base_tick","color","maxLabel","onSliderValueChange","sliderToQuantity","newQty","onMax","quantityToSlider","ReduceOnlySwitch","onCheckedChange","className","testId","SettingFillIcon","TPSLPositionTypeWidget","CaretDownIcon","SimpleDropdownMenu","todpIfNeed","PnlInputContext","usePnlInputContext","usePNLInputBuilder","focus","setFocus","mode","setMode","tipsEle","tipVisible","setTipVisible","isFocused","setIsFocused","key","innerValue","setInnerValue","modes","modeLabelMap","percentageSuffix","endStr","PNLInput","onModeChange","tips","setPrefix","setPlaceholder","id","PNLMenus","PnlInputWidget","testIds","PnlInputProvider","children","OrderTPSL","tpslFormRef","TPSLAdvancedButton","TPSLInputForm","TPSLInputRow","TPSLTriggerPriceInput","triggerPriceToolTipEle","getPrefixLabel","trigger_price","_prefix","OrderEntry","helper","submit","metaState","bboStatus","onBBOChange","toggleBBO","soundAlert","setSoundAlert","maxQtyConfirmOpen","setMaxQtyConfirmOpen","hasAdvancedTPSLResult","setHasAdvancedTPSLResult","validated","setErrorMsgVisible","needConfirm","setPinned","showTPSLAdvanced","setShowTPSLAdvanced","hidden","setHidden","slippage","setSlippage","notification","soundAlertId","buttonLabel","clickHandler","visible","onSubmit","isScaledOrder","message","formattedMaxQty","onMaxQtyConfirm","validateSubmit","onShowTPSLAdvanced","tpslKey","onSubmitAdvancedTPSL","onDeleteAdvancedTPSL","showSoundSection","additionalInfoProps","extraButton","useMarginRatio","useOrderEntry","useCanTrade","useTrack","TrackerEventName","useBBOState","tpslSwitch","localBBOType","setLocalBBOType","lastBBOType","track","orderLevel","useFocusAndBlur","lastScaledOrderPriceInput","formatQty","quantity","usePriceInputContainer","priceInputContainerWidth","setPriceInputContainerWidth","element","resizeObserver","entries","entry","width","ORDERLY_ORDER_SOUND_ALERT_KEY","useOrderEntryScript","inputs","localOrderType","setLocalOrderType","localOrderSide","setLocalOrderSide","setTpslSwitch","currentLeverage","setBBOType","cancelTP_SL","enableTP_SL","onTPSLSwitchChanged","updateOrderPrice","focusInputElement","target","orderBookItemClickHandler","field","bestAsk","bestBid","midPrice","OrderEntryWidget"],"mappings":"AAAA,OAAgB,eAAAA,GAAa,aAAAC,GAAW,SAAAC,GAAO,WAAAC,GAAS,YAAAC,OAAgB,QACxE,OAEE,mBAAAC,GACA,iBAAAC,GACA,qBAAAC,OACK,yBACP,OAAS,kBAAAC,OAAsB,wBAC/B,OAAS,6BAAAC,OAAiC,6BAC1C,OAEE,aAAAC,GACA,aAAAC,GACA,gBAAAC,OACK,yBACP,OACE,OAAAC,GACA,MAAAC,GACA,WAAAC,GACA,QAAAC,GACA,SAAAC,GACA,eAAAC,GACA,UAAAC,GACA,mBAAAC,GACA,SAAAC,GACA,aAAAC,OACK,sBACP,OAAS,sBAAAC,OAA0B,2BACnC,OAAS,WAAAC,OAAe,yBC5BxB,OAAS,YAAApB,OAAgB,QACzB,OACE,kBAAAqB,GACA,eAAAC,GACA,kBAAAC,OACK,sBCLP,OAAa,aAAA1B,OAAiB,QAC9B,OAAS,kBAAAO,OAAsB,wBAC/B,OAAuB,aAAAG,OAAiB,yBACxC,OAAS,YAAAiB,GAAU,MAAAd,GAAI,WAAAC,GAAS,QAAAC,GAAM,UAAAG,OAAc,sBA0C5C,OAsGA,YAAAU,GArGE,OAAAC,EADF,QAAAC,OAAA,oBA5BD,IAAMC,GAA2CC,GAAU,CAChE,GAAM,CAAE,OAAAC,EAAQ,eAAAC,CAAe,EAAIF,EAC7B,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EAEvB6B,EAAgBC,GAAqBC,GAAqB,CAC1DN,EAAM,eACRA,EAAM,cACJ,iBACAM,EAAUD,EAAO,EAEnB,CAEJ,EAEA,OAAArC,GAAU,IAAM,CACdgC,EAAM,gBAAgB,mBAAoBA,EAAM,OAAS,EAAI,CAAC,CAChE,EAAG,CAACA,EAAM,MAAM,CAAC,EAGfF,GAAC,OAAI,UAAW,4BACd,UAAAA,GAACf,GAAA,CACC,QAASkB,EAAS,QAAU,UAC5B,GAAI,EACJ,MAAOA,EAAS,QAAU,OAC1B,UAAU,6BACV,KAAK,OACL,KAAM,EAEN,UAAAH,GAACf,GAAA,CAAK,UAAW,SACf,UAAAc,EAACF,GAAA,CACC,cAAY,0CACZ,GAAI,yBACJ,UAAU,WACV,MAAO,QACP,QAAS,QACT,SAAU,CAACK,EAAM,UACjB,QAASE,IAAmBxB,GAAU,UACtC,gBAAiB0B,EAAa1B,GAAU,SAAS,EACnD,EACAmB,EAAC,SACC,QAAS,yBACT,UAAWhB,GACT,uEACA,wCACF,EAEC,SAAAsB,EAAE,+BAA+B,EACpC,GACF,EACAL,GAACf,GAAA,CAAK,UAAW,SACf,UAAAc,EAACF,GAAA,CACC,cAAY,qCACZ,GAAI,mBACJ,MAAO,QACP,UAAU,WACV,QAAS,QACT,QAASO,IAAmBxB,GAAU,IACtC,gBAAiB0B,EAAa1B,GAAU,GAAG,EAC3C,SAAU,CAACsB,EAAM,UACnB,EACAH,EAAC,SACC,QAAS,mBACT,UAAWhB,GACT,uEACA,wCACF,EAEC,SAAAsB,EAAE,0BAA0B,EAC/B,GACF,EACAL,GAACf,GAAA,CAAK,UAAW,SACf,UAAAc,EAACF,GAAA,CACC,cAAY,qCACZ,GAAI,mBACJ,MAAO,QACP,QAAS,QACT,UAAU,WACV,QAASO,IAAmBxB,GAAU,IACtC,gBAAiB0B,EAAa1B,GAAU,GAAG,EAC3C,SAAU,CAACsB,EAAM,UACnB,EACAH,EAAC,SACC,QAAS,mBACT,UAAWhB,GACT,uEACA,wCACF,EAEC,SAAAsB,EAAE,0BAA0B,EAC/B,GACF,GACF,EAEAL,GAACf,GAAA,CAAK,KAAM,EACV,UAAAe,GAACf,GAAA,CACC,UAAAc,EAACF,GAAA,CACC,cAAY,8CACZ,GAAI,uBACJ,MAAO,QACP,QAASK,EAAM,YACf,gBAAkBM,GAAY,CAC5BN,EAAM,eAAe,CAAC,CAACM,CAAO,CAChC,EACF,EACAT,EAAC,SACC,QAAS,uBACT,UAAW,wBAEV,SAAAM,EAAE,yBAAyB,EAC9B,GACF,EACAL,GAACf,GAAA,CACC,UAAAc,EAACF,GAAA,CACC,cAAY,wCACZ,GAAI,sBACJ,MAAO,QACP,QAASK,EAAM,OACf,gBAAkBM,GAAqB,CACrCN,EAAM,UAAUM,CAAO,CACzB,EACF,EACAT,EAAC,SACC,QAAS,sBACT,UAAW,wBAEV,SAAAM,EAAE,mBAAmB,EACxB,GACF,GACF,EACC,CAACF,GACAH,GAAAF,GAAA,CACE,UAAAC,EAACf,GAAA,CAAQ,UAAW,WAAY,EAChCgB,GAACf,GAAA,CACC,UAAAc,EAACX,GAAA,CACC,cAAY,sDACZ,GAAI,4BACJ,gBAAkBoB,GAAY,CAC5BN,EAAM,UAAUM,CAAO,CACzB,EACF,EACAT,EAAC,SACC,QAAS,4BACT,UAAW,wBAEV,SAAAM,EAAE,wBAAwB,EAC7B,GACF,GACF,GAEJ,CAEJ,ED5JI,OAgBQ,OAAAN,GAhBR,QAAAC,OAAA,oBAJG,SAASS,GAAuBP,EAA4B,CACjE,GAAM,CAACQ,EAAMC,CAAO,EAAItC,GAAS,EAAK,EAEtC,OACE2B,GAACL,GAAA,CAAY,KAAMe,EAAM,aAAcC,EACrC,UAAAZ,GAACH,GAAA,CAAe,QAAO,GACrB,SAAAG,GAAC,UACC,cAAY,0CACZ,QAAS,IAAM,CACbY,EAAQ,EAAI,CACd,EAEA,SAAAZ,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,eACL,MAAM,6BACN,UAAU,+CAEV,SAAAA,GAAC,QACC,EAAE,wkCAGJ,EACF,EACF,EACF,EACAA,GAACL,GAAA,CAAe,KAAM,MAAO,MAAO,MAAO,UAAW,gBACpD,SAAAK,GAACE,GAAA,CAAgB,GAAGC,EAAO,EAC7B,GACF,CAEJ,CEzCA,OAAyB,YAAA7B,OAAgB,QA0BjC,cAAA0B,OAAA,oBAxBR,IAAMa,GACJ,gfAEWC,GAAaX,GAA6C,CACrE,GAAM,CAACY,EAAMC,CAAO,EAAI1C,GAASuC,EAAW,EAC5C,OACEb,GAAC,UAAQ,GAAGG,EACV,SAAAH,GAAC,OACC,MAAO,GACP,OAAQ,GACR,QAAQ,YACR,KAAK,eACL,MAAM,6BACN,UAAW,GACX,aAAc,IAAM,CAClBgB,EACE,60BACF,CACF,EACA,aAAc,IAAM,CAClBA,EAAQH,EAAW,CACrB,EACA,UAAU,0BAEV,SAAAb,GAAC,QAAK,EAAGe,EAAM,EACjB,EACF,CAEJ,EC5BA,OAAS,kBAAArC,OAAsB,wBAC/B,OAAS,6BAAAC,OAAiC,6BAC1C,OAGE,aAAAE,GACA,gBAAAC,OACK,yBACP,OAAS,WAAAG,GAAS,QAAAC,EAAM,QAAA+B,MAAY,sBA+BxB,OACE,OAAAjB,EADF,QAAAC,MAAA,oBA7BL,SAASiB,GAAmBf,EAMhC,CACD,GAAM,CAAE,MAAOgB,EAAgB,WAAAC,EAAY,OAAAC,EAAQ,SAAAC,EAAU,OAAAC,CAAO,EAAIpB,EAElE,CAAE,YAAAqB,CAAY,EAAI7C,GAA0B4C,CAAM,EAClD,CAAE,EAAAjB,CAAE,EAAI5B,GAAe,EAEvB+C,EAAW,IAAM,CACrB,IAAMC,EAAQF,EAAY,kBAAkB,EAC5C,OAAIL,EAAe,kBAAoBA,EAAe,eAElDlB,EAACf,EAAA,CACC,UAAW,SACX,UAAW,QACX,UAAU,aACV,IAAK,EAEL,UAAAe,EAACf,EAAA,CACC,UAAW,SACX,UAAW,QACX,QAAS,UACT,KAAM,EACN,UAAU,aAEV,UAAAe,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,qBAAqB,EAAE,EAChCN,EAACiB,EAAK,QAAL,CACC,OACEjB,EAACiB,EAAA,CAAK,UAAU,qCACb,SAAAG,EAAW,MACd,EAEF,UAAU,yBACV,GAAIA,EAAW,SAEd,SAAAD,EAAe,kBAAoB,GACtC,GACF,EACAlB,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,mBAAmB,EAAE,EAC7Ba,EAAe,gBAAkBtC,GAAU,MAC1CmB,EAACiB,EAAK,QAAL,CACC,OACEjB,EAACiB,EAAA,CAAK,UAAU,qCACb,SAAAG,EAAW,MACd,EAEF,UAAU,yBACV,GAAIA,EAAW,SAEd,SAAAD,EAAe,gBAAkB,GACpC,EAEAnB,EAACiB,EAAA,CAAK,UAAU,yBAAyB,kBAAM,GAEnD,EACAhB,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,oBAAoB,EAAE,EAC/BN,EAACiB,EAAK,QAAL,CACC,OACEjB,EAACiB,EAAA,CAAK,UAAU,qCACb,SAAAG,EAAW,MACd,EAEF,SAAQ,GACR,GAAI,EAEH,gBAAOD,EAAe,MAAM,EAC/B,GACF,GACF,EACCO,GACCzB,EAACf,EAAA,CACC,QAAS,QACT,UAAW,QACX,IAAK,EACL,UAAU,aAEV,UAAAc,EAAC,OAAI,UAAU,uEAAuE,EACtFA,EAACiB,EAAA,CAAK,UAAU,kBAAmB,SAAAS,EAAM,GAC3C,GAEJ,EAGG,IACT,EAEMC,EAAW,IAAM,CACrB,GAAIR,EAAe,kBAAoBA,EAAe,eAAgB,CACpE,IAAMO,EAAQF,EAAY,kBAAkB,EAC5C,OACExB,EAACd,EAAA,CACC,UAAW,SACX,UAAW,QACX,UAAU,aACV,IAAK,EAEL,SAAAe,EAACf,EAAA,CACC,UAAW,SACX,UAAW,QACX,QAAS,UACT,KAAM,EACN,UAAU,aAEV,UAAAe,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,qBAAqB,EAAE,EAChCN,EAACiB,EAAK,QAAL,CACC,OACEjB,EAACiB,EAAA,CAAK,UAAU,qCACb,SAAAG,EAAW,MACd,EAEF,UAAU,yBACV,GAAIA,EAAW,SAEd,SAAAD,EAAe,kBAAoB,GACtC,GACF,EACAlB,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,mBAAmB,EAAE,EAC7Ba,EAAe,gBAAkBtC,GAAU,MAC1CmB,EAACiB,EAAK,QAAL,CACC,OACEjB,EAACiB,EAAA,CAAK,UAAU,qCACb,SAAAG,EAAW,MACd,EAEF,UAAU,yBACV,GAAIA,EAAW,SAEd,SAAAD,EAAe,gBAAkB,GACpC,EAEAnB,EAACiB,EAAA,CAAK,UAAU,yBAAyB,kBAAM,GAEnD,EAEAhB,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,oBAAoB,EAAE,EAC/BN,EAACiB,EAAK,QAAL,CACC,SAAQ,GACR,OACEjB,EAACiB,EAAA,CAAK,UAAU,qCACb,SAAAG,EAAW,MACd,EAEF,GAAI,EAEH,gBAAOD,EAAe,MAAM,EAC/B,GACF,EACCO,GACCzB,EAACf,EAAA,CACC,QAAS,QACT,UAAW,QACX,IAAK,EACL,UAAU,aAEV,UAAAc,EAAC,OAAI,UAAU,uEAAuE,EACtFA,EAACiB,EAAA,CAAK,UAAU,kBAAmB,SAAAS,EAAM,GAC3C,GAEJ,EACF,CAEJ,CACA,OAAO,IACT,EAEA,OACEzB,EAACf,EAAA,CACC,UAAW,SACX,UAAW,QACX,UAAU,0BACV,IAAK,EAEL,UAAAe,EAACf,EAAA,CAAK,QAAS,UAAW,UAAW,QAAS,UAAU,aACtD,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,qBAAqB,EAAE,EAChCL,EAACf,EAAA,CAAK,IAAK,EACT,UAAAc,EAAC4B,GAAA,CACC,KAAM,GACN,UAAU,4EACV,QAAS,EACT,QAASN,EACX,EACAtB,EAAC6B,GAAA,CACC,KAAM,GACN,UAAU,4EACV,QAASR,EACX,GACF,GACF,EACApB,EAACf,EAAA,CAAK,QAAS,UAAW,UAAW,QAAS,UAAU,aACtD,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,WAAW,EAAE,EACtBN,EAACiB,EAAA,CAAK,UAAU,yBACb,SAAAE,EAAe,gBAAkBrC,GAAa,KAC3CwB,EAAE,mBAAmB,EACrBA,EAAE,sBAAsB,EAC9B,GACF,EACCmB,EAAS,EACTE,EAAS,EAEV3B,EAACf,GAAA,CAAQ,UAAU,sBAAsB,GAC3C,CAEJ,CAKA,IAAM2C,GAAmCzB,GAErCH,EAAC,OACC,MAAM,6BACN,MAAOG,EAAM,KACb,OAAQA,EAAM,KACd,QAAQ,YACR,KAAK,eACJ,GAAGA,EAEJ,SAAAH,EAAC,QAAK,EAAE,w6BAAw6B,EACl7B,EAIE6B,GAAiC1B,GAEnCH,EAAC,OACC,MAAM,6BACN,QAAQ,YACR,MAAOG,EAAM,KACb,OAAQA,EAAM,KACd,KAAK,eACJ,GAAGA,EAEJ,SAAAH,EAAC,QAAK,EAAE,4hCAA4hC,EACtiC,EC/PJ,OAAS,kBAAAtB,OAAsB,wBAC/B,OAAS,aAAAG,OAAiB,yBAC1B,OAAS,QAAAK,GAAM,QAAA+B,OAA0B,sBCAzC,OAAS,eAAAa,GAAa,0BAAAC,OAA8B,yBCApD,OAAS,kBAAArD,OAAsB,wBAC/B,OACE,QAAAQ,GACA,SAAAC,GACA,QAAA8B,GACA,WAAAe,GACA,YAAAC,GACA,aAAAzC,OACK,sBACP,OAAS,aAAA0C,OAAiB,gCAC1B,OAEE,sBAAAC,OACK,+BCfP,OAAOC,IAAS,SAAAhE,OAAa,QAkBvB,cAAA4B,GAKE,QAAAC,OALF,oBAhBC,IAAMoC,GAAeD,GAAM,WAGhC,CAACjC,EAAOmC,IAAQ,CAChB,IAAMC,EAAWnE,GAAM,EACvB,OACE6B,GAAC,OACC,MAAM,6BACN,MAAO,GACP,OAAQ,GACR,QAAQ,YACR,KAAK,eACL,IAAKqC,EACL,UAAW,GACV,GAAGnC,EAEJ,UAAAH,GAAC,QACC,EAAE,m5EACF,KAAM,QAAQuC,CAAQ,IACxB,EACAvC,GAAC,QACC,SAAAC,GAAC,kBACC,GAAIsC,EACJ,GAAG,UACH,GAAG,UACH,GAAG,SACH,GAAG,UACH,cAAc,iBAEd,UAAAvC,GAAC,QAAK,UAAU,qCAAqC,EACrDA,GAAC,QAAK,UAAU,uCAAuC,OAAQ,EAAG,GACpE,EACF,GACF,CAEJ,CAAC,EAEG,QAAQ,IAAI,WAAa,eAC3BqC,GAAa,YAAc,gBDhBzB,OAEE,OAAArC,EAFF,QAAAC,OAAA,oBANJ,IAAMuC,GAGD,CAAC,CAAE,cAAAC,EAAe,QAAAC,CAAQ,IAAM,CACnC,GAAM,CAAE,EAAApC,CAAE,EAAI5B,GAAe,EAC7B,OACEuB,GAACgB,GAAA,CAAK,KAAK,MAAM,UAAU,wCACxB,UAAAX,EAAE,wCAAwC,EAAG,IAC9CN,EAAC,KACC,KAAK,qBACL,QAAU2C,GAAM,CACdA,EAAE,eAAe,EACjBF,GAAe,cAAc,CAC3B,KAAM,qBACN,KAAMnC,EAAE,4CAA4C,CACtD,CAAC,EACDoC,IAAU,CACZ,EACA,UAAU,2HAET,SAAApC,EAAE,4CAA4C,EACjD,GACF,CAEJ,EAEMsC,GAED,CAAC,CAAE,cAAAH,CAAc,IAAM,CAC1B,GAAM,CAAE,KAAAI,CAAK,EAAIZ,GAAS,EAC1B,OAAOjC,EAACwC,GAAA,CAAiB,cAAeC,EAAe,QAASI,EAAM,CACxE,EAEMC,GAEA3C,GAAU,CACd,GAAM,CAAE,cAAAsC,CAAc,EAAItC,EACpB,CAAE,SAAA4C,CAAS,EAAIvD,GAAU,EACzB,CAAE,EAAAc,CAAE,EAAI5B,GAAe,EAC7B,OAAIqE,EAEA/C,EAACqC,GAAA,CACC,QAAS,IAAM,CACblD,GAAM,OAAO,CACX,KAAM,KACN,MAAOmB,EAAE,aAAa,EACtB,QACEN,EAAC4C,GAAA,CAA0B,cAAeH,EAAe,CAE7D,CAAC,CACH,EACF,EAIFzC,EAACgC,GAAA,CACC,QAAShC,EAACwC,GAAA,CAAiB,cAAeC,EAAe,EACzD,UAAU,sCAEV,SAAAzC,EAACqC,GAAA,CAAa,UAAW,qBAAsB,EACjD,CAEJ,EAEaW,GACX7C,GACG,CACH,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAAE,cAAA+D,CAAc,EAAIN,GAAmB,EACvC,CAAE,MAAAc,EAAO,MAAAC,CAAM,EAAI/C,EAoCzB,OAjCEF,GAACf,GAAA,CAAK,UAAU,SAAS,QAAQ,UAAU,MAAO,OAAQ,IAAK,EAC7D,UAAAe,GAACf,GAAA,CAAK,MAAO,OAAQ,UAAU,SAAS,QAAS,UAC/C,UAAAc,EAACiB,GAAA,CAAK,UAAU,eAAe,KAAK,MACjC,WAAE,aAAa,EAClB,EACAjB,EAACkC,GAAA,CACC,SAAU,IACRjC,GAACgB,GAAA,CAAK,UAAU,eAAe,KAAK,MACjC,YAAE,WAAW,EAAE,WAAS,EAAE,WAAW,EAAE,SAC1C,EAGF,SAAAhB,GAACf,GAAA,CAAK,IAAK,EACT,UAAAe,GAACgB,GAAA,CAAK,UAAU,eAAe,KAAK,MACjC,YAAE,WAAW,EAAE,KAClB,EACAjB,EAACiB,GAAA,CAAK,KAAK,MAAM,UAAU,4BACxB,SAAAgC,EACH,EACAjD,EAACiB,GAAA,CAAK,KAAK,MAAM,aAAC,EAClBhB,GAACgB,GAAA,CAAK,UAAU,eAAe,KAAK,MACjC,YAAE,WAAW,EAAE,KAClB,EACAjB,EAACiB,GAAA,CAAK,KAAK,MAAM,UAAU,4BACxB,SAAAiC,EACH,GACF,EACF,GACF,EACAlD,EAAC8C,GAAA,CAAoB,cAAeL,EAAe,GACrD,CAIJ,EErHS,cAAAzC,OAAA,oBAHF,IAAMmD,GACXhD,GAEOH,GAACgD,GAAA,CAAgB,GAAG7C,EAAO,ECLpC,OAAS,kBAAAzB,OAAsB,wBAC/B,OAAS,QAAAQ,GAAM,QAAA+B,OAAY,sBAC3B,OAAS,aAAAiB,OAAiB,gCAWlB,cAAAlC,GAKI,QAAAC,OALJ,oBATD,IAAMmD,GACXjD,GACG,CACH,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAAE,MAAAuE,EAAO,MAAAC,CAAM,EAAI/C,EAmCzB,OAhCEH,GAACd,GAAA,CAAK,UAAU,SAAS,QAAQ,UAAU,MAAO,OAAQ,IAAK,EAC7D,SAAAe,GAACf,GAAA,CAAK,MAAO,OAAQ,UAAU,SAAS,QAAS,UAC/C,UAAAc,GAACiB,GAAA,CAAK,UAAU,eAAe,KAAK,MACjC,WAAE,aAAa,EAClB,EACAjB,GAACkC,GAAA,CACC,SAAU,IACRjC,GAACgB,GAAA,CAAK,UAAU,eAAe,KAAK,MACjC,YAAE,WAAW,EAAE,WAAS,EAAE,WAAW,EAAE,SAC1C,EAGF,SAAAhB,GAACf,GAAA,CAAK,IAAK,EACT,UAAAe,GAACgB,GAAA,CAAK,UAAU,eAAe,KAAK,MACjC,YAAE,WAAW,EAAE,KAClB,EACAjB,GAACiB,GAAA,CAAK,KAAK,MAAM,UAAU,4BACxB,SAAAgC,EACH,EACAjD,GAACiB,GAAA,CAAK,KAAK,MAAM,aAAC,EAClBhB,GAACgB,GAAA,CAAK,UAAU,eAAe,KAAK,MACjC,YAAE,WAAW,EAAE,KAClB,EACAjB,GAACiB,GAAA,CAAK,KAAK,MAAM,UAAU,4BACxB,SAAAiC,EACH,GACF,EACF,GACF,EACF,CAIJ,ECvCS,cAAAlD,OAAA,oBAHF,IAAMqD,GACXlD,GAEOH,GAACoD,GAAA,CAAe,GAAGjD,EAAO,ELQ/B,cAAAH,OAAA,oBATJ,IAAMsD,GAAeC,GACnB,OAAOA,EAAQ,KAAeA,IAAQ,KAE3BC,GAA2C,CAAC,CAAE,OAAAC,CAAO,IAAM,CACtE,GAAM,CAAE,cAAAC,EAAe,GAAGC,CAAO,EAAI7B,GAAY,EAE3C8B,EADO7B,GAAuB,IACf0B,CAAM,IAAM,OAEjC,OADuBH,GAAYI,CAAa,EAE9C1D,GAACmD,GAAA,CACC,MAAOS,EAAQD,EAAO,qBAAuBA,EAAO,kBACpD,MAAOC,EAAQD,EAAO,qBAAuBA,EAAO,kBACtD,EAEA3D,GAACqD,GAAA,CACC,MAAOO,EAAQD,EAAO,YAAcA,EAAO,SAC3C,MAAOC,EAAQD,EAAO,YAAcA,EAAO,SAC7C,CAEJ,EMzBA,OAAS,UAAAE,OAAc,QACvB,OAAS,cAAAC,OAAkB,yBAC3B,OAAS,kBAAApF,OAAsB,wBAC/B,OACE,YAAAmD,GACA,QAAA3C,GACA,QAAA+B,GACA,gBAAA8C,GACA,aAAAvE,OACK,sBACP,OAAS,aAAA0C,OAAiB,gCCV1B,OAEE,cAAA8B,GACA,aAAA7F,GACA,uBAAA8F,GACA,YAAA3F,OACK,QACP,OAAS,kBAAAI,OAAsB,wBAC/B,OACE,OAAAK,GACA,MAAAC,GACA,uBAAAkF,GACA,QAAAhF,GACA,SAAAiF,GACA,kBAAAC,GACA,SAAAjF,GACA,QAAA8B,GACA,WAAAe,GACA,kBAAAqC,OACK,sBACP,OAAS,WAAA3E,OAAe,yBA4DL,cAAAM,EAyBb,QAAAC,OAzBa,oBArDnB,IAAMqE,GAAU,CAAC,IAAM,IAAM,EAAG,EAEnBC,GAAiBP,GAG5B,CAAC7D,EAAOmC,IAAQ,CAChB,GAAM,CAAE,EAAAhC,CAAE,EAAI5B,GAAe,EACvB,CAAC8F,EAAOC,CAAQ,EAAInG,GAAiB,EACrC,CAACoG,EAAaC,CAAc,EAAIrG,GAAS,EAAE,EAC3C,CAACoD,EAAOkD,CAAQ,EAAItG,GAA6B,MAAS,EAEhE2F,GAAoB3B,EAAK,KAAO,CAC9B,SAAU,IACRoC,EAAc,IAAIhF,GAAQgF,CAAW,GAAG,SAAS,EAAIF,CACzD,EAAE,EAEFrG,GAAU,IAAM,CACVgC,EAAM,cAAgB,CAACmE,GAAQ,SAASnE,EAAM,YAAa,EAC7DwE,EAAexE,EAAM,aAAc,SAAS,CAAC,EAE7CsE,EAAStE,EAAM,YAAY,CAE/B,EAAG,CAACA,EAAM,aAAc,IAAI,CAAC,EAE7B,IAAM0E,EAAWtB,GAAgB,CAC/BkB,EAASlB,CAAG,EACZoB,EAAe,EAAE,EACjBC,EAAS,MAAS,CACpB,EAEME,EAAiBvB,GAAgB,CACrC,GAAI,CAACA,EAAK,CACRoB,EAAepB,CAAG,EAClB,MACF,CAEA,IAAMwB,EAAI,IAAIrF,GAAQ6D,CAAG,EACzBkB,EAAS,MAAS,EACdM,EAAE,GAAG,CAAC,GACRJ,EAAe,GAAG,EAClBC,EAAStE,EAAE,kCAAkC,CAAC,IAE9CqE,EAAepB,CAAG,EAClBqB,EAAS,MAAS,EAEtB,EAEMI,EAAgB7E,EAAM,SAC1BH,EAAC,UACC,QAAS,IAAM,CAEbb,GAAM,MAAM,CACV,MAAOmB,EAAE,aAAa,EACtB,QAASN,EAACiB,GAAA,CAAK,KAAK,MAAO,SAAAX,EAAE,0BAA0B,EAAE,CAC3D,CAAC,CACH,EAEA,SAAAN,EAACkE,GAAA,CAAoB,UAAU,4BAA4B,KAAM,GAAI,EACvE,EAEAlE,EAACgC,GAAA,CAEC,QACEhC,EAACiB,GAAA,CAAK,UAAW,GAAI,KAAK,MACvB,SAAAX,EAAE,0BAA0B,EAC/B,EAEF,UAAU,8BACV,MAAO,CAAE,UAAW,iBAAkB,EAEtC,SAAAN,EAACqE,GAAA,CACC,SAAArE,EAACkE,GAAA,CAAoB,UAAU,4BAA4B,KAAM,GAAI,EACvE,EACF,EAGF,OACEjE,GAAC,OAAI,UAAU,eACb,UAAAA,GAACf,GAAA,CAAK,GAAI,EAAG,KAAM,EACjB,UAAAc,EAACiB,GAAA,CAAK,KAAK,KAAM,SAAAX,EAAE,qBAAqB,EAAE,EACzC0E,GACH,EACA/E,GAACf,GAAA,CAAK,KAAM,EACT,UAAAoF,GAAQ,IAAKW,GAGVjF,EAACkF,GAAA,CAEC,MAAOD,EACP,SALaT,IAAUS,EAMvB,QAAS,IAAM,CACbJ,EAAQI,CAAI,CACd,GALKA,CAMP,CAEH,EAEDjF,EAACmE,GAAA,CACC,OAAO,IACP,WAAY,CACVC,GAAe,gBACfA,GAAe,YAAY,CAAC,CAC9B,EACA,MAAOM,EACP,cAAeI,EACf,WAAY,CACV,KAAM9F,GACJ,+BACA,2BACF,EACA,MAAO,yBACP,WAAY,UACd,EACF,GACF,EACC,CAAC,CAAC0C,GACD1B,EAACjB,GAAA,CAAI,GAAI,EAAG,UAAU,YACpB,SAAAiB,EAACiB,GAAA,CAAK,KAAK,MAAM,MAAM,SACpB,SAAAS,EACH,EACF,GAEJ,CAEJ,CAAC,EAQKwD,GAAsC,CAAC,CAAE,MAAAV,EAAO,SAAAW,EAAU,QAAAN,CAAQ,IAEpE7E,EAACd,GAAA,CACC,UAAW,IACX,QAAQ,SACR,UAAU,SACV,EAAE,KACF,MAAO,GACP,OAAQ,GACR,UAAWF,GACT,qCACAmG,GAAY,sBACd,EACA,QAASN,EAET,SAAA5E,GAACgB,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,UAAAuD,EAAM,KACT,EACF,ED/IA,mBAAAzE,GAkBI,OAAAC,GAUI,QAAAC,OA5BR,oBArBG,IAAMmF,GAAgBjF,GAIvB,CACJ,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAACiC,EAAM,CAAE,QAASC,EAAS,SAAUyE,EAAU,OAAAC,CAAO,CAAC,EAC3DxB,GAAW,EAAK,EAEZ,CAAE,SAAAf,CAAS,EAAIvD,GAAU,EACzB+F,EAAc1B,GAA+C,IAAI,EAEjE2B,EAAY,IAAM,CACtB,IAAMjC,EAAMgC,EAAY,SAAS,SAAS,EAE1C,OAAApF,EAAM,YAAaoD,EAAYA,EAAI,SAAS,EAAnB,GAAoB,EAC7C8B,EAAS,EACF,QAAQ,QAAQ,EAAI,CAC7B,EAEA,OACEpF,GAAAF,GAAA,CACE,UAAAC,GAAC+D,GAAA,CACC,KAAMpD,EACN,aAAc2E,EACd,MAAO,EAAE,iBAAiB,EAC1B,aAAc,CAAE,KAAMvC,EAAW,KAAO,IAAK,EAC7C,QAAS,CACP,QAAS,CACP,SAAU,GACV,MAAO,EAAE,aAAa,EACtB,QAASyC,CACX,EACA,UAAW,CACT,MAAO,EAAE,eAAe,EACxB,QAAS,IAAMH,EAAS,CAC1B,CACF,EAEA,SAAArF,GAACuE,GAAA,CACC,IAAKgB,EACL,SAAUxC,EACV,aAAc5C,EAAM,SAAW,OAAOA,EAAM,QAAQ,EAAI,OAC1D,EACF,EACAF,GAACf,GAAA,CAAK,QAAS,UACb,UAAAc,GAACiB,GAAA,CAAK,KAAK,MAAO,WAAE,qBAAqB,EAAE,EAC3CjB,GAACkC,GAAA,CACC,SAAU,IACRjC,GAACgB,GAAA,CAAK,KAAK,MACR,YAAE,yBAAyB,EAAE,UAAQ,EAAE,YAAY,EAAE,SACxD,EAGF,SAAAhB,GAACf,GAAA,CAAK,IAAK,EACT,UAAAc,GAACiB,GAAK,QAAL,CACC,KAAK,MACL,KAAK,cACL,OAAQ,GAAG,EAAE,yBAAyB,CAAC,KACvC,OAAQ,MAAM,EAAE,YAAY,CAAC,KAE5B,SAAAd,EAAM,aAAe,EACxB,EACAH,GAAC,UAAO,UAAU,eAAe,QAAS,IAAMY,EAAQ,EACtD,SAAAX,GAACf,GAAA,CAAK,UAAU,cAAc,GAAG,OAC/B,UAAAc,GAACiB,GAAA,CAAK,KAAK,MAAM,UAAU,mBACxB,YAAGd,EAAM,UAAY,GAAG,IAC3B,EACAH,GAAC6B,GAAA,CACC,UAAU,2CACV,KAAM,GACN,QAAS,EACX,GACF,EACF,GACF,EACF,GACF,GACF,CAEJ,EEtFS,cAAA7B,OAAA,oBALF,IAAMyF,GAActF,GAKlBH,GAACoF,GAAA,CAAc,GAAGjF,EAAO,ETkB5B,OACE,OAAAH,GADF,QAAAC,OAAA,oBAnBC,SAASyF,GAAUvF,EAavB,CACD,GAAM,CAAE,SAAAwF,EAAU,gBAAAC,EAAiB,UAAAC,EAAW,OAAApC,CAAO,EAAItD,EACnD,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EAE7B,OACEuB,GAAC,OAAI,UAAW,qCACd,UAAAA,GAACf,GAAA,CAAK,QAAS,UACb,UAAAc,GAACiB,GAAA,CAAK,KAAM,MAAQ,SAAAX,EAAE,wBAAwB,EAAE,EAChDN,GAACiB,GAAK,QAAL,CACC,KAAMd,EAAM,MACZ,KAAM,MACN,GAAIA,EAAM,GACV,UAAW,4BACX,cAAe,qCAEd,SAAAwF,EAAYxF,EAAM,aAAe,KAAQ,KAC5C,GACF,EAEC0F,IAAchH,GAAU,QACvB,CAAC+G,GAAiB,SAAS,iBAAiB,GAC1C5F,GAACyF,GAAA,CACC,SAAUtF,EAAM,SAChB,YAAaA,EAAM,YACnB,YAAaA,EAAM,YACrB,EAGH,CAACyF,GAAiB,SAAS,UAAU,GACpC5F,GAACwD,GAAA,CAAW,OAAQrD,EAAM,OAAQ,GAEtC,CAEJ,CUpDA,OAAS,WAAA9B,OAAe,QACxB,OAAS,kBAAAK,OAAsB,wBAC/B,OAAS,QAAAQ,GAAM,WAAA8C,GAAS,QAAAf,GAAM,kBAAA6E,OAAsB,sBCDpD,OAAS,kBAAApH,OAAsB,wBAC/B,OAAS,UAAAqH,GAAQ,MAAA/G,GAAI,WAAAC,GAAS,QAAAC,GAAM,QAAA+B,OAAY,sBAChD,OAAS,uBAAA+E,OAA2B,yBA2B9B,OACE,OAAAhG,GADF,QAAAC,OAAA,oBAxBN,IAAMgG,GAAqB1C,GACrBA,GAAO,GAAKA,EAAM,GACb,mBACEA,GAAO,IAAMA,EAAM,GACrB,mBACEA,GAAO,GACT,kBAEA,GAIE2C,GAAsD/F,GAAU,CAC3E,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CACJ,cAAAyH,EACA,wBAAAC,EACA,mBAAAC,EACA,YAAAC,EAAc,CAAC,EACf,WAAAC,EACA,UAAAC,CACF,EAAIrG,EACJ,OACEF,GAACf,GAAA,CAAK,IAAK,EAAG,UAAU,wBAAwB,UAAU,SACxD,UAAAe,GAACf,GAAA,CAAK,MAAO,OAAQ,QAAQ,UAAU,UAAU,SAC/C,UAAAc,GAACiB,GAAA,CAAK,UAAW,GAAI,KAAK,KACvB,WAAE,eAAe,EACpB,EACAjB,GAACiB,GAAA,CAAK,UAAW,GAAI,KAAK,KACvB,WAAE,yCAAyC,EAC9C,GACF,EACCqF,EAAY,IAAI,CAACG,EAAOC,IAErBzG,GAACf,GAAA,CAEC,MAAO,OACP,QAAQ,UACR,UAAU,SAEV,UAAAc,GAACiB,GAAA,CAAK,UAAW,GAAI,KAAK,KACvB,SAAAwF,EAAM,MACT,EACAzG,GAACiB,GAAA,CACC,KAAK,KACL,UAAW,GACX,UAAWjC,GACT,OAAOyH,EAAM,sBAAsB,EAAI,GAAK,kBAC9C,EAEC,SAAAT,GAAoBS,EAAM,sBAAsB,EACnD,IAhBK,QAAQC,CAAK,EAiBpB,CAEH,EACD1G,GAACf,GAAA,CAAQ,UAAU,aAAa,EAChCgB,GAACf,GAAA,CAAK,MAAO,OAAQ,QAAQ,UAAU,UAAU,SAC/C,UAAAc,GAACiB,GAAA,CAAK,UAAW,GAAI,KAAK,KACvB,WAAE,yBAAyB,EAC9B,EACAhB,GAACgB,GAAA,CACC,KAAK,KACL,UAAW,GACX,UAAWjC,GAAG,kBAAmBiH,GAAkBM,CAAU,CAAC,EAE7D,UAAAA,EAAW,KACd,GACF,EACAvG,GAACiB,GAAA,CAAK,UAAU,WAAW,UAAW,GAAI,KAAK,MAC5C,WAAE,uBAAwB,CACzB,UAAWoF,EAAqB,IAAMF,EACtC,cAAeE,EAAqB,IAAMD,CAC5C,CAAC,EACH,EACApG,GAAC+F,GAAA,CACC,UAAS,GACT,KAAM,KACN,QAAS,WACT,MAAO,YACP,QAASS,EAER,WAAE,gCAAgC,EACrC,GACF,CAEJ,EC3FA,OAAS,eAAAtI,OAAmB,QAC5B,OACE,kBAAAyI,GACA,oBAAAC,GACA,wBAAAC,GACA,YAAAC,GACA,iBAAAC,OACK,yBACP,OAAS,WAAAC,OAAe,wBAExB,OAAS,SAAA7H,OAAa,sBACtB,OAAS,WAAAO,GAAS,QAAAuH,OAAY,yBAE9B,IAAMC,GAAsB,IAAM,CAChC,GAAM,CAAE,KAAAC,EAAM,MAAAzF,EAAO,UAAA0F,CAAU,EAAIN,GACjC,oCACA,CAAE,gBAAiB,CAAE,CACvB,EACA,MAAO,CACL,cAAe,IAAIpH,GAAQyH,GAAM,eAAiB,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EACvE,wBAAyBA,GAAM,wBAC/B,UAAAC,EACA,MAAA1F,CACF,CACF,EAEa2F,GAAsB,IAAM,CACvC,GAAM,CAAE,KAAMC,EAAc,CAAC,EAAG,UAAWC,CAAiB,EAC1DX,GAAiB,EAEb,CACJ,cAAAT,EACA,wBAAAC,EACA,UAAWC,CACb,EAAIa,GAAoB,EAElBM,EAAaT,GAAc,EAE3B,CAAE,cAAAU,CAAc,EAAIZ,GAAqB,EAEzCP,EAAcgB,EAAY,IAAKrC,GAAS,CAC5C,IAAMyC,EAAYF,GAAY,KAAK,CAAC,CAAE,MAAAG,CAAM,IAAMA,IAAU1C,EAAK,KAAK,EAGhE2C,EAAaH,EAAcxC,EAAK,KAAK,EAGrC4C,EAAkBH,EACpBV,GAAQ,gBAAgB,CACtB,WAAYU,EAAU,aAAe,EACrC,eAAgBA,EAAU,iBAAmB,EAC7C,cAAezC,EAAK,QACpB,cAAeyC,GAAW,cAAgBzC,EAAK,QAC/C,WAAY2C,CACd,CAAC,EACDX,GAGEa,EAAyBd,GAAQ,uBAAuB,CAC5D,cAAe/B,EAAK,QACpB,cAAeyC,GAAW,cAAgBzC,EAAK,QAC/C,gBAAiB4C,EAAgB,SAAS,EAC1C,WAAYD,CACd,CAAC,EAED,MAAO,CACL,GAAG3C,EACH,uBAAwB6C,CAC1B,CACF,CAAC,EAEKvB,EAAaI,GAAe,EAE5BH,EAAYtI,GAAY,SACrBiB,GAAM,KAAK,iBAAiB,EAClC,CAAC,CAAC,EAEL,MAAO,CACL,YAAAmH,EACA,iBAAAiB,EACA,cAAApB,EACA,wBAAAC,EACA,mBAAAC,EACA,WAAYE,EACZ,UAAWC,CACb,CACF,EChFS,cAAAxG,OAAA,oBAFF,IAAM+H,GAAiC,IAAM,CAClD,IAAMC,EAAQX,GAAoB,EAClC,OAAOrH,GAACkG,GAAA,CAAkB,GAAG8B,EAAO,CACtC,EHmBM,cAAAhI,GACA,QAAAC,OADA,oBAdC,IAAMgI,GAAa9H,GAA0B,CAClD,GAAM,CAAE,SAAAwF,EAAU,WAAAY,EAAY,MAAA2B,EAAO,eAAAC,CAAe,EAAIhI,EAClD,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EAEvB0J,EAAU/J,GAAQ,IAEpB,OAAOkI,GAAe,UACtB,CAAC,OAAO,MAAMA,CAAU,GACxBA,EAAa,EAEd,CAACA,CAAU,CAAC,EAEf,OACEtG,GAACf,GAAA,CAAK,UAAW,SAAU,QAAS,UAClC,UAAAc,GAACiB,GAAA,CAAK,KAAM,MAAQ,SAAAX,EAAE,kBAAkB,EAAE,EAC1CL,GAACf,GAAA,CAAK,UAAW,SAAU,QAAS,SAAU,IAAK,EAChD,UAAAkJ,GACCpI,GAACgC,GAAA,CACC,UAAW,wBACX,QAAShC,GAAC+H,GAAA,EAAqB,EAE/B,SAAA/H,GAAC8F,GAAA,CACC,UAAW,qDACb,EACF,EAEF9F,GAACiB,GAAK,QAAL,CACC,KAAMiH,EACN,KAAM,MACN,UAAW,4BACX,cAAe,qCACf,GAAI,EACJ,QAAS,GAER,SAAAvC,EAAWwC,EAAiB,EAC/B,GACF,GACF,CAEJ,EInDA,OAAwB,WAAA9J,OAAe,QACvC,OAAS,mBAAAE,OAAuB,yBAChC,OAAS,qBAAA8J,OAAyB,yBAClC,OAAS,QAAAC,GAAM,kBAAA5J,OAAsB,wBACrC,OACE,gBAAA6J,GAEA,aAAA3J,GACA,aAAAC,GACA,gBAAAC,OACK,yBAEP,OACE,SAAA0J,GACA,UAAAzC,GACA,YAAAjG,GACA,MAAAd,GACA,WAAAC,GACA,QAAAC,EACA,QAAAuJ,GACA,wBAAAC,GACA,QAAAzH,EACA,gBAAA0H,OACK,sBACP,OAAS,WAAAjJ,GAAS,cAAAkJ,OAAkB,yBCxBpC,OAAS,QAAAN,OAAY,wBACrB,OACE,gBAAAC,GACA,cAAAM,GACA,aAAAjK,GACA,aAAAC,OACK,yBAWA,SAASiK,GAAWxE,EAGxB,CACD,GAAM,CAAE,WAAAyE,EAAY,eAAAC,CAAe,EAAI1E,EAEjC2E,EAAQ,CAACpK,GAAU,IAAKA,GAAU,GAAG,EAAE,SAASmK,CAAe,EAErE,OAAID,EACKA,IAAelK,GAAU,OAASoK,EAGpCA,CACT,CAEO,SAASC,GAAkB1E,EAAqB2E,EAAiB,CACtE,GACE,CAACZ,GAAa,cAAeA,GAAa,aAAa,EAAE,SAAS/D,CAAK,EAEvE,OAAO2E,IAASvK,GAAU,IAAMC,GAAU,IAAMA,GAAU,IAG5D,GAAI,CAAC0J,GAAa,OAAQA,GAAa,MAAM,EAAE,SAAS/D,CAAK,EAC3D,OAAO2E,IAASvK,GAAU,IAAMC,GAAU,IAAMA,GAAU,GAE9D,CAEO,SAASuK,GAAmB5E,EAAqB,CACtD,GAAI,CAAC+D,GAAa,cAAeA,GAAa,MAAM,EAAE,SAAS/D,CAAK,EAClE,OAAOqE,GAAW,IAGpB,GAAI,CAACN,GAAa,cAAeA,GAAa,MAAM,EAAE,SAAS/D,CAAK,EAClE,OAAOqE,GAAW,IAEtB,CAEO,SAASQ,GAA2BC,EAAa,CACtD,IAAMC,EAAOD,GAAQ,MAAM,MAAQ,CAAC,EAEpC,GAAIC,EAAK,OAAS,EAAG,CACnB,IAAMC,EAAaD,EAAK,OAClBE,EAAeF,EAAK,OAAQG,GAAaA,EAAI,OAAO,EAAE,OAG5D,OAAID,IAAiBD,EACZlB,GAAK,EAAE,yCAA0C,CACtD,MAAOkB,CACT,CAAC,EAICC,IAAiB,EACZnB,GAAK,EAAE,kCAAkC,EAI3CA,GAAK,EAAE,6CAA8C,CAC1D,aAAAmB,EACA,MAAOD,CACT,CAAC,CACH,CACF,CAEO,IAAMG,GAAcpG,GAClB,OAAO,MAAM,OAAOA,CAAG,CAAC,EAAI,EAAI,OAAOA,CAAG,EDnCtC,OAgIL,YAAAxD,GAhIK,OAAAC,EA4FP,QAAAC,MA5FO,oBAbN,IAAM2J,GAAsBzJ,GAAmC,CACpE,GAAM,CAAE,WAAAiB,EAAY,MAAAyI,EAAO,UAAArE,EAAW,SAAAsE,CAAS,EAAI3J,EAC7C,CAAE,MAAA+H,EAAO,SAAA6B,EAAU,QAAAC,CAAQ,EAAI5I,EAC/B,CAAE,KAAA6I,EAAM,WAAAlB,EAAY,eAAAC,EAAgB,MAAAkB,EAAO,OAAAzG,CAAO,EAAIoG,EACtD,CAAE,EAAAvJ,CAAE,EAAI5B,GAAe,EACvB,CAAC,CAAE,KAAMyL,CAAU,CAAC,EAAI9B,GAAkB5E,CAAM,EAEhD2G,EADWD,IAAY,CAAC,GACA,aAExB,CAACE,EAAGC,CAAc,EAAI/L,GAAgB,wBAAyB,EAAI,EAEnEgM,EAAqB,IACrBV,EAAM,gBAAkB/K,GAAa,KAChCkB,EAACiB,EAAA,CAAM,SAAAX,EAAE,wBAAwB,EAAE,EAErCN,EAACiB,EAAA,CAAM,SAAAX,EAAE,2BAA2B,EAAE,EAGzCkK,EAAc,IAAM,CACxB,GACEzB,IAAelK,GAAU,QACzBkK,IAAelK,GAAU,YAEzB,OAAOmB,EAACiB,EAAA,CAAK,UAAW,GAAK,SAAAX,EAAE,oBAAoB,EAAE,EAGvD,GAAIwI,GAAW,CAAE,WAAAC,EAAY,eAAAC,CAAe,CAAC,EAAG,CAC9C,IAAMyB,EAAU7B,GAAW,CACzB,KAAMI,EACN,KAAAiB,EACA,MAAAC,CACF,CAAC,EACKQ,GAAQ,CACZ,CAACnC,GAAa,aAAa,EAAGjI,EAAE,8BAA8B,EAC9D,CAACiI,GAAa,aAAa,EAAGjI,EAAE,8BAA8B,EAC9D,CAACiI,GAAa,MAAM,EAAGjI,EAAE,uBAAuB,EAChD,CAACiI,GAAa,MAAM,EAAGjI,EAAE,uBAAuB,CAClD,EAAEmK,CAAQ,EAEV,OAAOzK,EAACiB,EAAA,CAAK,UAAW,GAAK,SAAAyJ,GAAM,CACrC,CAEA,OACE1K,EAACiB,EAAK,QAAL,CACC,KAAMiH,EACN,KAAK,QACL,UAAU,yBACV,cAAc,qCACd,GAAI6B,EACJ,QAAS,GAER,SAAAF,EAAM,YACT,CAEJ,EAEMc,EAAkB,CAAC,CACvB,MAAAC,EACA,aAAAC,GACA,SAAAC,GACA,UAAAC,EACF,IAMOD,GAGD,CAACF,GACCC,GAEA7K,EAACiB,EAAA,CAAK,UAAU,4BACb,SAAAX,EAAE,oBAAoB,EACzB,EAKJN,EAACiB,EAAK,QAAL,CACC,KAAM,OACN,KAAM,QACN,UAAWjC,GACT,yBACA+L,KAAc,KAAO,wBAA0B,qBACjD,EACA,cAAe,qCACf,GAAIhB,EACJ,QAAS,GAER,SAAAa,EACH,EAxBO5K,EAACiB,EAAA,CAAK,UAAU,4BAA4B,mBAAO,EA4BxD+J,GAAgB,IAAM,CAC1B,GAAI,CAACZ,GAAe,CAACP,EAAM,eACzB,OAAO,KAET,IAAIoB,EAAM,IAAIvL,GAAQmK,EAAM,cAAc,EAC1C,OAAIA,EAAM,gBAAkB/K,GAAa,OACvCmM,EAAMA,EAAI,KAAK,IAAIvL,GAAQ0K,GAAe,CAAC,CAAC,GAG5CnK,EAACf,EAAA,CAAK,QAAS,UACb,UAAAc,EAACiB,EAAA,CACE,SAAA4I,EAAM,gBAAkB/K,GAAa,KAClCwB,EAAE,oBAAoB,EACtBA,EAAE,iBAAiB,EACzB,EACAN,EAACiB,EAAK,QAAL,CACC,KAAM,QACN,GAAI+I,EACJ,QAAS,GACT,UAAU,yBAET,SAAAiB,EAAI,SAAS,EAChB,GACF,CAEJ,EAEMC,EAAsB,IAAM,CAChC,GAAInC,IAAelK,GAAU,cAAe,CAC1C,GAAM,CAAE,gBAAAsM,EAAiB,eAAAC,GAAgB,cAAAC,EAAc,EAAIxB,EAErDyB,GAAeD,GACnBpL,EAACf,EAAA,CAAK,QAAS,UACb,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,yBAAyB,EAAE,EACpCL,EAACgB,EAAA,CAAK,UAAU,yBAA0B,UAAAoK,GAAc,KAAC,GAC3D,EAEArL,EAACuL,GAAA,CACC,MAAOjL,EAAE,0BAA0B,EACnC,MAAO8K,GACP,KAAMlD,EACN,GAAI6B,EACN,EAEF,OACE9J,EAAAF,GAAA,CACG,UAAAoL,GACCnL,EAACuL,GAAA,CACC,MAAOjL,EAAE,qBAAqB,EAC9B,MAAO6K,EACP,KAAMjD,EACN,GAAI6B,EACN,EAEDuB,IACH,CAEJ,CAEA,OACErL,EAAAF,GAAA,CACE,UAAAE,EAACf,EAAA,CAAK,QAAS,UACb,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,cAAc,EAAE,EACxBkK,EAAY,GACf,EACAxK,EAACuL,GAAA,CACC,MAAOjL,EAAE,iBAAiB,EAC1B,MAAOuJ,EAAM,MACb,KAAM3B,EACN,GAAI6B,EACN,GACF,CAEJ,EAEMyB,EACJvL,EAACf,EAAA,CAAK,QAAS,UACb,UAAAc,EAACiB,EAAK,UAAL,CAAe,KAAM,SAAU,SAAQ,GACrC,SAAA4I,EAAM,OACT,EACA5J,EAACf,EAAA,CAAK,QAAS,MAAO,KAAM,EAC1B,UAAAc,EAACyL,GAAA,CAAa,KAAM1C,EAAY,EAC/BkB,IAASrL,GAAU,IAClBoB,EAACwI,GAAA,CAAM,MAAO,MAAO,KAAM,KACxB,SAAAlI,EAAE,YAAY,EACjB,EAEAN,EAACwI,GAAA,CAAM,MAAO,OAAQ,KAAM,KACzB,SAAAlI,EAAE,aAAa,EAClB,GAEJ,GACF,EAGIoL,GACJzL,EAACf,EAAA,CAAK,QAAS,UACb,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,iBAAiB,EAAE,EAC5BN,EAACiB,EAAK,QAAL,CACC,KAAM,QACN,GAAI+I,EACJ,QAAS,GACT,UAAU,yBAET,SAAAH,EAAM,eACT,GACF,EAGI8B,GAAoB5C,IAAelK,GAAU,YAChDkK,IAAelK,GAAU,aAAegL,EAAM,gBAC/C7J,EAACuL,GAAA,CACC,MAAOjL,EAAE,gBAAgB,EACzB,MAAOuJ,EAAM,cACb,KAAM3B,EACN,GAAI6B,EACN,EAGI6B,GAAoB/B,EAAM,kBAC9BA,EAAM,mBACN5J,EAAAF,GAAA,CACE,UAAAC,EAACf,GAAA,CAAQ,UAAU,WAAW,EAC9BgB,EAAC,OACC,UAAW0I,GAAa,CACtB,KAAM,KACN,UAAW,GACX,UAAW,0DACb,CAAC,EAED,UAAA3I,EAACiB,EAAA,CAAK,UAAU,yBAA0B,SAAAsJ,EAAmB,EAAE,EAC9DS,GAAc,EAEf/K,EAACf,EAAA,CACC,UAAW,SACX,QAAS,UACT,UAAW,QACX,IAAK,EACL,UAAU,aAEV,UAAAe,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,qBAAqB,EAAE,EAC/BqK,EAAgB,CACf,MAAOd,EAAM,kBAAoB,GACjC,aAAc,GACd,SAAU,CAAC,CAACA,EAAM,iBAClB,UAAW,IACb,CAAC,GACH,EACA5J,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,mBAAmB,EAAE,EAC7BqK,EAAgB,CACf,MAAOd,EAAM,gBAAkB,GAC/B,aAAc,GACd,SAAU,CAAC,CAACA,EAAM,iBAClB,UAAW,IACb,CAAC,GACH,GACF,EAEA5J,EAACf,EAAA,CACC,UAAW,SACX,QAAS,UACT,UAAW,QACX,IAAK,EACL,UAAU,aAEV,UAAAe,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,qBAAqB,EAAE,EAC/BqK,EAAgB,CACf,MAAOd,EAAM,kBAAoB,GACjC,aAAc,GACd,SAAU,CAAC,CAACA,EAAM,iBAClB,UAAW,IACb,CAAC,GACH,EACA5J,EAACf,EAAA,CAAK,QAAS,UAAW,UAAU,aAClC,UAAAc,EAACiB,EAAA,CAAM,SAAAX,EAAE,mBAAmB,EAAE,EAC7BqK,EAAgB,CACf,MAAOd,EAAM,gBAAkB,GAC/B,aAAc,GACd,SAAU,CAAC,CAACA,EAAM,iBAClB,UAAW,IACb,CAAC,GACH,GACF,GACF,GACF,EAGIgC,GACJ5L,EAACf,EAAA,CAAK,KAAM,EAAG,GAAI,EAAG,GAAI,EACxB,UAAAc,EAACF,GAAA,CACC,GAAG,eACH,MAAO,QACP,gBAAkBW,GAAY,CAC5B6J,EAAe,CAAG7J,CAAO,CAC3B,EACF,EACAT,EAAC,SACC,QAAQ,eACR,UAAW2I,GAAa,CACtB,KAAM,KACN,UAAW,EACb,CAAC,EAEA,SAAArI,EAAE,gCAAgC,EACrC,GACF,EAGIwL,GACJ7L,EAACwI,GAAA,CAAK,KAAM,EAAG,KAAM,EACnB,UAAAzI,EAAC+F,GAAA,CAAO,MAAO,YAAa,KAAM,KAAM,QAAS,IAAM+D,EAAS,EAC7D,SAAAxJ,EAAE,eAAe,EACpB,EACAN,EAAC+F,GAAA,CAAO,KAAM,KAAM,QAAS,IAAMP,EAAU,EAC1C,SAAAlF,EAAE,gBAAgB,EACrB,GACF,EAGF,OACEL,EAAAF,GAAA,CACG,UAAAyL,EACDxL,EAACf,GAAA,CAAQ,UAAU,WAAW,EAE9BgB,EAAC,OACC,UAAW0I,GAAa,CACtB,KAAM,KACN,UAAW,GACX,UAAW,eACb,CAAC,EAEA,UAAA+C,GACAC,EAEAT,EAAoB,GACvB,EAECU,EAEAC,GAEAC,IACH,CAEJ,EASMP,GAAiCpL,GAAU,CAC/C,GAAM,CAAE,MAAA4L,EAAO,MAAAvH,EAAO,KAAAwH,EAAM,GAAAC,CAAG,EAAI9L,EACnC,OACEF,EAACf,EAAA,CAAK,QAAQ,UACZ,UAAAc,EAACiB,EAAA,CAAM,SAAA8K,EAAM,EACb/L,EAACiB,EAAK,QAAL,CACC,KAAM+K,EACN,KAAK,QACL,GAAIC,EACJ,QAAS,GACT,UAAU,yBACV,cAAc,qCAEb,SAAAzH,EACH,GACF,CAEJ,EAEAoF,GAAmB,YAAc,qBAEjC,IAAM6B,GAAgBtL,GAA+B,CACnD,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvBwN,EAAU7N,GAAQ,IAAM,CAC5B,OAAQ8B,EAAM,KAAM,CAClB,KAAKtB,GAAU,MACb,OAAO,EAAE,4BAA4B,EACvC,KAAKA,GAAU,OACb,OAAO,EAAE,oBAAoB,EAC/B,KAAKA,GAAU,WACb,OAAO,EAAE,gCAAgC,EAC3C,KAAKA,GAAU,YACb,OAAO,EAAE,iCAAiC,EAC5C,KAAKA,GAAU,cACb,OAAO,EAAE,mCAAmC,EAC9C,QACE,MAAO,EACX,CACF,EAAG,CAACsB,EAAM,IAAI,CAAC,EAEf,OACEH,EAACwI,GAAA,CAAM,MAAO,UAAW,KAAM,KAC5B,SAAA0D,EACH,CAEJ,EAEMC,GACJhM,GAKG,CACH,GAAM,CAAE,MAAAiM,EAAO,QAAAC,EAAS,OAAAC,EAAQ,GAAGC,CAAK,EAAIpM,EAE5C,OACEH,EAAC4J,GAAA,CACE,GAAG2C,EACJ,SAAU,IAAM,CACdD,EAAO,EACPF,EAAM,CACR,EACA,UAAW,IAAM,CACfC,EAAQ,EACRD,EAAM,CACR,EACF,CAEJ,EAEaI,GAAuB,eAEpC9D,GAAqB8D,GAAsBL,GAAQ,CACjD,KAAM,KACN,MAAO,IAAM7D,GAAK,EAAE,yBAAyB,CAC/C,CAAC,EE9cD,OAAa,QAAAmE,OAAY,QACzB,OAAS,kBAAA/N,OAAsB,wBAC/B,OAAS,gBAAAqF,OAAoB,sBAsCvB,cAAA/D,OAAA,oBA5BC,IAAM0M,GAAwCD,GAAMtM,GAAU,CACnE,GAAM,CAAE,CAAE,EAAIzB,GAAe,EAC7B,OACEsB,GAAC+D,GAAA,CACC,KAAM5D,EAAM,KACZ,MAAO,EAAE,yBAAyB,EAClC,SAAQ,GACR,aAAcA,EAAM,aACpB,KAAK,KACL,QAAS,CACP,QAAS,CACP,MAAO,EAAE,0BAA0B,EACnC,UAAW,qDACX,QAAS,KACPA,EAAM,UAAU,EACT,QAAQ,QAAQ,EAE3B,EACA,UAAW,CACT,MAAO,EAAE,eAAe,EACxB,UAAW,qDACX,QAAS,KACPA,EAAM,aAAa,EAAK,EACjB,QAAQ,QAAQ,EAE3B,CACF,EAEA,SAAAH,GAAC,OAAI,UAAU,8BACZ,WAAE,qCAAsC,CACvC,OAAQ,GAAGG,EAAM,MAAM,IAAIA,EAAM,IAAI,EACvC,CAAC,EACH,EACF,CAEJ,CAAC,EC/CD,OAAS,cAAA6D,GAAsB,WAAA3F,OAAe,QAC9C,OAAS,kBAAAK,OAAsB,wBAC/B,OAAS,aAAAE,OAAiB,yBAC1B,OACE,UAAAmH,GACA,QAAA7G,GACA,QAAAuJ,GACA,aAAAkE,GACA,MAAA3N,GACA,SAAAwJ,GACA,aAAAoE,GACA,WAAA5K,GACA,QAAAf,OACK,sBAsCO,cAAAjB,EASE,QAAAC,OATF,oBAzBP,IAAM4M,GAAsB1M,GAAmC,CACpE,GAAM,CAAE,MAAA0J,EAAO,WAAAzI,EAAY,WAAA0L,EAAY,SAAAC,EAAU,UAAAC,EAAW,cAAAC,CAAc,EACxE9M,EACI,CAAE,KAAA+M,EAAM,MAAAhF,EAAO,QAAA8B,EAAS,SAAAD,CAAS,EAAI3I,EACrC,CAAE,EAAAd,CAAE,EAAI5B,GAAe,EAEvBoL,EAAW,IAAM,CACrB3J,EAAM,OAAO,EACbA,EAAM,QAAQ,CAChB,EAEMqF,EAAY,IAAM,CACtBrF,EAAM,QAAQ,EACdA,EAAM,QAAQ,CAChB,EAEMgN,EAAU9O,GAAQ,IACf,CACL,CACE,MAAOiC,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,IACP,OAAQ,CAACkE,EAAe4I,IAEpBnN,GAACf,GAAA,CAAK,IAAK,EACT,UAAAc,EAAC,OACC,UAAWhB,GACT,sDACAoO,EAAO,OAASxO,GAAU,IACtB,sBACA,mBACN,EACF,EACAqB,GAACf,GAAA,CAAK,UAAU,SAAS,UAAU,QACjC,UAAAe,GAACf,GAAA,CAAK,KAAM,EACV,UAAAc,EAAC4M,GAAA,CAAU,OAAQpI,EAAO,UAAU,aAAa,EACjDxE,EAACiB,GAAK,UAAL,CACC,KAAK,SACL,KAAK,KACL,aAAa,YAEZ,SAAAuD,EACH,GACF,EAEAxE,EAACwI,GAAA,CAAM,MAAM,UAAU,KAAK,KACzB,SAAAlI,EAAE,4BAA4B,EACjC,GACF,GACF,CAGN,EACA,CACE,MAAOA,EAAE,iBAAiB,EAC1B,UAAW,iBACX,MAAO,IACP,OAAQ,CAACkE,EAAe4I,IAEpBpN,EAACiB,GAAK,QAAL,CACC,KAAK,QACL,GAAI+I,EACJ,QAAS,GACT,MAAOoD,EAAO,OAASxO,GAAU,IAAM,MAAQ,OAE9C,SAAA4F,EACH,CAGN,EACA,CACE,MAAOlE,EAAE,mBAAmB,EAC5B,UAAW,cACX,MAAO,IACP,OAAQ,CAACkE,EAAe4I,IAAgB,CAGtC,IAAMC,EAAc,CAAC,EAAED,EAAO,OAASxO,GAAU,IAC7CoO,IAAY,CAAC,GAAK,OAAOxI,CAAK,GAAKwI,IAAY,CAAC,EAChDA,IAAY,CAAC,GAAK,OAAOxI,CAAK,GAAKwI,IAAY,CAAC,GAEpD,OACE/M,GAACf,GAAA,CAAK,KAAM,EACV,UAAAc,EAACiB,GAAK,QAAL,CAAa,KAAK,QAAQ,GAAI8I,EAC5B,SAAAvF,EACH,EAEC6I,GACCrN,EAACgC,GAAA,CACC,QAAS1B,EACP,kDACF,EACA,UAAU,yEAEV,SAAAN,EAACsN,GAAA,CAAY,UAAU,0BAA0B,EACnD,GAEJ,CAEJ,CACF,CACF,EACC,CAAChN,EAAGc,EAAY4L,EAAWhD,EAASD,CAAQ,CAAC,EAEhD,OACE9J,GAAC,OAAI,UAAU,oBACb,UAAAD,EAAC2M,GAAA,CACC,WAAY,CACV,KAAM3N,GACJ,gBACA,iBAEA,sBAGA6K,EAAM,QAAQ,QAAU,GAAK,eAC/B,EAEA,OAAQ,oBACV,EACA,WAAYiD,EACZ,QAASK,EACT,SAAQ,GACR,MAAO,KACE,CACL,UAAWnO,GAAG,cAAc,CAC9B,GAEJ,EACAiB,GAAC,OAAI,UAAU,iCACb,UAAAA,GAACf,GAAA,CAAK,QAAQ,UACZ,UAAAc,EAACiB,GAAA,CAAM,SAAAX,EAAE,wBAAwB,EAAE,EACnCN,EAACiB,GAAA,CAAK,UAAW,GAAK,SAAA4I,EAAM,QAAQ,OAAO,GAC7C,EAEA5J,GAACf,GAAA,CAAK,QAAQ,UAAU,GAAI,EAC1B,UAAAc,EAACiB,GAAA,CAAM,SAAAX,EAAE,0BAA0B,EAAE,EACrCN,EAACiB,GAAK,QAAL,CACC,KAAK,QACL,KAAMiM,EACN,GAAIlD,EACJ,QAAS,GACT,UAAW,GACX,cAAe,qCAEd,SAAAiD,EACH,GACF,EAEAhN,GAACf,GAAA,CAAK,QAAQ,UAAU,GAAI,EAC1B,UAAAc,EAACiB,GAAA,CAAM,SAAAX,EAAE,iBAAiB,EAAE,EAC5BN,EAACiB,GAAK,QAAL,CACC,KAAK,QACL,KAAMiH,EACN,GAAI6B,EACJ,QAAS,GACT,UAAW,GACX,cAAe,qCAEd,SAAAgD,EACH,GACF,GACF,EAEA9M,GAACwI,GAAA,CAAK,KAAM,EAAG,KAAM,EACnB,UAAAzI,EAAC+F,GAAA,CAAO,MAAO,YAAa,KAAM,KAAM,QAAS+D,EAC9C,SAAAxJ,EAAE,eAAe,EACpB,EACAN,EAAC+F,GAAA,CAAO,KAAM,KAAM,QAASP,EAC1B,SAAAlF,EAAE,gBAAgB,EACrB,GACF,GACF,CAEJ,EAEagN,GAActJ,GACzB,CAAC7D,EAAOmC,IAEJtC,EAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,eACL,MAAM,6BACN,IAAKsC,EACJ,GAAGnC,EAEJ,SAAAH,EAAC,QAAK,EAAE,yoBAAyoB,EACnpB,CAGN,EC1NA,OAAS,WAAA3B,OAAe,QAExB,OAAS,WAAAqB,GAAS,QAAAuH,OAAY,yBCF9B,OAAS,aAAA9I,GAAW,YAAAG,OAAgB,QACpC,OAAS,wBAAAiP,GAAsB,mBAAAC,OAAuB,yBAE/C,SAASC,IAAe,CAC7B,IAAMC,EAAKF,GAAgB,EAErB,CAACR,EAAWW,CAAY,EAAIrP,GAA2B,CAAC,EAAG,CAAC,CAAC,EAE7DsP,EAAoBL,GAAsBpG,GAAc,CAC5D,IAAM0G,EAAO1G,EAAK,OAAOA,EAAK,KAAK,OAAS,CAAC,IAAI,CAAC,EAC5C2G,EAAO3G,EAAK,OAAO,CAAC,IAAI,CAAC,EAC/BwG,EAAa,CAACE,EAAMC,CAAI,CAAC,CAC3B,EAAG,GAAG,EAEN,OAAA3P,GAAU,KACRuP,EAAG,GAAG,mBAAoBE,CAAiB,EACpC,IAAM,CACXF,EAAG,IAAI,mBAAoBE,CAAiB,EAC5CA,EAAkB,OAAO,CAC3B,GACC,CAACA,CAAiB,CAAC,EAEfZ,CACT,CDPO,SAASe,GACdzJ,EACA,CACA,GAAM,CAAE,MAAAuF,EAAO,WAAAzI,CAAW,EAAIkD,EACxB0J,EAASnE,EAAM,OAEfmD,EAAYS,GAAa,EAEzBV,EAAW1O,GAAQ,IACN2P,EAAO,OAAO,CAACC,EAAKpE,IAC5BoE,EAAI,IAAI,IAAIvO,GAAQmK,EAAM,WAAW,EAAE,IAAIA,EAAM,cAAc,CAAC,EACtE5C,EAAI,EAES,SAAS,EACxB,CAAC+G,CAAM,CAAC,EAELf,EAAgB5O,GAAQ,IACN2P,EAAO,OAAO,CAACC,EAAKpE,IACjCoE,EAAI,IAAI,IAAIvO,GAAQmK,EAAM,cAAc,CAAC,EAC/C5C,EAAI,EAEc,SAAS,EAC7B,CAAC+G,EAAQ5M,EAAW,OAAO,CAAC,EAE/B,MAAO,CAAE,WAAY4M,EAAQ,SAAAjB,EAAU,UAAAC,EAAW,cAAAC,CAAc,CAClE,CExCA,OAAS,QAAA3E,OAAY,wBACrB,OAAS,wBAAAI,OAA4B,sBAc5B,cAAA1I,OAAA,oBALF,IAAMkO,GACX/N,GACG,CACH,IAAM6H,EAAQ+F,GAA4B5N,CAAK,EAE/C,OAAOH,GAAC6M,GAAA,CAAoB,GAAG1M,EAAQ,GAAG6H,EAAO,CACnD,EAEamG,GAA6B,qBAE1CzF,GAAqByF,GAA4BD,GAA0B,CACzE,KAAM,KACN,MAAO,IAAM5F,GAAK,EAAE,+BAA+B,EACnD,aAAc,CAEd,CACF,CAAC,EC3BD,OAAS,kBAAA5J,OAAsB,wBAC/B,OAAuB,aAAAE,OAA4B,yBACnD,OAAS,UAAAmH,GAAQ,MAAA/G,OAAU,sBCF3B,OAAS,WAAAX,OAAe,QACxB,OAAS,kBAAAK,OAAsB,wBAC/B,OAAS,aAAAE,GAAW,aAAAC,MAAiB,yBACrC,OAAS,UAAAuP,GAAQ,QAAAnN,OAAY,sBA4DZ,cAAAjB,OAAA,oBA1DV,IAAMqO,GAAmBlO,GAK1B,CACJ,GAAM,CAAE,CAAE,EAAIzB,GAAe,EAEvB4F,EAAUjG,GAAQ,IACf,CACL,CAAE,MAAO,EAAE,iCAAiC,EAAG,MAAOQ,EAAU,KAAM,EACtE,CAAE,MAAO,EAAE,kCAAkC,EAAG,MAAOA,EAAU,MAAO,EACxE,CACE,MAAO,EAAE,gCAAgC,EACzC,MAAOA,EAAU,UACnB,EACA,CACE,MAAO,EAAE,iCAAiC,EAC1C,MAAOA,EAAU,WACnB,EACA,CACE,MAAO,EAAE,kCAAkC,EAC3C,MAAOA,EAAU,MACnB,EACA,CACE,MAAO,EAAE,mCAAmC,EAC5C,MAAOA,EAAU,aACnB,CACF,EACC,CAAC,CAAC,CAAC,EAEAyP,EAAkBjQ,GAAQ,KACvB,CACL,CAACQ,EAAU,KAAK,EAAG,EAAE,4BAA4B,EACjD,CAACA,EAAU,MAAM,EAAG,EAAE,oBAAoB,EAC1C,CAACA,EAAU,UAAU,EAAG,EAAE,gCAAgC,EAC1D,CAACA,EAAU,WAAW,EAAG,EAAE,iCAAiC,EAC5D,CAACA,EAAU,MAAM,EAAG,EAAE,kCAAkC,EACxD,CAACA,EAAU,aAAa,EAAG,EAAE,mCAAmC,CAClE,GACC,CAAC,CAAC,CAAC,EAEN,OACEmB,GAACoO,GAAO,QAAP,CACC,OAAO,yCACP,aAAcjO,EAAM,KACpB,MAAOA,EAAM,KACb,QAASmE,EACT,cAAenE,EAAM,SACrB,aAAc,CACZ,UAAW,eACb,EACA,WAAY,CACV,QAAS,+BACX,EACA,eAAgB,CAACqE,EAAO+J,IAAW,CAEjC,GAAI,CADSjK,EAAQ,KAAMkK,GAAMA,EAAE,QAAUhK,CAAK,EAEhD,OAAOxE,GAACiB,GAAA,CAAK,KAAM,KAAO,SAAAsN,EAAO,YAAY,EAG/C,IAAM7D,EAAQ4D,EAAgB9J,CAAqC,EAEnE,OACExE,GAACiB,GAAA,CACC,KAAM,KACN,MACEd,EAAM,SACFA,EAAM,OAASvB,GAAU,IACvB,MACA,OACF,OAGL,SAAA8L,EACH,CAEJ,EACA,KAAM,KACR,CAEJ,ECtFA,OAAS,qBAAA+D,OAAyB,yBAElC,OAAS,MAAAzP,GAAI,QAAAE,GAAM,SAAAC,GAAO,QAAA8B,GAAM,aAAAzB,OAAiB,sBACjD,OACE,0BAAAkP,GACA,yBAAAC,OACK,+BACP,OAAS,WAAAjP,OAAe,yBAyBpB,OAWE,OAAAM,GAXF,QAAAC,OAAA,oBAjBG,IAAM2O,GAAiBzO,GAA8B,CAC1D,GAAM,CAAE,OAAAsD,EAAQ,KAAAwG,EAAM,eAAA4E,CAAe,EAAI1O,EACnC,CAAE,SAAA4C,CAAS,EAAIvD,GAAU,EACzB,CAAE,YAAAsP,CAAY,EAAIL,GAAkBhL,CAAM,EAE1CsL,EAAcF,GAAkBC,EAEhCE,EAAY,IAAM,CACtB,IAAMC,EAAUlM,EAAW4L,GAAwBD,GACnDvP,GAAM,KAAK8P,EAAS,CAClB,OAAAxL,EACA,KAAAwG,EACA,YAAA8E,CACF,CAAC,CACH,EAEA,OACE9O,GAACf,GAAA,CACC,QAAQ,SACR,UAAU,SACV,KAAM,EACN,UAAWF,GACT,UACA,uDACA,4FACF,EACA,QAASgQ,EAET,UAAAhP,GAACiB,GAAA,CAAK,iBAAK,EACXjB,GAACiB,GAAK,QAAL,CAAa,GAAI,EAAG,GAAIvB,GAAQ,WAAY,KAAK,IAC/C,SAAAqP,EACH,GACF,CAEJ,EF7BI,mBAAAhP,GAOI,OAAAC,GANF,QAAAC,OADF,oBALG,SAASiP,GAAiB/O,EAA8B,CAC7D,GAAM,CAAE,SAAAwF,EAAU,KAAAsE,EAAM,WAAAlB,EAAY,cAAAoG,CAAc,EAAIhP,EAChD,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EAE7B,OACEuB,GAAAF,GAAA,CACE,UAAAE,GAAC,OACC,UAAWjB,GACT,4EACA,iBACF,EAEA,UAAAgB,GAAC+F,GAAA,CACC,QAAS,IAAM,CACb5F,EAAM,cAAc,OAAQvB,GAAU,GAAG,CAC3C,EACA,KAAM,KACN,UAAS,GACT,YAAWA,GAAU,IACrB,UAAWI,GACTiL,IAASrL,GAAU,KAAO+G,EACtB,uFACA,kFACN,EACA,cAAY,wCAEX,SAAArF,EAAE,YAAY,EACjB,EACAN,GAAC+F,GAAA,CACC,QAAS,IAAM,CACb5F,EAAM,cAAc,OAAQvB,GAAU,IAAI,CAC5C,EACA,YAAWA,GAAU,KACrB,UAAS,GACT,KAAM,KACN,UAAWI,GACTiL,IAASrL,GAAU,MAAQuB,EAAM,SAC7B,oFACA,kFACN,EACA,cAAY,yCAEX,SAAAG,EAAE,aAAa,EAClB,GACF,EACAL,GAAC,OACC,UAAWjB,GACT,sDACA,iBACF,EAEA,UAAAgB,GAAC,OAAI,UAAU,aACb,SAAAA,GAACqO,GAAA,CACC,KAAMtF,EACN,KAAMkB,EACN,SAAUtE,EACV,SAAWnF,GAAS,CAClB2O,EAAc,aAAc3O,CAAI,CAClC,EACF,EACF,EACAR,GAAC,OAAI,UAAU,aACb,SAAAA,GAAC4O,GAAA,CACC,OAAQzO,EAAM,OACd,KAAMA,EAAM,KACZ,eAAgBA,EAAM,eACxB,EACF,GACF,GACF,CAEJ,CGtFA,OAAgC,WAAA9B,OAAe,QCA/C,OACE,iBAAA+Q,GAEA,cAAAC,OAGK,QA2BA,IAAMC,GAAoBF,GAC/B,CAAC,CACH,EAEaG,EAAuB,IAC3BF,GAAWC,EAAiB,EDyBjC,cAAAtP,OAAA,oBA5DG,IAAMwP,GAERrP,GAAU,CACb,GAAM,CACJ,gBAAAsP,EACA,WAAArO,EACA,QAAAsO,EACA,OAAAC,EACA,YAAAnO,EACA,cAAA2N,EACA,eAAAS,EACA,kBAAAC,EACA,OAAAtO,EACA,cAAAuO,EACA,uBAAAC,EACA,qBAAAC,EACA,uBAAAC,EACA,sBAAAC,EACA,SAAAC,CACF,EAAIhQ,EAEEiQ,EAAgB/R,GAAgC,KAC7C,CACL,gBAAAoR,EACA,WAAArO,EACA,QAAAsO,EACA,OAAAC,EACA,YAAAnO,EACA,cAAA2N,EACA,eAAAS,EACA,kBAAAC,EACA,OAAAtO,EAEA,cAAAuO,EACA,uBAAAC,EACA,qBAAAC,EACA,uBAAAC,EACA,sBAAAC,EACA,SAAAC,CACF,GACC,CACDV,EACArO,EACAsO,EACAC,EACAnO,EACA2N,EACAS,EACAC,EACAtO,EAEAuO,EACAC,EACAC,EACAC,EACAC,EACAC,CACF,CAAC,EAED,OACEnQ,GAACsP,GAAkB,SAAlB,CAA2B,MAAOc,EAChC,SAAAjQ,EAAM,SACT,CAEJ,EEnEA,OAAuB,aAAAtB,OAAiB,yBCCxC,OAAS,kBAAAH,OAAsB,wBAC/B,OAAS,aAAAG,OAAiB,yBAC1B,OAAS,MAAAG,GAAI,kBAAAoF,OAAsB,sBCHnC,OAAS,cAAAJ,OAAgD,QACzD,OAAS,cAAAqM,OAAkB,yBAC3B,OAAS,MAAArR,GAAI,kBAAAoF,GAAgB,SAAAD,OAAyB,sBAyC1C,cAAAnE,OAAA,oBAlBL,IAAMsQ,EAActM,GACzB,CAAC7D,EAAOmC,IAAQ,CACd,GAAM,CAAE,YAAAiO,EAAc,GAAI,EAAIpQ,EACxB,CAAE,gBAAAsP,CAAgB,EAAIF,EAAqB,EAEjD,OACEvP,GAACmE,GAAM,QAAN,CACC,IAAK7B,EACL,QAASmN,EAAkBtP,EAAM,MAAQ,OACzC,aAAc,MACd,UAAWA,EAAM,UACjB,KAAM,KACN,YAAaA,EAAM,SAAW,GAAKoQ,EACnC,GAAIpQ,EAAM,GACV,KAAMA,EAAM,KACZ,MAAOA,EAAM,MAAQ,SAAW,OAChC,OACEA,EAAM,QACJH,GAACwQ,GAAA,CAAW,GAAIrQ,EAAM,GAAI,UAAWA,EAAM,YAAY,OACpD,SAAAA,EAAM,MACT,EAGJ,OAAQA,EAAM,OACd,MAAOA,EAAM,SAAW,GAAKA,EAAM,OAAS,GAE5C,cAAeA,EAAM,SACrB,QAAUsQ,GAAU,CAClBtQ,EAAM,UAAUsQ,CAAK,CACvB,EACA,OAASA,GAAU,CACjBtQ,EAAM,SAASsQ,CAAK,CACtB,EACA,WACEtQ,EAAM,oBAAsB,CAC1B,GAAIA,EAAM,YAAckQ,GACxBjM,GAAe,gBACfA,GAAe,kBACfA,GAAe,qBACjB,EAEF,WAAY,CACV,KAAMpF,GACJ,mLACAmB,EAAM,UACNA,EAAM,YAAY,IACpB,EACA,MAAOnB,GAAG,4BAA6BmB,GAAO,YAAY,KAAK,EAE/D,OAAQnB,GACN,uGACAmB,EAAM,YAAY,MACpB,CACF,EACA,SAAUA,EAAM,SAClB,CAEJ,CACF,EAEAmQ,EAAY,YAAc,cAE1B,IAAME,GACJrQ,GAGEH,GAAC,SACC,QAASG,EAAM,GACf,UAAWnB,GACT,+EACAmB,EAAM,SACR,EAEC,SAAAA,EAAM,SACT,ECnGJ,OAAwB,WAAA9B,OAAe,QACvC,OAAS,kBAAAK,OAAsB,wBAC/B,OAAS,gBAAA6J,OAAoB,yBAC7B,OAAS,OAAAxJ,GAAK,UAAAqP,GAAQ,QAAAnN,OAAY,sBAmDtB,cAAAjB,OAAA,oBAjDL,IAAM0Q,GAAsBvQ,GAI7B,CACJ,GAAM,CAAE,CAAE,EAAIzB,GAAe,EAEvB4F,EAAUjG,GACd,IAAM,CACJ,CACE,MAAO,EAAE,8BAA8B,EACvC,MAAOkK,GAAa,aACtB,EACA,CACE,MAAO,EAAE,8BAA8B,EACvC,MAAOA,GAAa,aACtB,EACA,CACE,MAAO,EAAE,uBAAuB,EAChC,MAAOA,GAAa,MACtB,EACA,CACE,MAAO,EAAE,uBAAuB,EAChC,MAAOA,GAAa,MACtB,CACF,EACA,CAAC,CACH,EAEA,OACEvI,GAACoO,GAAO,QAAP,CACC,OAAO,6CACP,aAAcjO,EAAM,MACpB,MAAOA,EAAM,MACb,QAASmE,EACT,cAAenE,EAAM,SACrB,aAAc,CACZ,UAAW,2BACX,MAAOA,EAAM,YACf,EACA,KAAM,KACN,WAAY,CACV,QAAS,oCACX,EACA,eAAgB,CAACqE,EAAO+J,IAAW,CACjC,IAAMtJ,EAAOX,EAAQ,KAAMW,GAASA,EAAK,QAAUT,CAAK,EAExD,OACExE,GAACjB,GAAA,CACC,SAAAiB,GAACiB,GAAA,CAAK,KAAK,KAAM,SAAAgE,GAAM,MAAM,EAC/B,CAEJ,EACF,CAEJ,EC5DA,OAAS,kBAAAvG,OAAsB,wBAC/B,OAAS,QAAAQ,GAAM,MAAAF,GAAI,SAAAG,GAAO,QAAA8B,OAAY,sBAwBhC,OAoBY,OAAAjB,GApBZ,QAAAC,OAAA,oBAXC,IAAM0Q,GAAoBxQ,GAAiC,CAChE,GAAM,CAAE,MAAA+H,EAAO,IAAA0I,EAAK,gBAAAC,CAAgB,EAAI1Q,EAClC,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EAE7B,OACEuB,GAACf,GAAA,CACC,UAAU,SACV,UAAU,MACV,UAAWF,GAAG,2CAA4C,cAAc,EAEvE,UAAAkJ,EACDjI,GAACf,GAAA,CAAK,QAAS,MAAO,UAAU,SAAS,IAAK,EAC5C,UAAAc,GAACd,GAAA,CACC,GAAI,EACJ,OAAQ,GACR,QAAQ,SACR,UAAU,SACV,EAAE,OACF,UAAWF,GACT,6DACA4R,EAAI,iBACA,qBACA,qBACJA,EAAI,wBAAoC,wBAC1C,EACA,QAAS,IAAM,CACTA,EAAI,uBACNzR,GAAM,OAAO,CACX,MAAOmB,EAAE,aAAa,EACtB,KAAM,KACN,QACEN,GAACiB,GAAA,CAAK,UAAW,GACd,SAAAX,EAAE,8BAA8B,EACnC,CAEJ,CAAC,EAEDsQ,EAAI,UAAU,CAElB,EAEA,SAAA5Q,GAACiB,GAAA,CACC,UAAWjC,GACT4R,EAAI,kBAA8B,mBAClCA,EAAI,mBAA+B,4BACnCA,EAAI,wBACF,2BACJ,EAEC,SAAAtQ,EAAE,gBAAgB,EACrB,EACF,EACAN,GAACiB,GAAA,CACC,UAAWjC,GACT,kBACA,qCACF,EACA,QAAS6R,EACV,eAED,GACF,GACF,CAEJ,EHnCM,cAAA7Q,GAUF,QAAAC,OAVE,oBAnBC,IAAM6Q,GAAmC3Q,GAAU,CACxD,GAAM,CAAE,IAAAyQ,CAAI,EAAIzQ,EACV,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EACvB,CACJ,WAAA0C,EACA,QAAAsO,EACA,OAAAC,EACA,YAAAnO,EACA,cAAA2N,EACA,cAAAW,EACA,uBAAAC,CACF,EAAIR,EAAqB,EAEnB,CAAE,MAAArH,EAAO,SAAA6B,CAAS,EAAI3I,EAEtB2P,EAAWH,EAAI,iBAEfI,EACJ7Q,EAAM,aAAetB,GAAU,MAC7BmB,GAAC2Q,GAAA,CACC,MAAOzI,EACP,IAAK0I,EACL,gBAAiBzQ,EAAM,gBACzB,EAEA+H,EAGJ,OACEjI,GAAC,OACC,IAAK8P,EACL,UAAU,oCAEV,UAAA/P,GAACsQ,EAAA,CACC,GAAG,oBACH,KAAK,oBACL,MAAOhQ,EAAE,cAAc,EACvB,OAAQ0Q,EACR,MAAO7Q,EAAM,YACb,SAAWwC,GAAM,CACfwM,EAAc,cAAexM,CAAC,CAChC,EACA,MAAOnB,EAAY,aAAa,EAChC,WAAY,CAAC4C,GAAe,YAAY2F,CAAQ,CAAC,EACjD,QAAS2F,GAAuB,EAChC,OAAQC,GAAsB,EAC9B,SAAUoB,EACV,IAAKjB,EACL,WAAY,CACV,KAAM9Q,GAAG+R,GAAY,uCAAuC,EAC5D,MAAO/R,GAAG+R,GAAY,iBAAiB,CACzC,EACF,EACCH,EAAI,kBACH5Q,GAAC,OAAI,UAAWhB,GAAG,sCAAsC,EACvD,SAAAgB,GAAC0Q,GAAA,CACC,MAAOE,EAAI,QACX,SAAUA,EAAI,YACd,aAAc,CACZ,MAAOzQ,EAAM,wBACf,EACF,EACF,GAEJ,CAEJ,EI1FA,OAAa,QAAAsM,OAAY,QACzB,OAAS,QAAAhE,OAAY,sBCDrB,OAAa,QAAAgE,OAAY,QACzB,OAAS,kBAAA/N,OAAsB,wBAC/B,OAAS,kBAAA0F,OAAsB,sBAkB3B,cAAApE,OAAA,oBATG,IAAMiR,GAAwCxE,GAAMtM,GAAU,CACnE,GAAM,CAAE,CAAE,EAAIzB,GAAe,EAEvB,CAAE,WAAA0C,EAAY,QAAAsO,EAAS,OAAAC,EAAQ,YAAAnO,EAAa,cAAA2N,CAAc,EAC9DI,EAAqB,EAEjB,CAAE,KAAArC,EAAM,QAAAlD,CAAQ,EAAI5I,EAE1B,OACEpB,GAACsQ,EAAA,CACC,GAAG,uBACH,KAAK,uBACL,MAAO,EAAE,YAAY,EACrB,OAAQpD,EACR,MAAO1L,EAAY,gBAAgB,EACnC,MAAOrB,EAAM,eACb,SAAWwC,GAAM,CACfwM,EAAc,iBAAkBxM,CAAC,CACnC,EACA,WAAY,CAACyB,GAAe,YAAY4F,CAAO,CAAC,EAChD,QAAS0F,GAA0B,EACnC,OAAQC,GAAyB,EACjC,UAAU,iBACV,WAAY,CACV,OAAQ,iBACV,EACF,CAEJ,CAAC,EAEDsB,GAAc,YAAc,gBCzC5B,OAAa,QAAAxE,GAAM,aAAAtO,GAAW,YAAAG,OAAgB,QAC9C,OAAS,mBAAAC,OAAuB,yBAChC,OAAS,kBAAAG,OAAsB,wBAC/B,OAAS,kBAAA0F,OAAsB,sBAC/B,OAAS,WAAA1E,OAAe,yBCJxB,OAAa,QAAA+M,GAAM,WAAApO,OAAe,QAClC,OAAS,kBAAAK,OAAsB,wBAC/B,OAAS,MAAAM,GAAI,UAAAoP,OAAc,sBA6BvB,cAAApO,OAAA,oBAjBG,IAAMkR,GAA4CzE,GAAMtM,GAAU,CACvE,GAAM,CAAE,CAAE,EAAIzB,GAAe,EAEvB4F,EAAUjG,GAAQ,IACf,CACL,CACE,MAAO,EAAE,sBAAsB,EAC/B,MAAO,WACT,EACA,CACE,MAAO,EAAE,0BAA0B,EACnC,MAAO,eACT,CACF,EACC,CAAC,CAAC,CAAC,EAEN,OACE2B,GAACoO,GAAO,QAAP,CACC,KAAM,KACN,MAAOjO,EAAM,MACb,eAAgB,CAACqE,EAAO+J,IACTjK,EAAQ,KAAMkK,GAAMA,EAAE,QAAUhK,CAAK,GACrC,MAAQ,SAEvB,WAAY,CACV,QAASxF,GACP,gDACA,8EACF,CACF,EACA,cAAemB,EAAM,SACrB,QAASmE,EACX,CAEJ,CAAC,EAED4M,GAAgB,YAAc,kBDSb,cAAAlR,OAAA,oBAxCV,IAAMmR,GAAkC1E,GAAMtM,GAAU,CAC7D,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAAE,MAAA0S,CAAM,EAAIjR,EAEZ,CAACkR,EAAQC,CAAS,EAAIhT,GAAS,EAAE,EAEjC,CACJ,WAAA8C,EACA,QAAAsO,EACA,OAAAC,EACA,YAAAnO,EACA,cAAA2N,EACA,SAAAgB,EAAW,EACX,kBAAAN,CACF,EAAIN,EAAqB,EAEnB,CAAE,MAAArH,CAAM,EAAI9G,EAEZ,CAACmQ,EAAWC,CAAY,EAAIjT,GAChC,sCAEF,EAEAJ,GAAU,IAAM,CACd,GAAIiT,GACF,GAAIvB,IAAsB,EAAkB,CAC1C,IAAMwB,EAAS,IAAI3R,GAAQ0R,CAAK,EAAE,IAAIjB,CAAQ,EAAE,KAAK,CAAC,EAAE,SAAS,EACjEmB,EAAUD,CAAM,CAClB,OAEAC,EAAU,EAAE,CAEhB,EAAG,CAACF,EAAOjB,EAAUN,CAAiB,CAAC,EAEvC,IAAM4B,EAAkBlO,GAAgB,CACtC,IAAM6N,EAAQ7N,EAAM,IAAI7D,GAAQ6D,CAAG,EAAE,IAAI4M,CAAQ,EAAE,SAAS,EAAI,GAChEhB,EAAc,QAASiC,CAAK,EAC5BE,EAAU/N,CAAG,CACf,EAEMmO,EAAS1R,GAACkR,GAAA,CAAgB,MAAOK,EAAW,SAAUC,EAAc,EAE1E,OAAID,oBAEAvR,GAACsQ,EAAA,CACC,GAAG,qBACH,KAAK,qBACL,MAAO,GAAG,EAAE,0BAA0B,CAAC,SACvC,OAAQoB,EACR,OAAQxJ,EACR,MAAO1G,EAAY,OAAO,EAAI,uBAAyB,GACvD,MAAO6P,EACP,SAAUI,EAEV,WAAY,CAACrN,GAAe,YAAY,CAAC,CAAC,EAC1C,QAASsL,GAAwB,EACjC,OAAQC,GAAuB,EAC/B,UAAU,iBACV,WAAY,CACV,OAAQ,iBACV,EACF,EAKF3P,GAACsQ,EAAA,CACC,GAAG,oBACH,KAAK,oBACL,MAAO,GAAG,EAAE,sBAAsB,CAAC,SACnC,OAAQoB,EACR,OAAQxJ,EACR,MAAO1G,EAAY,OAAO,EAC1B,MAAOrB,EAAM,MACb,SAAWoD,GAAQ,CACjB4L,EAAc,QAAS5L,CAAG,CAC5B,EACA,UAAU,iBACV,WAAY,CACV,OAAQ,iBACV,EAEA,WAAY,CAACa,GAAe,YAAY,CAAC,CAAC,EAC1C,QAASsL,GAAuB,EAChC,OAAQC,GAAsB,EAChC,CAEJ,CAAC,EAEDwB,GAAW,YAAc,aFhGrB,OACE,OAAAnR,GADF,QAAAC,OAAA,oBAFG,IAAM0R,GAA8ClF,GAAMtM,GAE7DF,GAACwI,GAAA,CAAK,KAAM,EAAG,UAAU,0BACvB,UAAAzI,GAACiR,GAAA,CAAc,eAAgB9Q,EAAM,eAAgB,EACrDH,GAACmR,GAAA,CAAW,MAAOhR,EAAM,MAAO,GAClC,CAEH,EAEDwR,GAAiB,YAAc,mBInB/B,OAAS,oBAAAC,OAAsC,yBAC/C,OAAS,MAAA5S,GAAI,QAAAyJ,OAAY,sBCDzB,OAAa,QAAAgE,GAAM,aAAAtO,GAAW,WAAAE,GAAS,YAAAC,OAAgB,QACvD,OAAS,kBAAAI,OAAsB,wBAC/B,OAAS,oBAAAkT,MAAwB,yBACjC,OAAS,OAAA7S,GAAK,YAAAe,GAAU,MAAAd,GAAI,QAAAE,GAAM,SAAAC,GAAO,QAAA8B,OAAY,sBAiBpC,cAAAjB,EAQX,QAAAC,OARW,oBATV,IAAM4R,GACXpF,GAAMtM,GAAU,CACd,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAAE,cAAAyQ,CAAc,EAAII,EAAqB,EAEzCuC,EAAW,IAAM,CACrB3S,GAAM,OAAO,CACX,MAAO,EAAE,aAAa,EACtB,KAAM,KACN,QAASa,EAAC+R,GAAA,CAAyB,MAAO5R,EAAM,kBAAmB,CAIrE,CAAC,CACH,EAEA,OACEF,GAACf,GAAA,CACC,UAAU,SACV,UAAU,QACV,QAAQ,SACR,EAAG,EACH,EAAE,OAEF,MAAM,OACN,UAAW,IACX,UAAWF,GACT,0CACA,8CACAmB,EAAM,SACR,EAEA,UAAAH,EAACiB,GAAA,CACC,KAAK,MACL,UAAU,uEACV,QAAS6Q,EAER,WAAE,iCAAiC,EACtC,EACA9R,EAACgS,GAAA,CACC,MAAO7R,EAAM,kBACb,cAAgBqE,GAAU,CACxB2K,EAAc,oBAAqB3K,CAAK,CAC1C,EACF,GACF,CAEJ,CAAC,EAMGuN,GAA+D5R,GAAU,CAC7E,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAAC8B,EAAMyR,CAAO,EAAI3T,GAASsT,EAAiB,IAAI,EAEtDzT,GAAU,IAAM,CACd8T,EACE,CACEL,EAAiB,KACjBA,EAAiB,UACjBA,EAAiB,UACnB,EAAE,SAASzR,EAAM,KAAM,EACnBA,EAAM,MACNyR,EAAiB,IACvB,CACF,EAAG,CAACzR,EAAM,KAAK,CAAC,EAEhB,IAAM+R,EAAU7T,GAAQ,IACf,CACL,CACE,KAAMuT,EAAiB,KACvB,MAAO,EAAE,kCAAkC,EAC3C,YAAa,EAAE,8CAA8C,EAC7D,QAAS,GAAG,EAAE,iBAAiB,CAAC,OAChC,SAAU5R,EAACmS,GAAA,EAAa,CAC1B,EACA,CACE,KAAMP,EAAiB,UACvB,MAAO,EAAE,uCAAuC,EAChD,YAAa,EAAE,mDAAmD,EAClE,QAAS,GAAG,EAAE,iBAAiB,CAAC,OAChC,SAAU5R,EAACoS,GAAA,EAAkB,CAC/B,EACA,CACE,KAAMR,EAAiB,WACvB,MAAO,EAAE,wCAAwC,EACjD,YAAa,EAAE,oDAAoD,EACnE,QAAS,OAAO,EAAE,iBAAiB,CAAC,OACpC,SAAU5R,EAACqS,GAAA,EAAmB,CAChC,CACF,EACC,CAAC,CAAC,EAECC,EAAiBjU,GAAQ,IACtB6T,EAAQ,KAAMjN,GAASA,EAAK,OAASzE,CAAI,EAC/C,CAAC0R,EAAS1R,CAAI,CAAC,EAElB,OACEP,GAAC,OAAI,UAAU,2DACb,UAAAA,GAACf,GAAA,CAAK,UAAU,SAAS,UAAU,QAAQ,KAAM,EAC/C,UAAAc,EAACiB,GAAA,CAAK,UAAW,GACd,WAAE,6CAA6C,EAClD,EACAjB,EAACiB,GAAA,CAAM,WAAE,yCAAyC,EAAE,GACtD,EACAhB,GAACf,GAAA,CAAK,UAAW,IAAK,EAAG,EAAG,EAAE,OAAO,GAAI,EAAG,UAAU,QACpD,UAAAc,EAACd,GAAA,CAAK,UAAU,SAAS,UAAU,QAChC,SAAAgT,EAAQ,IAAKjN,GACZjF,EAACjB,GAAA,CAEC,UAAWyB,IAASyE,EAAK,KAAO,IAAM,IACtC,MAAO,GACP,EAAG,EACH,UAAU,mCACV,QAAS,IAAM,CACbgN,EAAQhN,EAAK,IAAI,CACnB,EAEA,SAAAjF,EAACiB,GAAA,CAAM,SAAAgE,EAAK,MAAM,GATbA,EAAK,KAUZ,CACD,EACH,EACAhF,GAACf,GAAA,CACC,UAAU,SACV,UAAU,QACV,KAAM,EACN,EAAG,EACH,UAAW,IACX,MAAM,OACN,UAAWF,GACT,gBACAwB,IAASoR,EAAiB,MAAQ,iBAClCpR,IAASoR,EAAiB,WAAa,gBACvCpR,IAASoR,EAAiB,YAAc,gBAC1C,EAEA,UAAA5R,EAAC,OAAK,SAAAsS,GAAgB,QAAQ,EAC9BtS,EAACiB,GAAA,CAAM,SAAAqR,GAAgB,YAAY,EACnCtS,EAACd,GAAA,CAAK,MAAM,OAAO,QAAQ,SACxB,SAAAoT,GAAgB,SACnB,EACArS,GAACf,GAAA,CAAK,MAAM,OAAO,KAAM,EAAG,QAAQ,SAClC,UAAAc,EAACiB,GAAA,CAAK,UAAU,kBAAmB,WAAE,cAAc,EAAE,EACrDjB,EAACuS,GAAA,EAAW,GACd,GACF,GACF,GACF,CAEJ,EAOMP,GAAuD7R,GAAU,CACrE,GAAM,CAAE,MAAAqE,EAAO,cAAAM,CAAc,EAAI3E,EAC3B,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EAEvB8T,EAAYhO,GAA6B/D,GAAqB,CAClEqE,EAAcN,CAAK,CACrB,EAEMiO,EAAsBpU,GAAQ,KAC3B,CACL,CAACuT,EAAiB,IAAI,EAAGtR,EAAE,kCAAkC,EAC7D,CAACsR,EAAiB,SAAS,EAAGtR,EAC5B,4CACF,EACA,CAACsR,EAAiB,UAAU,EAAGtR,EAC7B,6CACF,EACA,CAACsR,EAAiB,MAAM,EAAGtR,EAAE,oCAAoC,CACnE,GACC,CAACA,CAAC,CAAC,EAEN,OACEN,EAACd,GAAA,CAAK,UAAWF,GAAG,gCAAgC,EAAG,KAAK,OACzD,gBAAO,OAAO4S,CAAgB,EAAE,IAAKpR,GAElCP,GAACf,GAAA,CAAK,UAAW,SACf,UAAAc,EAACF,GAAA,CACC,GAAI,qBAAqBU,CAAI,GAC7B,MAAO,QACP,QAAS,QACT,QAASgE,IAAUhE,EACnB,gBAAiBgS,EAAShS,CAAI,EAChC,EACAR,EAAC,SACC,QAAS,qBAAqBQ,CAAI,GAClC,UAAWxB,GACT,eACA,WACA,wCACF,EAEC,SAAAyT,EAAoBjS,CAAI,EAC3B,IAjB8BA,CAkBhC,CAEH,EACH,CAEJ,EAEM2R,GAAe,IAEjBlS,GAAC,OACC,MAAM,MACN,OAAO,KACP,QAAQ,aACR,KAAK,OACL,MAAM,6BAEN,UAAAD,EAAC,QACC,EAAE,KACF,EAAE,KACF,MAAM,MACN,OAAO,IACP,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,GACF,EAIEoS,GAAoB,IAEtBnS,GAAC,OACC,MAAM,MACN,OAAO,KACP,QAAQ,aACR,KAAK,OACL,MAAM,6BAEN,UAAAD,EAAC,QACC,EAAE,KACF,EAAE,KACF,MAAM,MACN,OAAO,IACP,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,GACF,EAIEqS,GAAqB,IAEvBpS,GAAC,OACC,MAAM,MACN,OAAO,KACP,QAAQ,aACR,KAAK,OACL,MAAM,6BAEN,UAAAD,EAAC,QACC,MAAM,MACN,OAAO,IACP,UAAU,0BACV,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,IACH,GAAG,IACH,EAAE,UACF,UAAU,0BACV,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,IACH,GAAG,IACH,EAAE,UACF,UAAU,0BACV,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,IACH,GAAG,IACH,EAAE,IACF,UAAU,0BACV,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,IACH,GAAG,IACH,EAAE,UACF,UAAU,yBACV,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,IACH,GAAG,IACH,EAAE,UACF,UAAU,yBACV,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,GACF,EAIEuS,GAAa,IAEfvS,EAAC,OACC,MAAM,MACN,OAAO,IACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,EAAC,QACC,EAAE,uVACF,KAAK,+BACP,EACF,EChaJ,OAAS,QAAAyM,OAAY,QACrB,OAAS,kBAAA/N,OAAsB,wBAC/B,OAAS,kBAAA0F,OAAsB,sBAmB3B,mBAAArE,GACE,OAAAC,GADF,QAAAC,OAAA,oBATG,IAAMyS,GAAmBjG,GAAMtM,GAAiC,CACrE,GAAM,CAAE,CAAE,EAAIzB,GAAe,EAEvB,CAAE,WAAA0C,EAAY,QAAAsO,EAAS,OAAAC,EAAQ,YAAAnO,EAAa,cAAA2N,CAAc,EAC9DI,EAAqB,EAEjB,CAAE,MAAArH,EAAO,SAAA6B,CAAS,EAAI3I,EAE5B,OACEnB,GAAAF,GAAA,CACE,UAAAC,GAACsQ,EAAA,CACC,MAAO,EAAE,uBAAuB,EAChC,OAAQpI,EACR,GAAG,0BACH,MAAO/H,EAAM,YACb,MAAOqB,EAAY,aAAa,EAChC,SAAWmB,GAAM,CACfwM,EAAc,cAAexM,CAAC,CAChC,EACA,WAAY,CAACyB,GAAe,YAAY2F,CAAQ,CAAC,EACjD,QAAS2F,GAA6B,EACtC,OAAQC,GAA4B,EACpC,WAAY,CACV,KAAM,kBACR,EACF,EACA3P,GAACsQ,EAAA,CACC,MAAO,EAAE,qBAAqB,EAC9B,OAAQpI,EACR,GAAG,wBACH,MAAO/H,EAAM,UACb,MAAOqB,EAAY,WAAW,EAC9B,SAAW+B,GAAQ,CACjB4L,EAAc,YAAa5L,CAAG,CAChC,EACA,WAAY,CAACa,GAAe,YAAY2F,CAAQ,CAAC,EACjD,QAAS2F,GAA2B,EACpC,OAAQC,GAA0B,EACpC,GACF,CAEJ,CAAC,EAED+C,GAAiB,YAAc,mBCvD/B,OAAS,QAAAjG,OAAY,QACrB,OAAS,mBAAAlO,OAAuB,yBAChC,OAAS,kBAAAG,OAAsB,wBAC/B,OAAS,kBAAA0F,OAAsB,sBCH/B,OAAa,WAAA/F,OAAe,QAC5B,OAAS,UAAA+P,GAAQ,QAAAnN,GAAM,MAAAjC,OAAU,sBAW7B,cAAAgB,OAAA,oBAFJ,IAAM2S,GAAiBnO,GAEnBxE,GAACiB,GAAA,CAAK,KAAK,MAAM,UAAW,GACzB,SAAAuD,EACH,EAISoO,GAA6CzS,GAAU,CAClE,GAAM,CAAE,KAAA+M,EAAM,MAAAhF,CAAM,EAAI/H,EAElBmE,EAAUjG,GAAQ,IACf,CAAC,CAAE,KAAM6J,CAAM,EAAG,CAAE,KAAMgF,CAAK,CAAC,EACtC,CAACA,EAAMhF,CAAK,CAAC,EAEhB,OACElI,GAACoO,GAAO,OAAP,CACC,QAAQ,OACR,KAAK,KACL,SAAS,MACT,OAAQ9J,EACR,WAAY,CACV,QAAStF,GACP,qCACA,4BACF,CACF,EACA,MAAOmB,EAAM,MACb,cAAeA,EAAM,cACrB,eAAgBwS,GAChB,aAAc,CACZ,MAAO,MACP,YAAa,GACb,WAAY,GACZ,UAAW,8BACb,EACF,CAEJ,EDlBI,cAAA3S,OAAA,oBAhBG,IAAM6S,GAAsBpG,GAAMtM,GAAoC,CAC3E,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAAE,OAAA6C,EAAQ,WAAAH,EAAY,QAAAsO,EAAS,OAAAC,EAAQ,YAAAnO,EAAa,cAAA2N,CAAc,EACtEI,EAAqB,EAEjB,CAACuD,EAAcC,CAAe,EAAIxU,GACtC,8BACA,OACF,EAEM,CAAE,KAAA2O,EAAM,MAAAhF,EAAO,QAAA8B,EAAS,SAAAD,CAAS,EAAI3I,EAErC4R,EAASF,IAAiB,OAG1B9B,EACJhR,GAAC4S,GAAA,CACC,KAAM1F,EACN,MAAOhF,EACP,MANS8K,EAAS9F,EAAOhF,EAOzB,cAAgB1D,GAAU,CACxBuO,EAAgBvO,IAAU0I,EAAO,OAAS,OAAO,CACnD,EACF,EAGF,OAAI8F,EAEAhT,GAACsQ,EAAA,CACC,MAAO,EAAE,YAAY,EACrB,OAAQU,EACR,GAAG,uBACH,KAAK,uBACL,UAAU,iBACV,MAAO7Q,EAAM,eACb,MAAOqB,EACL,iBACA,GAAGD,GAAQ,gBAAgB,KAAK,IAAI2L,CAAI,EAC1C,EACA,SAAW3J,GAAQ,CACjB4L,EAAc,iBAAkB5L,CAAG,CACrC,EACA,WAAY,CAACa,GAAe,YAAY4F,CAAO,CAAC,EAChD,QAAS0F,GAA0B,EACnC,OAAQC,GAAyB,EACnC,EAKF3P,GAACsQ,EAAA,CACC,MAAO,EAAE,YAAY,EACrB,OAAQU,EACR,GAAG,oBACH,KAAK,oBACL,UAAU,iBACV,MAAO7Q,EAAM,MACb,MAAOqB,EAAY,iBAAkB,GAAGD,GAAQ,OAAO,KAAK,IAAI2G,CAAK,EAAE,EACvE,SAAW3E,GAAQ,CACjB4L,EAAc,QAAS5L,CAAG,CAC5B,EACA,WAAY,CAACa,GAAe,YAAY2F,CAAQ,CAAC,EACjD,QAAS2F,GAAuB,EAChC,OAAQC,GAAsB,EAChC,CAEJ,CAAC,EEhFD,OAAS,QAAAlD,OAAY,QACrB,OAAS,kBAAA/N,OAAsB,wBAC/B,OAAS,kBAAA0F,OAAsB,sBAgB3B,cAAApE,OAAA,oBAPG,IAAMiT,GAAYxG,GAAMtM,GAA0B,CACvD,GAAM,CAAE,CAAE,EAAIzB,GAAe,EAEvB,CAAE,QAAAgR,EAAS,OAAAC,EAAQ,YAAAnO,EAAa,cAAA2N,CAAc,EAClDI,EAAqB,EAEvB,OACEvP,GAACsQ,EAAA,CACC,GAAG,mBACH,MAAO,EAAE,iBAAiB,EAC1B,MAAOnQ,EAAM,KACb,MAAOqB,EAAY,MAAM,EACzB,SAAW+B,GAAQ,CACjB4L,EAAc,OAAQ5L,CAAG,CAC3B,EACA,QAASmM,IAAsB,EAC/B,OAAQC,IAAqB,EAC7B,mBAAoB,CAClBvL,GAAe,eAAe,CAAE,IAAK,EAAG,IAAK,IAAK,GAAI,CAAE,CAAC,EACzDA,GAAe,YAAY,CAAC,CAC9B,EACA,WAAY,CACV,KAAM,kBACR,EACF,CAEJ,CAAC,ECrCD,OAAS,QAAAqI,OAAY,QACrB,OAAS,kBAAA/N,OAAsB,wBAC/B,OAAS,kBAAA0F,OAAsB,sBAe3B,cAAApE,OAAA,oBANG,IAAMkT,GAAmBzG,GAAMtM,GAAiC,CACrE,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAAE,QAAAgR,EAAS,OAAAC,EAAQ,YAAAnO,EAAa,cAAA2N,CAAc,EAClDI,EAAqB,EAEvB,OACEvP,GAACsQ,EAAA,CACC,MAAO,EAAE,wBAAwB,EACjC,YAAY,OACZ,GAAG,2BACH,UAAW,iBACX,MAAOnQ,EAAM,aACb,MAAOqB,EAAY,cAAc,EACjC,SAAW+B,GAAQ,CACjB4L,EAAc,eAAgB5L,CAAG,CACnC,EACA,mBAAoB,CAElBa,GAAe,gBACfA,GAAe,YAAY,CAAC,CAC9B,EACA,QAASsL,GAA8B,EACvC,OAAQC,GAA6B,EACvC,CAEJ,CAAC,ENjBK,cAAA3P,GAKA,QAAAC,OALA,oBAPC,IAAMkT,GAAoBhT,GAAiC,CAChE,GAAM,CAAE,OAAAiT,CAAO,EAAIjT,EAEbkT,EAAgBD,EAAO,oBAAsBxB,GAAiB,OAEpE,OACE3R,GAAC,OAAI,UAAU,gBACb,UAAAD,GAAC0S,GAAA,CACC,YAAaU,EAAO,YACpB,UAAWA,EAAO,UACpB,EAEAnT,GAACwI,GAAA,CAAK,KAAM,EAAG,UAAU,0BACvB,UAAAzI,GAAC6S,GAAA,CACC,eAAgBO,EAAO,eACvB,MAAOA,EAAO,MAChB,EACApT,GAACkT,GAAA,CAAiB,aAAcE,EAAO,aAAc,GACvD,EAEApT,GAAC6R,GAAA,CACC,kBAAmBuB,EAAO,kBAC1B,UAAWpU,GAAG,CAACqU,GAAiB,kBAAkB,EACpD,EAECA,GAAiBrT,GAACiT,GAAA,CAAU,KAAMG,EAAO,KAAM,GAClD,CAEJ,EOxCA,OAAa,QAAA3G,OAAY,QACzB,OAAS,kBAAA/N,OAAsB,wBAC/B,OAAS,kBAAA0F,OAAsB,sBAsBzB,cAAApE,OAAA,oBAbC,IAAMsT,GAAgD7G,GAAMtM,GAAU,CAC3E,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CACJ,WAAA0C,EACA,QAAAsO,EACA,OAAAC,EACA,YAAAnO,EACA,cAAA2N,EACA,qBAAAa,CACF,EAAIT,EAAqB,EAEzB,OACEvP,GAAC,OAAI,UAAU,YACb,SAAAA,GAACsQ,EAAA,CACC,IAAKN,EACL,GAAG,4BACH,KAAK,4BACL,MAAO,EAAE,gBAAgB,EACzB,OAAQ5O,EAAW,MACnB,MAAOjB,EAAM,cACb,SAAWwC,GAAM,CACfwM,EAAc,gBAAiBxM,CAAC,CAClC,EACA,MAAOnB,EAAY,eAAe,EAClC,WAAY,CAAC4C,GAAe,YAAYhD,EAAW,QAAQ,CAAC,EAC5D,QAASsO,GAA+B,EACxC,OAAQC,GAA8B,EACxC,EACF,CAEJ,CAAC,EAED2D,GAAkB,YAAc,oBC3ChC,OAAS,QAAA7G,OAAY,QACrB,OAAS,kBAAA/N,OAAsB,wBAC/B,OAAS,kBAAA0F,OAAsB,sBAsBzB,cAAApE,OAAA,oBAbC,IAAMuT,GAAmB9G,GAA6BtM,GAAU,CACrE,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CACJ,WAAA0C,EACA,QAAAsO,EACA,OAAAC,EACA,YAAAnO,EACA,cAAA2N,EACA,uBAAAc,CACF,EAAIV,EAAqB,EAEzB,OACEvP,GAAC,OAAI,UAAU,YACb,SAAAA,GAACsQ,EAAA,CACC,IAAKL,EACL,GAAG,8BACH,KAAK,8BACL,MAAO,EAAE,qBAAqB,EAC9B,YAAa,MAAM,EAAE,iBAAiB,CAAC,IACvC,OAAQ7O,EAAW,MACnB,MAAOI,EAAY,iBAAiB,EACpC,MAAOrB,EAAM,gBACb,SAAWoD,GAAgB,CACzB4L,EAAc,kBAAmB5L,CAAG,CACtC,EACA,WAAY,CAACa,GAAe,YAAYhD,EAAW,QAAQ,CAAC,EAC5D,QAASsO,IAAiC,EAC1C,OAAQC,IAAgC,EAC1C,EACF,CAEJ,CAAC,EAED4D,GAAiB,YAAc,mBC5C/B,OAAa,QAAA9G,GAAM,eAAAvO,GAAa,UAAA2F,OAAc,QAC9C,OAAS,mBAAAtF,OAAuB,yBAChC,OAAS,kBAAAG,OAAsB,wBAC/B,OAAS,wBAAA8U,OAA4B,yBACrC,OAAS,kBAAApP,OAAsB,sBCJ/B,OAAa,QAAAqI,OAAY,QACzB,OAAS,MAAAzN,GAAI,QAAAE,GAAM,QAAA+B,OAAY,sBAsBnB,cAAAjB,GAgBE,QAAAC,OAhBF,oBAnBZ,IAAMwT,GAAc,CAAC,EAAG,EAAG,EAAG,CAAC,EAQlBC,GAA4DjH,GACtEtM,GAAU,CACT,GAAM,CAAE,cAAAgP,CAAc,EAAII,EAAqB,EAE/C,OACEvP,GAACd,GAAA,CAAK,KAAM,EAAG,UAAWiB,EAAM,UAC7B,SAAAsT,GAAY,IAAKxO,GAAS,CACzB,IAAMT,EAAQS,EAAK,SAAS,EACtBE,EAAWhF,EAAM,gBAAkBqE,EAEzC,OACExE,GAACd,GAAA,CAEC,QAAQ,SACR,UAAU,SACV,MAAO,GACP,OAAQ,GACR,UAAWF,GACT,qCACA,yBACAmG,EAAW,8BAAgC,oBAC7C,EACA,QAAS,IAAM,CACbgK,EAAc,gBAAiB3K,CAAK,EACpCrE,EAAM,UAAUqE,CAAK,CACvB,EAEA,SAAAvE,GAACgB,GAAA,CAAK,KAAK,MAAM,UAAWkE,EAAW,GAAK,GAAI,OAAO,WACpD,UAAAF,EAAK,KACR,GAjBKA,CAkBP,CAEJ,CAAC,EACH,CAEJ,CACF,EAEAyO,GAAwB,YAAc,0BClDtC,OAAa,QAAAjH,GAAM,WAAApO,OAAe,QAClC,OAAS,wBAAAmV,OAA4B,yBACrC,OAAS,UAAApF,GAAQ,MAAApP,OAAU,sBAoBrB,cAAAgB,OAAA,oBAZC,IAAM2T,GAA0DlH,GACpEtM,GAAU,CACT,GAAM,CAAE,MAAA+H,CAAM,EAAI/H,EAEZmE,EAAUjG,GAAQ,IACf,CACL,CAAE,MAAO6J,EAAO,MAAOsL,GAAqB,KAAM,EAClD,CAAE,MAAO,IAAK,MAAOA,GAAqB,IAAK,CACjD,EACC,CAACtL,CAAK,CAAC,EAEV,OACElI,GAACoO,GAAO,QAAP,CACC,QAAQ,OACR,KAAK,KACL,QAAS9J,EACT,WAAY,CACV,QAAStF,GACP,qCACA,gCACA,2BACF,CACF,EACA,MAAOmB,EAAM,MACb,cAAeA,EAAM,cACrB,aAAc,CACZ,MAAO,MACP,YAAa,GACb,WAAY,GACZ,UAAW,8BACb,EACF,CAEJ,CACF,EAEAwT,GAAuB,YAAc,yBFgB/B,cAAA3T,GAkCE,QAAAC,OAlCF,oBA9CC,IAAM2T,GAAwDnH,GAClEtM,GAAU,CACT,GAAM,CAAE,eAAAiL,EAAgB,cAAAC,CAAc,EAAIlL,EACpC,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EACvB,CACJ,WAAA0C,EACA,QAAAsO,EACA,OAAAC,EACA,YAAAnO,EACA,cAAA2N,EACA,eAAAS,CACF,EAAIL,EAAqB,EACnB,CAAE,MAAArH,EAAO,SAAA6B,CAAS,EAAI3I,EAGtByS,EAAuBhQ,GAAe,EACtCiQ,EAAsBjQ,GAAe,EAErC,CAACkQ,EAAcC,CAAe,EAAIzV,GACtC,uCACAiV,GAAqB,KACvB,EAEMS,EAAuB/V,GAC1BsC,GAA+B,CAC9BwT,EAAgBxT,CAAI,EAEhBA,IAASgT,GAAqB,MAChCK,EAAqB,QAAUzI,EAC/BwE,EAAe,CACb,eAAgB,GAChB,cAAekE,EAAoB,OACrC,CAAC,IAGDA,EAAoB,QAAUzI,EAC9BuE,EAAe,CACb,eAAgBiE,EAAqB,QACrC,cAAe,EACjB,CAAC,EAEL,EACA,CAACzI,EAAgBC,CAAa,CAChC,EAEM2F,EACJhR,GAAC2T,GAAA,CACC,MAAOzL,EACP,MAAO6L,EACP,cAAeE,EACjB,EAsBF,OAAIF,IAAiBP,GAAqB,KAQtCvT,GAAC,OAAI,UAAU,eACb,UAAAD,GAACsQ,EAAA,CACC,GAAG,4BACH,KAAK,4BACL,MAAOhQ,EAAE,yBAAyB,EAClC,OAAQ0Q,EACR,MAAOxP,EAAY,eAAe,EAClC,MAAO6J,EACP,SAAW9H,GAAgB,CACzB4L,EAAc,gBAAiB5L,CAAG,CACpC,EACA,WAAY,CAACa,GAAe,YAAY,CAAC,CAAC,EAC1C,QAAUzB,GAAM,CACd+M,IAA+B,EAAE/M,CAAC,CAEpC,EACA,OAASA,GAAM,CACbgN,IAA8B,EAAEhN,CAAC,CAEnC,EACA,WAAY,CACV,KAAM,eACN,MAAO,WACP,OAAQ,YACV,EACF,EACA3C,GAAC0T,GAAA,CACC,UAAU,uCACV,cAAerI,EAEjB,GACF,EAMFrL,GAACsQ,EAAA,CACC,GAAG,6BACH,KAAK,6BACL,MAAOhQ,EAAE,0BAA0B,EACnC,OAAQ0Q,EACR,MAAOxP,EAAY,gBAAgB,EACnC,MAAO4J,EACP,SAAW7H,GAAgB,CACzB4L,EAAc,iBAAkB5L,CAAG,CACrC,EACA,WAAY,CAACa,GAAe,YAAY2F,CAAQ,CAAC,EACjD,QAAS2F,IAAgC,EACzC,OAAQC,IAA+B,EACvC,WAAY,CACV,MAAO,gBACP,OAAQ,YACV,EACF,CAEJ,CACF,EAEAiE,GAAsB,YAAc,wBG9IhC,OACE,OAAA5T,GADF,QAAAC,OAAA,oBAJG,IAAMiU,GAAqB/T,GAAkC,CAClE,GAAM,CAAE,OAAAiT,CAAO,EAAIjT,EAEnB,OACEF,GAAC,OAAI,UAAU,gBACb,UAAAD,GAACuT,GAAA,CAAiB,gBAAiBH,EAAO,gBAAiB,EAC3DpT,GAAC4T,GAAA,CACC,eAAgBR,EAAO,eACvB,cAAeA,EAAO,cACxB,EACApT,GAAC2R,GAAA,CACC,eAAgByB,EAAO,eACvB,MAAOA,EAAO,MAChB,GACF,CAEJ,ErBRW,cAAApT,GA2BP,QAAAC,OA3BO,oBANJ,SAASkU,GAAWhU,EAAwB,CACjD,GAAM,CAAE,OAAAiT,CAAO,EAAIjT,EAEbK,EAAO4S,EAAO,WAEpB,GAAI5S,IAAS3B,GAAU,OACrB,OAAOmB,GAACmT,GAAA,CAAiB,OAAQC,EAAQ,EAG3C,GAAI5S,IAAS3B,GAAU,cACrB,OAAOmB,GAACkU,GAAA,CAAkB,OAAQd,EAAQ,EAG5C,IAAMgB,EACJ5T,IAAS3B,GAAU,YAAc2B,IAAS3B,GAAU,YAEhDwV,EAAY7T,IAAS3B,GAAU,OAAS2B,IAAS3B,GAAU,WAE3DyV,EAAoBF,GACxBpU,GAACsT,GAAA,CAAkB,cAAeF,EAAO,cAAe,EAGpDmB,EAAaF,GACjBrU,GAAC8Q,GAAA,CACC,WAAYsC,EAAO,WACnB,YAAaA,EAAO,YACpB,IAAKjT,EAAM,IACX,gBAAiBA,EAAM,gBACvB,yBAA0BA,EAAM,yBAClC,EAGF,OACEF,GAAC,OAAI,UAAW,gBACb,UAAAqU,EACAC,EACDvU,GAAC2R,GAAA,CACC,eAAgByB,EAAO,eACvB,MAAOA,EAAO,MAChB,GACF,CAEJ,CsBrDA,OAAS,QAAA3G,GAAM,aAAAtO,GAAW,WAAAE,GAAS,YAAAC,OAAgB,QACnD,OAAS,SAAAkW,OAAa,yBACtB,OAAS,kBAAA9V,OAAsB,wBAC/B,OAAS,aAAAE,OAAiB,yBAC1B,OAAS,QAAAM,GAAM,UAAAuV,GAAQ,gBAAA9L,GAAc,QAAA1H,OAAY,sBACjD,OAAS,WAAAvB,OAAe,yBAoFlB,cAAAM,GAsBE,QAAAC,OAtBF,oBA1EN,IAAMyU,GAAa,EACbC,GAAa,IAENC,GAAiBnI,GAAMtM,GAA+B,CACjE,GAAM,CAAE,SAAAwF,EAAU,KAAAsE,EAAM,eAAA4K,EAAgB,OAAAC,CAAO,EAAI3U,EAE7C,CAAC4U,EAAaC,CAAc,EAAI1W,GAAiB,CAAC,EAElD,CAAE,cAAA6Q,EAAe,WAAA/N,EAAY,sBAAA8O,CAAsB,EACvDX,EAAqB,EAEjB,CAAE,QAAAvF,EAAS,UAAAiL,CAAU,EAAI7T,EAEzB,CAAE,EAAAd,CAAE,EAAI5B,GAAe,EAEvBwW,EAAQ7W,GACZ,IAAOsH,EAAYsE,IAASrL,GAAU,IAAM,MAAQ,OAAU,OAC9D,CAACqL,EAAMtE,CAAQ,CACjB,EAEMwP,EAAW9W,GAAQ,IAChB4L,IAASrL,GAAU,IACtB0B,EAAE,mBAAmB,EACrBA,EAAE,oBAAoB,EACzB,CAAC2J,EAAM3J,CAAC,CAAC,EAEN8U,EAAuB5Q,GAAkB,CAC7C0L,EAAsB,QAAU,EAChC8E,EAAexQ,CAAK,CACtB,EAEM6Q,EAAoB7Q,GAAkB,CAC1C,IAAM8Q,EAAS,IAAI5V,GAAQ8E,CAAK,EAC7B,IAAImQ,EAAU,EACd,IAAIG,CAAM,EACV,QAAQ9K,EAAStK,GAAQ,UAAU,EACtCyP,EAAc,iBAAkBqF,GAAM,aAAac,EAAQL,CAAS,CAAC,CACvE,EAEMM,EAAQ,IAAM,CAClBH,EAAoBT,EAAU,EAE1BI,IAAgBJ,IAClBU,EAAiBV,EAAU,CAE/B,EAGA,OAAAxW,GAAU,IAAM,CACV+R,EAAsB,UAAY,GACpCmF,EAAiBN,CAAW,CAEhC,EAAG,CAACA,EAAaD,CAAM,CAAC,EAExB3W,GAAU,IAAM,CACd,IAAMqX,EAAmB,IACnBX,GAAkB,OAAOA,CAAc,IAAM,GAAKC,IAAW,EACxD,IAAIpV,GAAQ,KAAK,IAAI,OAAOmV,CAAc,EAAGC,CAAM,CAAC,EACxD,IAAIA,CAAM,EACV,IAAIH,EAAU,EACd,KAAK,EAAGjV,GAAQ,UAAU,EAC1B,SAAS,EAEP,EAILwQ,EAAsB,UAAY,GACpC8E,EAAeQ,EAAiB,CAAC,CAErC,EAAG,CAACX,EAAgBC,CAAM,CAAC,EAGzB7U,GAAC,OACC,UAAAD,GAACyU,GAAA,CACC,SAAUK,IAAW,GAAK,CAACnP,EAC3B,MAAO,CAACoP,CAAW,EACnB,MAAOG,EACP,UAAW,EACX,QAAO,GACP,cAAgBvS,GAAM,CACpByS,EAAoBzS,EAAE,CAAC,CAAC,CAC1B,EACA,IAAK+R,GACL,IAAKC,GACP,EACA1U,GAACf,GAAA,CAAK,QAAS,UAAW,UAAU,uBAClC,UAAAc,GAACiB,GAAK,QAAL,CACC,KAAM,MACN,MAAOiU,EACP,GAAI,EACJ,QAAS,GACT,OAAO,IAEN,SAAAvP,EAAWoP,EAAc,EAC5B,EACA9U,GAACf,GAAA,CACC,UAAAc,GAAC,UACC,UAAW2I,GAAa,CACtB,KAAM,MACN,UAAW,UACb,CAAC,EACD,QAAS4M,EACT,cAAY,4CAEX,SAAAJ,EACH,EACAnV,GAACiB,GAAK,QAAL,CACC,KAAM,MACN,MAAOiU,EACP,GAAIlL,EACJ,QAAS,GACT,cAAY,qCAEX,SAAArE,EAAWmP,EAAS,EACvB,GACF,GACF,GACF,CAEJ,CAAC,EAEDF,GAAe,YAAc,iBCxI7B,OAAS,kBAAAlW,OAAsB,wBAC/B,OAAS,QAAAQ,GAAM,UAAAG,OAAc,sBAkBzB,OACE,OAAAW,GADF,QAAAC,OAAA,oBATG,IAAMwV,GAAoD,CAAC,CAChE,QAAAhV,EACA,gBAAAiV,EACA,UAAAC,EACA,OAAAC,EAAS,yCACX,IAAM,CACJ,GAAM,CAAE,EAAAtV,CAAE,EAAI5B,GAAe,EAE7B,OACEuB,GAACf,GAAA,CAAK,UAAW,SAAU,KAAM,EAAG,UAAWyW,EAC7C,UAAA3V,GAACX,GAAA,CACC,cAAauW,EACb,UAAU,eACV,GAAI,aACJ,QAASnV,EACT,gBAAiBiV,EACnB,EACA1V,GAAC,SAAM,QAAS,aAAc,UAAW,cACtC,SAAAM,EAAE,uBAAuB,EAC5B,GACF,CAEJ,ECjCA,OAAO8B,IAGL,aAAAjE,GACA,WAAAE,GAEA,YAAAC,OACK,QAEP,OAAS,kBAAAI,OAAsB,wBAC/B,OAAS,6BAAAC,OAAiC,6BAC1C,OAAuB,aAAAE,OAA+B,yBACtD,OACE,MAAAG,GACA,QAAAE,GACA,QAAA+B,GACA,SAAAkD,GACA,kBAAAC,GAEA,UAAA/E,GACA,mBAAAwW,GAEA,aAAArW,OACK,sBACP,OAAS,QAAAiJ,OAAY,sBAErB,OAGE,0BAAAqN,OACK,2BC9BP,OAAS,aAAA3X,GAAW,WAAAE,GAAS,YAAAC,OAAgB,QAC7C,OACE,iBAAAyX,GACA,SAAA5R,GAEA,QAAAlD,GACA,sBAAA+U,OACK,sBACP,OAAS,kBAAA5R,OAAsB,sBCR/B,OAAS,aAAAjG,GAAW,WAAAE,GAAS,UAAAwF,GAAQ,YAAAvF,OAAgB,QACrD,OAAS,kBAAAI,OAAsB,wBAM/B,OAAS,WAAAgB,GAAS,cAAAuW,OAAkB,yBCPpC,OAAS,iBAAA7G,GAA0B,cAAAC,OAAkB,QAS9C,IAAM6G,GAAkB9G,GAC7B,CAAC,CACH,EAEa+G,GAAqB,IACzB9G,GAAW6G,EAAe,ED0B5B,IAAME,GAAsBjW,GAAwB,CACzD,GAAM,CAAE,KAAAK,EAAM,OAAA4S,EAAQ,SAAArJ,CAAS,EAAI5J,EAC7B,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EACvB,CAAC2X,EAAOC,CAAQ,EAAIhY,GAAS,EAAI,EAKjC,CAAE,KAAAiY,EAAM,QAAAC,EAAS,QAAAC,CAAQ,EAAIN,GAAmB,EAEhD,CAACO,EAAYC,CAAa,EAAIrY,GAAS,EAAK,EAC5C,CAACsY,EAAWC,CAAY,EAAIvY,GAAS,EAAK,EAE1CwY,EAAMzY,GAAkB,IAAM,CAClC,OAAQkY,EAAM,CACZ,IAAK,SACH,MAAO,GAAG/V,EAAK,YAAY,CAAC,UAC9B,IAAK,UACH,MAAO,GAAGA,EAAK,YAAY,CAAC,qBAC9B,QACE,MAAO,GAAGA,EAAK,YAAY,CAAC,MAChC,CACF,EAAG,CAAC+V,CAAI,CAAC,EAEH,CAACQ,EAAYC,CAAa,EAAI1Y,GAClC8U,EAAOmD,CAAwB,CACjC,EAWApY,GAAU,IAAM,CACVyY,GAGJI,EAAc5D,EAAOmD,CAAwB,CAAC,CAChD,EAAG,CAACnD,EAAQmD,EAAMK,CAAS,CAAC,EAE5B,IAAMK,EAAQ5Y,GAAoB,IACzB,CACL,CACE,MAAOiC,EAAE,UAAU,EACnB,MAAO,MACP,OAAQ,eACV,EACA,CACE,MAAOA,EAAE,aAAa,EACtB,MAAO,SACP,OAAQ,kBACV,EACA,CACE,MAAO,GAAGA,EAAE,aAAa,CAAC,IAC1B,MAAO,UACP,OAAQ,mBACV,CACF,EACC,CAACA,CAAC,CAAC,EAEA4W,EAAe7Y,GAAQ,KACpB,CACJ,IAAciC,EAAE,UAAU,EAC1B,OAAiBA,EAAE,aAAa,EAChC,UAAqB,GAAGA,EAAE,aAAa,CAAC,GAC3C,GACC,CAACA,CAAC,CAAC,EAEA6W,EAAmBtT,GAAe,EAAE,EAmH1C,MAAO,CACL,KAAA0S,EACA,MAAAU,EACA,aAAAC,EACA,UA1FiB5S,GAIG,CACpB,GAAM,CAAE,GAAA2H,GAAK,CAAE,EAAI3H,EACnB,MAAO,CACL,eAAgB,CACdE,EACAF,KAEAE,EAAQ,GAAGA,CAAK,GAEZ6R,GACE7V,IAAS,MAAQ+V,IAAS,QAC5B/R,EAAQA,EAAM,WAAW,GAAG,EAAIA,EAAQ,IAAMA,GAI9CA,IAAU,IAAMA,IAAU,IAAY,GAKtC+R,IAAS,UAWJ,GAAG,IAAI7W,GACZ8E,EAAM,QACJ,IAAI,OAAO2S,EAAiB,QAAQ,QAAQ,IAAK,KAAK,EAAI,GAAG,EAC7D,EACF,CACF,EACG,IAAI,GAAG,EACP,KAAK,EAAG,CAAC,EACT,SAAS,CAAC,GAAGA,EAAiB,OAAO,IAE/BZ,IAAS,WAClB/R,EAAQyR,GAAWzR,EAAOyH,EAAE,GAKvB,GAAGzH,CAAK,KAEjB,aAAeA,GAAkB,CAC/B,GAAI,aAAa,KAAKA,CAAK,EACzB,MAAO,IAKT,GAAI+R,IAAS,WACX,GAAI/R,IAAU,GAAI,CAEhBA,EAAQyR,GAAWzR,EAAO,CAAC,EAC3B,IAAM4S,EAAS5S,EAAM,MAAM,WAAW,EAChC4S,EACJD,EAAiB,QAAUC,EAAO,CAAC,EAEnCD,EAAiB,QAAU,GAE7B3S,EAAQ,IAAI9E,GAAQ8E,CAAK,EAAE,IAAI,GAAG,EAAE,SAAS,EAC7CA,EAAQ,GAAGA,CAAK,GAAG2S,EAAiB,OAAO,EAC7C,OACSZ,IAAS,OAAe/V,IAAS,MAAQ6V,EAClD7R,EAAQA,EAAM,WAAW,GAAG,EAAIA,EAAQ,IAAMA,EAE9CA,EAAQyR,GAAWzR,EAAOyH,EAAE,EAG9B,OAAIzH,IAAU,IAAMA,IAAU,IAAY,GAEnCA,CACT,CACF,CACF,EAOE,aAAe+R,GAAkB,CAC/BC,EAAQD,CAAI,CACd,EACA,QA9Gc,IAAM,CAEpBI,EAAc,EAAI,EAClBE,EAAa,EAAI,CACnB,EA2GE,OAtGa,IAAM,CAEnBF,EAAc,EAAK,EACnBE,EAAa,EAAK,EAClB1W,EAAM,SAAS2W,EAAKC,CAAU,CAChC,EAkGE,MAAOA,EACP,cA5HqBvS,GAAkB,CAOvCwS,EAAcxS,CAAK,EACnBrE,EAAM,SAAS2W,EAAKtS,CAAK,CAC3B,EAoHE,SAAAuF,EACA,KAAM2M,EAAaD,EAAU,OAC7B,SAAAH,CACF,CACF,EDtJQ,mBAAAvW,GAEI,OAAAC,GAFJ,QAAAC,OAAA,oBAzED,IAAMoX,GAAYlX,GAAyB,CAChD,GAAM,CACJ,KAAAoW,EACA,MAAAU,EACA,aAAAC,EACA,aAAAI,EACA,cAAAxS,EACA,MAAAoD,EACA,SAAA6B,EACA,MAAAvF,EACA,KAAAhE,EACA,KAAA+W,EACA,QAAA7H,EACA,OAAAC,EACA,SAAA2G,CACF,EAAInW,EAEE,CAACuR,EAAQ8F,CAAS,EAAIlZ,GAAiBiY,CAAI,EAE3C,CAAChG,EAAakH,CAAc,EAAInZ,GACpCiY,cAA8B,IAAMrO,CACtC,EAEA/J,GAAU,IAAM,CACdqZ,EAAUjB,CAAI,EACdkB,EAAelB,cAA8B,IAAMrO,CAAK,CAC1D,EAAG,CAACqO,CAAI,CAAC,EAETpY,GAAU,IAAM,CACdqZ,EAAYhT,EAAQ,GAAK+R,CAAI,CAC/B,EAAG,CAAC/R,CAAK,CAAC,EAEV,IAAMkT,EAAKrZ,GAAQ,IAAM,GAAGmC,EAAK,YAAY,CAAC,IAAI+V,EAAK,YAAY,CAAC,GAAI,CAAC,CAAC,EAE1E,OACEvW,GAACmE,GAAM,QAAN,CACC,OAAQ+S,EAAaxF,CAAmC,GAAKA,EAC7D,KAAM,KACN,YAAanB,EACb,GAAImH,EACJ,MAAO,QACP,MAAOlT,EACP,QAAS+S,EACT,aAAc,CACZ,QAAS,CACP,KAAMpX,EAAM,OAAS,KAAO,MAAQ,QACtC,CACF,EACA,cAAaA,EAAM,SAAS,MAC5B,aAAc,MACd,cAAe2E,EACf,WAAY,CACV3E,EAAM,UAAU,CAAE,GAAI4J,EAAU,KAAAwM,EAAM,KAAA/V,CAAK,CAAC,EAC5C4D,GAAe,iBAEjB,EACA,WAAY,CACV,KAAM5D,IAAS,KAAO,wBAA0B,sBAChD,WAAY,4BACZ,MAAO,kBACT,EACA,QAAS,IAAM,CACbgX,EAAU,EAAE,EACZC,EAAe,EAAE,EACjBnB,EAAS,EAAI,EACb5G,EAAQ,CACV,EACA,OAAQ,IAAM,CACZ8H,EAAYhT,EAAQ,GAAK+R,CAAI,EAC7BkB,EAAelB,cAA8B,IAAMrO,CAAK,EACxDyH,EAAO,CACT,EACA,OACE1P,GAAAF,GAAA,CACG,UAAAwW,eAA+B,CAAC,CAAC/R,GAChCxE,GAACiB,GAAA,CAAK,KAAM,MAAO,MAAM,UAAU,UAAU,eAAe,aAE5D,EAEFjB,GAAC2X,GAAA,CACC,KAAMpB,EACN,MAAOU,EACP,aAAehS,GAASqS,EAAarS,EAAK,KAAgB,EAC1D,OAAQ9E,EAAM,SAAS,SACzB,GACF,EAEJ,CAEJ,EAEMwX,GAAYxX,GAOdH,GAACgW,GAAA,CACC,aAAc7V,EAAM,KACpB,KAAMA,EAAM,MACZ,MAAO,MACP,KAAM,KACN,UAAW,mBACX,iBAAmBsQ,GAAUA,EAAM,eAAe,EAClD,SAAWxL,GAAS9E,EAAM,aAAa8E,CAAgB,EAEvD,SAAAjF,GAAC,UAAO,UAAW,UAAW,cAAaG,EAAM,OAC/C,SAAAH,GAAC+V,GAAA,CAAc,KAAM,GAAI,MAAO,QAAS,EAC3C,EACF,EGnHA,cAAA/V,OAAA,oBAZG,IAAM4X,GACXzX,GAOG,CACH,GAAM,CAAE,QAAA0X,EAAS,MAAA3P,EAAO,GAAGqE,CAAK,EAAIpM,EAC9B6H,EAAQoO,GAAmB7J,CAAI,EACrC,OACEvM,GAACqX,GAAA,CAAU,GAAGrP,EAAO,QAAS6P,EAAS,MAAO3P,EAAO,KAAM/H,EAAM,KAAM,CAE3E,ECjBA,OAAgB,WAAA9B,OAAe,QAC/B,OAAS,mBAAAE,OAAuB,yBAChC,OAAS,kBAAAG,OAAsB,wBAC/B,OAAS,MAAAM,GAAI,QAAAE,GAAM,QAAA+B,OAAY,sBAsBzB,OACE,OAAAjB,GADF,QAAAC,OAAA,oBAlBC,IAAM6X,GAKR3X,GAAU,CACb,GAAM,CAAE,KAAAK,EAAM,OAAA4S,EAAQ,SAAA2E,CAAS,EAAI5X,EAC7B,CAACoW,EAAMC,CAAO,EAAIjY,GACtB,sBAEF,EACM,CAAE,EAAA+B,CAAE,EAAI5B,GAAe,EAEvB+X,EAAUpY,GAAQ,IAClB,CAAC+U,EAAO,KAAO,CAACA,EAAO,cAClB,KAGPnT,GAACf,GAAA,CACC,UAAAc,GAAC,QAAK,UAAW,wCACd,SAAAuW,UACGjW,EAAE,mBAAmB,EACrBA,EAAE,mBAAmB,EAC3B,EACCiW,UACCvW,GAACiB,GAAK,QAAL,CACC,KAAM,cACN,UAAWjC,GACT,uBACAwB,IAAS,KAAO,wBAA0B,qBAC5C,EAEC,SAAA4S,EAAO,IACV,EAEApT,GAACiB,GAAK,QAAL,CACC,KAAM,QACN,UAAWjC,GACT,uBACAwB,IAAS,KAAO,wBAA0B,qBAC5C,EAEC,SAAA4S,EAAO,IACV,GAEJ,EAED,CAACmD,EAAMnD,EAAO,IAAKA,EAAO,IAAKA,EAAO,aAAa,CAAC,EAEjDhD,EAAgB/R,GAA8B,KAC3C,CAAE,KAAAkY,EAAM,QAAAC,EAAS,QAAAC,CAAQ,GAC/B,CAACF,EAAMC,EAASC,CAAO,CAAC,EAE3B,OACEzW,GAACkW,GAAgB,SAAhB,CAAyB,MAAO9F,EAC9B,SAAA2H,EACH,CAEJ,EL4BQ,OACE,OAAA/X,EADF,QAAAC,OAAA,oBA3CD,IAAM+X,GAAa7X,GAepB,CAEJ,IAAM8X,EAAc7V,GAAM,OAAuB,IAAI,EAC/C,CAAE,EAAA9B,CAAE,EAAI5B,GAAe,EACvB,CAAE,SAAAqE,CAAS,EAAIvD,GAAU,EAc/B,OAZArB,GAAU,IAAM,CAEZgC,EAAM,YAActB,GAAU,OAC9BsB,EAAM,YAActB,GAAU,QAG9BsB,EAAM,gBAAgB,EAAK,CAI/B,EAAG,CAACA,EAAM,SAAS,CAAC,EAGjBA,EAAM,YAActB,GAAU,OAC7BsB,EAAM,YAActB,GAAU,QAChCsB,EAAM,aAEC,KAGPF,GAAC,OACC,UAAAA,GAACf,GAAA,CAAK,UAAW,SAAU,QAAS,UAClC,UAAAe,GAACf,GAAA,CAAK,UAAW,SAAU,KAAM,EAC/B,UAAAc,EAACX,GAAA,CACC,GAAI,mBACJ,UAAU,eACV,QAASc,EAAM,YACf,SACGA,EAAM,YAActB,GAAU,OAC7BsB,EAAM,YAActB,GAAU,QAChCsB,EAAM,aAER,gBAAkBM,GAAY,CAE5BN,EAAM,gBAAgBM,CAAO,CAM/B,EACF,EACAT,EAAC,SAAM,QAAS,mBAAoB,UAAW,cAC5C,SAAAM,EAAE,aAAa,EAClB,GAiBF,EACAL,GAACf,GAAA,CAAK,UAAW,SAAU,KAAM,EAC9B,UAAA6D,GACC5C,EAAM,oBAAsB,QAC5BA,EAAM,oBACJH,EAACyV,GAAA,CACC,QAAStV,EAAM,kBACf,gBAAiBA,EAAM,mBACzB,EAEH,CAAC4C,GACA/C,EAACkY,GAAA,CACC,UAAWlZ,GACT,0BACAmB,EAAM,aAAe,aACvB,EACA,iBAAkBA,EAAM,iBAC1B,GAEJ,GACF,EACAH,EAAC,OACC,UAAWhB,GACT,qDACAmB,EAAM,aAAe,mBACvB,EACA,gBAAiB,IAAM,CAErB8X,EAAY,SAAS,MAAM,YACzB,UACA9X,EAAM,YAAc,IAAM,GAC5B,CACF,EAEA,SAAAH,EAACmY,GAAA,CACC,IAAKF,EACL,cAAe9X,EAAM,cACrB,SAAUA,EAAM,SAChB,OAAQA,EAAM,OACd,OAAQA,EAAM,OACd,SAAUA,EAAM,SAChB,iBAAkBA,EAAM,iBACxB,SAAU4C,EACZ,EACF,GACF,CAEJ,EAEMoV,GAAgB/V,GAAM,WAW1B,CAACjC,EAAOmC,IAAQ,CAChB,GAAM,CAAE,YAAAd,CAAY,EAAI7C,GAA0BwB,EAAM,MAAM,EACxD,CAAE,EAAAG,CAAE,EAAI5B,GAAe,EAE7B,OACEuB,GAAC,OACC,IAAKqC,EACL,UAAW,sDAEX,UAAArC,GAACf,GAAA,CAAK,UAAW,SAAU,QAAS,UAAW,KAAM,EACnD,UAAAc,EAAC8V,GAAA,CACC,MAAO3V,EAAM,OAAO,cACpB,SAAUA,EAAM,SAClB,EACCA,EAAM,UACLH,EAACkY,GAAA,CACC,iBAAkB/X,EAAM,iBACxB,SAAUA,EAAM,SAClB,GAEJ,EACAH,EAAC8X,GAAA,CAAiB,OAAQ3X,EAAM,OAAO,GAAI,KAAM,KAC/C,SAAAH,EAACoY,GAAA,CACC,KAAM,KACN,MAAO5W,EAAY,kBAAkB,EACrC,SAAUrB,EAAM,SAChB,OAAQA,EAAM,OAAO,GACrB,SAAUA,EAAM,SAChB,QAAS,CACP,MAAO,2CACP,OAAQ,yCACR,SAAU,uDACZ,EACF,EACF,EACAH,EAAC8X,GAAA,CAAiB,OAAQ3X,EAAM,OAAO,GAAI,KAAM,KAC/C,SAAAH,EAACoY,GAAA,CACC,KAAM,KACN,MAAO5W,EAAY,kBAAkB,EACrC,SAAUrB,EAAM,SAChB,OAAQA,EAAM,OAAO,GACrB,SAAUA,EAAM,SAChB,QAAS,CACP,MAAO,2CACP,OAAQ,yCACR,SAAU,uDACZ,EACF,EACF,GACF,CAEJ,CAAC,EAEDgY,GAAc,YAAc,gBAE5B,IAAMD,GAAsB/X,GAItB,CACJ,GAAM,CAAE,CAAE,EAAIzB,GAAe,EAE7B,OACEuB,GAACf,GAAA,CACC,UAAW,SACX,KAAM,EACN,QAASiB,EAAM,iBACf,UAAWnB,GAAG,+BAAgCmB,EAAM,SAAS,EAE7D,UAAAH,EAACiB,GAAA,CACC,UAAWjC,GACT,wDACAmB,EAAM,SAAW,eAAiB,aACpC,EAEC,WAAE,eAAe,EACpB,EACAH,EAAC6V,GAAA,CACC,KAAM,GACN,UAAU,kFACV,QAAS,EACT,QAAS1V,EAAM,iBACjB,GACF,CAEJ,EAGMkY,GAAyBlY,GAOzB,CACJ,GAAM,CAAE,CAAE,EAAIzB,GAAe,EACvB,CAAE,gBAAA+Q,CAAgB,EAAIF,EAAqB,EAC3C,CAAE,QAAAkH,CAAQ,EAAIN,GAAmB,EACjC,CAACzE,EAAQ8F,CAAS,EAAIlZ,GAAiB,GAAG6B,EAAM,IAAI,QAAQ,EAC5D,CAACoQ,EAAakH,CAAc,EAAInZ,GAAiB,MAAM,EAEvD,CAACoY,EAAYC,CAAa,EAAIrY,GAAS,EAAK,EAC5C,CAACsY,EAAWC,CAAY,EAAIvY,GAAS,EAAK,EAE1C,CAACyY,EAAYC,CAAa,EAAI1Y,GAClC6B,EAAM,OAAO,eAAiB,EAChC,EAEAhC,GAAU,IAAM,CACVyY,GAGJI,EAAc7W,EAAM,OAAO,eAAiB,EAAE,CAChD,EAAG,CAACA,EAAM,OAAO,cAAeyW,CAAS,CAAC,EAE1C,IAAM0B,EAAyBja,GAAQ,IACjC8B,EAAM,OAASsP,EAAwBtP,EAAM,MAC7CuW,EAAmBD,EAEhB,KACN,CAACtW,EAAM,MAAOsP,EAAiBiH,EAAYD,CAAO,CAAC,EAEhD8B,EAAkBC,GAA2B,CACjD,IAAIC,EAAUtY,EAAM,OAAS,KAAO,EAAE,cAAc,EAAI,EAAE,cAAc,EAExE,OAAIqY,IACFC,EAAUtY,EAAM,OAAS,KAAO,EAAE,SAAS,EAAI,EAAE,SAAS,GAErDsY,CACT,EAEM3T,EAAiBN,GAAkB,CACvCwS,EAAcxS,CAAK,EACnBrE,EAAM,SAASqE,CAAK,CACtB,EAIArG,GAAU,IAAM,CACdqZ,EAAUe,EAAepY,EAAM,OAAO,aAAa,CAAC,EAE/CyW,GACHI,EAAc7W,EAAM,OAAO,eAAiB,EAAE,CAElD,EAAG,CAACA,EAAM,KAAMA,EAAM,OAAO,aAAa,CAAC,EAE3C,IAAMuP,EAAU,IAAM,CACpB8H,EAAUrX,EAAM,OAAS,KAAO,EAAE,SAAS,EAAI,EAAE,SAAS,CAAC,EAC3DsX,EAAe,EAAE,EACjBd,EAAc,EAAI,EAClBE,EAAa,EAAI,CACnB,EAEMlH,EAAS,IAAM,CACnB6H,EAAUe,EAAepY,EAAM,OAAO,aAAa,CAAC,EACpDsX,EAAe,MAAM,EACrBd,EAAc,EAAK,EACnBE,EAAa,EAAK,EAClB1W,EAAM,SAAS4W,CAAU,CAC3B,EAEA,OACE/W,EAACmE,GAAM,QAAN,CACC,cAAahE,EAAM,OACnB,OAAQuR,EACR,KAAM,KACN,YAAanB,EACb,MAAM,QACN,QAASb,EACT,OAAQC,EACR,QAAS2I,EACT,aAAc,CACZ,QAAS,CACP,KAAMnY,EAAM,OAAS,KAAO,MAAQ,QACtC,CACF,EACA,MAAOA,EAAM,MAAQ,SAAW,OAChC,aAAc,MACd,MAAO4W,EACP,WAAY,CACV,WAAY,4BACZ,KAAM,uBACN,OAAQ,sBACV,EAEA,cAAejS,EACf,WAAY,CACVV,GAAe,gBACfA,GAAe,YAAYjE,EAAM,UAAY,CAAC,EAC9CiE,GAAe,iBACjB,EACF,CAEJ,EAIMgU,GAWAjY,GAEFF,GAACwI,GAAA,CAAK,KAAM,EAAG,KAAM,EACnB,UAAAzI,EAACqY,GAAA,CACC,OAAQlY,EAAM,SAAS,MACvB,KAAMA,EAAM,KACZ,MAAOA,EAAM,MACb,OAAQA,EAAM,QAAU,GACxB,SAAWsQ,GAAU,CACnBtQ,EAAM,SACJA,EAAM,OAAS,KAAO,mBAAqB,mBAC3CsQ,CACF,CACF,EACA,SAAUtQ,EAAM,SAClB,EAEAH,EAAC4X,GAAA,CACC,QAAS,CACP,MAAOzX,EAAM,SAAS,OACtB,SAAUA,EAAM,SAAS,QAC3B,EACA,SAAUA,EAAM,SAChB,MAAO,OACP,SAAU,EACV,KAAMA,EAAM,KACZ,OAAQ,CACN,IAAKA,EAAM,OAAO,IAClB,OAAQA,EAAM,OAAO,OACrB,UAAWA,EAAM,OAAO,SAAS,EACjC,IAAKA,EAAM,OAAO,GACpB,EACF,GACF,EvDjFA,cAAAH,EA8JM,QAAAC,OA9JN,oBA1SG,IAAMyY,GAAyCvY,GAAU,CAC9D,GAAM,CACJ,KAAA8J,EACA,eAAA9I,EACA,cAAAgO,EACA,eAAAS,EACA,WAAAxO,EACA,OAAA0T,EACA,eAAA3M,EACA,OAAAwQ,EACA,OAAAC,EACA,UAAAC,EACA,UAAAC,EACA,QAAArO,EACA,YAAAsO,EACA,UAAAC,EACA,gBAAApT,EACA,WAAAW,EACA,gBAAAsK,EACA,WAAAoI,EACA,cAAAC,EACA,kBAAArJ,CACF,EAAI1P,EACE,CAACgZ,EAAmBC,EAAoB,EAAI9a,GAAS,EAAK,EAE1D,CAAE,EAAAgC,CAAE,EAAI5B,GAAe,EAEvB,CAAE,SAAAqE,CAAS,EAAIvD,GAAU,EACzB,CAAC6Z,GAAuBC,CAAwB,EACpDhb,GAAkB,EAAK,EAEnB,CAAE,OAAAiD,EAAQ,UAAAgY,EAAU,EAAIV,EAExB,CAACpJ,GAAiB+J,CAAkB,EAAIlb,GAAS,EAAK,EAEtD,CAACmb,GAAanP,EAAc,EAAI/L,GACpC,wBACA,EACF,EACM,CAAC6B,GAAQsZ,EAAS,EAAInb,GAC1B,kCACA,EACF,EACM,CAACob,GAAkBC,EAAmB,EAAItb,GAAS,EAAK,EACxD,CAACub,GAAQC,EAAS,EAAIvb,GAAgB,uBAAwB,EAAK,EAEnE,CAACwb,GAAUC,EAAW,EAAIzb,GAAgB,mBAAoB,IAAK,CACvE,UAAaiG,GACJ,CAACA,GAASA,IAAU,KAAO,IAAM,KAAK,MAAMA,CAAK,CAE5D,CAAC,EAEK,CAAE,aAAAyV,CAAa,EAAIxb,GAAkB,EAErCyb,EAAe9b,GAAM,EAErB,CAAE,YAAAoD,EAAY,EAAI7C,GAA0B4a,GAAYhY,EAAS,IAAI,EAErE4Y,EAAc9b,GAAQ,IACnB4L,IAASrL,GAAU,IACtB0B,EAAE,oBAAoB,EACtBA,EAAE,sBAAsB,EAC3B,CAAC2J,EAAM3J,CAAC,CAAC,EAEZnC,GAAU,IAAM,CACVob,IACFC,EAAmB,EAAI,CAE3B,EAAG,CAACD,EAAS,CAAC,EAGdpb,GAAU,IAAM,CACVyH,GAAiB,SAAS,iBAAiB,IAG3CmU,GACF5K,EAAc,WAAY,OAAO4K,EAAQ,CAAC,EAE1C5K,EAAc,WAAY,MAAS,EAEvC,EAAG,CAAC4K,GAAUnU,CAAe,CAAC,EAE9BzH,GAAU,IAAM,CACd,IAAMic,EAAgB3J,GAAsB,CAC3BA,EAAM,OAEZ,QAAQ,4BAA4B,GAK7C+I,EAAoBa,IACdA,IACK,EAGV,CACH,EAEA,OAAI5K,GACF,SAAS,iBAAiB,QAAS2K,CAAY,EAE/C,SAAS,oBAAoB,QAASA,CAAY,EAG7C,IAAM,CACX,SAAS,oBAAoB,QAASA,CAAY,CACpD,CACF,EAAG,CAAC3K,EAAe,CAAC,EAEpB,IAAM6K,EAAW9b,GAAc,SAAY,CACzC,IAAM+b,EAAgBpZ,EAAe,aAAetC,GAAU,OAE9D8Z,EACG,SAAS,EACT,KAGE9O,GAEK0Q,EACKpb,GAAM,KAAKgP,GAA4B,CAC5C,MAAAtE,EACA,WAAAzI,EACA,KAAM2B,EAAW,KAAO,IAC1B,CAAC,EAGC0W,GACKta,GAAM,KAAKqN,GAAsB,CACtC,MAAOrL,EACP,WAAAC,CACF,CAAC,EAGI,GAGRG,IAEKA,EAAO,UACThC,GAAM,MAAMe,EAAE,+BAA+B,CAAC,EAIhDkZ,EAAmB,EAAI,EAEhB,QAAQ,OAAO,EAE1B,EACC,KAAK,IAEGZ,EAAO,CAAE,eAAgB,EAAM,CAAC,EAAE,KAAMtP,GAAgB,CAC7D,GAAI,CAACA,EAAO,SAAWA,EAAO,QAC5B/J,GAAM,MAAM+J,EAAO,OAAO,UACjBA,EAAO,SAAWiR,EAAe,CAC1C,IAAMC,GAAUnR,GAA2BC,CAAM,EAC7CkR,IACFjb,GAAM,QAAQib,EAAO,CAEzB,CACF,CAAC,CACF,EACA,MAAO9Y,GAAU,CAEZA,GAAO,SACTnC,GAAM,MAAMmC,EAAM,OAAO,CAM7B,CAAC,CACL,CAAC,EAEK+Y,GAAkBpc,GAAQ,IACvB,IAAIqB,GAAQoV,CAAM,EACtB,KAAK1T,EAAW,QAAS1B,GAAQ,UAAU,EAC3C,SAAS,EACX,CAACoV,EAAQ1T,EAAW,OAAO,CAAC,EAEzBsZ,GAAkBxc,GAAY,IAAM,CACxCiR,EAAc,iBAAkBsL,EAAe,EAE/C,sBAAsB,IAAM,CAC1BH,EAAS,CACX,CAAC,EACDlB,GAAqB,EAAK,CAC5B,EAAG,CAACjK,EAAesL,EAAe,CAAC,EAE7BE,GAAiB,SAAY,CAEjC,GAAIxZ,EAAe,aAAe2T,IAAW,EAC3C,OAAO3V,GAAM,QAAQ,CACnB,MAAOmB,EAAE,gCAAgC,EACzC,QAASA,EAAE,wCAAwC,EACnD,QAASA,EAAE,0BAA0B,EACrC,KAAM,UACJ6O,EAAc,cAAe,EAAK,EAElC,sBAAsB,IAAM,CAC1BhP,EAAM,eAAe,EACrBma,EAAS,CACX,CAAC,EACM,QAAQ,QAAQ,EAAI,GAE7B,SAAU,SACD,QAAQ,QAAQ,EAAK,CAEhC,CAAC,EACQxF,EAAS,GAAK,OAAO3T,EAAe,cAAc,EAAI2T,EAC/DsE,GAAqB,EAAI,EAEzBkB,EAAS,CAEb,EAEMM,GAAqB,IAAM,CAC/BjC,EAAO,SAAS,EAAE,KAChB,IAAM,CACJiB,GAAoB,EAAI,CAC1B,EACCrY,GAAW,CACV,IAAMsZ,EAAU,IAAI,IAAI,CAAC,mBAAoB,kBAAkB,CAAC,EAC5D,OAAO,KAAKtZ,CAAM,EAAE,MAAOuV,IAAgB+D,EAAQ,IAAI/D,EAAG,CAAC,GAC7D8C,GAAoB,EAAI,CAE5B,CACF,CAMF,EAEMkB,GAAwBjR,GAAwB,CAChDA,EAAM,OAAS1I,EAAe,MAChCgO,EAAc,OAAQtF,EAAM,IAAI,EAElC+F,EAAe,CACb,cAAe/F,EAAM,cACrB,cAAeA,EAAM,cACrB,OAAQA,EAAM,OACd,UAAWA,EAAM,UACjB,qBAAsBA,EAAM,qBAC5B,OAAQA,EAAM,OACd,iBAAkBA,EAAM,iBACxB,eAAgBA,EAAM,eACtB,cAAeA,EAAM,cACrB,iBAAkBA,EAAM,iBACxB,eAAgBA,EAAM,eACtB,OAAQA,EAAM,OACd,UAAWA,EAAM,UACjB,qBAAsBA,EAAM,qBAC5B,OAAQA,EAAM,MAChB,CAAC,EACD+P,GAAoB,EAAK,EACzBN,EAAyB,EAAI,CAC/B,EAEMyB,GAAuB,IAAM,CACjCzB,EAAyB,EAAK,EAC9B1J,EAAe,CACb,iBAAkB,OAClB,eAAgB,OAChB,cAAe/Q,GAAU,OACzB,iBAAkB,OAClB,eAAgB,OAChB,cAAeA,GAAU,OACzB,OAAQ,OACR,OAAQ,OACR,cAAeC,GAAa,IAC9B,CAAC,CACH,EAEAX,GAAU,IAAM,CACdmb,EAAyB,EAAK,CAChC,EAAG,CAACnZ,EAAM,MAAM,CAAC,EAEjB,IAAM6a,GACJ,EAAQf,GAAc,aAAa,QAClCA,GAAc,aAAa,qBAAuB,IAE/CgB,GAA2C,CAC/C,OAAA7a,GACA,UAAAsZ,GACA,YAAAD,GACA,eAAAnP,GACA,OAAAuP,GACA,UAAAC,GACA,cAAe3K,EACf,eAAgBhO,EAAe,eAC/B,UACEA,EAAe,aAAkBtC,GAAU,OAAS,CAACsB,EAAM,UAC/D,EAEM+a,GAAc,CAAC9a,IACnBJ,EAACU,GAAA,CAAwB,GAAGua,GAAqB,EAGnD,OACEhb,GAACuP,GAAA,CACC,OAAQjO,EACR,gBAAiBkO,GACjB,WAAYrO,EACZ,QAASjB,EAAM,QACf,OAAQA,EAAM,OACd,YAAaqB,GACb,cAAe2N,EACf,eAAgBS,EAChB,kBAAmBC,EAAkB,QACrC,cAAe1P,EAAM,cACrB,uBAAwBA,EAAM,uBAC9B,qBAAsBA,EAAM,qBAC5B,uBAAwBA,EAAM,uBAC9B,sBAAuBA,EAAM,sBAC7B,SAAUA,EAAM,eAEhB,UAAAH,EAAC0M,GAAA,CACC,KAAMyM,EACN,aAAcC,GACd,OAAQqB,GACR,UAAWC,GACX,KAAMtZ,EAAW,KACnB,EACAnB,GAAC,OACC,UAAW,2DACX,IAAKE,EAAM,aAEX,UAAAH,EAACkP,GAAA,CACC,OAAQ/O,EAAM,OACd,SAAUA,EAAM,SAChB,KAAM8J,EACN,WAAY9I,EAAe,WAC3B,cAAegO,EACf,eAAgBhP,EAAM,eACxB,EAEAH,EAACiI,GAAA,CACC,WAAY1B,EACZ,SAAUpG,EAAM,SAChB,MAAOiB,GAAY,MACnB,eAAgB+G,EAClB,EAEAnI,EAACmU,GAAA,CACC,OAAQhT,EACR,yBAA0BhB,EAAM,yBAChC,gBAAiB0Q,EACjB,IAAK,CACH,UAAAiI,EACA,QAAArO,EACA,YAAAsO,EACA,UAAAC,CACF,EACF,EAEAhZ,EAAC4U,GAAA,CACC,SAAUzU,EAAM,SAChB,KAAMA,EAAM,KACZ,eAAgBgB,EAAe,eAC/B,OAAQ2T,EACV,EAGA9U,EAACV,GAAA,CACC,UAAS,GACT,GAAI,4BAEJ,YAAWV,GAAU,IACrB,UAAWI,GACTiL,IAASrL,GAAU,IACf,6HACA,0HACN,EACA,QAAS+b,GACT,QAASxa,EAAM,WACf,SAAU,CAACA,EAAM,SAEhB,SAAAga,EACH,EAGAna,EAAC0F,GAAA,CACC,SAAUvF,EAAM,SAChB,MAAOiB,EAAW,MAClB,YAAajB,EAAM,YACnB,YAAaA,EAAM,YACnB,gBAAiBA,EAAM,gBACvB,SAAU4Z,GACV,GAAI3Y,EAAW,SACf,YAAa4Y,GACb,YAAa7Z,EAAM,YACnB,UAAWgB,EAAe,WAC1B,gBAAiByE,EACjB,OAAQzF,EAAM,OAChB,EAEAH,EAACf,GAAA,CAAQ,UAAU,aAAa,EAG/Boa,GACCrZ,EAACkB,GAAA,CACC,MAAOC,EACP,WAAYhB,EAAM,WAClB,OAAQoZ,GAAYhY,EAAS,KAC7B,OAAQ,IAAM,CACZqY,GAAoB,EAAI,CAC1B,EACA,SAAU,IAAM,CACdmB,GAAqB,CACvB,EACF,EAEA/a,EAACgY,GAAA,CAGC,SAAU7X,EAAM,WAAW,SAC3B,YAAaA,EAAM,WACnB,gBAAiBA,EAAM,cACvB,UAAWgB,EAAe,WAC1B,OAAQoY,GAAYhY,EAAS,KAC7B,aAAcJ,EAAe,YAC7B,cAAegO,EACf,kBAAmBhO,EAAe,aAAe,GACjD,mBAAqBV,GAAY,CAC/B0O,EAAc,cAAe1O,CAAO,CACtC,EACA,OAAQ,CACN,cACEU,EAAe,eAAiBrC,GAAa,QAC/C,GAAI,CACF,cAAeqC,EAAe,kBAAoB,GAClD,IAAKA,EAAe,QAAU,GAC9B,OAAQA,EAAe,WAAa,GACpC,UAAWA,EAAe,sBAAwB,GAClD,IAAKA,EAAe,QAAU,EAChC,EACA,GAAI,CACF,cAAeA,EAAe,kBAAoB,GAClD,IAAKA,EAAe,QAAU,GAC9B,OAAQA,EAAe,WAAa,GACpC,UAAWA,EAAe,sBAAwB,GAClD,IAAKA,EAAe,QAAU,EAChC,CACF,EACA,iBAAkByZ,GAClB,SAAU,CAAC9D,EAAKtS,IAAU,CACxB2K,EAAc2H,EAAKtS,CAAK,CAC1B,EACF,GAIA,CAACzB,GAAY5B,EAAe,cAAgB,KAC5ClB,GAACf,GAAA,CAAK,QAAS,UAAW,UAAW,SAAU,UAAU,WACvD,UAAAc,EAACyV,GAAA,CACC,QAAStU,EAAe,aAAe,GACvC,gBAAkBV,GAAY,CAC5B0O,EAAc,cAAe1O,CAAO,CACtC,EACF,EACC,CAACua,IAAoBE,IACxB,EAEDF,IACC/a,GAACf,GAAA,CAAK,QAAS,UAAW,UAAW,SACnC,UAAAe,GAACf,GAAA,CAAK,UAAW,SAAU,KAAM,EAC/B,UAAAc,EAACX,GAAA,CACC,UAAU,eACV,GAAI6a,EACJ,QAASjB,EACT,gBAAkBxY,GAAYyY,EAAczY,CAAO,EACrD,EACAT,EAAC,SAAM,QAASka,EAAc,UAAW,cACtC,SAAA5Z,EAAE,+BAA+B,EACpC,GACF,EACC4a,IACH,EAED,CAACF,IACAjY,GACA,CAAC5B,EAAe,aAChB,CAACf,IACCJ,EAACd,GAAA,CAAK,UAAU,aAAa,QAAS,MACnC,SAAAgc,GACH,EAGH9a,IACCH,GAAClB,GAAA,CAAI,EAAG,EAAG,EAAG,KAAM,UAAW,IAAK,SAAU,WAC5C,UAAAiB,EAACE,GAAA,CAAgB,GAAG+a,GAAqB,EACzCjb,EAACc,GAAA,CACC,QAAS,IAAM,CACb4Y,GAAU,EAAK,CACjB,EACA,UAAW,+CACX,cAAY,sCACd,GACF,GAEJ,EAEA1Z,EAACZ,GAAA,CACC,KAAMua,GACN,aAAcC,GACd,WAAY,CACV,KAAM,sCACN,QAAS,qBACT,QAAS5a,GACP,8CACA+D,EACI,0CACA,yEACN,CACF,EACA,aAAc,CAAE,KAAM,QAAS,UAAW,EAAM,EAEhD,SAAA/C,EAACP,GAAA,CACC,cAAe0P,EACf,MAAOhO,EACP,SAAU2Z,GACV,QAAS,IAAM,CACblB,GAAoB,EAAK,CAC3B,EACA,eAAgBzZ,EAAM,eACxB,EACF,GACF,CAEJ,E6D3kBA,OAAS,aAAAhC,GAAW,UAAA0F,OAAc,QAClC,OACE,kBAAA8C,GACA,mBAAA6G,GACA,mBAAAjP,GACA,kBAAA4c,GACA,iBAAA3c,GACA,iBAAA4c,GACA,qBAAA3c,OACK,yBACP,OAAS,eAAA4c,OAAmB,6BAC5B,OACE,oBAAAzJ,GAEA,aAAAhT,GACA,aAAAC,EACA,gBAAAC,OACK,yBACP,OAAS,WAAAY,GAAS,uBAAAsG,OAA2B,yBClB7C,OAAS,aAAA7H,GAAW,WAAAE,GAAS,UAAAwF,OAAc,QAC3C,OAAS,mBAAAtF,GAAiB,YAAA+c,OAAgB,yBAC1C,OACE,gBAAA/S,GAGA,aAAA1J,GACA,oBAAA0c,OACK,yBAQA,SAASC,GAAY,CAC1B,WAAAC,EACA,WAAA1S,EACA,eAAAC,EACA,KAAAiB,EACA,eAAA2F,CACF,EAMG,CACD,GAAM,CAAC8L,EAAcC,CAAe,EAAIpd,GAEtC,yBAA0B,MAAS,EAE/Bqd,EAAc/X,GAAqB6X,CAAY,EAE/C,CAAE,MAAAG,CAAM,EAAIP,GAAS,EAErBxC,EAAYza,GAAQ,IAEtBod,GACA,CAAC5c,GAAU,UAAWA,GAAU,IAAKA,GAAU,GAAG,EAAE,SAClDmK,CACF,aAKK0S,GAAgB3S,IAAelK,GAAU,iBAG/C,CAAC4c,EAAYzS,EAAgBD,EAAY2S,CAAY,CAAC,EAEnD1C,EAAY,IAAM,CACtB6C,EAAMN,GAAiB,cAAc,EACjCG,GAEFC,EAAgB,MAAS,EAEzB/L,EAAe,CACb,eAAgB,OAChB,MAAO,MACT,CAAC,GAED+L,EAAgBC,EAAY,SAAWrT,GAAa,aAAa,CAErE,EAEMwQ,EAAevU,GAAwB,CAC3CmX,EAAgBnX,CAAK,EACrBoX,EAAY,QAAUpX,CACxB,EAEA,OAAArG,GAAU,IAAM,CACV2a,gBACFlJ,EAAe,CAEb,eAAgB9G,GAAW,CAAE,eAAAE,CAAe,CAAC,EACzC,OACAA,EACJ,MAAO,MACT,CAAC,CAEL,EAAG,CAAC8P,EAAW9P,CAAc,CAAC,EAE9B7K,GAAU,IAAM,CACd,GAAI2a,SAA4B,CAC9B,IAAMjT,EAAYqD,GAAkBwS,EAAczR,CAAK,EACjD6R,EAAa1S,GAAmBsS,CAAY,EAClD9L,EAAe,CACb,eAAgB/J,EAChB,MAAOiW,CACT,CAAC,CACH,CACF,EAAG,CAACJ,EAAc5C,EAAW7O,CAAI,CAAC,EAE3B,CACL,UAAA6O,EACA,QAAS4C,EACT,WAAYC,EACZ,YAAA5C,EACA,UAAAC,CACF,CACF,CCtGA,OAAS,UAAAnV,OAA0B,QACnC,OAA2B,iBAAArF,GAAe,SAAAgW,OAAa,yBACvD,OAAS,aAAA3V,OAAiB,yBAC1B,OAAS,WAAAa,OAAe,yBAUjB,SAASqc,GAAgB5b,EAA0B,CACxD,GAAM,CAAE,UAAA8U,EAAW,WAAAlM,EAAY,eAAA8L,EAAgB,SAAApQ,CAAS,EAAItE,EACtD0P,EAAoBhM,IAAgC,EACpDmY,EAA4BnY,IAAqC,EACjEqM,EAAwBrM,IAAgC,EAExDoY,EAAY,IAAM,CACtB,GACEhH,EAAY,GAEZlM,IAAelK,GAAU,QACzB,CAACgW,EAED,OASF,IAAMqH,EAAW1H,GAAM,aACrBK,EACA,IAAInV,GAAQuV,GAAa,GAAG,EAAE,SAAS,CACzC,EAEAxQ,EAAS,iBAAkByX,EAAU,CACnC,6BAA8B,EAChC,CAAC,CACH,EAEMxM,EAAWlP,GAAqB6J,GAAkB,CACtDwF,EAAkB,QAAUrP,EAI1B,IAA2C,EAAE,SAC3CqP,EAAkB,OACpB,IAEAmM,EAA0B,QAAUxb,GAIpC,MAAsD,EAAE,SAASA,CAAI,IAErE0P,EAAsB,QAAU1P,EAEpC,EAEMmP,EAAUnP,GAAqB6J,GAAkB,CACrD,WAAW,IAAM,CACXwF,EAAkB,UAAYrP,IAGlCqP,EAAkB,QAAU,EAC9B,EAAG,GAAG,EAEFrP,IAAS,GACXyb,EAAU,CAEd,EAEA,MAAO,CACL,kBAAApM,EACA,0BAAAmM,EACA,sBAAA9L,EACA,QAAS1R,GAAckR,CAAO,EAC9B,OAAQlR,GAAcmR,CAAM,CAC9B,CACF,CCpFA,OAAS,aAAAxR,GAAW,UAAA0F,GAAQ,YAAAvF,OAAgB,QAGrC,SAAS6d,GAAuB,CACrC,eAAAnT,CACF,EAEG,CACD,GAAM,CAACoT,EAA0BC,CAA2B,EAAI/d,GAAS,CAAC,EACpEyR,EAAyBlM,GAA8B,IAAI,EAgBjE,OAAA1F,GAAU,IAAM,CACd,IAAMme,EAAUvM,EAAuB,QAEvC,GAAI,CAACuM,EACH,OAGF,IAAMC,EAAiB,IAAI,eAAgBC,GAAY,CACrD,QAAWC,KAASD,EAAS,CAC3B,IAAME,EAAQD,EAAM,YAAY,MAC5BC,GAEFL,EAA4BK,CAAK,CAErC,CACF,CAAC,EAED,OAAAH,EAAe,QAAQD,CAAO,EAEvB,IAAM,CACXC,EAAe,UAAUD,CAAO,CAClC,CACF,EAAG,CAACvM,EAAwB/G,CAAc,CAAC,EAEpC,CAAE,uBAAA+G,EAAwB,yBAAAqM,CAAyB,CAC5D,CHpBO,IAAMO,GAAgC,4BAIhCC,GAAuBC,GAAmC,CACrE,GAAM,CAAE,OAAApZ,CAAO,EAAIoZ,EACb,CAACC,EAAgBC,CAAiB,EAAIxe,GAC1C,iCACAM,EAAU,KACZ,EACM,CAACme,EAAgBC,CAAiB,EAAI1e,GAC1C,iCACAK,GAAU,GACZ,EAEM,CAAE,aAAAqb,CAAa,EAAIxb,GAAkB,EAErC,CAACwa,EAAYC,CAAa,EAAI3a,GAClCoe,GACA1C,GAAc,aAAa,aAAe,EAC5C,EAEMtU,EAAW0V,GAAY,EAEvB,CACJ,eAAAla,EACA,SAAAsD,EACA,UAAWmL,EACX,WAAAxO,EACA,GAAG4G,CACL,EAAIoT,GAAc3X,EAAQ,CACxB,aAAc,CACZ,OAAAA,EACA,WAAYqZ,EACZ,cAAehe,GAAa,QAC5B,KAAMke,CACR,CACF,CAAC,EAEK,CAACvB,EAAYyB,CAAa,EAAI3e,GAClC,mCACA,EACF,EAEM,CAAE,gBAAA4e,CAAgB,EAAIhC,GAAe,EACrCzN,EAAKF,GAAgB,EACrBwC,EAAuBnM,GAAgC,IAAI,EAC3DiM,EAAgBjM,GAAgC,IAAI,EACpDoM,EAAyBpM,GAAgC,IAAI,EAE7D,CAAE,UAAAiV,GAAW,QAAArO,EAAS,WAAA2S,EAAY,YAAArE,GAAa,UAAAC,CAAU,EAC7DwC,GAAY,CACV,WAAAC,EACA,WAAYta,EAAe,WAC3B,eAAgBA,EAAe,eAC/B,KAAMA,EAAe,KACrB,eAAAyO,CACF,CAAC,EAEG,CACJ,kBAAAC,EACA,0BAAAmM,GACA,sBAAA9L,GACA,QAAAR,EACA,OAAAC,EACF,EAAIoM,GAAgB,CAClB,UAAW3a,GAAY,UACvB,WAAYD,EAAe,WAC3B,eAAgBA,EAAe,eAC/B,SAAAsD,CACF,CAAC,EAGK4Y,GAAc,IAAM,CAExBzN,EAAe,CACb,iBAAkB,GAClB,iBAAkB,GAClB,cAAe9Q,GAAa,IAC9B,CAAC,CACH,EAEMwe,GAAc,IAAM,CACxB1N,EAAe,CACb,eAAgB,OAChB,cAAe9Q,GAAa,IAC9B,CAAC,CACH,EAEMqQ,GAAgB3Q,GACpB,CACEsY,EACAtS,EACAF,KAGG,CAQH,GAPIwS,IAAQ,cACViG,EAAkBvY,CAAK,EAErBsS,IAAQ,QACVmG,EAAkBzY,CAAK,EAItBsS,IAAQ,eAAiBtS,GACzBsS,IAAQ,eACNtS,IAAU3F,EAAU,YAAc2F,IAAU3F,EAAU,aACzD,CAGA,IAAMsI,EAAO,CACX,iBAAkB,GAClB,iBAAkB,GAClB,CAAC2P,CAAG,EAAGtS,CACT,EAEIsS,IAAQ,eACV3P,EAAK,eAA2B,IAGlCyI,EAAezI,CAAI,EAEnB,MACF,CAEA,GAAI2P,IAAQ,cAAgBtS,IAAU3F,EAAU,MAAO,CACrD,IAAMsI,EAAO,CACX,MAAO,OACP,eAAgB,OAChB,CAAC2P,CAAG,EAAGtS,CACT,EAEAoL,EAAezI,CAAI,EAEnB,MACF,CAEA,GAAI2P,IAAQ,cAAgBtS,IAAU3F,EAAU,OAAQ,CACtD+Q,EAAe,CACb,kBAAmBgC,GAAiB,KACpC,CAACkF,CAAG,EAAGtS,CACT,CAAC,EACD,MACF,CAEAC,EAASqS,EAAKtS,EAAOF,EAAO,CAC9B,CACF,EAEMiZ,GAAuBvV,GAAmB,CAC9CkV,EAAclV,CAAK,EACfA,EACFsV,GAAY,EAEZD,GAAY,CAEhB,EAEAlf,GAAU,IAAM,CACd,IAAMqf,EAAoB5S,GAAkB,CAC1CnG,EAAS,cAAemG,CAAK,CAC/B,EACA,OAAA8C,EAAG,GAAG,oBAAqB8P,CAAgB,EAEpC,IAAM,CACX9P,EAAG,IAAI,oBAAqB8P,CAAgB,CAC9C,CACF,EAAG,CAAC,CAAC,EAELrf,GAAU,IAAM,CACd,IAAMsf,EAAqBC,IAAoC,CAC7D,sBAAsB,IAAM,CAC1BA,IAAQ,MAAM,CAChB,CAAC,CACH,EAGMC,EAA6B1Y,IAAmB,CACpD,IAAM2F,EAAQ5E,GAAoBf,GAAK,CAAC,CAAC,EACnC,CAAE,WAAA8D,EAAY,eAAAC,EAAe,EAAI7H,EAGvC,GACE0O,EAAkB,UAAY,IAC7B9G,IAAelK,EAAU,YACxBkK,IAAelK,EAAU,aAC3B,CACA4F,EAAS,gBAAiBmG,CAAK,EAC/B6S,EAAkBzN,EAAqB,OAAO,EAC9C,MACF,CAGA,GAAIlH,GAAW,CAAE,WAAAC,EAAY,eAAAC,EAAe,CAAC,EAAG,CAC9CoU,EAAW,MAAS,EAEpBxN,EAAe,CACb,eAAgB,OAChB,MAAO,MACT,CAAC,EAED,sBAAsB,IAAM,CAI1BlC,EAAG,KAAK,oBAAqB9C,CAAK,CACpC,CAAC,EAED6S,EAAkB3N,EAAc,OAAO,EACvC,MACF,CAGA,GACE/G,IAAelK,EAAU,YACzBkK,IAAelK,EAAU,MACzB,CACA4F,EAAS,cAAemG,CAAK,EAC7B6S,EAAkB3N,EAAc,OAAO,EACvC,MACF,CAGA,GAAI/G,IAAelK,EAAU,YAAa,CACxC4F,EAAS,gBAAiBmG,CAAK,EAC/B6S,EAAkBzN,EAAqB,OAAO,EAC9C,MACF,CAGA,GAAIjH,IAAelK,EAAU,OAAQ,CAEnCue,EAAW,MAAS,EAGpBxN,EAAe,CACb,WAAY/Q,EAAU,MACtB,YAAa+L,CACf,CAAC,EAED6S,EAAkB3N,EAAc,OAAO,EACvC,MACF,CAEA,GACE/G,IAAelK,EAAU,QACzBmd,GAA0B,QAC1B,CACA,IAAM4B,GACJ5B,GAA0B,UAAY,EAClC,cACA,YACNvX,EAASmZ,GAAOhT,CAAK,EACrB6S,EAAkB3N,EAAc,OAAO,EACvC,MACF,CAGA,GAAI/G,IAAelK,EAAU,cAAe,CAC1C4F,EAAS,kBAAmBmG,CAAK,EACjC6S,EAAkBxN,EAAuB,OAAO,EAChD,MACF,CAGAxL,EAAS,cAAemG,CAAK,EAC7B6S,EAAkB3N,EAAc,OAAO,CACzC,EAEA,OAAApC,EAAG,GAAG,uBAAwBiQ,CAAyB,EAEhD,IAAM,CACXjQ,EAAG,IAAI,uBAAwBiQ,CAAyB,CAC1D,CAEF,EAAG,CAACxc,EAAgBC,CAAU,CAAC,EAE/BjD,GAAU,IAAM,CAEd6J,EAAM,MAAM,EACZA,EAAM,eAAe,EAErBkI,GAAsB,QAAU,CAClC,EAAG,CAACzM,CAAM,CAAC,EAGXtF,GAAU,IAAM,CAEZgD,EAAe,aAAetC,EAAU,QACxC,CAACsC,EAAe,mBAEhBsD,EAAS,oBAAqBmN,GAAiB,IAAI,CAEvD,EAAG,CAACzQ,EAAe,WAAYA,EAAe,iBAAiB,CAAC,EAEhE,IAAMoF,GAAaI,GAAe,EAC5BqG,GAAYS,GAAa,EAEzBoD,GAAkB,IAAM,CAI5B,GAHIiI,WACFE,EAAU,EAER7X,EAAe,aAAetC,EAAU,MAAO,CACjD,GAAM,CAACgf,EAAU,EAAGC,EAAU,CAAC,EAAI9Q,GAC7B+Q,GAAW,IAAIre,GAAQiK,GAAWkU,CAAO,CAAC,EAC7C,IAAIlU,GAAWmU,CAAO,CAAC,EACvB,IAAI,CAAC,EACL,SAAS,EAGZ,sBAAsB,IAAM,CAC1BpQ,EAAG,KAAK,oBAAqBqQ,EAAQ,CACvC,CAAC,CACH,CACF,EAEM,CAAE,uBAAAhO,GAAwB,yBAAAqM,EAAyB,EACvDD,GAAuB,CACrB,eAAgBhb,EAAe,cACjC,CAAC,EAEH,MAAO,CACL,GAAG6G,EACH,KAAM7G,EAAe,KACrB,KAAMA,EAAe,WACrB,MAAOA,EAAe,MACtB,eAAAA,EACA,cAAAgO,GACA,eAAAS,EACA,gBAAAuN,EAIA,WAAA1B,EACA,cAAe8B,GACf,WAAAnc,EACA,QAAAsO,EACA,OAAAC,GAEA,cAAAG,EACA,uBAAAC,GACA,yBAAAqM,GACA,qBAAApM,EACA,uBAAAC,EACA,sBAAAC,GAEA,SAAAvK,EACA,UAAAmT,GACA,QAAArO,EACA,YAAAsO,GACA,UAAAC,EACA,WAAAzS,GACA,gBAAAsK,GACA,OAAApN,EACA,WAAAwV,EACA,cAAAC,EACA,kBAAArJ,CACF,CACF,EItXI,cAAA7P,OAAA,oBARG,IAAMge,GAKR7d,GAAU,CACb,IAAM6H,EAAQ4U,GAAoBzc,CAAK,EACvC,OACEH,GAAC0Y,GAAA,CACE,GAAG1Q,EACJ,aAAc7H,EAAM,aACpB,gBAAiBA,EAAM,gBACzB,CAEJ","sourcesContent":["import React, { useCallback, useEffect, useId, useMemo, useState } from \"react\";\nimport {\n OrderValidationResult,\n useLocalStorage,\n useMemoizedFn,\n useOrderlyContext,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport {\n OrderlyOrder,\n OrderSide,\n OrderType,\n PositionType,\n} from \"@orderly.network/types\";\nimport {\n Box,\n cn,\n Divider,\n Flex,\n modal,\n SimpleSheet,\n Switch,\n ThrottledButton,\n toast,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { TPSLAdvancedWidget } from \"@orderly.network/ui-tpsl\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { AdditionalConfigButton } from \"./components/additional/additionalConfigButton\";\nimport {\n AdditionalInfo,\n AdditionalInfoProps,\n} from \"./components/additional/additionalInfo\";\nimport { PinButton } from \"./components/additional/pinButton\";\nimport { AdvancedTPSLResult } from \"./components/advancedTPSLResult\";\nimport { AssetInfo } from \"./components/assetInfo\";\nimport { Available } from \"./components/available\";\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport { MaxQtyConfirm } from \"./components/dialog/maxQtyConfirm\";\nimport { scaledOrderConfirmDialogId } from \"./components/dialog/scaledOrderConfirm\";\nimport { OrderEntryHeader } from \"./components/header\";\nimport { OrderEntryProvider } from \"./components/orderEntryProvider\";\nimport { OrderInput } from \"./components/orderInput\";\nimport { QuantitySlider } from \"./components/quantitySlider\";\nimport { ReduceOnlySwitch } from \"./components/reduceOnlySwitch\";\nimport { OrderTPSL } from \"./components/tpsl\";\nimport { type OrderEntryScriptReturn } from \"./orderEntry.script\";\nimport { getScaledPlaceOrderMessage } from \"./utils\";\n\ntype OrderEntryProps = OrderEntryScriptReturn & {\n containerRef?: React.RefObject<HTMLDivElement>;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n};\n\nexport const OrderEntry: React.FC<OrderEntryProps> = (props) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n setOrderValues,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n disableFeatures,\n currentLtv,\n fillMiddleValue,\n soundAlert,\n setSoundAlert,\n currentFocusInput,\n } = props;\n const [maxQtyConfirmOpen, setMaxQtyConfirmOpen] = useState(false);\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n const [hasAdvancedTPSLResult, setHasAdvancedTPSLResult] =\n useState<boolean>(false);\n\n const { errors, validated } = metaState;\n\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\n\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true,\n );\n const [pinned, setPinned] = useLocalStorage(\n \"orderly-order-additional-pinned\",\n true,\n );\n const [showTPSLAdvanced, setShowTPSLAdvanced] = useState(false);\n const [hidden, setHidden] = useLocalStorage(\"orderly-order-hidden\", false);\n\n const [slippage, setSlippage] = useLocalStorage(\"orderly-slippage\", \"1\", {\n parseJSON: ((value: string | null) => {\n return !value || value === '\"\"' ? \"1\" : JSON.parse(value);\n }) as any,\n });\n\n const { notification } = useOrderlyContext();\n\n const soundAlertId = useId();\n\n const { getErrorMsg } = useOrderEntryFormErrorMsg(validated ? errors : null);\n\n const buttonLabel = useMemo(() => {\n return side === OrderSide.BUY\n ? t(\"orderEntry.buyLong\")\n : t(\"orderEntry.sellShort\");\n }, [side, t]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\n\n // set slippage\n useEffect(() => {\n if (disableFeatures?.includes(\"slippageSetting\")) {\n return;\n }\n if (slippage) {\n setOrderValue(\"slippage\", Number(slippage));\n } else {\n setOrderValue(\"slippage\", undefined);\n }\n }, [slippage, disableFeatures]);\n\n useEffect(() => {\n const clickHandler = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\"#order-entry-submit-button\")\n // || target.closest(\".orderly-order-entry\")\n ) {\n return;\n }\n setErrorMsgVisible((visible) => {\n if (visible) {\n return false;\n }\n return visible;\n });\n };\n\n if (errorMsgVisible) {\n document.addEventListener(\"click\", clickHandler);\n } else {\n document.removeEventListener(\"click\", clickHandler);\n }\n\n return () => {\n document.removeEventListener(\"click\", clickHandler);\n };\n }, [errorMsgVisible]);\n\n const onSubmit = useMemoizedFn(async () => {\n const isScaledOrder = formattedOrder.order_type === OrderType.SCALED;\n\n helper\n .validate()\n .then(\n // validate success, it return the order\n // TODO: get order from other function\n (order: any) => {\n // scaled order is always need confirm\n if (isScaledOrder) {\n return modal.show(scaledOrderConfirmDialogId, {\n order,\n symbolInfo,\n size: isMobile ? \"sm\" : \"md\",\n });\n }\n\n if (needConfirm) {\n return modal.show(orderConfirmDialogId, {\n order: formattedOrder,\n symbolInfo,\n });\n }\n\n return true;\n },\n // should catch validate error first, then submit\n (errors: OrderValidationResult) => {\n // slippage error message is not show input tooltip, so we need to manually show it by toast\n if (errors.slippage) {\n toast.error(t(\"orderEntry.slippage.error.max\"));\n }\n\n // when switch order type, validated not changed, so we need to set it to true\n setErrorMsgVisible(true);\n\n return Promise.reject();\n },\n )\n .then(() => {\n // validate success, submit order\n return submit({ resetOnSuccess: false }).then((result: any) => {\n if (!result.success && result.message) {\n toast.error(result.message);\n } else if (result.success && isScaledOrder) {\n const message = getScaledPlaceOrderMessage(result);\n if (message) {\n toast.success(message);\n }\n }\n });\n })\n .catch((error) => {\n // submit order error\n if (error?.message) {\n toast.error(error.message);\n // toast.error(`Error:${error.message}`);\n\n // if (error instanceof ApiError) {\n // toast.error(error.message);\n }\n });\n });\n\n const formattedMaxQty = useMemo(() => {\n return new Decimal(maxQty)\n .todp(symbolInfo.base_dp, Decimal.ROUND_DOWN)\n .toString();\n }, [maxQty, symbolInfo.base_dp]);\n\n const onMaxQtyConfirm = useCallback(() => {\n setOrderValue(\"order_quantity\", formattedMaxQty);\n // submit order when order_quantity updated\n requestAnimationFrame(() => {\n onSubmit();\n });\n setMaxQtyConfirmOpen(false);\n }, [setOrderValue, formattedMaxQty]);\n\n const validateSubmit = async () => {\n // show a prompt reminding the user. If the user confirms, automatically disable Reduce Only and proceed with the action.\n if (formattedOrder.reduce_only && maxQty === 0) {\n return modal.confirm({\n title: t(\"orderEntry.reduceOnly.reminder\"),\n content: t(\"orderEntry.reduceOnly.reminder.content\"),\n okLabel: t(\"orderEntry.placeOrderNow\"),\n onOk: async () => {\n setOrderValue(\"reduce_only\", false);\n // submit order when reduce only updated\n requestAnimationFrame(() => {\n props.resetMetaState();\n onSubmit();\n });\n return Promise.resolve(true);\n },\n onCancel: async () => {\n return Promise.resolve(false);\n },\n });\n } else if (maxQty > 0 && Number(formattedOrder.order_quantity) > maxQty) {\n setMaxQtyConfirmOpen(true);\n } else {\n onSubmit();\n }\n };\n\n const onShowTPSLAdvanced = () => {\n helper.validate().then(\n () => {\n setShowTPSLAdvanced(true);\n },\n (errors) => {\n const tpslKey = new Set([\"tp_trigger_price\", \"sl_trigger_price\"]);\n if (Object.keys(errors).every((key: string) => tpslKey.has(key))) {\n setShowTPSLAdvanced(true);\n }\n },\n );\n // modal.show(TPSLAdvancedDialogId, {\n // order: formattedOrder,\n // setOrderValue: setOrderValue,\n // });\n // setShowTPSLAdvanced(true);\n };\n\n const onSubmitAdvancedTPSL = (order: OrderlyOrder) => {\n if (order.side !== formattedOrder.side) {\n setOrderValue(\"side\", order.side);\n }\n setOrderValues({\n position_type: order.position_type,\n tp_order_type: order.tp_order_type,\n tp_pnl: order.tp_pnl,\n tp_offset: order.tp_offset,\n tp_offset_percentage: order.tp_offset_percentage,\n tp_ROI: order.tp_ROI,\n tp_trigger_price: order.tp_trigger_price,\n tp_order_price: order.tp_order_price,\n sl_order_type: order.sl_order_type,\n sl_trigger_price: order.sl_trigger_price,\n sl_order_price: order.sl_order_price,\n sl_pnl: order.sl_pnl,\n sl_offset: order.sl_offset,\n sl_offset_percentage: order.sl_offset_percentage,\n sl_ROI: order.sl_ROI,\n });\n setShowTPSLAdvanced(false);\n setHasAdvancedTPSLResult(true);\n };\n\n const onDeleteAdvancedTPSL = () => {\n setHasAdvancedTPSLResult(false);\n setOrderValues({\n tp_trigger_price: undefined,\n tp_order_price: undefined,\n tp_order_type: OrderType.MARKET,\n sl_trigger_price: undefined,\n sl_order_price: undefined,\n sl_order_type: OrderType.MARKET,\n tp_pnl: undefined,\n sl_pnl: undefined,\n position_type: PositionType.FULL,\n });\n };\n\n useEffect(() => {\n setHasAdvancedTPSLResult(false);\n }, [props.symbol]);\n\n const showSoundSection =\n Boolean(notification?.orderFilled?.media) &&\n (notification?.orderFilled?.displayInOrderEntry ?? true);\n\n const additionalInfoProps: AdditionalInfoProps = {\n pinned,\n setPinned,\n needConfirm,\n setNeedConfirm,\n hidden,\n setHidden,\n onValueChange: setOrderValue,\n orderTypeExtra: formattedOrder[\"order_type_ext\"],\n showExtra:\n formattedOrder[\"order_type\"] === OrderType.LIMIT && !props.tpslSwitch,\n };\n // Additional info (fok,ioc、post only, order confirm hidden)\n const extraButton = !pinned && (\n <AdditionalConfigButton {...additionalInfoProps} />\n );\n\n return (\n <OrderEntryProvider\n errors={errors}\n errorMsgVisible={errorMsgVisible}\n symbolInfo={symbolInfo}\n onFocus={props.onFocus}\n onBlur={props.onBlur}\n getErrorMsg={getErrorMsg}\n setOrderValue={setOrderValue}\n setOrderValues={setOrderValues}\n currentFocusInput={currentFocusInput.current}\n priceInputRef={props.priceInputRef}\n priceInputContainerRef={props.priceInputContainerRef}\n triggerPriceInputRef={props.triggerPriceInputRef}\n activatedPriceInputRef={props.activatedPriceInputRef}\n lastQuantityInputType={props.lastQuantityInputType}\n leverage={props.symbolLeverage}\n >\n <MaxQtyConfirm\n open={maxQtyConfirmOpen}\n onOpenChange={setMaxQtyConfirmOpen}\n maxQty={formattedMaxQty}\n onConfirm={onMaxQtyConfirm}\n base={symbolInfo.base}\n />\n <div\n className={\"oui-space-y-2 oui-text-base-contrast-54 xl:oui-space-y-3\"}\n ref={props.containerRef}\n >\n <OrderEntryHeader\n symbol={props.symbol}\n canTrade={props.canTrade}\n side={side}\n order_type={formattedOrder.order_type!}\n setOrderValue={setOrderValue}\n symbolLeverage={props.symbolLeverage}\n />\n\n <Available\n currentLtv={currentLtv}\n canTrade={props.canTrade}\n quote={symbolInfo?.quote}\n freeCollateral={freeCollateral}\n />\n\n <OrderInput\n values={formattedOrder}\n priceInputContainerWidth={props.priceInputContainerWidth}\n fillMiddleValue={fillMiddleValue}\n bbo={{\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n }}\n />\n\n <QuantitySlider\n canTrade={props.canTrade}\n side={props.side}\n order_quantity={formattedOrder.order_quantity}\n maxQty={maxQty}\n />\n\n {/* Submit button */}\n <ThrottledButton\n fullWidth\n id={\"order-entry-submit-button\"}\n // color={side === OrderSide.BUY ? \"buy\" : \"sell\"}\n data-type={OrderSide.BUY}\n className={cn(\n side === OrderSide.BUY\n ? \"orderly-order-entry-submit-button-buy oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"orderly-order-entry-submit-button-sell oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\",\n )}\n onClick={validateSubmit}\n loading={props.isMutating}\n disabled={!props.canTrade}\n >\n {buttonLabel}\n </ThrottledButton>\n\n {/* Asset info */}\n <AssetInfo\n canTrade={props.canTrade}\n quote={symbolInfo.quote}\n estLiqPrice={props.estLiqPrice}\n estLeverage={props.estLeverage}\n currentLeverage={props.currentLeverage}\n slippage={slippage}\n dp={symbolInfo.quote_dp}\n setSlippage={setSlippage}\n estSlippage={props.estSlippage}\n orderType={formattedOrder.order_type!}\n disableFeatures={disableFeatures}\n symbol={props.symbol}\n />\n\n <Divider className=\"oui-w-full\" />\n\n {/* TP SL switch and content */}\n {hasAdvancedTPSLResult ? (\n <AdvancedTPSLResult\n order={formattedOrder}\n symbolInfo={props.symbolInfo}\n errors={validated ? errors : null}\n onEdit={() => {\n setShowTPSLAdvanced(true);\n }}\n onDelete={() => {\n onDeleteAdvancedTPSL();\n }}\n />\n ) : (\n <OrderTPSL\n // onCancelTPSL={props.cancelTP_SL}\n // onEnableTP_SL={props.enableTP_SL}\n quote_dp={props.symbolInfo.quote_dp}\n switchState={props.tpslSwitch}\n onSwitchChanged={props.setTpslSwitch}\n orderType={formattedOrder.order_type!}\n errors={validated ? errors : null}\n isReduceOnly={formattedOrder.reduce_only}\n setOrderValue={setOrderValue}\n reduceOnlyChecked={formattedOrder.reduce_only ?? false}\n onReduceOnlyChange={(checked) => {\n setOrderValue(\"reduce_only\", checked);\n }}\n values={{\n position_type:\n formattedOrder.position_type ?? PositionType.PARTIAL,\n tp: {\n trigger_price: formattedOrder.tp_trigger_price ?? \"\",\n PnL: formattedOrder.tp_pnl ?? \"\",\n Offset: formattedOrder.tp_offset ?? \"\",\n \"Offset%\": formattedOrder.tp_offset_percentage ?? \"\",\n ROI: formattedOrder.tp_ROI ?? \"\",\n },\n sl: {\n trigger_price: formattedOrder.sl_trigger_price ?? \"\",\n PnL: formattedOrder.sl_pnl ?? \"\",\n Offset: formattedOrder.sl_offset ?? \"\",\n \"Offset%\": formattedOrder.sl_offset_percentage ?? \"\",\n ROI: formattedOrder.sl_ROI ?? \"\",\n },\n }}\n showTPSLAdvanced={onShowTPSLAdvanced}\n onChange={(key, value) => {\n setOrderValue(key, value);\n }}\n />\n )}\n\n {/* reduce only switch and label */}\n {(!isMobile || formattedOrder.reduce_only === true) && (\n <Flex justify={\"between\"} itemAlign={\"center\"} className=\"oui-mt-2\">\n <ReduceOnlySwitch\n checked={formattedOrder.reduce_only ?? false}\n onCheckedChange={(checked) => {\n setOrderValue(\"reduce_only\", checked);\n }}\n />\n {!showSoundSection && extraButton}\n </Flex>\n )}\n {showSoundSection && (\n <Flex justify={\"between\"} itemAlign={\"center\"}>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n className=\"oui-h-[14px]\"\n id={soundAlertId}\n checked={soundAlert}\n onCheckedChange={(checked) => setSoundAlert(checked)}\n />\n <label htmlFor={soundAlertId} className={\"oui-text-xs\"}>\n {t(\"portfolio.setting.soundAlerts\")}\n </label>\n </Flex>\n {extraButton}\n </Flex>\n )}\n {!showSoundSection &&\n isMobile &&\n !formattedOrder.reduce_only &&\n !pinned && (\n <Flex className=\"oui-w-full\" justify={\"end\"}>\n {extraButton}\n </Flex>\n )}\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {pinned && (\n <Box p={2} r={\"md\"} intensity={700} position={\"relative\"}>\n <AdditionalInfo {...additionalInfoProps} />\n <PinButton\n onClick={() => {\n setPinned(false);\n }}\n className={\"oui-group oui-absolute oui-right-2 oui-top-2\"}\n data-testid=\"oui-testid-orderEntry-pinned-button\"\n />\n </Box>\n )}\n </div>\n\n <SimpleSheet\n open={showTPSLAdvanced}\n onOpenChange={setShowTPSLAdvanced}\n classNames={{\n body: \"oui-h-full oui-pb-0 oui-border-none\",\n overlay: \"!oui-bg-base-10/60\",\n content: cn(\n \"oui-rounded-[16px] oui-border-none !oui-p-0\",\n isMobile\n ? \"oui-inset-y-0 oui-right-0 oui-w-[280px]\"\n : \"!oui-bottom-[40px] oui-right-3 oui-top-[44px] !oui-h-auto oui-w-[360px]\",\n ),\n }}\n contentProps={{ side: \"right\", closeable: false }}\n >\n <TPSLAdvancedWidget\n setOrderValue={setOrderValue}\n order={formattedOrder as OrderlyOrder}\n onSubmit={onSubmitAdvancedTPSL}\n onClose={() => {\n setShowTPSLAdvanced(false);\n }}\n symbolLeverage={props.symbolLeverage}\n />\n </SimpleSheet>\n </OrderEntryProvider>\n );\n};\n","import { useState } from \"react\";\nimport {\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n} from \"@orderly.network/ui\";\nimport { AdditionalInfo, AdditionalInfoProps } from \"./additionalInfo\";\n\nexport function AdditionalConfigButton(props: AdditionalInfoProps) {\n const [open, setOpen] = useState(false);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n data-testid=\"oui-testid-orderEntry-additional-button\"\n onClick={() => {\n setOpen(true);\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"oui-fill-white/[.36] hover:oui-fill-white/80\"\n >\n <path\n d=\"M3.332 2.665a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667z\"\n // fill=\"#fff\"\n // fillOpacity={open ? 0.8 : 0.36}\n />\n </svg>\n </button>\n </PopoverTrigger>\n <PopoverContent side={\"top\"} align={\"end\"} className={\"oui-w-[230px]\"}>\n <AdditionalInfo {...props} />\n </PopoverContent>\n </PopoverRoot>\n );\n}\n","import { FC, useEffect } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { Checkbox, cn, Divider, Flex, Switch } from \"@orderly.network/ui\";\n\nexport type AdditionalInfoProps = {\n pinned: boolean;\n setPinned: (value: boolean) => void;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n hidden: boolean;\n setHidden: (value: boolean) => void;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n orderTypeExtra?: OrderType;\n showExtra?: boolean;\n};\n\nexport const AdditionalInfo: FC<AdditionalInfoProps> = (props) => {\n const { pinned, orderTypeExtra } = props;\n const { t } = useTranslation();\n\n const onTypeToggle = (type: OrderType) => (checked: boolean) => {\n if (props.onValueChange) {\n props.onValueChange(\n \"order_type_ext\" as keyof OrderlyOrder,\n checked ? type : \"\",\n // orderTypeExtra === type ? \"\" : type\n );\n }\n };\n\n useEffect(() => {\n props.onValueChange?.(\"visible_quantity\", props.hidden ? 0 : 1);\n }, [props.hidden]);\n\n return (\n <div className={\"oui-text-base-contrast-54\"}>\n <Flex\n justify={pinned ? \"start\" : \"between\"}\n mb={3}\n width={pinned ? \"unset\" : \"100%\"}\n className=\"oui-gap-x-2 md:oui-gap-x-3\"\n wrap=\"wrap\"\n gapY={1}\n >\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-postOnly-checkBox\"\n id={\"toggle_order_post_only\"}\n className=\"oui-peer\"\n color={\"white\"}\n variant={\"radio\"}\n disabled={!props.showExtra}\n checked={orderTypeExtra === OrderType.POST_ONLY}\n onCheckedChange={onTypeToggle(OrderType.POST_ONLY)}\n />\n <label\n htmlFor={\"toggle_order_post_only\"}\n className={cn(\n \"oui-ml-1 oui-text-2xs peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {t(\"orderEntry.orderType.postOnly\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-ioc-checkBox\"\n id={\"toggle_order_iov\"}\n color={\"white\"}\n className=\"oui-peer\"\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.IOC}\n onCheckedChange={onTypeToggle(OrderType.IOC)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_iov\"}\n className={cn(\n \"oui-ml-1 oui-text-2xs peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {t(\"orderEntry.orderType.ioc\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-fox-checkBox\"\n id={\"toggle_order_fok\"}\n color={\"white\"}\n variant={\"radio\"}\n className=\"oui-peer\"\n checked={orderTypeExtra === OrderType.FOK}\n onCheckedChange={onTypeToggle(OrderType.FOK)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_fok\"}\n className={cn(\n \"oui-ml-1 oui-text-2xs peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {t(\"orderEntry.orderType.fok\")}\n </label>\n </Flex>\n </Flex>\n\n <Flex gapX={6}>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-orderConfirm-checkBox\"\n id={\"toggle_order_confirm\"}\n color={\"white\"}\n checked={props.needConfirm}\n onCheckedChange={(checked) => {\n props.setNeedConfirm(!!checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_confirm\"}\n className={\"oui-ml-1 oui-text-2xs\"}\n >\n {t(\"orderEntry.orderConfirm\")}\n </label>\n </Flex>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-hidden-checkBox\"\n id={\"toggle_order_hidden\"}\n color={\"white\"}\n checked={props.hidden}\n onCheckedChange={(checked: boolean) => {\n props.setHidden(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_hidden\"}\n className={\"oui-ml-1 oui-text-2xs\"}\n >\n {t(\"orderEntry.hidden\")}\n </label>\n </Flex>\n </Flex>\n {!pinned && (\n <>\n <Divider className={\"oui-my-3\"} />\n <Flex>\n <Switch\n data-testid=\"oui-testid-orderEntry-additional-keepVisible-switch\"\n id={\"toggle_order_keep_visible\"}\n onCheckedChange={(checked) => {\n props.setPinned(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_keep_visible\"}\n className={\"oui-ml-1 oui-text-2xs\"}\n >\n {t(\"orderEntry.keepVisible\")}\n </label>\n </Flex>\n </>\n )}\n </div>\n );\n};\n","import { HTMLAttributes, useState } from \"react\";\n\nconst defaultPath =\n \"M10.007 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.852-2.523 1.233.361 1.95.015 2.961-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103 5.35 5.35 0 0 0-2.104-1.312c-.448-.15-.808-.208-1.042-.208\";\n\nexport const PinButton = (props: HTMLAttributes<HTMLButtonElement>) => {\n const [path, setPath] = useState(defaultPath);\n return (\n <button {...props}>\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n focusable={false}\n onMouseEnter={() => {\n setPath(\n 'M10.008 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.853-2.523 1.232.361 1.95.015 2.96-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103A5.35 5.35 0 0 0 11.05 1.51c-.448-.15-.808-.208-1.042-.208m.258 1.37c.708.131 1.421.6 1.93 1.107.507.508.94 1.13 1.119 1.945-.636.61-1.026.658-1.662.323a.67.67 0 0 0-.779.117c-1.214 1.213-1.533 2.314-1.533 3.8 0 1.292-.076 1.773-.48 2.206-.113.123-.27.104-.374 0L3.799 7.486a.24.24 0 0 1-.017-.34c.239-.29.769-.515 2.226-.514 1.742.001 2.668-.448 3.812-1.52a.67.67 0 0 0 .125-.77c-.343-.686-.29-1.047.321-1.67\"',\n );\n }}\n onMouseLeave={() => {\n setPath(defaultPath);\n }}\n className=\"oui-text-primary-darken\"\n >\n <path d={path} />\n </svg>\n </button>\n );\n};\n","import { SVGProps } from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport {\n API,\n OrderlyOrder,\n OrderType,\n PositionType,\n} from \"@orderly.network/types\";\nimport { Divider, Flex, Text } from \"@orderly.network/ui\";\n\nexport function AdvancedTPSLResult(props: {\n order: Partial<OrderlyOrder>;\n symbolInfo: API.SymbolExt;\n errors: OrderValidationResult | null;\n onEdit: () => void;\n onDelete: () => void;\n}) {\n const { order: formattedOrder, symbolInfo, onEdit, onDelete, errors } = props;\n\n const { getErrorMsg } = useOrderEntryFormErrorMsg(errors);\n const { t } = useTranslation();\n\n const renderTp = () => {\n const error = getErrorMsg(\"tp_trigger_price\");\n if (formattedOrder.tp_trigger_price || formattedOrder.tp_order_price) {\n return (\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-w-full\"\n gap={4}\n >\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n justify={\"between\"}\n gapY={1}\n className=\"oui-w-full\"\n >\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.tpTriggerPrice\")}</Text>\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n className=\"oui-text-base-contrast\"\n dp={symbolInfo.quote_dp}\n >\n {formattedOrder.tp_trigger_price ?? \"\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.tpOrderPrice\")}</Text>\n {formattedOrder.tp_order_type === OrderType.LIMIT ? (\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n className=\"oui-text-base-contrast\"\n dp={symbolInfo.quote_dp}\n >\n {formattedOrder.tp_order_price ?? \"\"}\n </Text.numeral>\n ) : (\n <Text className=\"oui-text-base-contrast\">Market</Text>\n )}\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.totalEstTpPnl\")}</Text>\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n coloring\n dp={2}\n >\n {Number(formattedOrder.tp_pnl)}\n </Text.numeral>\n </Flex>\n </Flex>\n {error && (\n <Flex\n justify={\"start\"}\n itemAlign={\"start\"}\n gap={2}\n className=\"oui-w-full\"\n >\n <div className=\"oui-relative oui-top-[7px] oui-size-1 oui-rounded-full oui-bg-danger\" />\n <Text className=\"oui-text-danger\">{error}</Text>\n </Flex>\n )}\n </Flex>\n );\n }\n return null;\n };\n\n const renderSl = () => {\n if (formattedOrder.sl_trigger_price || formattedOrder.sl_order_price) {\n const error = getErrorMsg(\"sl_trigger_price\");\n return (\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-w-full\"\n gap={4}\n >\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n justify={\"between\"}\n gapY={1}\n className=\"oui-w-full\"\n >\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.slTriggerPrice\")}</Text>\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n className=\"oui-text-base-contrast\"\n dp={symbolInfo.quote_dp}\n >\n {formattedOrder.sl_trigger_price ?? \"\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.slOrderPrice\")}</Text>\n {formattedOrder.sl_order_type === OrderType.LIMIT ? (\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n className=\"oui-text-base-contrast\"\n dp={symbolInfo.quote_dp}\n >\n {formattedOrder.sl_order_price ?? \"\"}\n </Text.numeral>\n ) : (\n <Text className=\"oui-text-base-contrast\">Market</Text>\n )}\n </Flex>\n\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.totalEstSlPnl\")}</Text>\n <Text.numeral\n coloring\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n dp={2}\n >\n {Number(formattedOrder.sl_pnl)}\n </Text.numeral>\n </Flex>\n {error && (\n <Flex\n justify={\"start\"}\n itemAlign={\"start\"}\n gap={2}\n className=\"oui-w-full\"\n >\n <div className=\"oui-relative oui-top-[7px] oui-size-1 oui-rounded-full oui-bg-danger\" />\n <Text className=\"oui-text-danger\">{error}</Text>\n </Flex>\n )}\n </Flex>\n </Flex>\n );\n }\n return null;\n };\n\n return (\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-w-full oui-text-2xs\"\n gap={4}\n >\n <Flex justify={\"between\"} itemAlign={\"start\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.advanced.title\")}</Text>\n <Flex gap={2}>\n <DeleteIcon\n size={12}\n className=\"oui-cursor-pointer oui-text-base-contrast-54 hover:oui-text-base-contrast\"\n opacity={1}\n onClick={onDelete}\n />\n <EditIcon\n size={12}\n className=\"oui-cursor-pointer oui-text-base-contrast-54 hover:oui-text-base-contrast\"\n onClick={onEdit}\n />\n </Flex>\n </Flex>\n <Flex justify={\"between\"} itemAlign={\"start\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.mode\")}</Text>\n <Text className=\"oui-text-base-contrast\">\n {formattedOrder.position_type === PositionType.FULL\n ? t(\"tpsl.fullPosition\")\n : t(\"tpsl.partialPosition\")}\n </Text>\n </Flex>\n {renderTp()}\n {renderSl()}\n\n <Divider className=\"oui-mb-2 oui-w-full\" />\n </Flex>\n );\n}\n\ninterface IconProps extends SVGProps<SVGSVGElement> {\n size: number;\n}\nconst DeleteIcon: React.FC<IconProps> = (props) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={props.size}\n height={props.size}\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M5.99903 0.976562C5.44653 0.976562 4.99903 1.42406 4.99903 1.97656H2.49902C2.22302 1.97656 1.99902 2.20056 1.99902 2.47656C1.99902 2.75256 2.22302 2.97656 2.49902 2.97656H9.49903C9.77503 2.97656 9.99903 2.75256 9.99903 2.47656C9.99903 2.20056 9.77503 1.97656 9.49903 1.97656H6.99903C6.99903 1.42406 6.55153 0.976562 5.99903 0.976562ZM2.49902 3.97655V8.97654C2.49902 10.0715 3.40152 10.961 4.49903 10.961L7.51453 10.9765C8.61203 10.9765 9.49903 10.074 9.49903 8.97654V3.97655H2.49902ZM4.99903 5.47655C5.27503 5.47655 5.49903 5.70055 5.49903 5.97655V8.97654C5.49903 9.25254 5.27503 9.47654 4.99903 9.47654C4.72303 9.47654 4.49903 9.25254 4.49903 8.97654V5.97655C4.49903 5.70055 4.72303 5.47655 4.99903 5.47655ZM6.99903 5.47655C7.27503 5.47655 7.49903 5.70055 7.49903 5.97655V8.97654C7.49903 9.25254 7.27503 9.47654 6.99903 9.47654C6.72303 9.47654 6.49903 9.25254 6.49903 8.97654V5.97655C6.49903 5.70055 6.72303 5.47655 6.99903 5.47655Z\" />\n </svg>\n );\n};\n\nconst EditIcon: React.FC<IconProps> = (props) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 12 12\"\n width={props.size}\n height={props.size}\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M8.49779 0.976562C8.36529 0.976562 8.23229 1.02357 8.13829 1.11707C7.86029 1.39507 6.85979 2.39558 6.63779 2.61808L2.13529 7.12059L1.63479 7.62059C1.56529 7.69059 1.52929 7.78958 1.50979 7.88658L1.00979 10.3881C0.939788 10.7381 1.23779 11.0361 1.58779 10.9666C1.90079 10.9036 3.77679 10.5286 4.08929 10.4661C4.18629 10.4466 4.28529 10.4106 4.35529 10.3411L4.85529 9.84059L9.35779 5.33808C9.58029 5.11608 10.5808 4.11506 10.8588 3.83756C10.9523 3.74356 10.9993 3.61056 10.9993 3.47806C10.9993 2.65956 10.7908 2.07456 10.3583 1.63306C9.92179 1.18756 9.33879 0.976562 8.49779 0.976562ZM8.69479 1.98606C9.14629 2.01256 9.43879 2.11608 9.63929 2.32108C9.84429 2.53008 9.97379 2.82008 10.0018 3.26258C9.72779 3.53608 9.32679 3.93106 8.99829 4.25956C8.60179 3.86306 8.11279 3.37407 7.71629 2.97757C8.04529 2.64907 8.42129 2.25956 8.69479 1.98606ZM6.99729 3.69657L8.27929 4.97858L4.49579 8.76207L3.21379 7.48009L6.99729 3.69657ZM2.49479 8.19908L3.77679 9.48107L3.72979 9.52809C3.39979 9.59409 2.73329 9.73359 2.11929 9.85659L2.44779 8.24608L2.49479 8.19908Z\" />\n </svg>\n );\n};\n","import { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { Flex, Text, textVariants } from \"@orderly.network/ui\";\nimport { FeesWidget } from \"../fee\";\nimport { SlippageUI } from \"../slippage/slippage.ui\";\n\nexport function AssetInfo(props: {\n symbol: string;\n canTrade: boolean;\n quote: string;\n estLiqPrice: number | null;\n estLeverage: number | null;\n currentLeverage: number | null;\n slippage: string;\n dp: number;\n estSlippage: number | null;\n setSlippage: (slippage: string) => void;\n orderType: OrderType;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n}) {\n const { canTrade, disableFeatures, orderType, symbol } = props;\n const { t } = useTranslation();\n\n return (\n <div className={\"oui-space-y-[2px] xl:oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"orderEntry.estLiqPrice\")}</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\n dp={props.dp}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-36\"}\n >\n {canTrade ? (props.estLiqPrice ?? \"--\") : \"--\"}\n </Text.numeral>\n </Flex>\n\n {orderType === OrderType.MARKET &&\n !disableFeatures?.includes(\"slippageSetting\") && (\n <SlippageUI\n slippage={props.slippage}\n setSlippage={props.setSlippage}\n estSlippage={props.estSlippage}\n />\n )}\n\n {!disableFeatures?.includes(\"feesInfo\") && (\n <FeesWidget symbol={props.symbol} />\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { pick } from \"ramda\";\nimport { useFeeState, useRwaSymbolsInfoStore } from \"@orderly.network/hooks\";\nimport { EffectiveFeesWidget } from \"./effectiveFee\";\nimport { RegularFeesWidget } from \"./regularFee\";\n\nconst isEffective = (val?: unknown) =>\n typeof val !== \"undefined\" && val !== null;\n\nexport const FeesWidget: React.FC<{ symbol: string }> = ({ symbol }) => {\n const { refereeRebate, ...others } = useFeeState();\n const info = useRwaSymbolsInfoStore();\n const isRwa = info?.[symbol] !== undefined;\n const isEffectiveFee = isEffective(refereeRebate);\n return isEffectiveFee ? (\n <EffectiveFeesWidget\n taker={isRwa ? others.rwaEffectiveTakerFee : others.effectiveTakerFee}\n maker={isRwa ? others.rwaEffectiveMakerFee : others.effectiveMakerFee}\n />\n ) : (\n <RegularFeesWidget\n taker={isRwa ? others.rwaTakerFee : others.takerFee}\n maker={isRwa ? others.rwaMakerFee : others.makerFee}\n />\n );\n};\n","import React from \"react\";\nimport { useFeeState } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Flex,\n modal,\n Text,\n Tooltip,\n useModal,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport {\n RouterAdapter,\n useScaffoldContext,\n} from \"@orderly.network/ui-scaffold\";\nimport { EffectiveFee } from \"./icons\";\n\nconst EffectiveFeeBody: React.FC<{\n routerAdapter: RouterAdapter | undefined;\n onClose?: () => void;\n}> = ({ routerAdapter, onClose }) => {\n const { t } = useTranslation();\n return (\n <Text size=\"2xs\" className=\"oui-whitespace-normal oui-break-words\">\n {t(\"portfolio.feeTier.effectiveFee.tooltip\")}{\" \"}\n <a\n href=\"/rewards/affiliate\"\n onClick={(e) => {\n e.preventDefault();\n routerAdapter?.onRouteChange({\n href: \"/rewards/affiliate\",\n name: t(\"portfolio.feeTier.effectiveFee.tooltipLink\"),\n });\n onClose?.();\n }}\n className=\"oui-cursor-pointer oui-border-none oui-bg-transparent oui-p-0 oui-text-2xs oui-underline hover:oui-text-base-contrast-80\"\n >\n {t(\"portfolio.feeTier.effectiveFee.tooltipLink\")}\n </a>\n </Text>\n );\n};\n\nconst EffectiveFeeMobileContent: React.FC<{\n routerAdapter: RouterAdapter | undefined;\n}> = ({ routerAdapter }) => {\n const { hide } = useModal();\n return <EffectiveFeeBody routerAdapter={routerAdapter} onClose={hide} />;\n};\n\nconst EffectiveFeeSection: React.FC<{\n routerAdapter: RouterAdapter | undefined;\n}> = (props) => {\n const { routerAdapter } = props;\n const { isMobile } = useScreen();\n const { t } = useTranslation();\n if (isMobile) {\n return (\n <EffectiveFee\n onClick={() => {\n modal.dialog({\n size: \"sm\",\n title: t(\"common.tips\"),\n content: (\n <EffectiveFeeMobileContent routerAdapter={routerAdapter} />\n ),\n });\n }}\n />\n );\n }\n return (\n <Tooltip\n content={<EffectiveFeeBody routerAdapter={routerAdapter} />}\n className=\"oui-p-1.5 oui-text-base-contrast-54\"\n >\n <EffectiveFee className={\"oui-cursor-pointer\"} />\n </Tooltip>\n );\n};\n\nexport const EffectiveFeeUI: React.FC<{ taker: string; maker: string }> = (\n props,\n) => {\n const { t } = useTranslation();\n const { routerAdapter } = useScaffoldContext();\n const { taker, maker } = props;\n\n const originalTrailingFees = (\n <Flex itemAlign=\"center\" justify=\"between\" width={\"100%\"} gap={1}>\n <Flex width={\"100%\"} itemAlign=\"center\" justify={\"between\"}>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"common.fees\")}\n </Text>\n <AuthGuard\n fallback={() => (\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.taker\")}: --% / {t(\"dmm.maker\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.taker\")}:\n </Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {taker}\n </Text>\n <Text size=\"2xs\">/</Text>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.maker\")}:\n </Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {maker}\n </Text>\n </Flex>\n </AuthGuard>\n </Flex>\n <EffectiveFeeSection routerAdapter={routerAdapter} />\n </Flex>\n );\n\n return originalTrailingFees;\n};\n","import React, { useId } from \"react\";\n\nexport const EffectiveFee = React.forwardRef<\n SVGSVGElement,\n React.SVGAttributes<SVGSVGElement>\n>((props, ref) => {\n const linearId = useId();\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={14}\n height={14}\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n ref={ref}\n focusable={false}\n {...props}\n >\n <path\n d=\"M6.16411 1.53106C6.61974 1.07566 7.35888 1.07551 7.81442 1.53106L8.48833 2.20496C8.6797 2.39624 8.93064 2.51452 9.19755 2.54106L9.3132 2.54676H10.2662C10.9104 2.54691 11.4328 3.06926 11.4329 3.71343V4.66647C11.4329 4.97589 11.5559 5.27312 11.7747 5.49191L12.4492 6.16582C12.9047 6.62142 12.9047 7.36054 12.4492 7.81613L11.7753 8.49004L11.6972 8.57549C11.5272 8.78302 11.433 9.04426 11.4329 9.31491V10.2685L11.4272 10.3876C11.3715 10.9366 10.9348 11.373 10.3859 11.4289L10.2662 11.4352H9.3132L9.19755 11.4409C8.93066 11.4674 8.67969 11.5857 8.48833 11.777L7.81442 12.4509L7.72555 12.5306C7.29789 12.8795 6.68066 12.8794 6.25297 12.5306L6.16411 12.4509L5.4902 11.777C5.29887 11.5857 5.04786 11.4675 4.78097 11.4409L4.66533 11.4352H3.71171L3.59265 11.4289C3.04358 11.3731 2.60705 10.9367 2.55131 10.3876L2.54505 10.2685V9.31491C2.54499 9.04416 2.45089 8.78306 2.28072 8.57549L2.20325 8.49004L1.52934 7.81613C1.10213 7.38905 1.07534 6.71297 1.44902 6.25469L1.52934 6.16582L2.20382 5.49191C2.42248 5.27314 2.54505 4.97579 2.54505 4.66647V3.71343C2.54513 3.10945 3.00442 2.61221 3.59265 2.55246L3.71171 2.54676H4.66533L4.78097 2.54106C5.00968 2.51826 5.22694 2.4281 5.40475 2.28244L5.4902 2.20496L6.16411 1.53106ZM6.31507 3.02983C5.87756 3.46727 5.28401 3.71336 4.66533 3.71343H3.71171V4.66647C3.71171 5.28521 3.46614 5.87922 3.02869 6.31678L2.35421 6.99069L3.02812 7.6646C3.46577 8.10214 3.71164 8.69607 3.71171 9.31491V10.2685H4.66533C5.28396 10.2686 5.87757 10.5142 6.31507 10.9515L6.98898 11.6255L7.66289 10.9515C8.10045 10.5141 8.69446 10.2685 9.3132 10.2685H10.2662V9.31491C10.2663 8.69604 10.5127 8.10214 10.9504 7.6646L11.6243 6.99069L10.9498 6.31678C10.5122 5.8792 10.2662 5.28531 10.2662 4.66647V3.71343H9.3132C8.69438 3.71343 8.10047 3.46739 7.66289 3.02983L6.98898 2.35592L6.31507 3.02983ZM8.52934 4.64255C8.7571 4.41479 9.12639 4.41489 9.35421 4.64255C9.58202 4.87035 9.58202 5.23961 9.35421 5.46742L5.4657 9.35593C5.2379 9.58372 4.86863 9.58373 4.64083 9.35593C4.41318 9.12811 4.41308 8.75881 4.64083 8.53106L8.52934 4.64255ZM8.66435 7.83265C9.1245 7.83272 9.49777 8.2059 9.49777 8.66607C9.49769 9.12616 9.12445 9.49941 8.66435 9.49948C8.20419 9.49948 7.83101 9.12621 7.83094 8.66607C7.83094 8.20586 8.20415 7.83265 8.66435 7.83265ZM5.33126 4.49956C5.79141 4.49963 6.16468 4.87282 6.16468 5.33298C6.1646 5.79307 5.79136 6.16575 5.33126 6.16582C4.87111 6.16582 4.49793 5.79311 4.49785 5.33298C4.49785 4.87277 4.87106 4.49956 5.33126 4.49956Z\"\n fill={`url(#${linearId})`}\n />\n <defs>\n <linearGradient\n id={linearId}\n x1=\"12.7908\"\n y1=\"6.99084\"\n x2=\"1.1875\"\n y2=\"6.99084\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop stopColor=\"rgb(var(--oui-gradient-brand-start))\" offset={1} />\n </linearGradient>\n </defs>\n </svg>\n );\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n EffectiveFee.displayName = \"EffectiveFee\";\n}\n","import React from \"react\";\nimport { useFeeState } from \"@orderly.network/hooks\";\nimport { EffectiveFeeUI } from \"./effectiveFee.ui\";\n\nexport const EffectiveFeesWidget: React.FC<{ taker: string; maker: string }> = (\n props,\n) => {\n return <EffectiveFeeUI {...props} />;\n};\n","import React from \"react\";\nimport { useFeeState } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Text } from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\n\nexport const RegularFeesUI: React.FC<{ taker: string; maker: string }> = (\n props,\n) => {\n const { t } = useTranslation();\n const { taker, maker } = props;\n\n const originalTrailingFees = (\n <Flex itemAlign=\"center\" justify=\"between\" width={\"100%\"} gap={1}>\n <Flex width={\"100%\"} itemAlign=\"center\" justify={\"between\"}>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"common.fees\")}\n </Text>\n <AuthGuard\n fallback={() => (\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.taker\")}: --% / {t(\"dmm.maker\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.taker\")}:\n </Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {taker}\n </Text>\n <Text size=\"2xs\">/</Text>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.maker\")}:\n </Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {maker}\n </Text>\n </Flex>\n </AuthGuard>\n </Flex>\n </Flex>\n );\n\n return originalTrailingFees;\n};\n","import React from \"react\";\nimport { useFeeState } from \"@orderly.network/hooks\";\nimport { RegularFeesUI } from \"./regularFees.ui\";\n\nexport const RegularFeesWidget: React.FC<{ taker: string; maker: string }> = (\n props,\n) => {\n return <RegularFeesUI {...props} />;\n};\n","import { useRef } from \"react\";\nimport { useBoolean } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n EditIcon,\n Flex,\n Text,\n SimpleDialog,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { SlippageEditor } from \"./slippageEditor\";\n\nexport const SlippageCell = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n const { t } = useTranslation();\n const [open, { setTrue: setOpen, setFalse: setClose, toggle }] =\n useBoolean(false);\n\n const { isMobile } = useScreen();\n const slippageRef = useRef<{ getValue: () => number | undefined }>(null);\n\n const onConfirm = () => {\n const val = slippageRef.current?.getValue();\n\n props.setSlippage(!val ? \"1\" : val.toString());\n setClose();\n return Promise.resolve(true);\n };\n\n return (\n <>\n <SimpleDialog\n open={open}\n onOpenChange={toggle}\n title={t(\"common.settings\")}\n contentProps={{ size: isMobile ? \"xs\" : \"sm\" }}\n actions={{\n primary: {\n disabled: false,\n label: t(\"common.save\"),\n onClick: onConfirm,\n },\n secondary: {\n label: t(\"common.cancel\"),\n onClick: () => setClose(),\n },\n }}\n >\n <SlippageEditor\n ref={slippageRef}\n isMobile={isMobile}\n initialValue={props.slippage ? Number(props.slippage) : undefined}\n />\n </SimpleDialog>\n <Flex justify={\"between\"}>\n <Text size=\"2xs\">{t(\"orderEntry.slippage\")}</Text>\n <AuthGuard\n fallback={() => (\n <Text size=\"2xs\">\n {t(\"orderEntry.slippage.est\")}: -% / {t(\"common.max\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text.numeral\n size=\"2xs\"\n rule=\"percentages\"\n prefix={`${t(\"orderEntry.slippage.est\")}: `}\n suffix={` / ${t(\"common.max\")}: `}\n >\n {props.estSlippage ?? 0}\n </Text.numeral>\n <button className=\"oui-text-2xs\" onClick={() => setOpen()}>\n <Flex className=\"oui-gap-0.5\" as=\"span\">\n <Text size=\"2xs\" className=\"oui-text-primary\">\n {`${props.slippage || \"-\"}%`}\n </Text>\n <EditIcon\n className=\"oui-text-primary oui-hidden md:oui-block\"\n size={12}\n opacity={1}\n />\n </Flex>\n </button>\n </Flex>\n </AuthGuard>\n </Flex>\n </>\n );\n};\n","import {\n FC,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n cn,\n ExclamationFillIcon,\n Flex,\n Input,\n inputFormatter,\n modal,\n Text,\n Tooltip,\n TooltipTrigger,\n} from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\n\ninterface SlippageProps {\n initialValue?: number;\n isMobile?: boolean;\n}\n\nconst options = [0.01, 0.05, 0.1];\n\nexport const SlippageEditor = forwardRef<\n { getValue: () => number | undefined },\n SlippageProps\n>((props, ref) => {\n const { t } = useTranslation();\n const [value, setValue] = useState<number>();\n const [customValue, setCustomValue] = useState(\"\");\n const [error, setError] = useState<string | undefined>(undefined);\n\n useImperativeHandle(ref, () => ({\n getValue: () =>\n customValue ? new Decimal(customValue)?.toNumber() : value,\n }));\n\n useEffect(() => {\n if (props.initialValue && !options.includes(props.initialValue!)) {\n setCustomValue(props.initialValue!.toString());\n } else {\n setValue(props.initialValue);\n }\n }, [props.initialValue, open]);\n\n const onClick = (val: number) => {\n setValue(val);\n setCustomValue(\"\");\n setError(undefined);\n };\n\n const onValueChange = (val: string) => {\n if (!val) {\n setCustomValue(val);\n return;\n }\n\n const d = new Decimal(val);\n setValue(undefined);\n if (d.gt(3)) {\n setCustomValue(\"3\");\n setError(t(\"orderEntry.slippage.error.exceed\"));\n } else {\n setCustomValue(val);\n setError(undefined);\n }\n };\n\n const toolTipButton = props.isMobile ? (\n <button\n onClick={() => {\n // setOpen(true)\n modal.alert({\n title: t(\"common.tips\"),\n message: <Text size=\"2xs\">{t(\"orderEntry.slippage.tips\")}</Text>,\n });\n }}\n >\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </button>\n ) : (\n <Tooltip\n // @ts-ignore\n content={\n <Text intensity={80} size=\"2xs\">\n {t(\"orderEntry.slippage.tips\")}\n </Text>\n }\n className=\"oui-w-[260px] oui-bg-base-6\"\n arrow={{ className: \"oui-fill-base-6\" }}\n >\n <TooltipTrigger>\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </TooltipTrigger>\n </Tooltip>\n );\n\n return (\n <div className=\"oui-text-2xs\">\n <Flex mb={2} gapX={1}>\n <Text size=\"xs\">{t(\"orderEntry.slippage\")}</Text>\n {toolTipButton}\n </Flex>\n <Flex gapX={2}>\n {options.map((item) => {\n const isActive = value === item;\n return (\n <SlippageItem\n key={item}\n value={item}\n isActive={isActive}\n onClick={() => {\n onClick(item);\n }}\n />\n );\n })}\n\n <Input\n suffix=\"%\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(2),\n ]}\n value={customValue}\n onValueChange={onValueChange}\n classNames={{\n root: cn(\n \"oui-rounded-md oui-bg-base-6\",\n \"oui-h-[40px] oui-w-[74px]\",\n ),\n input: \"oui-text-base-contrast\",\n additional: \"oui-pl-1\",\n }}\n />\n </Flex>\n {!!error && (\n <Box mt={5} className=\"-oui-mb-5\">\n <Text size=\"2xs\" color=\"danger\">\n {error}\n </Text>\n </Box>\n )}\n </div>\n );\n});\n\ntype SlippageItemProps = {\n value: number;\n isActive: boolean;\n onClick: () => void;\n};\n\nconst SlippageItem: FC<SlippageItemProps> = ({ value, isActive, onClick }) => {\n return (\n <Flex\n intensity={600}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"md\"\n width={74}\n height={40}\n className={cn(\n \"oui-cursor-pointer oui-select-none\",\n isActive && \"oui-bg-primary-light\",\n )}\n onClick={onClick}\n >\n <Text size=\"sm\" intensity={80}>\n {value}%\n </Text>\n </Flex>\n );\n};\n","import { SlippageCell } from \"./components/slippageCell\";\n\nexport const SlippageUI = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n return <SlippageCell {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Tooltip, Text, InfoCircleIcon } from \"@orderly.network/ui\";\nimport { LTVRiskTooltipWidget } from \"../LTVRiskTooltip\";\n\ntype AvailableProps = {\n canTrade: boolean;\n currentLtv: number;\n freeCollateral: number;\n quote?: string;\n};\n\nexport const Available = (props: AvailableProps) => {\n const { canTrade, currentLtv, quote, freeCollateral } = props;\n const { t } = useTranslation();\n\n const showLTV = useMemo(() => {\n return (\n typeof currentLtv === \"number\" &&\n !Number.isNaN(currentLtv) &&\n currentLtv > 0\n );\n }, [currentLtv]);\n\n return (\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"common.available\")}</Text>\n <Flex itemAlign={\"center\"} justify={\"center\"} gap={1}>\n {showLTV && (\n <Tooltip\n className={\"oui-bg-base-6 oui-p-2\"}\n content={<LTVRiskTooltipWidget />}\n >\n <InfoCircleIcon\n className={\"oui-cursor-pointer oui-text-warning oui-opacity-80\"}\n />\n </Tooltip>\n )}\n <Text.numeral\n unit={quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-54\"}\n dp={2}\n padding={false}\n >\n {canTrade ? freeCollateral : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n );\n};\n","import React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Button, cn, Divider, Flex, Text } from \"@orderly.network/ui\";\nimport { removeTrailingZeros } from \"@orderly.network/utils\";\nimport type { LTVTooltipScriptReturn } from \"./LTVRiskTooltip.script\";\n\nconst calculateLTVColor = (val: number): string => {\n if (val >= 0 && val < 50) {\n return \"oui-text-success\";\n } else if (val >= 50 && val < 80) {\n return \"oui-text-warning\";\n } else if (val >= 80) {\n return \"oui-text-danger\";\n } else {\n return \"\";\n }\n};\n\nexport const LTVRiskTooltipUI: React.FC<LTVTooltipScriptReturn> = (props) => {\n const { t } = useTranslation();\n const {\n ltv_threshold,\n negative_usdc_threshold,\n isThresholdLoading,\n holdingData = [],\n currentLtv,\n onConvert,\n } = props;\n return (\n <Flex gap={1} className=\"oui-w-72 oui-max-w-72\" direction=\"column\">\n <Flex width={\"100%\"} justify=\"between\" itemAlign=\"center\">\n <Text intensity={36} size=\"xs\">\n {t(\"common.assets\")}\n </Text>\n <Text intensity={36} size=\"xs\">\n {t(\"transfer.deposit.collateralContribution\")}\n </Text>\n </Flex>\n {holdingData.map((asset, index) => {\n return (\n <Flex\n key={`item-${index}`}\n width={\"100%\"}\n justify=\"between\"\n itemAlign=\"center\"\n >\n <Text intensity={80} size=\"xs\">\n {asset.token}\n </Text>\n <Text\n size=\"xs\"\n intensity={80}\n className={cn(\n Number(asset.collateralContribution) < 0 && \"oui-text-warning\",\n )}\n >\n {removeTrailingZeros(asset.collateralContribution)}\n </Text>\n </Flex>\n );\n })}\n <Divider className=\"oui-w-full\" />\n <Flex width={\"100%\"} justify=\"between\" itemAlign=\"center\">\n <Text intensity={36} size=\"xs\">\n {t(\"transfer.LTV.currentLTV\")}\n </Text>\n <Text\n size=\"xs\"\n intensity={36}\n className={cn(\"oui-select-none\", calculateLTVColor(currentLtv))}\n >\n {currentLtv}%\n </Text>\n </Flex>\n <Text className=\"oui-py-2\" intensity={54} size=\"2xs\">\n {t(\"transfer.LTV.tooltip\", {\n threshold: isThresholdLoading ? \"-\" : ltv_threshold,\n usdcThreshold: isThresholdLoading ? \"-\" : negative_usdc_threshold,\n })}\n </Text>\n <Button\n fullWidth\n size={\"md\"}\n variant={\"outlined\"}\n color={\"secondary\"}\n onClick={onConvert}\n >\n {t(\"transfer.convert.convertAssets\")}\n </Button>\n </Flex>\n );\n};\n","import { useCallback } from \"react\";\nimport {\n useComputedLTV,\n useHoldingStream,\n useIndexPricesStream,\n useQuery,\n useTokensInfo,\n} from \"@orderly.network/hooks\";\nimport { account } from \"@orderly.network/perp\";\nimport type { API } from \"@orderly.network/types\";\nimport { modal } from \"@orderly.network/ui\";\nimport { Decimal, zero } from \"@orderly.network/utils\";\n\nconst useConvertThreshold = () => {\n const { data, error, isLoading } = useQuery<API.ConvertThreshold>(\n \"/v1/public/auto_convert_threshold\",\n { errorRetryCount: 3 },\n );\n return {\n ltv_threshold: new Decimal(data?.ltv_threshold ?? 0).mul(100).toNumber(),\n negative_usdc_threshold: data?.negative_usdc_threshold,\n isLoading,\n error,\n } as const;\n};\n\nexport const useLTVTooltipScript = () => {\n const { data: holdingList = [], isLoading: isHoldingLoading } =\n useHoldingStream();\n\n const {\n ltv_threshold,\n negative_usdc_threshold,\n isLoading: isThresholdLoading,\n } = useConvertThreshold();\n\n const tokensInfo = useTokensInfo();\n\n const { getIndexPrice } = useIndexPricesStream();\n\n const holdingData = holdingList.map((item) => {\n const tokenInfo = tokensInfo?.find(({ token }) => token === item.token);\n\n // Use extracted function for index price calculation\n const indexPrice = getIndexPrice(item.token);\n\n // Calculate collateral ratio for this token\n const collateralRatio = tokenInfo\n ? account.collateralRatio({\n baseWeight: tokenInfo.base_weight ?? 0,\n discountFactor: tokenInfo.discount_factor ?? 0,\n collateralQty: item.holding,\n collateralCap: tokenInfo?.user_max_qty ?? item.holding,\n indexPrice: indexPrice,\n })\n : zero;\n\n // Calculate collateral contribution for this token\n const collateralContribution = account.collateralContribution({\n collateralQty: item.holding,\n collateralCap: tokenInfo?.user_max_qty ?? item.holding,\n collateralRatio: collateralRatio.toNumber(),\n indexPrice: indexPrice,\n });\n\n return {\n ...item,\n collateralContribution: collateralContribution,\n };\n });\n\n const currentLtv = useComputedLTV();\n\n const onConvert = useCallback(async () => {\n return modal.show(\"ConvertDialogId\");\n }, []);\n\n return {\n holdingData,\n isHoldingLoading,\n ltv_threshold,\n negative_usdc_threshold,\n isThresholdLoading,\n currentLtv: currentLtv,\n onConvert: onConvert,\n };\n};\n\nexport type LTVTooltipScriptReturn = ReturnType<typeof useLTVTooltipScript>;\n","import React from \"react\";\nimport { useLTVTooltipScript } from \"./LTVRiskTooltip.script\";\nimport { LTVRiskTooltipUI } from \"./LTVRiskTooltip.ui\";\n\nexport const LTVRiskTooltipWidget: React.FC = () => {\n const state = useLTVTooltipScript();\n return <LTVRiskTooltipUI {...state} />;\n};\n","import { FC, ReactNode, useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { usePositionStream } from \"@orderly.network/hooks\";\nimport { i18n, useTranslation } from \"@orderly.network/i18n\";\nimport {\n BBOOrderType,\n API,\n OrderSide,\n OrderType,\n PositionType,\n} from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport {\n Badge,\n Button,\n Checkbox,\n cn,\n Divider,\n Flex,\n Grid,\n registerSimpleDialog,\n Text,\n textVariants,\n} from \"@orderly.network/ui\";\nimport { Decimal, getBBOType } from \"@orderly.network/utils\";\nimport { isBBOOrder } from \"../../utils\";\n\ntype OrderConfirmDialogProps = {\n order: OrderlyOrder;\n symbolInfo: API.SymbolExt;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const OrderConfirmDialog = (props: OrderConfirmDialogProps) => {\n const { symbolInfo, order, onConfirm, onCancel } = props;\n const { quote, quote_dp, base_dp } = symbolInfo;\n const { side, order_type, order_type_ext, level, symbol } = order;\n const { t } = useTranslation();\n const [{ rows: positions }] = usePositionStream(symbol);\n const position = positions?.[0];\n const positionQty = position?.position_qty;\n\n const [_, setNeedConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const renderPositionType = () => {\n if (order.position_type === PositionType.FULL) {\n return <Text>{t(\"tpsl.positionType.full\")}</Text>;\n }\n return <Text>{t(\"tpsl.positionType.partial\")}</Text>;\n };\n\n const renderPrice = () => {\n if (\n order_type === OrderType.MARKET ||\n order_type === OrderType.STOP_MARKET\n ) {\n return <Text intensity={80}>{t(\"common.marketPrice\")}</Text>;\n }\n\n if (isBBOOrder({ order_type, order_type_ext })) {\n const bboType = getBBOType({\n type: order_type_ext!,\n side,\n level,\n });\n const label = {\n [BBOOrderType.COUNTERPARTY1]: t(\"orderEntry.bbo.counterparty1\"),\n [BBOOrderType.COUNTERPARTY5]: t(\"orderEntry.bbo.counterparty5\"),\n [BBOOrderType.QUEUE1]: t(\"orderEntry.bbo.queue1\"),\n [BBOOrderType.QUEUE5]: t(\"orderEntry.bbo.queue5\"),\n }[bboType!];\n\n return <Text intensity={80}>{label}</Text>;\n }\n\n return (\n <Text.numeral\n unit={quote}\n rule=\"price\"\n className=\"oui-text-base-contrast\"\n unitClassName=\"oui-text-base-contrast-36 oui-ml-1\"\n dp={quote_dp}\n padding={false}\n >\n {order.order_price}\n </Text.numeral>\n );\n };\n\n const renderTPSLPrice = ({\n price,\n isOrderPrice,\n isEnable,\n colorType,\n }: {\n price: string;\n isOrderPrice?: boolean;\n isEnable?: boolean;\n colorType: \"TP\" | \"SL\";\n }) => {\n if (!isEnable) {\n return <Text className=\"oui-text-base-contrast-36\">-- USDC</Text>;\n }\n if (!price) {\n if (isOrderPrice) {\n return (\n <Text className=\"oui-text-base-contrast-36\">\n {t(\"common.marketPrice\")}\n </Text>\n );\n }\n }\n return (\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={cn(\n \"oui-text-base-contrast\",\n colorType === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n )}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quote_dp}\n padding={false}\n >\n {price}\n </Text.numeral>\n );\n };\n\n const renderTPSLQty = () => {\n if (!positionQty || !order.order_quantity) {\n return null;\n }\n let qty = new Decimal(order.order_quantity);\n if (order.position_type === PositionType.FULL) {\n qty = qty.plus(new Decimal(positionQty ?? 0));\n }\n return (\n <Flex justify={\"between\"}>\n <Text>\n {order.position_type === PositionType.FULL\n ? t(\"common.positionQty\")\n : t(\"common.orderQty\")}\n </Text>\n <Text.numeral\n rule={\"price\"}\n dp={base_dp}\n padding={false}\n className=\"oui-text-base-contrast\"\n >\n {qty.toNumber()}\n </Text.numeral>\n </Flex>\n );\n };\n\n const renderPriceAndTotal = () => {\n if (order_type === OrderType.TRAILING_STOP) {\n const { activated_price, callback_value, callback_rate } = order;\n\n const callbackView = callback_rate ? (\n <Flex justify={\"between\"}>\n <Text>{t(\"orderEntry.trailingRate\")}</Text>\n <Text className=\"oui-text-base-contrast\">{callback_rate}%</Text>\n </Flex>\n ) : (\n <OrderItem\n title={t(\"orderEntry.trailingValue\")}\n value={callback_value!}\n unit={quote}\n dp={quote_dp}\n />\n );\n return (\n <>\n {activated_price && (\n <OrderItem\n title={t(\"common.triggerPrice\")}\n value={activated_price!}\n unit={quote}\n dp={quote_dp}\n />\n )}\n {callbackView}\n </>\n );\n }\n\n return (\n <>\n <Flex justify={\"between\"}>\n <Text>{t(\"common.price\")}</Text>\n {renderPrice()}\n </Flex>\n <OrderItem\n title={t(\"common.estTotal\")}\n value={order.total}\n unit={quote}\n dp={quote_dp}\n />\n </>\n );\n };\n\n const header = (\n <Flex justify={\"between\"}>\n <Text.formatted rule={\"symbol\"} showIcon>\n {order.symbol}\n </Text.formatted>\n <Flex justify={\"end\"} gapX={1}>\n <OrderTypeTag type={order_type} />\n {side === OrderSide.BUY ? (\n <Badge color={\"buy\"} size={\"sm\"}>\n {t(\"common.buy\")}\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n {t(\"common.sell\")}\n </Badge>\n )}\n </Flex>\n </Flex>\n );\n\n const quantityItem = (\n <Flex justify={\"between\"}>\n <Text>{t(\"common.orderQty\")}</Text>\n <Text.numeral\n rule={\"price\"}\n dp={base_dp}\n padding={false}\n className=\"oui-text-base-contrast\"\n >\n {order.order_quantity}\n </Text.numeral>\n </Flex>\n );\n\n const triggerPriceItem = (order_type === OrderType.STOP_LIMIT ||\n (order_type === OrderType.STOP_MARKET && order.trigger_price)) && (\n <OrderItem\n title={t(\"common.trigger\")}\n value={order.trigger_price}\n unit={quote}\n dp={quote_dp}\n />\n );\n\n const tpslTriggerPrice = (order.tp_trigger_price ||\n order.sl_trigger_price) && (\n <>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1 oui-w-full oui-flex oui-flex-col oui-gap-3\",\n })}\n >\n <Text className=\"oui-text-base-contrast\">{renderPositionType()}</Text>\n {renderTPSLQty()}\n\n <Flex\n direction={\"column\"}\n justify={\"between\"}\n itemAlign={\"start\"}\n gap={1}\n className=\"oui-w-full\"\n >\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.tpTriggerPrice\")}</Text>\n {renderTPSLPrice({\n price: order.tp_trigger_price ?? \"\",\n isOrderPrice: false,\n isEnable: !!order.tp_trigger_price,\n colorType: \"TP\",\n })}\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.tpOrderPrice\")}</Text>\n {renderTPSLPrice({\n price: order.tp_order_price ?? \"\",\n isOrderPrice: true,\n isEnable: !!order.tp_trigger_price,\n colorType: \"TP\",\n })}\n </Flex>\n </Flex>\n\n <Flex\n direction={\"column\"}\n justify={\"between\"}\n itemAlign={\"start\"}\n gap={1}\n className=\"oui-w-full\"\n >\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.slTriggerPrice\")}</Text>\n {renderTPSLPrice({\n price: order.sl_trigger_price ?? \"\",\n isOrderPrice: false,\n isEnable: !!order.sl_trigger_price,\n colorType: \"SL\",\n })}\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.slOrderPrice\")}</Text>\n {renderTPSLPrice({\n price: order.sl_order_price ?? \"\",\n isOrderPrice: true,\n isEnable: !!order.sl_trigger_price,\n colorType: \"SL\",\n })}\n </Flex>\n </Flex>\n </div>\n </>\n );\n\n const orderConfirmCheckbox = (\n <Flex gapX={1} pt={4} pb={5}>\n <Checkbox\n id=\"orderConfirm\"\n color={\"white\"}\n onCheckedChange={(checked) => {\n setNeedConfirm(!!!checked);\n }}\n />\n <label\n htmlFor=\"orderConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n })}\n >\n {t(\"orderEntry.disableOrderConfirm\")}\n </label>\n </Flex>\n );\n\n const buttons = (\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n );\n\n return (\n <>\n {header}\n <Divider className=\"oui-my-4\" />\n\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n {quantityItem}\n {triggerPriceItem}\n\n {renderPriceAndTotal()}\n </div>\n\n {tpslTriggerPrice}\n\n {orderConfirmCheckbox}\n\n {buttons}\n </>\n );\n};\n\ntype OrderItemProps = {\n title: ReactNode;\n value: string;\n unit: string;\n dp: number;\n};\n\nconst OrderItem: FC<OrderItemProps> = (props) => {\n const { title, value, unit, dp } = props;\n return (\n <Flex justify=\"between\">\n <Text>{title}</Text>\n <Text.numeral\n unit={unit}\n rule=\"price\"\n dp={dp}\n padding={false}\n className=\"oui-text-base-contrast\"\n unitClassName=\"oui-text-base-contrast-36 oui-ml-1\"\n >\n {value}\n </Text.numeral>\n </Flex>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const { t } = useTranslation();\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return t(\"orderEntry.orderType.limit\");\n case OrderType.MARKET:\n return t(\"common.marketPrice\");\n case OrderType.STOP_LIMIT:\n return t(\"orderEntry.orderType.stopLimit\");\n case OrderType.STOP_MARKET:\n return t(\"orderEntry.orderType.stopMarket\");\n case OrderType.TRAILING_STOP:\n return t(\"orderEntry.orderType.trailingStop\");\n default:\n return \"\";\n }\n }, [props.type]);\n\n return (\n <Badge color={\"neutral\"} size={\"sm\"}>\n {typeStr}\n </Badge>\n );\n};\n\nconst Dialog = (\n props: Omit<OrderConfirmDialogProps, \"onCancel\" | \"onConfirm\"> & {\n close: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n },\n) => {\n const { close, resolve, reject, ...rest } = props;\n\n return (\n <OrderConfirmDialog\n {...rest}\n onCancel={() => {\n reject();\n close();\n }}\n onConfirm={() => {\n resolve();\n close();\n }}\n />\n );\n};\n\nexport const orderConfirmDialogId = \"orderConfirm\";\n\nregisterSimpleDialog(orderConfirmDialogId, Dialog, {\n size: \"sm\",\n title: () => i18n.t(\"orderEntry.orderConfirm\"),\n});\n","import { i18n } from \"@orderly.network/i18n\";\nimport {\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\n\nexport enum BBOStatus {\n ON = \"on\",\n OFF = \"off\",\n DISABLED = \"disabled\",\n}\n\n/**\n * if provide order_type, check order_type and order_type_ext, otherswise only check order_type_ext\n */\nexport function isBBOOrder(options: {\n order_type?: OrderType;\n order_type_ext?: OrderType;\n}) {\n const { order_type, order_type_ext } = options;\n\n const isBBO = [OrderType.ASK, OrderType.BID].includes(order_type_ext!);\n\n if (order_type) {\n return order_type === OrderType.LIMIT && isBBO;\n }\n\n return isBBO;\n}\n\nexport function getOrderTypeByBBO(value: BBOOrderType, size: OrderSide) {\n if (\n [BBOOrderType.COUNTERPARTY1, BBOOrderType.COUNTERPARTY5].includes(value)\n ) {\n return size === OrderSide.BUY ? OrderType.ASK : OrderType.BID;\n }\n\n if ([BBOOrderType.QUEUE1, BBOOrderType.QUEUE5].includes(value)) {\n return size === OrderSide.BUY ? OrderType.BID : OrderType.ASK;\n }\n}\n\nexport function getOrderLevelByBBO(value: BBOOrderType) {\n if ([BBOOrderType.COUNTERPARTY1, BBOOrderType.QUEUE1].includes(value)) {\n return OrderLevel.ONE;\n }\n\n if ([BBOOrderType.COUNTERPARTY5, BBOOrderType.QUEUE5].includes(value)) {\n return OrderLevel.FIVE;\n }\n}\n\nexport function getScaledPlaceOrderMessage(result: any) {\n const rows = result?.data?.rows || [];\n\n if (rows.length > 0) {\n const totalCount = rows.length;\n const successCount = rows.filter((row: any) => row.success).length;\n\n // fully successful\n if (successCount === totalCount) {\n return i18n.t(\"orderEntry.scaledOrder.fullySuccessful\", {\n total: totalCount,\n });\n }\n\n // all failed\n if (successCount === 0) {\n return i18n.t(\"orderEntry.scaledOrder.allFailed\");\n }\n\n // partially successful\n return i18n.t(\"orderEntry.scaledOrder.partiallySuccessful\", {\n successCount,\n total: totalCount,\n });\n }\n}\n\nexport const safeNumber = (val: number | string) => {\n return Number.isNaN(Number(val)) ? 0 : Number(val);\n};\n","import { FC, memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { SimpleDialog } from \"@orderly.network/ui\";\n\ntype MaxQtyConfirmProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n maxQty: string;\n onConfirm: () => void;\n base: string;\n};\n\nexport const MaxQtyConfirm: FC<MaxQtyConfirmProps> = memo((props) => {\n const { t } = useTranslation();\n return (\n <SimpleDialog\n open={props.open}\n title={t(\"orderEntry.orderConfirm\")}\n closable\n onOpenChange={props.onOpenChange}\n size=\"sm\"\n actions={{\n primary: {\n label: t(\"orderEntry.placeOrderNow\"),\n className: \"oui-text-sm oui-font-semibold oui-w-[100%] oui-h-8\",\n onClick: () => {\n props.onConfirm();\n return Promise.resolve();\n },\n },\n secondary: {\n label: t(\"common.cancel\"),\n className: \"oui-text-sm oui-font-semibold oui-w-[100%] oui-h-8\",\n onClick: () => {\n props.onOpenChange(false);\n return Promise.resolve();\n },\n },\n }}\n >\n <div className=\"oui-text-2xs lg:oui-text-sm\">\n {t(\"orderEntry.maxQty.reminder.content\", {\n maxQty: `${props.maxQty} ${props.base}`,\n })}\n </div>\n </SimpleDialog>\n );\n});\n","import { forwardRef, SVGProps, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport {\n Button,\n Flex,\n Grid,\n DataTable,\n cn,\n Badge,\n TokenIcon,\n Tooltip,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n ScaledOrderConfirmScriptOptions,\n ScaledOrderConfirmScriptReturns,\n} from \"./scaledOrderConfirm.script\";\n\nexport type ScaledOrderConfirmProps = ScaledOrderConfirmScriptOptions &\n ScaledOrderConfirmScriptReturns & {\n close?: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n };\n\nexport const ScaledOrderConfirm = (props: ScaledOrderConfirmProps) => {\n const { order, symbolInfo, dataSource, national, askAndBid, totalQuantity } =\n props;\n const { base, quote, base_dp, quote_dp } = symbolInfo;\n const { t } = useTranslation();\n\n const onCancel = () => {\n props.reject();\n props.close?.();\n };\n\n const onConfirm = () => {\n props.resolve();\n props.close?.();\n };\n\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n width: 125,\n render: (value: string, record: any) => {\n return (\n <Flex gap={2}>\n <div\n className={cn(\n \"oui-h-[38px] oui-w-1 oui-shrink-0 oui-rounded-[1px]\",\n record.side === OrderSide.BUY\n ? \"oui-bg-trade-profit\"\n : \"oui-bg-trade-loss\",\n )}\n />\n <Flex direction=\"column\" itemAlign=\"start\">\n <Flex gapX={1}>\n <TokenIcon symbol={value} className=\"oui-size-3\" />\n <Text.formatted\n rule=\"symbol\"\n size=\"xs\"\n formatString=\"base-type\"\n >\n {value}\n </Text.formatted>\n </Flex>\n\n <Badge color=\"neutral\" size=\"xs\">\n {t(\"orderEntry.orderType.limit\")}\n </Badge>\n </Flex>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.quantity\"),\n dataIndex: \"order_quantity\",\n width: 100,\n render: (value: string, record: any) => {\n return (\n <Text.numeral\n rule=\"price\"\n dp={base_dp}\n padding={false}\n color={record.side === OrderSide.BUY ? \"buy\" : \"sell\"}\n >\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.orderPrice\"),\n dataIndex: \"order_price\",\n width: 100,\n render: (value: string, record: any) => {\n // buy: limit_price_i >= ask0 , show warning.\n // sell: limit price <= bid0 , show warning.\n const showWarning = !!(record.side === OrderSide.BUY\n ? askAndBid?.[0] && Number(value) >= askAndBid?.[0]\n : askAndBid?.[1] && Number(value) <= askAndBid?.[1]);\n\n return (\n <Flex gapX={1}>\n <Text.numeral rule=\"price\" dp={quote_dp}>\n {value}\n </Text.numeral>\n\n {showWarning && (\n <Tooltip\n content={t(\n \"orderEntry.confirmScaledOrder.orderPrice.warning\",\n )}\n className=\"oui-w-[240px] oui-text-2xs oui-font-semibold oui-text-base-contrast-80\"\n >\n <TooltipIcon className=\"oui-text-warning-darken\" />\n </Tooltip>\n )}\n </Flex>\n );\n },\n },\n ];\n }, [t, symbolInfo, askAndBid, base_dp, quote_dp]);\n\n return (\n <div className=\"oui-font-semibold\">\n <DataTable\n classNames={{\n root: cn(\n \"oui-bg-base-7\",\n \"oui-rounded-lg\",\n // need to set overflow hidden because table header will avoid the border radius\n \"oui-overflow-hidden\",\n // \"oui-text-2xs lg:oui-text-xs\",\n // if orders is greater than 6, set the height to 320px to show scroll bar\n order.orders?.length >= 6 && \"oui-h-[320px]\",\n ),\n // set the min height of the table to show 2 rows\n scroll: \"!oui-min-h-[130px]\",\n }}\n dataSource={dataSource}\n columns={columns}\n bordered\n onRow={() => {\n return {\n className: cn(\"oui-h-[50px]\"),\n };\n }}\n />\n <div className=\"oui-mb-5 oui-mt-4 oui-text-2xs\">\n <Flex justify=\"between\">\n <Text>{t(\"orderEntry.totalOrders\")}</Text>\n <Text intensity={80}>{order.orders?.length}</Text>\n </Flex>\n\n <Flex justify=\"between\" mt={2}>\n <Text>{t(\"orderEntry.totalQuantity\")}</Text>\n <Text.numeral\n rule=\"price\"\n unit={base}\n dp={base_dp}\n padding={false}\n intensity={80}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {totalQuantity}\n </Text.numeral>\n </Flex>\n\n <Flex justify=\"between\" mt={2}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.numeral\n rule=\"price\"\n unit={quote}\n dp={quote_dp}\n padding={false}\n intensity={80}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {national}\n </Text.numeral>\n </Flex>\n </div>\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={onCancel}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={onConfirm}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n </div>\n );\n};\n\nexport const TooltipIcon = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => {\n return (\n <svg\n width=\"12\"\n height=\"13\"\n viewBox=\"0 0 12 13\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n {...props}\n >\n <path d=\"M5.99951 1.50708C3.23811 1.50708 0.999512 3.74558 0.999512 6.50708C0.999512 9.26858 3.23811 11.5071 5.99951 11.5071C8.76091 11.5071 10.9995 9.26858 10.9995 6.50708C10.9995 3.74558 8.76091 1.50708 5.99951 1.50708ZM5.99951 4.00708C6.27566 4.00708 6.49951 4.23108 6.49951 4.50708C6.49951 4.78308 6.27566 5.00708 5.99951 5.00708C5.72336 5.00708 5.49951 4.78308 5.49951 4.50708C5.49951 4.23108 5.72336 4.00708 5.99951 4.00708ZM5.99951 5.50708C6.27566 5.50708 6.49951 5.73108 6.49951 6.00708V8.50708C6.49951 8.78308 6.27566 9.00708 5.99951 9.00708C5.72336 9.00708 5.49951 8.78308 5.49951 8.50708V6.00708C5.49951 5.73108 5.72336 5.50708 5.99951 5.50708Z\" />\n </svg>\n );\n },\n);\n","import { useMemo } from \"react\";\nimport { API, OrderlyOrder } from \"@orderly.network/types\";\nimport { Decimal, zero } from \"@orderly.network/utils\";\nimport { useAskAndBid } from \"../../../hooks/useAskAndBid\";\n\nexport type ScaledOrderConfirmScriptOptions = {\n order: OrderlyOrder & {\n orders: OrderlyOrder[];\n };\n symbolInfo: API.SymbolExt;\n};\n\nexport type ScaledOrderConfirmScriptReturns = ReturnType<\n typeof useScaledOrderConfirmScript\n>;\n\nexport function useScaledOrderConfirmScript(\n options: ScaledOrderConfirmScriptOptions,\n) {\n const { order, symbolInfo } = options;\n const orders = order.orders;\n\n const askAndBid = useAskAndBid();\n\n const national = useMemo(() => {\n const national = orders.reduce((acc, order) => {\n return acc.add(new Decimal(order.order_price).mul(order.order_quantity));\n }, zero);\n\n return national.toNumber();\n }, [orders]);\n\n const totalQuantity = useMemo(() => {\n const totalQuantity = orders.reduce((acc, order) => {\n return acc.add(new Decimal(order.order_quantity));\n }, zero);\n\n return totalQuantity.toString();\n }, [orders, symbolInfo.base_dp]);\n\n return { dataSource: orders, national, askAndBid, totalQuantity };\n}\n","import { useEffect, useState } from \"react\";\nimport { useDebouncedCallback, useEventEmitter } from \"@orderly.network/hooks\";\n\nexport function useAskAndBid() {\n const ee = useEventEmitter();\n\n const [askAndBid, setAskAndBid] = useState<[number, number]>([0, 0]);\n\n const onOrderBookUpdate = useDebouncedCallback((data: any) => {\n const ask0 = data.asks?.[data.asks.length - 1]?.[0];\n const bid0 = data.bids?.[0]?.[0];\n setAskAndBid([ask0, bid0]);\n }, 200);\n\n useEffect(() => {\n ee.on(\"orderbook:update\", onOrderBookUpdate);\n return () => {\n ee.off(\"orderbook:update\", onOrderBookUpdate);\n onOrderBookUpdate.cancel();\n };\n }, [onOrderBookUpdate]);\n\n return askAndBid;\n}\n","import { FC } from \"react\";\nimport { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog } from \"@orderly.network/ui\";\nimport { useScaledOrderConfirmScript } from \"./scaledOrderConfirm.script\";\nimport {\n ScaledOrderConfirm,\n ScaledOrderConfirmProps,\n} from \"./scaledOrderConfirm.ui\";\n\nexport type ScaledOrderConfirmWidgetProps = ScaledOrderConfirmProps;\n\nexport const ScaledOrderConfirmWidget: FC<ScaledOrderConfirmWidgetProps> = (\n props,\n) => {\n const state = useScaledOrderConfirmScript(props);\n\n return <ScaledOrderConfirm {...props} {...state} />;\n};\n\nexport const scaledOrderConfirmDialogId = \"scaledOrderConfirm\";\n\nregisterSimpleDialog(scaledOrderConfirmDialogId, ScaledOrderConfirmWidget, {\n size: \"md\",\n title: () => i18n.t(\"orderEntry.confirmScaledOrder\"),\n contentProps: {\n // className: \"oui-p-0\",\n },\n});\n","import { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderlyOrder, OrderSide, OrderType } from \"@orderly.network/types\";\nimport { Button, cn } from \"@orderly.network/ui\";\nimport { OrderTypeSelect } from \"../orderTypeSelect\";\nimport { LeverageBadge } from \"./LeverageBadge\";\n\ntype OrderEntryHeaderProps = {\n symbol: string;\n side: OrderSide;\n canTrade: boolean;\n order_type: OrderType;\n setOrderValue: (key: keyof OrderlyOrder, value: any) => void;\n symbolLeverage?: number;\n};\n\nexport function OrderEntryHeader(props: OrderEntryHeaderProps) {\n const { canTrade, side, order_type, setOrderValue } = props;\n const { t } = useTranslation();\n\n return (\n <>\n <div\n className={cn(\n \"oui-grid oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\",\n \"oui-grid-cols-2\",\n )}\n >\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.BUY);\n }}\n size={\"md\"}\n fullWidth\n data-type={OrderSide.BUY}\n className={cn(\n side === OrderSide.BUY && canTrade\n ? \"oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-buy-button\"\n >\n {t(\"common.buy\")}\n </Button>\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.SELL);\n }}\n data-type={OrderSide.SELL}\n fullWidth\n size={\"md\"}\n className={cn(\n side === OrderSide.SELL && props.canTrade\n ? \"oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-sell-button\"\n >\n {t(\"common.sell\")}\n </Button>\n </div>\n <div\n className={cn(\n \"oui-grid oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\",\n \"oui-grid-cols-2\",\n )}\n >\n <div className=\"oui-w-full\">\n <OrderTypeSelect\n type={order_type!}\n side={side}\n canTrade={canTrade}\n onChange={(type) => {\n setOrderValue(\"order_type\", type);\n }}\n />\n </div>\n <div className=\"oui-w-full\">\n <LeverageBadge\n symbol={props.symbol}\n side={props.side}\n symbolLeverage={props.symbolLeverage}\n />\n </div>\n </div>\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderSide, OrderType } from \"@orderly.network/types\";\nimport { Select, Text } from \"@orderly.network/ui\";\n\nexport const OrderTypeSelect = (props: {\n type: OrderType;\n onChange: (type: OrderType) => void;\n side: OrderSide;\n canTrade: boolean;\n}) => {\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n { label: t(\"orderEntry.orderType.limitOrder\"), value: OrderType.LIMIT },\n { label: t(\"orderEntry.orderType.marketOrder\"), value: OrderType.MARKET },\n {\n label: t(\"orderEntry.orderType.stopLimit\"),\n value: OrderType.STOP_LIMIT,\n },\n {\n label: t(\"orderEntry.orderType.stopMarket\"),\n value: OrderType.STOP_MARKET,\n },\n {\n label: t(\"orderEntry.orderType.scaledOrder\"),\n value: OrderType.SCALED,\n },\n {\n label: t(\"orderEntry.orderType.trailingStop\"),\n value: OrderType.TRAILING_STOP,\n },\n ];\n }, [t]);\n\n const displayLabelMap = useMemo(() => {\n return {\n [OrderType.LIMIT]: t(\"orderEntry.orderType.limit\"),\n [OrderType.MARKET]: t(\"common.marketPrice\"),\n [OrderType.STOP_LIMIT]: t(\"orderEntry.orderType.stopLimit\"),\n [OrderType.STOP_MARKET]: t(\"orderEntry.orderType.stopMarket\"),\n [OrderType.SCALED]: t(\"orderEntry.orderType.scaledOrder\"),\n [OrderType.TRAILING_STOP]: t(\"orderEntry.orderType.trailingStop\"),\n };\n }, [t]);\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-orderType-button\"\n currentValue={props.type}\n value={props.type}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8\",\n }}\n classNames={{\n trigger: \"oui-bg-base-6 oui-border-line\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n if (!item) {\n return <Text size={\"xs\"}>{option.placeholder}</Text>;\n }\n\n const label = displayLabelMap[value as keyof typeof displayLabelMap];\n\n return (\n <Text\n size={\"xs\"}\n color={\n props.canTrade\n ? props.side === OrderSide.BUY\n ? \"buy\"\n : \"sell\"\n : undefined\n }\n >\n {label}\n </Text>\n );\n }}\n size={\"md\"}\n />\n );\n};\n","import { useSymbolLeverage } from \"@orderly.network/hooks\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport { cn, Flex, modal, Text, useScreen } from \"@orderly.network/ui\";\nimport {\n SymbolLeverageDialogId,\n SymbolLeverageSheetId,\n} from \"@orderly.network/ui-leverage\";\nimport { Decimal } from \"@orderly.network/utils\";\n\ntype LeverageBadgeProps = {\n symbol: string;\n side: OrderSide;\n symbolLeverage?: number;\n};\n\nexport const LeverageBadge = (props: LeverageBadgeProps) => {\n const { symbol, side, symbolLeverage } = props;\n const { isMobile } = useScreen();\n const { maxLeverage } = useSymbolLeverage(symbol);\n\n const curLeverage = symbolLeverage || maxLeverage;\n\n const showModal = () => {\n const modalId = isMobile ? SymbolLeverageSheetId : SymbolLeverageDialogId;\n modal.show(modalId, {\n symbol,\n side,\n curLeverage,\n });\n };\n\n return (\n <Flex\n justify=\"center\"\n itemAlign=\"center\"\n gapX={1}\n className={cn(\n \"oui-h-8\",\n \"oui-rounded oui-border oui-border-line oui-bg-base-6\",\n \"oui-cursor-pointer oui-select-none oui-text-xs oui-font-semibold oui-text-base-contrast-54\",\n )}\n onClick={showModal}\n >\n <Text>Cross</Text>\n <Text.numeral dp={0} rm={Decimal.ROUND_DOWN} unit=\"X\">\n {curLeverage}\n </Text.numeral>\n </Flex>\n );\n};\n","import { FC, PropsWithChildren, useMemo } from \"react\";\nimport { OrderEntryContext, OrderEntryContextState } from \"./orderEntryContext\";\n\nexport const OrderEntryProvider: FC<\n PropsWithChildren<OrderEntryContextState>\n> = (props) => {\n const {\n errorMsgVisible,\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n setOrderValues,\n currentFocusInput,\n errors,\n priceInputRef,\n priceInputContainerRef,\n triggerPriceInputRef,\n activatedPriceInputRef,\n lastQuantityInputType,\n leverage,\n } = props;\n\n const memoizedValue = useMemo<OrderEntryContextState>(() => {\n return {\n errorMsgVisible,\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n setOrderValues,\n currentFocusInput,\n errors,\n // refs\n priceInputRef,\n priceInputContainerRef,\n triggerPriceInputRef,\n activatedPriceInputRef,\n lastQuantityInputType,\n leverage,\n };\n }, [\n errorMsgVisible,\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n setOrderValues,\n currentFocusInput,\n errors,\n\n priceInputRef,\n priceInputContainerRef,\n triggerPriceInputRef,\n activatedPriceInputRef,\n lastQuantityInputType,\n leverage,\n ]);\n\n return (\n <OrderEntryContext.Provider value={memoizedValue}>\n {props.children}\n </OrderEntryContext.Provider>\n );\n};\n","import {\n createContext,\n FocusEventHandler,\n useContext,\n RefObject,\n MutableRefObject,\n} from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { API, OrderlyOrder } from \"@orderly.network/types\";\nimport { InputType, QuantityInputType } from \"../types\";\n\nexport type OrderEntryContextState = {\n errors: OrderValidationResult | null;\n errorMsgVisible: boolean;\n symbolInfo: API.SymbolExt;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n getErrorMsg: (\n key: keyof OrderValidationResult,\n customValue?: string,\n ) => string;\n setOrderValue: (key: keyof OrderlyOrder, value: any) => void;\n setOrderValues: (values: Partial<OrderlyOrder>) => void;\n currentFocusInput: InputType;\n // refs\n priceInputRef: RefObject<HTMLInputElement>;\n priceInputContainerRef: RefObject<HTMLDivElement>;\n triggerPriceInputRef: RefObject<HTMLInputElement>;\n activatedPriceInputRef: RefObject<HTMLInputElement>;\n lastQuantityInputType: MutableRefObject<InputType>;\n leverage?: number;\n};\n\nexport const OrderEntryContext = createContext<OrderEntryContextState>(\n {} as OrderEntryContextState,\n);\n\nexport const useOrderEntryContext = () => {\n return useContext(OrderEntryContext);\n};\n","import { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { PriceInput, PriceInputProps } from \"./limit/priceInput\";\nimport { QtyAndTotalInput } from \"./qtyAndTotal/qtyAndTotalInput\";\nimport { ScaledOrderInput } from \"./scaledOrder\";\nimport { TriggerPriceInput } from \"./stop/triggerPriceInput\";\nimport { TrailingStopInput } from \"./trailingStop\";\n\nexport type OrderInputProps = {\n values: Partial<OrderlyOrder>;\n} & Omit<PriceInputProps, \"order_price\" | \"order_type\">;\n\nexport function OrderInput(props: OrderInputProps) {\n const { values } = props;\n\n const type = values.order_type;\n\n if (type === OrderType.SCALED) {\n return <ScaledOrderInput values={values} />;\n }\n\n if (type === OrderType.TRAILING_STOP) {\n return <TrailingStopInput values={values} />;\n }\n\n const showTriggerPrice =\n type === OrderType.STOP_LIMIT || type === OrderType.STOP_MARKET;\n\n const showPrice = type === OrderType.LIMIT || type === OrderType.STOP_LIMIT;\n\n const triggerPriceInput = showTriggerPrice && (\n <TriggerPriceInput trigger_price={values.trigger_price} />\n );\n\n const priceInput = showPrice && (\n <PriceInput\n order_type={values.order_type!}\n order_price={values.order_price}\n bbo={props.bbo}\n fillMiddleValue={props.fillMiddleValue}\n priceInputContainerWidth={props.priceInputContainerWidth}\n />\n );\n\n return (\n <div className={\"oui-space-y-1\"}>\n {triggerPriceInput}\n {priceInput}\n <QtyAndTotalInput\n order_quantity={values.order_quantity}\n total={values.total}\n />\n </div>\n );\n}\n","import { FC } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { cn, inputFormatter } from \"@orderly.network/ui\";\nimport { OrderEntryScriptReturn } from \"../../../orderEntry.script\";\nimport { InputType } from \"../../../types\";\nimport { BBOStatus } from \"../../../utils\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\nimport { BBOOrderTypeSelect } from \"./bboOrderTypeSelect\";\nimport { LimitPriceSuffix } from \"./limitPriceSuffix\";\n\nexport type PriceInputProps = {\n order_type: OrderType;\n order_price?: string;\n bbo: Pick<\n OrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n priceInputContainerWidth?: number;\n fillMiddleValue: OrderEntryScriptReturn[\"fillMiddleValue\"];\n};\n\n// TODO: memo component\nexport const PriceInput: FC<PriceInputProps> = (props) => {\n const { bbo } = props;\n const { t } = useTranslation();\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n priceInputRef,\n priceInputContainerRef,\n } = useOrderEntryContext();\n\n const { quote, quote_dp } = symbolInfo;\n\n const readOnly = bbo.bboStatus === BBOStatus.ON;\n\n const suffix =\n props.order_type === OrderType.LIMIT ? (\n <LimitPriceSuffix\n quote={quote}\n bbo={bbo}\n fillMiddleValue={props.fillMiddleValue}\n />\n ) : (\n quote\n );\n\n return (\n <div\n ref={priceInputContainerRef}\n className=\"oui-group oui-relative oui-w-full\"\n >\n <CustomInput\n id=\"order_price_input\"\n name=\"order_price_input\"\n label={t(\"common.price\")}\n suffix={suffix}\n value={props.order_price}\n onChange={(e) => {\n setOrderValue(\"order_price\", e);\n }}\n error={getErrorMsg(\"order_price\")}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.PRICE)}\n onBlur={onBlur(InputType.PRICE)}\n readonly={readOnly}\n ref={priceInputRef}\n classNames={{\n root: cn(readOnly && \"focus-within:oui-outline-transparent \"),\n input: cn(readOnly && \"oui-cursor-auto\"),\n }}\n />\n {bbo.bboStatus === BBOStatus.ON && (\n <div className={cn(\"oui-absolute oui-bottom-1 oui-left-0\")}>\n <BBOOrderTypeSelect\n value={bbo.bboType}\n onChange={bbo.onBBOChange}\n contentStyle={{\n width: props.priceInputContainerWidth,\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","import { forwardRef, PropsWithChildren, ReactNode } from \"react\";\nimport { EMPTY_LIST } from \"@orderly.network/types\";\nimport { cn, inputFormatter, Input, InputProps } from \"@orderly.network/ui\";\nimport { useOrderEntryContext } from \"../orderEntryContext\";\n\nexport type CustomInputProps = {\n label: string;\n suffix?: ReactNode;\n placeholder?: string;\n id: string;\n className?: string;\n name?: string;\n onChange?: (value: string) => void;\n value?: InputProps[\"value\"];\n autoFocus?: InputProps[\"autoFocus\"];\n error?: string;\n onFocus?: InputProps[\"onFocus\"];\n onBlur?: InputProps[\"onBlur\"];\n formatters?: InputProps[\"formatters\"];\n overrideFormatters?: InputProps[\"formatters\"];\n classNames?: InputProps[\"classNames\"];\n readonly?: boolean;\n prefix?: ReactNode;\n};\n\nexport const CustomInput = forwardRef<HTMLInputElement, CustomInputProps>(\n (props, ref) => {\n const { placeholder = \"0\" } = props;\n const { errorMsgVisible } = useOrderEntryContext();\n\n return (\n <Input.tooltip\n ref={ref}\n tooltip={errorMsgVisible ? props.error : undefined}\n autoComplete={\"off\"}\n autoFocus={props.autoFocus}\n size={\"lg\"}\n placeholder={props.readonly ? \"\" : placeholder}\n id={props.id}\n name={props.name}\n color={props.error ? \"danger\" : undefined}\n prefix={\n props.prefix || (\n <InputLabel id={props.id} className={props.classNames?.prefix}>\n {props.label}\n </InputLabel>\n )\n }\n suffix={props.suffix}\n value={props.readonly ? \"\" : props.value || \"\"}\n // onChange={props.onChange}\n onValueChange={props.onChange}\n onFocus={(event) => {\n props.onFocus?.(event);\n }}\n onBlur={(event) => {\n props.onBlur?.(event);\n }}\n formatters={\n props.overrideFormatters || [\n ...(props.formatters ?? EMPTY_LIST),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]\n }\n classNames={{\n root: cn(\n \"orderly-order-entry oui-relative oui-h-[54px] oui-rounded oui-border oui-border-solid oui-border-line oui-px-2 oui-py-1 group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className,\n props.classNames?.root,\n ),\n input: cn(\"oui-mb-1 oui-mt-5 oui-h-5\", props?.classNames?.input),\n // prefix: cn(props.classNames?.prefix),\n suffix: cn(\n \"oui-absolute oui-right-0 oui-top-0 oui-justify-start oui-py-2 oui-text-2xs oui-text-base-contrast-36\",\n props.classNames?.suffix,\n ),\n }}\n readOnly={props.readonly}\n />\n );\n },\n);\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (\n props: PropsWithChildren<{ id: string; className?: string }>,\n) => {\n return (\n <label\n htmlFor={props.id}\n className={cn(\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-2xs oui-text-base-contrast-36\",\n props.className,\n )}\n >\n {props.children}\n </label>\n );\n};\n","import { CSSProperties, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { BBOOrderType } from \"@orderly.network/types\";\nimport { Box, Select, Text } from \"@orderly.network/ui\";\n\nexport const BBOOrderTypeSelect = (props: {\n value?: BBOOrderType;\n onChange: (value: BBOOrderType) => void;\n contentStyle?: CSSProperties;\n}) => {\n const { t } = useTranslation();\n\n const options = useMemo(\n () => [\n {\n label: t(\"orderEntry.bbo.counterparty1\"),\n value: BBOOrderType.COUNTERPARTY1,\n },\n {\n label: t(\"orderEntry.bbo.counterparty5\"),\n value: BBOOrderType.COUNTERPARTY5,\n },\n {\n label: t(\"orderEntry.bbo.queue1\"),\n value: BBOOrderType.QUEUE1,\n },\n {\n label: t(\"orderEntry.bbo.queue5\"),\n value: BBOOrderType.QUEUE5,\n },\n ],\n [],\n );\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-bbo-orderType-button\"\n currentValue={props.value}\n value={props.value}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n style: props.contentStyle,\n }}\n size={\"sm\"}\n classNames={{\n trigger: \"oui-border-none oui-bg-transparent\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((item) => item.value === value);\n\n return (\n <Box>\n <Text size=\"sm\">{item?.label}</Text>\n </Box>\n );\n }}\n />\n );\n};\n","import { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, cn, modal, Text } from \"@orderly.network/ui\";\nimport { OrderEntryScriptReturn } from \"../../../orderEntry.script\";\nimport { BBOStatus } from \"../../../utils\";\n\ntype LimitPriceSuffixProps = {\n quote: string;\n bbo: Pick<\n OrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n fillMiddleValue: OrderEntryScriptReturn[\"fillMiddleValue\"];\n};\n\nexport const LimitPriceSuffix = (props: LimitPriceSuffixProps) => {\n const { quote, bbo, fillMiddleValue } = props;\n const { t } = useTranslation();\n\n return (\n <Flex\n direction=\"column\"\n itemAlign=\"end\"\n className={cn(\"oui-order-entry-limit-price-input-suffix\", \"oui-text-2xs\")}\n >\n {quote}\n <Flex justify={\"end\"} itemAlign=\"center\" gap={2}>\n <Flex\n px={3}\n height={20}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"base\"\n className={cn(\n \"oui-mt-[2px] oui-cursor-pointer oui-select-none oui-border\",\n bbo.bboStatus === BBOStatus.ON\n ? \"oui-border-primary\"\n : \"oui-border-line-12\",\n bbo.bboStatus === BBOStatus.DISABLED && \"oui-cursor-not-allowed\",\n )}\n onClick={() => {\n if (bbo.bboStatus === BBOStatus.DISABLED) {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: (\n <Text intensity={54}>\n {t(\"orderEntry.bbo.disabled.tips\")}\n </Text>\n ),\n });\n } else {\n bbo.toggleBBO();\n }\n }}\n >\n <Text\n className={cn(\n bbo.bboStatus === BBOStatus.ON && \"oui-text-primary\",\n bbo.bboStatus === BBOStatus.OFF && \"oui-text-base-contrast-54\",\n bbo.bboStatus === BBOStatus.DISABLED &&\n \"oui-text-base-contrast-20\",\n )}\n >\n {t(\"orderEntry.bbo\")}\n </Text>\n </Flex>\n <Text\n className={cn(\n \"oui-select-none\",\n \"oui-cursor-pointer oui-text-primary\",\n )}\n onClick={fillMiddleValue}\n >\n Mid\n </Text>\n </Flex>\n </Flex>\n );\n};\n","import { FC, memo } from \"react\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { QuantityInput } from \"./quantityInput\";\nimport { TotalInput } from \"./totalInput\";\n\ntype QtyAndTotalInputProps = {\n order_quantity?: string;\n total?: string;\n};\n\nexport const QtyAndTotalInput: FC<QtyAndTotalInputProps> = memo((props) => {\n return (\n <Grid cols={2} className=\"oui-group oui-space-x-1\">\n <QuantityInput order_quantity={props.order_quantity} />\n <TotalInput total={props.total} />\n </Grid>\n );\n});\n\nQtyAndTotalInput.displayName = \"QtyAndTotalInput\";\n","import { FC, memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype QuantityInputProps = {\n order_quantity?: string;\n};\n\nexport const QuantityInput: FC<QuantityInputProps> = memo((props) => {\n const { t } = useTranslation();\n\n const { symbolInfo, onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n const { base, base_dp } = symbolInfo;\n\n return (\n <CustomInput\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n label={t(\"common.qty\")}\n suffix={base}\n error={getErrorMsg(\"order_quantity\")}\n value={props.order_quantity}\n onChange={(e) => {\n setOrderValue(\"order_quantity\", e);\n }}\n formatters={[inputFormatter.dpFormatter(base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n className=\"!oui-rounded-r\"\n classNames={{\n suffix: \"oui-justify-end\",\n }}\n />\n );\n});\n\nQuantityInput.displayName = \"QuantityInput\";\n","import { FC, memo, useEffect, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\nimport { OrderTotalType, TotalTypeSelect } from \"./totalTypeSelect\";\n\ntype TotalInputProps = {\n total?: string;\n};\n\n/**\n * order size = order size (notional) = quantity * price\n * Initial margin = order size / leverage = quantity * price / leverage\n * Order size = Initial margin * leverage = quantity * price\n */\nexport const TotalInput: FC<TotalInputProps> = memo((props) => {\n const { t } = useTranslation();\n const { total } = props;\n\n const [margin, setMargin] = useState(\"\");\n\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n leverage = 1,\n currentFocusInput,\n } = useOrderEntryContext();\n\n const { quote } = symbolInfo;\n\n const [totalType, setTotalType] = useLocalStorage<OrderTotalType>(\n \"orderly_order_total_type\",\n OrderTotalType.OrderSize,\n );\n\n useEffect(() => {\n if (total) {\n if (currentFocusInput !== InputType.MARGIN) {\n const margin = new Decimal(total).div(leverage).todp(2).toString();\n setMargin(margin);\n }\n } else {\n setMargin(\"\");\n }\n }, [total, leverage, currentFocusInput]);\n\n const onMarginChange = (val: string) => {\n const total = val ? new Decimal(val).mul(leverage).toString() : \"\";\n setOrderValue(\"total\", total);\n setMargin(val);\n };\n\n const prefix = <TotalTypeSelect value={totalType} onChange={setTotalType} />;\n\n if (totalType === OrderTotalType.InitialMargin) {\n return (\n <CustomInput\n id=\"order_margin_input\"\n name=\"order_margin_input\"\n label={`${t(\"orderEntry.initialMargin\")}≈`}\n prefix={prefix}\n suffix={quote}\n error={getErrorMsg(\"total\") ? \"initial margin error\" : \"\"}\n value={margin}\n onChange={onMarginChange}\n // national precision is 2\n formatters={[inputFormatter.dpFormatter(2)]}\n onFocus={onFocus(InputType.MARGIN)}\n onBlur={onBlur(InputType.MARGIN)}\n className=\"!oui-rounded-l\"\n classNames={{\n suffix: \"oui-justify-end\",\n }}\n />\n );\n }\n\n return (\n <CustomInput\n id=\"order_total_input\"\n name=\"order_total_input\"\n label={`${t(\"orderEntry.orderSize\")}≈`}\n prefix={prefix}\n suffix={quote}\n error={getErrorMsg(\"total\")}\n value={props.total}\n onChange={(val) => {\n setOrderValue(\"total\", val);\n }}\n className=\"!oui-rounded-l\"\n classNames={{\n suffix: \"oui-justify-end\",\n }}\n // national precision is 2\n formatters={[inputFormatter.dpFormatter(2)]}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n />\n );\n});\n\nTotalInput.displayName = \"TotalInput\";\n","import { FC, memo, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { cn, Select } from \"@orderly.network/ui\";\n\nexport enum OrderTotalType {\n OrderSize = \"orderSize\",\n InitialMargin = \"initialMargin\",\n}\n\ntype TotalTypeSelectProps = {\n value: OrderTotalType;\n onChange: (value: OrderTotalType) => void;\n};\n\nexport const TotalTypeSelect: FC<TotalTypeSelectProps> = memo((props) => {\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n {\n label: t(\"orderEntry.orderSize\"),\n value: OrderTotalType.OrderSize,\n },\n {\n label: t(\"orderEntry.initialMargin\"),\n value: OrderTotalType.InitialMargin,\n },\n ];\n }, [t]);\n\n return (\n <Select.options\n size={\"xs\"}\n value={props.value}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n return item?.label + \"≈\";\n }}\n classNames={{\n trigger: cn(\n \"oui-w-auto oui-border-none oui-bg-transparent\",\n \"oui-absolute oui-left-0 oui-top-[5px] oui-text-2xs oui-text-base-contrast-36\",\n ),\n }}\n onValueChange={props.onChange}\n options={options}\n />\n );\n});\n\nTotalTypeSelect.displayName = \"TotalTypeSelect\";\n","import { DistributionType, OrderlyOrder } from \"@orderly.network/types\";\nimport { cn, Grid } from \"@orderly.network/ui\";\nimport { QuantityDistributionInput } from \"./quantityDistributionInput\";\nimport { ScaledPriceInput } from \"./scaledPriceInput\";\nimport { ScaledQuantityInput } from \"./scaledQuantityInput\";\nimport { SkewInput } from \"./skewInput\";\nimport { TotalOrdersInput } from \"./totalOrdersInput\";\n\ntype ScaledOrderInputProps = {\n values: Partial<OrderlyOrder>;\n};\n\nexport const ScaledOrderInput = (props: ScaledOrderInputProps) => {\n const { values } = props;\n\n const showSkewInput = values.distribution_type === DistributionType.CUSTOM;\n\n return (\n <div className=\"oui-space-y-1\">\n <ScaledPriceInput\n start_price={values.start_price}\n end_price={values.end_price}\n />\n\n <Grid cols={2} className=\"oui-group oui-space-x-1\">\n <ScaledQuantityInput\n order_quantity={values.order_quantity}\n total={values.total}\n />\n <TotalOrdersInput total_orders={values.total_orders} />\n </Grid>\n\n <QuantityDistributionInput\n distribution_type={values.distribution_type}\n className={cn(!showSkewInput && \"oui-rounded-b-xl\")}\n />\n\n {showSkewInput && <SkewInput skew={values.skew} />}\n </div>\n );\n};\n","import { FC, memo, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { DistributionType } from \"@orderly.network/types\";\nimport { Box, Checkbox, cn, Flex, modal, Text } from \"@orderly.network/ui\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\nexport type QuantityDistributionInputProps = {\n distribution_type?: DistributionType;\n className?: string;\n};\n\nexport const QuantityDistributionInput: FC<QuantityDistributionInputProps> =\n memo((props) => {\n const { t } = useTranslation();\n const { setOrderValue } = useOrderEntryContext();\n\n const showHint = () => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"sm\",\n content: <QuantityDistributionHint value={props.distribution_type} />,\n // classNames: {\n // content: \"oui-bg-base-6\",\n // },\n });\n };\n\n return (\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n justify=\"center\"\n p={2}\n r=\"base\"\n // gapY={1}\n width=\"100%\"\n intensity={600}\n className={cn(\n \"oui-t-rounded oui-text-base-contrast-36\",\n \"oui-border oui-border-solid oui-border-line\",\n props.className,\n )}\n >\n <Text\n size=\"2xs\"\n className=\"oui-cursor-pointer oui-border-b oui-border-dashed oui-border-line-12\"\n onClick={showHint}\n >\n {t(\"orderEntry.quantityDistribution\")}\n </Text>\n <QuantityDistribution\n value={props.distribution_type}\n onValueChange={(value) => {\n setOrderValue(\"distribution_type\", value);\n }}\n />\n </Flex>\n );\n });\n\ntype QuantityDistributionHintProps = {\n value?: DistributionType;\n};\n\nconst QuantityDistributionHint: FC<QuantityDistributionHintProps> = (props) => {\n const { t } = useTranslation();\n const [type, setType] = useState(DistributionType.FLAT);\n\n useEffect(() => {\n setType(\n [\n DistributionType.FLAT,\n DistributionType.ASCENDING,\n DistributionType.DESCENDING,\n ].includes(props.value!)\n ? props.value!\n : DistributionType.FLAT,\n );\n }, [props.value]);\n\n const content = useMemo(() => {\n return [\n {\n type: DistributionType.FLAT,\n title: t(\"orderEntry.distributionType.flat\"),\n description: t(\"orderEntry.distributionType.flat.description\"),\n formula: `${t(\"orderEntry.skew\")} = 1`,\n quantity: <FlatQuantity />,\n },\n {\n type: DistributionType.ASCENDING,\n title: t(\"orderEntry.distributionType.ascending\"),\n description: t(\"orderEntry.distributionType.ascending.description\"),\n formula: `${t(\"orderEntry.skew\")} > 1`,\n quantity: <AscendingQuantity />,\n },\n {\n type: DistributionType.DESCENDING,\n title: t(\"orderEntry.distributionType.descending\"),\n description: t(\"orderEntry.distributionType.descending.description\"),\n formula: `0 < ${t(\"orderEntry.skew\")} < 1`,\n quantity: <DescendingQuantity />,\n },\n ];\n }, []);\n\n const currentContent = useMemo(() => {\n return content.find((item) => item.type === type);\n }, [content, type]);\n\n return (\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-54\">\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text intensity={80}>\n {t(\"orderEntry.quantityDistribution.description\")}\n </Text>\n <Text>{t(\"orderEntry.quantityDistribution.formula\")}</Text>\n </Flex>\n <Flex intensity={600} p={1} r=\"base\" mt={3} itemAlign=\"start\">\n <Flex direction=\"column\" itemAlign=\"start\">\n {content.map((item) => (\n <Box\n key={item.title}\n intensity={type === item.type ? 500 : 600}\n width={78}\n p={2}\n className=\"oui-cursor-pointer oui-rounded-l\"\n onClick={() => {\n setType(item.type);\n }}\n >\n <Text>{item.title}</Text>\n </Box>\n ))}\n </Flex>\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n gapY={1}\n p={2}\n intensity={500}\n width=\"100%\"\n className={cn(\n \"oui-rounded-r\",\n type === DistributionType.FLAT && \"oui-rounded-bl\",\n type === DistributionType.ASCENDING && \"oui-rounded-l\",\n type === DistributionType.DESCENDING && \"oui-rounded-tl\",\n )}\n >\n <div>{currentContent?.formula}</div>\n <Text>{currentContent?.description}</Text>\n <Flex width=\"100%\" justify=\"center\">\n {currentContent?.quantity}\n </Flex>\n <Flex width=\"100%\" gapX={1} justify=\"center\">\n <Text className=\"oui-text-base-1\">{t(\"common.price\")}</Text>\n <PriceChart />\n </Flex>\n </Flex>\n </Flex>\n </div>\n );\n};\n\ntype QuantityDistributionProps = {\n value?: DistributionType;\n onValueChange: (value: DistributionType) => void;\n};\n\nconst QuantityDistribution: FC<QuantityDistributionProps> = (props) => {\n const { value, onValueChange } = props;\n const { t } = useTranslation();\n\n const onChange = (value: DistributionType) => (checked: boolean) => {\n onValueChange(value);\n };\n\n const distributionTypeMap = useMemo(() => {\n return {\n [DistributionType.FLAT]: t(\"orderEntry.distributionType.flat\"),\n [DistributionType.ASCENDING]: t(\n \"orderEntry.distributionType.ascending.abbr\",\n ),\n [DistributionType.DESCENDING]: t(\n \"orderEntry.distributionType.descending.abbr\",\n ),\n [DistributionType.CUSTOM]: t(\"orderEntry.distributionType.custom\"),\n };\n }, [t]);\n\n return (\n <Flex className={cn(\"oui-gap-x-[6px] lg:oui-gap-x-2\")} wrap=\"wrap\">\n {Object.values(DistributionType).map((type) => {\n return (\n <Flex itemAlign={\"center\"} key={type}>\n <Checkbox\n id={`distribution-type-${type}`}\n color={\"white\"}\n variant={\"radio\"}\n checked={value === type}\n onCheckedChange={onChange(type)}\n />\n <label\n htmlFor={`distribution-type-${type}`}\n className={cn(\n \"oui-text-2xs\",\n \"oui-ml-1\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {distributionTypeMap[type]}\n </label>\n </Flex>\n );\n })}\n </Flex>\n );\n};\n\nconst FlatQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"18\"\n y=\"18\"\n width=\"181\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"15\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"62\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"109\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"156\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"203\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n};\n\nconst AscendingQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"18\"\n y=\"18\"\n width=\"181\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"15\"\n cy=\"20\"\n r=\"4.28571\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.42857\"\n />\n <circle\n cx=\"62\"\n cy=\"20\"\n r=\"5.14286\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.71429\"\n />\n <circle\n cx=\"109\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"156\"\n cy=\"20\"\n r=\"6.85714\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.28571\"\n />\n <circle\n cx=\"203\"\n cy=\"20\"\n r=\"7.71429\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.57143\"\n />\n </svg>\n );\n};\n\nconst DescendingQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n width=\"181\"\n height=\"4\"\n transform=\"matrix(-1 0 0 1 200 18)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"5\"\n cy=\"5\"\n r=\"4.28571\"\n transform=\"matrix(-1 0 0 1 208 15)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.42857\"\n />\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"5.14286\"\n transform=\"matrix(-1 0 0 1 162 14)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.71429\"\n />\n <circle\n cx=\"7\"\n cy=\"7\"\n r=\"6\"\n transform=\"matrix(-1 0 0 1 116 13)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6.85714\"\n transform=\"matrix(-1 0 0 1 70 12)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.28571\"\n />\n <circle\n cx=\"9\"\n cy=\"9\"\n r=\"7.71429\"\n transform=\"matrix(-1 0 0 1 24 11)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.57143\"\n />\n </svg>\n );\n};\n\nconst PriceChart = () => {\n return (\n <svg\n width=\"176\"\n height=\"8\"\n viewBox=\"0 0 176 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M175.354 4.35355C175.549 4.15829 175.549 3.84171 175.354 3.64645L172.172 0.464466C171.976 0.269204 171.66 0.269204 171.464 0.464466C171.269 0.659728 171.269 0.976311 171.464 1.17157L174.293 4L171.464 6.82843C171.269 7.02369 171.269 7.34027 171.464 7.53553C171.66 7.7308 171.976 7.7308 172.172 7.53553L175.354 4.35355ZM0 4V4.5H175V4V3.5H0V4Z\"\n fill=\"rgb(var(--oui-color-base-1))\"\n />\n </svg>\n );\n};\n","import { memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype ScaledPriceInputProps = {\n start_price?: string;\n end_price?: string;\n};\n\nexport const ScaledPriceInput = memo((props: ScaledPriceInputProps) => {\n const { t } = useTranslation();\n\n const { symbolInfo, onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n const { quote, quote_dp } = symbolInfo;\n\n return (\n <>\n <CustomInput\n label={t(\"orderEntry.startPrice\")}\n suffix={quote}\n id=\"order_start_price_input\"\n value={props.start_price}\n error={getErrorMsg(\"start_price\")}\n onChange={(e) => {\n setOrderValue(\"start_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.START_PRICE)}\n onBlur={onBlur(InputType.START_PRICE)}\n classNames={{\n root: \"oui-rounded-t-xl\",\n }}\n />\n <CustomInput\n label={t(\"orderEntry.endPrice\")}\n suffix={quote}\n id=\"order_end_price_input\"\n value={props.end_price}\n error={getErrorMsg(\"end_price\")}\n onChange={(val) => {\n setOrderValue(\"end_price\", val);\n }}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.END_PRICE)}\n onBlur={onBlur(InputType.END_PRICE)}\n />\n </>\n );\n});\n\nScaledPriceInput.displayName = \"ScaledPriceInput\";\n","import { memo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\nimport { ScaledQuantityUnit } from \"./scaledQuantityUnit\";\n\ntype ScaledQuantityInputProps = {\n order_quantity?: string;\n total?: string;\n};\n\nexport const ScaledQuantityInput = memo((props: ScaledQuantityInputProps) => {\n const { t } = useTranslation();\n const { errors, symbolInfo, onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n const [quantityUnit, setQuantityUnit] = useLocalStorage<\"quote\" | \"base\">(\n \"orderly_order_quantity_unit\",\n \"quote\",\n );\n\n const { base, quote, base_dp, quote_dp } = symbolInfo;\n\n const isBase = quantityUnit === \"base\";\n const unit = isBase ? base : quote;\n\n const suffix = (\n <ScaledQuantityUnit\n base={base}\n quote={quote}\n value={unit}\n onValueChange={(value) => {\n setQuantityUnit(value === base ? \"base\" : \"quote\");\n }}\n />\n );\n\n if (isBase) {\n return (\n <CustomInput\n label={t(\"common.qty\")}\n suffix={suffix}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className=\"!oui-rounded-r\"\n value={props.order_quantity}\n error={getErrorMsg(\n \"order_quantity\",\n `${errors?.order_quantity?.value} ${base}`,\n )}\n onChange={(val) => {\n setOrderValue(\"order_quantity\", val);\n }}\n formatters={[inputFormatter.dpFormatter(base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n );\n }\n\n return (\n <CustomInput\n label={t(\"common.qty\")}\n suffix={suffix}\n id=\"order_total_input\"\n name=\"order_total_input\"\n className=\"!oui-rounded-r\"\n value={props.total}\n error={getErrorMsg(\"order_quantity\", `${errors?.total?.value} ${quote}`)}\n onChange={(val) => {\n setOrderValue(\"total\", val);\n }}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n />\n );\n});\n","import { FC, useMemo } from \"react\";\nimport { Select, Text, cn } from \"@orderly.network/ui\";\n\nexport type QuantityUnitProps = {\n base: string;\n quote: string;\n value: string;\n onValueChange: (value: string) => void;\n};\n\nconst valueRenderer = (value: string) => {\n return (\n <Text size=\"2xs\" intensity={36}>\n {value}\n </Text>\n );\n};\n\nexport const ScaledQuantityUnit: FC<QuantityUnitProps> = (props) => {\n const { base, quote } = props;\n\n const options = useMemo(() => {\n return [{ name: quote }, { name: base }];\n }, [base, quote]);\n\n return (\n <Select.tokens\n variant=\"text\"\n size=\"xs\"\n iconSize=\"2xs\"\n tokens={options}\n classNames={{\n trigger: cn(\n \"oui-absolute oui-right-0 oui-top-1\",\n \"oui-w-full oui-justify-end\",\n ),\n }}\n value={props.value}\n onValueChange={props.onValueChange}\n valueFormatter={valueRenderer}\n contentProps={{\n align: \"end\",\n alignOffset: -1,\n sideOffset: -4,\n className: \"oui-border oui-border-line-6\",\n }}\n />\n );\n};\n","import { memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype SkewInputProps = {\n skew?: string;\n};\n\nexport const SkewInput = memo((props: SkewInputProps) => {\n const { t } = useTranslation();\n\n const { onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n return (\n <CustomInput\n id=\"order_skew_input\"\n label={t(\"orderEntry.skew\")}\n value={props.skew}\n error={getErrorMsg(\"skew\")}\n onChange={(val) => {\n setOrderValue(\"skew\", val);\n }}\n onFocus={onFocus(InputType.SKEW)}\n onBlur={onBlur(InputType.SKEW)}\n overrideFormatters={[\n inputFormatter.rangeFormatter({ min: 0, max: 100, dp: 2 }),\n inputFormatter.dpFormatter(2),\n ]}\n classNames={{\n root: \"oui-rounded-b-xl\",\n }}\n />\n );\n});\n","import { memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype TotalOrdersInputProps = {\n total_orders?: string;\n};\n\nexport const TotalOrdersInput = memo((props: TotalOrdersInputProps) => {\n const { t } = useTranslation();\n const { onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n return (\n <CustomInput\n label={t(\"orderEntry.totalOrders\")}\n placeholder=\"2-20\"\n id=\"order_total_orders_input\"\n className={\"!oui-rounded-l\"}\n value={props.total_orders}\n error={getErrorMsg(\"total_orders\")}\n onChange={(val) => {\n setOrderValue(\"total_orders\", val);\n }}\n overrideFormatters={[\n // inputFormatter.rangeFormatter({ min: 2, max: 20 }),\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(0),\n ]}\n onFocus={onFocus(InputType.TOTAL_ORDERS)}\n onBlur={onBlur(InputType.TOTAL_ORDERS)}\n />\n );\n});\n","import { FC, memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype TriggerPriceInputProps = {\n trigger_price?: string;\n};\n\nexport const TriggerPriceInput: FC<TriggerPriceInputProps> = memo((props) => {\n const { t } = useTranslation();\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n triggerPriceInputRef,\n } = useOrderEntryContext();\n\n return (\n <div className=\"oui-group\">\n <CustomInput\n ref={triggerPriceInputRef}\n id=\"order_trigger_price_input\"\n name=\"order_trigger_price_input\"\n label={t(\"common.trigger\")}\n suffix={symbolInfo.quote}\n value={props.trigger_price}\n onChange={(e) => {\n setOrderValue(\"trigger_price\", e);\n }}\n error={getErrorMsg(\"trigger_price\")}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.TRIGGER_PRICE)}\n onBlur={onBlur(InputType.TRIGGER_PRICE)}\n />\n </div>\n );\n});\n\nTriggerPriceInput.displayName = \"TriggerPriceInput\";\n","import { memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype ActivePriceInputProps = {\n activated_price?: string;\n};\n\nexport const ActivePriceInput = memo<ActivePriceInputProps>((props) => {\n const { t } = useTranslation();\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n activatedPriceInputRef,\n } = useOrderEntryContext();\n\n return (\n <div className=\"oui-group\">\n <CustomInput\n ref={activatedPriceInputRef}\n id=\"order_activated_price_input\"\n name=\"order_activated_price_input\"\n label={t(\"common.triggerPrice\")}\n placeholder={`0 (${t(\"common.optional\")})`}\n suffix={symbolInfo.quote}\n error={getErrorMsg(\"activated_price\")}\n value={props.activated_price}\n onChange={(val: string) => {\n setOrderValue(\"activated_price\", val);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.ACTIVATED_PRICE)}\n onBlur={onBlur(InputType.ACTIVATED_PRICE)}\n />\n </div>\n );\n});\n\nActivePriceInput.displayName = \"ActivePriceInput\";\n","import { FC, memo, useCallback, useRef } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { TrailingCallbackType } from \"@orderly.network/types\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\nimport { CallbackRatePercentages } from \"./callbackRatePercentages\";\nimport { TrailingCallbackSelect } from \"./trailingCallbackSelect\";\n\ntype TrailingCallbackInputProps = {\n callback_value?: string;\n callback_rate?: string;\n};\n\nexport const TrailingCallbackInput: FC<TrailingCallbackInputProps> = memo(\n (props) => {\n const { callback_value, callback_rate } = props;\n const { t } = useTranslation();\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n setOrderValues,\n } = useOrderEntryContext();\n const { quote, quote_dp } = symbolInfo;\n // const [open, setOpen] = useState(false);\n\n const lastCallbackValueRef = useRef<string>();\n const lastCallbackRateRef = useRef<string>();\n\n const [callbackType, setCallbackType] = useLocalStorage(\n \"orderly_order_trailing_callback_type\",\n TrailingCallbackType.VALUE,\n );\n\n const onCallbackTypeChange = useCallback(\n (type: TrailingCallbackType) => {\n setCallbackType(type);\n // when switch to callback rate, save the last callback value\n if (type === TrailingCallbackType.RATE) {\n lastCallbackValueRef.current = callback_value;\n setOrderValues({\n callback_value: \"\",\n callback_rate: lastCallbackRateRef.current,\n });\n // when switch to callback value, save the last callback rate\n } else {\n lastCallbackRateRef.current = callback_rate;\n setOrderValues({\n callback_value: lastCallbackValueRef.current,\n callback_rate: \"\",\n });\n }\n },\n [callback_value, callback_rate],\n );\n\n const suffix = (\n <TrailingCallbackSelect\n quote={quote}\n value={callbackType}\n onValueChange={onCallbackTypeChange}\n />\n );\n\n // don't need to convert trailing rate to estimated value\n // const estimatedValue = useMemo(() => {\n // if (callbackType === TrailingCallbackType.RATE) {\n // return callback_rate\n // }\n // }, [callback_rate, callbackType]);\n\n // const tooltipContent = estimatedValue\n // ? `≈ ${estimatedValue} ${quote}`\n // : undefined;\n\n // const openTooltip = useCallback(() => {\n // setOpen(true);\n // }, []);\n\n // const closeTooltip = useCallback(() => {\n // setOpen(false);\n // }, []);\n\n if (callbackType === TrailingCallbackType.RATE) {\n return (\n // <Tooltip\n // content={tooltipContent}\n // open={open && !!tooltipContent}\n // sideOffset={-25}\n // className=\"!oui-p-3\"\n // >\n <div className=\"oui-relative\">\n <CustomInput\n id=\"order_callback_rate_input\"\n name=\"order_callback_rate_input\"\n label={t(\"orderEntry.trailingRate\")}\n suffix={suffix}\n error={getErrorMsg(\"callback_rate\")}\n value={callback_rate}\n onChange={(val: string) => {\n setOrderValue(\"callback_rate\", val);\n }}\n formatters={[inputFormatter.dpFormatter(1)]}\n onFocus={(e) => {\n onFocus(InputType.CALLBACK_RATE)(e);\n // openTooltip();\n }}\n onBlur={(e) => {\n onBlur(InputType.CALLBACK_RATE)(e);\n // closeTooltip();\n }}\n classNames={{\n root: \"oui-h-[68px]\",\n input: \"oui-mb-5\",\n prefix: \"!oui-top-1\",\n }}\n />\n <CallbackRatePercentages\n className=\"oui-absolute oui-bottom-1 oui-left-2\"\n callback_rate={callback_rate}\n // onClick={openTooltip}\n />\n </div>\n // </Tooltip>\n );\n }\n\n return (\n <CustomInput\n id=\"order_callback_value_input\"\n name=\"order_callback_value_input\"\n label={t(\"orderEntry.trailingValue\")}\n suffix={suffix}\n error={getErrorMsg(\"callback_value\")}\n value={callback_value}\n onChange={(val: string) => {\n setOrderValue(\"callback_value\", val);\n }}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.CALLBACK_VALUE)}\n onBlur={onBlur(InputType.CALLBACK_VALUE)}\n classNames={{\n input: \"!oui-mb-[6px]\",\n prefix: \"!oui-top-1\",\n }}\n />\n );\n },\n);\n\nTrailingCallbackInput.displayName = \"TrailingCallbackInput\";\n","import { FC, memo } from \"react\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\nconst percentages = [1, 2, 3, 5];\n\ntype CallbackRatePercentagesProps = {\n className?: string;\n callback_rate?: string;\n onClick?: (value: string) => void;\n};\n\nexport const CallbackRatePercentages: FC<CallbackRatePercentagesProps> = memo(\n (props) => {\n const { setOrderValue } = useOrderEntryContext();\n\n return (\n <Flex gapX={2} className={props.className}>\n {percentages.map((item) => {\n const value = item.toString();\n const isActive = props.callback_rate === value;\n\n return (\n <Flex\n key={item}\n justify=\"center\"\n itemAlign=\"center\"\n width={46}\n height={18}\n className={cn(\n \"oui-cursor-pointer oui-select-none\",\n \"oui-rounded oui-border\",\n isActive ? \"oui-border-base-contrast-36\" : \"oui-border-line-12\",\n )}\n onClick={() => {\n setOrderValue(\"callback_rate\", value);\n props.onClick?.(value);\n }}\n >\n <Text size=\"2xs\" intensity={isActive ? 80 : 36} weight=\"semibold\">\n {item}%\n </Text>\n </Flex>\n );\n })}\n </Flex>\n );\n },\n);\n\nCallbackRatePercentages.displayName = \"CallbackRatePercentages\";\n","import { FC, memo, useMemo } from \"react\";\nimport { TrailingCallbackType } from \"@orderly.network/types\";\nimport { Select, cn } from \"@orderly.network/ui\";\n\ntype TrailingCallbackSelectProps = {\n quote: string;\n value: string;\n onValueChange: (value: TrailingCallbackType) => void;\n};\n\nexport const TrailingCallbackSelect: FC<TrailingCallbackSelectProps> = memo(\n (props) => {\n const { quote } = props;\n\n const options = useMemo(() => {\n return [\n { label: quote, value: TrailingCallbackType.VALUE },\n { label: \"%\", value: TrailingCallbackType.RATE },\n ];\n }, [quote]);\n\n return (\n <Select.options\n variant=\"text\"\n size=\"xs\"\n options={options}\n classNames={{\n trigger: cn(\n \"oui-absolute oui-right-0 oui-top-1\",\n \"oui-w-[124px] oui-justify-end\",\n \"oui-text-base-contrast-36\",\n ),\n }}\n value={props.value}\n onValueChange={props.onValueChange}\n contentProps={{\n align: \"end\",\n alignOffset: -1,\n sideOffset: -4,\n className: \"oui-border oui-border-line-6\",\n }}\n />\n );\n },\n);\n\nTrailingCallbackSelect.displayName = \"trailingCallbackSelect\";\n","import { OrderlyOrder } from \"@orderly.network/types\";\nimport { QtyAndTotalInput } from \"../qtyAndTotal/qtyAndTotalInput\";\nimport { ActivePriceInput } from \"./activePriceInput\";\nimport { TrailingCallbackInput } from \"./trailingCallbackInput\";\n\ntype TrailingStopInputProps = {\n values: Partial<OrderlyOrder>;\n};\n\nexport const TrailingStopInput = (props: TrailingStopInputProps) => {\n const { values } = props;\n\n return (\n <div className=\"oui-space-y-1\">\n <ActivePriceInput activated_price={values.activated_price} />\n <TrailingCallbackInput\n callback_value={values.callback_value}\n callback_rate={values.callback_rate}\n />\n <QtyAndTotalInput\n order_quantity={values.order_quantity}\n total={values.total}\n />\n </div>\n );\n};\n","import { memo, useEffect, useMemo, useState } from \"react\";\nimport { utils } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport { Flex, Slider, textVariants, Text } from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { InputType } from \"../../types\";\nimport { useOrderEntryContext } from \"../orderEntryContext\";\n\ntype QuantitySliderProps = {\n canTrade: boolean;\n side: OrderSide;\n order_quantity?: string;\n maxQty: number;\n};\nconst SLIDER_MIN = 0;\nconst SLIDER_MAX = 100;\n\nexport const QuantitySlider = memo((props: QuantitySliderProps) => {\n const { canTrade, side, order_quantity, maxQty } = props;\n\n const [sliderValue, setSliderValue] = useState<number>(0);\n\n const { setOrderValue, symbolInfo, lastQuantityInputType } =\n useOrderEntryContext();\n\n const { base_dp, base_tick } = symbolInfo;\n\n const { t } = useTranslation();\n\n const color = useMemo(\n () => (canTrade ? (side === OrderSide.BUY ? \"buy\" : \"sell\") : undefined),\n [side, canTrade],\n );\n\n const maxLabel = useMemo(() => {\n return side === OrderSide.BUY\n ? t(\"orderEntry.maxBuy\")\n : t(\"orderEntry.maxSell\");\n }, [side, t]);\n\n const onSliderValueChange = (value: number) => {\n lastQuantityInputType.current = InputType.QUANTITY_SLIDER;\n setSliderValue(value);\n };\n\n const sliderToQuantity = (value: number) => {\n const newQty = new Decimal(value)\n .div(SLIDER_MAX)\n .mul(maxQty)\n .toFixed(base_dp, Decimal.ROUND_DOWN);\n setOrderValue(\"order_quantity\", utils.formatNumber(newQty, base_tick));\n };\n\n const onMax = () => {\n onSliderValueChange(SLIDER_MAX);\n // when previous slider value is max, quantity will not update by useEffect, so must set quantity manually to maxQty\n if (sliderValue === SLIDER_MAX) {\n sliderToQuantity(SLIDER_MAX);\n }\n };\n\n // update quantity when slider value and maxQty changes\n useEffect(() => {\n if (lastQuantityInputType.current === InputType.QUANTITY_SLIDER) {\n sliderToQuantity(sliderValue);\n }\n }, [sliderValue, maxQty]);\n\n useEffect(() => {\n const quantityToSlider = () => {\n if (order_quantity && Number(order_quantity) !== 0 && maxQty !== 0) {\n return new Decimal(Math.min(Number(order_quantity), maxQty))\n .div(maxQty)\n .mul(SLIDER_MAX)\n .todp(2, Decimal.ROUND_DOWN)\n .toNumber();\n }\n return 0;\n };\n\n // update slider value when last quantity input type is not quantity slider\n if (lastQuantityInputType.current !== InputType.QUANTITY_SLIDER) {\n setSliderValue(quantityToSlider());\n }\n }, [order_quantity, maxQty]);\n\n return (\n <div>\n <Slider\n disabled={maxQty === 0 || !canTrade}\n value={[sliderValue]}\n color={color}\n markCount={4}\n showTip\n onValueChange={(e) => {\n onSliderValueChange(e[0]);\n }}\n min={SLIDER_MIN}\n max={SLIDER_MAX}\n />\n <Flex justify={\"between\"} className=\"oui-pt-1 xl:oui-pt-2\">\n <Text.numeral\n size={\"2xs\"}\n color={color}\n dp={2}\n padding={false}\n suffix=\"%\"\n >\n {canTrade ? sliderValue : 0}\n </Text.numeral>\n <Flex>\n <button\n className={textVariants({\n size: \"2xs\",\n className: \"oui-mr-1\",\n })}\n onClick={onMax}\n data-testid=\"oui-testid-orderEntry-maxQty-value-button\"\n >\n {maxLabel}\n </button>\n <Text.numeral\n size={\"2xs\"}\n color={color}\n dp={base_dp}\n padding={false}\n data-testid=\"oui-testid-orderEntry-maxQty-value\"\n >\n {canTrade ? maxQty : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n </div>\n );\n});\n\nQuantitySlider.displayName = \"QuantitySlider\";\n","import React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Switch } from \"@orderly.network/ui\";\n\nexport interface ReduceOnlySwitchProps {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n className?: string;\n testId?: string;\n}\n\nexport const ReduceOnlySwitch: React.FC<ReduceOnlySwitchProps> = ({\n checked,\n onCheckedChange,\n className,\n testId = \"oui-testid-orderEntry-reduceOnly-switch\",\n}) => {\n const { t } = useTranslation();\n\n return (\n <Flex itemAlign={\"center\"} gapX={1} className={className}>\n <Switch\n data-testid={testId}\n className=\"oui-h-[14px]\"\n id={\"reduceOnly\"}\n checked={checked}\n onCheckedChange={onCheckedChange}\n />\n <label htmlFor={\"reduceOnly\"} className={\"oui-text-xs\"}>\n {t(\"orderEntry.reduceOnly\")}\n </label>\n </Flex>\n );\n};\n","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport { OrderlyOrder, OrderType, PositionType } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n Text,\n Input,\n inputFormatter,\n modal,\n Switch,\n SettingFillIcon,\n Box,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { ExclamationFillIcon } from \"@orderly.network/ui\";\nimport {\n TPSLAdvancedDialogId,\n TPSLAdvancedWidget,\n TPSLPositionTypeWidget,\n} from \"@orderly.network/ui-tpsl\";\nimport { OrderEntryContext, useOrderEntryContext } from \"./orderEntryContext\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { usePnlInputContext } from \"./pnlInput/pnlInputContext\";\nimport { PnlInputProvider } from \"./pnlInput/pnlInputProvider\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\nimport { ReduceOnlySwitch } from \"./reduceOnlySwitch\";\n\ntype OrderValueKeys = keyof OrderlyOrder;\n\ntype Est_Values = PNL_Values & {\n trigger_price?: string;\n};\n\ntype TPSL_Values = {\n tp: Est_Values;\n sl: Est_Values;\n position_type: PositionType;\n};\n\nexport const OrderTPSL = (props: {\n // onCancelTPSL: () => void;\n // onEnableTP_SL: () => void;\n switchState: boolean;\n onSwitchChanged: (state: boolean) => void;\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n orderType: OrderType;\n isReduceOnly?: boolean;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n showTPSLAdvanced: () => void;\n setOrderValue: (key: string, value: any) => void;\n reduceOnlyChecked?: boolean;\n onReduceOnlyChange?: (checked: boolean) => void;\n}) => {\n // const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n useEffect(() => {\n if (\n props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET\n ) {\n // setOpen(false);\n props.onSwitchChanged(false);\n\n // props.onCancelTPSL();\n }\n }, [props.orderType]);\n\n if (\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n )\n return null;\n\n return (\n <div>\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n id={\"order_entry_tpsl\"}\n className=\"oui-h-[14px]\"\n checked={props.switchState}\n disabled={\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n }\n onCheckedChange={(checked) => {\n // setOpen(checked);\n props.onSwitchChanged(checked);\n // if (!checked) {\n // props.onCancelTPSL();\n // } else {\n // props.onEnableTP_SL();\n // }\n }}\n />\n <label htmlFor={\"order_entry_tpsl\"} className={\"oui-text-xs\"}>\n {t(\"common.tpsl\")}\n </label>\n {/* <ExclamationFillIcon\n color=\"white\"\n // opacity={0.36}\n size={14}\n opacity={1}\n className=\"oui-cursor-pointer oui-text-white/[.36] hover:oui-text-white/80\"\n onClick={() => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: (\n <Text intensity={54}>{t(\"orderEntry.tpsl.tips\")}</Text>\n ),\n });\n }}\n /> */}\n </Flex>\n <Flex itemAlign={\"center\"} gapX={2}>\n {isMobile &&\n props.reduceOnlyChecked !== undefined &&\n props.onReduceOnlyChange && (\n <ReduceOnlySwitch\n checked={props.reduceOnlyChecked}\n onCheckedChange={props.onReduceOnlyChange}\n />\n )}\n {!isMobile && (\n <TPSLAdvancedButton\n className={cn(\n \"oui-group oui-invisible\",\n props.switchState && \"oui-visible\",\n )}\n showTPSLAdvanced={props.showTPSLAdvanced}\n />\n )}\n </Flex>\n </Flex>\n <div\n className={cn(\n \"oui-max-h-0 oui-overflow-hidden oui-transition-all\",\n props.switchState && \"oui-max-h-[120px]\",\n )}\n onTransitionEnd={() => {\n console.log(\"transition end\");\n tpslFormRef.current?.style.setProperty(\n \"opacity\",\n props.switchState ? \"1\" : \"0\",\n );\n }}\n >\n <TPSLInputForm\n ref={tpslFormRef}\n setOrderValue={props.setOrderValue}\n onChange={props.onChange}\n values={props.values}\n errors={props.errors}\n quote_dp={props.quote_dp}\n showTPSLAdvanced={props.showTPSLAdvanced}\n isMobile={isMobile}\n />\n </div>\n </div>\n );\n};\n\nconst TPSLInputForm = React.forwardRef<\n HTMLDivElement,\n {\n setOrderValue: (key: string, value: any) => void;\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n showTPSLAdvanced: () => void;\n isMobile: boolean;\n }\n>((props, ref) => {\n const { getErrorMsg } = useOrderEntryFormErrorMsg(props.errors);\n const { t } = useTranslation();\n\n return (\n <div\n ref={ref}\n className={\"oui-space-y-1 oui-px-px oui-py-2 oui-transition-all\"}\n >\n <Flex itemAlign={\"center\"} justify={\"between\"} gapX={2}>\n <TPSLPositionTypeWidget\n value={props.values.position_type}\n onChange={props.onChange}\n />\n {props.isMobile && (\n <TPSLAdvancedButton\n showTPSLAdvanced={props.showTPSLAdvanced}\n isMobile={props.isMobile}\n />\n )}\n </Flex>\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={getErrorMsg(\"tp_trigger_price\")}\n onChange={props.onChange}\n values={props.values.tp}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-tpPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-tpPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-tp-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n <PnlInputProvider values={props.values.sl} type={\"SL\"}>\n <TPSLInputRow\n type={\"SL\"}\n error={getErrorMsg(\"sl_trigger_price\")}\n onChange={props.onChange}\n values={props.values.sl}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-slPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-slPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-sl-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n </div>\n );\n});\n\nTPSLInputForm.displayName = \"TPSLInputForm\";\n\nconst TPSLAdvancedButton = (props: {\n showTPSLAdvanced: () => void;\n className?: string;\n isMobile?: boolean;\n}) => {\n const { t } = useTranslation();\n\n return (\n <Flex\n itemAlign={\"center\"}\n gapX={1}\n onClick={props.showTPSLAdvanced}\n className={cn(\"oui-group oui-cursor-pointer\", props.className)}\n >\n <Text\n className={cn(\n \"oui-cursor-pointer group-hover:oui-text-base-contrast\",\n props.isMobile ? \"oui-text-2xs\" : \"oui-text-sm\",\n )}\n >\n {t(\"tpsl.advanced\")}\n </Text>\n <SettingFillIcon\n size={12}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast oui-cursor-pointer\"\n opacity={1}\n onClick={props.showTPSLAdvanced}\n />\n </Flex>\n );\n};\n\n//------- TPSLTriggerPriceInput start -------\nconst TPSLTriggerPriceInput = (props: {\n type: \"TP\" | \"SL\";\n error: string | undefined;\n values: Est_Values;\n onChange: (value: string) => void;\n quote_dp: number | undefined;\n testId?: string;\n}) => {\n const { t } = useTranslation();\n const { errorMsgVisible } = useOrderEntryContext();\n const { tipsEle } = usePnlInputContext();\n const [prefix, setPrefix] = useState<string>(`${props.type} Price`);\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const [innerValue, setInnerValue] = useState<string>(\n props.values.trigger_price ?? \"\",\n );\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(props.values.trigger_price ?? \"\");\n }, [props.values.trigger_price, isFocused]);\n\n const triggerPriceToolTipEle = useMemo(() => {\n if (props.error && errorMsgVisible) return props.error;\n if (tipVisible) return tipsEle;\n\n return null;\n }, [props.error, errorMsgVisible, tipVisible, tipsEle]);\n\n const getPrefixLabel = (trigger_price?: string) => {\n let _prefix = props.type === \"TP\" ? t(\"tpsl.tpPrice\") : t(\"tpsl.slPrice\");\n\n if (trigger_price) {\n _prefix = props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\");\n }\n return _prefix;\n };\n\n const onValueChange = (value: string) => {\n setInnerValue(value);\n props.onChange(value);\n };\n\n // console.log(\"props.values.trigger_price\", props.values.trigger_price);\n\n useEffect(() => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n\n if (!isFocused) {\n setInnerValue(props.values.trigger_price ?? \"\");\n }\n }, [props.type, props.values.trigger_price]);\n\n const onFocus = () => {\n setPrefix(props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\"));\n setPlaceholder(\"\");\n setTipVisible(true);\n setIsFocused(true);\n };\n\n const onBlur = () => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n setPlaceholder(\"USDC\");\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(innerValue);\n };\n\n return (\n <Input.tooltip\n data-testid={props.testId}\n prefix={prefix}\n size={\"md\"}\n placeholder={placeholder}\n align=\"right\"\n onFocus={onFocus}\n onBlur={onBlur}\n tooltip={triggerPriceToolTipEle}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n color={props.error ? \"danger\" : undefined}\n autoComplete={\"off\"}\n value={innerValue}\n classNames={{\n additional: \"oui-text-base-contrast-54\",\n root: \"oui-pr-2 md:oui-pr-3\",\n prefix: \"oui-pr-1 md:oui-pr-2\",\n }}\n // onChange={props.onChange}\n onValueChange={onValueChange}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp ?? 2),\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n\n//------- TPSLTriggerPriceInput end -------\n\nconst TPSLInputRow: React.FC<{\n type: \"TP\" | \"SL\";\n values: Est_Values;\n error?: string;\n onChange: (key: OrderValueKeys, value: any) => void;\n quote_dp: number | undefined;\n testIds?: {\n first?: string;\n second?: string;\n dropDown?: string;\n };\n}> = (props) => {\n return (\n <Grid cols={2} gapX={1}>\n <TPSLTriggerPriceInput\n testId={props.testIds?.first}\n type={props.type}\n error={props.error}\n values={props.values ?? \"\"}\n onChange={(event) => {\n props.onChange(\n props.type === \"SL\" ? \"sl_trigger_price\" : \"tp_trigger_price\",\n event,\n );\n }}\n quote_dp={props.quote_dp}\n />\n\n <PnlInputWidget\n testIds={{\n input: props.testIds?.second,\n dropDown: props.testIds?.dropDown,\n }}\n onChange={props.onChange}\n quote={\"USDC\"}\n quote_dp={2}\n type={props.type}\n values={{\n PnL: props.values.PnL,\n Offset: props.values.Offset,\n \"Offset%\": props.values[\"Offset%\"],\n ROI: props.values.ROI,\n }}\n />\n </Grid>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n CaretDownIcon,\n Input,\n MenuItem,\n Text,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\n\nexport type PNLInputProps = PNLInputState & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n type: \"TP\" | \"SL\";\n};\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n modeLabelMap,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n type,\n tips,\n onFocus,\n onBlur,\n setFocus,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote,\n );\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n useEffect(() => {\n setPrefix(!!value ? \"\" : mode);\n }, [value]);\n\n const id = useMemo(() => `${type.toLowerCase()}_${mode.toLowerCase()}`, []);\n\n return (\n <Input.tooltip\n prefix={modeLabelMap[prefix as keyof typeof modeLabelMap] || prefix}\n size={\"md\"}\n placeholder={placeholder}\n id={id}\n align={\"right\"}\n value={value}\n tooltip={tips}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n data-testid={props.testIds?.input}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n props.formatter({ dp: quote_dp, mode, type }),\n inputFormatter.currencyFormatter,\n // inputFormatter.identifierFormatter(),\n ]}\n classNames={{\n root: type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n additional: \"oui-text-base-contrast-54\",\n input: \"oui-text-inherit\",\n }}\n onFocus={() => {\n setPrefix(\"\");\n setPlaceholder(\"\");\n setFocus(true);\n onFocus();\n }}\n onBlur={() => {\n setPrefix(!!value ? \"\" : mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n onBlur();\n }}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className=\"oui-ml-[2px]\">\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n testId={props.testIds?.dropDown}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n testId?: string;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"} data-testid={props.testId}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport { usePnlInputContext } from \"./pnlInputContext\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n ROI: string;\n};\n\ntype PNL_Keys =\n | \"tp_offset\"\n | \"tp_offset_percentage\"\n | \"tp_pnl\"\n | \"sl_offset\"\n | \"sl_offset_percentage\"\n | \"sl_pnl\";\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: PNL_Keys, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values, quote_dp } = props;\n const { t } = useTranslation();\n const [focus, setFocus] = useState(true);\n // const [mode, setMode] = useLocalStorage<PnLMode>(\n // \"TP/SL_Mode\",\n // PnLMode.PERCENTAGE\n // );\n const { mode, setMode, tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const key = useMemo<PNL_Keys>(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset` as PNL_Keys;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage` as PNL_Keys;\n default:\n return `${type.toLowerCase()}_pnl` as PNL_Keys;\n }\n }, [mode]);\n\n const [innerValue, setInnerValue] = useState<string>(\n values[mode as keyof PNL_Values],\n );\n\n // const value = useMemo(() => {\n // // console.log(\"mode\", mode, values);\n // const value = values[mode as keyof PNL_Values];\n // // if (isFocused) {\n // // return value;\n // // }\n // return value;\n // }, [values, mode, isFocused]);\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(values[mode as keyof PNL_Values]);\n }, [values, mode, isFocused]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n {\n label: t(\"tpsl.pnl\"),\n value: PnLMode.PnL,\n testId: `${PnLMode.PnL}_menu_item`,\n },\n {\n label: t(\"tpsl.offset\"),\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: `${t(\"tpsl.offset\")}%`,\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, [t]);\n\n const modeLabelMap = useMemo(() => {\n return {\n [PnLMode.PnL]: t(\"tpsl.pnl\"),\n [PnLMode.OFFSET]: t(\"tpsl.offset\"),\n [PnLMode.PERCENTAGE]: `${t(\"tpsl.offset\")}%`,\n };\n }, [t]);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n // console.log(\"onValueChange\", value);\n // if (!isFocused) {\n // props.onChange(key, value);\n // } else {\n // setInnerValue(value);\n // }\n setInnerValue(value);\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n setIsFocused(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(key, innerValue);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n type: \"TP\" | \"SL\";\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions,\n ) => {\n value = `${value}`; // convert to string\n\n if (focus) {\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n // value = new Decimal(\n // value.replace(\n // new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n // \"\"\n // )\n // )\n // .mul(100)\n // .toString();\n\n // return `${todpIfNeed(value, 2)}${percentageSuffix.current}`;\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\",\n ),\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n // return (Number(value) * 100).toFixed(2);\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n // console.log(\"onSendBefore\", value);\n\n if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else if (mode === PnLMode.PnL && type === \"SL\" && focus) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n modeLabelMap,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value: innerValue,\n onValueChange,\n quote_dp,\n tips: tipVisible ? tipsEle : undefined,\n setFocus,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import { createContext, ReactNode, useContext } from \"react\";\nimport { PnLMode } from \"./useBuilder.script\";\n\nexport type PnlInputContextState = {\n mode: PnLMode;\n setMode: (mode: PnLMode) => void;\n tipsEle: ReactNode | null;\n};\n\nexport const PnlInputContext = createContext<PnlInputContextState>(\n {} as PnlInputContextState,\n);\n\nexport const usePnlInputContext = () => {\n return useContext(PnlInputContext);\n};\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, PnLMode, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n }\n) => {\n const { testIds, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return (\n <PNLInput {...state} testIds={testIds} quote={quote} type={props.type} />\n );\n};\n","import React, { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\nimport { PnlInputContext, PnlInputContextState } from \"./pnlInputContext\";\nimport { PNL_Values, PnLMode } from \"./useBuilder.script\";\n\nexport const PnlInputProvider: React.FC<\n React.PropsWithChildren<{\n values: PNL_Values & { trigger_price?: string };\n type: \"TP\" | \"SL\";\n }>\n> = (props) => {\n const { type, values, children } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE,\n );\n const { t } = useTranslation();\n\n const tipsEle = useMemo(() => {\n if (!values.PnL || !values.trigger_price) {\n return null;\n }\n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {mode === PnLMode.PnL\n ? t(\"orderEntry.estRoi\")\n : t(\"orderEntry.estPnL\")}\n </span>\n {mode === PnLMode.PnL ? (\n <Text.numeral\n rule={\"percentages\"}\n className={cn(\n \"oui-ml-1 oui-text-xs\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n )}\n >\n {values.ROI}\n </Text.numeral>\n ) : (\n <Text.numeral\n rule={\"price\"}\n className={cn(\n \"oui-ml-1 oui-text-xs\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n )}\n >\n {values.PnL}\n </Text.numeral>\n )}\n </Flex>\n );\n }, [mode, values.ROI, values.PnL, values.trigger_price]);\n\n const memoizedValue = useMemo<PnlInputContextState>(() => {\n return { mode, setMode, tipsEle };\n }, [mode, setMode, tipsEle]);\n\n return (\n <PnlInputContext.Provider value={memoizedValue}>\n {children}\n </PnlInputContext.Provider>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport {\n useComputedLTV,\n useEventEmitter,\n useLocalStorage,\n useMarginRatio,\n useMemoizedFn,\n useOrderEntry,\n useOrderlyContext,\n} from \"@orderly.network/hooks\";\nimport { useCanTrade } from \"@orderly.network/react-app\";\nimport {\n DistributionType,\n OrderLevel,\n OrderSide,\n OrderType,\n PositionType,\n} from \"@orderly.network/types\";\nimport { Decimal, removeTrailingZeros } from \"@orderly.network/utils\";\nimport { useAskAndBid } from \"./hooks/useAskAndBid\";\nimport { useBBOState } from \"./hooks/useBBOState\";\nimport { useFocusAndBlur } from \"./hooks/useFocusAndBlur\";\nimport { usePriceInputContainer } from \"./hooks/usePriceInputContainer\";\nimport { InputType } from \"./types\";\nimport { BBOStatus, isBBOOrder, safeNumber } from \"./utils\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\n\nexport const ORDERLY_ORDER_SOUND_ALERT_KEY = \"orderly_order_sound_alert\";\n\nexport type OrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n\nexport const useOrderEntryScript = (inputs: OrderEntryScriptInputs) => {\n const { symbol } = inputs;\n const [localOrderType, setLocalOrderType] = useLocalStorage(\n \"orderly-order-entry-order-type\",\n OrderType.LIMIT,\n );\n const [localOrderSide, setLocalOrderSide] = useLocalStorage(\n \"orderly-order-entry-order-side\",\n OrderSide.BUY,\n );\n\n const { notification } = useOrderlyContext();\n\n const [soundAlert, setSoundAlert] = useLocalStorage<boolean>(\n ORDERLY_ORDER_SOUND_ALERT_KEY,\n notification?.orderFilled?.defaultOpen ?? false,\n );\n\n const canTrade = useCanTrade();\n\n const {\n formattedOrder,\n setValue,\n setValues: setOrderValues,\n symbolInfo,\n ...state\n } = useOrderEntry(symbol, {\n initialOrder: {\n symbol,\n order_type: localOrderType,\n position_type: PositionType.PARTIAL,\n side: localOrderSide,\n },\n });\n\n const [tpslSwitch, setTpslSwitch] = useLocalStorage(\n \"orderly-order-entry-tp_sl-switch\",\n false,\n );\n\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n const triggerPriceInputRef = useRef<HTMLInputElement | null>(null);\n const priceInputRef = useRef<HTMLInputElement | null>(null);\n const activatedPriceInputRef = useRef<HTMLInputElement | null>(null);\n\n const { bboStatus, bboType, setBBOType, onBBOChange, toggleBBO } =\n useBBOState({\n tpslSwitch,\n order_type: formattedOrder.order_type,\n order_type_ext: formattedOrder.order_type_ext,\n side: formattedOrder.side,\n setOrderValues,\n });\n\n const {\n currentFocusInput,\n lastScaledOrderPriceInput,\n lastQuantityInputType,\n onFocus,\n onBlur,\n } = useFocusAndBlur({\n base_tick: symbolInfo?.base_tick,\n order_type: formattedOrder.order_type,\n order_quantity: formattedOrder.order_quantity,\n setValue,\n });\n\n // cancel TP/SL\n const cancelTP_SL = () => {\n // if(formattedOrder.)\n setOrderValues({\n tp_trigger_price: \"\",\n sl_trigger_price: \"\",\n position_type: PositionType.FULL,\n });\n };\n\n const enableTP_SL = () => {\n setOrderValues({\n order_type_ext: undefined,\n position_type: PositionType.FULL,\n });\n };\n\n const setOrderValue = useMemoizedFn(\n (\n key: any,\n value: any,\n options?: {\n shouldUpdateLastChangedField?: boolean;\n },\n ) => {\n if (key === \"order_type\") {\n setLocalOrderType(value);\n }\n if (key === \"side\") {\n setLocalOrderSide(value);\n }\n\n if (\n (key === \"reduce_only\" && value) ||\n (key === \"order_type\" &&\n (value === OrderType.STOP_LIMIT || value === OrderType.STOP_MARKET))\n ) {\n // cancelTP_SL();\n\n const data = {\n tp_trigger_price: \"\",\n sl_trigger_price: \"\",\n [key]: value,\n };\n\n if (key === \"order_type\") {\n data[\"order_type_ext\" as any] = \"\";\n }\n\n setOrderValues(data);\n\n return;\n }\n\n if (key === \"order_type\" && value !== OrderType.LIMIT) {\n const data = {\n level: undefined,\n order_type_ext: undefined,\n [key]: value,\n };\n\n setOrderValues(data);\n\n return;\n }\n\n if (key === \"order_type\" && value === OrderType.SCALED) {\n setOrderValues({\n distribution_type: DistributionType.FLAT,\n [key]: value,\n });\n return;\n }\n\n setValue(key, value, options);\n },\n );\n\n const onTPSLSwitchChanged = (state: boolean) => {\n setTpslSwitch(state);\n if (state) {\n enableTP_SL();\n } else {\n cancelTP_SL();\n }\n };\n\n useEffect(() => {\n const updateOrderPrice = (price: string) => {\n setValue(\"order_price\", price);\n };\n ee.on(\"update:orderPrice\", updateOrderPrice);\n\n return () => {\n ee.off(\"update:orderPrice\", updateOrderPrice);\n };\n }, []);\n\n useEffect(() => {\n const focusInputElement = (target: HTMLInputElement | null) => {\n requestAnimationFrame(() => {\n target?.focus();\n });\n };\n\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n const price = removeTrailingZeros(item[0]);\n const { order_type, order_type_ext } = formattedOrder;\n\n // handle trigger price input, focus on trigger price input\n if (\n currentFocusInput.current === InputType.TRIGGER_PRICE &&\n (order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.STOP_MARKET)\n ) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle bbo order, unselect bbo and set order price, focus on order price input\n if (isBBOOrder({ order_type, order_type_ext })) {\n setBBOType(undefined);\n\n setOrderValues({\n order_type_ext: undefined,\n level: undefined,\n });\n\n requestAnimationFrame(() => {\n // Since BBO will update the price when unselected, we should set order price in requestAnimationFrame\n // We can't call setValue directly here because it's inside a requestAnimationFrame, and the formattedOrder accessed inside setValue would be the old value\n // setValue(\"order_price\", price);\n ee.emit(\"update:orderPrice\", price);\n });\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle limit order and stop limit order, set order price and focus on order price input\n if (\n order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle stop market order, set trigger price and focus on trigger price input\n if (order_type === OrderType.STOP_MARKET) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle market order, set order type to limit\n if (order_type === OrderType.MARKET) {\n // unselect bbo\n setBBOType(undefined);\n\n // You can't call setValue twice here , the second value will override the first, so you need to combine them into a single setValues call\n setOrderValues({\n order_type: OrderType.LIMIT,\n order_price: price,\n });\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n if (\n order_type === OrderType.SCALED &&\n lastScaledOrderPriceInput.current\n ) {\n const field =\n lastScaledOrderPriceInput.current === InputType.START_PRICE\n ? \"start_price\"\n : \"end_price\";\n setValue(field, price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle trailing stop order, set activated price and focus on activated price input\n if (order_type === OrderType.TRAILING_STOP) {\n setValue(\"activated_price\", price);\n focusInputElement(activatedPriceInputRef.current);\n return;\n }\n\n // default, set order price and focus on order price input\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n // Please do not modify this deps lightly, because `setValue` also relies on these state internally\n }, [formattedOrder, symbolInfo]);\n\n useEffect(() => {\n // after switching symbol, all the input number should be cleared (price, qty, TP/SL, etc)\n state.reset();\n state.resetMetaState();\n // reset last quantity input type\n lastQuantityInputType.current = InputType.NONE;\n }, [symbol]);\n\n // if scaled order, and distribution_type is not set, set it to flat\n useEffect(() => {\n if (\n formattedOrder.order_type === OrderType.SCALED &&\n !formattedOrder.distribution_type\n ) {\n setValue(\"distribution_type\", DistributionType.FLAT);\n }\n }, [formattedOrder.order_type, formattedOrder.distribution_type]);\n\n const currentLtv = useComputedLTV();\n const askAndBid = useAskAndBid();\n\n const fillMiddleValue = () => {\n if (bboStatus === BBOStatus.ON) {\n toggleBBO();\n }\n if (formattedOrder.order_type === OrderType.LIMIT) {\n const [bestAsk = 0, bestBid = 0] = askAndBid;\n const midPrice = new Decimal(safeNumber(bestAsk))\n .add(safeNumber(bestBid))\n .div(2)\n .toNumber();\n // 1. Since BBO will update the price when unselected, we should set order price in raf\n // 2. raf is mainly used to solve the timing problem caused by React state update, ensuring that the orderPrice is triggered after the state is fully updated to avoid accessing expired state values.\n requestAnimationFrame(() => {\n ee.emit(\"update:orderPrice\", midPrice);\n });\n }\n };\n\n const { priceInputContainerRef, priceInputContainerWidth } =\n usePriceInputContainer({\n order_type_ext: formattedOrder.order_type_ext,\n });\n\n return {\n ...state,\n side: formattedOrder.side as OrderSide,\n type: formattedOrder.order_type as OrderType,\n level: formattedOrder.level as OrderLevel,\n formattedOrder,\n setOrderValue,\n setOrderValues,\n currentLeverage,\n\n // cancelTP_SL,\n // enableTP_SL,\n tpslSwitch,\n setTpslSwitch: onTPSLSwitchChanged,\n symbolInfo,\n onFocus,\n onBlur,\n\n priceInputRef,\n priceInputContainerRef,\n priceInputContainerWidth,\n triggerPriceInputRef,\n activatedPriceInputRef,\n lastQuantityInputType,\n\n canTrade,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n currentLtv,\n fillMiddleValue,\n symbol,\n soundAlert,\n setSoundAlert,\n currentFocusInput,\n };\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useLocalStorage, useTrack } from \"@orderly.network/hooks\";\nimport {\n BBOOrderType,\n OrderlyOrder,\n OrderSide,\n OrderType,\n TrackerEventName,\n} from \"@orderly.network/types\";\nimport {\n BBOStatus,\n getOrderLevelByBBO,\n getOrderTypeByBBO,\n isBBOOrder,\n} from \"../utils\";\n\nexport function useBBOState({\n tpslSwitch,\n order_type,\n order_type_ext,\n side,\n setOrderValues,\n}: {\n tpslSwitch: boolean;\n order_type?: OrderType;\n order_type_ext?: OrderType;\n side?: OrderSide;\n setOrderValues: (values: Partial<OrderlyOrder>) => void;\n}) {\n const [localBBOType, setLocalBBOType] = useLocalStorage<\n BBOOrderType | undefined\n >(\"orderly_order_bbo_type\", undefined);\n\n const lastBBOType = useRef<BBOOrderType>(localBBOType);\n\n const { track } = useTrack();\n\n const bboStatus = useMemo(() => {\n if (\n tpslSwitch ||\n [OrderType.POST_ONLY, OrderType.IOC, OrderType.FOK].includes(\n order_type_ext!,\n )\n ) {\n return BBOStatus.DISABLED;\n }\n\n return localBBOType && order_type === OrderType.LIMIT\n ? BBOStatus.ON\n : BBOStatus.OFF;\n }, [tpslSwitch, order_type_ext, order_type, localBBOType]);\n\n const toggleBBO = () => {\n track(TrackerEventName.clickBBOButton);\n if (localBBOType) {\n // unselect bbo\n setLocalBBOType(undefined);\n // update formattedOrder values immediately instead of via useEffect\n setOrderValues({\n order_type_ext: undefined,\n level: undefined,\n });\n } else {\n setLocalBBOType(lastBBOType.current || BBOOrderType.COUNTERPARTY1);\n }\n };\n\n const onBBOChange = (value: BBOOrderType) => {\n setLocalBBOType(value);\n lastBBOType.current = value;\n };\n\n useEffect(() => {\n if (bboStatus === BBOStatus.DISABLED) {\n setOrderValues({\n // if order_type_ext is not bbo(ask, bid), keep previous value\n order_type_ext: isBBOOrder({ order_type_ext })\n ? undefined\n : order_type_ext,\n level: undefined,\n });\n }\n }, [bboStatus, order_type_ext]);\n\n useEffect(() => {\n if (bboStatus === BBOStatus.ON) {\n const orderType = getOrderTypeByBBO(localBBOType, side!);\n const orderLevel = getOrderLevelByBBO(localBBOType)!;\n setOrderValues({\n order_type_ext: orderType,\n level: orderLevel,\n });\n }\n }, [localBBOType, bboStatus, side]);\n\n return {\n bboStatus,\n bboType: localBBOType,\n setBBOType: setLocalBBOType,\n onBBOChange,\n toggleBBO,\n };\n}\n","import { useRef, FocusEvent } from \"react\";\nimport { OrderEntryReturn, useMemoizedFn, utils } from \"@orderly.network/hooks\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { InputType } from \"../types\";\n\ntype FocusAndBlurProps = {\n base_tick: number;\n order_type?: OrderType;\n order_quantity?: string;\n setValue: OrderEntryReturn[\"setValue\"];\n};\n\nexport function useFocusAndBlur(props: FocusAndBlurProps) {\n const { base_tick, order_type, order_quantity, setValue } = props;\n const currentFocusInput = useRef<InputType>(InputType.NONE);\n const lastScaledOrderPriceInput = useRef<InputType>(InputType.END_PRICE);\n const lastQuantityInputType = useRef<InputType>(InputType.NONE);\n\n const formatQty = () => {\n if (\n base_tick < 1 ||\n // scaled order should not format quantity, because it is total quantity\n order_type === OrderType.SCALED ||\n !order_quantity\n ) {\n return;\n }\n\n // TODO: use this to format quantity instead of utils.formatNumber, need time to test\n // const formatQty = new Decimal(formattedOrder.order_quantity)\n // .todp(0, Decimal.ROUND_DOWN)\n // .div(symbolInfo.base_tick)\n // .toString();\n\n const quantity = utils.formatNumber(\n order_quantity,\n new Decimal(base_tick || \"0\").toNumber(),\n );\n\n setValue(\"order_quantity\", quantity, {\n shouldUpdateLastChangedField: false,\n });\n };\n\n const onFocus = (type: InputType) => (_: FocusEvent) => {\n currentFocusInput.current = type;\n\n // set last scaled order price input\n if (\n [InputType.START_PRICE, InputType.END_PRICE].includes(\n currentFocusInput.current!,\n )\n ) {\n lastScaledOrderPriceInput.current = type;\n }\n\n if (\n [InputType.QUANTITY, InputType.TOTAL, InputType.MARGIN].includes(type)\n ) {\n lastQuantityInputType.current = type;\n }\n };\n\n const onBlur = (type: InputType) => (_: FocusEvent) => {\n setTimeout(() => {\n if (currentFocusInput.current !== type) {\n return;\n }\n currentFocusInput.current = InputType.NONE;\n }, 300);\n\n if (type === InputType.QUANTITY) {\n formatQty();\n }\n };\n\n return {\n currentFocusInput,\n lastScaledOrderPriceInput,\n lastQuantityInputType,\n onFocus: useMemoizedFn(onFocus),\n onBlur: useMemoizedFn(onBlur),\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { OrderType } from \"@orderly.network/types\";\n\nexport function usePriceInputContainer({\n order_type_ext,\n}: {\n order_type_ext?: OrderType;\n}) {\n const [priceInputContainerWidth, setPriceInputContainerWidth] = useState(0);\n const priceInputContainerRef = useRef<HTMLDivElement | null>(null);\n\n // useEffect(() => {\n // if (\n // priceInputContainerRef.current &&\n // // update BBO select width when is BBO order\n // isBBOOrder({ order_type_ext: formattedOrder.order_type_ext })\n // ) {\n // const width =\n // priceInputContainerRef.current.getBoundingClientRect()?.width;\n // if (width) {\n // setPriceInputContainerWidth(width);\n // }\n // }\n // }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n const element = priceInputContainerRef.current;\n\n if (!element) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n if (width) {\n // update BBO order select dropdown width when priceInputContainerRef width changed\n setPriceInputContainerWidth(width);\n }\n }\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.unobserve(element);\n };\n }, [priceInputContainerRef, order_type_ext]);\n\n return { priceInputContainerRef, priceInputContainerWidth };\n}\n","import React from \"react\";\nimport {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./orderEntry.script\";\nimport { OrderEntry } from \"./orderEntry.ui\";\n\nexport const OrderEntryWidget: React.FC<\n OrderEntryScriptInputs & {\n containerRef?: React.RefObject<HTMLDivElement>;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n }\n> = (props) => {\n const state = useOrderEntryScript(props);\n return (\n <OrderEntry\n {...state}\n containerRef={props.containerRef}\n disableFeatures={props.disableFeatures}\n />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/orderEntry.ui.tsx","../src/components/additional/additionalConfigButton.tsx","../src/components/additional/additionalInfo.tsx","../src/components/additional/pinButton.tsx","../src/components/advancedTPSLResult/index.tsx","../src/components/assetInfo/index.tsx","../src/components/fee/fees.widget.tsx","../src/components/fee/effectiveFee/effectiveFee.ui.tsx","../src/components/fee/effectiveFee/icons/effectiveFee.tsx","../src/components/fee/effectiveFee/effectiveFee.widget.tsx","../src/components/fee/regularFee/regularFees.ui.tsx","../src/components/fee/regularFee/regularFees.widget.tsx","../src/components/slippage/components/slippageCell.tsx","../src/components/slippage/components/slippageEditor.tsx","../src/components/slippage/slippage.ui.tsx","../src/components/available/index.tsx","../src/components/LTVRiskTooltip/LTVRiskTooltip.ui.tsx","../src/components/LTVRiskTooltip/LTVRiskTooltip.script.ts","../src/components/LTVRiskTooltip/LTVRiskTooltip.widget.tsx","../src/components/dialog/confirm.ui.tsx","../src/utils.ts","../src/components/dialog/maxQtyConfirm.tsx","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.ui.tsx","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.script.ts","../src/hooks/useAskAndBid.ts","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.widget.tsx","../src/components/header/index.tsx","../src/components/orderTypeSelect/index.tsx","../src/components/header/LeverageBadge.tsx","../src/components/orderEntryProvider.tsx","../src/components/orderEntryContext.tsx","../src/components/orderInput/index.tsx","../src/components/orderInput/limit/priceInput.tsx","../src/components/customInput/index.tsx","../src/components/orderInput/limit/bboOrderTypeSelect.tsx","../src/components/orderInput/limit/limitPriceSuffix.tsx","../src/components/orderInput/qtyAndTotal/qtyAndTotalInput.tsx","../src/components/orderInput/qtyAndTotal/quantityInput.tsx","../src/components/orderInput/qtyAndTotal/totalInput.tsx","../src/components/orderInput/qtyAndTotal/totalTypeSelect.tsx","../src/components/orderInput/scaledOrder/index.tsx","../src/components/orderInput/scaledOrder/quantityDistributionInput.tsx","../src/components/orderInput/scaledOrder/scaledPriceInput.tsx","../src/components/orderInput/scaledOrder/scaledQuantityInput.tsx","../src/components/orderInput/scaledOrder/scaledQuantityUnit.tsx","../src/components/orderInput/scaledOrder/skewInput.tsx","../src/components/orderInput/scaledOrder/totalOrdersInput.tsx","../src/components/orderInput/stop/triggerPriceInput.tsx","../src/components/orderInput/trailingStop/activePriceInput.tsx","../src/components/orderInput/trailingStop/trailingCallbackInput.tsx","../src/components/orderInput/trailingStop/callbackRatePercentages.tsx","../src/components/orderInput/trailingStop/trailingCallbackSelect.tsx","../src/components/orderInput/trailingStop/index.tsx","../src/components/quantitySlider/index.tsx","../src/components/reduceOnlySwitch/index.tsx","../src/components/tpsl.tsx","../src/components/pnlInput/pnlInput.ui.tsx","../src/components/pnlInput/useBuilder.script.ts","../src/components/pnlInput/pnlInputContext.tsx","../src/components/pnlInput/pnlInput.widget.tsx","../src/components/pnlInput/pnlInputProvider.tsx","../src/orderEntry.script.ts","../src/hooks/useBBOState.ts","../src/hooks/useFocusAndBlur.ts","../src/hooks/usePriceInputContainer.ts","../src/orderEntry.widget.tsx"],"names":["useCallback","useEffect","useId","useMemo","useState","useLocalStorage","useMemoizedFn","useOrderlyContext","useTranslation","useOrderEntryFormErrorMsg","OrderSide","OrderType","PositionType","Box","cn","Divider","Flex","modal","SimpleSheet","Switch","ThrottledButton","toast","useScreen","TPSLAdvancedWidget","Decimal","PopoverContent","PopoverRoot","PopoverTrigger","Checkbox","Fragment","jsx","jsxs","AdditionalInfo","props","pinned","orderTypeExtra","t","onTypeToggle","type","checked","AdditionalConfigButton","open","setOpen","defaultPath","PinButton","path","setPath","Text","AdvancedTPSLResult","formattedOrder","symbolInfo","onEdit","onDelete","errors","getErrorMsg","renderTp","error","renderSl","DeleteIcon","EditIcon","useFeeState","useRwaSymbolsInfoStore","Tooltip","useModal","AuthGuard","useScaffoldContext","React","EffectiveFee","ref","linearId","EffectiveFeeBody","routerAdapter","onClose","e","EffectiveFeeMobileContent","hide","EffectiveFeeSection","isMobile","EffectiveFeeUI","taker","maker","EffectiveFeesWidget","RegularFeesUI","RegularFeesWidget","isEffective","val","FeesWidget","symbol","refereeRebate","others","isRwa","useRef","useBoolean","SimpleDialog","forwardRef","useImperativeHandle","ExclamationFillIcon","Input","inputFormatter","TooltipTrigger","options","SlippageEditor","value","setValue","customValue","setCustomValue","setError","onClick","onValueChange","d","toolTipButton","item","SlippageItem","isActive","SlippageCell","setClose","toggle","slippageRef","onConfirm","SlippageUI","AssetInfo","canTrade","disableFeatures","orderType","InfoCircleIcon","Button","removeTrailingZeros","calculateLTVColor","LTVRiskTooltipUI","ltv_threshold","negative_usdc_threshold","isThresholdLoading","holdingData","currentLtv","onConvert","asset","index","useComputedLTV","useHoldingStream","useIndexPricesStream","useQuery","useTokensInfo","account","zero","useConvertThreshold","data","isLoading","useLTVTooltipScript","holdingList","isHoldingLoading","tokensInfo","getIndexPrice","tokenInfo","token","indexPrice","collateralRatio","collateralContribution","LTVRiskTooltipWidget","state","Available","quote","freeCollateral","showLTV","usePositionStream","i18n","BBOOrderType","Badge","Grid","registerSimpleDialog","textVariants","getBBOType","OrderLevel","isBBOOrder","order_type","order_type_ext","isBBO","getOrderTypeByBBO","size","getOrderLevelByBBO","getScaledPlaceOrderMessage","result","rows","totalCount","successCount","row","safeNumber","OrderConfirmDialog","order","onCancel","quote_dp","base_dp","side","level","positions","positionQty","_","setNeedConfirm","renderPositionType","renderPrice","bboType","label","renderTPSLPrice","price","isOrderPrice","isEnable","colorType","renderTPSLQty","qty","renderPriceAndTotal","activated_price","callback_value","callback_rate","callbackView","OrderItem","header","OrderTypeTag","quantityItem","triggerPriceItem","tpslTriggerPrice","orderConfirmCheckbox","buttons","title","unit","dp","typeStr","Dialog","close","resolve","reject","rest","orderConfirmDialogId","memo","MaxQtyConfirm","DataTable","TokenIcon","ScaledOrderConfirm","dataSource","national","askAndBid","totalQuantity","base","columns","record","showWarning","TooltipIcon","useDebouncedCallback","useEventEmitter","useAskAndBid","ee","setAskAndBid","onOrderBookUpdate","ask0","bid0","useScaledOrderConfirmScript","orders","acc","ScaledOrderConfirmWidget","scaledOrderConfirmDialogId","Select","OrderTypeSelect","displayLabelMap","option","o","useSymbolLeverage","SymbolLeverageDialogId","SymbolLeverageSheetId","LeverageBadge","symbolLeverage","maxLeverage","curLeverage","showModal","modalId","OrderEntryHeader","setOrderValue","createContext","useContext","OrderEntryContext","useOrderEntryContext","OrderEntryProvider","errorMsgVisible","onFocus","onBlur","setOrderValues","currentFocusInput","priceInputRef","priceInputContainerRef","triggerPriceInputRef","activatedPriceInputRef","lastQuantityInputType","leverage","memoizedValue","EMPTY_LIST","CustomInput","placeholder","InputLabel","event","BBOOrderTypeSelect","LimitPriceSuffix","bbo","fillMiddleValue","PriceInput","readOnly","suffix","QuantityInput","TotalTypeSelect","TotalInput","total","margin","setMargin","totalType","setTotalType","onMarginChange","prefix","QtyAndTotalInput","DistributionType","QuantityDistributionInput","showHint","QuantityDistributionHint","QuantityDistribution","setType","content","FlatQuantity","AscendingQuantity","DescendingQuantity","currentContent","PriceChart","onChange","distributionTypeMap","ScaledPriceInput","valueRenderer","ScaledQuantityUnit","ScaledQuantityInput","quantityUnit","setQuantityUnit","isBase","SkewInput","TotalOrdersInput","ScaledOrderInput","values","showSkewInput","TriggerPriceInput","ActivePriceInput","TrailingCallbackType","percentages","CallbackRatePercentages","TrailingCallbackSelect","TrailingCallbackInput","lastCallbackValueRef","lastCallbackRateRef","callbackType","setCallbackType","onCallbackTypeChange","TrailingStopInput","OrderInput","showTriggerPrice","showPrice","triggerPriceInput","priceInput","utils","Slider","SLIDER_MIN","SLIDER_MAX","QuantitySlider","order_quantity","maxQty","sliderValue","setSliderValue","base_tick","color","maxLabel","onSliderValueChange","sliderToQuantity","newQty","onMax","quantityToSlider","ReduceOnlySwitch","onCheckedChange","className","testId","SettingFillIcon","TPSLPositionTypeWidget","CaretDownIcon","SimpleDropdownMenu","todpIfNeed","PnlInputContext","usePnlInputContext","usePNLInputBuilder","focus","setFocus","mode","setMode","tipsEle","tipVisible","setTipVisible","isFocused","setIsFocused","key","innerValue","setInnerValue","modes","modeLabelMap","percentageSuffix","endStr","PNLInput","onModeChange","tips","setPrefix","setPlaceholder","id","PNLMenus","PnlInputWidget","testIds","PnlInputProvider","children","OrderTPSL","tpslFormRef","TPSLAdvancedButton","TPSLInputForm","TPSLInputRow","TPSLTriggerPriceInput","triggerPriceToolTipEle","getPrefixLabel","trigger_price","_prefix","OrderEntry","helper","submit","metaState","bboStatus","onBBOChange","toggleBBO","soundAlert","setSoundAlert","maxQtyConfirmOpen","setMaxQtyConfirmOpen","hasAdvancedTPSLResult","setHasAdvancedTPSLResult","validated","setErrorMsgVisible","needConfirm","setPinned","showTPSLAdvanced","setShowTPSLAdvanced","hidden","setHidden","slippage","setSlippage","notification","soundAlertId","buttonLabel","clickHandler","visible","onSubmit","isScaledOrder","message","formattedMaxQty","onMaxQtyConfirm","validateSubmit","onShowTPSLAdvanced","tpslKey","onSubmitAdvancedTPSL","onDeleteAdvancedTPSL","showSoundSection","additionalInfoProps","extraButton","useMarginRatio","useOrderEntry","useCanTrade","useTrack","TrackerEventName","useBBOState","tpslSwitch","localBBOType","setLocalBBOType","lastBBOType","track","orderLevel","useFocusAndBlur","lastScaledOrderPriceInput","formatQty","quantity","usePriceInputContainer","priceInputContainerWidth","setPriceInputContainerWidth","element","resizeObserver","entries","entry","width","ORDERLY_ORDER_SOUND_ALERT_KEY","useOrderEntryScript","inputs","localOrderType","setLocalOrderType","localOrderSide","setLocalOrderSide","setTpslSwitch","currentLeverage","setBBOType","cancelTP_SL","enableTP_SL","onTPSLSwitchChanged","updateOrderPrice","focusInputElement","target","orderBookItemClickHandler","field","bestAsk","bestBid","midPrice","OrderEntryWidget"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useId, useMemo, useState } from \"react\";\nimport {\n OrderValidationResult,\n useLocalStorage,\n useMemoizedFn,\n useOrderlyContext,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport {\n OrderlyOrder,\n OrderSide,\n OrderType,\n PositionType,\n} from \"@orderly.network/types\";\nimport {\n Box,\n cn,\n Divider,\n Flex,\n modal,\n SimpleSheet,\n Switch,\n ThrottledButton,\n toast,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { TPSLAdvancedWidget } from \"@orderly.network/ui-tpsl\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { AdditionalConfigButton } from \"./components/additional/additionalConfigButton\";\nimport {\n AdditionalInfo,\n AdditionalInfoProps,\n} from \"./components/additional/additionalInfo\";\nimport { PinButton } from \"./components/additional/pinButton\";\nimport { AdvancedTPSLResult } from \"./components/advancedTPSLResult\";\nimport { AssetInfo } from \"./components/assetInfo\";\nimport { Available } from \"./components/available\";\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport { MaxQtyConfirm } from \"./components/dialog/maxQtyConfirm\";\nimport { scaledOrderConfirmDialogId } from \"./components/dialog/scaledOrderConfirm\";\nimport { OrderEntryHeader } from \"./components/header\";\nimport { OrderEntryProvider } from \"./components/orderEntryProvider\";\nimport { OrderInput } from \"./components/orderInput\";\nimport { QuantitySlider } from \"./components/quantitySlider\";\nimport { ReduceOnlySwitch } from \"./components/reduceOnlySwitch\";\nimport { OrderTPSL } from \"./components/tpsl\";\nimport { type OrderEntryScriptReturn } from \"./orderEntry.script\";\nimport { getScaledPlaceOrderMessage } from \"./utils\";\n\ntype OrderEntryProps = OrderEntryScriptReturn & {\n containerRef?: React.RefObject<HTMLDivElement>;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n};\n\nexport const OrderEntry: React.FC<OrderEntryProps> = (props) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n setOrderValues,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n disableFeatures,\n currentLtv,\n fillMiddleValue,\n soundAlert,\n setSoundAlert,\n currentFocusInput,\n } = props;\n const [maxQtyConfirmOpen, setMaxQtyConfirmOpen] = useState(false);\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n const [hasAdvancedTPSLResult, setHasAdvancedTPSLResult] =\n useState<boolean>(false);\n\n const { errors, validated } = metaState;\n\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\n\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true,\n );\n const [pinned, setPinned] = useLocalStorage(\n \"orderly-order-additional-pinned\",\n true,\n );\n const [showTPSLAdvanced, setShowTPSLAdvanced] = useState(false);\n const [hidden, setHidden] = useLocalStorage(\"orderly-order-hidden\", false);\n\n const [slippage, setSlippage] = useLocalStorage(\"orderly-slippage\", \"1\", {\n parseJSON: ((value: string | null) => {\n return !value || value === '\"\"' ? \"1\" : JSON.parse(value);\n }) as any,\n });\n\n const { notification } = useOrderlyContext();\n\n const soundAlertId = useId();\n\n const { getErrorMsg } = useOrderEntryFormErrorMsg(validated ? errors : null);\n\n const buttonLabel = useMemo(() => {\n return side === OrderSide.BUY\n ? t(\"orderEntry.buyLong\")\n : t(\"orderEntry.sellShort\");\n }, [side, t]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\n\n // set slippage\n useEffect(() => {\n if (disableFeatures?.includes(\"slippageSetting\")) {\n return;\n }\n if (slippage) {\n setOrderValue(\"slippage\", Number(slippage));\n } else {\n setOrderValue(\"slippage\", undefined);\n }\n }, [slippage, disableFeatures]);\n\n useEffect(() => {\n const clickHandler = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\"#order-entry-submit-button\")\n // || target.closest(\".orderly-order-entry\")\n ) {\n return;\n }\n setErrorMsgVisible((visible) => {\n if (visible) {\n return false;\n }\n return visible;\n });\n };\n\n if (errorMsgVisible) {\n document.addEventListener(\"click\", clickHandler);\n } else {\n document.removeEventListener(\"click\", clickHandler);\n }\n\n return () => {\n document.removeEventListener(\"click\", clickHandler);\n };\n }, [errorMsgVisible]);\n\n const onSubmit = useMemoizedFn(async () => {\n const isScaledOrder = formattedOrder.order_type === OrderType.SCALED;\n\n helper\n .validate()\n .then(\n // validate success, it return the order\n // TODO: get order from other function\n (order: any) => {\n // scaled order is always need confirm\n if (isScaledOrder) {\n return modal.show(scaledOrderConfirmDialogId, {\n order,\n symbolInfo,\n size: isMobile ? \"sm\" : \"md\",\n });\n }\n\n if (needConfirm) {\n return modal.show(orderConfirmDialogId, {\n order: formattedOrder,\n symbolInfo,\n });\n }\n\n return true;\n },\n // should catch validate error first, then submit\n (errors: OrderValidationResult) => {\n // slippage error message is not show input tooltip, so we need to manually show it by toast\n if (errors.slippage) {\n toast.error(t(\"orderEntry.slippage.error.max\"));\n }\n\n // when switch order type, validated not changed, so we need to set it to true\n setErrorMsgVisible(true);\n\n return Promise.reject();\n },\n )\n .then(() => {\n // validate success, submit order\n return submit({ resetOnSuccess: false }).then((result: any) => {\n if (!result.success && result.message) {\n toast.error(result.message);\n } else if (result.success && isScaledOrder) {\n const message = getScaledPlaceOrderMessage(result);\n if (message) {\n toast.success(message);\n }\n }\n });\n })\n .catch((error) => {\n // submit order error\n if (error?.message) {\n toast.error(error.message);\n // toast.error(`Error:${error.message}`);\n\n // if (error instanceof ApiError) {\n // toast.error(error.message);\n }\n });\n });\n\n const formattedMaxQty = useMemo(() => {\n return new Decimal(maxQty)\n .todp(symbolInfo.base_dp, Decimal.ROUND_DOWN)\n .toString();\n }, [maxQty, symbolInfo.base_dp]);\n\n const onMaxQtyConfirm = useCallback(() => {\n setOrderValue(\"order_quantity\", formattedMaxQty);\n // submit order when order_quantity updated\n requestAnimationFrame(() => {\n onSubmit();\n });\n setMaxQtyConfirmOpen(false);\n }, [setOrderValue, formattedMaxQty]);\n\n const validateSubmit = async () => {\n // show a prompt reminding the user. If the user confirms, automatically disable Reduce Only and proceed with the action.\n if (formattedOrder.reduce_only && maxQty === 0) {\n return modal.confirm({\n title: t(\"orderEntry.reduceOnly.reminder\"),\n content: t(\"orderEntry.reduceOnly.reminder.content\"),\n okLabel: t(\"orderEntry.placeOrderNow\"),\n onOk: async () => {\n setOrderValue(\"reduce_only\", false);\n // submit order when reduce only updated\n requestAnimationFrame(() => {\n props.resetMetaState();\n onSubmit();\n });\n return Promise.resolve(true);\n },\n onCancel: async () => {\n return Promise.resolve(false);\n },\n });\n } else if (maxQty > 0 && Number(formattedOrder.order_quantity) > maxQty) {\n setMaxQtyConfirmOpen(true);\n } else {\n onSubmit();\n }\n };\n\n const onShowTPSLAdvanced = () => {\n helper.validate().then(\n () => {\n setShowTPSLAdvanced(true);\n },\n (errors) => {\n const tpslKey = new Set([\"tp_trigger_price\", \"sl_trigger_price\"]);\n if (Object.keys(errors).every((key: string) => tpslKey.has(key))) {\n setShowTPSLAdvanced(true);\n }\n },\n );\n // modal.show(TPSLAdvancedDialogId, {\n // order: formattedOrder,\n // setOrderValue: setOrderValue,\n // });\n // setShowTPSLAdvanced(true);\n };\n\n const onSubmitAdvancedTPSL = (order: OrderlyOrder) => {\n if (order.side !== formattedOrder.side) {\n setOrderValue(\"side\", order.side);\n }\n setOrderValues({\n position_type: order.position_type,\n tp_order_type: order.tp_order_type,\n tp_pnl: order.tp_pnl,\n tp_offset: order.tp_offset,\n tp_offset_percentage: order.tp_offset_percentage,\n tp_ROI: order.tp_ROI,\n tp_trigger_price: order.tp_trigger_price,\n tp_order_price: order.tp_order_price,\n sl_order_type: order.sl_order_type,\n sl_trigger_price: order.sl_trigger_price,\n sl_order_price: order.sl_order_price,\n sl_pnl: order.sl_pnl,\n sl_offset: order.sl_offset,\n sl_offset_percentage: order.sl_offset_percentage,\n sl_ROI: order.sl_ROI,\n });\n setShowTPSLAdvanced(false);\n setHasAdvancedTPSLResult(true);\n };\n\n const onDeleteAdvancedTPSL = () => {\n setHasAdvancedTPSLResult(false);\n setOrderValues({\n tp_trigger_price: undefined,\n tp_order_price: undefined,\n tp_order_type: OrderType.MARKET,\n sl_trigger_price: undefined,\n sl_order_price: undefined,\n sl_order_type: OrderType.MARKET,\n tp_pnl: undefined,\n sl_pnl: undefined,\n position_type: PositionType.FULL,\n });\n };\n\n useEffect(() => {\n setHasAdvancedTPSLResult(false);\n }, [props.symbol]);\n\n const showSoundSection =\n Boolean(notification?.orderFilled?.media) &&\n (notification?.orderFilled?.displayInOrderEntry ?? true);\n\n const additionalInfoProps: AdditionalInfoProps = {\n pinned,\n setPinned,\n needConfirm,\n setNeedConfirm,\n hidden,\n setHidden,\n onValueChange: setOrderValue,\n orderTypeExtra: formattedOrder[\"order_type_ext\"],\n showExtra:\n formattedOrder[\"order_type\"] === OrderType.LIMIT && !props.tpslSwitch,\n };\n // Additional info (fok,ioc、post only, order confirm hidden)\n const extraButton = !pinned && (\n <AdditionalConfigButton {...additionalInfoProps} />\n );\n\n return (\n <OrderEntryProvider\n errors={errors}\n errorMsgVisible={errorMsgVisible}\n symbolInfo={symbolInfo}\n onFocus={props.onFocus}\n onBlur={props.onBlur}\n getErrorMsg={getErrorMsg}\n setOrderValue={setOrderValue}\n setOrderValues={setOrderValues}\n currentFocusInput={currentFocusInput.current}\n priceInputRef={props.priceInputRef}\n priceInputContainerRef={props.priceInputContainerRef}\n triggerPriceInputRef={props.triggerPriceInputRef}\n activatedPriceInputRef={props.activatedPriceInputRef}\n lastQuantityInputType={props.lastQuantityInputType}\n leverage={props.symbolLeverage}\n >\n <MaxQtyConfirm\n open={maxQtyConfirmOpen}\n onOpenChange={setMaxQtyConfirmOpen}\n maxQty={formattedMaxQty}\n onConfirm={onMaxQtyConfirm}\n base={symbolInfo.base}\n />\n <div\n className={\"oui-space-y-2 oui-text-base-contrast-54 xl:oui-space-y-3\"}\n ref={props.containerRef}\n >\n <OrderEntryHeader\n symbol={props.symbol}\n canTrade={props.canTrade}\n side={side}\n order_type={formattedOrder.order_type!}\n setOrderValue={setOrderValue}\n symbolLeverage={props.symbolLeverage}\n />\n\n <Available\n currentLtv={currentLtv}\n canTrade={props.canTrade}\n quote={symbolInfo?.quote}\n freeCollateral={freeCollateral}\n />\n\n <OrderInput\n values={formattedOrder}\n priceInputContainerWidth={props.priceInputContainerWidth}\n fillMiddleValue={fillMiddleValue}\n bbo={{\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n }}\n />\n\n <QuantitySlider\n canTrade={props.canTrade}\n side={props.side}\n order_quantity={formattedOrder.order_quantity}\n maxQty={maxQty}\n />\n\n {/* Submit button */}\n <ThrottledButton\n fullWidth\n id={\"order-entry-submit-button\"}\n // color={side === OrderSide.BUY ? \"buy\" : \"sell\"}\n data-type={OrderSide.BUY}\n className={cn(\n side === OrderSide.BUY\n ? \"orderly-order-entry-submit-button-buy oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"orderly-order-entry-submit-button-sell oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\",\n )}\n onClick={validateSubmit}\n loading={props.isMutating}\n disabled={!props.canTrade}\n >\n {buttonLabel}\n </ThrottledButton>\n\n {/* Asset info */}\n <AssetInfo\n canTrade={props.canTrade}\n quote={symbolInfo.quote}\n estLiqPrice={props.estLiqPrice}\n estLeverage={props.estLeverage}\n currentLeverage={props.currentLeverage}\n slippage={slippage}\n dp={symbolInfo.quote_dp}\n setSlippage={setSlippage}\n estSlippage={props.estSlippage}\n orderType={formattedOrder.order_type!}\n disableFeatures={disableFeatures}\n symbol={props.symbol}\n />\n\n <Divider className=\"oui-w-full\" />\n\n {/* TP SL switch and content */}\n {hasAdvancedTPSLResult ? (\n <AdvancedTPSLResult\n order={formattedOrder}\n symbolInfo={props.symbolInfo}\n errors={validated ? errors : null}\n onEdit={() => {\n setShowTPSLAdvanced(true);\n }}\n onDelete={() => {\n onDeleteAdvancedTPSL();\n }}\n />\n ) : (\n <OrderTPSL\n // onCancelTPSL={props.cancelTP_SL}\n // onEnableTP_SL={props.enableTP_SL}\n quote_dp={props.symbolInfo.quote_dp}\n switchState={props.tpslSwitch}\n onSwitchChanged={props.setTpslSwitch}\n orderType={formattedOrder.order_type!}\n errors={validated ? errors : null}\n isReduceOnly={formattedOrder.reduce_only}\n setOrderValue={setOrderValue}\n reduceOnlyChecked={formattedOrder.reduce_only ?? false}\n onReduceOnlyChange={(checked) => {\n setOrderValue(\"reduce_only\", checked);\n }}\n values={{\n position_type:\n formattedOrder.position_type ?? PositionType.PARTIAL,\n tp: {\n trigger_price: formattedOrder.tp_trigger_price ?? \"\",\n PnL: formattedOrder.tp_pnl ?? \"\",\n Offset: formattedOrder.tp_offset ?? \"\",\n \"Offset%\": formattedOrder.tp_offset_percentage ?? \"\",\n ROI: formattedOrder.tp_ROI ?? \"\",\n },\n sl: {\n trigger_price: formattedOrder.sl_trigger_price ?? \"\",\n PnL: formattedOrder.sl_pnl ?? \"\",\n Offset: formattedOrder.sl_offset ?? \"\",\n \"Offset%\": formattedOrder.sl_offset_percentage ?? \"\",\n ROI: formattedOrder.sl_ROI ?? \"\",\n },\n }}\n showTPSLAdvanced={onShowTPSLAdvanced}\n onChange={(key, value) => {\n setOrderValue(key, value);\n }}\n />\n )}\n\n {((isMobile &&\n ((formattedOrder.order_type !== OrderType.LIMIT &&\n formattedOrder.order_type !== OrderType.MARKET) ||\n formattedOrder.reduce_only)) ||\n !isMobile) && (\n <Flex justify={\"between\"} itemAlign={\"center\"} className=\"oui-mt-2\">\n <ReduceOnlySwitch\n checked={formattedOrder.reduce_only ?? false}\n onCheckedChange={(checked) => {\n setOrderValue(\"reduce_only\", checked);\n }}\n />\n {!showSoundSection && extraButton}\n </Flex>\n )}\n {showSoundSection && (\n <Flex justify={\"between\"} itemAlign={\"center\"}>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n className=\"oui-h-[14px]\"\n id={soundAlertId}\n checked={soundAlert}\n onCheckedChange={(checked) => setSoundAlert(checked)}\n />\n <label htmlFor={soundAlertId} className={\"oui-text-xs\"}>\n {t(\"portfolio.setting.soundAlerts\")}\n </label>\n </Flex>\n {extraButton}\n </Flex>\n )}\n {!showSoundSection &&\n isMobile &&\n (formattedOrder.order_type == OrderType.LIMIT ||\n formattedOrder.order_type == OrderType.MARKET) &&\n !formattedOrder.reduce_only &&\n !pinned && (\n <Flex className=\"oui-w-full\" justify={\"end\"}>\n {extraButton}\n </Flex>\n )}\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {pinned && (\n <Box p={2} r={\"md\"} intensity={700} position={\"relative\"}>\n <AdditionalInfo {...additionalInfoProps} />\n <PinButton\n onClick={() => {\n setPinned(false);\n }}\n className={\"oui-group oui-absolute oui-right-2 oui-top-2\"}\n data-testid=\"oui-testid-orderEntry-pinned-button\"\n />\n </Box>\n )}\n </div>\n\n <SimpleSheet\n open={showTPSLAdvanced}\n onOpenChange={setShowTPSLAdvanced}\n classNames={{\n body: \"oui-h-full oui-pb-0 oui-border-none\",\n overlay: \"!oui-bg-base-10/60\",\n content: cn(\n \"oui-rounded-[16px] oui-border-none !oui-p-0\",\n isMobile\n ? \"oui-inset-y-0 oui-right-0 oui-w-[280px]\"\n : \"!oui-bottom-[40px] oui-right-3 oui-top-[44px] !oui-h-auto oui-w-[360px]\",\n ),\n }}\n contentProps={{ side: \"right\", closeable: false }}\n >\n <TPSLAdvancedWidget\n setOrderValue={setOrderValue}\n order={formattedOrder as OrderlyOrder}\n onSubmit={onSubmitAdvancedTPSL}\n onClose={() => {\n setShowTPSLAdvanced(false);\n }}\n symbolLeverage={props.symbolLeverage}\n />\n </SimpleSheet>\n </OrderEntryProvider>\n );\n};\n","import { useState } from \"react\";\nimport {\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n} from \"@orderly.network/ui\";\nimport { AdditionalInfo, AdditionalInfoProps } from \"./additionalInfo\";\n\nexport function AdditionalConfigButton(props: AdditionalInfoProps) {\n const [open, setOpen] = useState(false);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n data-testid=\"oui-testid-orderEntry-additional-button\"\n onClick={() => {\n setOpen(true);\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"oui-fill-white/[.36] hover:oui-fill-white/80\"\n >\n <path\n d=\"M3.332 2.665a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667z\"\n // fill=\"#fff\"\n // fillOpacity={open ? 0.8 : 0.36}\n />\n </svg>\n </button>\n </PopoverTrigger>\n <PopoverContent side={\"top\"} align={\"end\"} className={\"oui-w-[230px]\"}>\n <AdditionalInfo {...props} />\n </PopoverContent>\n </PopoverRoot>\n );\n}\n","import { FC, useEffect } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { Checkbox, cn, Divider, Flex, Switch } from \"@orderly.network/ui\";\n\nexport type AdditionalInfoProps = {\n pinned: boolean;\n setPinned: (value: boolean) => void;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n hidden: boolean;\n setHidden: (value: boolean) => void;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n orderTypeExtra?: OrderType;\n showExtra?: boolean;\n};\n\nexport const AdditionalInfo: FC<AdditionalInfoProps> = (props) => {\n const { pinned, orderTypeExtra } = props;\n const { t } = useTranslation();\n\n const onTypeToggle = (type: OrderType) => (checked: boolean) => {\n if (props.onValueChange) {\n props.onValueChange(\n \"order_type_ext\" as keyof OrderlyOrder,\n checked ? type : \"\",\n // orderTypeExtra === type ? \"\" : type\n );\n }\n };\n\n useEffect(() => {\n props.onValueChange?.(\"visible_quantity\", props.hidden ? 0 : 1);\n }, [props.hidden]);\n\n return (\n <div className={\"oui-text-base-contrast-54\"}>\n <Flex\n justify={pinned ? \"start\" : \"between\"}\n mb={3}\n width={pinned ? \"unset\" : \"100%\"}\n className=\"oui-gap-x-2 md:oui-gap-x-3\"\n wrap=\"wrap\"\n gapY={1}\n >\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-postOnly-checkBox\"\n id={\"toggle_order_post_only\"}\n className=\"oui-peer\"\n color={\"white\"}\n variant={\"radio\"}\n disabled={!props.showExtra}\n checked={orderTypeExtra === OrderType.POST_ONLY}\n onCheckedChange={onTypeToggle(OrderType.POST_ONLY)}\n />\n <label\n htmlFor={\"toggle_order_post_only\"}\n className={cn(\n \"oui-ml-1 oui-text-2xs peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {t(\"orderEntry.orderType.postOnly\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-ioc-checkBox\"\n id={\"toggle_order_iov\"}\n color={\"white\"}\n className=\"oui-peer\"\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.IOC}\n onCheckedChange={onTypeToggle(OrderType.IOC)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_iov\"}\n className={cn(\n \"oui-ml-1 oui-text-2xs peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {t(\"orderEntry.orderType.ioc\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-fox-checkBox\"\n id={\"toggle_order_fok\"}\n color={\"white\"}\n variant={\"radio\"}\n className=\"oui-peer\"\n checked={orderTypeExtra === OrderType.FOK}\n onCheckedChange={onTypeToggle(OrderType.FOK)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_fok\"}\n className={cn(\n \"oui-ml-1 oui-text-2xs peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {t(\"orderEntry.orderType.fok\")}\n </label>\n </Flex>\n </Flex>\n\n <Flex gapX={6}>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-orderConfirm-checkBox\"\n id={\"toggle_order_confirm\"}\n color={\"white\"}\n checked={props.needConfirm}\n onCheckedChange={(checked) => {\n props.setNeedConfirm(!!checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_confirm\"}\n className={\"oui-ml-1 oui-text-2xs\"}\n >\n {t(\"orderEntry.orderConfirm\")}\n </label>\n </Flex>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-hidden-checkBox\"\n id={\"toggle_order_hidden\"}\n color={\"white\"}\n checked={props.hidden}\n onCheckedChange={(checked: boolean) => {\n props.setHidden(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_hidden\"}\n className={\"oui-ml-1 oui-text-2xs\"}\n >\n {t(\"orderEntry.hidden\")}\n </label>\n </Flex>\n </Flex>\n {!pinned && (\n <>\n <Divider className={\"oui-my-3\"} />\n <Flex>\n <Switch\n data-testid=\"oui-testid-orderEntry-additional-keepVisible-switch\"\n id={\"toggle_order_keep_visible\"}\n onCheckedChange={(checked) => {\n props.setPinned(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_keep_visible\"}\n className={\"oui-ml-1 oui-text-2xs\"}\n >\n {t(\"orderEntry.keepVisible\")}\n </label>\n </Flex>\n </>\n )}\n </div>\n );\n};\n","import { HTMLAttributes, useState } from \"react\";\n\nconst defaultPath =\n \"M10.007 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.852-2.523 1.233.361 1.95.015 2.961-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103 5.35 5.35 0 0 0-2.104-1.312c-.448-.15-.808-.208-1.042-.208\";\n\nexport const PinButton = (props: HTMLAttributes<HTMLButtonElement>) => {\n const [path, setPath] = useState(defaultPath);\n return (\n <button {...props}>\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n focusable={false}\n onMouseEnter={() => {\n setPath(\n 'M10.008 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.853-2.523 1.232.361 1.95.015 2.96-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103A5.35 5.35 0 0 0 11.05 1.51c-.448-.15-.808-.208-1.042-.208m.258 1.37c.708.131 1.421.6 1.93 1.107.507.508.94 1.13 1.119 1.945-.636.61-1.026.658-1.662.323a.67.67 0 0 0-.779.117c-1.214 1.213-1.533 2.314-1.533 3.8 0 1.292-.076 1.773-.48 2.206-.113.123-.27.104-.374 0L3.799 7.486a.24.24 0 0 1-.017-.34c.239-.29.769-.515 2.226-.514 1.742.001 2.668-.448 3.812-1.52a.67.67 0 0 0 .125-.77c-.343-.686-.29-1.047.321-1.67\"',\n );\n }}\n onMouseLeave={() => {\n setPath(defaultPath);\n }}\n className=\"oui-text-primary-darken\"\n >\n <path d={path} />\n </svg>\n </button>\n );\n};\n","import { SVGProps } from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport {\n API,\n OrderlyOrder,\n OrderType,\n PositionType,\n} from \"@orderly.network/types\";\nimport { Divider, Flex, Text } from \"@orderly.network/ui\";\n\nexport function AdvancedTPSLResult(props: {\n order: Partial<OrderlyOrder>;\n symbolInfo: API.SymbolExt;\n errors: OrderValidationResult | null;\n onEdit: () => void;\n onDelete: () => void;\n}) {\n const { order: formattedOrder, symbolInfo, onEdit, onDelete, errors } = props;\n\n const { getErrorMsg } = useOrderEntryFormErrorMsg(errors);\n const { t } = useTranslation();\n\n const renderTp = () => {\n const error = getErrorMsg(\"tp_trigger_price\");\n if (formattedOrder.tp_trigger_price || formattedOrder.tp_order_price) {\n return (\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-w-full\"\n gap={4}\n >\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n justify={\"between\"}\n gapY={1}\n className=\"oui-w-full\"\n >\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.tpTriggerPrice\")}</Text>\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n className=\"oui-text-base-contrast\"\n dp={symbolInfo.quote_dp}\n >\n {formattedOrder.tp_trigger_price ?? \"\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.tpOrderPrice\")}</Text>\n {formattedOrder.tp_order_type === OrderType.LIMIT ? (\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n className=\"oui-text-base-contrast\"\n dp={symbolInfo.quote_dp}\n >\n {formattedOrder.tp_order_price ?? \"\"}\n </Text.numeral>\n ) : (\n <Text className=\"oui-text-base-contrast\">Market</Text>\n )}\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.totalEstTpPnl\")}</Text>\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n coloring\n dp={2}\n >\n {Number(formattedOrder.tp_pnl)}\n </Text.numeral>\n </Flex>\n </Flex>\n {error && (\n <Flex\n justify={\"start\"}\n itemAlign={\"start\"}\n gap={2}\n className=\"oui-w-full\"\n >\n <div className=\"oui-relative oui-top-[7px] oui-size-1 oui-rounded-full oui-bg-danger\" />\n <Text className=\"oui-text-danger\">{error}</Text>\n </Flex>\n )}\n </Flex>\n );\n }\n return null;\n };\n\n const renderSl = () => {\n if (formattedOrder.sl_trigger_price || formattedOrder.sl_order_price) {\n const error = getErrorMsg(\"sl_trigger_price\");\n return (\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-w-full\"\n gap={4}\n >\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n justify={\"between\"}\n gapY={1}\n className=\"oui-w-full\"\n >\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.slTriggerPrice\")}</Text>\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n className=\"oui-text-base-contrast\"\n dp={symbolInfo.quote_dp}\n >\n {formattedOrder.sl_trigger_price ?? \"\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.slOrderPrice\")}</Text>\n {formattedOrder.sl_order_type === OrderType.LIMIT ? (\n <Text.numeral\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n className=\"oui-text-base-contrast\"\n dp={symbolInfo.quote_dp}\n >\n {formattedOrder.sl_order_price ?? \"\"}\n </Text.numeral>\n ) : (\n <Text className=\"oui-text-base-contrast\">Market</Text>\n )}\n </Flex>\n\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.totalEstSlPnl\")}</Text>\n <Text.numeral\n coloring\n suffix={\n <Text className=\"oui-ml-1 oui-text-base-contrast-36\">\n {symbolInfo.quote}\n </Text>\n }\n dp={2}\n >\n {Number(formattedOrder.sl_pnl)}\n </Text.numeral>\n </Flex>\n {error && (\n <Flex\n justify={\"start\"}\n itemAlign={\"start\"}\n gap={2}\n className=\"oui-w-full\"\n >\n <div className=\"oui-relative oui-top-[7px] oui-size-1 oui-rounded-full oui-bg-danger\" />\n <Text className=\"oui-text-danger\">{error}</Text>\n </Flex>\n )}\n </Flex>\n </Flex>\n );\n }\n return null;\n };\n\n return (\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-w-full oui-text-2xs\"\n gap={4}\n >\n <Flex justify={\"between\"} itemAlign={\"start\"} className=\"oui-w-full\">\n <Text>{t(\"common.tpsl\")}</Text>\n <Flex gap={2}>\n <DeleteIcon\n size={12}\n className=\"oui-cursor-pointer oui-text-base-contrast-54 hover:oui-text-base-contrast\"\n opacity={1}\n onClick={onDelete}\n />\n <EditIcon\n size={12}\n className=\"oui-cursor-pointer oui-text-base-contrast-54 hover:oui-text-base-contrast\"\n onClick={onEdit}\n />\n </Flex>\n </Flex>\n <Flex justify={\"between\"} itemAlign={\"start\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.mode\")}</Text>\n <Text className=\"oui-text-base-contrast\">\n {formattedOrder.position_type === PositionType.FULL\n ? t(\"tpsl.fullPosition\")\n : t(\"tpsl.partialPosition\")}\n </Text>\n </Flex>\n {renderTp()}\n {renderSl()}\n\n <Divider className=\"oui-mb-2 oui-w-full\" />\n </Flex>\n );\n}\n\ninterface IconProps extends SVGProps<SVGSVGElement> {\n size: number;\n}\nconst DeleteIcon: React.FC<IconProps> = (props) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={props.size}\n height={props.size}\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M5.99903 0.976562C5.44653 0.976562 4.99903 1.42406 4.99903 1.97656H2.49902C2.22302 1.97656 1.99902 2.20056 1.99902 2.47656C1.99902 2.75256 2.22302 2.97656 2.49902 2.97656H9.49903C9.77503 2.97656 9.99903 2.75256 9.99903 2.47656C9.99903 2.20056 9.77503 1.97656 9.49903 1.97656H6.99903C6.99903 1.42406 6.55153 0.976562 5.99903 0.976562ZM2.49902 3.97655V8.97654C2.49902 10.0715 3.40152 10.961 4.49903 10.961L7.51453 10.9765C8.61203 10.9765 9.49903 10.074 9.49903 8.97654V3.97655H2.49902ZM4.99903 5.47655C5.27503 5.47655 5.49903 5.70055 5.49903 5.97655V8.97654C5.49903 9.25254 5.27503 9.47654 4.99903 9.47654C4.72303 9.47654 4.49903 9.25254 4.49903 8.97654V5.97655C4.49903 5.70055 4.72303 5.47655 4.99903 5.47655ZM6.99903 5.47655C7.27503 5.47655 7.49903 5.70055 7.49903 5.97655V8.97654C7.49903 9.25254 7.27503 9.47654 6.99903 9.47654C6.72303 9.47654 6.49903 9.25254 6.49903 8.97654V5.97655C6.49903 5.70055 6.72303 5.47655 6.99903 5.47655Z\" />\n </svg>\n );\n};\n\nconst EditIcon: React.FC<IconProps> = (props) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 12 12\"\n width={props.size}\n height={props.size}\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M8.49779 0.976562C8.36529 0.976562 8.23229 1.02357 8.13829 1.11707C7.86029 1.39507 6.85979 2.39558 6.63779 2.61808L2.13529 7.12059L1.63479 7.62059C1.56529 7.69059 1.52929 7.78958 1.50979 7.88658L1.00979 10.3881C0.939788 10.7381 1.23779 11.0361 1.58779 10.9666C1.90079 10.9036 3.77679 10.5286 4.08929 10.4661C4.18629 10.4466 4.28529 10.4106 4.35529 10.3411L4.85529 9.84059L9.35779 5.33808C9.58029 5.11608 10.5808 4.11506 10.8588 3.83756C10.9523 3.74356 10.9993 3.61056 10.9993 3.47806C10.9993 2.65956 10.7908 2.07456 10.3583 1.63306C9.92179 1.18756 9.33879 0.976562 8.49779 0.976562ZM8.69479 1.98606C9.14629 2.01256 9.43879 2.11608 9.63929 2.32108C9.84429 2.53008 9.97379 2.82008 10.0018 3.26258C9.72779 3.53608 9.32679 3.93106 8.99829 4.25956C8.60179 3.86306 8.11279 3.37407 7.71629 2.97757C8.04529 2.64907 8.42129 2.25956 8.69479 1.98606ZM6.99729 3.69657L8.27929 4.97858L4.49579 8.76207L3.21379 7.48009L6.99729 3.69657ZM2.49479 8.19908L3.77679 9.48107L3.72979 9.52809C3.39979 9.59409 2.73329 9.73359 2.11929 9.85659L2.44779 8.24608L2.49479 8.19908Z\" />\n </svg>\n );\n};\n","import { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { Flex, Text, textVariants } from \"@orderly.network/ui\";\nimport { FeesWidget } from \"../fee\";\nimport { SlippageUI } from \"../slippage/slippage.ui\";\n\nexport function AssetInfo(props: {\n symbol: string;\n canTrade: boolean;\n quote: string;\n estLiqPrice: number | null;\n estLeverage: number | null;\n currentLeverage: number | null;\n slippage: string;\n dp: number;\n estSlippage: number | null;\n setSlippage: (slippage: string) => void;\n orderType: OrderType;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n}) {\n const { canTrade, disableFeatures, orderType, symbol } = props;\n const { t } = useTranslation();\n\n return (\n <div className={\"oui-space-y-[2px] xl:oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"orderEntry.estLiqPrice\")}</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\n dp={props.dp}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-36\"}\n >\n {canTrade ? (props.estLiqPrice ?? \"--\") : \"--\"}\n </Text.numeral>\n </Flex>\n\n {orderType === OrderType.MARKET &&\n !disableFeatures?.includes(\"slippageSetting\") && (\n <SlippageUI\n slippage={props.slippage}\n setSlippage={props.setSlippage}\n estSlippage={props.estSlippage}\n />\n )}\n\n {!disableFeatures?.includes(\"feesInfo\") && (\n <FeesWidget symbol={props.symbol} />\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { pick } from \"ramda\";\nimport { useFeeState, useRwaSymbolsInfoStore } from \"@orderly.network/hooks\";\nimport { EffectiveFeesWidget } from \"./effectiveFee\";\nimport { RegularFeesWidget } from \"./regularFee\";\n\nconst isEffective = (val?: unknown) =>\n typeof val !== \"undefined\" && val !== null;\n\nexport const FeesWidget: React.FC<{ symbol: string }> = ({ symbol }) => {\n const { refereeRebate, ...others } = useFeeState();\n const info = useRwaSymbolsInfoStore();\n const isRwa = info?.[symbol] !== undefined;\n const isEffectiveFee = isEffective(refereeRebate);\n return isEffectiveFee ? (\n <EffectiveFeesWidget\n taker={isRwa ? others.rwaEffectiveTakerFee : others.effectiveTakerFee}\n maker={isRwa ? others.rwaEffectiveMakerFee : others.effectiveMakerFee}\n />\n ) : (\n <RegularFeesWidget\n taker={isRwa ? others.rwaTakerFee : others.takerFee}\n maker={isRwa ? others.rwaMakerFee : others.makerFee}\n />\n );\n};\n","import React from \"react\";\nimport { useFeeState } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Flex,\n modal,\n Text,\n Tooltip,\n useModal,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport {\n RouterAdapter,\n useScaffoldContext,\n} from \"@orderly.network/ui-scaffold\";\nimport { EffectiveFee } from \"./icons\";\n\nconst EffectiveFeeBody: React.FC<{\n routerAdapter: RouterAdapter | undefined;\n onClose?: () => void;\n}> = ({ routerAdapter, onClose }) => {\n const { t } = useTranslation();\n return (\n <Text size=\"2xs\" className=\"oui-whitespace-normal oui-break-words\">\n {t(\"portfolio.feeTier.effectiveFee.tooltip\")}{\" \"}\n <a\n href=\"/rewards/affiliate\"\n onClick={(e) => {\n e.preventDefault();\n routerAdapter?.onRouteChange({\n href: \"/rewards/affiliate\",\n name: t(\"portfolio.feeTier.effectiveFee.tooltipLink\"),\n });\n onClose?.();\n }}\n className=\"oui-cursor-pointer oui-border-none oui-bg-transparent oui-p-0 oui-text-2xs oui-underline hover:oui-text-base-contrast-80\"\n >\n {t(\"portfolio.feeTier.effectiveFee.tooltipLink\")}\n </a>\n </Text>\n );\n};\n\nconst EffectiveFeeMobileContent: React.FC<{\n routerAdapter: RouterAdapter | undefined;\n}> = ({ routerAdapter }) => {\n const { hide } = useModal();\n return <EffectiveFeeBody routerAdapter={routerAdapter} onClose={hide} />;\n};\n\nconst EffectiveFeeSection: React.FC<{\n routerAdapter: RouterAdapter | undefined;\n}> = (props) => {\n const { routerAdapter } = props;\n const { isMobile } = useScreen();\n const { t } = useTranslation();\n if (isMobile) {\n return (\n <EffectiveFee\n onClick={() => {\n modal.dialog({\n size: \"sm\",\n title: t(\"common.tips\"),\n content: (\n <EffectiveFeeMobileContent routerAdapter={routerAdapter} />\n ),\n });\n }}\n />\n );\n }\n return (\n <Tooltip\n content={<EffectiveFeeBody routerAdapter={routerAdapter} />}\n className=\"oui-p-1.5 oui-text-base-contrast-54\"\n >\n <EffectiveFee className={\"oui-cursor-pointer\"} />\n </Tooltip>\n );\n};\n\nexport const EffectiveFeeUI: React.FC<{ taker: string; maker: string }> = (\n props,\n) => {\n const { t } = useTranslation();\n const { routerAdapter } = useScaffoldContext();\n const { taker, maker } = props;\n\n const originalTrailingFees = (\n <Flex itemAlign=\"center\" justify=\"between\" width={\"100%\"} gap={1}>\n <Flex width={\"100%\"} itemAlign=\"center\" justify={\"between\"}>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"common.fees\")}\n </Text>\n <AuthGuard\n fallback={() => (\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.taker\")}: --% / {t(\"dmm.maker\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.taker\")}:\n </Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {taker}\n </Text>\n <Text size=\"2xs\">/</Text>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.maker\")}:\n </Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {maker}\n </Text>\n </Flex>\n </AuthGuard>\n </Flex>\n <EffectiveFeeSection routerAdapter={routerAdapter} />\n </Flex>\n );\n\n return originalTrailingFees;\n};\n","import React, { useId } from \"react\";\n\nexport const EffectiveFee = React.forwardRef<\n SVGSVGElement,\n React.SVGAttributes<SVGSVGElement>\n>((props, ref) => {\n const linearId = useId();\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={14}\n height={14}\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n ref={ref}\n focusable={false}\n {...props}\n >\n <path\n d=\"M6.16411 1.53106C6.61974 1.07566 7.35888 1.07551 7.81442 1.53106L8.48833 2.20496C8.6797 2.39624 8.93064 2.51452 9.19755 2.54106L9.3132 2.54676H10.2662C10.9104 2.54691 11.4328 3.06926 11.4329 3.71343V4.66647C11.4329 4.97589 11.5559 5.27312 11.7747 5.49191L12.4492 6.16582C12.9047 6.62142 12.9047 7.36054 12.4492 7.81613L11.7753 8.49004L11.6972 8.57549C11.5272 8.78302 11.433 9.04426 11.4329 9.31491V10.2685L11.4272 10.3876C11.3715 10.9366 10.9348 11.373 10.3859 11.4289L10.2662 11.4352H9.3132L9.19755 11.4409C8.93066 11.4674 8.67969 11.5857 8.48833 11.777L7.81442 12.4509L7.72555 12.5306C7.29789 12.8795 6.68066 12.8794 6.25297 12.5306L6.16411 12.4509L5.4902 11.777C5.29887 11.5857 5.04786 11.4675 4.78097 11.4409L4.66533 11.4352H3.71171L3.59265 11.4289C3.04358 11.3731 2.60705 10.9367 2.55131 10.3876L2.54505 10.2685V9.31491C2.54499 9.04416 2.45089 8.78306 2.28072 8.57549L2.20325 8.49004L1.52934 7.81613C1.10213 7.38905 1.07534 6.71297 1.44902 6.25469L1.52934 6.16582L2.20382 5.49191C2.42248 5.27314 2.54505 4.97579 2.54505 4.66647V3.71343C2.54513 3.10945 3.00442 2.61221 3.59265 2.55246L3.71171 2.54676H4.66533L4.78097 2.54106C5.00968 2.51826 5.22694 2.4281 5.40475 2.28244L5.4902 2.20496L6.16411 1.53106ZM6.31507 3.02983C5.87756 3.46727 5.28401 3.71336 4.66533 3.71343H3.71171V4.66647C3.71171 5.28521 3.46614 5.87922 3.02869 6.31678L2.35421 6.99069L3.02812 7.6646C3.46577 8.10214 3.71164 8.69607 3.71171 9.31491V10.2685H4.66533C5.28396 10.2686 5.87757 10.5142 6.31507 10.9515L6.98898 11.6255L7.66289 10.9515C8.10045 10.5141 8.69446 10.2685 9.3132 10.2685H10.2662V9.31491C10.2663 8.69604 10.5127 8.10214 10.9504 7.6646L11.6243 6.99069L10.9498 6.31678C10.5122 5.8792 10.2662 5.28531 10.2662 4.66647V3.71343H9.3132C8.69438 3.71343 8.10047 3.46739 7.66289 3.02983L6.98898 2.35592L6.31507 3.02983ZM8.52934 4.64255C8.7571 4.41479 9.12639 4.41489 9.35421 4.64255C9.58202 4.87035 9.58202 5.23961 9.35421 5.46742L5.4657 9.35593C5.2379 9.58372 4.86863 9.58373 4.64083 9.35593C4.41318 9.12811 4.41308 8.75881 4.64083 8.53106L8.52934 4.64255ZM8.66435 7.83265C9.1245 7.83272 9.49777 8.2059 9.49777 8.66607C9.49769 9.12616 9.12445 9.49941 8.66435 9.49948C8.20419 9.49948 7.83101 9.12621 7.83094 8.66607C7.83094 8.20586 8.20415 7.83265 8.66435 7.83265ZM5.33126 4.49956C5.79141 4.49963 6.16468 4.87282 6.16468 5.33298C6.1646 5.79307 5.79136 6.16575 5.33126 6.16582C4.87111 6.16582 4.49793 5.79311 4.49785 5.33298C4.49785 4.87277 4.87106 4.49956 5.33126 4.49956Z\"\n fill={`url(#${linearId})`}\n />\n <defs>\n <linearGradient\n id={linearId}\n x1=\"12.7908\"\n y1=\"6.99084\"\n x2=\"1.1875\"\n y2=\"6.99084\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop stopColor=\"rgb(var(--oui-gradient-brand-start))\" offset={1} />\n </linearGradient>\n </defs>\n </svg>\n );\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n EffectiveFee.displayName = \"EffectiveFee\";\n}\n","import React from \"react\";\nimport { useFeeState } from \"@orderly.network/hooks\";\nimport { EffectiveFeeUI } from \"./effectiveFee.ui\";\n\nexport const EffectiveFeesWidget: React.FC<{ taker: string; maker: string }> = (\n props,\n) => {\n return <EffectiveFeeUI {...props} />;\n};\n","import React from \"react\";\nimport { useFeeState } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Text } from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\n\nexport const RegularFeesUI: React.FC<{ taker: string; maker: string }> = (\n props,\n) => {\n const { t } = useTranslation();\n const { taker, maker } = props;\n\n const originalTrailingFees = (\n <Flex itemAlign=\"center\" justify=\"between\" width={\"100%\"} gap={1}>\n <Flex width={\"100%\"} itemAlign=\"center\" justify={\"between\"}>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"common.fees\")}\n </Text>\n <AuthGuard\n fallback={() => (\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.taker\")}: --% / {t(\"dmm.maker\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.taker\")}:\n </Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {taker}\n </Text>\n <Text size=\"2xs\">/</Text>\n <Text className=\"oui-truncate\" size=\"2xs\">\n {t(\"dmm.maker\")}:\n </Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {maker}\n </Text>\n </Flex>\n </AuthGuard>\n </Flex>\n </Flex>\n );\n\n return originalTrailingFees;\n};\n","import React from \"react\";\nimport { useFeeState } from \"@orderly.network/hooks\";\nimport { RegularFeesUI } from \"./regularFees.ui\";\n\nexport const RegularFeesWidget: React.FC<{ taker: string; maker: string }> = (\n props,\n) => {\n return <RegularFeesUI {...props} />;\n};\n","import { useRef } from \"react\";\nimport { useBoolean } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n EditIcon,\n Flex,\n Text,\n SimpleDialog,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { SlippageEditor } from \"./slippageEditor\";\n\nexport const SlippageCell = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n const { t } = useTranslation();\n const [open, { setTrue: setOpen, setFalse: setClose, toggle }] =\n useBoolean(false);\n\n const { isMobile } = useScreen();\n const slippageRef = useRef<{ getValue: () => number | undefined }>(null);\n\n const onConfirm = () => {\n const val = slippageRef.current?.getValue();\n\n props.setSlippage(!val ? \"1\" : val.toString());\n setClose();\n return Promise.resolve(true);\n };\n\n return (\n <>\n <SimpleDialog\n open={open}\n onOpenChange={toggle}\n title={t(\"common.settings\")}\n contentProps={{ size: isMobile ? \"xs\" : \"sm\" }}\n actions={{\n primary: {\n disabled: false,\n label: t(\"common.save\"),\n onClick: onConfirm,\n },\n secondary: {\n label: t(\"common.cancel\"),\n onClick: () => setClose(),\n },\n }}\n >\n <SlippageEditor\n ref={slippageRef}\n isMobile={isMobile}\n initialValue={props.slippage ? Number(props.slippage) : undefined}\n />\n </SimpleDialog>\n <Flex justify={\"between\"}>\n <Text size=\"2xs\">{t(\"orderEntry.slippage\")}</Text>\n <AuthGuard\n fallback={() => (\n <Text size=\"2xs\">\n {t(\"orderEntry.slippage.est\")}: -% / {t(\"common.max\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text.numeral\n size=\"2xs\"\n rule=\"percentages\"\n prefix={`${t(\"orderEntry.slippage.est\")}: `}\n suffix={` / ${t(\"common.max\")}: `}\n >\n {props.estSlippage ?? 0}\n </Text.numeral>\n <button className=\"oui-text-2xs\" onClick={() => setOpen()}>\n <Flex className=\"oui-gap-0.5\" as=\"span\">\n <Text size=\"2xs\" className=\"oui-text-primary\">\n {`${props.slippage || \"-\"}%`}\n </Text>\n <EditIcon\n className=\"oui-text-primary oui-hidden md:oui-block\"\n size={12}\n opacity={1}\n />\n </Flex>\n </button>\n </Flex>\n </AuthGuard>\n </Flex>\n </>\n );\n};\n","import {\n FC,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n cn,\n ExclamationFillIcon,\n Flex,\n Input,\n inputFormatter,\n modal,\n Text,\n Tooltip,\n TooltipTrigger,\n} from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\n\ninterface SlippageProps {\n initialValue?: number;\n isMobile?: boolean;\n}\n\nconst options = [0.01, 0.05, 0.1];\n\nexport const SlippageEditor = forwardRef<\n { getValue: () => number | undefined },\n SlippageProps\n>((props, ref) => {\n const { t } = useTranslation();\n const [value, setValue] = useState<number>();\n const [customValue, setCustomValue] = useState(\"\");\n const [error, setError] = useState<string | undefined>(undefined);\n\n useImperativeHandle(ref, () => ({\n getValue: () =>\n customValue ? new Decimal(customValue)?.toNumber() : value,\n }));\n\n useEffect(() => {\n if (props.initialValue && !options.includes(props.initialValue!)) {\n setCustomValue(props.initialValue!.toString());\n } else {\n setValue(props.initialValue);\n }\n }, [props.initialValue, open]);\n\n const onClick = (val: number) => {\n setValue(val);\n setCustomValue(\"\");\n setError(undefined);\n };\n\n const onValueChange = (val: string) => {\n if (!val) {\n setCustomValue(val);\n return;\n }\n\n const d = new Decimal(val);\n setValue(undefined);\n if (d.gt(3)) {\n setCustomValue(\"3\");\n setError(t(\"orderEntry.slippage.error.exceed\"));\n } else {\n setCustomValue(val);\n setError(undefined);\n }\n };\n\n const toolTipButton = props.isMobile ? (\n <button\n onClick={() => {\n // setOpen(true)\n modal.alert({\n title: t(\"common.tips\"),\n message: <Text size=\"2xs\">{t(\"orderEntry.slippage.tips\")}</Text>,\n });\n }}\n >\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </button>\n ) : (\n <Tooltip\n // @ts-ignore\n content={\n <Text intensity={80} size=\"2xs\">\n {t(\"orderEntry.slippage.tips\")}\n </Text>\n }\n className=\"oui-w-[260px] oui-bg-base-6\"\n arrow={{ className: \"oui-fill-base-6\" }}\n >\n <TooltipTrigger>\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </TooltipTrigger>\n </Tooltip>\n );\n\n return (\n <div className=\"oui-text-2xs\">\n <Flex mb={2} gapX={1}>\n <Text size=\"xs\">{t(\"orderEntry.slippage\")}</Text>\n {toolTipButton}\n </Flex>\n <Flex gapX={2}>\n {options.map((item) => {\n const isActive = value === item;\n return (\n <SlippageItem\n key={item}\n value={item}\n isActive={isActive}\n onClick={() => {\n onClick(item);\n }}\n />\n );\n })}\n\n <Input\n suffix=\"%\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(2),\n ]}\n value={customValue}\n onValueChange={onValueChange}\n classNames={{\n root: cn(\n \"oui-rounded-md oui-bg-base-6\",\n \"oui-h-[40px] oui-w-[74px]\",\n ),\n input: \"oui-text-base-contrast\",\n additional: \"oui-pl-1\",\n }}\n />\n </Flex>\n {!!error && (\n <Box mt={5} className=\"-oui-mb-5\">\n <Text size=\"2xs\" color=\"danger\">\n {error}\n </Text>\n </Box>\n )}\n </div>\n );\n});\n\ntype SlippageItemProps = {\n value: number;\n isActive: boolean;\n onClick: () => void;\n};\n\nconst SlippageItem: FC<SlippageItemProps> = ({ value, isActive, onClick }) => {\n return (\n <Flex\n intensity={600}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"md\"\n width={74}\n height={40}\n className={cn(\n \"oui-cursor-pointer oui-select-none\",\n isActive && \"oui-bg-primary-light\",\n )}\n onClick={onClick}\n >\n <Text size=\"sm\" intensity={80}>\n {value}%\n </Text>\n </Flex>\n );\n};\n","import { SlippageCell } from \"./components/slippageCell\";\n\nexport const SlippageUI = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n return <SlippageCell {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Tooltip, Text, InfoCircleIcon } from \"@orderly.network/ui\";\nimport { LTVRiskTooltipWidget } from \"../LTVRiskTooltip\";\n\ntype AvailableProps = {\n canTrade: boolean;\n currentLtv: number;\n freeCollateral: number;\n quote?: string;\n};\n\nexport const Available = (props: AvailableProps) => {\n const { canTrade, currentLtv, quote, freeCollateral } = props;\n const { t } = useTranslation();\n\n const showLTV = useMemo(() => {\n return (\n typeof currentLtv === \"number\" &&\n !Number.isNaN(currentLtv) &&\n currentLtv > 0\n );\n }, [currentLtv]);\n\n return (\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"common.available\")}</Text>\n <Flex itemAlign={\"center\"} justify={\"center\"} gap={1}>\n {showLTV && (\n <Tooltip\n className={\"oui-bg-base-6 oui-p-2\"}\n content={<LTVRiskTooltipWidget />}\n >\n <InfoCircleIcon\n className={\"oui-cursor-pointer oui-text-warning oui-opacity-80\"}\n />\n </Tooltip>\n )}\n <Text.numeral\n unit={quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-54\"}\n dp={2}\n padding={false}\n >\n {canTrade ? freeCollateral : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n );\n};\n","import React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Button, cn, Divider, Flex, Text } from \"@orderly.network/ui\";\nimport { removeTrailingZeros } from \"@orderly.network/utils\";\nimport type { LTVTooltipScriptReturn } from \"./LTVRiskTooltip.script\";\n\nconst calculateLTVColor = (val: number): string => {\n if (val >= 0 && val < 50) {\n return \"oui-text-success\";\n } else if (val >= 50 && val < 80) {\n return \"oui-text-warning\";\n } else if (val >= 80) {\n return \"oui-text-danger\";\n } else {\n return \"\";\n }\n};\n\nexport const LTVRiskTooltipUI: React.FC<LTVTooltipScriptReturn> = (props) => {\n const { t } = useTranslation();\n const {\n ltv_threshold,\n negative_usdc_threshold,\n isThresholdLoading,\n holdingData = [],\n currentLtv,\n onConvert,\n } = props;\n return (\n <Flex gap={1} className=\"oui-w-72 oui-max-w-72\" direction=\"column\">\n <Flex width={\"100%\"} justify=\"between\" itemAlign=\"center\">\n <Text intensity={36} size=\"xs\">\n {t(\"common.assets\")}\n </Text>\n <Text intensity={36} size=\"xs\">\n {t(\"transfer.deposit.collateralContribution\")}\n </Text>\n </Flex>\n {holdingData.map((asset, index) => {\n return (\n <Flex\n key={`item-${index}`}\n width={\"100%\"}\n justify=\"between\"\n itemAlign=\"center\"\n >\n <Text intensity={80} size=\"xs\">\n {asset.token}\n </Text>\n <Text\n size=\"xs\"\n intensity={80}\n className={cn(\n Number(asset.collateralContribution) < 0 && \"oui-text-warning\",\n )}\n >\n {removeTrailingZeros(asset.collateralContribution)}\n </Text>\n </Flex>\n );\n })}\n <Divider className=\"oui-w-full\" />\n <Flex width={\"100%\"} justify=\"between\" itemAlign=\"center\">\n <Text intensity={36} size=\"xs\">\n {t(\"transfer.LTV.currentLTV\")}\n </Text>\n <Text\n size=\"xs\"\n intensity={36}\n className={cn(\"oui-select-none\", calculateLTVColor(currentLtv))}\n >\n {currentLtv}%\n </Text>\n </Flex>\n <Text className=\"oui-py-2\" intensity={54} size=\"2xs\">\n {t(\"transfer.LTV.tooltip\", {\n threshold: isThresholdLoading ? \"-\" : ltv_threshold,\n usdcThreshold: isThresholdLoading ? \"-\" : negative_usdc_threshold,\n })}\n </Text>\n <Button\n fullWidth\n size={\"md\"}\n variant={\"outlined\"}\n color={\"secondary\"}\n onClick={onConvert}\n >\n {t(\"transfer.convert.convertAssets\")}\n </Button>\n </Flex>\n );\n};\n","import { useCallback } from \"react\";\nimport {\n useComputedLTV,\n useHoldingStream,\n useIndexPricesStream,\n useQuery,\n useTokensInfo,\n} from \"@orderly.network/hooks\";\nimport { account } from \"@orderly.network/perp\";\nimport type { API } from \"@orderly.network/types\";\nimport { modal } from \"@orderly.network/ui\";\nimport { Decimal, zero } from \"@orderly.network/utils\";\n\nconst useConvertThreshold = () => {\n const { data, error, isLoading } = useQuery<API.ConvertThreshold>(\n \"/v1/public/auto_convert_threshold\",\n { errorRetryCount: 3 },\n );\n return {\n ltv_threshold: new Decimal(data?.ltv_threshold ?? 0).mul(100).toNumber(),\n negative_usdc_threshold: data?.negative_usdc_threshold,\n isLoading,\n error,\n } as const;\n};\n\nexport const useLTVTooltipScript = () => {\n const { data: holdingList = [], isLoading: isHoldingLoading } =\n useHoldingStream();\n\n const {\n ltv_threshold,\n negative_usdc_threshold,\n isLoading: isThresholdLoading,\n } = useConvertThreshold();\n\n const tokensInfo = useTokensInfo();\n\n const { getIndexPrice } = useIndexPricesStream();\n\n const holdingData = holdingList.map((item) => {\n const tokenInfo = tokensInfo?.find(({ token }) => token === item.token);\n\n // Use extracted function for index price calculation\n const indexPrice = getIndexPrice(item.token);\n\n // Calculate collateral ratio for this token\n const collateralRatio = tokenInfo\n ? account.collateralRatio({\n baseWeight: tokenInfo.base_weight ?? 0,\n discountFactor: tokenInfo.discount_factor ?? 0,\n collateralQty: item.holding,\n collateralCap: tokenInfo?.user_max_qty ?? item.holding,\n indexPrice: indexPrice,\n })\n : zero;\n\n // Calculate collateral contribution for this token\n const collateralContribution = account.collateralContribution({\n collateralQty: item.holding,\n collateralCap: tokenInfo?.user_max_qty ?? item.holding,\n collateralRatio: collateralRatio.toNumber(),\n indexPrice: indexPrice,\n });\n\n return {\n ...item,\n collateralContribution: collateralContribution,\n };\n });\n\n const currentLtv = useComputedLTV();\n\n const onConvert = useCallback(async () => {\n return modal.show(\"ConvertDialogId\");\n }, []);\n\n return {\n holdingData,\n isHoldingLoading,\n ltv_threshold,\n negative_usdc_threshold,\n isThresholdLoading,\n currentLtv: currentLtv,\n onConvert: onConvert,\n };\n};\n\nexport type LTVTooltipScriptReturn = ReturnType<typeof useLTVTooltipScript>;\n","import React from \"react\";\nimport { useLTVTooltipScript } from \"./LTVRiskTooltip.script\";\nimport { LTVRiskTooltipUI } from \"./LTVRiskTooltip.ui\";\n\nexport const LTVRiskTooltipWidget: React.FC = () => {\n const state = useLTVTooltipScript();\n return <LTVRiskTooltipUI {...state} />;\n};\n","import { FC, ReactNode, useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { usePositionStream } from \"@orderly.network/hooks\";\nimport { i18n, useTranslation } from \"@orderly.network/i18n\";\nimport {\n BBOOrderType,\n API,\n OrderSide,\n OrderType,\n PositionType,\n} from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport {\n Badge,\n Button,\n Checkbox,\n cn,\n Divider,\n Flex,\n Grid,\n registerSimpleDialog,\n Text,\n textVariants,\n} from \"@orderly.network/ui\";\nimport { Decimal, getBBOType } from \"@orderly.network/utils\";\nimport { isBBOOrder } from \"../../utils\";\n\ntype OrderConfirmDialogProps = {\n order: OrderlyOrder;\n symbolInfo: API.SymbolExt;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const OrderConfirmDialog = (props: OrderConfirmDialogProps) => {\n const { symbolInfo, order, onConfirm, onCancel } = props;\n const { quote, quote_dp, base_dp } = symbolInfo;\n const { side, order_type, order_type_ext, level, symbol } = order;\n const { t } = useTranslation();\n const [{ rows: positions }] = usePositionStream(symbol);\n const position = positions?.[0];\n const positionQty = position?.position_qty;\n\n const [_, setNeedConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const renderPositionType = () => {\n if (order.position_type === PositionType.FULL) {\n return <Text>{t(\"tpsl.positionType.full\")}</Text>;\n }\n return <Text>{t(\"tpsl.positionType.partial\")}</Text>;\n };\n\n const renderPrice = () => {\n if (\n order_type === OrderType.MARKET ||\n order_type === OrderType.STOP_MARKET\n ) {\n return <Text intensity={80}>{t(\"common.marketPrice\")}</Text>;\n }\n\n if (isBBOOrder({ order_type, order_type_ext })) {\n const bboType = getBBOType({\n type: order_type_ext!,\n side,\n level,\n });\n const label = {\n [BBOOrderType.COUNTERPARTY1]: t(\"orderEntry.bbo.counterparty1\"),\n [BBOOrderType.COUNTERPARTY5]: t(\"orderEntry.bbo.counterparty5\"),\n [BBOOrderType.QUEUE1]: t(\"orderEntry.bbo.queue1\"),\n [BBOOrderType.QUEUE5]: t(\"orderEntry.bbo.queue5\"),\n }[bboType!];\n\n return <Text intensity={80}>{label}</Text>;\n }\n\n return (\n <Text.numeral\n unit={quote}\n rule=\"price\"\n className=\"oui-text-base-contrast\"\n unitClassName=\"oui-text-base-contrast-36 oui-ml-1\"\n dp={quote_dp}\n padding={false}\n >\n {order.order_price}\n </Text.numeral>\n );\n };\n\n const renderTPSLPrice = ({\n price,\n isOrderPrice,\n isEnable,\n colorType,\n }: {\n price: string;\n isOrderPrice?: boolean;\n isEnable?: boolean;\n colorType: \"TP\" | \"SL\";\n }) => {\n if (!isEnable) {\n return <Text className=\"oui-text-base-contrast-36\">-- USDC</Text>;\n }\n if (!price) {\n if (isOrderPrice) {\n return (\n <Text className=\"oui-text-base-contrast-36\">\n {t(\"common.marketPrice\")}\n </Text>\n );\n }\n }\n return (\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={cn(\n \"oui-text-base-contrast\",\n colorType === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n )}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quote_dp}\n padding={false}\n >\n {price}\n </Text.numeral>\n );\n };\n\n const renderTPSLQty = () => {\n if (!positionQty || !order.order_quantity) {\n return null;\n }\n let qty = new Decimal(order.order_quantity);\n if (order.position_type === PositionType.FULL) {\n qty = qty.plus(new Decimal(positionQty ?? 0));\n }\n return (\n <Flex justify={\"between\"}>\n <Text>\n {order.position_type === PositionType.FULL\n ? t(\"common.positionQty\")\n : t(\"common.orderQty\")}\n </Text>\n <Text.numeral\n rule={\"price\"}\n dp={base_dp}\n padding={false}\n className=\"oui-text-base-contrast\"\n >\n {qty.toNumber()}\n </Text.numeral>\n </Flex>\n );\n };\n\n const renderPriceAndTotal = () => {\n if (order_type === OrderType.TRAILING_STOP) {\n const { activated_price, callback_value, callback_rate } = order;\n\n const callbackView = callback_rate ? (\n <Flex justify={\"between\"}>\n <Text>{t(\"orderEntry.trailingRate\")}</Text>\n <Text className=\"oui-text-base-contrast\">{callback_rate}%</Text>\n </Flex>\n ) : (\n <OrderItem\n title={t(\"orderEntry.trailingValue\")}\n value={callback_value!}\n unit={quote}\n dp={quote_dp}\n />\n );\n return (\n <>\n {activated_price && (\n <OrderItem\n title={t(\"common.triggerPrice\")}\n value={activated_price!}\n unit={quote}\n dp={quote_dp}\n />\n )}\n {callbackView}\n </>\n );\n }\n\n return (\n <>\n <Flex justify={\"between\"}>\n <Text>{t(\"common.price\")}</Text>\n {renderPrice()}\n </Flex>\n <OrderItem\n title={t(\"common.estTotal\")}\n value={order.total}\n unit={quote}\n dp={quote_dp}\n />\n </>\n );\n };\n\n const header = (\n <Flex justify={\"between\"}>\n <Text.formatted rule={\"symbol\"} showIcon>\n {order.symbol}\n </Text.formatted>\n <Flex justify={\"end\"} gapX={1}>\n <OrderTypeTag type={order_type} />\n {side === OrderSide.BUY ? (\n <Badge color={\"buy\"} size={\"sm\"}>\n {t(\"common.buy\")}\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n {t(\"common.sell\")}\n </Badge>\n )}\n </Flex>\n </Flex>\n );\n\n const quantityItem = (\n <Flex justify={\"between\"}>\n <Text>{t(\"common.orderQty\")}</Text>\n <Text.numeral\n rule={\"price\"}\n dp={base_dp}\n padding={false}\n className=\"oui-text-base-contrast\"\n >\n {order.order_quantity}\n </Text.numeral>\n </Flex>\n );\n\n const triggerPriceItem = (order_type === OrderType.STOP_LIMIT ||\n (order_type === OrderType.STOP_MARKET && order.trigger_price)) && (\n <OrderItem\n title={t(\"common.trigger\")}\n value={order.trigger_price}\n unit={quote}\n dp={quote_dp}\n />\n );\n\n const tpslTriggerPrice = (order.tp_trigger_price ||\n order.sl_trigger_price) && (\n <>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1 oui-w-full oui-flex oui-flex-col oui-gap-3\",\n })}\n >\n <Text className=\"oui-text-base-contrast\">{renderPositionType()}</Text>\n {renderTPSLQty()}\n\n <Flex\n direction={\"column\"}\n justify={\"between\"}\n itemAlign={\"start\"}\n gap={1}\n className=\"oui-w-full\"\n >\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.tpTriggerPrice\")}</Text>\n {renderTPSLPrice({\n price: order.tp_trigger_price ?? \"\",\n isOrderPrice: false,\n isEnable: !!order.tp_trigger_price,\n colorType: \"TP\",\n })}\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.tpOrderPrice\")}</Text>\n {renderTPSLPrice({\n price: order.tp_order_price ?? \"\",\n isOrderPrice: true,\n isEnable: !!order.tp_trigger_price,\n colorType: \"TP\",\n })}\n </Flex>\n </Flex>\n\n <Flex\n direction={\"column\"}\n justify={\"between\"}\n itemAlign={\"start\"}\n gap={1}\n className=\"oui-w-full\"\n >\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.slTriggerPrice\")}</Text>\n {renderTPSLPrice({\n price: order.sl_trigger_price ?? \"\",\n isOrderPrice: false,\n isEnable: !!order.sl_trigger_price,\n colorType: \"SL\",\n })}\n </Flex>\n <Flex justify={\"between\"} className=\"oui-w-full\">\n <Text>{t(\"tpsl.slOrderPrice\")}</Text>\n {renderTPSLPrice({\n price: order.sl_order_price ?? \"\",\n isOrderPrice: true,\n isEnable: !!order.sl_trigger_price,\n colorType: \"SL\",\n })}\n </Flex>\n </Flex>\n </div>\n </>\n );\n\n const orderConfirmCheckbox = (\n <Flex gapX={1} pt={4} pb={5}>\n <Checkbox\n id=\"orderConfirm\"\n color={\"white\"}\n onCheckedChange={(checked) => {\n setNeedConfirm(!!!checked);\n }}\n />\n <label\n htmlFor=\"orderConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n })}\n >\n {t(\"orderEntry.disableOrderConfirm\")}\n </label>\n </Flex>\n );\n\n const buttons = (\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n );\n\n return (\n <>\n {header}\n <Divider className=\"oui-my-4\" />\n\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n {quantityItem}\n {triggerPriceItem}\n\n {renderPriceAndTotal()}\n </div>\n\n {tpslTriggerPrice}\n\n {orderConfirmCheckbox}\n\n {buttons}\n </>\n );\n};\n\ntype OrderItemProps = {\n title: ReactNode;\n value: string;\n unit: string;\n dp: number;\n};\n\nconst OrderItem: FC<OrderItemProps> = (props) => {\n const { title, value, unit, dp } = props;\n return (\n <Flex justify=\"between\">\n <Text>{title}</Text>\n <Text.numeral\n unit={unit}\n rule=\"price\"\n dp={dp}\n padding={false}\n className=\"oui-text-base-contrast\"\n unitClassName=\"oui-text-base-contrast-36 oui-ml-1\"\n >\n {value}\n </Text.numeral>\n </Flex>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const { t } = useTranslation();\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return t(\"orderEntry.orderType.limit\");\n case OrderType.MARKET:\n return t(\"common.marketPrice\");\n case OrderType.STOP_LIMIT:\n return t(\"orderEntry.orderType.stopLimit\");\n case OrderType.STOP_MARKET:\n return t(\"orderEntry.orderType.stopMarket\");\n case OrderType.TRAILING_STOP:\n return t(\"orderEntry.orderType.trailingStop\");\n default:\n return \"\";\n }\n }, [props.type]);\n\n return (\n <Badge color={\"neutral\"} size={\"sm\"}>\n {typeStr}\n </Badge>\n );\n};\n\nconst Dialog = (\n props: Omit<OrderConfirmDialogProps, \"onCancel\" | \"onConfirm\"> & {\n close: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n },\n) => {\n const { close, resolve, reject, ...rest } = props;\n\n return (\n <OrderConfirmDialog\n {...rest}\n onCancel={() => {\n reject();\n close();\n }}\n onConfirm={() => {\n resolve();\n close();\n }}\n />\n );\n};\n\nexport const orderConfirmDialogId = \"orderConfirm\";\n\nregisterSimpleDialog(orderConfirmDialogId, Dialog, {\n size: \"sm\",\n title: () => i18n.t(\"orderEntry.orderConfirm\"),\n});\n","import { i18n } from \"@orderly.network/i18n\";\nimport {\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\n\nexport enum BBOStatus {\n ON = \"on\",\n OFF = \"off\",\n DISABLED = \"disabled\",\n}\n\n/**\n * if provide order_type, check order_type and order_type_ext, otherswise only check order_type_ext\n */\nexport function isBBOOrder(options: {\n order_type?: OrderType;\n order_type_ext?: OrderType;\n}) {\n const { order_type, order_type_ext } = options;\n\n const isBBO = [OrderType.ASK, OrderType.BID].includes(order_type_ext!);\n\n if (order_type) {\n return order_type === OrderType.LIMIT && isBBO;\n }\n\n return isBBO;\n}\n\nexport function getOrderTypeByBBO(value: BBOOrderType, size: OrderSide) {\n if (\n [BBOOrderType.COUNTERPARTY1, BBOOrderType.COUNTERPARTY5].includes(value)\n ) {\n return size === OrderSide.BUY ? OrderType.ASK : OrderType.BID;\n }\n\n if ([BBOOrderType.QUEUE1, BBOOrderType.QUEUE5].includes(value)) {\n return size === OrderSide.BUY ? OrderType.BID : OrderType.ASK;\n }\n}\n\nexport function getOrderLevelByBBO(value: BBOOrderType) {\n if ([BBOOrderType.COUNTERPARTY1, BBOOrderType.QUEUE1].includes(value)) {\n return OrderLevel.ONE;\n }\n\n if ([BBOOrderType.COUNTERPARTY5, BBOOrderType.QUEUE5].includes(value)) {\n return OrderLevel.FIVE;\n }\n}\n\nexport function getScaledPlaceOrderMessage(result: any) {\n const rows = result?.data?.rows || [];\n\n if (rows.length > 0) {\n const totalCount = rows.length;\n const successCount = rows.filter((row: any) => row.success).length;\n\n // fully successful\n if (successCount === totalCount) {\n return i18n.t(\"orderEntry.scaledOrder.fullySuccessful\", {\n total: totalCount,\n });\n }\n\n // all failed\n if (successCount === 0) {\n return i18n.t(\"orderEntry.scaledOrder.allFailed\");\n }\n\n // partially successful\n return i18n.t(\"orderEntry.scaledOrder.partiallySuccessful\", {\n successCount,\n total: totalCount,\n });\n }\n}\n\nexport const safeNumber = (val: number | string) => {\n return Number.isNaN(Number(val)) ? 0 : Number(val);\n};\n","import { FC, memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { SimpleDialog } from \"@orderly.network/ui\";\n\ntype MaxQtyConfirmProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n maxQty: string;\n onConfirm: () => void;\n base: string;\n};\n\nexport const MaxQtyConfirm: FC<MaxQtyConfirmProps> = memo((props) => {\n const { t } = useTranslation();\n return (\n <SimpleDialog\n open={props.open}\n title={t(\"orderEntry.orderConfirm\")}\n closable\n onOpenChange={props.onOpenChange}\n size=\"sm\"\n actions={{\n primary: {\n label: t(\"orderEntry.placeOrderNow\"),\n className: \"oui-text-sm oui-font-semibold oui-w-[100%] oui-h-8\",\n onClick: () => {\n props.onConfirm();\n return Promise.resolve();\n },\n },\n secondary: {\n label: t(\"common.cancel\"),\n className: \"oui-text-sm oui-font-semibold oui-w-[100%] oui-h-8\",\n onClick: () => {\n props.onOpenChange(false);\n return Promise.resolve();\n },\n },\n }}\n >\n <div className=\"oui-text-2xs lg:oui-text-sm\">\n {t(\"orderEntry.maxQty.reminder.content\", {\n maxQty: `${props.maxQty} ${props.base}`,\n })}\n </div>\n </SimpleDialog>\n );\n});\n","import { forwardRef, SVGProps, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport {\n Button,\n Flex,\n Grid,\n DataTable,\n cn,\n Badge,\n TokenIcon,\n Tooltip,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n ScaledOrderConfirmScriptOptions,\n ScaledOrderConfirmScriptReturns,\n} from \"./scaledOrderConfirm.script\";\n\nexport type ScaledOrderConfirmProps = ScaledOrderConfirmScriptOptions &\n ScaledOrderConfirmScriptReturns & {\n close?: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n };\n\nexport const ScaledOrderConfirm = (props: ScaledOrderConfirmProps) => {\n const { order, symbolInfo, dataSource, national, askAndBid, totalQuantity } =\n props;\n const { base, quote, base_dp, quote_dp } = symbolInfo;\n const { t } = useTranslation();\n\n const onCancel = () => {\n props.reject();\n props.close?.();\n };\n\n const onConfirm = () => {\n props.resolve();\n props.close?.();\n };\n\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n width: 125,\n render: (value: string, record: any) => {\n return (\n <Flex gap={2}>\n <div\n className={cn(\n \"oui-h-[38px] oui-w-1 oui-shrink-0 oui-rounded-[1px]\",\n record.side === OrderSide.BUY\n ? \"oui-bg-trade-profit\"\n : \"oui-bg-trade-loss\",\n )}\n />\n <Flex direction=\"column\" itemAlign=\"start\">\n <Flex gapX={1}>\n <TokenIcon symbol={value} className=\"oui-size-3\" />\n <Text.formatted\n rule=\"symbol\"\n size=\"xs\"\n formatString=\"base-type\"\n >\n {value}\n </Text.formatted>\n </Flex>\n\n <Badge color=\"neutral\" size=\"xs\">\n {t(\"orderEntry.orderType.limit\")}\n </Badge>\n </Flex>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.quantity\"),\n dataIndex: \"order_quantity\",\n width: 100,\n render: (value: string, record: any) => {\n return (\n <Text.numeral\n rule=\"price\"\n dp={base_dp}\n padding={false}\n color={record.side === OrderSide.BUY ? \"buy\" : \"sell\"}\n >\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.orderPrice\"),\n dataIndex: \"order_price\",\n width: 100,\n render: (value: string, record: any) => {\n // buy: limit_price_i >= ask0 , show warning.\n // sell: limit price <= bid0 , show warning.\n const showWarning = !!(record.side === OrderSide.BUY\n ? askAndBid?.[0] && Number(value) >= askAndBid?.[0]\n : askAndBid?.[1] && Number(value) <= askAndBid?.[1]);\n\n return (\n <Flex gapX={1}>\n <Text.numeral rule=\"price\" dp={quote_dp}>\n {value}\n </Text.numeral>\n\n {showWarning && (\n <Tooltip\n content={t(\n \"orderEntry.confirmScaledOrder.orderPrice.warning\",\n )}\n className=\"oui-w-[240px] oui-text-2xs oui-font-semibold oui-text-base-contrast-80\"\n >\n <TooltipIcon className=\"oui-text-warning-darken\" />\n </Tooltip>\n )}\n </Flex>\n );\n },\n },\n ];\n }, [t, symbolInfo, askAndBid, base_dp, quote_dp]);\n\n return (\n <div className=\"oui-font-semibold\">\n <DataTable\n classNames={{\n root: cn(\n \"oui-bg-base-7\",\n \"oui-rounded-lg\",\n // need to set overflow hidden because table header will avoid the border radius\n \"oui-overflow-hidden\",\n // \"oui-text-2xs lg:oui-text-xs\",\n // if orders is greater than 6, set the height to 320px to show scroll bar\n order.orders?.length >= 6 && \"oui-h-[320px]\",\n ),\n // set the min height of the table to show 2 rows\n scroll: \"!oui-min-h-[130px]\",\n }}\n dataSource={dataSource}\n columns={columns}\n bordered\n onRow={() => {\n return {\n className: cn(\"oui-h-[50px]\"),\n };\n }}\n />\n <div className=\"oui-mb-5 oui-mt-4 oui-text-2xs\">\n <Flex justify=\"between\">\n <Text>{t(\"orderEntry.totalOrders\")}</Text>\n <Text intensity={80}>{order.orders?.length}</Text>\n </Flex>\n\n <Flex justify=\"between\" mt={2}>\n <Text>{t(\"orderEntry.totalQuantity\")}</Text>\n <Text.numeral\n rule=\"price\"\n unit={base}\n dp={base_dp}\n padding={false}\n intensity={80}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {totalQuantity}\n </Text.numeral>\n </Flex>\n\n <Flex justify=\"between\" mt={2}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.numeral\n rule=\"price\"\n unit={quote}\n dp={quote_dp}\n padding={false}\n intensity={80}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {national}\n </Text.numeral>\n </Flex>\n </div>\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={onCancel}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={onConfirm}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n </div>\n );\n};\n\nexport const TooltipIcon = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => {\n return (\n <svg\n width=\"12\"\n height=\"13\"\n viewBox=\"0 0 12 13\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n {...props}\n >\n <path d=\"M5.99951 1.50708C3.23811 1.50708 0.999512 3.74558 0.999512 6.50708C0.999512 9.26858 3.23811 11.5071 5.99951 11.5071C8.76091 11.5071 10.9995 9.26858 10.9995 6.50708C10.9995 3.74558 8.76091 1.50708 5.99951 1.50708ZM5.99951 4.00708C6.27566 4.00708 6.49951 4.23108 6.49951 4.50708C6.49951 4.78308 6.27566 5.00708 5.99951 5.00708C5.72336 5.00708 5.49951 4.78308 5.49951 4.50708C5.49951 4.23108 5.72336 4.00708 5.99951 4.00708ZM5.99951 5.50708C6.27566 5.50708 6.49951 5.73108 6.49951 6.00708V8.50708C6.49951 8.78308 6.27566 9.00708 5.99951 9.00708C5.72336 9.00708 5.49951 8.78308 5.49951 8.50708V6.00708C5.49951 5.73108 5.72336 5.50708 5.99951 5.50708Z\" />\n </svg>\n );\n },\n);\n","import { useMemo } from \"react\";\nimport { API, OrderlyOrder } from \"@orderly.network/types\";\nimport { Decimal, zero } from \"@orderly.network/utils\";\nimport { useAskAndBid } from \"../../../hooks/useAskAndBid\";\n\nexport type ScaledOrderConfirmScriptOptions = {\n order: OrderlyOrder & {\n orders: OrderlyOrder[];\n };\n symbolInfo: API.SymbolExt;\n};\n\nexport type ScaledOrderConfirmScriptReturns = ReturnType<\n typeof useScaledOrderConfirmScript\n>;\n\nexport function useScaledOrderConfirmScript(\n options: ScaledOrderConfirmScriptOptions,\n) {\n const { order, symbolInfo } = options;\n const orders = order.orders;\n\n const askAndBid = useAskAndBid();\n\n const national = useMemo(() => {\n const national = orders.reduce((acc, order) => {\n return acc.add(new Decimal(order.order_price).mul(order.order_quantity));\n }, zero);\n\n return national.toNumber();\n }, [orders]);\n\n const totalQuantity = useMemo(() => {\n const totalQuantity = orders.reduce((acc, order) => {\n return acc.add(new Decimal(order.order_quantity));\n }, zero);\n\n return totalQuantity.toString();\n }, [orders, symbolInfo.base_dp]);\n\n return { dataSource: orders, national, askAndBid, totalQuantity };\n}\n","import { useEffect, useState } from \"react\";\nimport { useDebouncedCallback, useEventEmitter } from \"@orderly.network/hooks\";\n\nexport function useAskAndBid() {\n const ee = useEventEmitter();\n\n const [askAndBid, setAskAndBid] = useState<[number, number]>([0, 0]);\n\n const onOrderBookUpdate = useDebouncedCallback((data: any) => {\n const ask0 = data.asks?.[data.asks.length - 1]?.[0];\n const bid0 = data.bids?.[0]?.[0];\n setAskAndBid([ask0, bid0]);\n }, 200);\n\n useEffect(() => {\n ee.on(\"orderbook:update\", onOrderBookUpdate);\n return () => {\n ee.off(\"orderbook:update\", onOrderBookUpdate);\n onOrderBookUpdate.cancel();\n };\n }, [onOrderBookUpdate]);\n\n return askAndBid;\n}\n","import { FC } from \"react\";\nimport { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog } from \"@orderly.network/ui\";\nimport { useScaledOrderConfirmScript } from \"./scaledOrderConfirm.script\";\nimport {\n ScaledOrderConfirm,\n ScaledOrderConfirmProps,\n} from \"./scaledOrderConfirm.ui\";\n\nexport type ScaledOrderConfirmWidgetProps = ScaledOrderConfirmProps;\n\nexport const ScaledOrderConfirmWidget: FC<ScaledOrderConfirmWidgetProps> = (\n props,\n) => {\n const state = useScaledOrderConfirmScript(props);\n\n return <ScaledOrderConfirm {...props} {...state} />;\n};\n\nexport const scaledOrderConfirmDialogId = \"scaledOrderConfirm\";\n\nregisterSimpleDialog(scaledOrderConfirmDialogId, ScaledOrderConfirmWidget, {\n size: \"md\",\n title: () => i18n.t(\"orderEntry.confirmScaledOrder\"),\n contentProps: {\n // className: \"oui-p-0\",\n },\n});\n","import { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderlyOrder, OrderSide, OrderType } from \"@orderly.network/types\";\nimport { Button, cn } from \"@orderly.network/ui\";\nimport { OrderTypeSelect } from \"../orderTypeSelect\";\nimport { LeverageBadge } from \"./LeverageBadge\";\n\ntype OrderEntryHeaderProps = {\n symbol: string;\n side: OrderSide;\n canTrade: boolean;\n order_type: OrderType;\n setOrderValue: (key: keyof OrderlyOrder, value: any) => void;\n symbolLeverage?: number;\n};\n\nexport function OrderEntryHeader(props: OrderEntryHeaderProps) {\n const { canTrade, side, order_type, setOrderValue } = props;\n const { t } = useTranslation();\n\n return (\n <>\n <div\n className={cn(\n \"oui-grid oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\",\n \"oui-grid-cols-2\",\n )}\n >\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.BUY);\n }}\n size={\"md\"}\n fullWidth\n data-type={OrderSide.BUY}\n className={cn(\n side === OrderSide.BUY && canTrade\n ? \"oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-buy-button\"\n >\n {t(\"common.buy\")}\n </Button>\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.SELL);\n }}\n data-type={OrderSide.SELL}\n fullWidth\n size={\"md\"}\n className={cn(\n side === OrderSide.SELL && props.canTrade\n ? \"oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-sell-button\"\n >\n {t(\"common.sell\")}\n </Button>\n </div>\n <div\n className={cn(\n \"oui-grid oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\",\n \"oui-grid-cols-2\",\n )}\n >\n <div className=\"oui-w-full\">\n <OrderTypeSelect\n type={order_type!}\n side={side}\n canTrade={canTrade}\n onChange={(type) => {\n setOrderValue(\"order_type\", type);\n }}\n />\n </div>\n <div className=\"oui-w-full\">\n <LeverageBadge\n symbol={props.symbol}\n side={props.side}\n symbolLeverage={props.symbolLeverage}\n />\n </div>\n </div>\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderSide, OrderType } from \"@orderly.network/types\";\nimport { Select, Text } from \"@orderly.network/ui\";\n\nexport const OrderTypeSelect = (props: {\n type: OrderType;\n onChange: (type: OrderType) => void;\n side: OrderSide;\n canTrade: boolean;\n}) => {\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n { label: t(\"orderEntry.orderType.limitOrder\"), value: OrderType.LIMIT },\n { label: t(\"orderEntry.orderType.marketOrder\"), value: OrderType.MARKET },\n {\n label: t(\"orderEntry.orderType.stopLimit\"),\n value: OrderType.STOP_LIMIT,\n },\n {\n label: t(\"orderEntry.orderType.stopMarket\"),\n value: OrderType.STOP_MARKET,\n },\n {\n label: t(\"orderEntry.orderType.scaledOrder\"),\n value: OrderType.SCALED,\n },\n {\n label: t(\"orderEntry.orderType.trailingStop\"),\n value: OrderType.TRAILING_STOP,\n },\n ];\n }, [t]);\n\n const displayLabelMap = useMemo(() => {\n return {\n [OrderType.LIMIT]: t(\"orderEntry.orderType.limit\"),\n [OrderType.MARKET]: t(\"common.marketPrice\"),\n [OrderType.STOP_LIMIT]: t(\"orderEntry.orderType.stopLimit\"),\n [OrderType.STOP_MARKET]: t(\"orderEntry.orderType.stopMarket\"),\n [OrderType.SCALED]: t(\"orderEntry.orderType.scaledOrder\"),\n [OrderType.TRAILING_STOP]: t(\"orderEntry.orderType.trailingStop\"),\n };\n }, [t]);\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-orderType-button\"\n currentValue={props.type}\n value={props.type}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8\",\n }}\n classNames={{\n trigger: \"oui-bg-base-6 oui-border-line\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n if (!item) {\n return <Text size={\"xs\"}>{option.placeholder}</Text>;\n }\n\n const label = displayLabelMap[value as keyof typeof displayLabelMap];\n\n return (\n <Text\n size={\"xs\"}\n color={\n props.canTrade\n ? props.side === OrderSide.BUY\n ? \"buy\"\n : \"sell\"\n : undefined\n }\n >\n {label}\n </Text>\n );\n }}\n size={\"md\"}\n />\n );\n};\n","import { useSymbolLeverage } from \"@orderly.network/hooks\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport { cn, Flex, modal, Text, useScreen } from \"@orderly.network/ui\";\nimport {\n SymbolLeverageDialogId,\n SymbolLeverageSheetId,\n} from \"@orderly.network/ui-leverage\";\nimport { Decimal } from \"@orderly.network/utils\";\n\ntype LeverageBadgeProps = {\n symbol: string;\n side: OrderSide;\n symbolLeverage?: number;\n};\n\nexport const LeverageBadge = (props: LeverageBadgeProps) => {\n const { symbol, side, symbolLeverage } = props;\n const { isMobile } = useScreen();\n const { maxLeverage } = useSymbolLeverage(symbol);\n\n const curLeverage = symbolLeverage || maxLeverage;\n\n const showModal = () => {\n const modalId = isMobile ? SymbolLeverageSheetId : SymbolLeverageDialogId;\n modal.show(modalId, {\n symbol,\n side,\n curLeverage,\n });\n };\n\n return (\n <Flex\n justify=\"center\"\n itemAlign=\"center\"\n gapX={1}\n className={cn(\n \"oui-h-8\",\n \"oui-rounded oui-border oui-border-line oui-bg-base-6\",\n \"oui-cursor-pointer oui-select-none oui-text-xs oui-font-semibold oui-text-base-contrast-54\",\n )}\n onClick={showModal}\n >\n <Text>Cross</Text>\n <Text.numeral dp={0} rm={Decimal.ROUND_DOWN} unit=\"X\">\n {curLeverage}\n </Text.numeral>\n </Flex>\n );\n};\n","import { FC, PropsWithChildren, useMemo } from \"react\";\nimport { OrderEntryContext, OrderEntryContextState } from \"./orderEntryContext\";\n\nexport const OrderEntryProvider: FC<\n PropsWithChildren<OrderEntryContextState>\n> = (props) => {\n const {\n errorMsgVisible,\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n setOrderValues,\n currentFocusInput,\n errors,\n priceInputRef,\n priceInputContainerRef,\n triggerPriceInputRef,\n activatedPriceInputRef,\n lastQuantityInputType,\n leverage,\n } = props;\n\n const memoizedValue = useMemo<OrderEntryContextState>(() => {\n return {\n errorMsgVisible,\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n setOrderValues,\n currentFocusInput,\n errors,\n // refs\n priceInputRef,\n priceInputContainerRef,\n triggerPriceInputRef,\n activatedPriceInputRef,\n lastQuantityInputType,\n leverage,\n };\n }, [\n errorMsgVisible,\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n setOrderValues,\n currentFocusInput,\n errors,\n\n priceInputRef,\n priceInputContainerRef,\n triggerPriceInputRef,\n activatedPriceInputRef,\n lastQuantityInputType,\n leverage,\n ]);\n\n return (\n <OrderEntryContext.Provider value={memoizedValue}>\n {props.children}\n </OrderEntryContext.Provider>\n );\n};\n","import {\n createContext,\n FocusEventHandler,\n useContext,\n RefObject,\n MutableRefObject,\n} from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { API, OrderlyOrder } from \"@orderly.network/types\";\nimport { InputType, QuantityInputType } from \"../types\";\n\nexport type OrderEntryContextState = {\n errors: OrderValidationResult | null;\n errorMsgVisible: boolean;\n symbolInfo: API.SymbolExt;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n getErrorMsg: (\n key: keyof OrderValidationResult,\n customValue?: string,\n ) => string;\n setOrderValue: (key: keyof OrderlyOrder, value: any) => void;\n setOrderValues: (values: Partial<OrderlyOrder>) => void;\n currentFocusInput: InputType;\n // refs\n priceInputRef: RefObject<HTMLInputElement>;\n priceInputContainerRef: RefObject<HTMLDivElement>;\n triggerPriceInputRef: RefObject<HTMLInputElement>;\n activatedPriceInputRef: RefObject<HTMLInputElement>;\n lastQuantityInputType: MutableRefObject<InputType>;\n leverage?: number;\n};\n\nexport const OrderEntryContext = createContext<OrderEntryContextState>(\n {} as OrderEntryContextState,\n);\n\nexport const useOrderEntryContext = () => {\n return useContext(OrderEntryContext);\n};\n","import { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { PriceInput, PriceInputProps } from \"./limit/priceInput\";\nimport { QtyAndTotalInput } from \"./qtyAndTotal/qtyAndTotalInput\";\nimport { ScaledOrderInput } from \"./scaledOrder\";\nimport { TriggerPriceInput } from \"./stop/triggerPriceInput\";\nimport { TrailingStopInput } from \"./trailingStop\";\n\nexport type OrderInputProps = {\n values: Partial<OrderlyOrder>;\n} & Omit<PriceInputProps, \"order_price\" | \"order_type\">;\n\nexport function OrderInput(props: OrderInputProps) {\n const { values } = props;\n\n const type = values.order_type;\n\n if (type === OrderType.SCALED) {\n return <ScaledOrderInput values={values} />;\n }\n\n if (type === OrderType.TRAILING_STOP) {\n return <TrailingStopInput values={values} />;\n }\n\n const showTriggerPrice =\n type === OrderType.STOP_LIMIT || type === OrderType.STOP_MARKET;\n\n const showPrice = type === OrderType.LIMIT || type === OrderType.STOP_LIMIT;\n\n const triggerPriceInput = showTriggerPrice && (\n <TriggerPriceInput trigger_price={values.trigger_price} />\n );\n\n const priceInput = showPrice && (\n <PriceInput\n order_type={values.order_type!}\n order_price={values.order_price}\n bbo={props.bbo}\n fillMiddleValue={props.fillMiddleValue}\n priceInputContainerWidth={props.priceInputContainerWidth}\n />\n );\n\n return (\n <div className={\"oui-space-y-1\"}>\n {triggerPriceInput}\n {priceInput}\n <QtyAndTotalInput\n order_quantity={values.order_quantity}\n total={values.total}\n />\n </div>\n );\n}\n","import { FC } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { cn, inputFormatter } from \"@orderly.network/ui\";\nimport { OrderEntryScriptReturn } from \"../../../orderEntry.script\";\nimport { InputType } from \"../../../types\";\nimport { BBOStatus } from \"../../../utils\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\nimport { BBOOrderTypeSelect } from \"./bboOrderTypeSelect\";\nimport { LimitPriceSuffix } from \"./limitPriceSuffix\";\n\nexport type PriceInputProps = {\n order_type: OrderType;\n order_price?: string;\n bbo: Pick<\n OrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n priceInputContainerWidth?: number;\n fillMiddleValue: OrderEntryScriptReturn[\"fillMiddleValue\"];\n};\n\n// TODO: memo component\nexport const PriceInput: FC<PriceInputProps> = (props) => {\n const { bbo } = props;\n const { t } = useTranslation();\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n priceInputRef,\n priceInputContainerRef,\n } = useOrderEntryContext();\n\n const { quote, quote_dp } = symbolInfo;\n\n const readOnly = bbo.bboStatus === BBOStatus.ON;\n\n const suffix =\n props.order_type === OrderType.LIMIT ? (\n <LimitPriceSuffix\n quote={quote}\n bbo={bbo}\n fillMiddleValue={props.fillMiddleValue}\n />\n ) : (\n quote\n );\n\n return (\n <div\n ref={priceInputContainerRef}\n className=\"oui-group oui-relative oui-w-full\"\n >\n <CustomInput\n id=\"order_price_input\"\n name=\"order_price_input\"\n label={t(\"common.price\")}\n suffix={suffix}\n value={props.order_price}\n onChange={(e) => {\n setOrderValue(\"order_price\", e);\n }}\n error={getErrorMsg(\"order_price\")}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.PRICE)}\n onBlur={onBlur(InputType.PRICE)}\n readonly={readOnly}\n ref={priceInputRef}\n classNames={{\n root: cn(readOnly && \"focus-within:oui-outline-transparent \"),\n input: cn(readOnly && \"oui-cursor-auto\"),\n }}\n />\n {bbo.bboStatus === BBOStatus.ON && (\n <div className={cn(\"oui-absolute oui-bottom-1 oui-left-0\")}>\n <BBOOrderTypeSelect\n value={bbo.bboType}\n onChange={bbo.onBBOChange}\n contentStyle={{\n width: props.priceInputContainerWidth,\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","import { forwardRef, PropsWithChildren, ReactNode } from \"react\";\nimport { EMPTY_LIST } from \"@orderly.network/types\";\nimport { cn, inputFormatter, Input, InputProps } from \"@orderly.network/ui\";\nimport { useOrderEntryContext } from \"../orderEntryContext\";\n\nexport type CustomInputProps = {\n label: string;\n suffix?: ReactNode;\n placeholder?: string;\n id: string;\n className?: string;\n name?: string;\n onChange?: (value: string) => void;\n value?: InputProps[\"value\"];\n autoFocus?: InputProps[\"autoFocus\"];\n error?: string;\n onFocus?: InputProps[\"onFocus\"];\n onBlur?: InputProps[\"onBlur\"];\n formatters?: InputProps[\"formatters\"];\n overrideFormatters?: InputProps[\"formatters\"];\n classNames?: InputProps[\"classNames\"];\n readonly?: boolean;\n prefix?: ReactNode;\n};\n\nexport const CustomInput = forwardRef<HTMLInputElement, CustomInputProps>(\n (props, ref) => {\n const { placeholder = \"0\" } = props;\n const { errorMsgVisible } = useOrderEntryContext();\n\n return (\n <Input.tooltip\n ref={ref}\n tooltip={errorMsgVisible ? props.error : undefined}\n autoComplete={\"off\"}\n autoFocus={props.autoFocus}\n size={\"lg\"}\n placeholder={props.readonly ? \"\" : placeholder}\n id={props.id}\n name={props.name}\n color={props.error ? \"danger\" : undefined}\n prefix={\n props.prefix || (\n <InputLabel id={props.id} className={props.classNames?.prefix}>\n {props.label}\n </InputLabel>\n )\n }\n suffix={props.suffix}\n value={props.readonly ? \"\" : props.value || \"\"}\n // onChange={props.onChange}\n onValueChange={props.onChange}\n onFocus={(event) => {\n props.onFocus?.(event);\n }}\n onBlur={(event) => {\n props.onBlur?.(event);\n }}\n formatters={\n props.overrideFormatters || [\n ...(props.formatters ?? EMPTY_LIST),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]\n }\n classNames={{\n root: cn(\n \"orderly-order-entry oui-relative oui-h-[54px] oui-rounded oui-border oui-border-solid oui-border-line oui-px-2 oui-py-1 group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className,\n props.classNames?.root,\n ),\n input: cn(\"oui-mb-1 oui-mt-5 oui-h-5\", props?.classNames?.input),\n // prefix: cn(props.classNames?.prefix),\n suffix: cn(\n \"oui-absolute oui-right-0 oui-top-0 oui-justify-start oui-py-2 oui-text-2xs oui-text-base-contrast-36\",\n props.classNames?.suffix,\n ),\n }}\n readOnly={props.readonly}\n />\n );\n },\n);\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (\n props: PropsWithChildren<{ id: string; className?: string }>,\n) => {\n return (\n <label\n htmlFor={props.id}\n className={cn(\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-2xs oui-text-base-contrast-36\",\n props.className,\n )}\n >\n {props.children}\n </label>\n );\n};\n","import { CSSProperties, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { BBOOrderType } from \"@orderly.network/types\";\nimport { Box, Select, Text } from \"@orderly.network/ui\";\n\nexport const BBOOrderTypeSelect = (props: {\n value?: BBOOrderType;\n onChange: (value: BBOOrderType) => void;\n contentStyle?: CSSProperties;\n}) => {\n const { t } = useTranslation();\n\n const options = useMemo(\n () => [\n {\n label: t(\"orderEntry.bbo.counterparty1\"),\n value: BBOOrderType.COUNTERPARTY1,\n },\n {\n label: t(\"orderEntry.bbo.counterparty5\"),\n value: BBOOrderType.COUNTERPARTY5,\n },\n {\n label: t(\"orderEntry.bbo.queue1\"),\n value: BBOOrderType.QUEUE1,\n },\n {\n label: t(\"orderEntry.bbo.queue5\"),\n value: BBOOrderType.QUEUE5,\n },\n ],\n [],\n );\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-bbo-orderType-button\"\n currentValue={props.value}\n value={props.value}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n style: props.contentStyle,\n }}\n size={\"sm\"}\n classNames={{\n trigger: \"oui-border-none oui-bg-transparent\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((item) => item.value === value);\n\n return (\n <Box>\n <Text size=\"sm\">{item?.label}</Text>\n </Box>\n );\n }}\n />\n );\n};\n","import { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, cn, modal, Text } from \"@orderly.network/ui\";\nimport { OrderEntryScriptReturn } from \"../../../orderEntry.script\";\nimport { BBOStatus } from \"../../../utils\";\n\ntype LimitPriceSuffixProps = {\n quote: string;\n bbo: Pick<\n OrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n fillMiddleValue: OrderEntryScriptReturn[\"fillMiddleValue\"];\n};\n\nexport const LimitPriceSuffix = (props: LimitPriceSuffixProps) => {\n const { quote, bbo, fillMiddleValue } = props;\n const { t } = useTranslation();\n\n return (\n <Flex\n direction=\"column\"\n itemAlign=\"end\"\n className={cn(\"oui-order-entry-limit-price-input-suffix\", \"oui-text-2xs\")}\n >\n {quote}\n <Flex justify={\"end\"} itemAlign=\"center\" gap={2}>\n <Flex\n px={3}\n height={20}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"base\"\n className={cn(\n \"oui-mt-[2px] oui-cursor-pointer oui-select-none oui-border\",\n bbo.bboStatus === BBOStatus.ON\n ? \"oui-border-primary\"\n : \"oui-border-line-12\",\n bbo.bboStatus === BBOStatus.DISABLED && \"oui-cursor-not-allowed\",\n )}\n onClick={() => {\n if (bbo.bboStatus === BBOStatus.DISABLED) {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: (\n <Text intensity={54}>\n {t(\"orderEntry.bbo.disabled.tips\")}\n </Text>\n ),\n });\n } else {\n bbo.toggleBBO();\n }\n }}\n >\n <Text\n className={cn(\n bbo.bboStatus === BBOStatus.ON && \"oui-text-primary\",\n bbo.bboStatus === BBOStatus.OFF && \"oui-text-base-contrast-54\",\n bbo.bboStatus === BBOStatus.DISABLED &&\n \"oui-text-base-contrast-20\",\n )}\n >\n {t(\"orderEntry.bbo\")}\n </Text>\n </Flex>\n <Text\n className={cn(\n \"oui-select-none\",\n \"oui-cursor-pointer oui-text-primary\",\n )}\n onClick={fillMiddleValue}\n >\n Mid\n </Text>\n </Flex>\n </Flex>\n );\n};\n","import { FC, memo } from \"react\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { QuantityInput } from \"./quantityInput\";\nimport { TotalInput } from \"./totalInput\";\n\ntype QtyAndTotalInputProps = {\n order_quantity?: string;\n total?: string;\n};\n\nexport const QtyAndTotalInput: FC<QtyAndTotalInputProps> = memo((props) => {\n return (\n <Grid cols={2} className=\"oui-group oui-space-x-1\">\n <QuantityInput order_quantity={props.order_quantity} />\n <TotalInput total={props.total} />\n </Grid>\n );\n});\n\nQtyAndTotalInput.displayName = \"QtyAndTotalInput\";\n","import { FC, memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype QuantityInputProps = {\n order_quantity?: string;\n};\n\nexport const QuantityInput: FC<QuantityInputProps> = memo((props) => {\n const { t } = useTranslation();\n\n const { symbolInfo, onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n const { base, base_dp } = symbolInfo;\n\n return (\n <CustomInput\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n label={t(\"common.qty\")}\n suffix={base}\n error={getErrorMsg(\"order_quantity\")}\n value={props.order_quantity}\n onChange={(e) => {\n setOrderValue(\"order_quantity\", e);\n }}\n formatters={[inputFormatter.dpFormatter(base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n className=\"!oui-rounded-r\"\n classNames={{\n suffix: \"oui-justify-end\",\n }}\n />\n );\n});\n\nQuantityInput.displayName = \"QuantityInput\";\n","import { FC, memo, useEffect, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\nimport { OrderTotalType, TotalTypeSelect } from \"./totalTypeSelect\";\n\ntype TotalInputProps = {\n total?: string;\n};\n\n/**\n * order size = order size (notional) = quantity * price\n * Initial margin = order size / leverage = quantity * price / leverage\n * Order size = Initial margin * leverage = quantity * price\n */\nexport const TotalInput: FC<TotalInputProps> = memo((props) => {\n const { t } = useTranslation();\n const { total } = props;\n\n const [margin, setMargin] = useState(\"\");\n\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n leverage = 1,\n currentFocusInput,\n } = useOrderEntryContext();\n\n const { quote } = symbolInfo;\n\n const [totalType, setTotalType] = useLocalStorage<OrderTotalType>(\n \"orderly_order_total_type\",\n OrderTotalType.OrderSize,\n );\n\n useEffect(() => {\n if (total) {\n if (currentFocusInput !== InputType.MARGIN) {\n const margin = new Decimal(total).div(leverage).todp(2).toString();\n setMargin(margin);\n }\n } else {\n setMargin(\"\");\n }\n }, [total, leverage, currentFocusInput]);\n\n const onMarginChange = (val: string) => {\n const total = val ? new Decimal(val).mul(leverage).toString() : \"\";\n setOrderValue(\"total\", total);\n setMargin(val);\n };\n\n const prefix = <TotalTypeSelect value={totalType} onChange={setTotalType} />;\n\n if (totalType === OrderTotalType.InitialMargin) {\n return (\n <CustomInput\n id=\"order_margin_input\"\n name=\"order_margin_input\"\n label={`${t(\"orderEntry.initialMargin\")}≈`}\n prefix={prefix}\n suffix={quote}\n error={getErrorMsg(\"total\") ? \"initial margin error\" : \"\"}\n value={margin}\n onChange={onMarginChange}\n // national precision is 2\n formatters={[inputFormatter.dpFormatter(2)]}\n onFocus={onFocus(InputType.MARGIN)}\n onBlur={onBlur(InputType.MARGIN)}\n className=\"!oui-rounded-l\"\n classNames={{\n suffix: \"oui-justify-end\",\n }}\n />\n );\n }\n\n return (\n <CustomInput\n id=\"order_total_input\"\n name=\"order_total_input\"\n label={`${t(\"orderEntry.orderSize\")}≈`}\n prefix={prefix}\n suffix={quote}\n error={getErrorMsg(\"total\")}\n value={props.total}\n onChange={(val) => {\n setOrderValue(\"total\", val);\n }}\n className=\"!oui-rounded-l\"\n classNames={{\n suffix: \"oui-justify-end\",\n }}\n // national precision is 2\n formatters={[inputFormatter.dpFormatter(2)]}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n />\n );\n});\n\nTotalInput.displayName = \"TotalInput\";\n","import { FC, memo, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { cn, Select } from \"@orderly.network/ui\";\n\nexport enum OrderTotalType {\n OrderSize = \"orderSize\",\n InitialMargin = \"initialMargin\",\n}\n\ntype TotalTypeSelectProps = {\n value: OrderTotalType;\n onChange: (value: OrderTotalType) => void;\n};\n\nexport const TotalTypeSelect: FC<TotalTypeSelectProps> = memo((props) => {\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n {\n label: t(\"orderEntry.orderSize\"),\n value: OrderTotalType.OrderSize,\n },\n {\n label: t(\"orderEntry.initialMargin\"),\n value: OrderTotalType.InitialMargin,\n },\n ];\n }, [t]);\n\n return (\n <Select.options\n size={\"xs\"}\n value={props.value}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n return item?.label + \"≈\";\n }}\n classNames={{\n trigger: cn(\n \"oui-w-auto oui-border-none oui-bg-transparent\",\n \"oui-absolute oui-left-0 oui-top-[5px] oui-text-2xs oui-text-base-contrast-36\",\n ),\n }}\n onValueChange={props.onChange}\n options={options}\n />\n );\n});\n\nTotalTypeSelect.displayName = \"TotalTypeSelect\";\n","import { DistributionType, OrderlyOrder } from \"@orderly.network/types\";\nimport { cn, Grid } from \"@orderly.network/ui\";\nimport { QuantityDistributionInput } from \"./quantityDistributionInput\";\nimport { ScaledPriceInput } from \"./scaledPriceInput\";\nimport { ScaledQuantityInput } from \"./scaledQuantityInput\";\nimport { SkewInput } from \"./skewInput\";\nimport { TotalOrdersInput } from \"./totalOrdersInput\";\n\ntype ScaledOrderInputProps = {\n values: Partial<OrderlyOrder>;\n};\n\nexport const ScaledOrderInput = (props: ScaledOrderInputProps) => {\n const { values } = props;\n\n const showSkewInput = values.distribution_type === DistributionType.CUSTOM;\n\n return (\n <div className=\"oui-space-y-1\">\n <ScaledPriceInput\n start_price={values.start_price}\n end_price={values.end_price}\n />\n\n <Grid cols={2} className=\"oui-group oui-space-x-1\">\n <ScaledQuantityInput\n order_quantity={values.order_quantity}\n total={values.total}\n />\n <TotalOrdersInput total_orders={values.total_orders} />\n </Grid>\n\n <QuantityDistributionInput\n distribution_type={values.distribution_type}\n className={cn(!showSkewInput && \"oui-rounded-b-xl\")}\n />\n\n {showSkewInput && <SkewInput skew={values.skew} />}\n </div>\n );\n};\n","import { FC, memo, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { DistributionType } from \"@orderly.network/types\";\nimport { Box, Checkbox, cn, Flex, modal, Text } from \"@orderly.network/ui\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\nexport type QuantityDistributionInputProps = {\n distribution_type?: DistributionType;\n className?: string;\n};\n\nexport const QuantityDistributionInput: FC<QuantityDistributionInputProps> =\n memo((props) => {\n const { t } = useTranslation();\n const { setOrderValue } = useOrderEntryContext();\n\n const showHint = () => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"sm\",\n content: <QuantityDistributionHint value={props.distribution_type} />,\n // classNames: {\n // content: \"oui-bg-base-6\",\n // },\n });\n };\n\n return (\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n justify=\"center\"\n p={2}\n r=\"base\"\n // gapY={1}\n width=\"100%\"\n intensity={600}\n className={cn(\n \"oui-t-rounded oui-text-base-contrast-36\",\n \"oui-border oui-border-solid oui-border-line\",\n props.className,\n )}\n >\n <Text\n size=\"2xs\"\n className=\"oui-cursor-pointer oui-border-b oui-border-dashed oui-border-line-12\"\n onClick={showHint}\n >\n {t(\"orderEntry.quantityDistribution\")}\n </Text>\n <QuantityDistribution\n value={props.distribution_type}\n onValueChange={(value) => {\n setOrderValue(\"distribution_type\", value);\n }}\n />\n </Flex>\n );\n });\n\ntype QuantityDistributionHintProps = {\n value?: DistributionType;\n};\n\nconst QuantityDistributionHint: FC<QuantityDistributionHintProps> = (props) => {\n const { t } = useTranslation();\n const [type, setType] = useState(DistributionType.FLAT);\n\n useEffect(() => {\n setType(\n [\n DistributionType.FLAT,\n DistributionType.ASCENDING,\n DistributionType.DESCENDING,\n ].includes(props.value!)\n ? props.value!\n : DistributionType.FLAT,\n );\n }, [props.value]);\n\n const content = useMemo(() => {\n return [\n {\n type: DistributionType.FLAT,\n title: t(\"orderEntry.distributionType.flat\"),\n description: t(\"orderEntry.distributionType.flat.description\"),\n formula: `${t(\"orderEntry.skew\")} = 1`,\n quantity: <FlatQuantity />,\n },\n {\n type: DistributionType.ASCENDING,\n title: t(\"orderEntry.distributionType.ascending\"),\n description: t(\"orderEntry.distributionType.ascending.description\"),\n formula: `${t(\"orderEntry.skew\")} > 1`,\n quantity: <AscendingQuantity />,\n },\n {\n type: DistributionType.DESCENDING,\n title: t(\"orderEntry.distributionType.descending\"),\n description: t(\"orderEntry.distributionType.descending.description\"),\n formula: `0 < ${t(\"orderEntry.skew\")} < 1`,\n quantity: <DescendingQuantity />,\n },\n ];\n }, []);\n\n const currentContent = useMemo(() => {\n return content.find((item) => item.type === type);\n }, [content, type]);\n\n return (\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-54\">\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text intensity={80}>\n {t(\"orderEntry.quantityDistribution.description\")}\n </Text>\n <Text>{t(\"orderEntry.quantityDistribution.formula\")}</Text>\n </Flex>\n <Flex intensity={600} p={1} r=\"base\" mt={3} itemAlign=\"start\">\n <Flex direction=\"column\" itemAlign=\"start\">\n {content.map((item) => (\n <Box\n key={item.title}\n intensity={type === item.type ? 500 : 600}\n width={78}\n p={2}\n className=\"oui-cursor-pointer oui-rounded-l\"\n onClick={() => {\n setType(item.type);\n }}\n >\n <Text>{item.title}</Text>\n </Box>\n ))}\n </Flex>\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n gapY={1}\n p={2}\n intensity={500}\n width=\"100%\"\n className={cn(\n \"oui-rounded-r\",\n type === DistributionType.FLAT && \"oui-rounded-bl\",\n type === DistributionType.ASCENDING && \"oui-rounded-l\",\n type === DistributionType.DESCENDING && \"oui-rounded-tl\",\n )}\n >\n <div>{currentContent?.formula}</div>\n <Text>{currentContent?.description}</Text>\n <Flex width=\"100%\" justify=\"center\">\n {currentContent?.quantity}\n </Flex>\n <Flex width=\"100%\" gapX={1} justify=\"center\">\n <Text className=\"oui-text-base-1\">{t(\"common.price\")}</Text>\n <PriceChart />\n </Flex>\n </Flex>\n </Flex>\n </div>\n );\n};\n\ntype QuantityDistributionProps = {\n value?: DistributionType;\n onValueChange: (value: DistributionType) => void;\n};\n\nconst QuantityDistribution: FC<QuantityDistributionProps> = (props) => {\n const { value, onValueChange } = props;\n const { t } = useTranslation();\n\n const onChange = (value: DistributionType) => (checked: boolean) => {\n onValueChange(value);\n };\n\n const distributionTypeMap = useMemo(() => {\n return {\n [DistributionType.FLAT]: t(\"orderEntry.distributionType.flat\"),\n [DistributionType.ASCENDING]: t(\n \"orderEntry.distributionType.ascending.abbr\",\n ),\n [DistributionType.DESCENDING]: t(\n \"orderEntry.distributionType.descending.abbr\",\n ),\n [DistributionType.CUSTOM]: t(\"orderEntry.distributionType.custom\"),\n };\n }, [t]);\n\n return (\n <Flex className={cn(\"oui-gap-x-[6px] lg:oui-gap-x-2\")} wrap=\"wrap\">\n {Object.values(DistributionType).map((type) => {\n return (\n <Flex itemAlign={\"center\"} key={type}>\n <Checkbox\n id={`distribution-type-${type}`}\n color={\"white\"}\n variant={\"radio\"}\n checked={value === type}\n onCheckedChange={onChange(type)}\n />\n <label\n htmlFor={`distribution-type-${type}`}\n className={cn(\n \"oui-text-2xs\",\n \"oui-ml-1\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {distributionTypeMap[type]}\n </label>\n </Flex>\n );\n })}\n </Flex>\n );\n};\n\nconst FlatQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"18\"\n y=\"18\"\n width=\"181\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"15\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"62\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"109\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"156\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"203\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n};\n\nconst AscendingQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"18\"\n y=\"18\"\n width=\"181\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"15\"\n cy=\"20\"\n r=\"4.28571\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.42857\"\n />\n <circle\n cx=\"62\"\n cy=\"20\"\n r=\"5.14286\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.71429\"\n />\n <circle\n cx=\"109\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"156\"\n cy=\"20\"\n r=\"6.85714\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.28571\"\n />\n <circle\n cx=\"203\"\n cy=\"20\"\n r=\"7.71429\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.57143\"\n />\n </svg>\n );\n};\n\nconst DescendingQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n width=\"181\"\n height=\"4\"\n transform=\"matrix(-1 0 0 1 200 18)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"5\"\n cy=\"5\"\n r=\"4.28571\"\n transform=\"matrix(-1 0 0 1 208 15)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.42857\"\n />\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"5.14286\"\n transform=\"matrix(-1 0 0 1 162 14)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.71429\"\n />\n <circle\n cx=\"7\"\n cy=\"7\"\n r=\"6\"\n transform=\"matrix(-1 0 0 1 116 13)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6.85714\"\n transform=\"matrix(-1 0 0 1 70 12)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.28571\"\n />\n <circle\n cx=\"9\"\n cy=\"9\"\n r=\"7.71429\"\n transform=\"matrix(-1 0 0 1 24 11)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.57143\"\n />\n </svg>\n );\n};\n\nconst PriceChart = () => {\n return (\n <svg\n width=\"176\"\n height=\"8\"\n viewBox=\"0 0 176 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M175.354 4.35355C175.549 4.15829 175.549 3.84171 175.354 3.64645L172.172 0.464466C171.976 0.269204 171.66 0.269204 171.464 0.464466C171.269 0.659728 171.269 0.976311 171.464 1.17157L174.293 4L171.464 6.82843C171.269 7.02369 171.269 7.34027 171.464 7.53553C171.66 7.7308 171.976 7.7308 172.172 7.53553L175.354 4.35355ZM0 4V4.5H175V4V3.5H0V4Z\"\n fill=\"rgb(var(--oui-color-base-1))\"\n />\n </svg>\n );\n};\n","import { memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype ScaledPriceInputProps = {\n start_price?: string;\n end_price?: string;\n};\n\nexport const ScaledPriceInput = memo((props: ScaledPriceInputProps) => {\n const { t } = useTranslation();\n\n const { symbolInfo, onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n const { quote, quote_dp } = symbolInfo;\n\n return (\n <>\n <CustomInput\n label={t(\"orderEntry.startPrice\")}\n suffix={quote}\n id=\"order_start_price_input\"\n value={props.start_price}\n error={getErrorMsg(\"start_price\")}\n onChange={(e) => {\n setOrderValue(\"start_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.START_PRICE)}\n onBlur={onBlur(InputType.START_PRICE)}\n classNames={{\n root: \"oui-rounded-t-xl\",\n }}\n />\n <CustomInput\n label={t(\"orderEntry.endPrice\")}\n suffix={quote}\n id=\"order_end_price_input\"\n value={props.end_price}\n error={getErrorMsg(\"end_price\")}\n onChange={(val) => {\n setOrderValue(\"end_price\", val);\n }}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.END_PRICE)}\n onBlur={onBlur(InputType.END_PRICE)}\n />\n </>\n );\n});\n\nScaledPriceInput.displayName = \"ScaledPriceInput\";\n","import { memo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\nimport { ScaledQuantityUnit } from \"./scaledQuantityUnit\";\n\ntype ScaledQuantityInputProps = {\n order_quantity?: string;\n total?: string;\n};\n\nexport const ScaledQuantityInput = memo((props: ScaledQuantityInputProps) => {\n const { t } = useTranslation();\n const { errors, symbolInfo, onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n const [quantityUnit, setQuantityUnit] = useLocalStorage<\"quote\" | \"base\">(\n \"orderly_order_quantity_unit\",\n \"quote\",\n );\n\n const { base, quote, base_dp, quote_dp } = symbolInfo;\n\n const isBase = quantityUnit === \"base\";\n const unit = isBase ? base : quote;\n\n const suffix = (\n <ScaledQuantityUnit\n base={base}\n quote={quote}\n value={unit}\n onValueChange={(value) => {\n setQuantityUnit(value === base ? \"base\" : \"quote\");\n }}\n />\n );\n\n if (isBase) {\n return (\n <CustomInput\n label={t(\"common.qty\")}\n suffix={suffix}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className=\"!oui-rounded-r\"\n value={props.order_quantity}\n error={getErrorMsg(\n \"order_quantity\",\n `${errors?.order_quantity?.value} ${base}`,\n )}\n onChange={(val) => {\n setOrderValue(\"order_quantity\", val);\n }}\n formatters={[inputFormatter.dpFormatter(base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n );\n }\n\n return (\n <CustomInput\n label={t(\"common.qty\")}\n suffix={suffix}\n id=\"order_total_input\"\n name=\"order_total_input\"\n className=\"!oui-rounded-r\"\n value={props.total}\n error={getErrorMsg(\"order_quantity\", `${errors?.total?.value} ${quote}`)}\n onChange={(val) => {\n setOrderValue(\"total\", val);\n }}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n />\n );\n});\n","import { FC, useMemo } from \"react\";\nimport { Select, Text, cn } from \"@orderly.network/ui\";\n\nexport type QuantityUnitProps = {\n base: string;\n quote: string;\n value: string;\n onValueChange: (value: string) => void;\n};\n\nconst valueRenderer = (value: string) => {\n return (\n <Text size=\"2xs\" intensity={36}>\n {value}\n </Text>\n );\n};\n\nexport const ScaledQuantityUnit: FC<QuantityUnitProps> = (props) => {\n const { base, quote } = props;\n\n const options = useMemo(() => {\n return [{ name: quote }, { name: base }];\n }, [base, quote]);\n\n return (\n <Select.tokens\n variant=\"text\"\n size=\"xs\"\n iconSize=\"2xs\"\n tokens={options}\n classNames={{\n trigger: cn(\n \"oui-absolute oui-right-0 oui-top-1\",\n \"oui-w-full oui-justify-end\",\n ),\n }}\n value={props.value}\n onValueChange={props.onValueChange}\n valueFormatter={valueRenderer}\n contentProps={{\n align: \"end\",\n alignOffset: -1,\n sideOffset: -4,\n className: \"oui-border oui-border-line-6\",\n }}\n />\n );\n};\n","import { memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype SkewInputProps = {\n skew?: string;\n};\n\nexport const SkewInput = memo((props: SkewInputProps) => {\n const { t } = useTranslation();\n\n const { onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n return (\n <CustomInput\n id=\"order_skew_input\"\n label={t(\"orderEntry.skew\")}\n value={props.skew}\n error={getErrorMsg(\"skew\")}\n onChange={(val) => {\n setOrderValue(\"skew\", val);\n }}\n onFocus={onFocus(InputType.SKEW)}\n onBlur={onBlur(InputType.SKEW)}\n overrideFormatters={[\n inputFormatter.rangeFormatter({ min: 0, max: 100, dp: 2 }),\n inputFormatter.dpFormatter(2),\n ]}\n classNames={{\n root: \"oui-rounded-b-xl\",\n }}\n />\n );\n});\n","import { memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype TotalOrdersInputProps = {\n total_orders?: string;\n};\n\nexport const TotalOrdersInput = memo((props: TotalOrdersInputProps) => {\n const { t } = useTranslation();\n const { onFocus, onBlur, getErrorMsg, setOrderValue } =\n useOrderEntryContext();\n\n return (\n <CustomInput\n label={t(\"orderEntry.totalOrders\")}\n placeholder=\"2-20\"\n id=\"order_total_orders_input\"\n className={\"!oui-rounded-l\"}\n value={props.total_orders}\n error={getErrorMsg(\"total_orders\")}\n onChange={(val) => {\n setOrderValue(\"total_orders\", val);\n }}\n overrideFormatters={[\n // inputFormatter.rangeFormatter({ min: 2, max: 20 }),\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(0),\n ]}\n onFocus={onFocus(InputType.TOTAL_ORDERS)}\n onBlur={onBlur(InputType.TOTAL_ORDERS)}\n />\n );\n});\n","import { FC, memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype TriggerPriceInputProps = {\n trigger_price?: string;\n};\n\nexport const TriggerPriceInput: FC<TriggerPriceInputProps> = memo((props) => {\n const { t } = useTranslation();\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n triggerPriceInputRef,\n } = useOrderEntryContext();\n\n return (\n <div className=\"oui-group\">\n <CustomInput\n ref={triggerPriceInputRef}\n id=\"order_trigger_price_input\"\n name=\"order_trigger_price_input\"\n label={t(\"common.trigger\")}\n suffix={symbolInfo.quote}\n value={props.trigger_price}\n onChange={(e) => {\n setOrderValue(\"trigger_price\", e);\n }}\n error={getErrorMsg(\"trigger_price\")}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.TRIGGER_PRICE)}\n onBlur={onBlur(InputType.TRIGGER_PRICE)}\n />\n </div>\n );\n});\n\nTriggerPriceInput.displayName = \"TriggerPriceInput\";\n","import { memo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\ntype ActivePriceInputProps = {\n activated_price?: string;\n};\n\nexport const ActivePriceInput = memo<ActivePriceInputProps>((props) => {\n const { t } = useTranslation();\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n activatedPriceInputRef,\n } = useOrderEntryContext();\n\n return (\n <div className=\"oui-group\">\n <CustomInput\n ref={activatedPriceInputRef}\n id=\"order_activated_price_input\"\n name=\"order_activated_price_input\"\n label={t(\"common.triggerPrice\")}\n placeholder={`0 (${t(\"common.optional\")})`}\n suffix={symbolInfo.quote}\n error={getErrorMsg(\"activated_price\")}\n value={props.activated_price}\n onChange={(val: string) => {\n setOrderValue(\"activated_price\", val);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.ACTIVATED_PRICE)}\n onBlur={onBlur(InputType.ACTIVATED_PRICE)}\n />\n </div>\n );\n});\n\nActivePriceInput.displayName = \"ActivePriceInput\";\n","import { FC, memo, useCallback, useRef } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { TrailingCallbackType } from \"@orderly.network/types\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { InputType } from \"../../../types\";\nimport { CustomInput } from \"../../customInput\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\nimport { CallbackRatePercentages } from \"./callbackRatePercentages\";\nimport { TrailingCallbackSelect } from \"./trailingCallbackSelect\";\n\ntype TrailingCallbackInputProps = {\n callback_value?: string;\n callback_rate?: string;\n};\n\nexport const TrailingCallbackInput: FC<TrailingCallbackInputProps> = memo(\n (props) => {\n const { callback_value, callback_rate } = props;\n const { t } = useTranslation();\n const {\n symbolInfo,\n onFocus,\n onBlur,\n getErrorMsg,\n setOrderValue,\n setOrderValues,\n } = useOrderEntryContext();\n const { quote, quote_dp } = symbolInfo;\n // const [open, setOpen] = useState(false);\n\n const lastCallbackValueRef = useRef<string>();\n const lastCallbackRateRef = useRef<string>();\n\n const [callbackType, setCallbackType] = useLocalStorage(\n \"orderly_order_trailing_callback_type\",\n TrailingCallbackType.VALUE,\n );\n\n const onCallbackTypeChange = useCallback(\n (type: TrailingCallbackType) => {\n setCallbackType(type);\n // when switch to callback rate, save the last callback value\n if (type === TrailingCallbackType.RATE) {\n lastCallbackValueRef.current = callback_value;\n setOrderValues({\n callback_value: \"\",\n callback_rate: lastCallbackRateRef.current,\n });\n // when switch to callback value, save the last callback rate\n } else {\n lastCallbackRateRef.current = callback_rate;\n setOrderValues({\n callback_value: lastCallbackValueRef.current,\n callback_rate: \"\",\n });\n }\n },\n [callback_value, callback_rate],\n );\n\n const suffix = (\n <TrailingCallbackSelect\n quote={quote}\n value={callbackType}\n onValueChange={onCallbackTypeChange}\n />\n );\n\n // don't need to convert trailing rate to estimated value\n // const estimatedValue = useMemo(() => {\n // if (callbackType === TrailingCallbackType.RATE) {\n // return callback_rate\n // }\n // }, [callback_rate, callbackType]);\n\n // const tooltipContent = estimatedValue\n // ? `≈ ${estimatedValue} ${quote}`\n // : undefined;\n\n // const openTooltip = useCallback(() => {\n // setOpen(true);\n // }, []);\n\n // const closeTooltip = useCallback(() => {\n // setOpen(false);\n // }, []);\n\n if (callbackType === TrailingCallbackType.RATE) {\n return (\n // <Tooltip\n // content={tooltipContent}\n // open={open && !!tooltipContent}\n // sideOffset={-25}\n // className=\"!oui-p-3\"\n // >\n <div className=\"oui-relative\">\n <CustomInput\n id=\"order_callback_rate_input\"\n name=\"order_callback_rate_input\"\n label={t(\"orderEntry.trailingRate\")}\n suffix={suffix}\n error={getErrorMsg(\"callback_rate\")}\n value={callback_rate}\n onChange={(val: string) => {\n setOrderValue(\"callback_rate\", val);\n }}\n formatters={[inputFormatter.dpFormatter(1)]}\n onFocus={(e) => {\n onFocus(InputType.CALLBACK_RATE)(e);\n // openTooltip();\n }}\n onBlur={(e) => {\n onBlur(InputType.CALLBACK_RATE)(e);\n // closeTooltip();\n }}\n classNames={{\n root: \"oui-h-[68px]\",\n input: \"oui-mb-5\",\n prefix: \"!oui-top-1\",\n }}\n />\n <CallbackRatePercentages\n className=\"oui-absolute oui-bottom-1 oui-left-2\"\n callback_rate={callback_rate}\n // onClick={openTooltip}\n />\n </div>\n // </Tooltip>\n );\n }\n\n return (\n <CustomInput\n id=\"order_callback_value_input\"\n name=\"order_callback_value_input\"\n label={t(\"orderEntry.trailingValue\")}\n suffix={suffix}\n error={getErrorMsg(\"callback_value\")}\n value={callback_value}\n onChange={(val: string) => {\n setOrderValue(\"callback_value\", val);\n }}\n formatters={[inputFormatter.dpFormatter(quote_dp)]}\n onFocus={onFocus(InputType.CALLBACK_VALUE)}\n onBlur={onBlur(InputType.CALLBACK_VALUE)}\n classNames={{\n input: \"!oui-mb-[6px]\",\n prefix: \"!oui-top-1\",\n }}\n />\n );\n },\n);\n\nTrailingCallbackInput.displayName = \"TrailingCallbackInput\";\n","import { FC, memo } from \"react\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\nimport { useOrderEntryContext } from \"../../orderEntryContext\";\n\nconst percentages = [1, 2, 3, 5];\n\ntype CallbackRatePercentagesProps = {\n className?: string;\n callback_rate?: string;\n onClick?: (value: string) => void;\n};\n\nexport const CallbackRatePercentages: FC<CallbackRatePercentagesProps> = memo(\n (props) => {\n const { setOrderValue } = useOrderEntryContext();\n\n return (\n <Flex gapX={2} className={props.className}>\n {percentages.map((item) => {\n const value = item.toString();\n const isActive = props.callback_rate === value;\n\n return (\n <Flex\n key={item}\n justify=\"center\"\n itemAlign=\"center\"\n width={46}\n height={18}\n className={cn(\n \"oui-cursor-pointer oui-select-none\",\n \"oui-rounded oui-border\",\n isActive ? \"oui-border-base-contrast-36\" : \"oui-border-line-12\",\n )}\n onClick={() => {\n setOrderValue(\"callback_rate\", value);\n props.onClick?.(value);\n }}\n >\n <Text size=\"2xs\" intensity={isActive ? 80 : 36} weight=\"semibold\">\n {item}%\n </Text>\n </Flex>\n );\n })}\n </Flex>\n );\n },\n);\n\nCallbackRatePercentages.displayName = \"CallbackRatePercentages\";\n","import { FC, memo, useMemo } from \"react\";\nimport { TrailingCallbackType } from \"@orderly.network/types\";\nimport { Select, cn } from \"@orderly.network/ui\";\n\ntype TrailingCallbackSelectProps = {\n quote: string;\n value: string;\n onValueChange: (value: TrailingCallbackType) => void;\n};\n\nexport const TrailingCallbackSelect: FC<TrailingCallbackSelectProps> = memo(\n (props) => {\n const { quote } = props;\n\n const options = useMemo(() => {\n return [\n { label: quote, value: TrailingCallbackType.VALUE },\n { label: \"%\", value: TrailingCallbackType.RATE },\n ];\n }, [quote]);\n\n return (\n <Select.options\n variant=\"text\"\n size=\"xs\"\n options={options}\n classNames={{\n trigger: cn(\n \"oui-absolute oui-right-0 oui-top-1\",\n \"oui-w-[124px] oui-justify-end\",\n \"oui-text-base-contrast-36\",\n ),\n }}\n value={props.value}\n onValueChange={props.onValueChange}\n contentProps={{\n align: \"end\",\n alignOffset: -1,\n sideOffset: -4,\n className: \"oui-border oui-border-line-6\",\n }}\n />\n );\n },\n);\n\nTrailingCallbackSelect.displayName = \"trailingCallbackSelect\";\n","import { OrderlyOrder } from \"@orderly.network/types\";\nimport { QtyAndTotalInput } from \"../qtyAndTotal/qtyAndTotalInput\";\nimport { ActivePriceInput } from \"./activePriceInput\";\nimport { TrailingCallbackInput } from \"./trailingCallbackInput\";\n\ntype TrailingStopInputProps = {\n values: Partial<OrderlyOrder>;\n};\n\nexport const TrailingStopInput = (props: TrailingStopInputProps) => {\n const { values } = props;\n\n return (\n <div className=\"oui-space-y-1\">\n <ActivePriceInput activated_price={values.activated_price} />\n <TrailingCallbackInput\n callback_value={values.callback_value}\n callback_rate={values.callback_rate}\n />\n <QtyAndTotalInput\n order_quantity={values.order_quantity}\n total={values.total}\n />\n </div>\n );\n};\n","import { memo, useEffect, useMemo, useState } from \"react\";\nimport { utils } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport { Flex, Slider, textVariants, Text } from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { InputType } from \"../../types\";\nimport { useOrderEntryContext } from \"../orderEntryContext\";\n\ntype QuantitySliderProps = {\n canTrade: boolean;\n side: OrderSide;\n order_quantity?: string;\n maxQty: number;\n};\nconst SLIDER_MIN = 0;\nconst SLIDER_MAX = 100;\n\nexport const QuantitySlider = memo((props: QuantitySliderProps) => {\n const { canTrade, side, order_quantity, maxQty } = props;\n\n const [sliderValue, setSliderValue] = useState<number>(0);\n\n const { setOrderValue, symbolInfo, lastQuantityInputType } =\n useOrderEntryContext();\n\n const { base_dp, base_tick } = symbolInfo;\n\n const { t } = useTranslation();\n\n const color = useMemo(\n () => (canTrade ? (side === OrderSide.BUY ? \"buy\" : \"sell\") : undefined),\n [side, canTrade],\n );\n\n const maxLabel = useMemo(() => {\n return side === OrderSide.BUY\n ? t(\"orderEntry.maxBuy\")\n : t(\"orderEntry.maxSell\");\n }, [side, t]);\n\n const onSliderValueChange = (value: number) => {\n lastQuantityInputType.current = InputType.QUANTITY_SLIDER;\n setSliderValue(value);\n };\n\n const sliderToQuantity = (value: number) => {\n const newQty = new Decimal(value)\n .div(SLIDER_MAX)\n .mul(maxQty)\n .toFixed(base_dp, Decimal.ROUND_DOWN);\n setOrderValue(\"order_quantity\", utils.formatNumber(newQty, base_tick));\n };\n\n const onMax = () => {\n onSliderValueChange(SLIDER_MAX);\n // when previous slider value is max, quantity will not update by useEffect, so must set quantity manually to maxQty\n if (sliderValue === SLIDER_MAX) {\n sliderToQuantity(SLIDER_MAX);\n }\n };\n\n // update quantity when slider value and maxQty changes\n useEffect(() => {\n if (lastQuantityInputType.current === InputType.QUANTITY_SLIDER) {\n sliderToQuantity(sliderValue);\n }\n }, [sliderValue, maxQty]);\n\n useEffect(() => {\n const quantityToSlider = () => {\n if (order_quantity && Number(order_quantity) !== 0 && maxQty !== 0) {\n return new Decimal(Math.min(Number(order_quantity), maxQty))\n .div(maxQty)\n .mul(SLIDER_MAX)\n .todp(2, Decimal.ROUND_DOWN)\n .toNumber();\n }\n return 0;\n };\n\n // update slider value when last quantity input type is not quantity slider\n if (lastQuantityInputType.current !== InputType.QUANTITY_SLIDER) {\n setSliderValue(quantityToSlider());\n }\n }, [order_quantity, maxQty]);\n\n return (\n <div>\n <Slider\n disabled={maxQty === 0 || !canTrade}\n value={[sliderValue]}\n color={color}\n markCount={4}\n showTip\n onValueChange={(e) => {\n onSliderValueChange(e[0]);\n }}\n min={SLIDER_MIN}\n max={SLIDER_MAX}\n />\n <Flex justify={\"between\"} className=\"oui-pt-1 xl:oui-pt-2\">\n <Text.numeral\n size={\"2xs\"}\n color={color}\n dp={2}\n padding={false}\n suffix=\"%\"\n >\n {canTrade ? sliderValue : 0}\n </Text.numeral>\n <Flex>\n <button\n className={textVariants({\n size: \"2xs\",\n className: \"oui-mr-1\",\n })}\n onClick={onMax}\n data-testid=\"oui-testid-orderEntry-maxQty-value-button\"\n >\n {maxLabel}\n </button>\n <Text.numeral\n size={\"2xs\"}\n color={color}\n dp={base_dp}\n padding={false}\n data-testid=\"oui-testid-orderEntry-maxQty-value\"\n >\n {canTrade ? maxQty : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n </div>\n );\n});\n\nQuantitySlider.displayName = \"QuantitySlider\";\n","import React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Switch } from \"@orderly.network/ui\";\n\nexport interface ReduceOnlySwitchProps {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n className?: string;\n testId?: string;\n}\n\nexport const ReduceOnlySwitch: React.FC<ReduceOnlySwitchProps> = ({\n checked,\n onCheckedChange,\n className,\n testId = \"oui-testid-orderEntry-reduceOnly-switch\",\n}) => {\n const { t } = useTranslation();\n\n return (\n <Flex itemAlign={\"center\"} gapX={1} className={className}>\n <Switch\n data-testid={testId}\n className=\"oui-h-[14px]\"\n id={\"reduceOnly\"}\n checked={checked}\n onCheckedChange={onCheckedChange}\n />\n <label htmlFor={\"reduceOnly\"} className={\"oui-text-xs\"}>\n {t(\"orderEntry.reduceOnly\")}\n </label>\n </Flex>\n );\n};\n","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport { OrderlyOrder, OrderType, PositionType } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n Text,\n Input,\n inputFormatter,\n modal,\n Switch,\n SettingFillIcon,\n Box,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { ExclamationFillIcon } from \"@orderly.network/ui\";\nimport { TPSLPositionTypeWidget } from \"@orderly.network/ui-tpsl\";\nimport { OrderEntryContext, useOrderEntryContext } from \"./orderEntryContext\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { usePnlInputContext } from \"./pnlInput/pnlInputContext\";\nimport { PnlInputProvider } from \"./pnlInput/pnlInputProvider\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\nimport { ReduceOnlySwitch } from \"./reduceOnlySwitch\";\n\ntype OrderValueKeys = keyof OrderlyOrder;\n\ntype Est_Values = PNL_Values & {\n trigger_price?: string;\n};\n\ntype TPSL_Values = {\n tp: Est_Values;\n sl: Est_Values;\n position_type: PositionType;\n};\n\nexport const OrderTPSL = (props: {\n // onCancelTPSL: () => void;\n // onEnableTP_SL: () => void;\n switchState: boolean;\n onSwitchChanged: (state: boolean) => void;\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n orderType: OrderType;\n isReduceOnly?: boolean;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n showTPSLAdvanced: () => void;\n setOrderValue: (key: string, value: any) => void;\n reduceOnlyChecked?: boolean;\n onReduceOnlyChange?: (checked: boolean) => void;\n}) => {\n // const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n useEffect(() => {\n if (\n props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET\n ) {\n // setOpen(false);\n props.onSwitchChanged(false);\n\n // props.onCancelTPSL();\n }\n }, [props.orderType]);\n\n if (\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n )\n return null;\n\n return (\n <div>\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n id={\"order_entry_tpsl\"}\n className=\"oui-h-[14px]\"\n checked={props.switchState}\n disabled={\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n }\n onCheckedChange={(checked) => {\n // setOpen(checked);\n props.onSwitchChanged(checked);\n // if (!checked) {\n // props.onCancelTPSL();\n // } else {\n // props.onEnableTP_SL();\n // }\n }}\n />\n <label htmlFor={\"order_entry_tpsl\"} className={\"oui-text-xs\"}>\n {t(\"common.tpsl\")}\n </label>\n {/* <ExclamationFillIcon\n color=\"white\"\n // opacity={0.36}\n size={14}\n opacity={1}\n className=\"oui-cursor-pointer oui-text-white/[.36] hover:oui-text-white/80\"\n onClick={() => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: (\n <Text intensity={54}>{t(\"orderEntry.tpsl.tips\")}</Text>\n ),\n });\n }}\n /> */}\n </Flex>\n <Flex itemAlign={\"center\"} gapX={2}>\n {isMobile && props.onReduceOnlyChange && (\n <ReduceOnlySwitch\n checked={props.reduceOnlyChecked ?? false}\n onCheckedChange={props.onReduceOnlyChange}\n />\n )}\n {!isMobile && (\n <TPSLAdvancedButton\n className={cn(\n \"oui-group oui-invisible\",\n props.switchState && \"oui-visible\",\n )}\n showTPSLAdvanced={props.showTPSLAdvanced}\n />\n )}\n </Flex>\n </Flex>\n <div\n className={cn(\n \"oui-max-h-0 oui-overflow-hidden oui-transition-all\",\n props.switchState && \"oui-max-h-[120px]\",\n )}\n onTransitionEnd={() => {\n console.log(\"transition end\");\n tpslFormRef.current?.style.setProperty(\n \"opacity\",\n props.switchState ? \"1\" : \"0\",\n );\n }}\n >\n <TPSLInputForm\n ref={tpslFormRef}\n setOrderValue={props.setOrderValue}\n onChange={props.onChange}\n values={props.values}\n errors={props.errors}\n quote_dp={props.quote_dp}\n showTPSLAdvanced={props.showTPSLAdvanced}\n isMobile={isMobile}\n />\n </div>\n </div>\n );\n};\n\nconst TPSLInputForm = React.forwardRef<\n HTMLDivElement,\n {\n setOrderValue: (key: string, value: any) => void;\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n showTPSLAdvanced: () => void;\n isMobile: boolean;\n }\n>((props, ref) => {\n const { getErrorMsg } = useOrderEntryFormErrorMsg(props.errors);\n const { t } = useTranslation();\n\n return (\n <div\n ref={ref}\n className={\"oui-space-y-1 oui-px-px oui-py-2 oui-transition-all\"}\n >\n <Flex itemAlign={\"center\"} justify={\"between\"} gapX={2}>\n <TPSLPositionTypeWidget\n value={props.values.position_type}\n onChange={props.onChange}\n />\n {props.isMobile && (\n <TPSLAdvancedButton\n showTPSLAdvanced={props.showTPSLAdvanced}\n isMobile={props.isMobile}\n />\n )}\n </Flex>\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={getErrorMsg(\"tp_trigger_price\")}\n onChange={props.onChange}\n values={props.values.tp}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-tpPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-tpPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-tp-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n <PnlInputProvider values={props.values.sl} type={\"SL\"}>\n <TPSLInputRow\n type={\"SL\"}\n error={getErrorMsg(\"sl_trigger_price\")}\n onChange={props.onChange}\n values={props.values.sl}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-slPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-slPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-sl-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n </div>\n );\n});\n\nTPSLInputForm.displayName = \"TPSLInputForm\";\n\nconst TPSLAdvancedButton = (props: {\n showTPSLAdvanced: () => void;\n className?: string;\n isMobile?: boolean;\n}) => {\n const { t } = useTranslation();\n\n return (\n <Flex\n itemAlign={\"center\"}\n gapX={1}\n onClick={props.showTPSLAdvanced}\n className={cn(\"oui-group oui-cursor-pointer\", props.className)}\n >\n <Text\n className={cn(\n \"oui-cursor-pointer group-hover:oui-text-base-contrast\",\n props.isMobile ? \"oui-text-2xs\" : \"oui-text-sm\",\n )}\n >\n {t(\"tpsl.advanced\")}\n </Text>\n <SettingFillIcon\n size={12}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast oui-cursor-pointer\"\n opacity={1}\n onClick={props.showTPSLAdvanced}\n />\n </Flex>\n );\n};\n\n//------- TPSLTriggerPriceInput start -------\nconst TPSLTriggerPriceInput = (props: {\n type: \"TP\" | \"SL\";\n error: string | undefined;\n values: Est_Values;\n onChange: (value: string) => void;\n quote_dp: number | undefined;\n testId?: string;\n}) => {\n const { t } = useTranslation();\n const { errorMsgVisible } = useOrderEntryContext();\n const { tipsEle } = usePnlInputContext();\n const [prefix, setPrefix] = useState<string>(`${props.type} Price`);\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const [innerValue, setInnerValue] = useState<string>(\n props.values.trigger_price ?? \"\",\n );\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(props.values.trigger_price ?? \"\");\n }, [props.values.trigger_price, isFocused]);\n\n const triggerPriceToolTipEle = useMemo(() => {\n if (props.error && errorMsgVisible) return props.error;\n if (tipVisible) return tipsEle;\n\n return null;\n }, [props.error, errorMsgVisible, tipVisible, tipsEle]);\n\n const getPrefixLabel = (trigger_price?: string) => {\n let _prefix = props.type === \"TP\" ? t(\"tpsl.tpPrice\") : t(\"tpsl.slPrice\");\n\n if (trigger_price) {\n _prefix = props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\");\n }\n return _prefix;\n };\n\n const onValueChange = (value: string) => {\n setInnerValue(value);\n props.onChange(value);\n };\n\n // console.log(\"props.values.trigger_price\", props.values.trigger_price);\n\n useEffect(() => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n\n if (!isFocused) {\n setInnerValue(props.values.trigger_price ?? \"\");\n }\n }, [props.type, props.values.trigger_price]);\n\n const onFocus = () => {\n setPrefix(props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\"));\n setPlaceholder(\"\");\n setTipVisible(true);\n setIsFocused(true);\n };\n\n const onBlur = () => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n setPlaceholder(\"USDC\");\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(innerValue);\n };\n\n return (\n <Input.tooltip\n data-testid={props.testId}\n prefix={prefix}\n size={\"md\"}\n placeholder={placeholder}\n align=\"right\"\n onFocus={onFocus}\n onBlur={onBlur}\n tooltip={triggerPriceToolTipEle}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n color={props.error ? \"danger\" : undefined}\n autoComplete={\"off\"}\n value={innerValue}\n classNames={{\n additional: \"oui-text-base-contrast-54\",\n root: \"oui-pr-2 md:oui-pr-3\",\n prefix: \"oui-pr-1 md:oui-pr-2\",\n }}\n // onChange={props.onChange}\n onValueChange={onValueChange}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp ?? 2),\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n\n//------- TPSLTriggerPriceInput end -------\n\nconst TPSLInputRow: React.FC<{\n type: \"TP\" | \"SL\";\n values: Est_Values;\n error?: string;\n onChange: (key: OrderValueKeys, value: any) => void;\n quote_dp: number | undefined;\n testIds?: {\n first?: string;\n second?: string;\n dropDown?: string;\n };\n}> = (props) => {\n return (\n <Grid cols={2} gapX={1}>\n <TPSLTriggerPriceInput\n testId={props.testIds?.first}\n type={props.type}\n error={props.error}\n values={props.values ?? \"\"}\n onChange={(event) => {\n props.onChange(\n props.type === \"SL\" ? \"sl_trigger_price\" : \"tp_trigger_price\",\n event,\n );\n }}\n quote_dp={props.quote_dp}\n />\n\n <PnlInputWidget\n testIds={{\n input: props.testIds?.second,\n dropDown: props.testIds?.dropDown,\n }}\n onChange={props.onChange}\n quote={\"USDC\"}\n quote_dp={2}\n type={props.type}\n values={{\n PnL: props.values.PnL,\n Offset: props.values.Offset,\n \"Offset%\": props.values[\"Offset%\"],\n ROI: props.values.ROI,\n }}\n />\n </Grid>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n CaretDownIcon,\n Input,\n MenuItem,\n Text,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\n\nexport type PNLInputProps = PNLInputState & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n type: \"TP\" | \"SL\";\n};\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n modeLabelMap,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n type,\n tips,\n onFocus,\n onBlur,\n setFocus,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote,\n );\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n useEffect(() => {\n setPrefix(!!value ? \"\" : mode);\n }, [value]);\n\n const id = useMemo(() => `${type.toLowerCase()}_${mode.toLowerCase()}`, []);\n\n return (\n <Input.tooltip\n prefix={modeLabelMap[prefix as keyof typeof modeLabelMap] || prefix}\n size={\"md\"}\n placeholder={placeholder}\n id={id}\n align={\"right\"}\n value={value}\n tooltip={tips}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n data-testid={props.testIds?.input}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n props.formatter({ dp: quote_dp, mode, type }),\n inputFormatter.currencyFormatter,\n // inputFormatter.identifierFormatter(),\n ]}\n classNames={{\n root: type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n additional: \"oui-text-base-contrast-54\",\n input: \"oui-text-inherit\",\n }}\n onFocus={() => {\n setPrefix(\"\");\n setPlaceholder(\"\");\n setFocus(true);\n onFocus();\n }}\n onBlur={() => {\n setPrefix(!!value ? \"\" : mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n onBlur();\n }}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className=\"oui-ml-[2px]\">\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n testId={props.testIds?.dropDown}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n testId?: string;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"} data-testid={props.testId}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport { usePnlInputContext } from \"./pnlInputContext\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n ROI: string;\n};\n\ntype PNL_Keys =\n | \"tp_offset\"\n | \"tp_offset_percentage\"\n | \"tp_pnl\"\n | \"sl_offset\"\n | \"sl_offset_percentage\"\n | \"sl_pnl\";\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: PNL_Keys, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values, quote_dp } = props;\n const { t } = useTranslation();\n const [focus, setFocus] = useState(true);\n // const [mode, setMode] = useLocalStorage<PnLMode>(\n // \"TP/SL_Mode\",\n // PnLMode.PERCENTAGE\n // );\n const { mode, setMode, tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const key = useMemo<PNL_Keys>(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset` as PNL_Keys;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage` as PNL_Keys;\n default:\n return `${type.toLowerCase()}_pnl` as PNL_Keys;\n }\n }, [mode]);\n\n const [innerValue, setInnerValue] = useState<string>(\n values[mode as keyof PNL_Values],\n );\n\n // const value = useMemo(() => {\n // // console.log(\"mode\", mode, values);\n // const value = values[mode as keyof PNL_Values];\n // // if (isFocused) {\n // // return value;\n // // }\n // return value;\n // }, [values, mode, isFocused]);\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(values[mode as keyof PNL_Values]);\n }, [values, mode, isFocused]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n {\n label: t(\"tpsl.pnl\"),\n value: PnLMode.PnL,\n testId: `${PnLMode.PnL}_menu_item`,\n },\n {\n label: t(\"tpsl.offset\"),\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: `${t(\"tpsl.offset\")}%`,\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, [t]);\n\n const modeLabelMap = useMemo(() => {\n return {\n [PnLMode.PnL]: t(\"tpsl.pnl\"),\n [PnLMode.OFFSET]: t(\"tpsl.offset\"),\n [PnLMode.PERCENTAGE]: `${t(\"tpsl.offset\")}%`,\n };\n }, [t]);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n // console.log(\"onValueChange\", value);\n // if (!isFocused) {\n // props.onChange(key, value);\n // } else {\n // setInnerValue(value);\n // }\n setInnerValue(value);\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n setIsFocused(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(key, innerValue);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n type: \"TP\" | \"SL\";\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions,\n ) => {\n value = `${value}`; // convert to string\n\n if (focus) {\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n // value = new Decimal(\n // value.replace(\n // new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n // \"\"\n // )\n // )\n // .mul(100)\n // .toString();\n\n // return `${todpIfNeed(value, 2)}${percentageSuffix.current}`;\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\",\n ),\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n // return (Number(value) * 100).toFixed(2);\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n // console.log(\"onSendBefore\", value);\n\n if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else if (mode === PnLMode.PnL && type === \"SL\" && focus) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n modeLabelMap,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value: innerValue,\n onValueChange,\n quote_dp,\n tips: tipVisible ? tipsEle : undefined,\n setFocus,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import { createContext, ReactNode, useContext } from \"react\";\nimport { PnLMode } from \"./useBuilder.script\";\n\nexport type PnlInputContextState = {\n mode: PnLMode;\n setMode: (mode: PnLMode) => void;\n tipsEle: ReactNode | null;\n};\n\nexport const PnlInputContext = createContext<PnlInputContextState>(\n {} as PnlInputContextState,\n);\n\nexport const usePnlInputContext = () => {\n return useContext(PnlInputContext);\n};\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, PnLMode, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n }\n) => {\n const { testIds, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return (\n <PNLInput {...state} testIds={testIds} quote={quote} type={props.type} />\n );\n};\n","import React, { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\nimport { PnlInputContext, PnlInputContextState } from \"./pnlInputContext\";\nimport { PNL_Values, PnLMode } from \"./useBuilder.script\";\n\nexport const PnlInputProvider: React.FC<\n React.PropsWithChildren<{\n values: PNL_Values & { trigger_price?: string };\n type: \"TP\" | \"SL\";\n }>\n> = (props) => {\n const { type, values, children } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE,\n );\n const { t } = useTranslation();\n\n const tipsEle = useMemo(() => {\n if (!values.PnL || !values.trigger_price) {\n return null;\n }\n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {mode === PnLMode.PnL\n ? t(\"orderEntry.estRoi\")\n : t(\"orderEntry.estPnL\")}\n </span>\n {mode === PnLMode.PnL ? (\n <Text.numeral\n rule={\"percentages\"}\n className={cn(\n \"oui-ml-1 oui-text-xs\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n )}\n >\n {values.ROI}\n </Text.numeral>\n ) : (\n <Text.numeral\n rule={\"price\"}\n className={cn(\n \"oui-ml-1 oui-text-xs\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n )}\n >\n {values.PnL}\n </Text.numeral>\n )}\n </Flex>\n );\n }, [mode, values.ROI, values.PnL, values.trigger_price]);\n\n const memoizedValue = useMemo<PnlInputContextState>(() => {\n return { mode, setMode, tipsEle };\n }, [mode, setMode, tipsEle]);\n\n return (\n <PnlInputContext.Provider value={memoizedValue}>\n {children}\n </PnlInputContext.Provider>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport {\n useComputedLTV,\n useEventEmitter,\n useLocalStorage,\n useMarginRatio,\n useMemoizedFn,\n useOrderEntry,\n useOrderlyContext,\n} from \"@orderly.network/hooks\";\nimport { useCanTrade } from \"@orderly.network/react-app\";\nimport {\n DistributionType,\n OrderLevel,\n OrderSide,\n OrderType,\n PositionType,\n} from \"@orderly.network/types\";\nimport { Decimal, removeTrailingZeros } from \"@orderly.network/utils\";\nimport { useAskAndBid } from \"./hooks/useAskAndBid\";\nimport { useBBOState } from \"./hooks/useBBOState\";\nimport { useFocusAndBlur } from \"./hooks/useFocusAndBlur\";\nimport { usePriceInputContainer } from \"./hooks/usePriceInputContainer\";\nimport { InputType } from \"./types\";\nimport { BBOStatus, isBBOOrder, safeNumber } from \"./utils\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\n\nexport const ORDERLY_ORDER_SOUND_ALERT_KEY = \"orderly_order_sound_alert\";\n\nexport type OrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n\nexport const useOrderEntryScript = (inputs: OrderEntryScriptInputs) => {\n const { symbol } = inputs;\n const [localOrderType, setLocalOrderType] = useLocalStorage(\n \"orderly-order-entry-order-type\",\n OrderType.LIMIT,\n );\n const [localOrderSide, setLocalOrderSide] = useLocalStorage(\n \"orderly-order-entry-order-side\",\n OrderSide.BUY,\n );\n\n const { notification } = useOrderlyContext();\n\n const [soundAlert, setSoundAlert] = useLocalStorage<boolean>(\n ORDERLY_ORDER_SOUND_ALERT_KEY,\n notification?.orderFilled?.defaultOpen ?? false,\n );\n\n const canTrade = useCanTrade();\n\n const {\n formattedOrder,\n setValue,\n setValues: setOrderValues,\n symbolInfo,\n ...state\n } = useOrderEntry(symbol, {\n initialOrder: {\n symbol,\n order_type: localOrderType,\n position_type: PositionType.PARTIAL,\n side: localOrderSide,\n },\n });\n\n const [tpslSwitch, setTpslSwitch] = useLocalStorage(\n \"orderly-order-entry-tp_sl-switch\",\n false,\n );\n\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n const triggerPriceInputRef = useRef<HTMLInputElement | null>(null);\n const priceInputRef = useRef<HTMLInputElement | null>(null);\n const activatedPriceInputRef = useRef<HTMLInputElement | null>(null);\n\n const { bboStatus, bboType, setBBOType, onBBOChange, toggleBBO } =\n useBBOState({\n tpslSwitch,\n order_type: formattedOrder.order_type,\n order_type_ext: formattedOrder.order_type_ext,\n side: formattedOrder.side,\n setOrderValues,\n });\n\n const {\n currentFocusInput,\n lastScaledOrderPriceInput,\n lastQuantityInputType,\n onFocus,\n onBlur,\n } = useFocusAndBlur({\n base_tick: symbolInfo?.base_tick,\n order_type: formattedOrder.order_type,\n order_quantity: formattedOrder.order_quantity,\n setValue,\n });\n\n // cancel TP/SL\n const cancelTP_SL = () => {\n // if(formattedOrder.)\n setOrderValues({\n tp_trigger_price: \"\",\n sl_trigger_price: \"\",\n position_type: PositionType.FULL,\n });\n };\n\n const enableTP_SL = () => {\n setOrderValues({\n order_type_ext: undefined,\n position_type: PositionType.FULL,\n });\n };\n\n const setOrderValue = useMemoizedFn(\n (\n key: any,\n value: any,\n options?: {\n shouldUpdateLastChangedField?: boolean;\n },\n ) => {\n if (key === \"order_type\") {\n setLocalOrderType(value);\n }\n if (key === \"side\") {\n setLocalOrderSide(value);\n }\n\n if (\n (key === \"reduce_only\" && value) ||\n (key === \"order_type\" &&\n (value === OrderType.STOP_LIMIT || value === OrderType.STOP_MARKET))\n ) {\n // cancelTP_SL();\n\n const data = {\n tp_trigger_price: \"\",\n sl_trigger_price: \"\",\n [key]: value,\n };\n\n if (key === \"order_type\") {\n data[\"order_type_ext\" as any] = \"\";\n }\n\n setOrderValues(data);\n\n return;\n }\n\n if (key === \"order_type\" && value !== OrderType.LIMIT) {\n const data = {\n level: undefined,\n order_type_ext: undefined,\n [key]: value,\n };\n\n setOrderValues(data);\n\n return;\n }\n\n if (key === \"order_type\" && value === OrderType.SCALED) {\n setOrderValues({\n distribution_type: DistributionType.FLAT,\n [key]: value,\n });\n return;\n }\n\n setValue(key, value, options);\n },\n );\n\n const onTPSLSwitchChanged = (state: boolean) => {\n setTpslSwitch(state);\n if (state) {\n enableTP_SL();\n } else {\n cancelTP_SL();\n }\n };\n\n useEffect(() => {\n const updateOrderPrice = (price: string) => {\n setValue(\"order_price\", price);\n };\n ee.on(\"update:orderPrice\", updateOrderPrice);\n\n return () => {\n ee.off(\"update:orderPrice\", updateOrderPrice);\n };\n }, []);\n\n useEffect(() => {\n const focusInputElement = (target: HTMLInputElement | null) => {\n requestAnimationFrame(() => {\n target?.focus();\n });\n };\n\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n const price = removeTrailingZeros(item[0]);\n const { order_type, order_type_ext } = formattedOrder;\n\n // handle trigger price input, focus on trigger price input\n if (\n currentFocusInput.current === InputType.TRIGGER_PRICE &&\n (order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.STOP_MARKET)\n ) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle bbo order, unselect bbo and set order price, focus on order price input\n if (isBBOOrder({ order_type, order_type_ext })) {\n setBBOType(undefined);\n\n setOrderValues({\n order_type_ext: undefined,\n level: undefined,\n });\n\n requestAnimationFrame(() => {\n // Since BBO will update the price when unselected, we should set order price in requestAnimationFrame\n // We can't call setValue directly here because it's inside a requestAnimationFrame, and the formattedOrder accessed inside setValue would be the old value\n // setValue(\"order_price\", price);\n ee.emit(\"update:orderPrice\", price);\n });\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle limit order and stop limit order, set order price and focus on order price input\n if (\n order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle stop market order, set trigger price and focus on trigger price input\n if (order_type === OrderType.STOP_MARKET) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle market order, set order type to limit\n if (order_type === OrderType.MARKET) {\n // unselect bbo\n setBBOType(undefined);\n\n // You can't call setValue twice here , the second value will override the first, so you need to combine them into a single setValues call\n setOrderValues({\n order_type: OrderType.LIMIT,\n order_price: price,\n });\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n if (\n order_type === OrderType.SCALED &&\n lastScaledOrderPriceInput.current\n ) {\n const field =\n lastScaledOrderPriceInput.current === InputType.START_PRICE\n ? \"start_price\"\n : \"end_price\";\n setValue(field, price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle trailing stop order, set activated price and focus on activated price input\n if (order_type === OrderType.TRAILING_STOP) {\n setValue(\"activated_price\", price);\n focusInputElement(activatedPriceInputRef.current);\n return;\n }\n\n // default, set order price and focus on order price input\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n // Please do not modify this deps lightly, because `setValue` also relies on these state internally\n }, [formattedOrder, symbolInfo]);\n\n useEffect(() => {\n // after switching symbol, all the input number should be cleared (price, qty, TP/SL, etc)\n state.reset();\n state.resetMetaState();\n // reset last quantity input type\n lastQuantityInputType.current = InputType.NONE;\n }, [symbol]);\n\n // if scaled order, and distribution_type is not set, set it to flat\n useEffect(() => {\n if (\n formattedOrder.order_type === OrderType.SCALED &&\n !formattedOrder.distribution_type\n ) {\n setValue(\"distribution_type\", DistributionType.FLAT);\n }\n }, [formattedOrder.order_type, formattedOrder.distribution_type]);\n\n const currentLtv = useComputedLTV();\n const askAndBid = useAskAndBid();\n\n const fillMiddleValue = () => {\n if (bboStatus === BBOStatus.ON) {\n toggleBBO();\n }\n if (formattedOrder.order_type === OrderType.LIMIT) {\n const [bestAsk = 0, bestBid = 0] = askAndBid;\n const midPrice = new Decimal(safeNumber(bestAsk))\n .add(safeNumber(bestBid))\n .div(2)\n .toNumber();\n // 1. Since BBO will update the price when unselected, we should set order price in raf\n // 2. raf is mainly used to solve the timing problem caused by React state update, ensuring that the orderPrice is triggered after the state is fully updated to avoid accessing expired state values.\n requestAnimationFrame(() => {\n ee.emit(\"update:orderPrice\", midPrice);\n });\n }\n };\n\n const { priceInputContainerRef, priceInputContainerWidth } =\n usePriceInputContainer({\n order_type_ext: formattedOrder.order_type_ext,\n });\n\n return {\n ...state,\n side: formattedOrder.side as OrderSide,\n type: formattedOrder.order_type as OrderType,\n level: formattedOrder.level as OrderLevel,\n formattedOrder,\n setOrderValue,\n setOrderValues,\n currentLeverage,\n\n // cancelTP_SL,\n // enableTP_SL,\n tpslSwitch,\n setTpslSwitch: onTPSLSwitchChanged,\n symbolInfo,\n onFocus,\n onBlur,\n\n priceInputRef,\n priceInputContainerRef,\n priceInputContainerWidth,\n triggerPriceInputRef,\n activatedPriceInputRef,\n lastQuantityInputType,\n\n canTrade,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n currentLtv,\n fillMiddleValue,\n symbol,\n soundAlert,\n setSoundAlert,\n currentFocusInput,\n };\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useLocalStorage, useTrack } from \"@orderly.network/hooks\";\nimport {\n BBOOrderType,\n OrderlyOrder,\n OrderSide,\n OrderType,\n TrackerEventName,\n} from \"@orderly.network/types\";\nimport {\n BBOStatus,\n getOrderLevelByBBO,\n getOrderTypeByBBO,\n isBBOOrder,\n} from \"../utils\";\n\nexport function useBBOState({\n tpslSwitch,\n order_type,\n order_type_ext,\n side,\n setOrderValues,\n}: {\n tpslSwitch: boolean;\n order_type?: OrderType;\n order_type_ext?: OrderType;\n side?: OrderSide;\n setOrderValues: (values: Partial<OrderlyOrder>) => void;\n}) {\n const [localBBOType, setLocalBBOType] = useLocalStorage<\n BBOOrderType | undefined\n >(\"orderly_order_bbo_type\", undefined);\n\n const lastBBOType = useRef<BBOOrderType>(localBBOType);\n\n const { track } = useTrack();\n\n const bboStatus = useMemo(() => {\n if (\n tpslSwitch ||\n [OrderType.POST_ONLY, OrderType.IOC, OrderType.FOK].includes(\n order_type_ext!,\n )\n ) {\n return BBOStatus.DISABLED;\n }\n\n return localBBOType && order_type === OrderType.LIMIT\n ? BBOStatus.ON\n : BBOStatus.OFF;\n }, [tpslSwitch, order_type_ext, order_type, localBBOType]);\n\n const toggleBBO = () => {\n track(TrackerEventName.clickBBOButton);\n if (localBBOType) {\n // unselect bbo\n setLocalBBOType(undefined);\n // update formattedOrder values immediately instead of via useEffect\n setOrderValues({\n order_type_ext: undefined,\n level: undefined,\n });\n } else {\n setLocalBBOType(lastBBOType.current || BBOOrderType.COUNTERPARTY1);\n }\n };\n\n const onBBOChange = (value: BBOOrderType) => {\n setLocalBBOType(value);\n lastBBOType.current = value;\n };\n\n useEffect(() => {\n if (bboStatus === BBOStatus.DISABLED) {\n setOrderValues({\n // if order_type_ext is not bbo(ask, bid), keep previous value\n order_type_ext: isBBOOrder({ order_type_ext })\n ? undefined\n : order_type_ext,\n level: undefined,\n });\n }\n }, [bboStatus, order_type_ext]);\n\n useEffect(() => {\n if (bboStatus === BBOStatus.ON) {\n const orderType = getOrderTypeByBBO(localBBOType, side!);\n const orderLevel = getOrderLevelByBBO(localBBOType)!;\n setOrderValues({\n order_type_ext: orderType,\n level: orderLevel,\n });\n }\n }, [localBBOType, bboStatus, side]);\n\n return {\n bboStatus,\n bboType: localBBOType,\n setBBOType: setLocalBBOType,\n onBBOChange,\n toggleBBO,\n };\n}\n","import { useRef, FocusEvent } from \"react\";\nimport { OrderEntryReturn, useMemoizedFn, utils } from \"@orderly.network/hooks\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { InputType } from \"../types\";\n\ntype FocusAndBlurProps = {\n base_tick: number;\n order_type?: OrderType;\n order_quantity?: string;\n setValue: OrderEntryReturn[\"setValue\"];\n};\n\nexport function useFocusAndBlur(props: FocusAndBlurProps) {\n const { base_tick, order_type, order_quantity, setValue } = props;\n const currentFocusInput = useRef<InputType>(InputType.NONE);\n const lastScaledOrderPriceInput = useRef<InputType>(InputType.END_PRICE);\n const lastQuantityInputType = useRef<InputType>(InputType.NONE);\n\n const formatQty = () => {\n if (\n base_tick < 1 ||\n // scaled order should not format quantity, because it is total quantity\n order_type === OrderType.SCALED ||\n !order_quantity\n ) {\n return;\n }\n\n // TODO: use this to format quantity instead of utils.formatNumber, need time to test\n // const formatQty = new Decimal(formattedOrder.order_quantity)\n // .todp(0, Decimal.ROUND_DOWN)\n // .div(symbolInfo.base_tick)\n // .toString();\n\n const quantity = utils.formatNumber(\n order_quantity,\n new Decimal(base_tick || \"0\").toNumber(),\n );\n\n setValue(\"order_quantity\", quantity, {\n shouldUpdateLastChangedField: false,\n });\n };\n\n const onFocus = (type: InputType) => (_: FocusEvent) => {\n currentFocusInput.current = type;\n\n // set last scaled order price input\n if (\n [InputType.START_PRICE, InputType.END_PRICE].includes(\n currentFocusInput.current!,\n )\n ) {\n lastScaledOrderPriceInput.current = type;\n }\n\n if (\n [InputType.QUANTITY, InputType.TOTAL, InputType.MARGIN].includes(type)\n ) {\n lastQuantityInputType.current = type;\n }\n };\n\n const onBlur = (type: InputType) => (_: FocusEvent) => {\n setTimeout(() => {\n if (currentFocusInput.current !== type) {\n return;\n }\n currentFocusInput.current = InputType.NONE;\n }, 300);\n\n if (type === InputType.QUANTITY) {\n formatQty();\n }\n };\n\n return {\n currentFocusInput,\n lastScaledOrderPriceInput,\n lastQuantityInputType,\n onFocus: useMemoizedFn(onFocus),\n onBlur: useMemoizedFn(onBlur),\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { OrderType } from \"@orderly.network/types\";\n\nexport function usePriceInputContainer({\n order_type_ext,\n}: {\n order_type_ext?: OrderType;\n}) {\n const [priceInputContainerWidth, setPriceInputContainerWidth] = useState(0);\n const priceInputContainerRef = useRef<HTMLDivElement | null>(null);\n\n // useEffect(() => {\n // if (\n // priceInputContainerRef.current &&\n // // update BBO select width when is BBO order\n // isBBOOrder({ order_type_ext: formattedOrder.order_type_ext })\n // ) {\n // const width =\n // priceInputContainerRef.current.getBoundingClientRect()?.width;\n // if (width) {\n // setPriceInputContainerWidth(width);\n // }\n // }\n // }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n const element = priceInputContainerRef.current;\n\n if (!element) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n if (width) {\n // update BBO order select dropdown width when priceInputContainerRef width changed\n setPriceInputContainerWidth(width);\n }\n }\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.unobserve(element);\n };\n }, [priceInputContainerRef, order_type_ext]);\n\n return { priceInputContainerRef, priceInputContainerWidth };\n}\n","import React from \"react\";\nimport {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./orderEntry.script\";\nimport { OrderEntry } from \"./orderEntry.ui\";\n\nexport const OrderEntryWidget: React.FC<\n OrderEntryScriptInputs & {\n containerRef?: React.RefObject<HTMLDivElement>;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n }\n> = (props) => {\n const state = useOrderEntryScript(props);\n return (\n <OrderEntry\n {...state}\n containerRef={props.containerRef}\n disableFeatures={props.disableFeatures}\n />\n );\n};\n"]}
|