@omerdlw/base-framework 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5240 -5165
- package/dist/index.js.map +1 -1
- package/dist/kernel/compose.d.ts.map +1 -1
- package/dist/kernel/handlers.d.ts.map +1 -1
- package/dist/kernel/hooks.d.ts.map +1 -1
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/operations.d.ts.map +1 -1
- package/dist/kernel/schema.d.ts +0 -2
- package/dist/kernel/schema.d.ts.map +1 -1
- package/dist/kernel/store.d.ts.map +1 -1
- package/dist/kernel/types.d.ts.map +1 -1
- package/dist/kernel/utils.d.ts +0 -2
- package/dist/kernel/utils.d.ts.map +1 -1
- package/dist/modules/ambient/color.d.ts +16 -0
- package/dist/modules/ambient/color.d.ts.map +1 -0
- package/dist/modules/ambient/constants.d.ts +0 -17
- package/dist/modules/ambient/constants.d.ts.map +1 -1
- package/dist/modules/ambient/context.d.ts +1 -7
- package/dist/modules/ambient/context.d.ts.map +1 -1
- package/dist/modules/ambient/dom.d.ts +19 -0
- package/dist/modules/ambient/dom.d.ts.map +1 -0
- package/dist/modules/ambient/extractor.d.ts +5 -0
- package/dist/modules/ambient/extractor.d.ts.map +1 -0
- package/dist/modules/ambient/hooks.d.ts +9 -0
- package/dist/modules/ambient/hooks.d.ts.map +1 -0
- package/dist/modules/ambient/index.d.ts +7 -4
- package/dist/modules/ambient/index.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +66 -60
- package/dist/modules/ambient/index.js.map +1 -1
- package/dist/modules/ambient/module.d.ts +5 -1
- package/dist/modules/ambient/module.d.ts.map +1 -1
- package/dist/modules/background/constants.d.ts +1 -10
- package/dist/modules/background/constants.d.ts.map +1 -1
- package/dist/modules/background/context.d.ts +1 -13
- package/dist/modules/background/context.d.ts.map +1 -1
- package/dist/modules/background/hooks.d.ts +13 -118
- package/dist/modules/background/hooks.d.ts.map +1 -1
- package/dist/modules/background/index.d.ts +8 -3
- package/dist/modules/background/index.d.ts.map +1 -1
- package/dist/modules/background/index.js +975 -991
- package/dist/modules/background/index.js.map +1 -1
- package/dist/modules/background/module.d.ts +1 -0
- package/dist/modules/background/module.d.ts.map +1 -1
- package/dist/modules/background/overlay.d.ts +93 -2
- package/dist/modules/background/overlay.d.ts.map +1 -1
- package/dist/modules/background/playback.d.ts +10 -0
- package/dist/modules/background/playback.d.ts.map +1 -0
- package/dist/modules/background/state.d.ts +9 -0
- package/dist/modules/background/state.d.ts.map +1 -0
- package/dist/modules/background/{utils.d.ts → visual.d.ts} +6 -14
- package/dist/modules/background/visual.d.ts.map +1 -0
- package/dist/modules/background/youtube/player.d.ts +28 -0
- package/dist/modules/background/youtube/player.d.ts.map +1 -0
- package/dist/modules/context-menu/context.d.ts +1 -10
- package/dist/modules/context-menu/context.d.ts.map +1 -1
- package/dist/modules/context-menu/dom.d.ts +8 -0
- package/dist/modules/context-menu/dom.d.ts.map +1 -0
- package/dist/modules/context-menu/hooks.d.ts +11 -11
- package/dist/modules/context-menu/hooks.d.ts.map +1 -1
- package/dist/modules/context-menu/index.d.ts +8 -3
- package/dist/modules/context-menu/index.d.ts.map +1 -1
- package/dist/modules/context-menu/index.js +97 -101
- package/dist/modules/context-menu/index.js.map +1 -1
- package/dist/modules/context-menu/{utils.d.ts → items.d.ts} +2 -9
- package/dist/modules/context-menu/items.d.ts.map +1 -0
- package/dist/modules/context-menu/module.d.ts.map +1 -1
- package/dist/modules/context-menu/overlay.d.ts +13 -1
- package/dist/modules/context-menu/overlay.d.ts.map +1 -1
- package/dist/modules/context-menu/state.d.ts +1 -0
- package/dist/modules/context-menu/state.d.ts.map +1 -1
- package/dist/modules/controls/{utils.d.ts → entries.d.ts} +6 -5
- package/dist/modules/controls/entries.d.ts.map +1 -0
- package/dist/modules/controls/hooks.d.ts +0 -7
- package/dist/modules/controls/hooks.d.ts.map +1 -1
- package/dist/modules/controls/index.d.ts +5 -3
- package/dist/modules/controls/index.d.ts.map +1 -1
- package/dist/modules/controls/index.js +66 -61
- package/dist/modules/controls/index.js.map +1 -1
- package/dist/modules/controls/layout.d.ts +7 -0
- package/dist/modules/controls/layout.d.ts.map +1 -0
- package/dist/modules/controls/overlay.d.ts +9 -0
- package/dist/modules/controls/overlay.d.ts.map +1 -1
- package/dist/modules/dock/cards.d.ts.map +1 -1
- package/dist/modules/dock/dom.d.ts +24 -0
- package/dist/modules/dock/dom.d.ts.map +1 -0
- package/dist/modules/dock/helpers.d.ts +25 -0
- package/dist/modules/dock/helpers.d.ts.map +1 -0
- package/dist/modules/dock/hooks.d.ts +3 -918
- package/dist/modules/dock/hooks.d.ts.map +1 -1
- package/dist/modules/dock/index.d.ts +3 -2
- package/dist/modules/dock/index.d.ts.map +1 -1
- package/dist/modules/dock/index.js +3091 -3079
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/dock/layout.d.ts +26 -0
- package/dist/modules/dock/layout.d.ts.map +1 -0
- package/dist/modules/dock/module.d.ts.map +1 -1
- package/dist/modules/dock/overlay.d.ts.map +1 -1
- package/dist/modules/dock/paths.d.ts +10 -0
- package/dist/modules/dock/paths.d.ts.map +1 -0
- package/dist/modules/dock/provider.d.ts.map +1 -1
- package/dist/modules/dock/runtime/display.d.ts.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/runtime/pipeline.d.ts +32 -0
- package/dist/modules/dock/runtime/pipeline.d.ts.map +1 -0
- package/dist/modules/dock/status/events.d.ts.map +1 -1
- package/dist/modules/dock/styles.d.ts +900 -0
- package/dist/modules/dock/styles.d.ts.map +1 -0
- package/dist/modules/dock/surface/context.d.ts +1 -2
- package/dist/modules/dock/surface/context.d.ts.map +1 -1
- package/dist/modules/dock/surface/definition.d.ts.map +1 -1
- package/dist/modules/dock/surface/helpers.d.ts +7 -0
- package/dist/modules/dock/surface/helpers.d.ts.map +1 -0
- package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
- package/dist/modules/dock/surface/machine.d.ts.map +1 -1
- package/dist/modules/dock/surface/stack.d.ts.map +1 -1
- package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.js +4861 -4788
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loading/context.d.ts +2 -13
- package/dist/modules/loading/context.d.ts.map +1 -1
- package/dist/modules/loading/hooks.d.ts +15 -2
- package/dist/modules/loading/hooks.d.ts.map +1 -1
- package/dist/modules/loading/index.d.ts +3 -2
- package/dist/modules/loading/index.d.ts.map +1 -1
- package/dist/modules/loading/index.js +38 -34
- package/dist/modules/loading/index.js.map +1 -1
- package/dist/modules/loading/module.d.ts.map +1 -1
- package/dist/modules/loading/state.d.ts +6 -0
- package/dist/modules/loading/state.d.ts.map +1 -0
- package/dist/modules/media/constants.d.ts +0 -1
- package/dist/modules/media/constants.d.ts.map +1 -1
- package/dist/modules/media/context.d.ts +2 -6
- package/dist/modules/media/context.d.ts.map +1 -1
- package/dist/modules/media/hooks.d.ts +6 -1
- package/dist/modules/media/hooks.d.ts.map +1 -1
- package/dist/modules/media/index.d.ts +4 -3
- package/dist/modules/media/index.d.ts.map +1 -1
- package/dist/modules/media/index.js +100 -98
- package/dist/modules/media/index.js.map +1 -1
- package/dist/modules/media/module.d.ts.map +1 -1
- package/dist/modules/media/overlay.d.ts +0 -5
- package/dist/modules/media/overlay.d.ts.map +1 -1
- package/dist/modules/media/playback.d.ts +5 -0
- package/dist/modules/media/playback.d.ts.map +1 -0
- package/dist/modules/media/session.d.ts +8 -0
- package/dist/modules/media/session.d.ts.map +1 -0
- package/dist/modules/media/types.d.ts +0 -1
- package/dist/modules/media/types.d.ts.map +1 -1
- package/dist/modules/modal/context.d.ts +1 -12
- package/dist/modules/modal/context.d.ts.map +1 -1
- package/dist/modules/modal/dom.d.ts +4 -0
- package/dist/modules/modal/dom.d.ts.map +1 -0
- package/dist/modules/modal/header.d.ts +7 -0
- package/dist/modules/modal/header.d.ts.map +1 -0
- package/dist/modules/modal/hooks.d.ts +12 -1
- package/dist/modules/modal/hooks.d.ts.map +1 -1
- package/dist/modules/modal/identity.d.ts +7 -0
- package/dist/modules/modal/identity.d.ts.map +1 -0
- package/dist/modules/modal/index.d.ts +9 -4
- package/dist/modules/modal/index.d.ts.map +1 -1
- package/dist/modules/modal/index.js +118 -86
- package/dist/modules/modal/index.js.map +1 -1
- package/dist/modules/modal/layout.d.ts +13 -0
- package/dist/modules/modal/layout.d.ts.map +1 -0
- package/dist/modules/modal/module.d.ts.map +1 -1
- package/dist/modules/modal/overlay.d.ts.map +1 -1
- package/dist/modules/modal/types.d.ts.map +1 -1
- package/dist/modules/notification/context.d.ts +2 -8
- package/dist/modules/notification/context.d.ts.map +1 -1
- package/dist/modules/notification/hooks.d.ts +8 -1
- package/dist/modules/notification/hooks.d.ts.map +1 -1
- package/dist/modules/notification/index.d.ts +4 -3
- package/dist/modules/notification/index.d.ts.map +1 -1
- package/dist/modules/notification/index.js +56 -46
- package/dist/modules/notification/index.js.map +1 -1
- package/dist/modules/notification/state.d.ts +17 -0
- package/dist/modules/notification/state.d.ts.map +1 -0
- package/dist/provider.js.map +1 -1
- package/docs/modules/ambient.md +12 -8
- package/docs/modules/background.md +15 -13
- package/docs/modules/context-menu.md +13 -13
- package/docs/modules/controls.md +4 -3
- package/docs/modules/dock.md +8 -2
- package/docs/modules/loading.md +11 -11
- package/docs/modules/media.md +8 -7
- package/docs/modules/modal.md +4 -1
- package/docs/modules/notification.md +4 -4
- package/package.json +1 -1
- package/dist/modules/ambient/utils.d.ts +0 -18
- package/dist/modules/ambient/utils.d.ts.map +0 -1
- package/dist/modules/background/utils.d.ts.map +0 -1
- package/dist/modules/context-menu/utils.d.ts.map +0 -1
- package/dist/modules/controls/utils.d.ts.map +0 -1
- package/dist/modules/dock/utils.d.ts +0 -93
- package/dist/modules/dock/utils.d.ts.map +0 -1
- package/dist/modules/loading/utils.d.ts +0 -4
- package/dist/modules/loading/utils.d.ts.map +0 -1
- package/dist/modules/media/utils.d.ts +0 -17
- package/dist/modules/media/utils.d.ts.map +0 -1
- package/dist/modules/modal/utils.d.ts +0 -31
- package/dist/modules/modal/utils.d.ts.map +0 -1
- package/dist/modules/notification/utils.d.ts +0 -9
- package/dist/modules/notification/utils.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/use-required-context.ts","../../../src/hooks/use-store.ts","../../../src/utils/string.ts","../../../src/utils/dom.ts","../../../src/utils/number.ts","../../../src/utils/object.ts","../../../src/utils/report.ts","../../../src/utils/store.ts","../../../src/hooks/use-isomorphic-layout-effect.ts","../../../src/kernel/constants.ts","../../../src/kernel/context-registry.ts","../../../src/kernel/utils.ts","../../../src/kernel/schema.ts","../../../src/kernel/provider.tsx","../../../src/kernel/installed.ts","../../../src/kernel/handlers.ts","../../../src/kernel/hooks.ts","../../../src/kernel/module.tsx","../../../src/kernel/adapters.ts","../../../src/theme.tsx","../../../src/modules/context-menu/constants.ts","../../../src/modules/context-menu/utils.ts","../../../src/modules/context-menu/resolver.ts","../../../src/modules/context-menu/state.ts","../../../src/modules/context-menu/context.tsx","../../../src/atoms/icon.tsx","../../../src/tokens/motion.ts","../../../src/modules/dock/context.ts","../../../src/modules/dock/hooks.ts","../../../src/modules/context-menu/hooks.ts","../../../src/modules/context-menu/motion.ts","../../../src/modules/context-menu/overlay.tsx","../../../src/modules/context-menu/module.tsx"],"names":["useCallback","useSyncExternalStore","use","hasChanged","stabilizedValue","useRef","useState","useMemo","isValidElement","usePathname","useEffect","jsx","IconifyIcon","useContext","useLayoutEffect","jsxs"],"mappings":";;;;;;;AAIO,SAAS,kBAAA,CACd,OAAA,EACA,QAAA,EACA,YAAA,EACG;AACH,EAAA,MAAM,KAAA,GAAQ,IAAI,OAAO,CAAA;AACzB,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,qBAAA,EAAwB,YAAY,CAAA,CAAE,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,KAAA;AACT;ACTO,SAAS,QAAA,CACd,OACA,QAAA,GAAsC,CAAC,UACrC,KAAA,EACF,OAAA,GAA6C,OAAO,EAAA,EAC5C;AACR,EAAA,MAAM,WAAW,MAAA,CAKd;AAAA,IACD,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,MAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,mBAAA,GAAsB,YAAY,MAAM;AAC5C,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IACE,KAAA,CAAM,aAAa,QAAA,IACnB,KAAA,CAAM,aAAa,QAAA,IACnB,KAAA,CAAM,YAAY,OAAA,EAClB;AACA,MAAA,OAAO,KAAA,CAAM,QAAA;AAAA,IACf;AAEA,IAAA,MAAM,QAAA,GAAW,SAAS,QAAQ,CAAA;AAClC,IAAA,IACE,KAAA,CAAM,QAAA,KAAa,IAAA,IACnB,KAAA,CAAM,OAAA,KAAY,WAClB,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAoB,QAAQ,CAAA,EAC1C;AACA,MAAA,KAAA,CAAM,QAAA,GAAW,QAAA;AACjB,MAAA,KAAA,CAAM,QAAA,GAAW,QAAA;AACjB,MAAA,OAAO,KAAA,CAAM,QAAA;AAAA,IACf;AAEA,IAAA,QAAA,CAAS,OAAA,GAAU;AAAA,MACjB,OAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,QAAA,EAAU,KAAK,CAAC,CAAA;AAE7B,EAAA,OAAO,oBAAA;AAAA,IACL,KAAA,CAAM,SAAA;AAAA,IACN,mBAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC3DO,SAAS,WAAW,KAAA,EAA+B;AACxD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,IAAA;AAClD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAK;AACnC,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,IAAA;AACxC;AAcO,SAAS,kBAAkB,IAAA,EAAwB;AACxD,EAAA,OACE,OAAO,IAAA,KAAS,QAAA,KACf,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,IACxB,IAAA,CAAK,UAAA,CAAW,UAAU,KAC1B,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IACnB,IAAA,CAAK,WAAW,aAAa,CAAA,CAAA;AAEnC;;;ACxBO,IAAM,SAAA,GAAqB,OAAO,MAAA,KAAW,WAAA;;;ACI7C,SAAS,cAAA,CAAe,KAAA,EAAgB,QAAA,GAAmB,CAAA,EAAW;AAC3E,EAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,QAAA;AAC5C;;;ACTO,SAAS,SAAS,KAAA,EAAkD;AACzE,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC5E;AAyCO,SAAS,QAAW,KAAA,EAAwC;AACjE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,SAAkB,EAAC;AACnD,EAAA,OAAO,MAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAC9C;ACpCO,SAAS,MAAA,CACd,KAAA,EACA,KAAA,EACA,KAAA,GAAqB,OAAA,EACf;AAQN,EAAA,IAAI,QAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,IAAgB,OAAO,WAAW,WAAA,EAAa;AAC1E,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,CAAA,EAAI,KAAK,KAAK,KAAK,CAAA;AACpC;;;ACdA,SAAS,oBAA4B,KAAA,EAAuB;AAC1D,EAAA,IACE,OAAA,CAAQ,IAAI,QAAA,KAAa,YAAA,IACzB,CAAC,KAAA,IACD,OAAO,UAAU,QAAA,EACjB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAgB;AACjC,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAwB;AACtC,IAAA,IAAI,KAAK,GAAA,CAAI,KAAK,KAAK,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/C,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAEd,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AAC7C,IAAA,IACE,KAAA,CAAM,QAAQ,KAAK,CAAA,IACnB,cAAc,MAAA,CAAO,SAAA,IACrB,cAAc,IAAA,EACd;AACA,MAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxC,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,GAAG,CAAA;AAC7D,QAAA,IAAI,UAAA,IAAc,OAAA,IAAW,UAAA,IAAc,UAAA,CAAW,UAAU,IAAA,EAAM;AACpE,UAAA,IAAI,OAAO,UAAA,CAAW,KAAA,KAAU,QAAA,EAAU,MAAA,CAAO,WAAW,KAAK,CAAA;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAA,CAAO,KAAK,CAAA;AACZ,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,YACd,YAAA,EACA,EAAE,kBAAkB,IAAA,EAAK,GAAwB,EAAC,EAC3B;AACvB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,EAAA,MAAM,OAAA,GAAU,eAAA,GACZ,mBAAA,GACA,CAAI,KAAA,KAAgB,KAAA;AACxB,EAAA,IAAI,QAAA,GAAW,QAAQ,YAAY,CAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,CACd,kBAAA,KACY;AACZ,IAAA,MAAM,YACJ,OAAO,kBAAA,KAAuB,UAAA,GACzB,kBAAA,CAAwD,QAAQ,CAAA,GACjE,kBAAA;AACN,IAAA,IAAI,MAAA,CAAO,EAAA,CAAG,QAAA,EAAU,SAAS,GAAG,OAAO,KAAA;AAC3C,IAAA,QAAA,GAAW,QAAQ,SAAS,CAAA;AAE5B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI;AACF,QAAA,QAAA,EAAS;AAAA,MACX,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,sBAAA,EAAwB,OAAO,MAAM,CAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CACf,OAAA,KACY;AACZ,IAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,MAAA,OAAO,QAAQ,OAA2C,CAAA;AAAA,IAC5D;AACA,IAAA,IACE,YACA,OAAO,QAAA,KAAa,YACpB,OAAA,IACA,OAAO,YAAY,QAAA,EACnB;AACA,MAAA,OAAO,QAAQ,EAAE,GAAG,QAAA,EAAU,GAAG,SAAS,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,QAAQ,OAAiB,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,WAAA,GAAc;AACZ,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAU,QAAA,EAAsB;AAC9B,MAAA,IAAI,OAAO,QAAA,KAAa,UAAA,EAAY,OAAO,MAAM;AAAA,MAAC,CAAA;AAClD,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,MAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,IACxC;AAAA,GACD,CAAA;AACH;;;ACzGO,IAAM,yBAAA,GAA4B,YACrC,eAAA,GACA,SAAA;;;ACAG,IAAM,cAAA,GAAiC,SAAA;AAEvC,IAAM,gBAAA,GACX,OAAO,MAAA,CAAO;AAAA,EACZ,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAC,CAAA;AAEI,IAAM,mBAAA,GACX,OAAO,MAAA,CAAO;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC,CAAA;AAEI,IAAM,yBAAA,GAET,OAAO,MAAA,CAAO;AAAA,EAChB,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAC,CAAA;AAEM,IAAM,sBAAA,GAA4C,OAAO,MAAA,CAAO;AAAA,EACrE,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGC,OAAO,MAAA,CAAO;AAAA,EACZ,CAAC,gBAAA,CAAiB,MAAM,GAAG,GAAA;AAAA,EAC3B,CAAC,gBAAA,CAAiB,OAAO,GAAG,GAAA;AAAA,EAC5B,CAAC,gBAAA,CAAiB,IAAI,GAAG;AAC3B,CAAC;AAGD,OAAO,MAAA,CAAO;AAAA,EACZ,CAAC,gBAAA,CAAiB,MAAM,GAAG,EAAA;AAAA,EAC3B,CAAC,gBAAA,CAAiB,OAAO,GAAG,EAAA;AAAA,EAC5B,CAAC,gBAAA,CAAiB,IAAI,GAAG;AAC3B,CAAC;AAEI,IAAM,4BAAiD,IAAI,GAAA;AAAA,EAChE,MAAA,CAAO,OAAO,mBAAmB;AACnC,CAAA;AAEO,IAAM,4BAAiD,IAAI,GAAA;AAAA,EAChE;AACF,CAAA;AAEA,IAAM,oBAAA,GACJ,OAAO,MAAA,CAAO;AAAA,EACZ,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAC,CAAA;AAGD,oBAAA,CAAqB;ACxEhB,SAAS,wBAAA,CACd,MACA,YAAA,EACY;AACZ,EAAA,MAAM,GAAA,mBAAM,MAAA,CAAO,GAAA,CAAI,CAAA,gCAAA,EAAmC,IAAI,CAAA,CAAE,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,UAAA;AACd,EAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AACf,IAAA,KAAA,CAAM,GAAG,CAAA,GAAI,aAAA,CAAiB,YAAY,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;;;ACOO,SAAS,kBAAkB,KAAA,EAA+B;AAC/D,EAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AAC5C;AAEO,SAAS,cAAA,CACd,KAAA,EACA,QAAA,GAA0B,IAAA,EACX;AACf,EAAA,OAAO,UAAA,CAAW,KAAK,CAAA,IAAK,QAAA;AAC9B;;;ACEA,SAAS,gBAAA,CACP,UACA,QAAA,EAC0B;AAC1B,EAAA,MAAM,SAAA,GAAY,QAAA,EAAU,SAAA,IAAa,QAAA,EAAU,OAAA;AACnD,EAAA,OAAO,SAAA,IAAa,yBAAA,CAA0B,GAAA,CAAI,SAAS,IACvD,SAAA,GACA,QAAA;AACN;AAEO,SAAS,yBAAyB,QAAA,EAAqC;AAC5E,EAAA,IAAI,QAAA,KAAa,UAAa,QAAA,KAAa,IAAA;AACzC,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAC,EAAG,OAAO,IAAA,EAAK;AACnC,EAAA,IAAI,CAAC,SAAS,QAAQ,CAAA;AACpB,IAAA,OAAO,EAAE,MAAA,EAAQ,CAAC,qCAAqC,CAAA,EAAG,OAAO,KAAA,EAAM;AAEzE,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACrC,IAAA,IAAI,CAAC,yBAAA,CAA0B,GAAA,CAAI,GAAG,CAAA;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAE,CAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,IAAI,SAAS,MAAA,KAAW,MAAA,IAAa,CAAC,cAAA,CAAe,SAAS,MAAM,CAAA;AAClE,IAAA,MAAA,CAAO,KAAK,mCAAmC,CAAA;AACjD,EAAA,IAAI,SAAS,UAAA,KAAe,MAAA,IAAa,CAAC,cAAA,CAAe,SAAS,UAAU,CAAA;AAC1E,IAAA,MAAA,CAAO,KAAK,uCAAuC,CAAA;AACrD,EAAA,IAAI,SAAS,KAAA,KAAU,MAAA,IAAa,CAAC,cAAA,CAAe,SAAS,KAAK,CAAA;AAChE,IAAA,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAChD,EAAA,IACE,SAAS,QAAA,KAAa,MAAA,IACtB,iBAAA,CAAkB,QAAA,CAAS,QAAQ,CAAA,KAAM,IAAA;AAEzC,IAAA,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAEhD,EAAA,IAAI,QAAA,CAAS,mBAAmB,MAAA,EAAW;AACzC,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,QAAA,CAAS,cAAc,CAAA;AACvD,IAAA,IAAI,KAAA,KAAU,QAAQ,KAAA,GAAQ,CAAA;AAC5B,MAAA,MAAA,CAAO,KAAK,qDAAqD,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,OAAA;AACjD,EAAA,IACE,SAAA,KAAc,UACd,CAAC,yBAAA,CAA0B,IAAI,MAAA,CAAO,SAAS,CAAC,CAAA,EAChD;AACA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,6BAA6B,CAAC,GAAG,yBAAyB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,IACE,SAAS,UAAA,KAAe,MAAA,IACxB,CAAC,MAAA,CAAO,MAAA,CAAgB,yBAAyB,CAAA,CAAE,QAAA;AAAA,IACjD,QAAA,CAAS;AAAA,GACX,EACA;AACA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,8BAA8B,MAAA,CAAO,MAAA,CAAO,yBAAyB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,WAAW,CAAA,EAAE;AAC9C;AAsEO,SAAS,0BACd,QAAA,EACA;AAAA,EACE,qBAAA,GAAwB,IAAA;AAAA,EACxB,gBAAA,GAAmB,IAAA;AAAA,EACnB,aAAA,GAAgB;AAClB,CAAA,GAII,EAAC,EACuB;AAC5B,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,QAAQ,CAAA,GAAI,WAAW,EAAC;AAEtD,EAAA,MAAM,sBAAA,GAAyB,kBAAkB,qBAAqB,CAAA;AACtE,EAAA,MAAM,sBAAA,GACJ,sBAAA,KAA2B,IAAA,IAAQ,sBAAA,IAA0B,IACzD,sBAAA,GACA,IAAA;AACN,EAAA,MAAM,oBACJ,gBAAA,IAAoB,yBAAA,CAA0B,GAAA,CAAI,gBAAgB,IAC9D,gBAAA,GACA,IAAA;AAEN,EAAA,MAAM,MAAA,GACJ,eAAe,YAAA,CAAa,MAAM,KAClC,cAAA,CAAe,aAAA,EAAe,cAAc,CAAA,IAC5C,cAAA;AACF,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,YAAA,CAAa,KAAK,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,YAAA,CAAa,QAAQ,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,YAAA,EAAc,iBAAiB,CAAA;AAClE,EAAA,MAAM,aAAa,gBAAA,CAAiB,YAAA,CAAa,UAAU,CAAA,GACvD,aAAa,UAAA,GACb,IAAA;AAEJ,EAAA,MAAM,qBAAA,GAAwB,iBAAA,CAAkB,YAAA,CAAa,cAAc,CAAA;AAC3E,EAAA,IAAI,cAAA,GACF,qBAAA,KAA0B,IAAA,IAAQ,qBAAA,IAAyB,IACvD,qBAAA,GACA,sBAAA;AAEN,EAAA,IAAI,SAAA,KAAc,oBAAoB,SAAA,EAAW;AAC/C,IAAA,cAAA,GAAiB,CAAA;AAAA,EACnB,CAAA,MAAA,IAAA,CACG,cAAc,mBAAA,CAAoB,QAAA,IACjC,cAAc,mBAAA,CAAoB,KAAA,KACpC,mBAAmB,IAAA,EACnB;AACA,IAAA,cAAA,GAAiB,sBAAA;AAAA,EACnB;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,GAAI,QAAA,KAAa,IAAA,IAAQ,EAAE,QAAA,EAAS;AAAA,MACpC,GAAI,UAAA,KAAe,yBAAA,CAA0B,MAAA,IAAU,EAAE,UAAA,EAAW;AAAA,MACpE,GAAI,KAAA,IAAS,EAAE,KAAA;AAAM,KACvB;AAAA,IACA,MAAA;AAAA,IACA,GAAI,KAAA,IAAS,EAAE,KAAA,EAAM;AAAA,IACrB,GAAI,UAAA,IAAc,EAAE,UAAA;AAAW,GACjC;AACF;AAEA,SAAS,iBAAiB,KAAA,EAAiD;AACzE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAgB,yBAAyB,CAAA,CAAE,SAAS,KAAK,CAAA;AACzE;AAEO,SAAS,qBAAqB,OAAA,EAAoC;AACvE,EAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,SAAU,EAAC;AAChC,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,sBAAA,CAAuB,OAAO,CAAC,GAAA,KAAQ,QAAQ,GAAG,CAAA,KAAM,MAAS,CAAA,CAAE,GAAA;AAAA,MACjE,CAAC,GAAA,KAAQ,CAAC,GAAA,EAAK,OAAA,CAAQ,GAAG,CAAC;AAAA;AAC7B,GACF;AACF;AC/MA,IAAM,eAAA,GAAkB,wBAAA;AAAA,EAEtB,iBAAA;AAAA,EACA;AACF,CAAA;AAmCO,SAAS,kBAAA,GAAsD;AACpE,EAAA,OAAO,kBAAA;AAAA,IACL,eAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF,CAAE,OAAA;AACJ;AAEA,SAAS,uBAAA,GAAgE;AACvE,EAAA,OAAO,kBAAA;AAAA,IACL,eAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACF,CAAE,YAAA;AACJ;AAoBO,SAAS,mBAGd,IAAA,EAA4B;AAC5B,EAAA,MAAM,EAAE,kBAAA,EAAoB,SAAA,EAAU,GAAI,uBAAA,EAAwB;AAElE,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,QAAA,KAAyB,SAAA,CAAU,IAAA,EAAM,MAAM,QAAQ,CAAA;AAAA,IACxD,CAAC,WAAW,IAAI;AAAA,GAClB;AACA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,MAAM,mBAAyB,IAAI,CAAA;AAAA,IACnC,CAAC,oBAAoB,IAAI;AAAA,GAC3B;AAEA,EAAA,OAAOC,oBAAAA,CAAqB,eAAA,EAAiB,UAAA,EAAY,UAAU,CAAA;AACrE;AClGO,IAAM,aAAA,GAA0C,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAKhE,IAAM,iBAAA,GACX,wBAAA,CAAiD,mBAAA,EAAqB,IAAI,CAAA;AAGrE,SAAS,iBAAA,CACd,YACA,MAAA,EACS;AACT,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,MAAA,GAC3B,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,GAC5B,MAAA,CAAmC,UAAA,CAAW,EAAE,CAAA;AACrD,EAAA,OAAO,KAAA,IAAS,IAAA;AAClB;AAEO,SAAS,mBAAA,CACd,OAAA,EACA,MAAA,EACA,QAAA,GAA6B,EAAC,EACX;AACnB,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,KAAA,MAAW,cAAc,OAAA,EAAS;AAChC,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,OAAA,EAAS;AAC/B,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,UAAA,EAAY,MAAM,CAAA;AAClD,IAAA,IAAI,UAAU,IAAA,EAAM;AACpB,IAAA,OAAA,CAAQ,UAAA,CAAW,EAAE,CAAA,GAAI,KAAA;AACzB,IAAA,SAAA,GAAY,IAAA;AAAA,EACd;AACA,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAG,QAAA;AAAA,MACH,GAAI,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA,CAAO,WAAW;AAAC;AACrD,GACF;AACF;AAqDO,SAAS,mBAAA,GAAgD;AAC9D,EAAA,OAAOC,GAAAA,CAAI,iBAAiB,CAAA,EAAG,OAAA,IAAW,aAAA;AAC5C;;;ACrGA,SAAS,sBAAsB,SAAA,EAA6B;AAC1D,EAAA,OAAO,cAAc,mBAAA,CAAoB,UAAA;AAC3C;AAEA,SAAS,oBAAA,CACP,SACA,QAAA,EACe;AACf,EAAA,OAAO,OAAO,QAAQ,KAAA,KAAU,UAAA,GAC5B,QAAQ,KAAA,CAAM,QAAQ,CAAA,GACtB,QAAA,CAAS,OAAO,CAAA;AACtB;AAEA,SAAS,qBAAA,CACP,IAAA,EACA,GAAA,EACA,MAAA,EACA,YACA,KAAA,EACQ;AACR,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,OAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA,IAAS,IAAA;AAAA,IACT,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAEA,SAAS,gBACP,OAAA,EACc;AACd,EAAA,OAAO,OAAA,EAAS,YAAA,oBAAgB,IAAI,GAAA,EAAI;AAC1C;AAEA,SAAS,iBAAA,CAAkB,OAAqB,UAAA,EAA0B;AACxE,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AACtC,EAAA,IAAI,CAAC,SAAA,EAAW;AAChB,EAAA,SAAA,CAAU,SAAA,GAAY,IAAA;AACtB,EAAA,IAAI,SAAA,CAAU,OAAA,KAAY,IAAA,EAAM,YAAA,CAAa,UAAU,OAAO,CAAA;AAC9D,EAAA,KAAA,CAAM,OAAO,UAAU,CAAA;AACzB;AAEA,SAAS,eAAA,CACP,KAAA,EACA,UAAA,EACA,QAAA,EACA,OAAA,EACM;AACN,EAAA,iBAAA,CAAkB,OAAO,UAAU,CAAA;AACnC,EAAA,MAAM,SAAA,GAAkC;AAAA,IACtC,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,SAAA,CAAU,OAAA,GAAU,WAAW,MAAM;AACnC,IAAA,IAAI,UAAU,SAAA,IAAa,KAAA,CAAM,GAAA,CAAI,UAAU,MAAM,SAAA,EAAW;AAChE,IAAA,KAAA,CAAM,OAAO,UAAU,CAAA;AACvB,IAAA,QAAA,EAAS;AAAA,EACX,GAAG,OAAO,CAAA;AAEV,EAAA,KAAA,CAAM,GAAA,CAAI,YAAY,SAAS,CAAA;AACjC;AAOA,SAAS,0BAAA,CACP,UAAA,EACA,KAAA,EACA,YAAA,EACA,OAAA,EACsB;AACtB,EAAA,MAAM,aAAa,UAAA,CAAW,QAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,WAAW,IAAA,EAAM,OAAA;AACnC,EAAA,IAAI,CAAC,cAAc,CAAC,SAAA,IAAa,SAAS,IAAA,IAAQ,KAAA,KAAU,KAAA,EAAO,OAAO,EAAC;AAE3E,EAAA,MAAM,OAAO,UAAA,CAAW,EAAA;AACxB,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACnD,EAAA,MAAM,gBAAsC,EAAC;AAE7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,IAAA,KAAS,KAAA,EAAO;AACpC,IAAA,MAAM,YAAA,GACJ,QAAA,CAAS,IAAI,CAAA,IAAK,QAAA,CAAS,KAAK,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAA,GAAW,EAAC;AAC/D,IAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAc,GAAG,YAAA,EAAa;AACpD,IAAA,IACE,SAAS,UAAA,KAAe,QAAA,IACxB,CAAC,wBAAA,CAAyB,QAAQ,EAAE,KAAA,EACpC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAI,CAAA,GACzB,MAAA,CAAO,WAAA;AAAA,MACL,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,KAAQ,UAAU;AAAA,KAC3D,GACA,IAAA;AACJ,IAAA,MAAM,EAAE,gBAAgB,SAAA,EAAW,eAAA,EAAiB,OAAO,MAAA,EAAO,GAChE,0BAA0B,QAAA,EAAU;AAAA,MAClC,qBAAA,EAAuB,WAAW,cAAA,IAAkB,IAAA;AAAA,MACpD,kBAAkB,UAAA,CAAW,SAAA;AAAA,MAC7B,aAAA,EAAe;AAAA,KAChB,CAAA;AAEH,IAAA,KAAA,MAAW,EAAE,KAAK,KAAA,EAAM,IAAK,UAAU,OAAA,EAAS,OAAO,CAAA,IAAK,EAAC,EAAG;AAC9D,MAAA,MAAM,UAAA,GAAa,UAAA,CAAW,QAAA,GAAW,KAAK,CAAA;AAC9C,MAAA,IAAI,UAAA,IAAc,CAAC,UAAA,CAAW,KAAA,EAAO;AACnC,QAAA,MAAA,CAAO,CAAA,SAAA,EAAY,IAAI,CAAA,kBAAA,CAAA,EAAsB,UAAA,CAAW,QAAQ,MAAM,CAAA;AACtE,QAAA;AAAA,MACF;AACA,MAAA,aAAA,CAAc,IAAA,CAAK;AAAA,QACjB,cAAA;AAAA,QACA,UAAA,EAAY,qBAAA;AAAA,UACV,IAAA;AAAA,UACA,GAAA;AAAA,UACA,MAAA;AAAA,UACA,OAAA,CAAQ,UAAA;AAAA,UACR;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA,SAAA;AAAA,QACA,eAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,aAAA;AACT;AAEA,IAAM,aAAa,MAAM;AAAC,CAAA;AAEnB,SAAS,mBAAA,CACd,QACA,OAAA,EACY;AACZ,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AACpC,EAAA,IAAI,CAAC,MAAA,IAAU,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,UAAA;AAC5C,EAAA,MAAM,eAAe,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA,CAAO,WAAW,EAAC;AACpE,EAAA,MAAM,MAAA,GAAS,MAAA;AAEf,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,CAAC,UAAA,KAAe;AACpD,IAAA,IAAI;AACF,MAAA,OAAO,0BAAA;AAAA,QACL,UAAA;AAAA,QACA,MAAA,CAAO,WAAW,EAAE,CAAA;AAAA,QACpB,YAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,CAAA,gBAAA,EAAmB,UAAA,CAAW,EAAE,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACjD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AACD,EAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,UAAA;AAEvC,EAAA,MAAM,YAAA,GAAe,gBAAgB,OAAO,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,CAAC,YAAA,MAAsC;AAAA,IACnD,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,OAAO,YAAA,CAAa,KAAA;AAAA,IACpB,QAAQ,YAAA,CAAa;AAAA,GACvB,CAAA;AAEA,EAAA,oBAAA,CAAqB,OAAA,EAAS,CAAC,KAAA,KAAU;AACvC,IAAA,aAAA,CAAc,OAAA;AAAA,MACZ,CAAC,EAAE,UAAA,EAAY,GAAA,EAAK,iBAAiB,MAAA,EAAQ,IAAA,EAAM,OAAM,KAAM;AAC7D,QAAA,iBAAA,CAAkB,cAAc,UAAU,CAAA;AAC1C,QAAA,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,QAAQ,eAAe,CAAA;AAAA,MAC1D;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAM;AACX,IAAA,MAAM,YAAkC,EAAC;AACzC,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,YAAA,KAAiB;AACtC,MAAA,IAAI,qBAAA,CAAsB,YAAA,CAAa,SAAS,CAAA,EAAG;AACnD,MAAA,MAAM,EAAE,cAAA,EAAgB,UAAA,EAAY,GAAA,EAAK,MAAK,GAAI,YAAA;AAClD,MAAA,IAAI,OAAO,cAAA,KAAmB,QAAA,IAAY,cAAA,GAAiB,CAAA,EAAG;AAC5D,QAAA,eAAA;AAAA,UACE,YAAA;AAAA,UACA,UAAA;AAAA,UACA,MAAM,OAAA,CAAQ,UAAA,CAAW,MAAM,GAAA,EAAK,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,UACvD;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,KAAK,YAAY,CAAA;AAAA,MAC7B;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC5B,IAAA,oBAAA,CAAqB,OAAA,EAAS,CAAC,KAAA,KAAU;AACvC,MAAA,SAAA,CAAU,OAAA;AAAA,QAAQ,CAAC,iBACjB,KAAA,CAAM,UAAA;AAAA,UACJ,YAAA,CAAa,IAAA;AAAA,UACb,YAAA,CAAa,GAAA;AAAA,UACb,MAAM,YAAY;AAAA;AACpB,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;;;ACrMA,SAAS,cAAA,CACP,UAAA,EACA,eAAA,EACA,UAAA,EAIA;AACA,EAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,EAAE,GAAI,QAAA,CAAS,UAAU,CAAA,GAAI,UAAA,GAAa,EAAC,EAAI,UAAA,EAAW;AAAA,MACtE;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,QAAA,CAAS,eAAe,CAAA,EAAG;AAC7B,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,eAAA,EAAiB,EAAE,GAAG,eAAA,EAAiB,UAAA;AAAW,KACpD;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA;AAAA,IACZ,eAAA,EAAiB;AAAA,MACf,GAAI,QAAA,CAAS,UAAU,CAAA,GAAI,aAAa,EAAC;AAAA,MACzC;AAAA;AACF,GACF;AACF;AAEA,SAAS,2BAAA,CACP,YACA,eAAA,EACkB;AAClB,EAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,eAAA,EAAgB;AAAA,EAC/C;AACA,EAAA,IAAI,QAAA,CAAS,eAAe,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,GAAG,eAAA,EAAiB,UAAA,EAAW;AAAA,EAC1C;AACA,EAAA,OAAO,EAAE,UAAA,EAAW;AACtB;AAEA,SAAS,+BAAA,CACP,UAAA,EACA,eAAA,EACA,UAAA,EACyD;AACzD,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,UAAA,EAAY,eAAA,EAAiB,UAAU,CAAA;AACpE,EAAA,OAAO,CAAC,KAAA,CAAM,eAAA,EAAiB,KAAA,CAAM,UAAU,CAAA;AACjD;AAYA,IAAM,uBAAA,GAA0B,EAAA;AAEhC,SAAS,0BAA0B,EAAA,EAAsC;AACvE,EAAA,MAAM,KAAA,GAA6B;AAAA,IACjC,OAAA,EAAS,EAAA;AAAA,IACT,UAAyB,IAAA,EAAiB;AACxC,MAAA,OAAO,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC;AAAA,GACF;AACA,EAAA,OAAO,KAAA;AACT;AAQA,SAAS,6BAAA,CACP,MACA,eAAA,EACS;AACT,EAAA,MAAM,KAAA,GAAQ,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAA;AACpD,EAAA,OAAO,QAAQ,KAAA,IAAS,eAAA,CAAgB,IAAI,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACvD;AAEA,SAAS,gBAAgB,KAAA,EAAyB;AAChD,EAAA,OACE,KAAA,KAAU,IAAA,IACV,KAAA,KAAU,MAAA,IACV,OAAO,KAAA,KAAU,SAAA,IACjB,OAAO,KAAA,KAAU,QAAA,IACjB,OAAO,KAAA,KAAU,QAAA,IACjB,eAAe,KAAK,CAAA;AAExB;AAEA,SAAS,qBACP,KAAA,EACkC;AAClC,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IACpB,CAAC,cAAA,CAAe,KAAK,CAAA;AAEzB;AAEA,SAAS,iBAAA,CACP,eACA,SAAA,EACS;AACT,EAAA,IACE,CAAC,oBAAA,CAAqB,aAAa,KACnC,CAAC,oBAAA,CAAqB,SAAS,CAAA,EAC/B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACtC,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ,OAAO,KAAA;AACpD,EAAA,OAAO,QAAA,CAAS,KAAA;AAAA,IAAM,CAAC,GAAA,KACrB,MAAA,CAAO,UAAU,cAAA,CAAe,IAAA,CAAK,eAAe,GAAG;AAAA,GACzD;AACF;AAEA,SAAS,sBAAA,CACP,KAAA,EACA,IAAA,EACA,KAAA,EACA,aAAA,EACA,uBAAO,IAAI,OAAA,EAAgB,EAC3B,KAAA,GAAQ,CAAA,EACC;AACT,EAAA,IAAI,KAAA,GAAQ,yBAAyB,OAAO,KAAA;AAE5C,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,cAAc,KAAA,CAAM,IAAA,IAAQ,QAAA,CAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAC1D,IAAA,IACE,WAAA,IACA,6BAAA,CAA8B,IAAA,EAAM,KAAA,CAAM,eAAe,CAAA,EACzD;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,KAAA,CAAM,SAAA,CAAU,IAAI,IAAI,CAAA;AACxB,IAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,0BAA0B,KAAoB,CAAA;AACtD,MAAA,KAAA,CAAM,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAAA,IAClB;AACA,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf;AAEA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,KAAA;AAC5B,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,SAAA,GAAY,sBAAA;AAAA,MAChB,KAAA,CAAM,KAAA;AAAA,MACN,GAAG,IAAI,CAAA,MAAA,CAAA;AAAA,MACP,KAAA;AAAA,MACA,cAAA,CAAe,aAAa,CAAA,GAAI,aAAA,CAAc,KAAA,GAAQ,MAAA;AAAA,MACtD,IAAA;AAAA,MACA,KAAA,GAAQ;AAAA,KACV;AACA,IAAA,IACE,cAAA,CAAe,aAAa,CAAA,IAC5B,aAAA,CAAc,IAAA,KAAS,KAAA,CAAM,IAAA,IAC7B,aAAA,CAAc,GAAA,KAAQ,KAAA,CAAM,GAAA,IAC5B,aAAA,CAAc,UAAU,SAAA,EACxB;AACA,MAAA,OAAO,aAAA;AAAA,IACT;AACA,IAAA,OAAO,YAAA,CAAa,OAAO,SAAS,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,eAAe,IACzC,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GACtB,KAAA;AACJ,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,aAAa,IAAI,aAAA,GAAgB,IAAA;AACrE,IAAA,IAAIC,WAAAA,GACF,CAAC,aAAA,IAAiB,aAAA,CAAc,WAAW,SAAA,CAAU,MAAA;AAEvD,IAAA,MAAMC,gBAAAA,GAA6B,SAAA,CAAU,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAChE,MAAA,MAAM,QAAA,GAAW,sBAAA;AAAA,QACf,IAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,QAChB,KAAA;AAAA,QACA,gBAAgB,KAAK,CAAA;AAAA,QACrB,IAAA;AAAA,QACA,KAAA,GAAQ;AAAA,OACV;AACA,MAAA,IAAI,CAAC,aAAA,IAAiB,QAAA,KAAa,aAAA,CAAc,KAAK,CAAA,EAAG;AACvD,QAAAD,WAAAA,GAAa,IAAA;AAAA,MACf;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,CAACA,cAAa,aAAA,GAAgBC,gBAAAA;AAAA,EACvC;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,cAAA,GAAiB,aAAA;AACvB,EAAA,MAAM,kBAA2C,EAAC;AAClD,EAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,aAAA,EAAe,KAAK,CAAA;AAC/D,EAAA,IAAI,aAAa,CAAC,gBAAA;AAElB,EAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACnC,IAAA,MAAM,SAAA,GAAY,sBAAA;AAAA,MAChB,OAAO,GAAG,CAAA;AAAA,MACV,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,MACd,KAAA;AAAA,MACA,iBAAiB,GAAG,CAAA;AAAA,MACpB,IAAA;AAAA,MACA,KAAA,GAAQ;AAAA,KACV;AACA,IAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,SAAA;AACvB,IAAA,IAAI,CAAC,gBAAA,IAAoB,SAAA,KAAc,cAAA,GAAiB,GAAG,CAAA,EAAG;AAC5D,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,CAAC,aAAa,aAAA,GAAgB,eAAA;AACvC;AAEA,SAAS,wBAAA,CACP,OAAA,EACA,OAAA,EACA,eAAA,EACM;AACN,EAAA,MAAM,kBAAA,GAAqBC,MAAAA,iBAAO,IAAI,GAAA,EAAkC,CAAA;AACxE,EAAA,MAAM,UAAA,GAAaA,OAKT,IAAI,CAAA;AAEd,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,MAAM,WAAW,UAAA,CAAW,OAAA;AAC5B,IAAA,IACE,YACA,QAAA,CAAS,OAAA,KAAY,OAAA,IACrB,QAAA,CAAS,YAAY,OAAA,EACrB;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,kBAAkB,kBAAA,CAAmB,OAAA;AAC3C,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,IAAA,MAAM,MAAA,GAAS,sBAAA;AAAA,MACb,OAAA;AAAA,MACA,QAAA;AAAA,MACA,EAAE,eAAA,EAAiB,eAAA,EAAiB,SAAA,EAAU;AAAA,MAC9C,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,eAAA,CAAgB,OAAA,CAAQ,CAAC,MAAA,EAAQ,IAAA,KAAS;AACxC,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG,eAAA,CAAgB,OAAO,IAAI,CAAA;AAAA,IACvD,CAAC,CAAA;AAED,IAAA,IACE,YACA,QAAA,CAAS,MAAA,KAAW,MAAA,IACpB,QAAA,CAAS,YAAY,OAAA,EACrB;AACA,MAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,EAAU,OAAA,EAAQ;AAClB,IAAA,UAAA,CAAW,OAAA,GAAU;AAAA,MACnB,OAAA,EAAS,mBAAA,CAAoB,MAAA,EAA6B,OAAO,CAAA;AAAA,MACjE,MAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,yBAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,UAAA,CAAW,SAAS,OAAA,EAAQ;AAC5B,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB,CAAA;AAAA,IACA;AAAC,GACH;AACF;AAEO,SAAS,2BACd,OAAA,EACA;AAAA,EACE,YAAA,uBAAmB,GAAA,EAAkC;AAAA,EACrD,UAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX;AACF,CAAA,EAGsB;AACtB,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,MACZ;AAAA,IACC,UAAU,CACR,IAAA,EACA,KACA,IAAA,EACA,eAAA,EACA,eAEA,KAAA,CAAM,QAAA;AAAA,MACJ,IAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAG,+BAAA;AAAA,QACD,UAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,IACF,UAAA,EAAY,CACV,IAAA,EACA,GAAA,EACA,oBAEA,KAAA,CAAM,UAAA;AAAA,MACJ,IAAA;AAAA,MACA,GAAA;AAAA,MACA,2BAAA,CAA4B,YAAY,eAAe;AAAA;AACzD,GACJ,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,GAAG,MAAM,OAAO,CAAA;AAAA,IAChB,KAAA,EAAO,CAAC,QAAA,KACN,OAAO,aAAa,UAAA,GAChB,OAAA,CAAQ,KAAA,CAAM,CAAC,UAAU,QAAA,CAAS,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA,GAC/C,CAAA;AAAA,IACN,YAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,WAAA,CACd,QACA,QAAA,EACM;AACN,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,UAAA,KAAe,kBAAA,EAAmB;AAC3D,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,EAAA,MAAM,UAAA,GAAa,CAAA,kBAAA,EAAqB,KAAA,EAAO,CAAA,CAAA;AAC/C,EAAA,MAAM,CAAC,YAAY,CAAA,GAAIC,QAAAA;AAAA,IACrB,0BAAU,GAAA;AAAkC,GAC9C;AAEA,EAAA,MAAM,OAAA,GAAUC,OAAAA;AAAA,IACd,MACE,0BAAA;AAAA,MACE,EAAE,KAAA,EAAO,QAAA,EAAU,UAAA,EAAW;AAAA,MAC9B;AAAA,QACE,YAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,IACF,CAAC,KAAA,EAAO,YAAA,EAAc,YAAY,OAAA,EAAS,QAAA,EAAU,UAAU,UAAU;AAAA,GAC3E;AAEA,EAAA,MAAM,OAAA,GAAUA,OAAAA;AAAA,IACd,MAAO,MAAA,GAAS,mBAAA,CAAoB,OAAA,EAAS,MAAA,EAAQ,QAAQ,CAAA,GAAI,IAAA;AAAA,IACjE,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO;AAAA,GAC5B;AACA,EAAA,MAAM,eAAA,GAAkBA,OAAAA;AAAA,IACtB,MACE,IAAI,GAAA;AAAA,MACF,OAAA,CACG,MAAA;AAAA,QACC,CAAC,UAAA,KAAe,UAAA,CAAW,QAAA,EAAU,SAAA,KAAc;AAAA,OACrD,CACC,GAAA,CAAI,CAAC,UAAA,KAAe,WAAW,EAAE;AAAA,KACtC;AAAA,IACF,CAAC,OAAO;AAAA,GACV;AACA,EAAA,wBAAA,CAAyB,OAAA,EAAS,SAAS,eAAe,CAAA;AAC5D;ACxYO,SAAS,aAMd,UAAA,EACgD;AAChD,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,YAAY,CAAA;AACxC;AA6HgD,YAAqB,MAAS;;;AC1JvE,SAAS,qBAAA,CACd,EAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,qBAAoB,CAAE,IAAA;AAAA,IACvC,CAAC,SAAA,KAAc,SAAA,CAAU,EAAA,KAAO;AAAA,GAClC;AACA,EAAA,MAAM,MAAA,GACJ,UAAA,IAAc,OAAA,EAAS,OAAA,KAAY,KAAA,IAAS,KAAA,IAAS,IAAA,GAChD,EAAE,CAAC,EAAE,GAAG,KAAA,EAAM,GACf,IAAA;AACN,EAAA,WAAA,CAAY,MAAA,EAAQ,oBAAA,CAAqB,OAAO,CAAC,CAAA;AACnD;ACUO,SAAS,gBAAkC,EAAA,EAA0B;AAC1E,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,CAAA;AAC7B;AASA,IAAM,KAAA,uBAAuD,GAAA,EAAI;AACjE,IAAM,YAAA,GAAe,wBAAA,CAEnB,cAAA,EAAgB,KAAK,CAAA;AAchB,SAAS,SACd,IAAA,EACkB;AAClB,EAAA,MAAM,SAAS,UAAA,CAAW,YAAY,CAAA,CAAE,GAAA,CAAI,KAAK,EAAE,CAAA;AACnD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,OAAA,EAAU,KAAK,EAAE,CAAA,qIAAA;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU;AAAC,GAC5B;AACF;;;ACpEO,IAAM,gBAAA,GACX,gBAAsC,cAAc;AAE/C,IAAM,gBAAA,GAAmB,cAAA;AACzB,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,kBAAA,GAAqB,EAAA;AAE3B,IAAM,6BAAA,GAAgC;AACtC,IAAM,gBAAA,GAAwC,OAAO,MAAA,CAAO;AAAA,EACjE,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAC,CAAA;ACMM,SAAS,kBACX,OAAA,EACK;AACR,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;AAEA,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,WAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,gBAAgB,KAAA,EAAiC;AAC/D,EAAA,OAAO,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AACvC;AAEO,SAAS,gBAAgB,KAAA,EAAwB;AACtD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC3D,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CACJ,GAAA,CAAI,eAAe,CAAA,CACnB,OAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,CACR,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,IAAA,EAAK;AAAA,EACV;AACA,EAAA,IAAIC,eAAe,KAAK,CAAA;AACtB,IAAA,OAAO,eAAA,CAAiB,KAAA,CAAM,KAAA,EAAoC,QAAQ,CAAA;AAC5E,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,gBAAA,CACd,KAAA,EACA,OAAA,EACA,YAAA,GAAe,IAAA,EACN;AACT,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,IAAI;AACF,MAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAQ,KAAK,CAAA;AACtB;AAEO,SAAS,cAAA,CACd,KAAA,EACA,OAAA,EACA,QAAA,EACG;AACH,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,OAAO,CAAA;AAC9B,MAAA,OAAO,QAAA,KAAa,SAAa,QAAA,GAAiB,QAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA,KAAU,SAAa,QAAA,GAAkB,KAAA;AAClD;AAEO,SAAS,0BAA0B,MAAA,EAAuB;AAC/D,EAAA,IAAI,CAAC,SAAA,EAAW;AAChB,EAAA,MAAA,CAAO,aAAA;AAAA,IACL,IAAI,YAAY,6BAAA,EAA+B;AAAA,MAC7C,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAM,CAAA;AAAE,KACnC;AAAA,GACH;AACF;AAEO,SAAS,UAAA,CACd,YACG,IAAA,EACY;AACf,EAAA,IAAI,OAAO,OAAA,KAAY,UAAA,EAAY,OAAO,MAAA;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAG,IAAI,CAAA;AAC9B,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,MAAA,MAAA,CAAO,KAAA;AAAA,QAAM,CAAC,GAAA,KACZ,MAAA,CAAO,6BAAA,EAA+B,GAAG;AAAA,OAC3C;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,yBAAyB,KAAK,CAAA;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEO,SAAS,0BAAA,CACd,QAAA,EACA,QAAA,GAAW,EAAA,EACiB;AAC5B,EAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,MAAM,KAAA,GAAS,QAAA,CAAS,gBAAA,IACtB,QAAA,CAAS,KAAA,IACT,IAAA;AACF,EAAA,MAAM,WAAA,GAAe,QAAA,CAAS,sBAAA,IAC5B,QAAA,CAAS,WAAA,IACT,IAAA;AACF,EAAA,MAAM,OAAA,GAAW,QAAA,CAAS,kBAAA,IACxB,QAAA,CAAS,OAAA,IACT,IAAA;AACF,EAAA,MAAM,IAAA,GAAQ,QAAA,CAAS,eAAA,IAAmB,QAAA,CAAS,IAAA,IAAQ,IAAA;AAE3D,EAAA,IAAI,CAAC,SAAS,CAAC,WAAA,IAAe,CAAC,IAAA,IAAQ,CAAC,SAAS,OAAO,IAAA;AAExD,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,eAAA,EAAiB,gBAAgB,WAAW,CAAA;AAAA,IAC5C,OAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,EACE,OAAO,QAAA,CAAS,IAAA,KAAS,YAAY,QAAA,CAAS,IAAA,GAC1C,SAAS,IAAA,GACT,QAAA;AAAA,IACN,KAAA;AAAA,IACA,SAAA,EACE,eAAA,CAAgB,KAAK,CAAA,KACpB,OAAO,SAAS,IAAA,KAAS,QAAA,GAAW,QAAA,CAAS,IAAA,GAAO,EAAA,CAAA,IACrD;AAAA,GACJ;AACF;AAEO,SAAS,YAAA,CACd,aACA,QAAA,EACM;AACN,EAAA,IAAI,CAAC,WAAA,EAAa;AAClB,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,YAAY,qBAAA,EAAsB;AAC5D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,GAAa,KAAA,GAAQ,kBAAA;AACzC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,GAAc,MAAA,GAAS,kBAAA;AAE3C,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,MAAA,CAAO,UAAU,CAAC,CAAA,IAAK,GAAG,IAAI,CAAA;AACjD,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,MAAA,CAAO,UAAU,CAAC,CAAA,IAAK,GAAG,IAAI,CAAA;AAEjD,EAAA,WAAA,CAAY,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,kBAAA,EAAoB,CAAC,CAAC,CAAC,CAAA,EAAA,CAAA;AACvE,EAAA,WAAA,CAAY,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,kBAAA,EAAoB,CAAC,CAAC,CAAC,CAAA,EAAA,CAAA;AACxE;AAEA,SAAS,WAAA,CACP,IAAA,EACA,KAAA,EACA,OAAA,EACgC;AAChC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AACrD,IAAA,OAAO;AAAA,MACL,KAAM,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,GAAA,IAAQ,aAAa,KAAK,CAAA,CAAA;AAAA,MAC7D,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,IACE,gBAAA,CAAiB,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,IAC5C,CAAC,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA,EAC7C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,KAAA,EAAO,SAAS,EAAE,CAAA;AACpD,EAAA,IACG,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,IAC/C,CAAC,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAK,EACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,OAAA,IAAW,IAAA;AACjD,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,SAAS,IAAI,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,WAAW,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,EAAE,CAAA,IAAK,EAAA;AAAA,IAC1D,aAAA,EAAe,KAAK,aAAA,KAAkB,KAAA;AAAA,IACtC,MAAA,EAAQ,gBAAA,CAAiB,IAAA,CAAK,MAAA,EAAQ,SAAS,KAAK,CAAA;AAAA,IACpD,QAAA,EAAU,gBAAA,CAAiB,IAAA,CAAK,QAAA,EAAU,SAAS,KAAK,CAAA;AAAA,IACxD,MAAM,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA,IAAK,IAAA;AAAA,IAClD,mBACE,cAAA,CAAe,IAAA,CAAK,iBAAA,EAAmB,OAAA,EAAS,EAAE,CAAA,IAAK,EAAA;AAAA,IACzD,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,IACnB,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,QAAA,EAAU,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,IAAA;AAAA,IACpD,IAAA,EAAM;AAAA,GACR;AACF;AAEO,SAAS,gBAAA,CACd,QACA,OAAA,EAC2B;AAC3B,EAAA,MAAM,WAAW,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,EAAE,CAAA;AAC1D,EAAA,MAAM,QAAmC,EAAC;AAE1C,EAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAK,KAAA,KAAU;AACxC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACvC,IAAA,IACE,KAAK,IAAA,KAAS,WAAA,KACb,CAAC,QAAA,IAAY,QAAA,CAAS,SAAS,WAAA,CAAA,EAChC;AACA,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAA,IAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,KAAS,WAAA,QAAmB,GAAA,EAAI;AAC7D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAA,CACd,QACA,OAAA,EACkC;AAClC,EAAA,IAAI,QAAQ,MAAA,KAAW,KAAA,IAAS,MAAA,EAAQ,cAAA,KAAmB,OAAO,OAAO,IAAA;AAEzE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,SAAS,IAAI,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,UAAU,CAAA,GAC9B,UAAA,GACA,SAAS,OAAA,CAAQ,IAAI,CAAA,GACnB,OAAA,CAAQ,IAAA,GACR,IAAA;AACN,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,CAAO,KAAA,EAAO,SAAS,IAAI,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,WAAA,EAAa,SAAS,IAAI,CAAA;AACpE,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,MAAA,CAAO,IAAA,EAAM,SAAS,IAAI,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,CAAO,OAAA,EAAS,SAAS,IAAI,CAAA;AAC5D,EAAA,IAAI,CAAC,SAAS,CAAC,WAAA,IAAe,CAAC,IAAA,IAAQ,CAAC,SAAS,OAAO,IAAA;AAExD,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,eAAA,EAAiB,gBAAgB,WAAW,CAAA;AAAA,IAC5C,OAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,EAAW,gBAAgB,KAAK;AAAA,GAClC;AACF;AAEO,SAAS,kBAAA,CACd,KAAA,EACA,OAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,EAAA,MAAM,KAAA,GACJ,UAAU,CAAA,GAAK,SAAA,KAAc,IAAI,CAAA,GAAI,KAAA,GAAQ,IAAK,OAAA,GAAU,SAAA;AAE9D,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,EAAO,IAAA,EAAA,EAAQ;AACvC,IAAA,MAAM,KAAA,GAAA,CAAA,CAAW,KAAA,GAAQ,IAAA,GAAO,SAAA,IAAa,QAAS,KAAA,IAAS,KAAA;AAC/D,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,KAAK,CAAA,CAAE,QAAA,EAAU,OAAO,KAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;;;ACtRA,SAAS,wBACP,aAAA,EACwB;AACxB,EAAA,MAAM,aAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,CAAC,aAAa,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,aAAA,IAAiB,EAAE,CAAA,EAAG;AAC1E,IAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AAE1B,IAAA,MAAM,EAAE,KAAA,EAAO,GAAG,YAAA,EAAa,GAAI,SAAA;AACnC,IAAA,MAAM,WAAA,GAAc,QAAQ,KAAK,CAAA;AACjC,IAAA,MAAM,cAAA,GACJ,MAAM,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,IAChC,OAAO,aAAa,KAAA,KAAU,UAAA;AAEhC,IAAA,IAAI,cAAA,IAAkB,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC9C,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,MAAA,EAAQ,YAAA;AAAA,QACR,OAAO,UAAA,CAAW,MAAA;AAAA,QAClB;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,MAAA,EAAQ;AAAA,UACN,GAAG,YAAA;AAAA,UACH,GAAG,IAAA;AAAA,UACH,YAAY,EAAE,GAAG,aAAa,UAAA,EAAY,GAAG,KAAK,UAAA;AAAW,SAC/D;AAAA,QACA,OAAO,UAAA,CAAW,MAAA;AAAA,QAClB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,aAAA,CACP,MAAA,EACA,WAAA,EACA,QAAA,EACS;AACT,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AAErC,EAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AAC1D,EAAA,IAAI,cAAc,MAAA,GAAS,CAAA,EAAG,OAAO,aAAA,CAAc,SAAS,QAAQ,CAAA;AAEpE,EAAA,IAAI,OAAO,MAAA,CAAO,WAAA,KAAgB,UAAA,EAAY;AAC5C,IAAA,IAAI;AACF,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,IAC7C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OACE,WAAA,KAAgB,QAAA,IAChB,WAAA,KAAgB,gBAAA,IAChB,WAAA,KAAgB,eAAA;AAEpB;AAEA,SAAS,eAAA,CAAgB,MAAe,QAAA,EAA2B;AACjE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IACM,OAAuB,IAAA,EAC3B,IAAA,IAAQ,SAAS,QAAA,EACjB,IAAA,GAAO,KAAK,aAAA,EACZ;AACA,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAA,CACP,QACA,aAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA;AAAA,IACvC,CAAC,QAAA,KAAa,OAAO,QAAA,KAAa,QAAA,IAAY,SAAS,IAAA;AAAK,GAC9D;AACA,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AACnC,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,EAAA,IAAI,QAAA,GAAW,QAAA;AACf,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAA;AAC9C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,GAAW,KAAK,GAAA,CAAI,QAAA,EAAU,eAAA,CAAgB,aAAA,EAAe,OAAO,CAAC,CAAA;AAAA,MACvE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AACA,EAAA,OAAO,aAAa,QAAA,GAAW,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,QAAQ,CAAA;AAClE;AAEA,SAAS,aAAA,CACP,MAAA,EACA,WAAA,EACA,QAAA,EACQ;AACR,EAAA,IAAI,CAAC,UAAU,OAAO,CAAA;AACtB,EAAA,IACE,MAAA,CAAO,IAAA,KAAS,QAAA,IAChB,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,IACvC,WAAA,KAAgB,QAAA,EAChB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,KAAgB,kBAAkB,OAAO,EAAA;AAC7C,EAAA,IAAI,WAAA,KAAgB,iBAAiB,OAAO,EAAA;AAC5C,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,gBAAA,CACP,MAAA,EACA,KAAA,EACA,QAAA,EACA,aAAA,EACyB;AACzB,EAAA,IAAI,OAAA,GAAmC;AAAA,IACrC,aAAA,EAAe,MAAM,aAAA,IAAiB,IAAA;AAAA,IACtC,KAAA;AAAA,IACA,UAAU,QAAA,IAAY,EAAA;AAAA,IACtB,KAAA,EAAO,EAAE,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,OAAO,KAAK,CAAA,EAAE;AAAA,IACtE,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,UAAU,MAAA,CAAO,OAAA;AAE3D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,cAAA,GAAiB,KAAA,EAAO,OAAO,CAAA;AACtD,IAAA,IAAI,OAAA,KAAY,KAAA,CAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AAAA,EAAC;AAET,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,GAAiB,KAAA,EAAO,OAAO,CAAA;AACpD,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,GAAG,KAAA,EAAM;AAAA,EACxD,CAAA,CAAA,MAAQ;AAAA,EAAC;AAET,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,oBAAoB,OAAA,EAAkC;AAC7D,EAAA,OAAO,OAAA;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,MACP;AAAA,KACF,IAAK,OAAA,EAAS,SAAA,EAAW,QAAA,CAAS,sBAAsB;AAAA,GAC1D;AACF;AAEA,SAAS,mBAAmB,KAAA,EAAmC;AAC7D,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,YAAkB,OAAA,GAAU,MAAM,MAAA,GAAS,IAAA;AAEvE,EAAA,IAAI,aAAA,IAAiB,CAAC,mBAAA,CAAoB,aAAa,CAAA,EAAG;AACxD,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,EAAG;AACtE,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,QAAA,CAChB,iBAAA,CAAkB,KAAA,CAAM,SAAS,KAAA,CAAM,OAAO,CAAA,CAC9C,IAAA,CAAK,CAAC,OAAA,KAAY,CAAC,mBAAA,CAAoB,OAAO,CAAC,CAAA;AAClD,IAAA,OAAO,UAAA,IAAc,aAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,aAAA;AAAA,EACT;AACF;AAEA,SAAS,UAAA,CACP,MAAA,EACA,KAAA,EACA,IAAA,EAKS;AACT,EAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY,OAAO,OAAO,IAAA,KAAS,KAAA;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,kBAAA,CACd,aAAA,EACA,QAAA,EACA,KAAA,EACiC;AACjC,EAAA,MAAM,aAAA,GAAgB,mBAAmB,KAAK,CAAA;AAC9C,EAAA,IAAI,MAAA,GAA0C,IAAA;AAE9C,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAY,IAAK,uBAAA;AAAA,IAC3C;AAAA,GACF,EAAG;AACD,IAAA,IAAI,CAAC,aAAA,CAAc,MAAA,EAAQ,WAAA,EAAa,QAAQ,CAAA,EAAG;AAEnD,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,MAAA,EAAQ,KAAA,EAAO,UAAU,aAAa,CAAA;AACvE,IAAA,IAAI,CAAC,gBAAA,CAAiB,MAAA,CAAO,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA,EAAG;AACtD,IAAA,IACE,CAAC,UAAA,CAAW,MAAA,EAAQ,KAAA,EAAO;AAAA,MACzB,OAAA;AAAA,MACA,UAAU,QAAA,IAAY,EAAA;AAAA,MACtB,MAAA,EAAQ;AAAA,KACT,CAAA,EACD;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAC9C,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAEnB,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,EAAQ,aAAa,CAAA;AACxD,IAAA,IAAI,gBAAgB,IAAA,EAAM;AAE1B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AACvC,IAAA,MAAM,KAAA,GAAA,CACH,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAA,IAAK,GAAA,GAC7C,aAAA,CAAc,MAAA,EAAQ,WAAA,EAAa,QAAQ,IAAI,GAAA,GAC/C,WAAA;AAEF,IAAA,IAAI,CAAC,MAAA,IAAU,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAO;AACnC,MAAA,MAAA,GAAS,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,IAClD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,WAAA,CACd,MAAA,EACA,OAAA,EACA,KAAA,EAIO;AACP,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,MAAA,CAAO,MAAA,EAAQ,OAAO,OAAO,CAAA;AAC7D,EAAA,IAAI,YAAA,KAAiB,OAAO,OAAO,IAAA;AAEnC,EAAA,MAAM,WAAA,GAAc,SAAS,YAAY,CAAA,GACrC,EAAE,GAAG,OAAA,EAAS,GAAI,YAAA,EAAyC,GAC3D,OAAA;AACJ,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,MAAA,EAAQ,WAAW,CAAA;AAClD,EAAA,OAAO,MAAM,MAAA,GAAS,EAAE,OAAA,EAAS,WAAA,EAAa,OAAM,GAAI,IAAA;AAC1D;;;AChQO,SAAS,sBAAA,GAA2C;AACzD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,gBAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAQ,IAAA;AAAA,IACR,OAAO;AAAC,GACV;AACF;AAEO,SAAS,oBAAA,CAAqB;AAAA,EACnC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAkD;AAChD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAS,OAAA,IAAW,IAAA;AAAA,IACpB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,SAAS,EAAC;AAAA,IACjB,QAAA,EAAU;AAAA,MACR,GAAG,IAAA,CAAK,KAAA,CAAM,eAAe,QAAA,EAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MAC5C,GAAG,IAAA,CAAK,KAAA,CAAM,eAAe,QAAA,EAAU,CAAA,EAAG,CAAC,CAAC;AAAA;AAC9C,GACF;AACF;ACEO,IAAM,kBAAA,GAEX,wBAAA;AAAA,EACE,oBAAA;AAAA,EACA;AACF;AAEF,SAAS,aAAa,KAAA,EAAkC;AACtD,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAEO,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAS,EAA6B;AAC1E,EAAA,MAAM,WAAWC,WAAAA,EAAY;AAC7B,EAAA,MAAM,CAAC,KAAK,CAAA,GAAIH,QAAAA;AAAA,IAAS,MACvB,WAAA,CAA8B,sBAAA,EAAuB,EAAG;AAAA,MACtD,eAAA,EAAiB;AAAA,KAClB;AAAA,GACH;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,EAAO,YAAY,CAAA;AAE3C,EAAA,MAAM,WAAA,GAAcD,OAAO,QAAQ,CAAA;AACnC,EAAA,kBAAA,CAAmB,MAAM;AACvB,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAAA,EACxB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,OAAA,GAAUE,QAA4B,MAAM;AAChD,IAAA,MAAM,QAAA,GAA2C,CAAC,KAAA,KAAU;AAC1D,MAAA,MAAM,SAAA,GAAY,qBAAqB,KAAK,CAAA;AAC5C,MAAA,IAAI,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,IACxC,CAAA;AAEA,IAAA,MAAM,YAAY,MAAM;AACtB,MAAA,MAAM,OAAA,GAAU,MAAM,WAAA,EAAY;AAClC,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACrB,MAAA,KAAA,CAAM,OAAA,CAAQ,wBAAwB,CAAA;AACtC,MAAA,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAAA,IACrD,CAAA;AAEA,IAAA,MAAM,IAAA,GAAmC,CAAC,OAAA,EAAS,cAAA,MAAoB;AAAA,MACrE,aAAA,EAAe,CAAC,KAAA,KAA8B;AAC5C,QAAA,MAAM,MAAA,GAAS,cAAA,IAAkB,KAAA,CAAM,WAAA,EAAY,CAAE,MAAA;AACrD,QAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,QAAA,KAAA,CAAM,cAAA,IAAiB;AACvB,QAAA,KAAA,CAAM,eAAA,IAAkB;AAExB,QAAA,MAAM,KAAA,GAAQ;AAAA,UACZ,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,OAAA,IAAW,CAAC,CAAA;AAAA,UAC5B,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,OAAA,IAAW,CAAC;AAAA,SAC9B;AACA,QAAA,MAAM,OAAA,GAAmC;AAAA,UACvC,aAAA,EAAe,MAAM,aAAA,IAAiB,IAAA;AAAA,UACtC,KAAA;AAAA,UACA,QAAA,EAAU,YAAY,OAAA,IAAW,EAAA;AAAA,UACjC,OAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA,EAAS,MAAM,MAAA,IAAsB;AAAA,SACvC;AAEA,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AACnD,QAAA,IAAI,CAAC,QAAA,EAAU;AAEf,QAAA,QAAA,CAAS;AAAA,UACP,MAAA;AAAA,UACA,SAAS,QAAA,CAAS,OAAA;AAAA,UAClB,OAAO,QAAA,CAAS,KAAA;AAAA,UAChB,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,KACF,CAAA;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS;AAAA,EACrC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,YAAA,GAAeA,OAAAA;AAAA,IACnB,OAAO,EAAE,OAAA,EAAS,KAAA,EAAM,CAAA;AAAA,IACxB,CAAC,SAAS,KAAK;AAAA,GACjB;AAEA,EAAAG,UAAU,MAAM,yBAAA,CAA0B,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAE3D,EAAA,uBACEC,GAAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAO,cAAe,QAAA,EAAS,CAAA;AAEvD;AAEO,SAAS,0BAAA,CACd,QACA,OAAA,EACM;AACN,EAAA,qBAAA,CAAsB,aAAA,EAAe,QAAQ,OAAO,CAAA;AACtD;AAEO,SAAS,cAAA,CACd,QACA,OAAA,EACuB;AACvB,EAAA,0BAAA,CAA2B,MAAA,IAAU,MAAM,OAAO,CAAA;AAClD,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,kBAAA;AAAA,IACzB,kBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAMJ,OAAAA;AAAA,IACV,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,EAAQ,CAAA;AAAA,IAC9B,CAAC,SAAS,KAAK;AAAA,GACjB;AAEA,EAAA,OAAOA,QAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA,MACH,IAAA,EAAM,CAAC,OAAA,EAAmB,cAAA,KACxB,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,EAAE,GAAG,MAAA,EAAQ,GAAG,cAAA,EAAgB;AAAA,KACtD;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAG,CAAC,CAAA;AAClB;AAEO,SAAS,qBAAA,GAA4C;AAC1D,EAAA,OAAO,kBAAA;AAAA,IACL,kBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF,CAAE,OAAA;AACJ;AAEO,SAAS,mBAAA,GAAwC;AACtD,EAAA,MAAM,EAAE,OAAM,GAAI,kBAAA;AAAA,IAChB,kBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,SAAS,KAAK,CAAA;AACvB;ACxJO,SAAS,IAAA,CAAK;AAAA,EACnB,SAAA,GAAY,QAAA;AAAA,EACZ,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,EAAA;AAAA,EACP,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,uBACEI,GAAAA;AAAA,IAACC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,EAAE,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,MACzB,KAAA,EAAO,IAAA;AAAA,MACN,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;;;ACrCZ,IAAM,eAAA,GAAkB,OAAO,MAAA,CAAO;AAAA,EAC3C,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EACV,IAAA,EAAM,IAAA;AAAA,EACN,SAAA,EAAW;AACb,CAAU,CAAA;AAEH,IAAM,aAAA,GAAgB,OAAO,MAAA,CAAO;AAAA,EACzC,QAAA,EAAU,CAAC,IAAA,EAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EAC1B,SAAA,EAAW,CAAC,IAAA,EAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EAC3B,SAAA,EAAW,CAAC,IAAA,EAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EAC5B,YAAA,EAAc,CAAC,IAAA,EAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EAC/B,QAAA,EAAU,CAAC,GAAA,EAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACvB,QAAA,EAAU,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC;AAChC,CAAU,CAAA;AAEH,IAAM,cAAA,GAAiB,OAAO,MAAA,CAAO;AAAA,EAC1C,OAAO,aAAA,CAAc,SAAA;AAAA,EACrB,kBAAkB,aAAA,CAAc,QAAA;AAAA,EAChC,MAAM,aAAA,CAAc;AACtB,CAAU,CAAA;AAEkB,OAAO,MAAA,CAAO;AAAA,EACxC,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,IACnB,QAAA,EAAU,CAAA;AAAA,IACV,UAAU,eAAA,CAAgB,KAAA;AAAA,IAC1B,MAAM,cAAA,CAAe,gBAAA;AAAA,IACrB,UAAA,EAAY;AAAA,GACb,CAAA;AAAA,EACD,IAAA,EAAM,OAAO,MAAA,CAAO;AAAA,IAClB,QAAA,EAAU,CAAA;AAAA,IACV,UAAU,eAAA,CAAgB,IAAA;AAAA,IAC1B,MAAM,cAAA,CAAe,gBAAA;AAAA,IACrB,UAAA,EAAY;AAAA,GACb,CAAA;AAAA,EACD,QAAA,EAAU,OAAO,MAAA,CAAO;AAAA,IACtB,QAAA,EAAU,EAAA;AAAA,IACV,UAAU,eAAA,CAAgB,QAAA;AAAA,IAC1B,MAAM,cAAA,CAAe,KAAA;AAAA,IACrB,UAAA,EAAY;AAAA,GACb,CAAA;AAAA,EACD,OAAA,EAAS,OAAO,MAAA,CAAO;AAAA,IACrB,QAAA,EAAU,EAAA;AAAA,IACV,UAAU,eAAA,CAAgB,IAAA;AAAA,IAC1B,MAAM,cAAA,CAAe,gBAAA;AAAA,IACrB,UAAA,EAAY;AAAA,GACb;AACH,CAAU;AA6B+B,OAAO,MAAA,CAAO;AAAA,EACrD,UAAU,eAAA,CAAgB,OAAA;AAAA,EAC1B,IAAA,EAAM;AACR,CAAU;;;ACvDH,IAAM,WAAA,GAAc,wBAAA;AAAA,EACzB,aAAA;AAAA,EACA;AACF,CAAA;AAiCO,IAAM,gBAAA,GAA8B,OAAO,MAAA,CAAO;AAAA,EACvD,UAAA,EAAY,IAAA;AAAA,EACZ,eAAA,EAAiB,IAAA;AAAA,EACjB,kBAAA,EAAoB,IAAA;AAAA,EACpB,eAAA,EAAiB,IAAA;AAAA,EACjB,gBAAgB,EAAC;AAAA,EACjB,gBAAgB,EAAC;AAAA,EACjB,UAAA,EAAY,CAAA;AAAA,EACZ,oBAAoB,EAAC;AAAA,EACrB,QAAA,EAAU,KAAA;AAAA,EACV,GAAA,EAAK,IAAA;AAAA,EACL,YAAY,EAAC;AAAA,EACb,WAAA,EAAa,KAAA;AAAA,EACb,aAAA,EAAe,KAAA;AAAA,EACf,WAAA,EAAa,EAAA;AAAA,EACb,YAAY,EAAC;AAAA,EACb,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,EAAA;AAAA,EACb,aAAA,EAAe,IAAA;AAAA,EACf,gBAAA,EAAkB,EAAA;AAAA,EAClB,YAAA,EAAc,EAAA;AAAA,EACd,cAAc;AAChB,CAAC,CAAA;AAED,IAAM,eAAA,GAAkB,YAAuB,gBAAgB,CAAA;AAOxD,SAAS,oBAAA,CACd,UACA,OAAA,EACG;AACH,EAAA,MAAM,GAAA,GAAMC,WAAW,WAAW,CAAA;AAClC,EAAA,OAAO,QAAA;AAAA,IACL,KAAK,KAAA,IAAS,eAAA;AAAA,IACd,QAAA;AAAA,IACA;AAAA,GACF;AACF;AC4C+B,YAAuB,gBAAgB;;;AC7GtE,SAAS,mBAAmB,IAAA,EAAkC;AAC5D,EAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAClB,EAAA,OAAO,IAAA,IAAQ,CAAC,IAAA,CAAK,SAAA,GAAY,IAAA,GAAO,IAAA;AAC1C;AAEO,SAAS,sBAAA,GAA+B;AAC7C,EAAA,MAAM,KAAA,GAAQ,kBAAA;AAAA,IACZ;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GAAW,qBAAqB,kBAAkB,CAAA;AACxD,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,qBAAA,EAAsB;AAC3C,EAAA,MAAM,WAAWJ,WAAAA,EAAY;AAE7B,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAsB;AAC/C,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,KAAA,EAAO,QAAA,IAAY,QAAW,KAAK,CAAA;AACpE,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AAEtB,MAAA,MAAM,IAAA,GAAO,0BAAA,CAA2B,QAAA,EAAU,QAAA,IAAY,EAAE,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,WAAA;AAAA,QACf,KAAA,CAAM,MAAA;AAAA,QACN,OAAO,EAAE,GAAG,MAAM,OAAA,EAAS,IAAA,KAAS,KAAA,CAAM,OAAA;AAAA,QAC1C;AAAA,OACF;AACA,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,QAAA,CAAS;AAAA,QACP,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,UAAU,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,CAAA,EAAG,MAAM,OAAA;AAAQ,OAChD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,iBAAA,EAAmB,IAAI,CAAA;AAChE,IAAA,OAAO,MACL,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,mBAAmB,IAAI,CAAA;AAAA,EACvE,GAAG,CAAC,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAC,CAAA;AAC1C;AAEO,SAAS,gBAAA,CACd,SACA,OAAA,EACA;AACA,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAiB,KAAA,CAAM,cAAA,EAAe;AAC7D,IAAA,MAAM,eAAA,GAAkB,EAAE,OAAA,EAAS,IAAA,EAAM,SAAS,KAAA,EAAM;AAExD,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAsC;AAC/D,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,MAAM,MAAc,CAAA;AAC/D,MAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,QAAA,IAAK,KAAA,CAAwB,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AACvD,QAAA,IAAI,CAAC,QAAA,IAAY,eAAA,CAAgB,KAAsB,CAAA,EAAG;AACxD,UAAA,KAAA,CAAM,cAAA,EAAe;AAAA,QACvB;AAAA,MACF,CAAA,MAAA,IAAW,CAAC,QAAA,EAAU;AACpB,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,iBAAA,EAAmB,IAAI,CAAA;AAC9D,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,iBAAA,EAAmB,IAAI,CAAA;AAC5D,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,aAAA,EAAe,eAAe,CAAA;AAC/D,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,aAAA,EAAe,eAAe,CAAA;AAEnE,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,iBAAA,EAAmB,IAAI,CAAA;AACjE,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,iBAAA,EAAmB,IAAI,CAAA;AAC/D,MAAA,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,aAAA,EAAe,IAAI,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,aAAA,EAAe,IAAI,CAAA;AAAA,IAC7D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AACvB;AAEA,IAAM,cAAA,GAAiB,MAAM,MAAM;AAAC,CAAA;AAE7B,SAAS,0BAAA,CAA2B;AAAA,EACzC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,OAAA,GAAUL,OAA8B,IAAI,CAAA;AAClD,EAAA,MAAM,QAAA,GAAWA,MAAAA,CAAqC,EAAE,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,SAAe,gBAAgB,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAUE,QAAQ,MAAM;AAC5B,IAAA,MAAM,SAAA,GAAmC,MAAA,CAAO,UAAA,IAAc,EAAC;AAC/D,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,KAAA,CAAM,KAAA,EAAM;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAA6B;AAChE,MAAA,MAAA,CAAO,IAAI,IAAI,cAAA,CAAe,KAAA,CAAM,MAAM,IAAI,CAAA,EAAG,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,MAAA;AAAA,EACT,GAAG,CAAC,MAAA,CAAO,UAAA,EAAY,KAAA,CAAM,KAAK,CAAC,CAAA;AACnC,EAAA,MAAM,MAAA,GAASA,OAAAA;AAAA,IACb,MAAM,iBAAA,CAAkB,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC3C,CAAC,QAAQ,WAAW;AAAA,GACtB;AACA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAID,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,cAAA,CAAe,EAAE,CAAA;AAAA,EACnB;AACA,EAAAQ,gBAAgB,MAAM;AACpB,IAAA,QAAA,CAAS,UAAU,EAAC;AACpB,IAAA,YAAA,CAAa,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AAC5B,EAAAJ,UAAU,MAAM;AACd,IAAA,MAAM,SACJ,WAAA,GAAc,CAAA,GAAI,QAAQ,OAAA,GAAU,QAAA,CAAS,QAAQ,WAAW,CAAA;AAClE,IAAA,MAAA,EAAQ,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAChB,EAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACjC,EAAA,MAAM,gBAAA,GAAmBV,WAAAA;AAAA,IACvB,CACE,MACA,KAAA,KACG;AACH,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,IAAI,KAAK,QAAA,EAAU;AAEnB,MAAA,UAAA,CAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,OAAA,EAAS,OAAO,WAAW,CAAA;AAC5D,MAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC5C,CAAA;AAAA,IACA,CAAC,aAAa,OAAO;AAAA,GACvB;AACA,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA8B;AACvD,IAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,OAAA,EAAQ;AAAA,IACV,WAAW,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC/D,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,KAAQ,WAAA,GAAc,CAAA,GAAI,EAAA;AAClD,MAAA,cAAA;AAAA,QAAe,CAAC,OAAA,KACd,kBAAA,CAAmB,KAAA,EAAO,SAAS,SAAS;AAAA,OAC9C;AAAA,IACF,CAAA,MAAA,IAAA,CACG,MAAM,GAAA,KAAQ,OAAA,IAAW,MAAM,GAAA,KAAQ,GAAA,KACxC,KAAA,CAAM,WAAW,CAAA,EACjB;AACA,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,gBAAA,CAAiB,KAAA,CAAM,WAAW,CAAA,EAAG,KAAK,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,2BAAA,GAA8B;AAC5C,EAAA,MAAM,EAAE,WAAW,MAAA,EAAQ,OAAA,EAAS,QAAQ,KAAA,EAAO,QAAA,KACjD,cAAA,EAAe;AACjB,EAAA,MAAM,SAAA,GAAYC,oBAAAA;AAAA,IAChB,cAAA;AAAA,IACA,MAAM,IAAA;AAAA,IACN,MAAM;AAAA,GACR;AAEA,EAAA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,SAAS,MAAA,EAAQ,KAAA,EAAO,UAAU,SAAA,EAAU;AAC1E;;;ACvNA,IAAM,oBAAA,GAAuB,OAAO,MAAA,CAAO;AAAA,EACzC,YAAY,aAAA,CAAc,QAAA;AAAA,EAC1B,MAAM,aAAA,CAAc,SAAA;AAAA,EACpB,MAAM,aAAA,CAAc;AACtB,CAAC,CAAA;AAED,IAAM,kBAAA,GAAqB,OAAO,MAAA,CAAO;AAAA,EACvC,KAAA,EAAO;AAAA,IACL,UAAU,eAAA,CAAgB,IAAA;AAAA,IAC1B,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,MAAM,oBAAA,CAAqB;AAAA;AAE/B,CAAC,CAAA;AAED,SAAS,cAAA,CAAe;AAAA,EACtB,CAAA,GAAI,CAAA;AAAA,EACJ,CAAA,GAAI,CAAA;AAAA,EACJ,KAAA,GAAQ;AACV,CAAA,GAAgD,EAAC,EAAG;AAClD,EAAA,OAAO,CAAA,YAAA,EAAe,CAAC,CAAA,IAAA,EAAO,CAAC,gBAAgB,KAAK,CAAA,CAAA,CAAA;AACtD;AAEO,IAAM,yBAAA,GAAwC,OAAO,MAAA,CAAO;AAAA,EACjE,IAAA,EAAM,QAAA;AAAA,EACN,SAAA,EAAW,GAAA;AAAA,EACX,OAAA,EAAS,EAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAC,CAAA;AAEM,IAAM,qBAAA,GAAwB,OAAO,MAAA,CAAO;AAAA,EACjD,WAAW,cAAA,CAAe;AAAA,IACxB,KAAA,EAAO;AAAA,GACR;AACH,CAAC,CAAA;AAEM,IAAM,mBAAA,GAAgC,OAAO,MAAA,CAAO;AAAA,EACzD,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,mBAAmB,KAAA,CAAM,QAAA;AAAA,MACnC,MAAM,oBAAA,CAAqB,IAAA;AAAA,MAC3B,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,UAAU,eAAA,CAAgB,KAAA;AAAA,MAC1B,MAAM,oBAAA,CAAqB;AAAA;AAC7B;AAEJ,CAAC,CAAA;AAEM,IAAM,gBAAA,GAA6B,OAAO,MAAA,CAAO;AAAA,EACtD,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,WAAW,cAAA,CAAe;AAAA,MACxB,CAAA,EAAG,mBAAmB,KAAA,CAAM,QAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,KAAA,GAAQ,CAAA,MAAO;AAAA,IACvB,OAAA,EAAS,CAAA;AAAA,IACT,WAAW,cAAA,EAAe;AAAA,IAC1B,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,mBAAmB,KAAA,CAAM,QAAA;AAAA,MACnC,MAAM,oBAAA,CAAqB,UAAA;AAAA,MAC3B,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA,EAAG,CAAC,CAAA,GAAI,OAAO,IAAI;AAAA;AACtE,GACF,CAAA;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,WAAW,cAAA,CAAe;AAAA,MACxB,CAAA,EAAG,EAAA;AAAA,MACH,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IACD,UAAA,EAAY;AAAA,MACV,UAAU,eAAA,CAAgB,KAAA;AAAA,MAC1B,MAAM,oBAAA,CAAqB;AAAA;AAC7B;AAEJ,CAAC,CAAA;AAEM,IAAM,eAAA,GAA4B,OAAO,MAAA,CAAO;AAAA,EACrD,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,WAAW,cAAA,CAAe;AAAA,MACxB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IACD,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,WAAW,cAAA,EAAe;AAAA,IAC1B,eAAA,EAAiB,UAAA;AAAA,IACjB,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,mBAAmB,KAAA,CAAM,QAAA;AAAA,MACnC,MAAM,oBAAA,CAAqB;AAAA;AAC7B,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,WAAW,cAAA,CAAe;AAAA,MACxB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IACD,eAAA,EAAiB,UAAA;AAAA,IACjB,UAAA,EAAY;AAAA,MACV,UAAU,eAAA,CAAgB,KAAA;AAAA,MAC1B,MAAM,oBAAA,CAAqB;AAAA;AAC7B;AAEJ,CAAC,CAAA;ACzFD,SAAS,qBAAA,CAAsB;AAAA,EAC7B,OAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,gBAAgB,OAAA,CAAQ,UAAA;AAE9B,EAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,IAAA,uBACEU,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,aAAA;AAAA,QACX,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,CAAA;AAAI;AAAA,KAC3C;AAAA,EAEJ;AACA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,eACb,QAAA,EAAA,OAAO,IAAA,KAAS,QAAA,mBAAWA,IAAC,IAAA,EAAA,EAAK,IAAA,EAAY,IAAA,EAAM,EAAA,EAAI,IAAK,IAAA,EAC/D,CAAA;AAEJ;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,MAAA,EACrB,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,wBACNJ,GAAAA,CAAC,yBAAsB,OAAA,EAAkB,IAAA,EAAM,OAAO,IAAA,EAAM,CAAA;AAAA,oBAE9DI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,UAAA,EACrB,QAAA,EAAA;AAAA,MAAA,MAAA,CAAO,OAAA,oBACNJ,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,OAAA,CAAQ,aAAA,EAAgB,iBAAO,OAAA,EAAQ,CAAA;AAAA,MAExD,MAAA,CAAO,yBACNA,GAAAA,CAAC,SAAI,SAAA,EAAW,OAAA,CAAQ,WAAA,EAAc,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM,CAAA;AAAA,MAEpD,MAAA,CAAO,+BACNA,GAAAA,CAAC,SAAI,SAAA,EAAW,OAAA,CAAQ,iBAAA,EAAoB,QAAA,EAAA,MAAA,CAAO,WAAA,EAAY;AAAA,KAAA,EAEnE;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,IAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,OAAA,CAAQ,SAAA,EAAW,MAAK,WAAA,EAAY,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,OAAA,CAAQ,IAAA,EAAM,KAAK,SAAS,CAAA;AACjE,EAAA,MAAM,iBAAA,GAAoB,cAAA;AAAA,IACxB,OAAA,CAAQ,QAAA;AAAA,IACR,IAAA,CAAK;AAAA,GACP;AAEA,EAAA,uBACEI,IAAAA;AAAA,IAAC,MAAA,CAAO,MAAA;AAAA,IAAP;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,aAAA;AAAA,MACX,aAAA,EAAa,WAAW,MAAA,GAAS,MAAA;AAAA,MACjC,iBAAe,IAAA,CAAK,QAAA;AAAA,MACpB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAA,EAAK,UAAA;AAAA,MACL,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,qBAAA;AAAA,MACV,UAAA,EAAY,yBAAA;AAAA,MACZ,YAAA,EAAc,OAAA;AAAA,MACd,OAAA,EAAS,CAAC,KAAA,KAAU,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,MAEvC,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,SACH,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,mBACpBJ,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,EAAW,iBAAA,EAAmB,IAAA,EAAM,EAAA,EAAI,IAE/D,IAAA,CAAK,IAAA,CAAA;AAAA,wBAETA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,OAAA,CAAQ,SAAA,EAAY,eAAK,KAAA,EAAM,CAAA;AAAA,QAC/C,IAAA,CAAK,4BACJA,GAAAA,CAAC,UAAK,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAe,QAAA,EAAA,IAAA,CAAK,QAAA,EAAS;AAAA;AAAA;AAAA,GAE1D;AAEJ;AAEA,IAAM,kBAAA,GAA8C,OAAO,MAAA,CAAO;AAAA,EAChE,QAAA,EAAU,EAAA;AAAA,EACV,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACpB,CAAC,CAAA;AAED,SAAS,kBAAA,CAAmB;AAAA,EAC1B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,MACE,0BAAA,CAA2B;AAAA,IAC7B,MAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,uBACEI,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAJ,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,2BAAA,EAAyB,IAAA;AAAA,QACzB,WAAW,OAAA,CAAQ,QAAA;AAAA,QACnB,WAAA,EAAa,OAAA;AAAA,QACb,OAAO,MAAA,CAAO;AAAA;AAAA,KAChB;AAAA,oBACAI,IAAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,0BAAA,EAAwB,IAAA;AAAA,QACxB,QAAA,EAAU,eAAA;AAAA,QACV,OAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QACL,WAAW,OAAA,CAAQ,IAAA;AAAA,QACnB,IAAA,EAAK,MAAA;AAAA,QACL,QAAA,EAAU,EAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,GAAG,MAAA,CAAO,IAAA;AAAA,UACV,IAAA,EAAM,SAAS,CAAA,IAAK,CAAA;AAAA,UACpB,GAAA,EAAK,SAAS,CAAA,IAAK,CAAA;AAAA,UACnB,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,YAAA,EAAc,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,QACrC,SAAA,EAAW,iBAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAAJ,GAAAA;AAAA,YAAC,MAAA,CAAO,GAAA;AAAA,YAAP;AAAA,cACC,QAAA,EAAU,mBAAA;AAAA,cACV,OAAA,EAAQ,QAAA;AAAA,cACR,OAAA,EAAQ,SAAA;AAAA,cAER,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,OAAA,EAAkB,MAAA,EAAgB;AAAA;AAAA,WACvD;AAAA,UAEC,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,0BAChBA,GAAAA;AAAA,YAAC,MAAA,CAAO,GAAA;AAAA,YAAP;AAAA,cAEC,QAAA,EAAU,gBAAA;AAAA,cACV,MAAA,EAAQ,KAAA;AAAA,cACR,OAAA,EAAQ,QAAA;AAAA,cACR,OAAA,EAAQ,SAAA;AAAA,cAER,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACC,IAAA;AAAA,kBACA,OAAA;AAAA,kBACA,UAAU,KAAA,KAAU,WAAA;AAAA,kBACpB,SAAS,MAAM;AACb,oBAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,CAAC,KAAK,QAAA,EAAU;AAC5C,sBAAA,cAAA,CAAe,KAAK,CAAA;AAAA,oBACtB;AAAA,kBACF,CAAA;AAAA,kBACA,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,oBAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,kBAC5B,CAAA;AAAA,kBACA,QAAA,EAAU;AAAA;AAAA;AACZ,aAAA;AAAA,YAnBK,IAAA,CAAK,GAAA,IAAO,CAAA,UAAA,EAAa,KAAK,CAAA;AAAA,WAqBtC;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,mBAAA,GAAsB;AAC7B,EAAA,MAAM,EAAE,WAAW,MAAA,EAAQ,OAAA,EAAS,QAAQ,KAAA,EAAO,QAAA,EAAU,SAAA,EAAU,GACrE,2BAAA,EAA4B;AAC9B,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,EAAA,MAAM,cAAc,OAAA,IAAW,kBAAA;AAC/B,EAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,GACxB,KAAA,GACA,gBAAA,CAAiB,QAAQ,WAAW,CAAA;AACxC,EAAA,OAAO,YAAA;AAAA,oBACLA,IAAC,eAAA,EAAA,EACE,QAAA,EAAA,MAAA,IAAU,UAAU,aAAA,CAAc,MAAA,GAAS,qBAC1CA,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,KAAA,EAAO,aAAA;AAAA,QACP,WAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS;AAAA,OAAA;AAAA,MALL;AAAA,KAMN,EAEJ,CAAA;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AAEO,SAAS,iBAAA,GAAoB;AAClC,EAAA,sBAAA,EAAuB;AACvB,EAAA,uBAAOA,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAC9B;;;AC/OA,SAAS,sBACP,MAAA,EAC8B;AAC9B,EAAA,OAAO,OAAO,WAAA,IAAe,IAAA;AAC/B;AAEA,SAAS,kBAAA,CACP,QACA,IAAA,EACoB;AACpB,EAAA,MAAM,UAAU,qBAAA,EAAsB;AACtC,EAAA,OAAOJ,OAAAA;AAAA,IACL,OAAO;AAAA,MACL,GAAG,OAAA;AAAA,MACH,KAAK,CAAC,WAAA,KACJ,KAAK,GAAA,CAAI,EAAE,aAAa;AAAA,KAC5B,CAAA;AAAA,IACA,CAAC,SAAS,IAAI;AAAA,GAChB;AACF;AAEO,IAAM,oBAAoB,YAAA,CAAa;AAAA,EAC5C,EAAA,EAAI,aAAA;AAAA,EACJ,OAAA,EAAS,kBAAA;AAAA,EACT,QAAA,EAAU,mBAAA;AAAA,EACV,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,EACb,OAAA,EAAS,iBAAA;AAAA,EACT,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,GAAA;AAAA,IAChB,SAAA,EAAW,OAAA;AAAA,IACX,SAAA,EAAW,WAAA;AAAA,IACX,YAAA,EAAc,CAAC,gBAAA,EAAkB,eAAe;AAAA,GAClD;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,qBAAA;AAAA,IACR,OAAA,EAAS,CAAC,KAAA,EAA8B,EAAE,UAAS,KAAM;AAAA,MACvD,EAAE,GAAA,EAAK,QAAA,IAAY,gBAAA,EAAkB,OAAO,KAAA;AAAM,KACpD;AAAA,IACA,GAAA,EAAK;AAAA;AAET,CAAC;AAWM,SAAS,iBAAA,CACd,UAAA,GAAyC,EAAC,EACnB;AACvB,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,MAAA,EAAQ,UAAA;AAAA,IACR,EAAA,EAAI,WAAW,EAAA,IAAM,cAAA;AAAA,IACrB,GAAA,EAAK,SAAS,qBAAA,CAAsB,OAAA,GAAU,EAAC,EAAG;AAChD,MAAA,OAAO,eAAe,EAAE,GAAG,UAAA,EAAY,GAAG,SAAS,CAAA;AAAA,IACrD;AAAA,GACD,CAAA;AACH","file":"index.js","sourcesContent":["\"use client\";\n\nimport { use, type Context } from \"react\";\n\nexport function useRequiredContext<T>(\n context: Context<T | null>,\n hookName: string,\n providerName: string,\n): T {\n const value = use(context);\n if (value === null) {\n throw new Error(`${hookName} must be used within ${providerName}`);\n }\n return value;\n}\n","\"use client\";\n\nimport { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { type ExternalStore } from \"../utils\";\n\nexport function useStore<TState, TSlice = TState>(\n store: ExternalStore<TState>,\n selector: (state: TState) => TSlice = (state: TState) =>\n state as unknown as TSlice,\n isEqual: (a: TSlice, b: TSlice) => boolean = Object.is,\n): TSlice {\n const cacheRef = useRef<{\n isEqual: ((a: TSlice, b: TSlice) => boolean) | null;\n selected: TSlice | undefined;\n selector: ((state: TState) => TSlice) | null;\n snapshot: TState | null;\n }>({\n isEqual: null,\n selected: undefined,\n selector: null,\n snapshot: null,\n });\n\n const getSelectedSnapshot = useCallback(() => {\n const snapshot = store.getSnapshot();\n const cache = cacheRef.current;\n if (\n cache.snapshot === snapshot &&\n cache.selector === selector &&\n cache.isEqual === isEqual\n ) {\n return cache.selected as TSlice;\n }\n\n const selected = selector(snapshot);\n if (\n cache.snapshot !== null &&\n cache.isEqual === isEqual &&\n isEqual(cache.selected as TSlice, selected)\n ) {\n cache.snapshot = snapshot;\n cache.selector = selector;\n return cache.selected as TSlice;\n }\n\n cacheRef.current = {\n isEqual,\n selected,\n selector,\n snapshot,\n };\n return selected;\n }, [isEqual, selector, store]);\n\n return useSyncExternalStore(\n store.subscribe,\n getSelectedSnapshot,\n getSelectedSnapshot,\n );\n}\n","export function trimToNull(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function stripTrailingSlash(url: unknown): string {\n if (typeof url !== \"string\") return \"\";\n return url.replace(/\\/+$/, \"\");\n}\n\nexport function normalizePath(path: unknown): string {\n const trimmed = trimToNull(path);\n if (!trimmed) return \"\";\n if (trimmed === \"/\") return \"/\";\n return stripTrailingSlash(trimmed);\n}\n\nexport function isImageIconSource(icon: unknown): boolean {\n return (\n typeof icon === \"string\" &&\n (icon.startsWith(\"http://\") ||\n icon.startsWith(\"https://\") ||\n icon.startsWith(\"/\") ||\n icon.startsWith(\"data:image/\"))\n );\n}\n","import { stripTrailingSlash } from \"./string\";\n\nexport const isBrowser: boolean = typeof window !== \"undefined\";\n\nlet globalScrollLockCount = 0;\n\nlet globalScrollLockStyles: {\n bodyOverflow: string;\n bodyOverscrollBehavior: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n} | null = null;\n\nexport function acquireGlobalScrollLock(): () => void {\n if (typeof document === \"undefined\") return () => {};\n\n if (globalScrollLockCount === 0) {\n globalScrollLockStyles = {\n bodyOverflow: document.body.style.overflow,\n bodyOverscrollBehavior: document.body.style.overscrollBehavior,\n htmlOverflow: document.documentElement.style.overflow,\n htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior,\n };\n }\n\n globalScrollLockCount += 1;\n document.body.style.overflow = \"hidden\";\n document.body.style.overscrollBehavior = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n document.documentElement.style.overscrollBehavior = \"none\";\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);\n if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;\n\n document.body.style.overflow = globalScrollLockStyles.bodyOverflow;\n document.body.style.overscrollBehavior =\n globalScrollLockStyles.bodyOverscrollBehavior;\n document.documentElement.style.overflow =\n globalScrollLockStyles.htmlOverflow;\n document.documentElement.style.overscrollBehavior =\n globalScrollLockStyles.htmlOverscrollBehavior;\n globalScrollLockStyles = null;\n };\n}\n\nexport function getSiteUrl(): string {\n return stripTrailingSlash(\n process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\",\n );\n}\n\nexport function getCurrentPath(): string {\n if (!isBrowser) return \"/\";\n return `${window.location.pathname}${window.location.search}`;\n}\n\n","export function clamp(value: unknown, min: number, max: number): number {\n const num = Number(value);\n const finite = Number.isFinite(num) ? num : min;\n return Math.min(Math.max(finite, min), max);\n}\n\nexport function toFiniteNumber(value: unknown, fallback: number = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n","export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\nlet sink: ReportSink | null = null;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n if (sink) {\n try {\n sink(scope, error, level);\n return;\n } catch {}\n }\n\n if (process.env.NODE_ENV === \"production\" && typeof window !== \"undefined\") {\n return;\n }\n console[level](`[${scope}]`, error);\n}\n\nexport function setReportSink(next: ReportSink): () => void {\n sink = next;\n return () => {\n if (sink === next) sink = null;\n };\n}\n","import { report } from \"./report\";\nexport interface ExternalStore<TState = unknown> {\n readonly getSnapshot: () => TState;\n readonly publish: (\n nextState: TState | ((currentState: TState) => TState),\n ) => boolean;\n readonly setState: (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ) => boolean;\n readonly subscribe: (listener: () => void) => () => void;\n}\n\nfunction freezeStoreSnapshot<TState>(state: TState): TState {\n if (\n process.env.NODE_ENV === \"production\" ||\n !state ||\n typeof state !== \"object\"\n ) {\n return state;\n }\n\n const seen = new WeakSet<object>();\n const freeze = (value: object): void => {\n if (seen.has(value) || Object.isFrozen(value)) return;\n seen.add(value);\n\n const prototype = Object.getPrototypeOf(value);\n if (\n Array.isArray(value) ||\n prototype === Object.prototype ||\n prototype === null\n ) {\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && \"value\" in descriptor && descriptor.value !== null) {\n if (typeof descriptor.value === \"object\") freeze(descriptor.value);\n }\n }\n }\n\n Object.freeze(value);\n };\n\n freeze(state);\n return state;\n}\n\nexport interface CreateStoreOptions {\n freezeSnapshots?: boolean;\n}\n\nexport function createStore<TState = Record<string, unknown>>(\n initialState: TState,\n { freezeSnapshots = true }: CreateStoreOptions = {},\n): ExternalStore<TState> {\n const listeners = new Set<() => void>();\n const prepare = freezeSnapshots\n ? freezeStoreSnapshot\n : <T>(state: T): T => state;\n let snapshot = prepare(initialState);\n\n const publish = (\n nextStateOrUpdater: TState | ((currentState: TState) => TState),\n ): boolean => {\n const nextState =\n typeof nextStateOrUpdater === \"function\"\n ? (nextStateOrUpdater as (currentState: TState) => TState)(snapshot)\n : nextStateOrUpdater;\n if (Object.is(snapshot, nextState)) return false;\n snapshot = prepare(nextState);\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"CoreStore subscriber\", error, \"warn\");\n }\n }\n return true;\n };\n\n const setState = (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ): boolean => {\n if (typeof updater === \"function\") {\n return publish(updater as (currentState: TState) => TState);\n }\n if (\n snapshot &&\n typeof snapshot === \"object\" &&\n updater &&\n typeof updater === \"object\"\n ) {\n return publish({ ...snapshot, ...updater });\n }\n return publish(updater as TState);\n };\n\n return Object.freeze({\n getSnapshot() {\n return snapshot;\n },\n publish,\n setState,\n subscribe(listener: () => void) {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect } from \"react\";\nimport { isBrowser } from \"../utils\";\n\nexport const useIsomorphicLayoutEffect = isBrowser\n ? useLayoutEffect\n : useEffect;\n","import type {\n RegistryLifecycle,\n RegistryScopeKind,\n RegistrySource,\n RegistryValidationMode,\n} from \"./types\";\n\nexport const DEFAULT_SOURCE: RegistrySource = \"dynamic\";\n\nexport const REGISTRY_SOURCES: Readonly<Record<string, RegistrySource>> =\n Object.freeze({\n STATIC: \"static\",\n DYNAMIC: \"dynamic\",\n USER: \"user\",\n });\n\nexport const REGISTRY_LIFECYCLES: Readonly<Record<string, RegistryLifecycle>> =\n Object.freeze({\n IMMEDIATE: \"immediate\",\n GRACEFUL: \"graceful\",\n PERSISTENT: \"persistent\",\n ROUTE: \"route\",\n });\n\nexport const REGISTRY_VALIDATION_MODES: Readonly<\n Record<string, RegistryValidationMode>\n> = Object.freeze({\n WARN: \"warn\",\n STRICT: \"strict\",\n});\n\nexport const REGISTRY_METADATA_KEYS: readonly string[] = Object.freeze([\n \"cleanup\",\n \"cleanupDelayMs\",\n \"instanceId\",\n \"lifecycle\",\n \"priority\",\n \"source\",\n \"scope\",\n \"validation\",\n]);\n\nexport const REGISTRY_SOURCE_PRIORITY: Readonly<Record<string, number>> =\n Object.freeze({\n [REGISTRY_SOURCES.STATIC]: 100,\n [REGISTRY_SOURCES.DYNAMIC]: 200,\n [REGISTRY_SOURCES.USER]: 300,\n });\n\nexport const REGISTRY_SOURCE_RANK: Readonly<Record<string, number>> =\n Object.freeze({\n [REGISTRY_SOURCES.STATIC]: 10,\n [REGISTRY_SOURCES.DYNAMIC]: 20,\n [REGISTRY_SOURCES.USER]: 30,\n });\n\nexport const REGISTRY_LIFECYCLE_VALUES: ReadonlySet<string> = new Set(\n Object.values(REGISTRY_LIFECYCLES),\n);\n\nexport const REGISTRY_METADATA_KEY_SET: ReadonlySet<string> = new Set(\n REGISTRY_METADATA_KEYS,\n);\n\nconst REGISTRY_SCOPE_KINDS: Readonly<Record<string, RegistryScopeKind>> =\n Object.freeze({\n APP: \"app\",\n SESSION: \"session\",\n ROUTE: \"route\",\n INSTANCE: \"instance\",\n WORKSPACE: \"workspace\",\n });\n\nexport const DEFAULT_REGISTRY_SCOPE: RegistryScopeKind =\n REGISTRY_SCOPE_KINDS.APP;\n","import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","import {\n DEFAULT_REGISTRY_SCOPE,\n DEFAULT_SOURCE,\n REGISTRY_SOURCE_RANK,\n} from \"./constants\";\nimport type { RegistryMetadata } from \"./types\";\nimport {\n isObject,\n isPlainObject,\n shallowEqual,\n trimToNull,\n} from \"@/utils\";\n\nexport { isObject, isPlainObject, shallowEqual };\n\nexport function hasOwnProperty(target: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nexport function parseFiniteNumber(value: unknown): number | null {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function getValidString(\n value: unknown,\n fallback: string | null = null,\n): string | null {\n return trimToNull(value) ?? fallback;\n}\n\nexport function resolveInstanceId(value: unknown): string | null {\n return isObject(value) && typeof value.instanceId === \"string\"\n ? value.instanceId\n : null;\n}\n\nexport function getSourceRank(source: string): number {\n return REGISTRY_SOURCE_RANK[source] ?? 0;\n}\n\nexport function resolveRegisterInput(\n sourceOrOptions: unknown,\n optionsArg?: unknown,\n): { source: string; options: RegistryMetadata } {\n if (typeof sourceOrOptions === \"string\") {\n return {\n source: sourceOrOptions,\n options: isObject(optionsArg) ? optionsArg : {},\n };\n }\n if (isObject(sourceOrOptions)) {\n return {\n source:\n typeof sourceOrOptions.source === \"string\"\n ? sourceOrOptions.source\n : DEFAULT_SOURCE,\n options: sourceOrOptions,\n };\n }\n return {\n source: DEFAULT_SOURCE,\n options: isObject(optionsArg) ? optionsArg : {},\n };\n}\n\nexport function resolveScope(\n options: RegistryMetadata | null | undefined,\n): string {\n return typeof options?.scope === \"string\" && options.scope.trim()\n ? options.scope.trim()\n : DEFAULT_REGISTRY_SCOPE;\n}\n\nexport function resolveUnregisterInput(sourceOrOptions: unknown): {\n instanceId: string | null;\n scope: string | null;\n source: string;\n} {\n if (typeof sourceOrOptions === \"string\") {\n return { instanceId: null, scope: null, source: sourceOrOptions };\n }\n if (isObject(sourceOrOptions)) {\n return {\n instanceId: resolveInstanceId(sourceOrOptions),\n scope:\n typeof sourceOrOptions.scope === \"string\" &&\n sourceOrOptions.scope.trim()\n ? sourceOrOptions.scope.trim()\n : null,\n source:\n typeof sourceOrOptions.source === \"string\"\n ? sourceOrOptions.source\n : DEFAULT_SOURCE,\n };\n }\n return { instanceId: null, scope: null, source: DEFAULT_SOURCE };\n}\n\nexport function mergeModuleConfigs<T extends object>(\n base: T,\n patch: Partial<T>,\n): T {\n const source = base as Record<string, unknown>;\n const changes = patch as Record<string, unknown>;\n const result: Record<string, unknown> = { ...source };\n Object.keys(changes).forEach((key) => {\n const baseVal = source[key];\n const patchVal = changes[key];\n if (\n baseVal &&\n typeof baseVal === \"object\" &&\n !Array.isArray(baseVal) &&\n patchVal &&\n typeof patchVal === \"object\" &&\n !Array.isArray(patchVal)\n ) {\n result[key] = { ...baseVal, ...patchVal };\n } else {\n result[key] = patchVal;\n }\n });\n return result as T;\n}\n","import {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLE_VALUES,\n REGISTRY_LIFECYCLES,\n REGISTRY_METADATA_KEY_SET,\n REGISTRY_METADATA_KEYS,\n REGISTRY_SOURCES,\n REGISTRY_VALIDATION_MODES,\n} from \"./constants\";\nimport {\n getValidString,\n isObject,\n isPlainObject,\n parseFiniteNumber,\n} from \"./utils\";\nimport type {\n NormalizedRegistryMetadata,\n RegistryDefinitions,\n RegistryLifecycle,\n RegistryMetadata,\n RegistryValidationMode,\n ValidationResult,\n} from \"./types\";\n\nexport {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLES,\n REGISTRY_SOURCES,\n REGISTRY_VALIDATION_MODES,\n};\n\nfunction resolveLifecycle(\n metadata: RegistryMetadata | null | undefined,\n fallback: RegistryLifecycle | null,\n): RegistryLifecycle | null {\n const lifecycle = metadata?.lifecycle ?? metadata?.cleanup;\n return lifecycle && REGISTRY_LIFECYCLE_VALUES.has(lifecycle)\n ? lifecycle\n : fallback;\n}\n\nexport function validateRegistryMetadata(metadata: unknown): ValidationResult {\n if (metadata === undefined || metadata === null)\n return { issues: [], valid: true };\n if (!isObject(metadata))\n return { issues: [\"registry metadata must be an object\"], valid: false };\n\n const issues: string[] = [];\n\n Object.keys(metadata).forEach((key) => {\n if (!REGISTRY_METADATA_KEY_SET.has(key))\n issues.push(`unknown registry metadata field: ${key}`);\n });\n\n if (metadata.source !== undefined && !getValidString(metadata.source))\n issues.push(\"source must be a non-empty string\");\n if (metadata.instanceId !== undefined && !getValidString(metadata.instanceId))\n issues.push(\"instanceId must be a non-empty string\");\n if (metadata.scope !== undefined && !getValidString(metadata.scope))\n issues.push(\"scope must be a non-empty string\");\n if (\n metadata.priority !== undefined &&\n parseFiniteNumber(metadata.priority) === null\n )\n issues.push(\"priority must be a finite number\");\n\n if (metadata.cleanupDelayMs !== undefined) {\n const delay = parseFiniteNumber(metadata.cleanupDelayMs);\n if (delay === null || delay < 0)\n issues.push(\"cleanupDelayMs must be a non-negative finite number\");\n }\n\n const lifecycle = metadata.lifecycle ?? metadata.cleanup;\n if (\n lifecycle !== undefined &&\n !REGISTRY_LIFECYCLE_VALUES.has(String(lifecycle))\n ) {\n issues.push(\n `lifecycle must be one of: ${[...REGISTRY_LIFECYCLE_VALUES].join(\", \")}`,\n );\n }\n\n if (\n metadata.validation !== undefined &&\n !Object.values<unknown>(REGISTRY_VALIDATION_MODES).includes(\n metadata.validation,\n )\n ) {\n issues.push(\n `validation must be one of: ${Object.values(REGISTRY_VALIDATION_MODES).join(\", \")}`,\n );\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function validateRegistryKey(\n type: string,\n key: unknown,\n definitions: RegistryDefinitions,\n): ValidationResult {\n const definition = definitions.get(type);\n const issues: string[] = [];\n\n if (!definition) issues.push(`unknown registry type: ${String(type)}`);\n if (!getValidString(key))\n return {\n issues: [...issues, \"key must be a non-empty string\"],\n valid: false,\n };\n\n const normalizedKey = String(key).trim();\n\n if (definition?.keyPolicy === \"singleton\") {\n const expectedKey = definition.singletonKey;\n if (expectedKey && normalizedKey !== expectedKey)\n issues.push(`${type} key must be ${expectedKey}`);\n } else if (definition?.keyPolicy === \"path\") {\n if (!normalizedKey.startsWith(\"/\"))\n issues.push(`${type} key must be an absolute path`);\n } else if (definition?.keyPolicy === \"route\") {\n if (\n !normalizedKey.startsWith(\"/\") &&\n !definition.reservedKeys?.includes(normalizedKey)\n ) {\n issues.push(`${type} key must be a route path or a reserved route key`);\n }\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function validateRegistryValue(\n type: string,\n key: unknown,\n value: unknown,\n definitions: RegistryDefinitions,\n): ValidationResult {\n const definition = definitions.get(type);\n const issues = [...validateRegistryKey(type, key, definitions).issues];\n const valueKind = definition?.valueKind ?? \"object\";\n\n if (definition && valueKind === \"object\" && !isPlainObject(value)) {\n issues.push(`${type} values must be plain objects`);\n }\n if (\n definition &&\n valueKind === \"component\" &&\n typeof value !== \"function\" &&\n !isPlainObject(value)\n ) {\n issues.push(\n `${type} values must be component functions or component objects`,\n );\n }\n\n const validation = definition?.validate?.(value);\n if (validation && !validation.valid && Array.isArray(validation.issues)) {\n issues.push(...validation.issues);\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function normalizeRegistryMetadata(\n metadata: unknown,\n {\n defaultCleanupDelayMs = null,\n defaultLifecycle = null,\n defaultSource = DEFAULT_SOURCE,\n }: {\n defaultCleanupDelayMs?: number | null;\n defaultLifecycle?: RegistryLifecycle | null;\n defaultSource?: string;\n } = {},\n): NormalizedRegistryMetadata {\n const registryMeta = isObject(metadata) ? metadata : {};\n\n const normalizedDefaultDelay = parseFiniteNumber(defaultCleanupDelayMs);\n const fallbackCleanupDelayMs =\n normalizedDefaultDelay !== null && normalizedDefaultDelay >= 0\n ? normalizedDefaultDelay\n : null;\n const fallbackLifecycle =\n defaultLifecycle && REGISTRY_LIFECYCLE_VALUES.has(defaultLifecycle)\n ? defaultLifecycle\n : null;\n\n const source =\n getValidString(registryMeta.source) ||\n getValidString(defaultSource, DEFAULT_SOURCE) ||\n DEFAULT_SOURCE;\n const scope = getValidString(registryMeta.scope);\n const priority = parseFiniteNumber(registryMeta.priority);\n const lifecycle = resolveLifecycle(registryMeta, fallbackLifecycle);\n const validation = isValidationMode(registryMeta.validation)\n ? registryMeta.validation\n : null;\n\n const cleanupDelayCandidate = parseFiniteNumber(registryMeta.cleanupDelayMs);\n let cleanupDelayMs =\n cleanupDelayCandidate !== null && cleanupDelayCandidate >= 0\n ? cleanupDelayCandidate\n : fallbackCleanupDelayMs;\n\n if (lifecycle === REGISTRY_LIFECYCLES.IMMEDIATE) {\n cleanupDelayMs = 0;\n } else if (\n (lifecycle === REGISTRY_LIFECYCLES.GRACEFUL ||\n lifecycle === REGISTRY_LIFECYCLES.ROUTE) &&\n cleanupDelayMs === null\n ) {\n cleanupDelayMs = fallbackCleanupDelayMs;\n }\n\n return {\n cleanupDelayMs,\n lifecycle,\n priority,\n registerOptions: {\n ...(priority !== null && { priority }),\n ...(validation === REGISTRY_VALIDATION_MODES.STRICT && { validation }),\n ...(scope && { scope }),\n },\n source,\n ...(scope && { scope }),\n ...(validation && { validation }),\n };\n}\n\nfunction isValidationMode(value: unknown): value is RegistryValidationMode {\n return Object.values<unknown>(REGISTRY_VALIDATION_MODES).includes(value);\n}\n\nexport function pickRegistryMetadata(options: unknown): RegistryMetadata {\n if (!isObject(options)) return {};\n return Object.fromEntries(\n REGISTRY_METADATA_KEYS.filter((key) => options[key] !== undefined).map(\n (key) => [key, options[key]],\n ),\n );\n}\n","\"use client\";\n\nimport {\n useCallback,\n useMemo,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { useRequiredContext } from \"@/hooks\";\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nimport type {\n RegistryDefinitions,\n RegistrySchema,\n RegistryStore,\n} from \"./types\";\nimport { createRegistryStore, type InitialRegistryEntries } from \"./store\";\n\ntype RegistryValueOf<K extends string> = K extends keyof RegistrySchema\n ? RegistrySchema[K]\n : unknown;\n\ninterface RegistryContextValue {\n actions: Pick<\n RegistryStore,\n \"batch\" | \"register\" | \"transaction\" | \"unregister\"\n >;\n subscription: Pick<\n RegistryStore,\n \"getEntriesSnapshot\" | \"getSnapshot\" | \"subscribe\"\n >;\n}\n\nconst RegistryContext = getOrCreateGlobalContext<RegistryContextValue | null>(\n\n \"RegistryContext\",\n null,\n);\n\nexport function RegistryProvider({\n children,\n definitions,\n initialEntries = [],\n}: {\n children?: ReactNode;\n definitions?: RegistryDefinitions;\n initialEntries?: InitialRegistryEntries;\n}) {\n const [store] = useState(() =>\n createRegistryStore(initialEntries, definitions),\n );\n\n const contextValue = useMemo(\n () => ({\n actions: {\n batch: store.batch,\n register: store.register,\n transaction: store.transaction,\n unregister: store.unregister,\n },\n subscription: {\n getEntriesSnapshot: store.getEntriesSnapshot,\n getSnapshot: store.getSnapshot,\n subscribe: store.subscribe,\n },\n }),\n [store],\n );\n\n return <RegistryContext value={contextValue}>{children}</RegistryContext>;\n}\n\nexport function useRegistryActions(): RegistryContextValue[\"actions\"] {\n return useRequiredContext(\n RegistryContext,\n \"useRegistryActions\",\n \"RegistryProvider\",\n ).actions;\n}\n\nfunction useRegistrySubscription(): RegistryContextValue[\"subscription\"] {\n return useRequiredContext(\n RegistryContext,\n \"useRegistrySubscription\",\n \"RegistryProvider\",\n ).subscription;\n}\n\nexport function useRegistryValue<\n K extends string = string,\n T = RegistryValueOf<K>,\n>(type: K, key: string): T | undefined {\n const { getSnapshot, subscribe } = useRegistrySubscription();\n\n const subscribeToKey = useCallback(\n (listener: () => void) => subscribe(type, key, listener),\n [key, subscribe, type],\n );\n const getValue = useCallback(\n () => getSnapshot<K, T>(type, key),\n [getSnapshot, key, type],\n );\n\n return useSyncExternalStore(subscribeToKey, getValue, getValue);\n}\n\nexport function useRegistryEntries<\n K extends string = string,\n T = RegistryValueOf<K>,\n>(type: K): Record<string, T> {\n const { getEntriesSnapshot, subscribe } = useRegistrySubscription();\n\n const subscribeToType = useCallback(\n (listener: () => void) => subscribe(type, null, listener),\n [subscribe, type],\n );\n const getEntries = useCallback(\n () => getEntriesSnapshot<K, T>(type),\n [getEntriesSnapshot, type],\n );\n\n return useSyncExternalStore(subscribeToType, getEntries, getEntries);\n}\n","\"use client\";\n\nimport { use, type ComponentType, type ReactNode } from \"react\";\nimport { isObject } from \"@/utils\";\nimport { getOrCreateGlobalContext } from \"./context-registry\";\nimport type {\n AnyCoreModule,\n PageConfig,\n RegistryDefinition,\n RegistryDefinitions,\n RegistryMetadata,\n} from \"./types\";\n\nexport type BoundaryComponent = ComponentType<{\n children?: ReactNode;\n name?: string;\n}>;\n\nexport interface ModuleHostValue {\n Boundary: BoundaryComponent;\n byId: ReadonlyMap<string, AnyCoreModule>;\n definitions: RegistryDefinitions;\n modules: readonly AnyCoreModule[];\n}\n\nexport const EMPTY_MODULES: readonly AnyCoreModule[] = Object.freeze([]);\n\nexport const PassthroughBoundary: BoundaryComponent = ({ children }) =>\n children;\n\nexport const ModuleHostContext =\n getOrCreateGlobalContext<ModuleHostValue | null>(\"ModuleHostContext\", null);\n\n\nexport function selectModuleSlice(\n coreModule: AnyCoreModule,\n config: PageConfig,\n): unknown {\n const slice = coreModule.page?.select\n ? coreModule.page.select(config)\n : (config as Record<string, unknown>)[coreModule.id];\n return slice ?? null;\n}\n\nexport function createModulePayload(\n modules: readonly AnyCoreModule[],\n config: PageConfig,\n metadata: RegistryMetadata = {},\n): PageConfig | null {\n const payload: Record<string, unknown> = {};\n let hasSlices = false;\n for (const coreModule of modules) {\n if (!coreModule.page?.entries) continue;\n const slice = selectModuleSlice(coreModule, config);\n if (slice === null) continue;\n payload[coreModule.id] = slice;\n hasSlices = true;\n }\n if (!hasSlices) return null;\n return {\n ...payload,\n registry: {\n ...metadata,\n ...(isObject(config.registry) ? config.registry : {}),\n },\n } as PageConfig;\n}\n\nconst MODULE_ID_PATTERN = /^[a-z][a-zA-Z0-9]*$/;\n\nexport function sortModules(\n modules: readonly AnyCoreModule[],\n): AnyCoreModule[] {\n const byId = new Map<string, AnyCoreModule>();\n for (const coreModule of modules) {\n if (!MODULE_ID_PATTERN.test(coreModule.id)) {\n throw new Error(\n `[Core] Invalid module id \"${coreModule.id}\": use a camelCase name such as \"contextMenu\".`,\n );\n }\n if (byId.has(coreModule.id)) {\n throw new Error(`[Core] Module \"${coreModule.id}\" is installed twice.`);\n }\n byId.set(coreModule.id, coreModule);\n }\n\n const sorted: AnyCoreModule[] = [];\n const state = new Map<string, \"visiting\" | \"done\">();\n const visit = (coreModule: AnyCoreModule, path: string[]) => {\n const current = state.get(coreModule.id);\n if (current === \"done\") return;\n if (current === \"visiting\") {\n throw new Error(\n `[Core] Module dependency cycle: ${[...path, coreModule.id].join(\" -> \")}`,\n );\n }\n state.set(coreModule.id, \"visiting\");\n for (const id of coreModule.uses ?? []) {\n const dependency = byId.get(id);\n if (dependency) visit(dependency, [...path, coreModule.id]);\n }\n state.set(coreModule.id, \"done\");\n sorted.push(coreModule);\n };\n modules.forEach((coreModule) => visit(coreModule, []));\n return sorted;\n}\n\nexport function createModuleRegistryDefinitions(\n modules: readonly AnyCoreModule[],\n): RegistryDefinitions {\n const definitions = new Map<string, RegistryDefinition>();\n for (const coreModule of modules) {\n if (coreModule.registry)\n definitions.set(coreModule.id, coreModule.registry);\n }\n return definitions;\n}\n\nexport function useInstalledModules(): readonly AnyCoreModule[] {\n return use(ModuleHostContext)?.modules ?? EMPTY_MODULES;\n}\n","import {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLES,\n normalizeRegistryMetadata,\n validateRegistryMetadata,\n} from \"./schema\";\nimport { isObject } from \"./utils\";\nimport type {\n AnyCoreModule,\n PageConfig,\n RegistrationEntry,\n RegistryApplyContext,\n RegistryCleanupTimer,\n RegistryMetadata,\n RegistryQueue,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\ntype CleanupScope = Map<string, RegistryCleanupTimer>;\n\nfunction isPersistentLifecycle(lifecycle: unknown): boolean {\n return lifecycle === REGISTRY_LIFECYCLES.PERSISTENT;\n}\n\nfunction runRegistrationBatch(\n context: RegistryApplyContext,\n executor: (queue: RegistryQueue) => void,\n): number | void {\n return typeof context.batch === \"function\"\n ? context.batch(executor)\n : executor(context);\n}\n\nfunction createEntryCleanupKey(\n type: string,\n key: string,\n source: string,\n instanceId: string | null,\n scope: string | undefined,\n): string {\n return JSON.stringify([\n \"entry\",\n type,\n key,\n scope ?? null,\n source,\n instanceId,\n ]);\n}\n\nfunction getCleanupScope(\n context: RegistryApplyContext | null | undefined,\n): CleanupScope {\n return context?.cleanupScope || new Map();\n}\n\nfunction clearCleanupTimer(scope: CleanupScope, cleanupKey: string): void {\n const lifecycle = scope.get(cleanupKey);\n if (!lifecycle) return;\n lifecycle.cancelled = true;\n if (lifecycle.timerId !== null) clearTimeout(lifecycle.timerId);\n scope.delete(cleanupKey);\n}\n\nfunction scheduleCleanup(\n scope: CleanupScope,\n cleanupKey: string,\n callback: () => void,\n delayMs: number,\n): void {\n clearCleanupTimer(scope, cleanupKey);\n const lifecycle: RegistryCleanupTimer = {\n cancelled: false,\n timerId: null,\n };\n\n lifecycle.timerId = setTimeout(() => {\n if (lifecycle.cancelled || scope.get(cleanupKey) !== lifecycle) return;\n scope.delete(cleanupKey);\n callback();\n }, delayMs);\n\n scope.set(cleanupKey, lifecycle);\n}\n\ntype ModuleRegistration = RegistrationEntry & {\n cleanupKey: string;\n type: string;\n};\n\nfunction collectModuleRegistrations(\n coreModule: AnyCoreModule,\n slice: unknown,\n pageMetadata: RegistryMetadata,\n context: RegistryApplyContext,\n): ModuleRegistration[] {\n const definition = coreModule.registry;\n const toEntries = coreModule.page?.entries;\n if (!definition || !toEntries || slice == null || slice === false) return [];\n\n const type = coreModule.id;\n const items = Array.isArray(slice) ? slice : [slice];\n const registrations: ModuleRegistration[] = [];\n\n for (const item of items) {\n if (item == null || item === false) continue;\n const itemMetadata =\n isObject(item) && isObject(item.registry) ? item.registry : {};\n const metadata = { ...pageMetadata, ...itemMetadata };\n if (\n metadata.validation === \"strict\" &&\n !validateRegistryMetadata(metadata).valid\n ) {\n continue;\n }\n\n const payload = isObject(item)\n ? Object.fromEntries(\n Object.entries(item).filter(([key]) => key !== \"registry\"),\n )\n : item;\n const { cleanupDelayMs, lifecycle, registerOptions, scope, source } =\n normalizeRegistryMetadata(metadata, {\n defaultCleanupDelayMs: definition.cleanupDelayMs ?? null,\n defaultLifecycle: definition.lifecycle,\n defaultSource: DEFAULT_SOURCE,\n });\n\n for (const { key, value } of toEntries(payload, context) ?? []) {\n const validation = definition.validate?.(value);\n if (validation && !validation.valid) {\n report(`Registry ${type} config is invalid`, validation.issues, \"warn\");\n continue;\n }\n registrations.push({\n cleanupDelayMs,\n cleanupKey: createEntryCleanupKey(\n type,\n key,\n source,\n context.instanceId,\n scope,\n ),\n key,\n lifecycle,\n registerOptions,\n scope,\n source,\n type,\n value,\n });\n }\n }\n return registrations;\n}\n\nconst NO_CLEANUP = () => {};\n\nexport function applyRegistryConfig(\n config: PageConfig | null | undefined,\n context: RegistryApplyContext,\n): () => void {\n const modules = context.modules ?? [];\n if (!config || modules.length === 0) return NO_CLEANUP;\n const pageMetadata = isObject(config.registry) ? config.registry : {};\n const slices = config as Record<string, unknown>;\n\n const registrations = modules.flatMap((coreModule) => {\n try {\n return collectModuleRegistrations(\n coreModule,\n slices[coreModule.id],\n pageMetadata,\n context,\n );\n } catch (error) {\n report(`Registry apply (${coreModule.id})`, error);\n return [];\n }\n });\n if (registrations.length === 0) return NO_CLEANUP;\n\n const cleanupScope = getCleanupScope(context);\n const owner = (registration: ModuleRegistration) => ({\n instanceId: context.instanceId,\n scope: registration.scope,\n source: registration.source,\n });\n\n runRegistrationBatch(context, (queue) => {\n registrations.forEach(\n ({ cleanupKey, key, registerOptions, source, type, value }) => {\n clearCleanupTimer(cleanupScope, cleanupKey);\n queue.register(type, key, value, source, registerOptions);\n },\n );\n });\n\n return () => {\n const immediate: ModuleRegistration[] = [];\n registrations.forEach((registration) => {\n if (isPersistentLifecycle(registration.lifecycle)) return;\n const { cleanupDelayMs, cleanupKey, key, type } = registration;\n if (typeof cleanupDelayMs === \"number\" && cleanupDelayMs > 0) {\n scheduleCleanup(\n cleanupScope,\n cleanupKey,\n () => context.unregister(type, key, owner(registration)),\n cleanupDelayMs,\n );\n } else {\n immediate.push(registration);\n }\n });\n if (immediate.length === 0) return;\n runRegistrationBatch(context, (queue) => {\n immediate.forEach((registration) =>\n queue.unregister(\n registration.type,\n registration.key,\n owner(registration),\n ),\n );\n });\n };\n}\n","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport { useIsomorphicLayoutEffect } from \"@/hooks\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { applyRegistryConfig } from \"./handlers\";\nimport { createModulePayload, useInstalledModules } from \"./installed\";\nimport { useRegistryActions } from \"./provider\";\nimport { isObject, shallowEqual } from \"@/utils\";\nimport type {\n PageConfig,\n RegistryCleanupTimer,\n RegistryApplyContext,\n RegistryMetadata,\n RegistryQueue,\n RegistrySourceOrOptions,\n StableFunctionEntry,\n AnyFunction,\n} from \"./types\";\n\nfunction withInstanceId(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): {\n optionsArg: RegistryMetadata | undefined;\n sourceOrOptions: RegistrySourceOrOptions;\n} {\n if (typeof sourceOrOptions === \"string\") {\n return {\n optionsArg: { ...(isObject(optionsArg) ? optionsArg : {}), instanceId },\n sourceOrOptions,\n };\n }\n if (isObject(sourceOrOptions)) {\n return {\n optionsArg,\n sourceOrOptions: { ...sourceOrOptions, instanceId },\n };\n }\n return {\n optionsArg: undefined,\n sourceOrOptions: {\n ...(isObject(optionsArg) ? optionsArg : {}),\n instanceId,\n },\n };\n}\n\nfunction withInstanceIdForUnregister(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n): RegistryMetadata {\n if (typeof sourceOrOptions === \"string\") {\n return { instanceId, source: sourceOrOptions };\n }\n if (isObject(sourceOrOptions)) {\n return { ...sourceOrOptions, instanceId };\n }\n return { instanceId };\n}\n\nfunction resolveRegisterArgsWithInstance(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): [RegistrySourceOrOptions, RegistryMetadata | undefined] {\n const input = withInstanceId(instanceId, sourceOrOptions, optionsArg);\n return [input.sourceOrOptions, input.optionsArg];\n}\n\n/* eslint-disable react-hooks/refs */\nexport function useShallowStable<T extends object>(value: T): T {\n const ref = useRef(value);\n if (ref.current !== value && !shallowEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n/* eslint-enable react-hooks/refs */\n\nconst MAX_STABILIZATION_DEPTH = 64;\n\nfunction createStableFunctionEntry(fn: AnyFunction): StableFunctionEntry {\n const entry: StableFunctionEntry = {\n current: fn,\n stable(this: unknown, ...args: unknown[]) {\n return entry.current?.apply(this, args);\n },\n };\n return entry;\n}\n\ninterface StabilizeScope {\n componentSlices: ReadonlySet<string>;\n functionEntries: Map<string, StableFunctionEntry>;\n usedPaths: Set<string>;\n}\n\nfunction isDirectRegistryComponentPath(\n path: string,\n componentSlices: ReadonlySet<string>,\n): boolean {\n const match = /^config\\.([^.[]+)\\.[^.[]+$/.exec(path);\n return Boolean(match && componentSlices.has(match[1]));\n}\n\nfunction isReactNodeLike(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n typeof value === \"boolean\" ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n isValidElement(value)\n );\n}\n\nfunction isStabilizableObject(\n value: unknown,\n): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !isValidElement(value)\n );\n}\n\nfunction hasSameObjectKeys(\n previousValue: unknown,\n nextValue: unknown,\n): boolean {\n if (\n !isStabilizableObject(previousValue) ||\n !isStabilizableObject(nextValue)\n ) {\n return false;\n }\n const previousKeys = Object.keys(previousValue);\n const nextKeys = Object.keys(nextValue);\n if (previousKeys.length !== nextKeys.length) return false;\n return nextKeys.every((key) =>\n Object.prototype.hasOwnProperty.call(previousValue, key),\n );\n}\n\nfunction stabilizeRegistryValue(\n value: unknown,\n path: string,\n scope: StabilizeScope,\n previousValue?: unknown,\n seen = new WeakSet<object>(),\n depth = 0,\n): unknown {\n if (depth > MAX_STABILIZATION_DEPTH) return value;\n\n if (typeof value === \"function\") {\n const isComponent = value.name && /^[A-Z]/.test(value.name);\n if (\n isComponent ||\n isDirectRegistryComponentPath(path, scope.componentSlices)\n ) {\n return value;\n }\n scope.usedPaths.add(path);\n let entry = scope.functionEntries.get(path);\n if (!entry) {\n entry = createStableFunctionEntry(value as AnyFunction);\n scope.functionEntries.set(path, entry);\n } else {\n entry.current = value as AnyFunction;\n }\n return entry.stable;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) return value;\n seen.add(value);\n }\n\n if (isValidElement(value)) {\n const nextProps = stabilizeRegistryValue(\n value.props,\n `${path}.props`,\n scope,\n isValidElement(previousValue) ? previousValue.props : undefined,\n seen,\n depth + 1,\n ) as Record<string, unknown>;\n if (\n isValidElement(previousValue) &&\n previousValue.type === value.type &&\n previousValue.key === value.key &&\n previousValue.props === nextProps\n ) {\n return previousValue;\n }\n return cloneElement(value, nextProps);\n }\n\n if (Array.isArray(value)) {\n const nextValue = value.every(isReactNodeLike)\n ? Children.toArray(value)\n : value;\n const previousArray = Array.isArray(previousValue) ? previousValue : null;\n let hasChanged =\n !previousArray || previousArray.length !== nextValue.length;\n\n const stabilizedValue: unknown[] = nextValue.map((item, index) => {\n const nextItem = stabilizeRegistryValue(\n item,\n `${path}[${index}]`,\n scope,\n previousArray?.[index],\n seen,\n depth + 1,\n );\n if (!previousArray || nextItem !== previousArray[index]) {\n hasChanged = true;\n }\n return nextItem;\n });\n return !hasChanged ? previousArray : stabilizedValue;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n const source = value as Record<string, unknown>;\n const previousRecord = previousValue as Record<string, unknown> | undefined;\n const stabilizedValue: Record<string, unknown> = {};\n const canReusePrevious = hasSameObjectKeys(previousValue, value);\n let hasChanged = !canReusePrevious;\n\n Object.keys(source).forEach((key) => {\n const nextValue = stabilizeRegistryValue(\n source[key],\n `${path}.${key}`,\n scope,\n previousRecord?.[key],\n seen,\n depth + 1,\n );\n stabilizedValue[key] = nextValue;\n if (!canReusePrevious || nextValue !== previousRecord?.[key]) {\n hasChanged = true;\n }\n });\n\n return !hasChanged ? previousValue : stabilizedValue;\n}\n\nfunction useAppliedRegistryConfig(\n payload: PageConfig | null,\n context: RegistryApplyContext,\n componentSlices: ReadonlySet<string>,\n): void {\n const functionEntriesRef = useRef(new Map<string, StableFunctionEntry>());\n const appliedRef = useRef<{\n cleanup: () => void;\n config: unknown;\n context: RegistryApplyContext;\n payload: PageConfig | null;\n } | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n const previous = appliedRef.current;\n if (\n previous &&\n previous.payload === payload &&\n previous.context === context\n ) {\n return;\n }\n const functionEntries = functionEntriesRef.current;\n const usedPaths = new Set<string>();\n const config = stabilizeRegistryValue(\n payload,\n \"config\",\n { componentSlices, functionEntries, usedPaths },\n previous?.config,\n );\n functionEntries.forEach((_entry, path) => {\n if (!usedPaths.has(path)) functionEntries.delete(path);\n });\n\n if (\n previous &&\n previous.config === config &&\n previous.context === context\n ) {\n previous.payload = payload;\n return;\n }\n previous?.cleanup();\n appliedRef.current = {\n cleanup: applyRegistryConfig(config as PageConfig | null, context),\n config,\n context,\n payload,\n };\n });\n\n useIsomorphicLayoutEffect(\n () => () => {\n appliedRef.current?.cleanup();\n appliedRef.current = null;\n },\n [],\n );\n}\n\nexport function createRegistryApplyContext(\n actions: RegistryQueue & Pick<RegistryApplyContext, \"batch\">,\n {\n cleanupScope = new Map<string, RegistryCleanupTimer>(),\n instanceId,\n modules = [],\n pathname,\n }: Pick<RegistryApplyContext, \"instanceId\" | \"modules\" | \"pathname\"> & {\n cleanupScope?: RegistryApplyContext[\"cleanupScope\"];\n },\n): RegistryApplyContext {\n const stamp = (queue: RegistryQueue): RegistryQueue =>\n ({\n register: (\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions?: RegistrySourceOrOptions,\n optionsArg?: RegistryMetadata,\n ) =>\n queue.register(\n type,\n key,\n item,\n ...resolveRegisterArgsWithInstance(\n instanceId,\n sourceOrOptions,\n optionsArg,\n ),\n ),\n unregister: (\n type: string,\n key: string,\n sourceOrOptions?: RegistrySourceOrOptions,\n ) =>\n queue.unregister(\n type,\n key,\n withInstanceIdForUnregister(instanceId, sourceOrOptions),\n ),\n }) as RegistryQueue;\n\n return {\n ...stamp(actions),\n batch: (executor) =>\n typeof executor === \"function\"\n ? actions.batch((queue) => executor(stamp(queue)))\n : 0,\n cleanupScope,\n instanceId,\n modules,\n pathname,\n };\n}\n\nexport function useRegistry(\n config?: PageConfig | null,\n metadata?: RegistryMetadata,\n): void {\n const { batch, register, unregister } = useRegistryActions();\n const pathname = usePathname();\n const modules = useInstalledModules();\n const instanceId = `registry-instance-${useId()}`;\n const [cleanupScope] = useState(\n () => new Map<string, RegistryCleanupTimer>(),\n );\n\n const context = useMemo(\n () =>\n createRegistryApplyContext(\n { batch, register, unregister },\n {\n cleanupScope,\n instanceId,\n modules,\n pathname,\n },\n ),\n [batch, cleanupScope, instanceId, modules, pathname, register, unregister],\n );\n\n const payload = useMemo(\n () => (config ? createModulePayload(modules, config, metadata) : null),\n [config, metadata, modules],\n );\n const componentSlices = useMemo(\n () =>\n new Set(\n modules\n .filter(\n (coreModule) => coreModule.registry?.valueKind === \"component\",\n )\n .map((coreModule) => coreModule.id),\n ),\n [modules],\n );\n useAppliedRegistryConfig(payload, context, componentSlices);\n}\n","\"use client\";\n\nimport { createElement, use, useState, type ReactNode } from \"react\";\nimport { useStore } from \"@/hooks\";\nimport { createStore, type ExternalStore } from \"@/utils\";\nimport {\n EMPTY_MODULES,\n ModuleHostContext,\n PassthroughBoundary,\n createModuleRegistryDefinitions,\n sortModules,\n type BoundaryComponent,\n type ModuleHostValue,\n} from \"./installed\";\nimport { PageControllerProvider } from \"./page-controller\";\nimport { RegistryProvider } from \"./provider\";\nimport type {\n AnyCoreModule,\n AppRegistryEntry,\n CoreModule,\n CoreModules,\n ModuleId,\n ModuleRuntimeOf,\n ModuleStateOf,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nexport function defineModule<\n TId extends string,\n TRuntime = never,\n TSlice = never,\n TController = never,\n>(\n coreModule: CoreModule<TId, TRuntime, TSlice, TController>,\n): CoreModule<TId, TRuntime, TSlice, TController> {\n return Object.freeze({ ...coreModule });\n}\n\nfunction warnMissingPeers(modules: readonly AnyCoreModule[]): void {\n const installed = new Set(modules.map((coreModule) => coreModule.id));\n for (const { id, uses } of modules) {\n const missing = (uses ?? []).filter((peer) => !installed.has(peer));\n if (missing.length > 0) {\n report(\n `Module \"${id}\" runs without its optional peers`,\n missing.join(\", \"),\n \"warn\",\n );\n }\n }\n}\n\nfunction createModuleHost(\n modules: readonly AnyCoreModule[],\n Boundary: BoundaryComponent,\n): ModuleHostValue {\n const sorted = sortModules(modules);\n if (process.env.NODE_ENV !== \"production\") warnMissingPeers(sorted);\n return {\n Boundary,\n byId: new Map(sorted.map((coreModule) => [coreModule.id, coreModule])),\n definitions: createModuleRegistryDefinitions(sorted),\n modules: Object.freeze(sorted),\n };\n}\n\nexport interface ModuleHostProps {\n boundary?: BoundaryComponent;\n children?: ReactNode;\n modules?: readonly AnyCoreModule[];\n registryEntries?: readonly AppRegistryEntry[];\n}\n\nexport function ModuleHost({\n boundary = PassthroughBoundary,\n children,\n modules = EMPTY_MODULES,\n registryEntries,\n}: ModuleHostProps) {\n const [host] = useState(() => createModuleHost(modules, boundary));\n const { Boundary } = host;\n\n const content = (\n <>\n {host.modules.map(({ Backdrop, id }) =>\n Backdrop ? (\n <Boundary key={id} name={id}>\n <Backdrop />\n </Boundary>\n ) : null,\n )}\n {children}\n {host.modules.map(({ Overlay, id }) =>\n Overlay ? (\n <Boundary key={id} name={id}>\n <Overlay />\n </Boundary>\n ) : null,\n )}\n </>\n );\n\n const tree = host.modules.reduceRight<ReactNode>(\n (inner, { Provider }) => (Provider ? <Provider>{inner}</Provider> : inner),\n content,\n );\n\n return (\n <RegistryProvider\n definitions={host.definitions}\n initialEntries={registryEntries}\n >\n <ModuleHostContext value={host}>\n <PageControllerProvider>{tree}</PageControllerProvider>\n </ModuleHostContext>\n </RegistryProvider>\n );\n}\n\nexport function useModule<K extends ModuleId>(\n id: K,\n): ModuleRuntimeOf<CoreModules[K]> | null {\n const coreModule = use(ModuleHostContext)?.byId.get(id);\n return coreModule?.context ? (use(coreModule.context) ?? null) : null;\n}\n\ntype ModuleActionsOf<K extends ModuleId> =\n ModuleRuntimeOf<CoreModules[K]> extends { actions: infer TActions }\n ? TActions\n : never;\n\nexport interface ModulePeer<K extends ModuleId> {\n useActions(): ModuleActionsOf<K>;\n useRuntime(): ModuleRuntimeOf<CoreModules[K]>;\n useState<T>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ): T;\n}\n\nexport function definePeer<K extends ModuleId>(\n id: K,\n inert: ModuleRuntimeOf<CoreModules[K]>,\n): ModulePeer<K> {\n const useRuntime = (): ModuleRuntimeOf<CoreModules[K]> =>\n useModule(id) ?? inert;\n return {\n useRuntime,\n useActions: () => useRuntime().actions as ModuleActionsOf<K>,\n useState: <T,>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ) =>\n useStore<ModuleStateOf<K>, T>(\n (useRuntime() as { store: ExternalStore<ModuleStateOf<K>> }).store,\n selector,\n isEqual,\n ),\n };\n}\n\nconst NO_MODULE_STORE: ExternalStore<unknown> = createStore<unknown>(undefined);\n\nexport function useModuleState<K extends ModuleId, T>(\n id: K,\n selector: (state: ModuleStateOf<K>) => T,\n fallback: T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const runtime = useModule(id) as { store: ExternalStore<unknown> } | null;\n return useStore<unknown, T>(\n runtime?.store ?? NO_MODULE_STORE,\n (state) => (runtime ? selector(state as ModuleStateOf<K>) : fallback),\n isEqual,\n );\n}\n\nexport function ModuleBoundary({\n children,\n name,\n}: {\n children?: ReactNode;\n name?: string;\n}) {\n const Boundary = use(ModuleHostContext)?.Boundary ?? PassthroughBoundary;\n return createElement(Boundary, { name }, children);\n}\n\nexport function useIsModuleInstalled(id: ModuleId): boolean {\n return use(ModuleHostContext)?.byId.has(id) ?? false;\n}\n","\"use client\";\n\nimport { pickRegistryMetadata } from \"./schema\";\nimport { useRegistry } from \"./hooks\";\nimport { useInstalledModules } from \"./installed\";\nimport type { ModuleId, PageConfig, RegistryMetadata } from \"./types\";\n\nexport function useModuleRegistration(\n id: ModuleId,\n value: unknown,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n const coreModule = useInstalledModules().find(\n (candidate) => candidate.id === id,\n );\n const config =\n coreModule && options?.enabled !== false && value != null\n ? ({ [id]: value } as PageConfig)\n : null;\n useRegistry(config, pickRegistryMetadata(options));\n}\n","\"use client\";\n\nimport {\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n","import { defineThemeSpec } from \"@/theme\";\nimport { type ContextMenuPosition, type ContextMenuThemeSlot } from \"./types\";\n\nexport const contextMenuTheme =\n defineThemeSpec<ContextMenuThemeSlot>(\"context-menu\");\n\nexport const CURRENT_PAGE_KEY = \"current-page\";\nexport const GLOBAL_MENU_KEY = \"*\";\nexport const MENU_SCREEN_MARGIN = 10;\n\nexport const CONTEXT_MENU_VISIBILITY_EVENT = \"context-menu:visibility\";\nexport const INITIAL_POSITION: ContextMenuPosition = Object.freeze({\n x: 0,\n y: 0,\n});\n","import { isValidElement, type ReactNode } from \"react\";\nimport { isBrowser, isObject, toArray, toFiniteNumber } from \"@/utils\";\nimport {\n CONTEXT_MENU_VISIBILITY_EVENT,\n INITIAL_POSITION,\n MENU_SCREEN_MARGIN,\n} from \"./constants\";\nimport {\n type ContextMenuConfig,\n type ContextMenuContextValue,\n type ContextMenuItem,\n type ContextMenuOpenInput,\n type ContextMenuPageMeta,\n type ContextMenuPosition,\n type ContextMenuResolvedHeader,\n type ContextMenuResolvedItem,\n type ContextMenuState,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nexport function joinClassNames(\n ...classes: (string | boolean | null | undefined)[]\n): string {\n return classes.filter(Boolean).join(\" \");\n}\n\nconst SCROLL_LOCK_KEYS = new Set([\n \"ArrowDown\",\n \"ArrowUp\",\n \"End\",\n \"Home\",\n \"PageDown\",\n \"PageUp\",\n \" \",\n \"Spacebar\",\n]);\n\nexport function isScrollLockKey(event: { key: string }): boolean {\n return SCROLL_LOCK_KEYS.has(event.key);\n}\n\nexport function extractNodeText(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return value\n .map(extractNodeText)\n .filter(Boolean)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n }\n if (isValidElement(value))\n return extractNodeText((value.props as { children?: ReactNode })?.children);\n return \"\";\n}\n\nexport function resolveAsBoolean(\n value: unknown,\n context?: unknown,\n defaultValue = true,\n): boolean {\n if (typeof value === \"function\") {\n try {\n return Boolean(value(context));\n } catch {\n return false;\n }\n }\n if (value === undefined) {\n return defaultValue;\n }\n return Boolean(value);\n}\n\nexport function resolveAsValue<T = unknown>(\n value: unknown,\n context?: unknown,\n fallback?: T,\n): T {\n if (typeof value === \"function\") {\n try {\n const resolved = value(context);\n return resolved === undefined ? (fallback as T) : resolved;\n } catch {\n return fallback as T;\n }\n }\n return value === undefined ? (fallback as T) : (value as T);\n}\n\nexport function emitContextMenuVisibility(isOpen: boolean): void {\n if (!isBrowser) return;\n window.dispatchEvent(\n new CustomEvent(CONTEXT_MENU_VISIBILITY_EVENT, {\n detail: { isOpen: Boolean(isOpen) },\n }),\n );\n}\n\nexport function safeInvoke<T = unknown>(\n handler: unknown,\n ...args: unknown[]\n): T | undefined {\n if (typeof handler !== \"function\") return undefined;\n try {\n const result = handler(...args);\n if (result && typeof result.then === \"function\") {\n result.catch((err: unknown) =>\n report(\"Context menu async callback\", err),\n );\n }\n return result as T;\n } catch (error) {\n report(\"Context menu callback\", error);\n return undefined;\n }\n}\n\nexport function resolveContextMenuPageMeta(\n dockItem: unknown,\n pathname = \"\",\n): ContextMenuPageMeta | null {\n if (!isObject(dockItem)) return null;\n const title = (dockItem.contextMenuTitle ??\n dockItem.title ??\n null) as ReactNode;\n const description = (dockItem.contextMenuDescription ??\n dockItem.description ??\n null) as ReactNode;\n const eyebrow = (dockItem.contextMenuEyebrow ??\n dockItem.eyebrow ??\n null) as ReactNode;\n const icon = (dockItem.contextMenuIcon ?? dockItem.icon ?? null) as ReactNode;\n\n if (!title && !description && !icon && !eyebrow) return null;\n\n return {\n description,\n descriptionText: extractNodeText(description),\n eyebrow,\n icon,\n path:\n typeof dockItem.path === \"string\" && dockItem.path\n ? dockItem.path\n : pathname,\n title,\n titleText:\n extractNodeText(title) ||\n (typeof dockItem.name === \"string\" ? dockItem.name : \"\") ||\n \"\",\n };\n}\n\nexport function positionMenu(\n menuElement: HTMLElement | null,\n position?: ContextMenuPosition | null,\n): void {\n if (!menuElement) return;\n const { height, width } = menuElement.getBoundingClientRect();\n const maxX = window.innerWidth - width - MENU_SCREEN_MARGIN;\n const maxY = window.innerHeight - height - MENU_SCREEN_MARGIN;\n\n const x = Math.min(Number(position?.x) || 0, maxX);\n const y = Math.min(Number(position?.y) || 0, maxY);\n\n menuElement.style.left = `${Math.round(Math.max(MENU_SCREEN_MARGIN, x))}px`;\n menuElement.style.top = `${Math.round(Math.max(MENU_SCREEN_MARGIN, y))}px`;\n}\n\nfunction resolveItem(\n item: ContextMenuItem | \"separator\" | null | undefined,\n index: number,\n context: ContextMenuContextValue,\n): ContextMenuResolvedItem | null {\n if (!item) return null;\n if (item === \"separator\" || item.type === \"separator\") {\n return {\n key: (item !== \"separator\" && item.key) || `separator-${index}`,\n type: \"separator\",\n };\n }\n\n if (\n resolveAsBoolean(item.hidden, context, false) ||\n !resolveAsBoolean(item.visible, context, true)\n ) {\n return null;\n }\n\n const label = resolveAsValue(item.label, context, \"\");\n if (\n (typeof label !== \"string\" && typeof label !== \"number\") ||\n !String(label).trim()\n ) {\n return null;\n }\n\n const handler = item.onSelect ?? item.onClick ?? null;\n const shortcut = resolveAsValue(item.shortcut, context, null);\n\n return {\n ...item,\n className: resolveAsValue(item.className, context, \"\") || \"\",\n closeOnSelect: item.closeOnSelect !== false,\n danger: resolveAsBoolean(item.danger, context, false),\n disabled: resolveAsBoolean(item.disabled, context, false),\n icon: resolveAsValue(item.icon, context, null) || null,\n itemIconClassName:\n resolveAsValue(item.itemIconClassName, context, \"\") || \"\",\n key: item.key || `item-${index}`,\n label: String(label),\n onClick: handler,\n onSelect: handler,\n shortcut: typeof shortcut === \"string\" ? shortcut : null,\n type: \"action\",\n };\n}\n\nexport function resolveMenuItems(\n config: ContextMenuConfig | null | undefined,\n context: ContextMenuContextValue,\n): ContextMenuResolvedItem[] {\n const rawItems = resolveAsValue(config?.items, context, []);\n const items: ContextMenuResolvedItem[] = [];\n\n toArray(rawItems).forEach((raw, index) => {\n const item = resolveItem(raw, index, context);\n if (!item) return;\n const previous = items[items.length - 1];\n if (\n item.type === \"separator\" &&\n (!previous || previous.type === \"separator\")\n ) {\n return;\n }\n items.push(item);\n });\n\n if (items[items.length - 1]?.type === \"separator\") items.pop();\n return items;\n}\n\nexport function resolveMenuHeader(\n config: ContextMenuConfig | null | undefined,\n context: ContextMenuContextValue,\n): ContextMenuResolvedHeader | null {\n if (config?.header === false || config?.showPageHeader === false) return null;\n\n const configured = resolveAsValue(config?.header, context, null);\n const source = isObject(configured)\n ? configured\n : isObject(context.page)\n ? context.page\n : null;\n if (!source) return null;\n\n const title = resolveAsValue(source.title, context, null);\n const description = resolveAsValue(source.description, context, null);\n const icon = resolveAsValue(source.icon, context, null);\n const eyebrow = resolveAsValue(source.eyebrow, context, null);\n if (!title && !description && !icon && !eyebrow) return null;\n\n return {\n description,\n descriptionText: extractNodeText(description),\n eyebrow,\n icon,\n title,\n titleText: extractNodeText(title),\n };\n}\n\nexport function getNextActiveIndex(\n items: ContextMenuResolvedItem[],\n current: number,\n direction: 1 | -1,\n): number {\n const count = items.length;\n const start =\n current < 0 ? (direction === 1 ? 0 : count - 1) : current + direction;\n\n for (let step = 0; step < count; step++) {\n const index = (((start + step * direction) % count) + count) % count;\n if (items[index].type === \"action\" && !items[index].disabled) return index;\n }\n return current;\n}\n","import { isObject, toArray } from \"@/utils\";\nimport { CURRENT_PAGE_KEY, GLOBAL_MENU_KEY } from \"./constants\";\nimport { resolveMenuItems, resolveAsBoolean, safeInvoke } from \"./utils\";\nimport {\n type ContextMenuCandidate,\n type ContextMenuConfig,\n type ContextMenuContextValue,\n type ContextMenuResolvedItem,\n type ContextMenuResolvedMatch,\n} from \"./types\";\n\nfunction normalizeMenuCandidates(\n registryMenus?: Record<string, unknown> | null,\n): ContextMenuCandidate[] {\n const candidates: ContextMenuCandidate[] = [];\n\n for (const [registryKey, rawConfig] of Object.entries(registryMenus || {})) {\n if (!isObject(rawConfig)) continue;\n\n const { menus, ...sharedConfig } = rawConfig as ContextMenuConfig;\n const nestedMenus = toArray(menus);\n const hasSharedItems =\n Array.isArray(sharedConfig.items) ||\n typeof sharedConfig.items === \"function\";\n\n if (hasSharedItems || nestedMenus.length === 0) {\n candidates.push({\n config: sharedConfig,\n order: candidates.length,\n registryKey,\n });\n }\n\n for (const menu of nestedMenus) {\n candidates.push({\n config: {\n ...sharedConfig,\n ...menu,\n classNames: { ...sharedConfig.classNames, ...menu.classNames },\n },\n order: candidates.length,\n registryKey,\n });\n }\n }\n return candidates;\n}\n\nfunction isPathAllowed(\n config: ContextMenuConfig,\n registryKey: string,\n pathname?: string,\n): boolean {\n if (!pathname) return true;\n if (config.path === pathname) return true;\n\n const explicitPaths = toArray(config.paths).filter(Boolean);\n if (explicitPaths.length > 0) return explicitPaths.includes(pathname);\n\n if (typeof config.pathMatcher === \"function\") {\n try {\n return Boolean(config.pathMatcher(pathname));\n } catch {\n return false;\n }\n }\n\n return (\n registryKey === pathname ||\n registryKey === CURRENT_PAGE_KEY ||\n registryKey === GLOBAL_MENU_KEY\n );\n}\n\nfunction getElementDepth(from: Element, ancestor: Element): number {\n let depth = 0;\n for (\n let node: Element | null = from;\n node && node !== ancestor;\n node = node.parentElement\n ) {\n depth += 1;\n }\n return depth;\n}\n\nfunction getTargetScore(\n config: ContextMenuConfig,\n targetElement: Element | null,\n): number | null {\n const selectors = toArray(config.target).filter(\n (selector) => typeof selector === \"string\" && selector.trim(),\n );\n if (selectors.length === 0) return 0;\n if (!targetElement) return null;\n\n let minDepth = Infinity;\n for (const selector of selectors) {\n try {\n const matched = targetElement.closest(selector);\n if (matched) {\n minDepth = Math.min(minDepth, getElementDepth(targetElement, matched));\n }\n } catch {}\n }\n return minDepth === Infinity ? null : Math.max(0, 100 - minDepth);\n}\n\nfunction getRouteScore(\n config: ContextMenuConfig,\n registryKey: string,\n pathname?: string,\n): number {\n if (!pathname) return 0;\n if (\n config.path === pathname ||\n toArray(config.paths).includes(pathname) ||\n registryKey === pathname\n ) {\n return 100;\n }\n if (registryKey === CURRENT_PAGE_KEY) return 70;\n if (registryKey === GLOBAL_MENU_KEY) return 40;\n return 10;\n}\n\nfunction buildMenuContext(\n config: ContextMenuConfig,\n event: MouseEvent,\n pathname?: string,\n targetElement?: Element | null,\n): ContextMenuContextValue {\n let context: ContextMenuContextValue = {\n currentTarget: event.currentTarget ?? null,\n event,\n pathname: pathname || \"\",\n point: { x: Number(event.clientX) || 0, y: Number(event.clientY) || 0 },\n target: targetElement,\n };\n\n if (config.payload !== undefined) context.payload = config.payload;\n\n try {\n const payload = config.resolvePayload?.(event, context);\n if (payload !== undefined) context.payload = payload;\n } catch {}\n\n try {\n const extra = config.resolveContext?.(event, context);\n if (isObject(extra)) context = { ...context, ...extra };\n } catch {}\n\n return context;\n}\n\nfunction isMenuOverlayTarget(element: Element | null): boolean {\n return Boolean(\n element?.closest?.(\n '[data-context-menu-ignore], [data-context-menu-overlay], [role=\"menu\"]',\n ) || element?.classList?.contains(\"context-menu-overlay\"),\n );\n}\n\nfunction resolveEventTarget(event: MouseEvent): Element | null {\n const initialTarget = event.target instanceof Element ? event.target : null;\n\n if (initialTarget && !isMenuOverlayTarget(initialTarget)) {\n return initialTarget;\n }\n if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) {\n return initialTarget;\n }\n\n try {\n const underneath = document\n .elementsFromPoint(event.clientX, event.clientY)\n .find((element) => !isMenuOverlayTarget(element));\n return underneath || initialTarget;\n } catch {\n return initialTarget;\n }\n}\n\nfunction passesWhen(\n config: ContextMenuConfig,\n event: MouseEvent,\n info: {\n context: ContextMenuContextValue;\n pathname: string;\n target: Element | null;\n },\n): boolean {\n if (typeof config.when !== \"function\") return config.when !== false;\n try {\n return Boolean(config.when(event, info));\n } catch {\n return false;\n }\n}\n\nexport function resolveContextMenu(\n registryMenus: Record<string, unknown> | null | undefined,\n pathname: string | undefined,\n event: MouseEvent,\n): ContextMenuResolvedMatch | null {\n const targetElement = resolveEventTarget(event);\n let winner: ContextMenuResolvedMatch | null = null;\n\n for (const { config, order, registryKey } of normalizeMenuCandidates(\n registryMenus,\n )) {\n if (!isPathAllowed(config, registryKey, pathname)) continue;\n\n const context = buildMenuContext(config, event, pathname, targetElement);\n if (!resolveAsBoolean(config.enabled, context, true)) continue;\n if (\n !passesWhen(config, event, {\n context,\n pathname: pathname || \"\",\n target: targetElement,\n })\n ) {\n continue;\n }\n\n const items = resolveMenuItems(config, context);\n if (!items.length) continue;\n\n const targetScore = getTargetScore(config, targetElement);\n if (targetScore === null) continue;\n\n const priority = Number(config.priority);\n const score =\n (Number.isFinite(priority) ? priority : 0) * 10000 +\n getRouteScore(config, registryKey, pathname) * 100 +\n targetScore;\n\n if (!winner || score > winner.score) {\n winner = { config, context, items, order, score };\n }\n }\n return winner;\n}\n\nexport function prepareMenu(\n config: ContextMenuConfig,\n context: ContextMenuContextValue,\n event: unknown,\n): {\n context: ContextMenuContextValue;\n items: ContextMenuResolvedItem[];\n} | null {\n const onOpenResult = safeInvoke(config.onOpen, event, context);\n if (onOpenResult === false) return null;\n\n const nextContext = isObject(onOpenResult)\n ? { ...context, ...(onOpenResult as Record<string, unknown>) }\n : context;\n const items = resolveMenuItems(config, nextContext);\n return items.length ? { context: nextContext, items } : null;\n}\n","import { toFiniteNumber } from \"@/utils\";\nimport { INITIAL_POSITION } from \"./constants\";\nimport { type ContextMenuOpenInput, type ContextMenuState } from \"./types\";\n\nexport function createInitialMenuState(): ContextMenuState {\n return {\n position: INITIAL_POSITION,\n context: null,\n isOpen: false,\n config: null,\n items: [],\n };\n}\n\nexport function resolveNextOpenState({\n config,\n context,\n items,\n position,\n}: ContextMenuOpenInput): ContextMenuState | null {\n if (!config) return null;\n return {\n config,\n context: context ?? null,\n isOpen: true,\n items: items ?? [],\n position: {\n x: Math.round(toFiniteNumber(position?.x, 0)),\n y: Math.round(toFiniteNumber(position?.y, 0)),\n },\n };\n}\n","\"use client\";\n\nimport {\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport {\n getOrCreateGlobalContext,\n useModuleRegistration,\n type RegistryMetadata,\n} from \"@/kernel\";\n\nimport { createStore } from \"@/utils\";\nimport { prepareMenu } from \"./resolver\";\nimport { createInitialMenuState, resolveNextOpenState } from \"./state\";\nimport { emitContextMenuVisibility, safeInvoke } from \"./utils\";\nimport {\n type ContextMenuActions,\n type ContextMenuConfig,\n type ContextMenuContextApi,\n type ContextMenuContextValue,\n type ContextMenuPageConfig,\n type ContextMenuProviderValue,\n type ContextMenuState,\n type ContextMenuTrigger,\n} from \"./types\";\n\nexport const ContextMenuContext =\n\n getOrCreateGlobalContext<ContextMenuProviderValue | null>(\n \"ContextMenuContext\",\n null,\n );\n\nfunction selectIsOpen(state: ContextMenuState): boolean {\n return state.isOpen;\n}\n\nexport function ContextMenuProvider({ children }: { children?: ReactNode }) {\n const pathname = usePathname();\n const [store] = useState(() =>\n createStore<ContextMenuState>(createInitialMenuState(), {\n freezeSnapshots: false,\n }),\n );\n const isOpen = useStore(store, selectIsOpen);\n\n const pathnameRef = useRef(pathname);\n useInsertionEffect(() => {\n pathnameRef.current = pathname;\n }, [pathname]);\n\n const actions = useMemo<ContextMenuActions>(() => {\n const openMenu: ContextMenuActions[\"openMenu\"] = (input) => {\n const nextState = resolveNextOpenState(input);\n if (nextState) store.publish(nextState);\n };\n\n const closeMenu = () => {\n const current = store.getSnapshot();\n if (!current.isOpen) return;\n store.publish(createInitialMenuState());\n safeInvoke(current.config?.onClose, current.context);\n };\n\n const bind: ContextMenuActions[\"bind\"] = (payload, configOverride) => ({\n onContextMenu: (event: ContextMenuTrigger) => {\n const config = configOverride || store.getSnapshot().config;\n if (!config) return;\n\n event.preventDefault?.();\n event.stopPropagation?.();\n\n const point = {\n x: Number(event.clientX ?? 0),\n y: Number(event.clientY ?? 0),\n };\n const context: ContextMenuContextValue = {\n currentTarget: event.currentTarget ?? null,\n event,\n pathname: pathnameRef.current || \"\",\n payload,\n point,\n target: (event.target as Element) ?? null,\n };\n\n const prepared = prepareMenu(config, context, event);\n if (!prepared) return;\n\n openMenu({\n config,\n context: prepared.context,\n items: prepared.items,\n position: point,\n });\n },\n });\n\n return { bind, closeMenu, openMenu };\n }, [store]);\n\n const contextValue = useMemo<ContextMenuProviderValue>(\n () => ({ actions, store }),\n [actions, store],\n );\n\n useEffect(() => emitContextMenuVisibility(isOpen), [isOpen]);\n\n return (\n <ContextMenuContext value={contextValue}>{children}</ContextMenuContext>\n );\n}\n\nexport function useContextMenuRegistration(\n config: ContextMenuPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"contextMenu\", config, options);\n}\n\nexport function useContextMenu(\n config?: Partial<ContextMenuConfig> | null,\n options?: RegistryMetadata & { enabled?: boolean },\n): ContextMenuContextApi {\n useContextMenuRegistration(config || null, options);\n const { actions, store } = useRequiredContext(\n ContextMenuContext,\n \"useContextMenu\",\n \"ContextMenuProvider\",\n );\n const state = useStore(store);\n const ctx = useMemo<ContextMenuContextApi>(\n () => ({ ...state, ...actions }),\n [actions, state],\n );\n\n return useMemo(() => {\n if (!config) return ctx;\n return {\n ...ctx,\n bind: (payload?: unknown, configOverride?: Partial<ContextMenuConfig>) =>\n ctx.bind(payload, { ...config, ...configOverride }),\n };\n }, [config, ctx]);\n}\n\nexport function useContextMenuActions(): ContextMenuActions {\n return useRequiredContext(\n ContextMenuContext,\n \"useContextMenuActions\",\n \"ContextMenuProvider\",\n ).actions;\n}\n\nexport function useContextMenuState(): ContextMenuState {\n const { store } = useRequiredContext(\n ContextMenuContext,\n \"useContextMenuState\",\n \"ContextMenuProvider\",\n );\n return useStore(store);\n}\n","\"use client\";\n\nimport { Icon as IconifyIcon } from \"@iconify-icon/react\";\nimport type { ComponentProps, CSSProperties } from \"react\";\n\nexport interface IconProps\n extends Omit<ComponentProps<typeof IconifyIcon>, \"icon\" | \"size\"> {\n icon: string | ComponentProps<typeof IconifyIcon>[\"icon\"];\n size?: number | string;\n color?: string;\n className?: string;\n style?: CSSProperties;\n onClick?: () => void;\n}\n\nexport function Icon({\n className = \"center\",\n color,\n icon,\n onClick,\n size = 20,\n style,\n ...props\n}: IconProps) {\n return (\n <IconifyIcon\n className={className}\n height={size}\n icon={icon}\n onClick={onClick}\n style={{ color, ...style }}\n width={size}\n {...props}\n />\n );\n}\n\nIcon.displayName = \"Icon\";\n","export const DURATION_TOKENS = Object.freeze({\n INSTANT: 0.08,\n MICRO: 0.18,\n FAST: 0.28,\n BASE: 0.36,\n MODERATE: 0.44,\n SLOW: 0.58,\n CINEMATIC: 0.86,\n} as const);\n\nexport const EASING_CURVES = Object.freeze({\n OUT_EXPO: [0.16, 1, 0.3, 1] as const,\n OUT_QUART: [0.25, 1, 0.5, 1] as const,\n OUT_QUINT: [0.22, 1, 0.36, 1] as const,\n IN_OUT_CUBIC: [0.65, 0, 0.35, 1] as const,\n IN_CUBIC: [0.5, 0, 1, 1] as const,\n OUT_BACK: [0.34, 1.56, 0.64, 1] as const,\n} as const);\n\nexport const MOTION_EASINGS = Object.freeze({\n ENTER: EASING_CURVES.OUT_QUART,\n ENTER_EMPHASIZED: EASING_CURVES.OUT_EXPO,\n EXIT: EASING_CURVES.IN_CUBIC,\n} as const);\n\nexport const MOTION_TIERS = Object.freeze({\n MICRO: Object.freeze({\n distance: 4,\n duration: DURATION_TOKENS.MICRO,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.008,\n }),\n FAST: Object.freeze({\n distance: 9,\n duration: DURATION_TOKENS.FAST,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.012,\n }),\n STANDARD: Object.freeze({\n distance: 18,\n duration: DURATION_TOKENS.MODERATE,\n ease: MOTION_EASINGS.ENTER,\n scaleDelta: 0.018,\n }),\n SURFACE: Object.freeze({\n distance: 28,\n duration: DURATION_TOKENS.SLOW,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.024,\n }),\n} as const);\n\nexport const SPRING_PRESETS = Object.freeze({\n MICRO: Object.freeze({\n damping: 32,\n mass: 0.6,\n stiffness: 520,\n type: \"spring\",\n } as const),\n SNAPPY: Object.freeze({\n damping: 28,\n mass: 0.8,\n stiffness: 380,\n type: \"spring\",\n } as const),\n GENTLE: Object.freeze({\n damping: 30,\n mass: 1,\n stiffness: 260,\n type: \"spring\",\n } as const),\n BOUNCY: Object.freeze({\n damping: 20,\n mass: 0.85,\n stiffness: 340,\n type: \"spring\",\n } as const),\n} as const);\n\nexport const REDUCED_MOTION_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.INSTANT,\n ease: \"linear\",\n} as const);\n\nexport const COMPOSITOR_GPU_STYLE = Object.freeze({\n backfaceVisibility: \"hidden\",\n transform: \"translate3d(0, 0, 0)\",\n willChange: \"transform, opacity\",\n} as const);\n\nexport const TAP_SCALE_SUBTLE = 0.97;\n\ntype Ease = readonly [number, number, number, number];\n\ntype TweenOptions = {\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n};\n\ntype Spring = {\n type?: \"spring\";\n stiffness: number;\n damping: number;\n mass: number;\n};\n\nfunction tween(duration: number, ease: Ease) {\n return Object.freeze({ type: \"tween\" as const, duration, ease });\n}\n\nfunction safeNumber(value: unknown, fallback: number): number {\n const source =\n value &&\n typeof value === \"object\" &&\n \"get\" in value &&\n typeof value.get === \"function\"\n ? value.get()\n : value;\n const number = Number.parseFloat(String(source));\n return Number.isFinite(number) ? number : fallback;\n}\n\nexport function gpuTransform(\n y: unknown = 0,\n scale: unknown = 1,\n x: unknown = 0,\n): string {\n const translateY = Math.round(safeNumber(y, 0));\n const translateX = Math.round(safeNumber(x, 0));\n const scaleValue = Math.round(safeNumber(scale, 1) * 1000) / 1000;\n return `translate3d(${translateX}px, ${translateY}px, 0) scale(${scaleValue})`;\n}\n\nexport function durationForDistance(\n distancePx: number,\n {\n base = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n }: {\n base?: number;\n min?: number;\n max?: number;\n reference?: number;\n gain?: number;\n } = {},\n): number {\n const distance = Math.abs(Number(distancePx) || 0);\n const safeMin = Math.max(0, min);\n const safeMax = Math.max(safeMin, max);\n const safeReference = Math.max(1, reference);\n const duration = base + Math.sqrt(distance / safeReference) * gain;\n return Math.min(safeMax, Math.max(safeMin, duration));\n}\n\nexport function surfaceResizeTransition(\n distancePx: number,\n {\n base = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n ease = EASING_CURVES.IN_OUT_CUBIC,\n }: {\n base?: number;\n min?: number;\n max?: number;\n reference?: number;\n gain?: number;\n ease?: Ease;\n } = {},\n) {\n return tween(\n durationForDistance(distancePx, { base, min, max, reference, gain }),\n ease,\n );\n}\n\nexport function contentSwapTransitions({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: TweenOptions = {}) {\n return Object.freeze({\n enter: tween(duration, enterEase),\n exit: tween(exitDuration, exitEase),\n });\n}\n\nexport function contentSwap({\n travel = 6,\n exitTravel = travel * 0.7,\n enterScale = 0.99,\n exitScale = 0.99,\n ...transitionOptions\n}: TweenOptions & {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n} = {}) {\n const transitions = contentSwapTransitions(transitionOptions);\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function overlaySurface({\n travel = 16,\n exitTravel = travel * 0.5,\n enterScale = 0.97,\n exitScale = 0.985,\n distance,\n duration,\n exitDuration,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n distance?: number;\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n} = {}) {\n const enterDuration =\n duration ??\n (distance === undefined\n ? DURATION_TOKENS.BASE\n : durationForDistance(distance));\n const transitions = contentSwapTransitions({\n duration: enterDuration,\n exitDuration: exitDuration ?? enterDuration * 0.68,\n enterEase,\n exitEase,\n });\n\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function staggerDelay(\n index: number,\n { base = 0.028, cap = 0.16, exponent = 0.82 } = {},\n): number {\n const safeIndex = Math.max(0, Number(index) || 0);\n return Math.min(cap, base * Math.pow(safeIndex, exponent));\n}\n\nexport function staggerItem({\n base = 0.028,\n cap = 0.16,\n duration = DURATION_TOKENS.BASE,\n travel = 10,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitDuration = DURATION_TOKENS.MICRO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n base?: number;\n cap?: number;\n duration?: number;\n travel?: number;\n enterEase?: Ease;\n exitDuration?: number;\n exitEase?: Ease;\n} = {}) {\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, 0.985),\n }),\n visible: (index: number = 0) => ({\n opacity: 1,\n transform: gpuTransform(0),\n transition: Object.freeze({\n ...tween(duration, enterEase),\n delay: staggerDelay(index, { base, cap }),\n }),\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-travel * 0.6, 0.99),\n transition: tween(exitDuration, exitEase),\n }),\n });\n}\n\nexport function chip({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.IN_OUT_CUBIC,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: TweenOptions = {}) {\n const transitions = contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n });\n return Object.freeze({\n hidden: Object.freeze({ opacity: 0, transform: gpuTransform(0, 0.96) }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(0, 0.96),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function press({\n tapScale = TAP_SCALE_SUBTLE,\n spring = SPRING_PRESETS.MICRO,\n}: { tapScale?: number; spring?: Spring } = {}) {\n return Object.freeze({\n variants: Object.freeze({\n idle: Object.freeze({ transform: gpuTransform(0, 1) }),\n hover: Object.freeze({ transform: gpuTransform(0, 1) }),\n tap: Object.freeze({ transform: gpuTransform(0, tapScale) }),\n }),\n transition: Object.freeze({ type: \"spring\" as const, ...spring }),\n });\n}\n\nexport function dragDismiss({\n constraints = { top: 0, bottom: 0 },\n elastic = { top: 0.05, bottom: 0.5 },\n thresholds = { offsetY: 65, velocityY: 400 },\n interpolation = {\n range: [0, 180] as const,\n opacity: [1, 0.75] as const,\n scale: [1, 0.96] as const,\n },\n} = {}) {\n return Object.freeze({\n constraints: Object.freeze(constraints),\n elastic: Object.freeze(elastic),\n thresholds: Object.freeze(thresholds),\n interpolation: Object.freeze(interpolation),\n });\n}\n","\"use client\";\n\nimport { useContext, type ComponentType } from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore, shallowEqual } from \"@/utils\";\nimport {\n useOptionalMediaActions,\n useOptionalMediaState,\n type MediaActions,\n type MediaState,\n} from \"../media\";\nimport {\n useOptionalLoadingActions,\n useOptionalLoadingState,\n type LoadingActions,\n type LoadingStateWithPage,\n} from \"../loading\";\nimport { useNotificationVisible } from \"../notification\";\nimport {\n type DockActions,\n type DockContextValue,\n type DockState,\n type ErrorActionsProps,\n type GuardActionsProps,\n} from \"./types\";\n\nexport const DockContext = getOrCreateGlobalContext<DockContextValue | null>(\n \"DockContext\",\n null,\n);\n\nexport function useDockState(): DockState {\n const { store } = useRequiredContext(\n DockContext,\n \"useDockState\",\n \"DockProvider\",\n );\n return useStore(store);\n}\n\nexport function useDockSelector<T>(\n selector: (state: DockState) => T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const { store } = useRequiredContext(\n DockContext,\n \"useDockSelector\",\n \"DockProvider\",\n );\n return useStore(store, selector, isEqual);\n}\n\nexport function useDockActions(): DockActions {\n return useRequiredContext(DockContext, \"useDockActions\", \"DockProvider\")\n .actions;\n}\n\nexport function useDockHeight() {\n const dockHeight = useDockSelector((state) => state.dockHeight);\n return { dockHeight, padding: { paddingBottom: `${dockHeight}px` } };\n}\n\nexport const EMPTY_DOCK_STATE: DockState = Object.freeze({\n activeItem: null,\n activeOperation: null,\n activeSurfaceEntry: null,\n activeSurfaceId: null,\n contextActions: [],\n dockContinuity: [],\n dockHeight: 0,\n dockReturnHandoffs: [],\n expanded: false,\n hud: null,\n hudEntries: [],\n isHudActive: false,\n isSurfaceOpen: false,\n locationKey: \"\",\n operations: [],\n pathname: \"\",\n searchQuery: \"\",\n selectionMode: null,\n surfaceLifecycle: \"\",\n surfacePhase: \"\",\n surfaceStack: [],\n});\n\nconst NOOP_DOCK_STORE = createStore<DockState>(EMPTY_DOCK_STATE);\n\nexport function useOptionalDockState(): DockState;\nexport function useOptionalDockState<T>(\n selector: (state: DockState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalDockState<T = DockState>(\n selector?: (state: DockState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(DockContext);\n return useStore(\n ctx?.store ?? NOOP_DOCK_STORE,\n selector as (state: DockState) => T,\n isEqual,\n );\n}\n\nexport function useOptionalDockActions(): DockActions | null {\n const ctx = useContext(DockContext);\n return ctx?.actions ?? null;\n}\n\nexport type DockMediaView = MediaState;\n\nexport function useDockMedia(): DockMediaView {\n return useOptionalMediaState((state) => state, shallowEqual);\n}\n\nexport function useDockHasMedia(): boolean {\n return useOptionalMediaState((state) => state.hasMedia);\n}\n\nexport const useDockMediaActions: () => MediaActions = useOptionalMediaActions;\n\nexport function useDockLoadingState(): LoadingStateWithPage {\n return useOptionalLoadingState();\n}\n\nexport const useDockLoadingActions: () => LoadingActions = useOptionalLoadingActions;\n\nexport const useDockNotificationVisible: () => boolean = useNotificationVisible;\n\nexport const statusActionDefaults: {\n error: ComponentType<ErrorActionsProps> | null;\n guard: ComponentType<GuardActionsProps> | null;\n} = { error: null, guard: null };\n\n","\"use client\";\n\nimport {\n use,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n useInsertionEffect,\n useState,\n type RefObject,\n type CSSProperties,\n} from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { useStore, useIsomorphicLayoutEffect } from \"@/hooks\";\nimport { useModuleRegistration, type RegistryMetadata } from \"@/kernel\";\nimport { createStore, shallowEqual, cn } from \"@/utils\";\nimport { useModuleTheme } from \"@/theme\";\nimport { Z_INDEX } from \"@/tokens\";\nimport {\n DockContext,\n EMPTY_DOCK_STATE,\n useDockActions,\n useDockHeight,\n useDockSelector,\n useDockState,\n useOptionalDockActions,\n useOptionalDockState,\n} from \"./context\";\nimport {\n isSamePath,\n blurActiveElement,\n focusDockElement,\n getDockFocusableElements,\n isEditableDockTarget,\n isInteractiveTarget,\n shouldRestoreDockFocus,\n isInlineActionPathMatch,\n getImageIconStyle,\n getItemKey,\n getItemMeasurementKey,\n getLineClampStyle,\n getRouteMeasurementKey,\n resolveDockActionClass,\n splitStyle,\n toObject,\n} from \"./utils\";\nimport {\n type DockBannerInput,\n type DockPageConfig,\n type DockState,\n type DockReturnHandoff,\n type DockActions,\n type DockItem,\n type ContainerHeightOptions,\n type DockItemCardPropsOptions,\n type DockStyleSectionName,\n type DockVisualStyle,\n type DockVisualStyleInput,\n type DockVisualStyleSection,\n type DockVisualStyleSections,\n type UseDockHeightControllerOptions,\n} from \"./types\";\nimport {\n DOCK_STYLE_SECTIONS,\n HEIGHT_EPSILON,\n DOCK_CARD_LAYOUT,\n DOCK_HEIGHT_BUFFER,\n DOCK_SURFACE_PHASE,\n VIEWPORT_MARGIN,\n dockTheme,\n} from \"./constants\";\n\nexport {\n DockContext,\n useDockActions,\n useDockHeight,\n useDockSelector,\n useDockState,\n useOptionalDockActions,\n useOptionalDockState,\n};\n\nexport function useDockTheme() {\n return useModuleTheme(dockTheme);\n}\n\nexport function useDockActionClass() {\n const { slots } = useDockTheme();\n return useCallback(\n (options?: Parameters<typeof resolveDockActionClass>[1]) =>\n resolveDockActionClass(slots, options),\n [slots],\n );\n}\n\nexport function useDockRegistration(\n config: DockPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean; [key: string]: unknown },\n): void {\n useModuleRegistration(\"dock\", config, options);\n}\n\nexport function useDockBanner(\n banner: DockBannerInput | null | undefined,\n options?: {\n path?: string;\n position?: string;\n size?: string;\n opacity?: number;\n repeat?: string;\n [key: string]: unknown;\n },\n): void {\n const position = options?.position;\n const size = options?.size;\n const opacity = options?.opacity;\n const repeat = options?.repeat;\n const targetPath = options?.path;\n\n const config = useMemo(() => {\n if (!banner) return null;\n if (typeof banner === \"string\") {\n return {\n bannerUrl: banner,\n ...(position ? { bannerPosition: position } : {}),\n ...(size ? { bannerSize: size } : {}),\n ...(opacity !== undefined ? { bannerOpacity: opacity } : {}),\n ...(repeat ? { bannerRepeat: repeat } : {}),\n ...(targetPath ? { path: targetPath } : {}),\n };\n }\n if (typeof banner === \"object\") {\n return {\n bannerUrl: banner.url || banner.bannerUrl,\n bannerPosition: banner.position || banner.bannerPosition || position,\n bannerSize: banner.size || banner.bannerSize || size,\n bannerOpacity: banner.opacity ?? banner.bannerOpacity ?? opacity,\n bannerRepeat: banner.repeat || banner.bannerRepeat || repeat,\n ...(targetPath ? { path: targetPath } : {}),\n };\n }\n return null;\n }, [banner, position, size, opacity, repeat, targetPath]);\n\n useDockRegistration(config, options);\n}\n\nconst EMPTY_DOCK_STATE_STORE = createStore<DockState>(EMPTY_DOCK_STATE);\n\nfunction selectDockConfigState(state: DockState) {\n return {\n activeItem: state.activeItem,\n dockHeight: state.dockHeight,\n expanded: state.expanded,\n pathname: state.pathname,\n };\n}\n\nexport function useDockConfig(\n configOrTitle?: string | Record<string, unknown> | null,\n options?: Record<string, unknown>,\n) {\n const normalizedConfig = useMemo(() => {\n if (!configOrTitle) return null;\n if (typeof configOrTitle === \"string\") return { title: configOrTitle };\n return configOrTitle;\n }, [configOrTitle]);\n\n useDockRegistration(normalizedConfig, options);\n\n const dockContext = use(DockContext);\n const actions = dockContext?.actions;\n const state = useStore(\n dockContext?.store ?? EMPTY_DOCK_STATE_STORE,\n selectDockConfigState,\n shallowEqual,\n );\n\n return useMemo(\n () => ({\n activeItem: state.activeItem,\n clearHud: actions?.clearHud ?? (() => {}),\n closeAllSurfaces: actions?.closeAllSurfaces ?? (() => {}),\n closeSurface: actions?.closeSurface ?? (() => {}),\n expanded: state.expanded,\n dockHeight: state.dockHeight,\n navigate: actions?.navigate ?? (async () => false),\n openSurface: actions?.openSurface ?? (() => undefined),\n pathname: state.pathname,\n setExpanded: actions?.setExpanded ?? (() => {}),\n setHud: actions?.setHud ?? (() => {}),\n setSearchQuery: actions?.setSearchQuery ?? (() => {}),\n }),\n [actions, state],\n );\n}\n\nexport function useDockDimensions() {\n const { dockHeight } = useDockHeight();\n const activeItem = useDockSelector((state) => state.activeItem);\n return {\n height: dockHeight,\n width: activeItem?.width ?? null,\n isSurface: Boolean(activeItem?.isSurface),\n };\n}\n\nexport function useSurfaceReturn() {\n const pathname = usePathname();\n const { continuity } = useDockActions();\n const dockReturnHandoffs: DockReturnHandoff[] = useDockSelector(\n (state) => state.dockReturnHandoffs,\n );\n\n const entries = useMemo(\n () =>\n (dockReturnHandoffs || []).filter((handoff) =>\n isSamePath(handoff.path, pathname),\n ),\n [dockReturnHandoffs, pathname],\n );\n const consume = useCallback(\n (handoffId: string | null = null) =>\n continuity.consumeReturn(pathname, handoffId),\n [continuity, pathname],\n );\n\n return useMemo(\n () => ({ consume, entries, peek: () => entries[0] || null }),\n [consume, entries],\n );\n}\n\nexport { blurActiveElement, focusDockElement, shouldRestoreDockFocus };\n\nexport function useDockFocusTrap({\n containerRef,\n enabled = true,\n onDismiss = null,\n}: {\n containerRef: RefObject<HTMLElement | null>;\n enabled?: boolean;\n onDismiss?: (() => void) | null;\n}) {\n const hasAutoFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!enabled) {\n hasAutoFocusedRef.current = false;\n return;\n }\n\n const container = containerRef?.current;\n if (!container) return;\n\n const focusFrameId = window.requestAnimationFrame(() => {\n if (hasAutoFocusedRef.current) return;\n hasAutoFocusedRef.current = true;\n\n const preferredTarget = container.querySelector(\"[data-dock-autofocus]\");\n const target =\n preferredTarget instanceof HTMLElement\n ? preferredTarget\n : getDockFocusableElements(container)[0] || container;\n focusDockElement(target);\n });\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === \"Escape\" &&\n !event.defaultPrevented &&\n typeof onDismiss === \"function\"\n ) {\n event.preventDefault();\n event.stopPropagation();\n onDismiss();\n return;\n }\n\n if (event.key !== \"Tab\") return;\n\n const focusableElements = getDockFocusableElements(container);\n if (focusableElements.length === 0) {\n event.preventDefault();\n focusDockElement(container);\n return;\n }\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n const activeElement = document.activeElement;\n\n if (event.shiftKey && activeElement === firstElement) {\n event.preventDefault();\n focusDockElement(lastElement);\n } else if (!event.shiftKey && activeElement === lastElement) {\n event.preventDefault();\n focusDockElement(firstElement);\n }\n };\n\n const handleFocusIn = (event: FocusEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || container.contains(target)) return;\n\n if (\n target instanceof Element &&\n target.closest('[role=\"dialog\"][aria-modal=\"true\"]')\n ) {\n return;\n }\n\n const firstElement = getDockFocusableElements(container)[0] || container;\n focusDockElement(firstElement);\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"focusin\", handleFocusIn);\n return () => {\n window.cancelAnimationFrame(focusFrameId);\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"focusin\", handleFocusIn);\n };\n }, [containerRef, enabled, onDismiss]);\n}\n\nexport function useDockKeyboard({\n expanded,\n focusedIndex,\n isOverlayActive,\n navigate,\n dockItems,\n setExpanded,\n setFocusedIndex,\n}: {\n expanded: boolean;\n focusedIndex: number;\n isOverlayActive: boolean;\n navigate: DockActions[\"navigate\"];\n dockItems: DockItem[];\n setExpanded: (expanded: boolean) => void;\n setFocusedIndex: (update: number | ((current: number) => number)) => void;\n}) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (\n isEditableDockTarget(event.target) ||\n isInteractiveTarget(event.target)\n )\n return;\n if (isOverlayActive || !expanded) return;\n\n const { key } = event;\n if (key === \"Escape\") {\n event.preventDefault();\n setExpanded(false);\n return;\n }\n if (key === \"Enter\" && focusedIndex !== -1) {\n event.preventDefault();\n const focusedItem = dockItems[focusedIndex];\n if (focusedItem?.path)\n navigate(focusedItem.path, { item: focusedItem });\n return;\n }\n\n if (dockItems.length === 0) return;\n\n if (key === \"ArrowDown\") {\n event.preventDefault();\n setFocusedIndex((current) =>\n current < dockItems.length - 1 ? current + 1 : 0,\n );\n return;\n }\n if (key === \"ArrowUp\") {\n event.preventDefault();\n setFocusedIndex((current) =>\n current > 0 ? current - 1 : dockItems.length - 1,\n );\n }\n },\n [\n expanded,\n focusedIndex,\n isOverlayActive,\n navigate,\n dockItems,\n setExpanded,\n setFocusedIndex,\n ],\n );\n\n useEffect(() => {\n if (!expanded) return;\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [expanded, handleKeyDown]);\n}\n\nexport function useDockRouteReset(\n pathname: string | null,\n onRouteChange?: (path: string | null) => void,\n) {\n const previousPathRef = useRef(pathname);\n\n useEffect(() => {\n if (previousPathRef.current === pathname) return;\n previousPathRef.current = pathname;\n onRouteChange?.(pathname);\n }, [onRouteChange, pathname]);\n}\n\nexport {\n getImageIconStyle,\n getItemKey,\n getItemMeasurementKey,\n getLineClampStyle,\n getRouteMeasurementKey,\n splitStyle,\n};\n\nexport function getDockItemCardProps({\n cardScale,\n cardStyle,\n expanded,\n hasExtensions = false,\n isAnchoredToBottom,\n position,\n theme,\n visibleCount = 3,\n}: DockItemCardPropsOptions) {\n const { offsetY: collapsedOffsetY, scale: collapsedScale } =\n DOCK_CARD_LAYOUT.collapsed;\n const { offsetY: expandedOffsetY } = DOCK_CARD_LAYOUT.expanded;\n\n const safeCardStyle = { ...cardStyle };\n delete safeCardStyle.scale;\n delete safeCardStyle.className;\n\n const isTop = position === 0;\n const isShelf = !expanded && position === 1 && hasExtensions;\n const isHeavyBlur = position < visibleCount || expanded || isShelf;\n const collapsedScaleValue = collapsedScale ** position;\n\n const y = expanded\n ? position * expandedOffsetY\n : isShelf\n ? DOCK_CARD_LAYOUT.extensionShelfY\n : position * collapsedOffsetY;\n const shelfScale = DOCK_CARD_LAYOUT.extensionShelfScale ?? 0.94;\n const scale = expanded\n ? cardScale || 1\n : isShelf\n ? shelfScale\n : collapsedScaleValue;\n\n const collapsedOpacity = Math.max(0.1, +(1 - position * 0.2).toFixed(2));\n const opacity =\n expanded || isShelf ? 1 : position < visibleCount ? collapsedOpacity : 0;\n\n return {\n className: cn(theme.slots.card, cardStyle?.className),\n data: {\n \"data-anchored\": isAnchoredToBottom,\n \"data-blur\": isHeavyBlur ? \"heavy\" : \"light\",\n \"data-placement\": isTop ? \"top\" : isAnchoredToBottom ? \"bottom\" : \"float\",\n \"data-shelf\": isShelf,\n },\n style: {\n ...theme.styles.card,\n ...safeCardStyle,\n willChange: \"transform, opacity\",\n transformOrigin: isAnchoredToBottom ? \"bottom center\" : \"top center\",\n zIndex: Z_INDEX.DOCK_CARD_STACK_BASE - position,\n WebkitPerspective: 1000,\n perspective: 1000,\n WebkitBackfaceVisibility: \"hidden\" as const,\n backfaceVisibility: \"hidden\" as const,\n WebkitFontSmoothing: \"antialiased\",\n transform: \"translateZ(0)\",\n ...(isTop ? { height: \"100%\" } : {}),\n pointerEvents: (expanded || position < visibleCount\n ? undefined\n : \"none\") as CSSProperties[\"pointerEvents\"],\n },\n motionValues: { y, scale, opacity },\n };\n}\n\nfunction getViewportMaxHeight(): number {\n if (typeof window === \"undefined\") return Infinity;\n return window.innerHeight - VIEWPORT_MARGIN;\n}\n\nfunction getContainerHeight({\n cardContentHeight,\n isHud = false,\n}: ContainerHeightOptions): number {\n const chromeHeight = DOCK_CARD_LAYOUT.chromeHeight;\n const minCardHeight = isHud\n ? DOCK_CARD_LAYOUT.hudHeight\n : DOCK_CARD_LAYOUT.baseHeight;\n const numericContentHeight = Number(cardContentHeight);\n\n const nextCardHeight = Math.max(\n minCardHeight,\n (Number.isFinite(numericContentHeight) ? numericContentHeight : 0) +\n chromeHeight,\n );\n return Math.min(nextCardHeight, getViewportMaxHeight());\n}\n\nfunction getDockCardWidth({\n width,\n}: {\n width?: number | string | null;\n} = {}): number {\n if (typeof window === \"undefined\") return width ? Number(width) || 460 : 460;\n\n const windowWidth = window.innerWidth;\n const isDesktop = windowWidth >= 640;\n const targetWidth = Number(width);\n\n if (Number.isFinite(targetWidth) && targetWidth > 0) {\n return Math.min(\n targetWidth,\n Math.max(windowWidth - (isDesktop ? 32 : 16), 0),\n );\n }\n\n return Math.min(460, Math.max(windowWidth - 16, 0));\n}\n\nfunction getObservedHeight(\n entry: ResizeObserverEntry | undefined,\n element: HTMLElement | null,\n): number {\n const rawBorderBoxSize = entry?.borderBoxSize as\n ReadonlyArray<ResizeObserverSize> | ResizeObserverSize | undefined;\n const borderBoxSize = Array.isArray(rawBorderBoxSize)\n ? rawBorderBoxSize[0]\n : (rawBorderBoxSize as ResizeObserverSize | undefined);\n if (borderBoxSize?.blockSize != null)\n return Math.round(borderBoxSize.blockSize);\n if (entry?.contentRect?.height != null)\n return Math.round(entry.contentRect.height);\n return Math.round(element?.offsetHeight || 0);\n}\n\nfunction hasMeaningfulHeightChange(\n previousHeight: number,\n nextHeight: number,\n): boolean {\n return (\n Math.abs(Math.round(nextHeight) - Math.round(previousHeight)) >\n HEIGHT_EPSILON\n );\n}\n\nexport function useElementHeight(\n onHeightChange?: ((height: number) => void) | null,\n elementRef?: RefObject<HTMLElement | null>,\n shouldMeasure?: boolean,\n dependencyKey: unknown = null,\n) {\n const lastHeightRef = useRef<number>(0);\n const rafRef = useRef<number | null>(null);\n const callbackRef = useRef(onHeightChange);\n\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = onHeightChange;\n }, [onHeightChange]);\n\n useIsomorphicLayoutEffect(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastHeightRef.current = -1;\n\n if (!callbackRef.current) return;\n if (!shouldMeasure) {\n if (hasMeaningfulHeightChange(lastHeightRef.current, 0)) {\n lastHeightRef.current = 0;\n callbackRef.current(0);\n }\n return;\n }\n\n const element = elementRef?.current;\n if (!element) return;\n\n function publishHeight(nextHeight: number) {\n if (!hasMeaningfulHeightChange(lastHeightRef.current, nextHeight)) return;\n lastHeightRef.current = nextHeight;\n callbackRef.current?.(nextHeight);\n }\n\n let pendingHeight: number | null = null;\n function flushPendingHeight() {\n rafRef.current = null;\n if (pendingHeight == null) return;\n const heightToPublish = pendingHeight;\n pendingHeight = null;\n publishHeight(heightToPublish);\n }\n\n function scheduleMeasurement(nextHeight: number) {\n pendingHeight = nextHeight;\n if (rafRef.current !== null) return;\n rafRef.current = requestAnimationFrame(flushPendingHeight);\n }\n\n publishHeight(element.offsetHeight || 0);\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n scheduleMeasurement(getObservedHeight(entry, element));\n }\n });\n observer.observe(element);\n\n const handlePageShow = () => scheduleMeasurement(element.offsetHeight || 0);\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"visible\") handlePageShow();\n };\n\n window.addEventListener(\"pageshow\", handlePageShow);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n return () => {\n observer.disconnect();\n window.removeEventListener(\"pageshow\", handlePageShow);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n };\n }, [dependencyKey, elementRef, shouldMeasure]);\n}\n\nfunction publishDockHeightCssVar(heightPx: number) {\n if (typeof document === \"undefined\") return;\n document.documentElement.style.setProperty(\n \"--dock-h\",\n `${Math.round(heightPx)}px`,\n );\n}\n\nexport function useDockHeightController({\n contentKey = null,\n isHud = false,\n setDockHeight,\n surfacePhase = DOCK_SURFACE_PHASE.IDLE,\n}: UseDockHeightControllerOptions) {\n const [containerHeight, setContainerHeight] = useState<number>(\n isHud ? DOCK_CARD_LAYOUT.hudHeight : DOCK_CARD_LAYOUT.baseHeight,\n );\n\n const heightRef = useRef<{ content: number }>({ content: 0 });\n const rafRef = useRef<number | null>(null);\n const isHudRef = useRef(isHud);\n const surfacePhaseRef = useRef(surfacePhase);\n\n const lastAppliedContainerHeightRef = useRef<number>(\n isHud ? DOCK_CARD_LAYOUT.hudHeight : DOCK_CARD_LAYOUT.baseHeight,\n );\n const lastAppliedSpacerHeightRef = useRef<number>(\n (isHud ? DOCK_CARD_LAYOUT.hudHeight : DOCK_CARD_LAYOUT.baseHeight) +\n DOCK_HEIGHT_BUFFER,\n );\n\n useInsertionEffect(() => {\n isHudRef.current = isHud;\n surfacePhaseRef.current = surfacePhase;\n }, [isHud, surfacePhase]);\n\n const applyHeight = useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n const { content } = heightRef.current;\n const currentPhase = surfacePhaseRef.current;\n const isLockedToBaseHeight =\n currentPhase === DOCK_SURFACE_PHASE.DISMISSING_ACTION ||\n currentPhase === DOCK_SURFACE_PHASE.COLLAPSING_BODY ||\n currentPhase === DOCK_SURFACE_PHASE.RESTORING_HEADER;\n\n const computedContentHeight = isLockedToBaseHeight ? 0 : content;\n const height = getContainerHeight({\n cardContentHeight: computedContentHeight,\n isHud: isHudRef.current,\n });\n\n const totalSpacerHeight = height + DOCK_HEIGHT_BUFFER;\n\n if (Math.abs(height - lastAppliedContainerHeightRef.current) > 0.5) {\n lastAppliedContainerHeightRef.current = height;\n setContainerHeight(height);\n }\n if (\n Math.abs(totalSpacerHeight - lastAppliedSpacerHeightRef.current) > 0.5\n ) {\n lastAppliedSpacerHeightRef.current = totalSpacerHeight;\n publishDockHeightCssVar(totalSpacerHeight);\n setDockHeight(totalSpacerHeight);\n }\n }, [setDockHeight]);\n\n const handleContentHeightChange = useCallback(\n (height: number | string) => {\n const numericHeight = Number(height);\n heightRef.current.content = Number.isFinite(numericHeight)\n ? Math.max(0, numericHeight)\n : 0;\n applyHeight();\n },\n [applyHeight],\n );\n\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n };\n }, []);\n\n useIsomorphicLayoutEffect(() => applyHeight(), [applyHeight, contentKey]);\n useIsomorphicLayoutEffect(() => applyHeight(), [applyHeight, surfacePhase]);\n\n useIsomorphicLayoutEffect(() => applyHeight(), [applyHeight, isHud]);\n\n return { containerHeight, handleContentHeightChange };\n}\n\nfunction isSurfaceShapePhase(phase: string | undefined): boolean {\n return (\n phase === DOCK_SURFACE_PHASE.EXPANDING_BODY ||\n phase === DOCK_SURFACE_PHASE.OPEN ||\n phase === DOCK_SURFACE_PHASE.CLOSING_ANTICIPATION\n );\n}\n\nfunction getTargetItemWidth(activeItem: DockItem | null) {\n if (!activeItem?.isSurface || isSurfaceShapePhase(activeItem.surfacePhase))\n return activeItem?.width;\n return activeItem.restingWidth;\n}\n\nexport function useDockViewport(activeItem: DockItem | null = null) {\n const targetWidth = getTargetItemWidth(activeItem);\n const [, setViewportRevision] = useState(0);\n const [portalTarget, setPortalTarget] = useState<HTMLElement | null>(null);\n\n const stackWidth = getDockCardWidth({ width: targetWidth });\n\n useIsomorphicLayoutEffect(() => {\n if (typeof document !== \"undefined\") setPortalTarget(document.body);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return undefined;\n let resizeFrameId: number | null = null;\n\n const handleResize = () => {\n if (resizeFrameId !== null) return;\n resizeFrameId = window.requestAnimationFrame(() => {\n resizeFrameId = null;\n setViewportRevision((revision) => revision + 1);\n });\n };\n\n window.addEventListener(\"resize\", handleResize, { passive: true });\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n if (resizeFrameId !== null) window.cancelAnimationFrame(resizeFrameId);\n };\n }, []);\n\n return { portalTarget, stackWidth };\n}\n\nfunction pickCardSurfaceStyle(\n style?: DockVisualStyleInput | null,\n): Pick<CSSProperties, \"background\" | \"borderColor\"> {\n const cardSurfaceStyle: Pick<CSSProperties, \"background\" | \"borderColor\"> =\n {};\n if (style?.background != null) cardSurfaceStyle.background = style.background;\n if (style?.borderColor != null)\n cardSurfaceStyle.borderColor = style.borderColor;\n return cardSurfaceStyle;\n}\n\nfunction toStyleSections(value: unknown): DockVisualStyleSections {\n return toObject(value) as DockVisualStyleSections;\n}\n\nfunction mergeStyleSection(\n baseStyle: DockVisualStyleSections,\n stateStyle: DockVisualStyleSections,\n hoverStyle: DockVisualStyleSections,\n section: DockStyleSectionName,\n): DockVisualStyleSection {\n return {\n ...toObject(baseStyle?.[section]),\n ...toObject(stateStyle?.[section]),\n ...toObject(hoverStyle?.[section]),\n } as DockVisualStyleSection;\n}\n\nexport function resolveDockVisualStyle(\n style?: DockVisualStyleInput | null,\n {\n isActive = false,\n isHovered = false,\n }: { isActive?: boolean; isHovered?: boolean } = {},\n): DockVisualStyle {\n const baseStyle = toObject(style) as DockVisualStyleInput;\n const stateStyle = isActive\n ? toStyleSections(baseStyle.active)\n : toStyleSections(baseStyle.inactive);\n const hoverStyle = isHovered ? toStyleSections(baseStyle.hover) : {};\n\n const sections: DockVisualStyle = {\n card: {},\n icon: {},\n title: {},\n description: {},\n };\n\n for (const section of DOCK_STYLE_SECTIONS) {\n sections[section] = mergeStyleSection(\n baseStyle,\n stateStyle,\n hoverStyle,\n section,\n );\n }\n\n sections.card = { ...pickCardSurfaceStyle(baseStyle), ...sections.card };\n\n return {\n ...sections,\n scale:\n hoverStyle?.card?.scale ?? stateStyle?.card?.scale ?? baseStyle?.scale,\n };\n}\n\nexport function shouldRenderInlineAction(\n {\n action,\n isLoading,\n isOverlay,\n path,\n }: {\n action?: unknown;\n isLoading?: boolean;\n isOverlay?: boolean;\n path?: string | null;\n },\n pathname: string,\n): boolean {\n return (\n Boolean(action) &&\n !isLoading &&\n (isOverlay || !path || isInlineActionPathMatch(path, pathname))\n );\n}\n\nexport function getIsItemActive(\n link: DockItem | null,\n activeItem: DockItem | null,\n): boolean {\n if (!link || !activeItem) return false;\n if (link.path && activeItem.path && isSamePath(link.path, activeItem.path))\n return true;\n if (\n link.targetPath &&\n activeItem.targetPath &&\n isSamePath(link.targetPath, activeItem.targetPath)\n )\n return true;\n return Boolean(link.name && activeItem.name && link.name === activeItem.name);\n}\n","\"use client\";\n\nimport {\n useEffect,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type RefObject,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n} from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { useRegistryEntries } from \"@/kernel\";\nimport { useModuleTheme } from \"@/theme\";\nimport { useOptionalDockState, type DockItem, type DockState } from \"../dock\";\nimport { contextMenuTheme } from \"./constants\";\nimport { useContextMenuActions, useContextMenu } from \"./context\";\nimport { prepareMenu, resolveContextMenu } from \"./resolver\";\nimport {\n isScrollLockKey,\n resolveContextMenuPageMeta,\n getNextActiveIndex,\n joinClassNames,\n positionMenu,\n resolveMenuHeader,\n safeInvoke,\n} from \"./utils\";\nimport {\n type ContextMenuConfig,\n type ContextMenuClassNames,\n type ContextMenuThemeSlot,\n type ContextMenuContextValue,\n type ContextMenuPosition,\n type ContextMenuResolvedItem,\n} from \"./types\";\n\nfunction selectDockPageCard(dock: DockState): DockItem | null {\n const card = dock.activeItem;\n return card && !card.isSurface ? card : null;\n}\n\nexport function useContextMenuListener(): void {\n const menus = useRegistryEntries<\"contextMenu\", ContextMenuConfig>(\n \"contextMenu\",\n );\n const dockCard = useOptionalDockState(selectDockPageCard);\n const { openMenu } = useContextMenuActions();\n const pathname = usePathname();\n\n useEffect(() => {\n const handleContextMenu = (event: MouseEvent) => {\n const match = resolveContextMenu(menus, pathname || undefined, event);\n if (!match) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const page = resolveContextMenuPageMeta(dockCard, pathname || \"\");\n const prepared = prepareMenu(\n match.config,\n page ? { ...match.context, page } : match.context,\n event,\n );\n if (!prepared) return;\n\n openMenu({\n config: match.config,\n context: prepared.context,\n items: prepared.items,\n position: { x: event.clientX, y: event.clientY },\n });\n };\n\n document.addEventListener(\"contextmenu\", handleContextMenu, true);\n return () =>\n document.removeEventListener(\"contextmenu\", handleContextMenu, true);\n }, [dockCard, menus, openMenu, pathname]);\n}\n\nexport function useMenuDismissal(\n menuRef: RefObject<HTMLElement | null>,\n onClose: () => void,\n) {\n useEffect(() => {\n const preventScroll = (event: Event) => event.preventDefault();\n const listenerOptions = { capture: true, passive: false };\n\n const handleInteraction = (event: MouseEvent | KeyboardEvent) => {\n const isInside = menuRef.current?.contains(event.target as Node);\n if (event.type === \"keydown\") {\n if ((event as KeyboardEvent).key === \"Escape\") onClose();\n if (!isInside && isScrollLockKey(event as KeyboardEvent)) {\n event.preventDefault();\n }\n } else if (!isInside) {\n onClose();\n }\n };\n\n document.addEventListener(\"mousedown\", handleInteraction, true);\n document.addEventListener(\"keydown\", handleInteraction, true);\n window.addEventListener(\"wheel\", preventScroll, listenerOptions);\n window.addEventListener(\"touchmove\", preventScroll, listenerOptions);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleInteraction, true);\n document.removeEventListener(\"keydown\", handleInteraction, true);\n window.removeEventListener(\"wheel\", preventScroll, true);\n window.removeEventListener(\"touchmove\", preventScroll, true);\n };\n }, [menuRef, onClose]);\n}\n\nconst emptySubscribe = () => () => {};\n\nexport function useContextMenuContentModel({\n config,\n items,\n menuContext,\n onClose,\n position,\n}: {\n config: ContextMenuConfig;\n items: ContextMenuResolvedItem[];\n menuContext: ContextMenuContextValue;\n onClose: () => void;\n position: ContextMenuPosition;\n}) {\n const menuRef = useRef<HTMLDivElement | null>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const theme = useModuleTheme(contextMenuTheme);\n const classes = useMemo(() => {\n const overrides: ContextMenuClassNames = config.classNames ?? {};\n const merged = { ...theme.slots } as Record<ContextMenuThemeSlot, string>;\n for (const slot of Object.keys(merged) as ContextMenuThemeSlot[]) {\n merged[slot] = joinClassNames(theme.slots[slot], overrides[slot]);\n }\n return merged;\n }, [config.classNames, theme.slots]);\n const header = useMemo(\n () => resolveMenuHeader(config, menuContext),\n [config, menuContext],\n );\n const [activeIndex, setActiveIndex] = useState(-1);\n const [prevItems, setPrevItems] = useState(items);\n if (items !== prevItems) {\n setPrevItems(items);\n setActiveIndex(-1);\n }\n useLayoutEffect(() => {\n itemRefs.current = [];\n positionMenu(menuRef.current, position);\n }, [header, items, position]);\n useEffect(() => {\n const target =\n activeIndex < 0 ? menuRef.current : itemRefs.current[activeIndex];\n target?.focus({ preventScroll: true });\n }, [activeIndex]);\n useMenuDismissal(menuRef, onClose);\n const handleItemSelect = useCallback(\n (\n item: ContextMenuResolvedItem,\n event: ReactMouseEvent | ReactKeyboardEvent,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n if (item.disabled) return;\n\n safeInvoke(item.onSelect || item.onClick, event, menuContext);\n if (item.closeOnSelect !== false) onClose();\n },\n [menuContext, onClose],\n );\n const handleMenuKeyDown = (event: ReactKeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n } else if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n setActiveIndex((current) =>\n getNextActiveIndex(items, current, direction),\n );\n } else if (\n (event.key === \"Enter\" || event.key === \" \") &&\n items[activeIndex]\n ) {\n event.preventDefault();\n handleItemSelect(items[activeIndex], event);\n }\n };\n\n return {\n menuRef,\n itemRefs,\n classes,\n styles: theme.styles,\n header,\n activeIndex,\n setActiveIndex,\n handleItemSelect,\n handleMenuKeyDown,\n };\n}\n\nexport function useContextMenuRendererModel() {\n const { closeMenu, config, context, isOpen, items, position } =\n useContextMenu();\n const isMounted = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n\n return { closeMenu, config, context, isOpen, items, position, isMounted };\n}\n","import { type Transition, type Variants } from \"motion/react\";\nimport { DURATION_TOKENS, EASING_CURVES } from \"@/tokens\";\n\nconst CONTEXT_MENU_EASINGS = Object.freeze({\n EMPHASIZED: EASING_CURVES.OUT_EXPO,\n SOFT: EASING_CURVES.OUT_QUINT,\n EXIT: EASING_CURVES.IN_CUBIC,\n});\n\nconst CONTEXT_MENU_TIERS = Object.freeze({\n MICRO: {\n duration: DURATION_TOKENS.FAST,\n distance: 4,\n scaleDelta: 0.008,\n ease: CONTEXT_MENU_EASINGS.EMPHASIZED,\n },\n});\n\nfunction toGpuTransform({\n x = 0,\n y = 0,\n scale = 1,\n}: { x?: number; y?: number; scale?: number } = {}) {\n return `translate3d(${x}px, ${y}px, 0) scale(${scale})`;\n}\n\nexport const CONTEXT_MENU_MICRO_SPRING: Transition = Object.freeze({\n type: \"spring\" as const,\n stiffness: 520,\n damping: 30,\n mass: 0.28,\n});\n\nexport const CONTEXT_MENU_ITEM_TAP = Object.freeze({\n transform: toGpuTransform({\n scale: 0.97,\n }),\n});\n\nexport const menuContentVariants: Variants = Object.freeze({\n hidden: {\n opacity: 0,\n },\n visible: {\n opacity: 1,\n transition: {\n duration: CONTEXT_MENU_TIERS.MICRO.duration,\n ease: CONTEXT_MENU_EASINGS.SOFT,\n delay: 0.04,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: DURATION_TOKENS.MICRO,\n ease: CONTEXT_MENU_EASINGS.EXIT,\n },\n },\n});\n\nexport const menuItemVariants: Variants = Object.freeze({\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n y: CONTEXT_MENU_TIERS.MICRO.distance,\n scale: 0.992,\n }),\n },\n visible: (index = 0) => ({\n opacity: 1,\n transform: toGpuTransform(),\n transition: {\n duration: CONTEXT_MENU_TIERS.MICRO.duration,\n ease: CONTEXT_MENU_EASINGS.EMPHASIZED,\n delay: 0.04 + Math.min(Math.max(Number(index) || 0, 0) * 0.042, 0.21),\n },\n }),\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n y: -3,\n scale: 0.994,\n }),\n transition: {\n duration: DURATION_TOKENS.MICRO,\n ease: CONTEXT_MENU_EASINGS.EXIT,\n },\n },\n});\n\nexport const menuPopVariants: Variants = Object.freeze({\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.96,\n }),\n transformOrigin: \"top left\",\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transformOrigin: \"top left\",\n transition: {\n duration: CONTEXT_MENU_TIERS.MICRO.duration,\n ease: CONTEXT_MENU_EASINGS.EMPHASIZED,\n },\n },\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.98,\n }),\n transformOrigin: \"top left\",\n transition: {\n duration: DURATION_TOKENS.MICRO,\n ease: CONTEXT_MENU_EASINGS.EXIT,\n },\n },\n});\n","\"use client\";\n\nimport { motion, AnimatePresence } from \"motion/react\";\nimport { Icon } from \"@/atoms\";\nimport { isImageIconSource } from \"@/utils\";\nimport { createPortal } from \"react-dom\";\nimport {\n CONTEXT_MENU_ITEM_TAP,\n CONTEXT_MENU_MICRO_SPRING,\n menuContentVariants,\n menuItemVariants,\n menuPopVariants,\n} from \"./motion\";\nimport { joinClassNames, resolveMenuItems } from \"./utils\";\nimport {\n type ContextMenuClasses,\n type ContextMenuIcon,\n type ContextMenuResolvedHeader,\n type ContextMenuResolvedItem,\n type ContextMenuConfig,\n type ContextMenuContextValue,\n type ContextMenuPosition,\n} from \"./types\";\nimport {\n useContextMenuContentModel,\n useContextMenuRendererModel,\n useContextMenuListener,\n} from \"./hooks\";\n\nfunction ContextMenuHeaderIcon({\n classes,\n icon,\n}: {\n classes: ContextMenuClasses;\n icon: ContextMenuIcon;\n}) {\n const iconClassName = classes.headerIcon;\n\n if (isImageIconSource(icon)) {\n return (\n <div\n className={iconClassName}\n style={{ backgroundImage: `url(${icon})` }}\n />\n );\n }\n return (\n <div className={iconClassName}>\n {typeof icon === \"string\" ? <Icon icon={icon} size={20} /> : icon}\n </div>\n );\n}\n\nexport function ContextMenuHeader({\n classes,\n header,\n}: {\n classes: ContextMenuClasses;\n header: ContextMenuResolvedHeader | null;\n}) {\n if (!header) return null;\n\n return (\n <div className={classes.header}>\n {header.icon && (\n <ContextMenuHeaderIcon classes={classes} icon={header.icon} />\n )}\n <div className={classes.headerText}>\n {header.eyebrow && (\n <div className={classes.headerEyebrow}>{header.eyebrow}</div>\n )}\n {header.title && (\n <div className={classes.headerTitle}>{header.title}</div>\n )}\n {header.description && (\n <div className={classes.headerDescription}>{header.description}</div>\n )}\n </div>\n </div>\n );\n}\n\nexport function ContextMenuItem({\n classes,\n isActive,\n item,\n onHover,\n onSelect,\n setButtonRef,\n}: {\n classes: ContextMenuClasses;\n isActive: boolean;\n item: ContextMenuResolvedItem;\n onHover: () => void;\n onSelect: (item: ContextMenuResolvedItem, event: React.MouseEvent) => void;\n setButtonRef: (node: HTMLButtonElement | null) => void;\n}) {\n if (item.type === \"separator\") {\n return <div className={classes.separator} role=\"separator\" />;\n }\n\n const itemClassName = joinClassNames(classes.item, item.className);\n const itemIconClassName = joinClassNames(\n classes.itemIcon,\n item.itemIconClassName,\n );\n\n return (\n <motion.button\n ref={setButtonRef}\n className={itemClassName}\n data-active={isActive ? \"true\" : undefined}\n aria-disabled={item.disabled}\n disabled={item.disabled}\n role=\"menuitem\"\n type=\"button\"\n whileTap={CONTEXT_MENU_ITEM_TAP}\n transition={CONTEXT_MENU_MICRO_SPRING}\n onMouseEnter={onHover}\n onClick={(event) => onSelect(item, event)}\n >\n {item.icon &&\n (typeof item.icon === \"string\" ? (\n <Icon icon={item.icon} className={itemIconClassName} size={18} />\n ) : (\n item.icon\n ))}\n <span className={classes.itemLabel}>{item.label}</span>\n {item.shortcut && (\n <span className={classes.itemShortcut}>{item.shortcut}</span>\n )}\n </motion.button>\n );\n}\n\nconst EMPTY_MENU_CONTEXT: ContextMenuContextValue = Object.freeze({\n pathname: \"\",\n point: { x: 0, y: 0 },\n});\n\nfunction ContextMenuContent({\n config,\n items,\n menuContext,\n onClose,\n position,\n}: {\n config: ContextMenuConfig;\n items: ContextMenuResolvedItem[];\n menuContext: ContextMenuContextValue;\n onClose: () => void;\n position: ContextMenuPosition;\n}) {\n const {\n menuRef,\n itemRefs,\n classes,\n styles,\n header,\n activeIndex,\n setActiveIndex,\n handleItemSelect,\n handleMenuKeyDown,\n } = useContextMenuContentModel({\n config,\n items,\n menuContext,\n onClose,\n position,\n });\n return (\n <div>\n <div\n data-context-menu-overlay\n className={classes.backdrop}\n onMouseDown={onClose}\n style={styles.backdrop}\n />\n <motion.div\n ref={menuRef}\n data-context-menu-ignore\n variants={menuPopVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n className={classes.menu}\n role=\"menu\"\n tabIndex={-1}\n style={{\n ...styles.menu,\n left: position.x || 0,\n top: position.y || 0,\n position: \"fixed\",\n }}\n onMouseLeave={() => setActiveIndex(-1)}\n onKeyDown={handleMenuKeyDown}\n >\n <motion.div\n variants={menuContentVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <ContextMenuHeader classes={classes} header={header} />\n </motion.div>\n\n {items.map((item, index) => (\n <motion.div\n key={item.key || `menu-item-${index}`}\n variants={menuItemVariants}\n custom={index}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <ContextMenuItem\n item={item}\n classes={classes}\n isActive={index === activeIndex}\n onHover={() => {\n if (item.type === \"action\" && !item.disabled) {\n setActiveIndex(index);\n }\n }}\n setButtonRef={(node) => {\n itemRefs.current[index] = node;\n }}\n onSelect={handleItemSelect}\n />\n </motion.div>\n ))}\n </motion.div>\n </div>\n );\n}\n\nfunction ContextMenuRenderer() {\n const { closeMenu, config, context, isOpen, items, position, isMounted } =\n useContextMenuRendererModel();\n if (!isMounted) return null;\n const menuContext = context ?? EMPTY_MENU_CONTEXT;\n const resolvedItems = items.length\n ? items\n : resolveMenuItems(config, menuContext);\n return createPortal(\n <AnimatePresence>\n {isOpen && config && resolvedItems.length > 0 && (\n <ContextMenuContent\n key=\"context-menu-content\"\n config={config}\n items={resolvedItems}\n menuContext={menuContext}\n position={position}\n onClose={closeMenu}\n />\n )}\n </AnimatePresence>,\n document.body,\n );\n}\n\nexport function ContextMenuGlobal() {\n useContextMenuListener();\n return <ContextMenuRenderer />;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport { CURRENT_PAGE_KEY, GLOBAL_MENU_KEY } from \"./constants\";\nimport {\n ContextMenuContext,\n ContextMenuProvider,\n useContextMenu,\n useContextMenuActions,\n} from \"./context\";\nimport { ContextMenuGlobal } from \"./overlay\";\nimport {\n type ContextMenuConfig,\n type ContextMenuDefinition,\n type ContextMenuPageApi,\n type ContextMenuPageConfig,\n} from \"./types\";\n\nfunction selectPageContextMenu(\n config: PageConfig,\n): ContextMenuPageConfig | null {\n return config.contextMenu ?? null;\n}\n\nfunction useContextMenuPage(\n _slice: ContextMenuPageConfig | null,\n page: PageModuleApi,\n): ContextMenuPageApi {\n const actions = useContextMenuActions();\n return useMemo(\n () => ({\n ...actions,\n set: (contextMenu: ContextMenuPageConfig | null) =>\n page.set({ contextMenu }),\n }),\n [actions, page],\n );\n}\n\nexport const contextMenuModule = defineModule({\n id: \"contextMenu\",\n context: ContextMenuContext,\n Provider: ContextMenuProvider,\n uses: [\"dock\"],\n Overlay: ContextMenuGlobal,\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"route\",\n lifecycle: \"immediate\",\n reservedKeys: [CURRENT_PAGE_KEY, GLOBAL_MENU_KEY],\n },\n page: {\n select: selectPageContextMenu,\n entries: (slice: ContextMenuPageConfig, { pathname }) => [\n { key: pathname || CURRENT_PAGE_KEY, value: slice },\n ],\n use: useContextMenuPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n contextMenu: typeof contextMenuModule;\n }\n interface PageConfig {\n contextMenu?: ContextMenuPageConfig | null;\n }\n}\n\nexport function defineContextMenu(\n definition: Partial<ContextMenuConfig> = {},\n): ContextMenuDefinition {\n return Object.freeze({\n config: definition,\n id: definition.id ?? \"context-menu\",\n use: function useDefinedContextMenu(options = {}) {\n return useContextMenu({ ...definition, ...options });\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/use-required-context.ts","../../../src/hooks/use-store.ts","../../../src/utils/string.ts","../../../src/utils/dom.ts","../../../src/utils/number.ts","../../../src/utils/object.ts","../../../src/utils/report.ts","../../../src/utils/store.ts","../../../src/hooks/use-isomorphic-layout-effect.ts","../../../src/kernel/constants.ts","../../../src/kernel/context-registry.ts","../../../src/kernel/utils.ts","../../../src/kernel/schema.ts","../../../src/kernel/provider.tsx","../../../src/kernel/installed.ts","../../../src/kernel/handlers.ts","../../../src/kernel/hooks.ts","../../../src/kernel/module.tsx","../../../src/kernel/adapters.ts","../../../src/theme.tsx","../../../src/modules/context-menu/constants.ts","../../../src/modules/context-menu/items.ts","../../../src/modules/context-menu/resolver.ts","../../../src/modules/context-menu/state.ts","../../../src/modules/context-menu/context.tsx","../../../src/atoms/icon.tsx","../../../src/tokens/motion.ts","../../../src/modules/dock/context.ts","../../../src/modules/context-menu/dom.ts","../../../src/modules/context-menu/hooks.ts","../../../src/modules/context-menu/motion.ts","../../../src/modules/context-menu/overlay.tsx","../../../src/modules/context-menu/module.tsx"],"names":["useCallback","useSyncExternalStore","use","hasChanged","stabilizedValue","useRef","useState","useMemo","isValidElement","usePathname","useEffect","jsx","IconifyIcon","useContext","useLayoutEffect","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport { use, type Context } from \"react\";\n\nexport function useRequiredContext<T>(\n context: Context<T | null>,\n hookName: string,\n providerName: string,\n): T {\n const value = use(context);\n if (value === null) {\n throw new Error(`${hookName} must be used within ${providerName}`);\n }\n return value;\n}\n","\"use client\";\n\nimport { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { type ExternalStore } from \"../utils\";\n\nexport function useStore<TState, TSlice = TState>(\n store: ExternalStore<TState>,\n selector: (state: TState) => TSlice = (state: TState) =>\n state as unknown as TSlice,\n isEqual: (a: TSlice, b: TSlice) => boolean = Object.is,\n): TSlice {\n const cacheRef = useRef<{\n isEqual: ((a: TSlice, b: TSlice) => boolean) | null;\n selected: TSlice | undefined;\n selector: ((state: TState) => TSlice) | null;\n snapshot: TState | null;\n }>({\n isEqual: null,\n selected: undefined,\n selector: null,\n snapshot: null,\n });\n\n const getSelectedSnapshot = useCallback(() => {\n const snapshot = store.getSnapshot();\n const cache = cacheRef.current;\n if (\n cache.snapshot === snapshot &&\n cache.selector === selector &&\n cache.isEqual === isEqual\n ) {\n return cache.selected as TSlice;\n }\n\n const selected = selector(snapshot);\n if (\n cache.snapshot !== null &&\n cache.isEqual === isEqual &&\n isEqual(cache.selected as TSlice, selected)\n ) {\n cache.snapshot = snapshot;\n cache.selector = selector;\n return cache.selected as TSlice;\n }\n\n cacheRef.current = {\n isEqual,\n selected,\n selector,\n snapshot,\n };\n return selected;\n }, [isEqual, selector, store]);\n\n return useSyncExternalStore(\n store.subscribe,\n getSelectedSnapshot,\n getSelectedSnapshot,\n );\n}\n","export function trimToNull(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function stripTrailingSlash(url: unknown): string {\n if (typeof url !== \"string\") return \"\";\n return url.replace(/\\/+$/, \"\");\n}\n\nexport function normalizePath(path: unknown): string {\n const trimmed = trimToNull(path);\n if (!trimmed) return \"\";\n if (trimmed === \"/\") return \"/\";\n return stripTrailingSlash(trimmed);\n}\n\nexport function isImageIconSource(icon: unknown): boolean {\n return (\n typeof icon === \"string\" &&\n (icon.startsWith(\"http://\") ||\n icon.startsWith(\"https://\") ||\n icon.startsWith(\"/\") ||\n icon.startsWith(\"data:image/\"))\n );\n}\n","import { stripTrailingSlash } from \"./string\";\n\nexport const isBrowser: boolean = typeof window !== \"undefined\";\n\nlet globalScrollLockCount = 0;\n\nlet globalScrollLockStyles: {\n bodyOverflow: string;\n bodyOverscrollBehavior: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n} | null = null;\n\nexport function acquireGlobalScrollLock(): () => void {\n if (typeof document === \"undefined\") return () => {};\n\n if (globalScrollLockCount === 0) {\n globalScrollLockStyles = {\n bodyOverflow: document.body.style.overflow,\n bodyOverscrollBehavior: document.body.style.overscrollBehavior,\n htmlOverflow: document.documentElement.style.overflow,\n htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior,\n };\n }\n\n globalScrollLockCount += 1;\n document.body.style.overflow = \"hidden\";\n document.body.style.overscrollBehavior = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n document.documentElement.style.overscrollBehavior = \"none\";\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);\n if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;\n\n document.body.style.overflow = globalScrollLockStyles.bodyOverflow;\n document.body.style.overscrollBehavior =\n globalScrollLockStyles.bodyOverscrollBehavior;\n document.documentElement.style.overflow =\n globalScrollLockStyles.htmlOverflow;\n document.documentElement.style.overscrollBehavior =\n globalScrollLockStyles.htmlOverscrollBehavior;\n globalScrollLockStyles = null;\n };\n}\n\nexport function getSiteUrl(): string {\n return stripTrailingSlash(\n process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\",\n );\n}\n\nexport function getCurrentPath(): string {\n if (!isBrowser) return \"/\";\n return `${window.location.pathname}${window.location.search}`;\n}\n\n","export function clamp(value: unknown, min: number, max: number): number {\n const num = Number(value);\n const finite = Number.isFinite(num) ? num : min;\n return Math.min(Math.max(finite, min), max);\n}\n\nexport function toFiniteNumber(value: unknown, fallback: number = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n","export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\nlet sink: ReportSink | null = null;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n if (sink) {\n try {\n sink(scope, error, level);\n return;\n } catch {}\n }\n\n if (process.env.NODE_ENV === \"production\" && typeof window !== \"undefined\") {\n return;\n }\n console[level](`[${scope}]`, error);\n}\n\nexport function setReportSink(next: ReportSink): () => void {\n sink = next;\n return () => {\n if (sink === next) sink = null;\n };\n}\n","import { report } from \"./report\";\nexport interface ExternalStore<TState = unknown> {\n readonly getSnapshot: () => TState;\n readonly publish: (\n nextState: TState | ((currentState: TState) => TState),\n ) => boolean;\n readonly setState: (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ) => boolean;\n readonly subscribe: (listener: () => void) => () => void;\n}\n\nfunction freezeStoreSnapshot<TState>(state: TState): TState {\n if (\n process.env.NODE_ENV === \"production\" ||\n !state ||\n typeof state !== \"object\"\n ) {\n return state;\n }\n\n const seen = new WeakSet<object>();\n const freeze = (value: object): void => {\n if (seen.has(value) || Object.isFrozen(value)) return;\n seen.add(value);\n\n const prototype = Object.getPrototypeOf(value);\n if (\n Array.isArray(value) ||\n prototype === Object.prototype ||\n prototype === null\n ) {\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && \"value\" in descriptor && descriptor.value !== null) {\n if (typeof descriptor.value === \"object\") freeze(descriptor.value);\n }\n }\n }\n\n Object.freeze(value);\n };\n\n freeze(state);\n return state;\n}\n\nexport interface CreateStoreOptions {\n freezeSnapshots?: boolean;\n}\n\nexport function createStore<TState = Record<string, unknown>>(\n initialState: TState,\n { freezeSnapshots = true }: CreateStoreOptions = {},\n): ExternalStore<TState> {\n const listeners = new Set<() => void>();\n const prepare = freezeSnapshots\n ? freezeStoreSnapshot\n : <T>(state: T): T => state;\n let snapshot = prepare(initialState);\n\n const publish = (\n nextStateOrUpdater: TState | ((currentState: TState) => TState),\n ): boolean => {\n const nextState =\n typeof nextStateOrUpdater === \"function\"\n ? (nextStateOrUpdater as (currentState: TState) => TState)(snapshot)\n : nextStateOrUpdater;\n if (Object.is(snapshot, nextState)) return false;\n snapshot = prepare(nextState);\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"CoreStore subscriber\", error, \"warn\");\n }\n }\n return true;\n };\n\n const setState = (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ): boolean => {\n if (typeof updater === \"function\") {\n return publish(updater as (currentState: TState) => TState);\n }\n if (\n snapshot &&\n typeof snapshot === \"object\" &&\n updater &&\n typeof updater === \"object\"\n ) {\n return publish({ ...snapshot, ...updater });\n }\n return publish(updater as TState);\n };\n\n return Object.freeze({\n getSnapshot() {\n return snapshot;\n },\n publish,\n setState,\n subscribe(listener: () => void) {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect } from \"react\";\nimport { isBrowser } from \"../utils\";\n\nexport const useIsomorphicLayoutEffect = isBrowser\n ? useLayoutEffect\n : useEffect;\n","import type {\n RegistryLifecycle,\n RegistryScopeKind,\n RegistrySource,\n RegistryValidationMode,\n} from \"./types\";\n\nexport const DEFAULT_SOURCE: RegistrySource = \"dynamic\";\n\nexport const REGISTRY_SOURCES: Readonly<Record<string, RegistrySource>> =\n Object.freeze({\n STATIC: \"static\",\n DYNAMIC: \"dynamic\",\n USER: \"user\",\n });\n\nexport const REGISTRY_LIFECYCLES: Readonly<Record<string, RegistryLifecycle>> =\n Object.freeze({\n IMMEDIATE: \"immediate\",\n GRACEFUL: \"graceful\",\n PERSISTENT: \"persistent\",\n ROUTE: \"route\",\n });\n\nexport const REGISTRY_VALIDATION_MODES: Readonly<\n Record<string, RegistryValidationMode>\n> = Object.freeze({\n WARN: \"warn\",\n STRICT: \"strict\",\n});\n\nexport const REGISTRY_METADATA_KEYS: readonly string[] = Object.freeze([\n \"cleanup\",\n \"cleanupDelayMs\",\n \"instanceId\",\n \"lifecycle\",\n \"priority\",\n \"source\",\n \"scope\",\n \"validation\",\n]);\n\nexport const REGISTRY_SOURCE_PRIORITY: Readonly<Record<string, number>> =\n Object.freeze({\n [REGISTRY_SOURCES.STATIC]: 100,\n [REGISTRY_SOURCES.DYNAMIC]: 200,\n [REGISTRY_SOURCES.USER]: 300,\n });\n\nexport const REGISTRY_SOURCE_RANK: Readonly<Record<string, number>> =\n Object.freeze({\n [REGISTRY_SOURCES.STATIC]: 10,\n [REGISTRY_SOURCES.DYNAMIC]: 20,\n [REGISTRY_SOURCES.USER]: 30,\n });\n\nexport const REGISTRY_LIFECYCLE_VALUES: ReadonlySet<string> = new Set(\n Object.values(REGISTRY_LIFECYCLES),\n);\n\nexport const REGISTRY_METADATA_KEY_SET: ReadonlySet<string> = new Set(\n REGISTRY_METADATA_KEYS,\n);\n\nconst REGISTRY_SCOPE_KINDS: Readonly<Record<string, RegistryScopeKind>> =\n Object.freeze({\n APP: \"app\",\n SESSION: \"session\",\n ROUTE: \"route\",\n INSTANCE: \"instance\",\n WORKSPACE: \"workspace\",\n });\n\nexport const DEFAULT_REGISTRY_SCOPE: RegistryScopeKind =\n REGISTRY_SCOPE_KINDS.APP;\n","import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","import {\n DEFAULT_REGISTRY_SCOPE,\n DEFAULT_SOURCE,\n REGISTRY_SOURCE_RANK,\n} from \"./constants\";\nimport type { RegistryMetadata } from \"./types\";\nimport { isObject, trimToNull } from \"@/utils\";\n\nexport function hasOwnProperty(target: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nexport function parseFiniteNumber(value: unknown): number | null {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function getValidString(\n value: unknown,\n fallback: string | null = null,\n): string | null {\n return trimToNull(value) ?? fallback;\n}\n\nexport function resolveInstanceId(value: unknown): string | null {\n return isObject(value) && typeof value.instanceId === \"string\"\n ? value.instanceId\n : null;\n}\n\nexport function getSourceRank(source: string): number {\n return REGISTRY_SOURCE_RANK[source] ?? 0;\n}\n\nexport function resolveRegisterInput(\n sourceOrOptions: unknown,\n optionsArg?: unknown,\n): { source: string; options: RegistryMetadata } {\n if (typeof sourceOrOptions === \"string\") {\n return {\n source: sourceOrOptions,\n options: isObject(optionsArg) ? optionsArg : {},\n };\n }\n if (isObject(sourceOrOptions)) {\n return {\n source:\n typeof sourceOrOptions.source === \"string\"\n ? sourceOrOptions.source\n : DEFAULT_SOURCE,\n options: sourceOrOptions,\n };\n }\n return {\n source: DEFAULT_SOURCE,\n options: isObject(optionsArg) ? optionsArg : {},\n };\n}\n\nexport function resolveScope(\n options: RegistryMetadata | null | undefined,\n): string {\n return typeof options?.scope === \"string\" && options.scope.trim()\n ? options.scope.trim()\n : DEFAULT_REGISTRY_SCOPE;\n}\n\nexport function resolveUnregisterInput(sourceOrOptions: unknown): {\n instanceId: string | null;\n scope: string | null;\n source: string;\n} {\n if (typeof sourceOrOptions === \"string\") {\n return { instanceId: null, scope: null, source: sourceOrOptions };\n }\n if (isObject(sourceOrOptions)) {\n return {\n instanceId: resolveInstanceId(sourceOrOptions),\n scope:\n typeof sourceOrOptions.scope === \"string\" &&\n sourceOrOptions.scope.trim()\n ? sourceOrOptions.scope.trim()\n : null,\n source:\n typeof sourceOrOptions.source === \"string\"\n ? sourceOrOptions.source\n : DEFAULT_SOURCE,\n };\n }\n return { instanceId: null, scope: null, source: DEFAULT_SOURCE };\n}\n\nexport function mergeModuleConfigs<T extends object>(\n base: T,\n patch: Partial<T>,\n): T {\n const source = base as Record<string, unknown>;\n const changes = patch as Record<string, unknown>;\n const result: Record<string, unknown> = { ...source };\n Object.keys(changes).forEach((key) => {\n const baseVal = source[key];\n const patchVal = changes[key];\n if (\n baseVal &&\n typeof baseVal === \"object\" &&\n !Array.isArray(baseVal) &&\n patchVal &&\n typeof patchVal === \"object\" &&\n !Array.isArray(patchVal)\n ) {\n result[key] = { ...baseVal, ...patchVal };\n } else {\n result[key] = patchVal;\n }\n });\n return result as T;\n}\n","import {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLE_VALUES,\n REGISTRY_LIFECYCLES,\n REGISTRY_METADATA_KEY_SET,\n REGISTRY_METADATA_KEYS,\n REGISTRY_VALIDATION_MODES,\n} from \"./constants\";\nimport { isObject, isPlainObject } from \"@/utils\";\nimport { getValidString, parseFiniteNumber } from \"./utils\";\nimport type {\n NormalizedRegistryMetadata,\n RegistryDefinitions,\n RegistryLifecycle,\n RegistryMetadata,\n RegistryValidationMode,\n ValidationResult,\n} from \"./types\";\n\nfunction resolveLifecycle(\n metadata: RegistryMetadata | null | undefined,\n fallback: RegistryLifecycle | null,\n): RegistryLifecycle | null {\n const lifecycle = metadata?.lifecycle ?? metadata?.cleanup;\n return lifecycle && REGISTRY_LIFECYCLE_VALUES.has(lifecycle)\n ? lifecycle\n : fallback;\n}\n\nexport function validateRegistryMetadata(metadata: unknown): ValidationResult {\n if (metadata === undefined || metadata === null)\n return { issues: [], valid: true };\n if (!isObject(metadata))\n return { issues: [\"registry metadata must be an object\"], valid: false };\n\n const issues: string[] = [];\n\n Object.keys(metadata).forEach((key) => {\n if (!REGISTRY_METADATA_KEY_SET.has(key))\n issues.push(`unknown registry metadata field: ${key}`);\n });\n\n if (metadata.source !== undefined && !getValidString(metadata.source))\n issues.push(\"source must be a non-empty string\");\n if (metadata.instanceId !== undefined && !getValidString(metadata.instanceId))\n issues.push(\"instanceId must be a non-empty string\");\n if (metadata.scope !== undefined && !getValidString(metadata.scope))\n issues.push(\"scope must be a non-empty string\");\n if (\n metadata.priority !== undefined &&\n parseFiniteNumber(metadata.priority) === null\n )\n issues.push(\"priority must be a finite number\");\n\n if (metadata.cleanupDelayMs !== undefined) {\n const delay = parseFiniteNumber(metadata.cleanupDelayMs);\n if (delay === null || delay < 0)\n issues.push(\"cleanupDelayMs must be a non-negative finite number\");\n }\n\n const lifecycle = metadata.lifecycle ?? metadata.cleanup;\n if (\n lifecycle !== undefined &&\n !REGISTRY_LIFECYCLE_VALUES.has(String(lifecycle))\n ) {\n issues.push(\n `lifecycle must be one of: ${[...REGISTRY_LIFECYCLE_VALUES].join(\", \")}`,\n );\n }\n\n if (\n metadata.validation !== undefined &&\n !Object.values<unknown>(REGISTRY_VALIDATION_MODES).includes(\n metadata.validation,\n )\n ) {\n issues.push(\n `validation must be one of: ${Object.values(REGISTRY_VALIDATION_MODES).join(\", \")}`,\n );\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function validateRegistryKey(\n type: string,\n key: unknown,\n definitions: RegistryDefinitions,\n): ValidationResult {\n const definition = definitions.get(type);\n const issues: string[] = [];\n\n if (!definition) issues.push(`unknown registry type: ${String(type)}`);\n if (!getValidString(key))\n return {\n issues: [...issues, \"key must be a non-empty string\"],\n valid: false,\n };\n\n const normalizedKey = String(key).trim();\n\n if (definition?.keyPolicy === \"singleton\") {\n const expectedKey = definition.singletonKey;\n if (expectedKey && normalizedKey !== expectedKey)\n issues.push(`${type} key must be ${expectedKey}`);\n } else if (definition?.keyPolicy === \"path\") {\n if (!normalizedKey.startsWith(\"/\"))\n issues.push(`${type} key must be an absolute path`);\n } else if (definition?.keyPolicy === \"route\") {\n if (\n !normalizedKey.startsWith(\"/\") &&\n !definition.reservedKeys?.includes(normalizedKey)\n ) {\n issues.push(`${type} key must be a route path or a reserved route key`);\n }\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function validateRegistryValue(\n type: string,\n key: unknown,\n value: unknown,\n definitions: RegistryDefinitions,\n): ValidationResult {\n const definition = definitions.get(type);\n const issues = [...validateRegistryKey(type, key, definitions).issues];\n const valueKind = definition?.valueKind ?? \"object\";\n\n if (definition && valueKind === \"object\" && !isPlainObject(value)) {\n issues.push(`${type} values must be plain objects`);\n }\n if (\n definition &&\n valueKind === \"component\" &&\n typeof value !== \"function\" &&\n !isPlainObject(value)\n ) {\n issues.push(\n `${type} values must be component functions or component objects`,\n );\n }\n\n const validation = definition?.validate?.(value);\n if (validation && !validation.valid && Array.isArray(validation.issues)) {\n issues.push(...validation.issues);\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function normalizeRegistryMetadata(\n metadata: unknown,\n {\n defaultCleanupDelayMs = null,\n defaultLifecycle = null,\n defaultSource = DEFAULT_SOURCE,\n }: {\n defaultCleanupDelayMs?: number | null;\n defaultLifecycle?: RegistryLifecycle | null;\n defaultSource?: string;\n } = {},\n): NormalizedRegistryMetadata {\n const registryMeta = isObject(metadata) ? metadata : {};\n\n const normalizedDefaultDelay = parseFiniteNumber(defaultCleanupDelayMs);\n const fallbackCleanupDelayMs =\n normalizedDefaultDelay !== null && normalizedDefaultDelay >= 0\n ? normalizedDefaultDelay\n : null;\n const fallbackLifecycle =\n defaultLifecycle && REGISTRY_LIFECYCLE_VALUES.has(defaultLifecycle)\n ? defaultLifecycle\n : null;\n\n const source =\n getValidString(registryMeta.source) ||\n getValidString(defaultSource, DEFAULT_SOURCE) ||\n DEFAULT_SOURCE;\n const scope = getValidString(registryMeta.scope);\n const priority = parseFiniteNumber(registryMeta.priority);\n const lifecycle = resolveLifecycle(registryMeta, fallbackLifecycle);\n const validation = isValidationMode(registryMeta.validation)\n ? registryMeta.validation\n : null;\n\n const cleanupDelayCandidate = parseFiniteNumber(registryMeta.cleanupDelayMs);\n let cleanupDelayMs =\n cleanupDelayCandidate !== null && cleanupDelayCandidate >= 0\n ? cleanupDelayCandidate\n : fallbackCleanupDelayMs;\n\n if (lifecycle === REGISTRY_LIFECYCLES.IMMEDIATE) {\n cleanupDelayMs = 0;\n } else if (\n (lifecycle === REGISTRY_LIFECYCLES.GRACEFUL ||\n lifecycle === REGISTRY_LIFECYCLES.ROUTE) &&\n cleanupDelayMs === null\n ) {\n cleanupDelayMs = fallbackCleanupDelayMs;\n }\n\n return {\n cleanupDelayMs,\n lifecycle,\n priority,\n registerOptions: {\n ...(priority !== null && { priority }),\n ...(validation === REGISTRY_VALIDATION_MODES.STRICT && { validation }),\n ...(scope && { scope }),\n },\n source,\n ...(scope && { scope }),\n ...(validation && { validation }),\n };\n}\n\nfunction isValidationMode(value: unknown): value is RegistryValidationMode {\n return Object.values<unknown>(REGISTRY_VALIDATION_MODES).includes(value);\n}\n\nexport function pickRegistryMetadata(options: unknown): RegistryMetadata {\n if (!isObject(options)) return {};\n return Object.fromEntries(\n REGISTRY_METADATA_KEYS.filter((key) => options[key] !== undefined).map(\n (key) => [key, options[key]],\n ),\n );\n}\n","\"use client\";\n\nimport {\n useCallback,\n useMemo,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { useRequiredContext } from \"@/hooks\";\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nimport type {\n RegistryDefinitions,\n RegistrySchema,\n RegistryStore,\n} from \"./types\";\nimport { createRegistryStore, type InitialRegistryEntries } from \"./store\";\n\ntype RegistryValueOf<K extends string> = K extends keyof RegistrySchema\n ? RegistrySchema[K]\n : unknown;\n\ninterface RegistryContextValue {\n actions: Pick<\n RegistryStore,\n \"batch\" | \"register\" | \"transaction\" | \"unregister\"\n >;\n subscription: Pick<\n RegistryStore,\n \"getEntriesSnapshot\" | \"getSnapshot\" | \"subscribe\"\n >;\n}\n\nconst RegistryContext = getOrCreateGlobalContext<RegistryContextValue | null>(\n\n \"RegistryContext\",\n null,\n);\n\nexport function RegistryProvider({\n children,\n definitions,\n initialEntries = [],\n}: {\n children?: ReactNode;\n definitions?: RegistryDefinitions;\n initialEntries?: InitialRegistryEntries;\n}) {\n const [store] = useState(() =>\n createRegistryStore(initialEntries, definitions),\n );\n\n const contextValue = useMemo(\n () => ({\n actions: {\n batch: store.batch,\n register: store.register,\n transaction: store.transaction,\n unregister: store.unregister,\n },\n subscription: {\n getEntriesSnapshot: store.getEntriesSnapshot,\n getSnapshot: store.getSnapshot,\n subscribe: store.subscribe,\n },\n }),\n [store],\n );\n\n return <RegistryContext value={contextValue}>{children}</RegistryContext>;\n}\n\nexport function useRegistryActions(): RegistryContextValue[\"actions\"] {\n return useRequiredContext(\n RegistryContext,\n \"useRegistryActions\",\n \"RegistryProvider\",\n ).actions;\n}\n\nfunction useRegistrySubscription(): RegistryContextValue[\"subscription\"] {\n return useRequiredContext(\n RegistryContext,\n \"useRegistrySubscription\",\n \"RegistryProvider\",\n ).subscription;\n}\n\nexport function useRegistryValue<\n K extends string = string,\n T = RegistryValueOf<K>,\n>(type: K, key: string): T | undefined {\n const { getSnapshot, subscribe } = useRegistrySubscription();\n\n const subscribeToKey = useCallback(\n (listener: () => void) => subscribe(type, key, listener),\n [key, subscribe, type],\n );\n const getValue = useCallback(\n () => getSnapshot<K, T>(type, key),\n [getSnapshot, key, type],\n );\n\n return useSyncExternalStore(subscribeToKey, getValue, getValue);\n}\n\nexport function useRegistryEntries<\n K extends string = string,\n T = RegistryValueOf<K>,\n>(type: K): Record<string, T> {\n const { getEntriesSnapshot, subscribe } = useRegistrySubscription();\n\n const subscribeToType = useCallback(\n (listener: () => void) => subscribe(type, null, listener),\n [subscribe, type],\n );\n const getEntries = useCallback(\n () => getEntriesSnapshot<K, T>(type),\n [getEntriesSnapshot, type],\n );\n\n return useSyncExternalStore(subscribeToType, getEntries, getEntries);\n}\n","\"use client\";\n\nimport { use, type ComponentType, type ReactNode } from \"react\";\nimport { isObject } from \"@/utils\";\nimport { getOrCreateGlobalContext } from \"./context-registry\";\nimport type {\n AnyCoreModule,\n PageConfig,\n RegistryDefinition,\n RegistryDefinitions,\n RegistryMetadata,\n} from \"./types\";\n\nexport type BoundaryComponent = ComponentType<{\n children?: ReactNode;\n name?: string;\n}>;\n\nexport interface ModuleHostValue {\n Boundary: BoundaryComponent;\n byId: ReadonlyMap<string, AnyCoreModule>;\n definitions: RegistryDefinitions;\n modules: readonly AnyCoreModule[];\n}\n\nexport const EMPTY_MODULES: readonly AnyCoreModule[] = Object.freeze([]);\n\nexport const PassthroughBoundary: BoundaryComponent = ({ children }) =>\n children;\n\nexport const ModuleHostContext =\n getOrCreateGlobalContext<ModuleHostValue | null>(\"ModuleHostContext\", null);\n\n\nexport function selectModuleSlice(\n coreModule: AnyCoreModule,\n config: PageConfig,\n): unknown {\n const slice = coreModule.page?.select\n ? coreModule.page.select(config)\n : (config as Record<string, unknown>)[coreModule.id];\n return slice ?? null;\n}\n\nexport function createModulePayload(\n modules: readonly AnyCoreModule[],\n config: PageConfig,\n metadata: RegistryMetadata = {},\n): PageConfig | null {\n const payload: Record<string, unknown> = {};\n let hasSlices = false;\n for (const coreModule of modules) {\n if (!coreModule.page?.entries) continue;\n const slice = selectModuleSlice(coreModule, config);\n if (slice === null) continue;\n payload[coreModule.id] = slice;\n hasSlices = true;\n }\n if (!hasSlices) return null;\n return {\n ...payload,\n registry: {\n ...metadata,\n ...(isObject(config.registry) ? config.registry : {}),\n },\n } as PageConfig;\n}\n\nconst MODULE_ID_PATTERN = /^[a-z][a-zA-Z0-9]*$/;\n\nexport function sortModules(\n modules: readonly AnyCoreModule[],\n): AnyCoreModule[] {\n const byId = new Map<string, AnyCoreModule>();\n for (const coreModule of modules) {\n if (!MODULE_ID_PATTERN.test(coreModule.id)) {\n throw new Error(\n `[Core] Invalid module id \"${coreModule.id}\": use a camelCase name such as \"contextMenu\".`,\n );\n }\n if (byId.has(coreModule.id)) {\n throw new Error(`[Core] Module \"${coreModule.id}\" is installed twice.`);\n }\n byId.set(coreModule.id, coreModule);\n }\n\n const sorted: AnyCoreModule[] = [];\n const state = new Map<string, \"visiting\" | \"done\">();\n const visit = (coreModule: AnyCoreModule, path: string[]) => {\n const current = state.get(coreModule.id);\n if (current === \"done\") return;\n if (current === \"visiting\") {\n throw new Error(\n `[Core] Module dependency cycle: ${[...path, coreModule.id].join(\" -> \")}`,\n );\n }\n state.set(coreModule.id, \"visiting\");\n for (const id of coreModule.uses ?? []) {\n const dependency = byId.get(id);\n if (dependency) visit(dependency, [...path, coreModule.id]);\n }\n state.set(coreModule.id, \"done\");\n sorted.push(coreModule);\n };\n modules.forEach((coreModule) => visit(coreModule, []));\n return sorted;\n}\n\nexport function createModuleRegistryDefinitions(\n modules: readonly AnyCoreModule[],\n): RegistryDefinitions {\n const definitions = new Map<string, RegistryDefinition>();\n for (const coreModule of modules) {\n if (coreModule.registry)\n definitions.set(coreModule.id, coreModule.registry);\n }\n return definitions;\n}\n\nexport function useInstalledModules(): readonly AnyCoreModule[] {\n return use(ModuleHostContext)?.modules ?? EMPTY_MODULES;\n}\n","import { DEFAULT_SOURCE, REGISTRY_LIFECYCLES } from \"./constants\";\nimport {\n normalizeRegistryMetadata,\n validateRegistryMetadata,\n} from \"./schema\";\nimport { isObject, report } from \"@/utils\";\nimport type {\n AnyCoreModule,\n PageConfig,\n RegistrationEntry,\n RegistryApplyContext,\n RegistryCleanupTimer,\n RegistryMetadata,\n RegistryQueue,\n} from \"./types\";\n\ntype CleanupScope = Map<string, RegistryCleanupTimer>;\n\nfunction isPersistentLifecycle(lifecycle: unknown): boolean {\n return lifecycle === REGISTRY_LIFECYCLES.PERSISTENT;\n}\n\nfunction runRegistrationBatch(\n context: RegistryApplyContext,\n executor: (queue: RegistryQueue) => void,\n): number | void {\n return typeof context.batch === \"function\"\n ? context.batch(executor)\n : executor(context);\n}\n\nfunction createEntryCleanupKey(\n type: string,\n key: string,\n source: string,\n instanceId: string | null,\n scope: string | undefined,\n): string {\n return JSON.stringify([\n \"entry\",\n type,\n key,\n scope ?? null,\n source,\n instanceId,\n ]);\n}\n\nfunction getCleanupScope(\n context: RegistryApplyContext | null | undefined,\n): CleanupScope {\n return context?.cleanupScope || new Map();\n}\n\nfunction clearCleanupTimer(scope: CleanupScope, cleanupKey: string): void {\n const lifecycle = scope.get(cleanupKey);\n if (!lifecycle) return;\n lifecycle.cancelled = true;\n if (lifecycle.timerId !== null) clearTimeout(lifecycle.timerId);\n scope.delete(cleanupKey);\n}\n\nfunction scheduleCleanup(\n scope: CleanupScope,\n cleanupKey: string,\n callback: () => void,\n delayMs: number,\n): void {\n clearCleanupTimer(scope, cleanupKey);\n const lifecycle: RegistryCleanupTimer = {\n cancelled: false,\n timerId: null,\n };\n\n lifecycle.timerId = setTimeout(() => {\n if (lifecycle.cancelled || scope.get(cleanupKey) !== lifecycle) return;\n scope.delete(cleanupKey);\n callback();\n }, delayMs);\n\n scope.set(cleanupKey, lifecycle);\n}\n\ntype ModuleRegistration = RegistrationEntry & {\n cleanupKey: string;\n type: string;\n};\n\nfunction collectModuleRegistrations(\n coreModule: AnyCoreModule,\n slice: unknown,\n pageMetadata: RegistryMetadata,\n context: RegistryApplyContext,\n): ModuleRegistration[] {\n const definition = coreModule.registry;\n const toEntries = coreModule.page?.entries;\n if (!definition || !toEntries || slice == null || slice === false) return [];\n\n const type = coreModule.id;\n const items = Array.isArray(slice) ? slice : [slice];\n const registrations: ModuleRegistration[] = [];\n\n for (const item of items) {\n if (item == null || item === false) continue;\n const itemMetadata =\n isObject(item) && isObject(item.registry) ? item.registry : {};\n const metadata = { ...pageMetadata, ...itemMetadata };\n if (\n metadata.validation === \"strict\" &&\n !validateRegistryMetadata(metadata).valid\n ) {\n continue;\n }\n\n const payload = isObject(item)\n ? Object.fromEntries(\n Object.entries(item).filter(([key]) => key !== \"registry\"),\n )\n : item;\n const { cleanupDelayMs, lifecycle, registerOptions, scope, source } =\n normalizeRegistryMetadata(metadata, {\n defaultCleanupDelayMs: definition.cleanupDelayMs ?? null,\n defaultLifecycle: definition.lifecycle,\n defaultSource: DEFAULT_SOURCE,\n });\n\n for (const { key, value } of toEntries(payload, context) ?? []) {\n const validation = definition.validate?.(value);\n if (validation && !validation.valid) {\n report(`Registry ${type} config is invalid`, validation.issues, \"warn\");\n continue;\n }\n registrations.push({\n cleanupDelayMs,\n cleanupKey: createEntryCleanupKey(\n type,\n key,\n source,\n context.instanceId,\n scope,\n ),\n key,\n lifecycle,\n registerOptions,\n scope,\n source,\n type,\n value,\n });\n }\n }\n return registrations;\n}\n\nconst NO_CLEANUP = () => {};\n\nexport function applyRegistryConfig(\n config: PageConfig | null | undefined,\n context: RegistryApplyContext,\n): () => void {\n const modules = context.modules ?? [];\n if (!config || modules.length === 0) return NO_CLEANUP;\n const pageMetadata = isObject(config.registry) ? config.registry : {};\n const slices = config as Record<string, unknown>;\n\n const registrations = modules.flatMap((coreModule) => {\n try {\n return collectModuleRegistrations(\n coreModule,\n slices[coreModule.id],\n pageMetadata,\n context,\n );\n } catch (error) {\n report(`Registry apply (${coreModule.id})`, error);\n return [];\n }\n });\n if (registrations.length === 0) return NO_CLEANUP;\n\n const cleanupScope = getCleanupScope(context);\n const owner = (registration: ModuleRegistration) => ({\n instanceId: context.instanceId,\n scope: registration.scope,\n source: registration.source,\n });\n\n runRegistrationBatch(context, (queue) => {\n registrations.forEach(\n ({ cleanupKey, key, registerOptions, source, type, value }) => {\n clearCleanupTimer(cleanupScope, cleanupKey);\n queue.register(type, key, value, source, registerOptions);\n },\n );\n });\n\n return () => {\n const immediate: ModuleRegistration[] = [];\n registrations.forEach((registration) => {\n if (isPersistentLifecycle(registration.lifecycle)) return;\n const { cleanupDelayMs, cleanupKey, key, type } = registration;\n if (typeof cleanupDelayMs === \"number\" && cleanupDelayMs > 0) {\n scheduleCleanup(\n cleanupScope,\n cleanupKey,\n () => context.unregister(type, key, owner(registration)),\n cleanupDelayMs,\n );\n } else {\n immediate.push(registration);\n }\n });\n if (immediate.length === 0) return;\n runRegistrationBatch(context, (queue) => {\n immediate.forEach((registration) =>\n queue.unregister(\n registration.type,\n registration.key,\n owner(registration),\n ),\n );\n });\n };\n}\n","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport { useIsomorphicLayoutEffect } from \"@/hooks\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { applyRegistryConfig } from \"./handlers\";\nimport { createModulePayload, useInstalledModules } from \"./installed\";\nimport { useRegistryActions } from \"./provider\";\nimport { isObject, shallowEqual } from \"@/utils\";\nimport type {\n PageConfig,\n RegistryCleanupTimer,\n RegistryApplyContext,\n RegistryMetadata,\n RegistryQueue,\n RegistrySourceOrOptions,\n StableFunctionEntry,\n AnyFunction,\n} from \"./types\";\n\nfunction withInstanceId(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): {\n optionsArg: RegistryMetadata | undefined;\n sourceOrOptions: RegistrySourceOrOptions;\n} {\n if (typeof sourceOrOptions === \"string\") {\n return {\n optionsArg: { ...(isObject(optionsArg) ? optionsArg : {}), instanceId },\n sourceOrOptions,\n };\n }\n if (isObject(sourceOrOptions)) {\n return {\n optionsArg,\n sourceOrOptions: { ...sourceOrOptions, instanceId },\n };\n }\n return {\n optionsArg: undefined,\n sourceOrOptions: {\n ...(isObject(optionsArg) ? optionsArg : {}),\n instanceId,\n },\n };\n}\n\nfunction withInstanceIdForUnregister(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n): RegistryMetadata {\n if (typeof sourceOrOptions === \"string\") {\n return { instanceId, source: sourceOrOptions };\n }\n if (isObject(sourceOrOptions)) {\n return { ...sourceOrOptions, instanceId };\n }\n return { instanceId };\n}\n\nfunction resolveRegisterArgsWithInstance(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): [RegistrySourceOrOptions, RegistryMetadata | undefined] {\n const input = withInstanceId(instanceId, sourceOrOptions, optionsArg);\n return [input.sourceOrOptions, input.optionsArg];\n}\n\nexport function useShallowStable<T extends object>(value: T): T {\n const ref = useRef(value);\n if (ref.current !== value && !shallowEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n\nconst MAX_STABILIZATION_DEPTH = 64;\n\nfunction createStableFunctionEntry(fn: AnyFunction): StableFunctionEntry {\n const entry: StableFunctionEntry = {\n current: fn,\n stable(this: unknown, ...args: unknown[]) {\n return entry.current?.apply(this, args);\n },\n };\n return entry;\n}\n\ninterface StabilizeScope {\n componentSlices: ReadonlySet<string>;\n functionEntries: Map<string, StableFunctionEntry>;\n usedPaths: Set<string>;\n}\n\nfunction isDirectRegistryComponentPath(\n path: string,\n componentSlices: ReadonlySet<string>,\n): boolean {\n const match = /^config\\.([^.[]+)\\.[^.[]+$/.exec(path);\n return Boolean(match && componentSlices.has(match[1]));\n}\n\nfunction isReactNodeLike(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n typeof value === \"boolean\" ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n isValidElement(value)\n );\n}\n\nfunction isStabilizableObject(\n value: unknown,\n): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !isValidElement(value)\n );\n}\n\nfunction hasSameObjectKeys(\n previousValue: unknown,\n nextValue: unknown,\n): boolean {\n if (\n !isStabilizableObject(previousValue) ||\n !isStabilizableObject(nextValue)\n ) {\n return false;\n }\n const previousKeys = Object.keys(previousValue);\n const nextKeys = Object.keys(nextValue);\n if (previousKeys.length !== nextKeys.length) return false;\n return nextKeys.every((key) =>\n Object.prototype.hasOwnProperty.call(previousValue, key),\n );\n}\n\nfunction stabilizeRegistryValue(\n value: unknown,\n path: string,\n scope: StabilizeScope,\n previousValue?: unknown,\n seen = new WeakSet<object>(),\n depth = 0,\n): unknown {\n if (depth > MAX_STABILIZATION_DEPTH) return value;\n\n if (typeof value === \"function\") {\n const isComponent = value.name && /^[A-Z]/.test(value.name);\n if (\n isComponent ||\n isDirectRegistryComponentPath(path, scope.componentSlices)\n ) {\n return value;\n }\n scope.usedPaths.add(path);\n let entry = scope.functionEntries.get(path);\n if (!entry) {\n entry = createStableFunctionEntry(value as AnyFunction);\n scope.functionEntries.set(path, entry);\n } else {\n entry.current = value as AnyFunction;\n }\n return entry.stable;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) return value;\n seen.add(value);\n }\n\n if (isValidElement(value)) {\n const nextProps = stabilizeRegistryValue(\n value.props,\n `${path}.props`,\n scope,\n isValidElement(previousValue) ? previousValue.props : undefined,\n seen,\n depth + 1,\n ) as Record<string, unknown>;\n if (\n isValidElement(previousValue) &&\n previousValue.type === value.type &&\n previousValue.key === value.key &&\n previousValue.props === nextProps\n ) {\n return previousValue;\n }\n return cloneElement(value, nextProps);\n }\n\n if (Array.isArray(value)) {\n const nextValue = value.every(isReactNodeLike)\n ? Children.toArray(value)\n : value;\n const previousArray = Array.isArray(previousValue) ? previousValue : null;\n let hasChanged =\n !previousArray || previousArray.length !== nextValue.length;\n\n const stabilizedValue: unknown[] = nextValue.map((item, index) => {\n const nextItem = stabilizeRegistryValue(\n item,\n `${path}[${index}]`,\n scope,\n previousArray?.[index],\n seen,\n depth + 1,\n );\n if (!previousArray || nextItem !== previousArray[index]) {\n hasChanged = true;\n }\n return nextItem;\n });\n return !hasChanged ? previousArray : stabilizedValue;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n const source = value as Record<string, unknown>;\n const previousRecord = previousValue as Record<string, unknown> | undefined;\n const stabilizedValue: Record<string, unknown> = {};\n const canReusePrevious = hasSameObjectKeys(previousValue, value);\n let hasChanged = !canReusePrevious;\n\n Object.keys(source).forEach((key) => {\n const nextValue = stabilizeRegistryValue(\n source[key],\n `${path}.${key}`,\n scope,\n previousRecord?.[key],\n seen,\n depth + 1,\n );\n stabilizedValue[key] = nextValue;\n if (!canReusePrevious || nextValue !== previousRecord?.[key]) {\n hasChanged = true;\n }\n });\n\n return !hasChanged ? previousValue : stabilizedValue;\n}\n\nfunction useAppliedRegistryConfig(\n payload: PageConfig | null,\n context: RegistryApplyContext,\n componentSlices: ReadonlySet<string>,\n): void {\n const functionEntriesRef = useRef(new Map<string, StableFunctionEntry>());\n const appliedRef = useRef<{\n cleanup: () => void;\n config: unknown;\n context: RegistryApplyContext;\n payload: PageConfig | null;\n } | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n const previous = appliedRef.current;\n if (\n previous &&\n previous.payload === payload &&\n previous.context === context\n ) {\n return;\n }\n const functionEntries = functionEntriesRef.current;\n const usedPaths = new Set<string>();\n const config = stabilizeRegistryValue(\n payload,\n \"config\",\n { componentSlices, functionEntries, usedPaths },\n previous?.config,\n );\n functionEntries.forEach((_entry, path) => {\n if (!usedPaths.has(path)) functionEntries.delete(path);\n });\n\n if (\n previous &&\n previous.config === config &&\n previous.context === context\n ) {\n previous.payload = payload;\n return;\n }\n previous?.cleanup();\n appliedRef.current = {\n cleanup: applyRegistryConfig(config as PageConfig | null, context),\n config,\n context,\n payload,\n };\n });\n\n useIsomorphicLayoutEffect(\n () => () => {\n appliedRef.current?.cleanup();\n appliedRef.current = null;\n },\n [],\n );\n}\n\nexport function createRegistryApplyContext(\n actions: RegistryQueue & Pick<RegistryApplyContext, \"batch\">,\n {\n cleanupScope = new Map<string, RegistryCleanupTimer>(),\n instanceId,\n modules = [],\n pathname,\n }: Pick<RegistryApplyContext, \"instanceId\" | \"modules\" | \"pathname\"> & {\n cleanupScope?: RegistryApplyContext[\"cleanupScope\"];\n },\n): RegistryApplyContext {\n const stamp = (queue: RegistryQueue): RegistryQueue =>\n ({\n register: (\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions?: RegistrySourceOrOptions,\n optionsArg?: RegistryMetadata,\n ) =>\n queue.register(\n type,\n key,\n item,\n ...resolveRegisterArgsWithInstance(\n instanceId,\n sourceOrOptions,\n optionsArg,\n ),\n ),\n unregister: (\n type: string,\n key: string,\n sourceOrOptions?: RegistrySourceOrOptions,\n ) =>\n queue.unregister(\n type,\n key,\n withInstanceIdForUnregister(instanceId, sourceOrOptions),\n ),\n }) as RegistryQueue;\n\n return {\n ...stamp(actions),\n batch: (executor) =>\n typeof executor === \"function\"\n ? actions.batch((queue) => executor(stamp(queue)))\n : 0,\n cleanupScope,\n instanceId,\n modules,\n pathname,\n };\n}\n\nexport function useRegistry(\n config?: PageConfig | null,\n metadata?: RegistryMetadata,\n): void {\n const { batch, register, unregister } = useRegistryActions();\n const pathname = usePathname();\n const modules = useInstalledModules();\n const instanceId = `registry-instance-${useId()}`;\n const [cleanupScope] = useState(\n () => new Map<string, RegistryCleanupTimer>(),\n );\n\n const context = useMemo(\n () =>\n createRegistryApplyContext(\n { batch, register, unregister },\n {\n cleanupScope,\n instanceId,\n modules,\n pathname,\n },\n ),\n [batch, cleanupScope, instanceId, modules, pathname, register, unregister],\n );\n\n const payload = useMemo(\n () => (config ? createModulePayload(modules, config, metadata) : null),\n [config, metadata, modules],\n );\n const componentSlices = useMemo(\n () =>\n new Set(\n modules\n .filter(\n (coreModule) => coreModule.registry?.valueKind === \"component\",\n )\n .map((coreModule) => coreModule.id),\n ),\n [modules],\n );\n useAppliedRegistryConfig(payload, context, componentSlices);\n}\n","\"use client\";\n\nimport { createElement, use, useState, type ReactNode } from \"react\";\nimport { useStore } from \"@/hooks\";\nimport { createStore, type ExternalStore } from \"@/utils\";\nimport {\n EMPTY_MODULES,\n ModuleHostContext,\n PassthroughBoundary,\n createModuleRegistryDefinitions,\n sortModules,\n type BoundaryComponent,\n type ModuleHostValue,\n} from \"./installed\";\nimport { PageControllerProvider } from \"./page-controller\";\nimport { RegistryProvider } from \"./provider\";\nimport type {\n AnyCoreModule,\n AppRegistryEntry,\n CoreModule,\n CoreModules,\n ModuleId,\n ModuleRuntimeOf,\n ModuleStateOf,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nexport function defineModule<\n TId extends string,\n TRuntime = never,\n TSlice = never,\n TController = never,\n>(\n coreModule: CoreModule<TId, TRuntime, TSlice, TController>,\n): CoreModule<TId, TRuntime, TSlice, TController> {\n return Object.freeze({ ...coreModule });\n}\n\nfunction warnMissingPeers(modules: readonly AnyCoreModule[]): void {\n const installed = new Set(modules.map((coreModule) => coreModule.id));\n for (const { id, uses } of modules) {\n const missing = (uses ?? []).filter((peer) => !installed.has(peer));\n if (missing.length > 0) {\n report(\n `Module \"${id}\" runs without its optional peers`,\n missing.join(\", \"),\n \"warn\",\n );\n }\n }\n}\n\nfunction createModuleHost(\n modules: readonly AnyCoreModule[],\n Boundary: BoundaryComponent,\n): ModuleHostValue {\n const sorted = sortModules(modules);\n if (process.env.NODE_ENV !== \"production\") warnMissingPeers(sorted);\n return {\n Boundary,\n byId: new Map(sorted.map((coreModule) => [coreModule.id, coreModule])),\n definitions: createModuleRegistryDefinitions(sorted),\n modules: Object.freeze(sorted),\n };\n}\n\nexport interface ModuleHostProps {\n boundary?: BoundaryComponent;\n children?: ReactNode;\n modules?: readonly AnyCoreModule[];\n registryEntries?: readonly AppRegistryEntry[];\n}\n\nexport function ModuleHost({\n boundary = PassthroughBoundary,\n children,\n modules = EMPTY_MODULES,\n registryEntries,\n}: ModuleHostProps) {\n const [host] = useState(() => createModuleHost(modules, boundary));\n const { Boundary } = host;\n\n const content = (\n <>\n {host.modules.map(({ Backdrop, id }) =>\n Backdrop ? (\n <Boundary key={id} name={id}>\n <Backdrop />\n </Boundary>\n ) : null,\n )}\n {children}\n {host.modules.map(({ Overlay, id }) =>\n Overlay ? (\n <Boundary key={id} name={id}>\n <Overlay />\n </Boundary>\n ) : null,\n )}\n </>\n );\n\n const tree = host.modules.reduceRight<ReactNode>(\n (inner, { Provider }) => (Provider ? <Provider>{inner}</Provider> : inner),\n content,\n );\n\n return (\n <RegistryProvider\n definitions={host.definitions}\n initialEntries={registryEntries}\n >\n <ModuleHostContext value={host}>\n <PageControllerProvider>{tree}</PageControllerProvider>\n </ModuleHostContext>\n </RegistryProvider>\n );\n}\n\nexport function useModule<K extends ModuleId>(\n id: K,\n): ModuleRuntimeOf<CoreModules[K]> | null {\n const coreModule = use(ModuleHostContext)?.byId.get(id);\n return coreModule?.context ? (use(coreModule.context) ?? null) : null;\n}\n\ntype ModuleActionsOf<K extends ModuleId> =\n ModuleRuntimeOf<CoreModules[K]> extends { actions: infer TActions }\n ? TActions\n : never;\n\nexport interface ModulePeer<K extends ModuleId> {\n useActions(): ModuleActionsOf<K>;\n useRuntime(): ModuleRuntimeOf<CoreModules[K]>;\n useState<T>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ): T;\n}\n\nexport function definePeer<K extends ModuleId>(\n id: K,\n inert: ModuleRuntimeOf<CoreModules[K]>,\n): ModulePeer<K> {\n const useRuntime = (): ModuleRuntimeOf<CoreModules[K]> =>\n useModule(id) ?? inert;\n return {\n useRuntime,\n useActions: () => useRuntime().actions as ModuleActionsOf<K>,\n useState: <T,>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ) =>\n useStore<ModuleStateOf<K>, T>(\n (useRuntime() as { store: ExternalStore<ModuleStateOf<K>> }).store,\n selector,\n isEqual,\n ),\n };\n}\n\nconst NO_MODULE_STORE: ExternalStore<unknown> = createStore<unknown>(undefined);\n\nexport function useModuleState<K extends ModuleId, T>(\n id: K,\n selector: (state: ModuleStateOf<K>) => T,\n fallback: T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const runtime = useModule(id) as { store: ExternalStore<unknown> } | null;\n return useStore<unknown, T>(\n runtime?.store ?? NO_MODULE_STORE,\n (state) => (runtime ? selector(state as ModuleStateOf<K>) : fallback),\n isEqual,\n );\n}\n\nexport function ModuleBoundary({\n children,\n name,\n}: {\n children?: ReactNode;\n name?: string;\n}) {\n const Boundary = use(ModuleHostContext)?.Boundary ?? PassthroughBoundary;\n return createElement(Boundary, { name }, children);\n}\n\nexport function useIsModuleInstalled(id: ModuleId): boolean {\n return use(ModuleHostContext)?.byId.has(id) ?? false;\n}\n","\"use client\";\n\nimport { pickRegistryMetadata } from \"./schema\";\nimport { useRegistry } from \"./hooks\";\nimport { useInstalledModules } from \"./installed\";\nimport type { ModuleId, PageConfig, RegistryMetadata } from \"./types\";\n\nexport function useModuleRegistration(\n id: ModuleId,\n value: unknown,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n const coreModule = useInstalledModules().find(\n (candidate) => candidate.id === id,\n );\n const config =\n coreModule && options?.enabled !== false && value != null\n ? ({ [id]: value } as PageConfig)\n : null;\n useRegistry(config, pickRegistryMetadata(options));\n}\n","\"use client\";\n\nimport {\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n","import { defineThemeSpec } from \"@/theme\";\nimport { type ContextMenuPosition, type ContextMenuThemeSlot } from \"./types\";\n\nexport const contextMenuTheme =\n defineThemeSpec<ContextMenuThemeSlot>(\"context-menu\");\n\nexport const CURRENT_PAGE_KEY = \"current-page\";\nexport const GLOBAL_MENU_KEY = \"*\";\nexport const MENU_SCREEN_MARGIN = 10;\n\nexport const CONTEXT_MENU_VISIBILITY_EVENT = \"context-menu:visibility\";\nexport const INITIAL_POSITION: ContextMenuPosition = Object.freeze({\n x: 0,\n y: 0,\n});\n","import { isValidElement, type ReactNode } from \"react\";\nimport { isObject, report, toArray } from \"@/utils\";\nimport {\n type ContextMenuConfig,\n type ContextMenuContextValue,\n type ContextMenuItem,\n type ContextMenuPageMeta,\n type ContextMenuResolvedHeader,\n type ContextMenuResolvedItem,\n} from \"./types\";\n\nexport function extractNodeText(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return value\n .map(extractNodeText)\n .filter(Boolean)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n }\n if (isValidElement(value)) {\n return extractNodeText((value.props as { children?: ReactNode })?.children);\n }\n return \"\";\n}\n\nexport function resolveAsBoolean(\n value: unknown,\n context?: unknown,\n defaultValue = true,\n): boolean {\n if (typeof value === \"function\") {\n try {\n return Boolean(value(context));\n } catch {\n return false;\n }\n }\n if (value === undefined) {\n return defaultValue;\n }\n return Boolean(value);\n}\n\nexport function resolveAsValue<T = unknown>(\n value: unknown,\n context?: unknown,\n fallback?: T,\n): T {\n if (typeof value === \"function\") {\n try {\n const resolved = value(context);\n return resolved === undefined ? (fallback as T) : resolved;\n } catch {\n return fallback as T;\n }\n }\n return value === undefined ? (fallback as T) : (value as T);\n}\n\nexport function safeInvoke<T = unknown>(\n handler: unknown,\n ...args: unknown[]\n): T | undefined {\n if (typeof handler !== \"function\") return undefined;\n try {\n const result = handler(...args);\n if (result && typeof result.then === \"function\") {\n result.catch((err: unknown) =>\n report(\"Context menu async callback\", err),\n );\n }\n return result as T;\n } catch (error) {\n report(\"Context menu callback\", error);\n return undefined;\n }\n}\n\nexport function resolveContextMenuPageMeta(\n dockItem: unknown,\n pathname = \"\",\n): ContextMenuPageMeta | null {\n if (!isObject(dockItem)) return null;\n const title = (dockItem.contextMenuTitle ??\n dockItem.title ??\n null) as ReactNode;\n const description = (dockItem.contextMenuDescription ??\n dockItem.description ??\n null) as ReactNode;\n const eyebrow = (dockItem.contextMenuEyebrow ??\n dockItem.eyebrow ??\n null) as ReactNode;\n const icon = (dockItem.contextMenuIcon ?? dockItem.icon ?? null) as ReactNode;\n\n if (!title && !description && !icon && !eyebrow) return null;\n\n return {\n description,\n descriptionText: extractNodeText(description),\n eyebrow,\n icon,\n path:\n typeof dockItem.path === \"string\" && dockItem.path\n ? dockItem.path\n : pathname,\n title,\n titleText:\n extractNodeText(title) ||\n (typeof dockItem.name === \"string\" ? dockItem.name : \"\") ||\n \"\",\n };\n}\n\nfunction resolveItem(\n item: ContextMenuItem | \"separator\" | null | undefined,\n index: number,\n context: ContextMenuContextValue,\n): ContextMenuResolvedItem | null {\n if (!item) return null;\n if (item === \"separator\" || item.type === \"separator\") {\n return {\n key: (item !== \"separator\" && item.key) || `separator-${index}`,\n type: \"separator\",\n };\n }\n\n if (\n resolveAsBoolean(item.hidden, context, false) ||\n !resolveAsBoolean(item.visible, context, true)\n ) {\n return null;\n }\n\n const label = resolveAsValue(item.label, context, \"\");\n if (\n (typeof label !== \"string\" && typeof label !== \"number\") ||\n !String(label).trim()\n ) {\n return null;\n }\n\n const handler = item.onSelect ?? item.onClick ?? null;\n const shortcut = resolveAsValue(item.shortcut, context, null);\n\n return {\n ...item,\n className: resolveAsValue(item.className, context, \"\") || \"\",\n closeOnSelect: item.closeOnSelect !== false,\n danger: resolveAsBoolean(item.danger, context, false),\n disabled: resolveAsBoolean(item.disabled, context, false),\n icon: resolveAsValue(item.icon, context, null) || null,\n itemIconClassName:\n resolveAsValue(item.itemIconClassName, context, \"\") || \"\",\n key: item.key || `item-${index}`,\n label: String(label),\n onClick: handler,\n onSelect: handler,\n shortcut: typeof shortcut === \"string\" ? shortcut : null,\n type: \"action\",\n };\n}\n\nexport function resolveMenuItems(\n config: ContextMenuConfig | null | undefined,\n context: ContextMenuContextValue,\n): ContextMenuResolvedItem[] {\n const rawItems = resolveAsValue(config?.items, context, []);\n const items: ContextMenuResolvedItem[] = [];\n\n toArray(rawItems).forEach((raw, index) => {\n const item = resolveItem(raw, index, context);\n if (!item) return;\n const previous = items[items.length - 1];\n if (\n item.type === \"separator\" &&\n (!previous || previous.type === \"separator\")\n ) {\n return;\n }\n items.push(item);\n });\n\n if (items[items.length - 1]?.type === \"separator\") items.pop();\n return items;\n}\n\nexport function resolveMenuHeader(\n config: ContextMenuConfig | null | undefined,\n context: ContextMenuContextValue,\n): ContextMenuResolvedHeader | null {\n if (config?.header === false || config?.showPageHeader === false) return null;\n\n const configured = resolveAsValue(config?.header, context, null);\n const source = isObject(configured)\n ? configured\n : isObject(context.page)\n ? context.page\n : null;\n if (!source) return null;\n\n const title = resolveAsValue(source.title, context, null);\n const description = resolveAsValue(source.description, context, null);\n const icon = resolveAsValue(source.icon, context, null);\n const eyebrow = resolveAsValue(source.eyebrow, context, null);\n if (!title && !description && !icon && !eyebrow) return null;\n\n return {\n description,\n descriptionText: extractNodeText(description),\n eyebrow,\n icon,\n title,\n titleText: extractNodeText(title),\n };\n}\n","import { isObject, toArray } from \"@/utils\";\nimport { CURRENT_PAGE_KEY, GLOBAL_MENU_KEY } from \"./constants\";\nimport { resolveMenuItems, resolveAsBoolean, safeInvoke } from \"./items\";\nimport {\n type ContextMenuCandidate,\n type ContextMenuConfig,\n type ContextMenuContextValue,\n type ContextMenuResolvedItem,\n type ContextMenuResolvedMatch,\n} from \"./types\";\n\nfunction normalizeMenuCandidates(\n registryMenus?: Record<string, unknown> | null,\n): ContextMenuCandidate[] {\n const candidates: ContextMenuCandidate[] = [];\n\n for (const [registryKey, rawConfig] of Object.entries(registryMenus || {})) {\n if (!isObject(rawConfig)) continue;\n\n const { menus, ...sharedConfig } = rawConfig as ContextMenuConfig;\n const nestedMenus = toArray(menus);\n const hasSharedItems =\n Array.isArray(sharedConfig.items) ||\n typeof sharedConfig.items === \"function\";\n\n if (hasSharedItems || nestedMenus.length === 0) {\n candidates.push({\n config: sharedConfig,\n order: candidates.length,\n registryKey,\n });\n }\n\n for (const menu of nestedMenus) {\n candidates.push({\n config: {\n ...sharedConfig,\n ...menu,\n classNames: { ...sharedConfig.classNames, ...menu.classNames },\n },\n order: candidates.length,\n registryKey,\n });\n }\n }\n return candidates;\n}\n\nfunction isPathAllowed(\n config: ContextMenuConfig,\n registryKey: string,\n pathname?: string,\n): boolean {\n if (!pathname) return true;\n if (config.path === pathname) return true;\n\n const explicitPaths = toArray(config.paths).filter(Boolean);\n if (explicitPaths.length > 0) return explicitPaths.includes(pathname);\n\n if (typeof config.pathMatcher === \"function\") {\n try {\n return Boolean(config.pathMatcher(pathname));\n } catch {\n return false;\n }\n }\n\n return (\n registryKey === pathname ||\n registryKey === CURRENT_PAGE_KEY ||\n registryKey === GLOBAL_MENU_KEY\n );\n}\n\nfunction getElementDepth(from: Element, ancestor: Element): number {\n let depth = 0;\n for (\n let node: Element | null = from;\n node && node !== ancestor;\n node = node.parentElement\n ) {\n depth += 1;\n }\n return depth;\n}\n\nfunction getTargetScore(\n config: ContextMenuConfig,\n targetElement: Element | null,\n): number | null {\n const selectors = toArray(config.target).filter(\n (selector) => typeof selector === \"string\" && selector.trim(),\n );\n if (selectors.length === 0) return 0;\n if (!targetElement) return null;\n\n let minDepth = Infinity;\n for (const selector of selectors) {\n try {\n const matched = targetElement.closest(selector);\n if (matched) {\n minDepth = Math.min(minDepth, getElementDepth(targetElement, matched));\n }\n } catch {}\n }\n return minDepth === Infinity ? null : Math.max(0, 100 - minDepth);\n}\n\nfunction getRouteScore(\n config: ContextMenuConfig,\n registryKey: string,\n pathname?: string,\n): number {\n if (!pathname) return 0;\n if (\n config.path === pathname ||\n toArray(config.paths).includes(pathname) ||\n registryKey === pathname\n ) {\n return 100;\n }\n if (registryKey === CURRENT_PAGE_KEY) return 70;\n if (registryKey === GLOBAL_MENU_KEY) return 40;\n return 10;\n}\n\nfunction buildMenuContext(\n config: ContextMenuConfig,\n event: MouseEvent,\n pathname?: string,\n targetElement?: Element | null,\n): ContextMenuContextValue {\n let context: ContextMenuContextValue = {\n currentTarget: event.currentTarget ?? null,\n event,\n pathname: pathname || \"\",\n point: { x: Number(event.clientX) || 0, y: Number(event.clientY) || 0 },\n target: targetElement,\n };\n\n if (config.payload !== undefined) context.payload = config.payload;\n\n try {\n const payload = config.resolvePayload?.(event, context);\n if (payload !== undefined) context.payload = payload;\n } catch {}\n\n try {\n const extra = config.resolveContext?.(event, context);\n if (isObject(extra)) context = { ...context, ...extra };\n } catch {}\n\n return context;\n}\n\nfunction isMenuOverlayTarget(element: Element | null): boolean {\n return Boolean(\n element?.closest?.(\n '[data-context-menu-ignore], [data-context-menu-overlay], [role=\"menu\"]',\n ) || element?.classList?.contains(\"context-menu-overlay\"),\n );\n}\n\nfunction resolveEventTarget(event: MouseEvent): Element | null {\n const initialTarget = event.target instanceof Element ? event.target : null;\n\n if (initialTarget && !isMenuOverlayTarget(initialTarget)) {\n return initialTarget;\n }\n if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) {\n return initialTarget;\n }\n\n try {\n const underneath = document\n .elementsFromPoint(event.clientX, event.clientY)\n .find((element) => !isMenuOverlayTarget(element));\n return underneath || initialTarget;\n } catch {\n return initialTarget;\n }\n}\n\nfunction passesWhen(\n config: ContextMenuConfig,\n event: MouseEvent,\n info: {\n context: ContextMenuContextValue;\n pathname: string;\n target: Element | null;\n },\n): boolean {\n if (typeof config.when !== \"function\") return config.when !== false;\n try {\n return Boolean(config.when(event, info));\n } catch {\n return false;\n }\n}\n\nexport function resolveContextMenu(\n registryMenus: Record<string, unknown> | null | undefined,\n pathname: string | undefined,\n event: MouseEvent,\n): ContextMenuResolvedMatch | null {\n const targetElement = resolveEventTarget(event);\n let winner: ContextMenuResolvedMatch | null = null;\n\n for (const { config, order, registryKey } of normalizeMenuCandidates(\n registryMenus,\n )) {\n if (!isPathAllowed(config, registryKey, pathname)) continue;\n\n const context = buildMenuContext(config, event, pathname, targetElement);\n if (!resolveAsBoolean(config.enabled, context, true)) continue;\n if (\n !passesWhen(config, event, {\n context,\n pathname: pathname || \"\",\n target: targetElement,\n })\n ) {\n continue;\n }\n\n const items = resolveMenuItems(config, context);\n if (!items.length) continue;\n\n const targetScore = getTargetScore(config, targetElement);\n if (targetScore === null) continue;\n\n const priority = Number(config.priority);\n const score =\n (Number.isFinite(priority) ? priority : 0) * 10000 +\n getRouteScore(config, registryKey, pathname) * 100 +\n targetScore;\n\n if (!winner || score > winner.score) {\n winner = { config, context, items, order, score };\n }\n }\n return winner;\n}\n\nexport function prepareMenu(\n config: ContextMenuConfig,\n context: ContextMenuContextValue,\n event: unknown,\n): {\n context: ContextMenuContextValue;\n items: ContextMenuResolvedItem[];\n} | null {\n const onOpenResult = safeInvoke(config.onOpen, event, context);\n if (onOpenResult === false) return null;\n\n const nextContext = isObject(onOpenResult)\n ? { ...context, ...(onOpenResult as Record<string, unknown>) }\n : context;\n const items = resolveMenuItems(config, nextContext);\n return items.length ? { context: nextContext, items } : null;\n}\n","import { isBrowser, toFiniteNumber } from \"@/utils\";\nimport { CONTEXT_MENU_VISIBILITY_EVENT, INITIAL_POSITION } from \"./constants\";\nimport { type ContextMenuOpenInput, type ContextMenuState } from \"./types\";\n\nexport function createInitialMenuState(): ContextMenuState {\n return {\n position: INITIAL_POSITION,\n context: null,\n isOpen: false,\n config: null,\n items: [],\n };\n}\n\nexport function resolveNextOpenState({\n config,\n context,\n items,\n position,\n}: ContextMenuOpenInput): ContextMenuState | null {\n if (!config) return null;\n return {\n config,\n context: context ?? null,\n isOpen: true,\n items: items ?? [],\n position: {\n x: Math.round(toFiniteNumber(position?.x, 0)),\n y: Math.round(toFiniteNumber(position?.y, 0)),\n },\n };\n}\n\nexport function emitContextMenuVisibility(isOpen: boolean): void {\n if (!isBrowser) return;\n window.dispatchEvent(\n new CustomEvent(CONTEXT_MENU_VISIBILITY_EVENT, {\n detail: { isOpen: Boolean(isOpen) },\n }),\n );\n}\n","\"use client\";\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport {\n useIsomorphicLayoutEffect,\n useStore,\n} from \"@/hooks\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\n\nimport { createStore } from \"@/utils\";\nimport { prepareMenu } from \"./resolver\";\nimport {\n createInitialMenuState,\n emitContextMenuVisibility,\n resolveNextOpenState,\n} from \"./state\";\nimport { safeInvoke } from \"./items\";\nimport {\n type ContextMenuActions,\n type ContextMenuContextValue,\n type ContextMenuProviderValue,\n type ContextMenuState,\n type ContextMenuTrigger,\n} from \"./types\";\n\nexport const ContextMenuContext =\n\n getOrCreateGlobalContext<ContextMenuProviderValue | null>(\n \"ContextMenuContext\",\n null,\n );\n\nfunction selectIsOpen(state: ContextMenuState): boolean {\n return state.isOpen;\n}\n\nexport function ContextMenuProvider({ children }: { children?: ReactNode }) {\n const pathname = usePathname();\n const [store] = useState(() =>\n createStore<ContextMenuState>(createInitialMenuState(), {\n freezeSnapshots: false,\n }),\n );\n const isOpen = useStore(store, selectIsOpen);\n\n const pathnameRef = useRef(pathname);\n useIsomorphicLayoutEffect(() => {\n pathnameRef.current = pathname;\n }, [pathname]);\n\n const actions = useMemo<ContextMenuActions>(() => {\n const openMenu: ContextMenuActions[\"openMenu\"] = (input) => {\n const nextState = resolveNextOpenState(input);\n if (nextState) store.publish(nextState);\n };\n\n const closeMenu = () => {\n const current = store.getSnapshot();\n if (!current.isOpen) return;\n store.publish(createInitialMenuState());\n safeInvoke(current.config?.onClose, current.context);\n };\n\n const bind: ContextMenuActions[\"bind\"] = (payload, configOverride) => ({\n onContextMenu: (event: ContextMenuTrigger) => {\n const config = configOverride || store.getSnapshot().config;\n if (!config) return;\n\n event.preventDefault?.();\n event.stopPropagation?.();\n\n const point = {\n x: Number(event.clientX ?? 0),\n y: Number(event.clientY ?? 0),\n };\n const context: ContextMenuContextValue = {\n currentTarget: event.currentTarget ?? null,\n event,\n pathname: pathnameRef.current || \"\",\n payload,\n point,\n target: (event.target as Element) ?? null,\n };\n\n const prepared = prepareMenu(config, context, event);\n if (!prepared) return;\n\n openMenu({\n config,\n context: prepared.context,\n items: prepared.items,\n position: point,\n });\n },\n });\n\n return { bind, closeMenu, openMenu };\n }, [store]);\n\n const contextValue = useMemo<ContextMenuProviderValue>(\n () => ({ actions, store }),\n [actions, store],\n );\n\n useEffect(() => emitContextMenuVisibility(isOpen), [isOpen]);\n\n return (\n <ContextMenuContext value={contextValue}>{children}</ContextMenuContext>\n );\n}\n\n","\"use client\";\n\nimport { Icon as IconifyIcon } from \"@iconify-icon/react\";\nimport type { ComponentProps, CSSProperties } from \"react\";\n\nexport interface IconProps\n extends Omit<ComponentProps<typeof IconifyIcon>, \"icon\" | \"size\"> {\n icon: string | ComponentProps<typeof IconifyIcon>[\"icon\"];\n size?: number | string;\n color?: string;\n className?: string;\n style?: CSSProperties;\n onClick?: () => void;\n}\n\nexport function Icon({\n className = \"center\",\n color,\n icon,\n onClick,\n size = 20,\n style,\n ...props\n}: IconProps) {\n return (\n <IconifyIcon\n className={className}\n height={size}\n icon={icon}\n onClick={onClick}\n style={{ color, ...style }}\n width={size}\n {...props}\n />\n );\n}\n\nIcon.displayName = \"Icon\";\n","export const DURATION_TOKENS = Object.freeze({\n INSTANT: 0.08,\n MICRO: 0.18,\n FAST: 0.28,\n BASE: 0.36,\n MODERATE: 0.44,\n SLOW: 0.58,\n CINEMATIC: 0.86,\n} as const);\n\nexport const EASING_CURVES = Object.freeze({\n OUT_EXPO: [0.16, 1, 0.3, 1] as const,\n OUT_QUART: [0.25, 1, 0.5, 1] as const,\n OUT_QUINT: [0.22, 1, 0.36, 1] as const,\n IN_OUT_CUBIC: [0.65, 0, 0.35, 1] as const,\n IN_CUBIC: [0.5, 0, 1, 1] as const,\n OUT_BACK: [0.34, 1.56, 0.64, 1] as const,\n} as const);\n\nexport const MOTION_EASINGS = Object.freeze({\n ENTER: EASING_CURVES.OUT_QUART,\n ENTER_EMPHASIZED: EASING_CURVES.OUT_EXPO,\n EXIT: EASING_CURVES.IN_CUBIC,\n} as const);\n\nexport const MOTION_TIERS = Object.freeze({\n MICRO: Object.freeze({\n distance: 4,\n duration: DURATION_TOKENS.MICRO,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.008,\n }),\n FAST: Object.freeze({\n distance: 9,\n duration: DURATION_TOKENS.FAST,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.012,\n }),\n STANDARD: Object.freeze({\n distance: 18,\n duration: DURATION_TOKENS.MODERATE,\n ease: MOTION_EASINGS.ENTER,\n scaleDelta: 0.018,\n }),\n SURFACE: Object.freeze({\n distance: 28,\n duration: DURATION_TOKENS.SLOW,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.024,\n }),\n} as const);\n\nexport const SPRING_PRESETS = Object.freeze({\n MICRO: Object.freeze({\n damping: 32,\n mass: 0.6,\n stiffness: 520,\n type: \"spring\",\n } as const),\n SNAPPY: Object.freeze({\n damping: 28,\n mass: 0.8,\n stiffness: 380,\n type: \"spring\",\n } as const),\n GENTLE: Object.freeze({\n damping: 30,\n mass: 1,\n stiffness: 260,\n type: \"spring\",\n } as const),\n BOUNCY: Object.freeze({\n damping: 20,\n mass: 0.85,\n stiffness: 340,\n type: \"spring\",\n } as const),\n} as const);\n\nexport const REDUCED_MOTION_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.INSTANT,\n ease: \"linear\",\n} as const);\n\nexport const COMPOSITOR_GPU_STYLE = Object.freeze({\n backfaceVisibility: \"hidden\",\n transform: \"translate3d(0, 0, 0)\",\n willChange: \"transform, opacity\",\n} as const);\n\nexport const TAP_SCALE_SUBTLE = 0.97;\n\ntype Ease = readonly [number, number, number, number];\n\ntype TweenOptions = {\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n};\n\ntype Spring = {\n type?: \"spring\";\n stiffness: number;\n damping: number;\n mass: number;\n};\n\nfunction tween(duration: number, ease: Ease) {\n return Object.freeze({ type: \"tween\" as const, duration, ease });\n}\n\nfunction safeNumber(value: unknown, fallback: number): number {\n const source =\n value &&\n typeof value === \"object\" &&\n \"get\" in value &&\n typeof value.get === \"function\"\n ? value.get()\n : value;\n const number = Number.parseFloat(String(source));\n return Number.isFinite(number) ? number : fallback;\n}\n\nexport function gpuTransform(\n y: unknown = 0,\n scale: unknown = 1,\n x: unknown = 0,\n): string {\n const translateY = Math.round(safeNumber(y, 0));\n const translateX = Math.round(safeNumber(x, 0));\n const scaleValue = Math.round(safeNumber(scale, 1) * 1000) / 1000;\n return `translate3d(${translateX}px, ${translateY}px, 0) scale(${scaleValue})`;\n}\n\nexport function durationForDistance(\n distancePx: number,\n {\n base = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n }: {\n base?: number;\n min?: number;\n max?: number;\n reference?: number;\n gain?: number;\n } = {},\n): number {\n const distance = Math.abs(Number(distancePx) || 0);\n const safeMin = Math.max(0, min);\n const safeMax = Math.max(safeMin, max);\n const safeReference = Math.max(1, reference);\n const duration = base + Math.sqrt(distance / safeReference) * gain;\n return Math.min(safeMax, Math.max(safeMin, duration));\n}\n\nexport function surfaceResizeTransition(\n distancePx: number,\n {\n base = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n ease = EASING_CURVES.IN_OUT_CUBIC,\n }: {\n base?: number;\n min?: number;\n max?: number;\n reference?: number;\n gain?: number;\n ease?: Ease;\n } = {},\n) {\n return tween(\n durationForDistance(distancePx, { base, min, max, reference, gain }),\n ease,\n );\n}\n\nexport function contentSwapTransitions({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: TweenOptions = {}) {\n return Object.freeze({\n enter: tween(duration, enterEase),\n exit: tween(exitDuration, exitEase),\n });\n}\n\nexport function contentSwap({\n travel = 6,\n exitTravel = travel * 0.7,\n enterScale = 0.99,\n exitScale = 0.99,\n ...transitionOptions\n}: TweenOptions & {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n} = {}) {\n const transitions = contentSwapTransitions(transitionOptions);\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function overlaySurface({\n travel = 16,\n exitTravel = travel * 0.5,\n enterScale = 0.97,\n exitScale = 0.985,\n distance,\n duration,\n exitDuration,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n distance?: number;\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n} = {}) {\n const enterDuration =\n duration ??\n (distance === undefined\n ? DURATION_TOKENS.BASE\n : durationForDistance(distance));\n const transitions = contentSwapTransitions({\n duration: enterDuration,\n exitDuration: exitDuration ?? enterDuration * 0.68,\n enterEase,\n exitEase,\n });\n\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function staggerDelay(\n index: number,\n { base = 0.028, cap = 0.16, exponent = 0.82 } = {},\n): number {\n const safeIndex = Math.max(0, Number(index) || 0);\n return Math.min(cap, base * Math.pow(safeIndex, exponent));\n}\n\nexport function staggerItem({\n base = 0.028,\n cap = 0.16,\n duration = DURATION_TOKENS.BASE,\n travel = 10,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitDuration = DURATION_TOKENS.MICRO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n base?: number;\n cap?: number;\n duration?: number;\n travel?: number;\n enterEase?: Ease;\n exitDuration?: number;\n exitEase?: Ease;\n} = {}) {\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, 0.985),\n }),\n visible: (index: number = 0) => ({\n opacity: 1,\n transform: gpuTransform(0),\n transition: Object.freeze({\n ...tween(duration, enterEase),\n delay: staggerDelay(index, { base, cap }),\n }),\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-travel * 0.6, 0.99),\n transition: tween(exitDuration, exitEase),\n }),\n });\n}\n\nexport function chip({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.IN_OUT_CUBIC,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: TweenOptions = {}) {\n const transitions = contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n });\n return Object.freeze({\n hidden: Object.freeze({ opacity: 0, transform: gpuTransform(0, 0.96) }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(0, 0.96),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function press({\n tapScale = TAP_SCALE_SUBTLE,\n spring = SPRING_PRESETS.MICRO,\n}: { tapScale?: number; spring?: Spring } = {}) {\n return Object.freeze({\n variants: Object.freeze({\n idle: Object.freeze({ transform: gpuTransform(0, 1) }),\n hover: Object.freeze({ transform: gpuTransform(0, 1) }),\n tap: Object.freeze({ transform: gpuTransform(0, tapScale) }),\n }),\n transition: Object.freeze({ type: \"spring\" as const, ...spring }),\n });\n}\n\nexport function dragDismiss({\n constraints = { top: 0, bottom: 0 },\n elastic = { top: 0.05, bottom: 0.5 },\n thresholds = { offsetY: 65, velocityY: 400 },\n interpolation = {\n range: [0, 180] as const,\n opacity: [1, 0.75] as const,\n scale: [1, 0.96] as const,\n },\n} = {}) {\n return Object.freeze({\n constraints: Object.freeze(constraints),\n elastic: Object.freeze(elastic),\n thresholds: Object.freeze(thresholds),\n interpolation: Object.freeze(interpolation),\n });\n}\n","\"use client\";\n\nimport { useContext, type ComponentType } from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore, shallowEqual } from \"@/utils\";\nimport {\n useOptionalMediaActions,\n useOptionalMediaState,\n type MediaActions,\n type MediaState,\n} from \"../media\";\nimport {\n useOptionalLoadingActions,\n useOptionalLoadingState,\n type LoadingActions,\n type LoadingStateWithPage,\n} from \"../loading\";\nimport { useNotificationVisible } from \"../notification\";\nimport {\n type DockActions,\n type DockContextValue,\n type DockState,\n type ErrorActionsProps,\n type GuardActionsProps,\n} from \"./types\";\n\nexport const DockContext = getOrCreateGlobalContext<DockContextValue | null>(\n \"DockContext\",\n null,\n);\n\nexport function useDockState(): DockState {\n const { store } = useRequiredContext(\n DockContext,\n \"useDockState\",\n \"DockProvider\",\n );\n return useStore(store);\n}\n\nexport function useDockSelector<T>(\n selector: (state: DockState) => T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const { store } = useRequiredContext(\n DockContext,\n \"useDockSelector\",\n \"DockProvider\",\n );\n return useStore(store, selector, isEqual);\n}\n\nexport function useDockActions(): DockActions {\n return useRequiredContext(DockContext, \"useDockActions\", \"DockProvider\")\n .actions;\n}\n\nexport function useDockHeight() {\n const dockHeight = useDockSelector((state) => state.dockHeight);\n return { dockHeight, padding: { paddingBottom: `${dockHeight}px` } };\n}\n\nexport const EMPTY_DOCK_STATE: DockState = Object.freeze({\n activeItem: null,\n activeOperation: null,\n activeSurfaceEntry: null,\n activeSurfaceId: null,\n contextActions: [],\n dockContinuity: [],\n dockHeight: 0,\n dockReturnHandoffs: [],\n expanded: false,\n hud: null,\n hudEntries: [],\n isHudActive: false,\n isSurfaceOpen: false,\n locationKey: \"\",\n operations: [],\n pathname: \"\",\n searchQuery: \"\",\n selectionMode: null,\n surfaceLifecycle: \"\",\n surfacePhase: \"\",\n surfaceStack: [],\n});\n\nconst NOOP_DOCK_STORE = createStore<DockState>(EMPTY_DOCK_STATE);\n\nexport function useOptionalDockState(): DockState;\nexport function useOptionalDockState<T>(\n selector: (state: DockState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalDockState<T = DockState>(\n selector?: (state: DockState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(DockContext);\n return useStore(\n ctx?.store ?? NOOP_DOCK_STORE,\n selector as (state: DockState) => T,\n isEqual,\n );\n}\n\nexport function useOptionalDockActions(): DockActions | null {\n const ctx = useContext(DockContext);\n return ctx?.actions ?? null;\n}\n\nexport type DockMediaView = MediaState;\n\nexport function useDockMedia(): DockMediaView {\n return useOptionalMediaState((state) => state, shallowEqual);\n}\n\nexport function useDockHasMedia(): boolean {\n return useOptionalMediaState((state) => state.hasMedia);\n}\n\nexport const useDockMediaActions: () => MediaActions = useOptionalMediaActions;\n\nexport function useDockLoadingState(): LoadingStateWithPage {\n return useOptionalLoadingState();\n}\n\nexport const useDockLoadingActions: () => LoadingActions = useOptionalLoadingActions;\n\nexport const useDockNotificationVisible: () => boolean = useNotificationVisible;\n\nexport const statusActionDefaults: {\n error: ComponentType<ErrorActionsProps> | null;\n guard: ComponentType<GuardActionsProps> | null;\n} = { error: null, guard: null };\n\n","import { MENU_SCREEN_MARGIN } from \"./constants\";\nimport {\n type ContextMenuPosition,\n type ContextMenuResolvedItem,\n} from \"./types\";\n\nexport function joinClassNames(\n ...classes: (string | boolean | null | undefined)[]\n): string {\n return classes.filter(Boolean).join(\" \");\n}\n\nconst SCROLL_LOCK_KEYS = new Set([\n \"ArrowDown\",\n \"ArrowUp\",\n \"End\",\n \"Home\",\n \"PageDown\",\n \"PageUp\",\n \" \",\n \"Spacebar\",\n]);\n\nexport function isScrollLockKey(event: { key: string }): boolean {\n return SCROLL_LOCK_KEYS.has(event.key);\n}\n\nexport function positionMenu(\n menuElement: HTMLElement | null,\n position?: ContextMenuPosition | null,\n): void {\n if (!menuElement) return;\n const { height, width } = menuElement.getBoundingClientRect();\n const maxX = window.innerWidth - width - MENU_SCREEN_MARGIN;\n const maxY = window.innerHeight - height - MENU_SCREEN_MARGIN;\n\n const x = Math.min(Number(position?.x) || 0, maxX);\n const y = Math.min(Number(position?.y) || 0, maxY);\n\n menuElement.style.left = `${Math.round(Math.max(MENU_SCREEN_MARGIN, x))}px`;\n menuElement.style.top = `${Math.round(Math.max(MENU_SCREEN_MARGIN, y))}px`;\n}\n\nexport function getNextActiveIndex(\n items: ContextMenuResolvedItem[],\n current: number,\n direction: 1 | -1,\n): number {\n const count = items.length;\n const start =\n current < 0 ? (direction === 1 ? 0 : count - 1) : current + direction;\n\n for (let step = 0; step < count; step++) {\n const index = (((start + step * direction) % count) + count) % count;\n if (items[index].type === \"action\" && !items[index].disabled) return index;\n }\n return current;\n}\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type RefObject,\n} from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport {\n useModuleRegistration,\n useRegistryEntries,\n type RegistryMetadata,\n} from \"@/kernel\";\nimport { useModuleTheme } from \"@/theme\";\nimport { type DockItem, type DockState, useOptionalDockState } from \"../dock\";\nimport { contextMenuTheme } from \"./constants\";\nimport { ContextMenuContext } from \"./context\";\nimport {\n getNextActiveIndex,\n isScrollLockKey,\n joinClassNames,\n positionMenu,\n} from \"./dom\";\nimport {\n resolveContextMenuPageMeta,\n resolveMenuHeader,\n safeInvoke,\n} from \"./items\";\nimport { prepareMenu, resolveContextMenu } from \"./resolver\";\nimport type {\n ContextMenuActions,\n ContextMenuClassNames,\n ContextMenuConfig,\n ContextMenuContextApi,\n ContextMenuContextValue,\n ContextMenuPageConfig,\n ContextMenuPosition,\n ContextMenuResolvedItem,\n ContextMenuState,\n ContextMenuThemeSlot,\n} from \"./types\";\n\nexport function useContextMenuRegistration(\n config: ContextMenuPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"contextMenu\", config, options);\n}\n\nexport function useContextMenu(\n config?: Partial<ContextMenuConfig> | null,\n options?: RegistryMetadata & { enabled?: boolean },\n): ContextMenuContextApi {\n useContextMenuRegistration(config || null, options);\n const { actions, store } = useRequiredContext(\n ContextMenuContext,\n \"useContextMenu\",\n \"ContextMenuProvider\",\n );\n const state = useStore(store);\n const ctx = useMemo<ContextMenuContextApi>(\n () => ({ ...state, ...actions }),\n [actions, state],\n );\n\n return useMemo(() => {\n if (!config) return ctx;\n return {\n ...ctx,\n bind: (payload?: unknown, configOverride?: Partial<ContextMenuConfig>) =>\n ctx.bind(payload, { ...config, ...configOverride }),\n };\n }, [config, ctx]);\n}\n\nexport function useContextMenuActions(): ContextMenuActions {\n return useRequiredContext(\n ContextMenuContext,\n \"useContextMenuActions\",\n \"ContextMenuProvider\",\n ).actions;\n}\n\nexport function useContextMenuState(): ContextMenuState {\n const { store } = useRequiredContext(\n ContextMenuContext,\n \"useContextMenuState\",\n \"ContextMenuProvider\",\n );\n return useStore(store);\n}\n\nfunction selectDockPageCard(dock: DockState): DockItem | null {\n const card = dock.activeItem;\n return card && !card.isSurface ? card : null;\n}\n\nexport function useContextMenuListener(): void {\n const menus = useRegistryEntries<\"contextMenu\", ContextMenuConfig>(\n \"contextMenu\",\n );\n const dockCard = useOptionalDockState(selectDockPageCard);\n const { openMenu } = useContextMenuActions();\n const pathname = usePathname();\n\n useEffect(() => {\n const handleContextMenu = (event: MouseEvent) => {\n const match = resolveContextMenu(menus, pathname || undefined, event);\n if (!match) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const page = resolveContextMenuPageMeta(dockCard, pathname || \"\");\n const prepared = prepareMenu(\n match.config,\n page ? { ...match.context, page } : match.context,\n event,\n );\n if (!prepared) return;\n\n openMenu({\n config: match.config,\n context: prepared.context,\n items: prepared.items,\n position: { x: event.clientX, y: event.clientY },\n });\n };\n\n document.addEventListener(\"contextmenu\", handleContextMenu, true);\n return () =>\n document.removeEventListener(\"contextmenu\", handleContextMenu, true);\n }, [dockCard, menus, openMenu, pathname]);\n}\n\nexport function useMenuDismissal(\n menuRef: RefObject<HTMLElement | null>,\n onClose: () => void,\n) {\n useEffect(() => {\n const preventScroll = (event: Event) => event.preventDefault();\n const listenerOptions = { capture: true, passive: false };\n\n const handleInteraction = (event: MouseEvent | KeyboardEvent) => {\n const isInside = menuRef.current?.contains(event.target as Node);\n if (event.type === \"keydown\") {\n if ((event as KeyboardEvent).key === \"Escape\") onClose();\n if (!isInside && isScrollLockKey(event as KeyboardEvent)) {\n event.preventDefault();\n }\n } else if (!isInside) {\n onClose();\n }\n };\n\n document.addEventListener(\"mousedown\", handleInteraction, true);\n document.addEventListener(\"keydown\", handleInteraction, true);\n window.addEventListener(\"wheel\", preventScroll, listenerOptions);\n window.addEventListener(\"touchmove\", preventScroll, listenerOptions);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleInteraction, true);\n document.removeEventListener(\"keydown\", handleInteraction, true);\n window.removeEventListener(\"wheel\", preventScroll, true);\n window.removeEventListener(\"touchmove\", preventScroll, true);\n };\n }, [menuRef, onClose]);\n}\n\nexport function useContextMenuContentModel({\n config,\n items,\n menuContext,\n onClose,\n position,\n}: {\n config: ContextMenuConfig;\n items: ContextMenuResolvedItem[];\n menuContext: ContextMenuContextValue;\n onClose: () => void;\n position: ContextMenuPosition;\n}) {\n const menuRef = useRef<HTMLDivElement | null>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const theme = useModuleTheme(contextMenuTheme);\n const classes = useMemo(() => {\n const overrides: ContextMenuClassNames = config.classNames ?? {};\n const merged = { ...theme.slots } as Record<ContextMenuThemeSlot, string>;\n for (const slot of Object.keys(merged) as ContextMenuThemeSlot[]) {\n merged[slot] = joinClassNames(theme.slots[slot], overrides[slot]);\n }\n return merged;\n }, [config.classNames, theme.slots]);\n const header = useMemo(\n () => resolveMenuHeader(config, menuContext),\n [config, menuContext],\n );\n const [activeIndex, setActiveIndex] = useState(-1);\n const [prevItems, setPrevItems] = useState(items);\n if (items !== prevItems) {\n setPrevItems(items);\n setActiveIndex(-1);\n }\n useLayoutEffect(() => {\n itemRefs.current = [];\n positionMenu(menuRef.current, position);\n }, [header, items, position]);\n useEffect(() => {\n const target =\n activeIndex < 0 ? menuRef.current : itemRefs.current[activeIndex];\n target?.focus({ preventScroll: true });\n }, [activeIndex]);\n useMenuDismissal(menuRef, onClose);\n const handleItemSelect = useCallback(\n (\n item: ContextMenuResolvedItem,\n event: ReactMouseEvent | ReactKeyboardEvent,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n if (item.disabled) return;\n\n safeInvoke(item.onSelect || item.onClick, event, menuContext);\n if (item.closeOnSelect !== false) onClose();\n },\n [menuContext, onClose],\n );\n const handleMenuKeyDown = (event: ReactKeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n } else if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n setActiveIndex((current) =>\n getNextActiveIndex(items, current, direction),\n );\n } else if (\n (event.key === \"Enter\" || event.key === \" \") &&\n items[activeIndex]\n ) {\n event.preventDefault();\n handleItemSelect(items[activeIndex], event);\n }\n };\n\n return {\n menuRef,\n itemRefs,\n classes,\n styles: theme.styles,\n header,\n activeIndex,\n setActiveIndex,\n handleItemSelect,\n handleMenuKeyDown,\n };\n}\n","import { type Transition, type Variants } from \"motion/react\";\nimport { DURATION_TOKENS, EASING_CURVES } from \"@/tokens\";\n\nconst CONTEXT_MENU_EASINGS = Object.freeze({\n EMPHASIZED: EASING_CURVES.OUT_EXPO,\n SOFT: EASING_CURVES.OUT_QUINT,\n EXIT: EASING_CURVES.IN_CUBIC,\n});\n\nconst CONTEXT_MENU_TIERS = Object.freeze({\n MICRO: {\n duration: DURATION_TOKENS.FAST,\n distance: 4,\n scaleDelta: 0.008,\n ease: CONTEXT_MENU_EASINGS.EMPHASIZED,\n },\n});\n\nfunction toGpuTransform({\n x = 0,\n y = 0,\n scale = 1,\n}: { x?: number; y?: number; scale?: number } = {}) {\n return `translate3d(${x}px, ${y}px, 0) scale(${scale})`;\n}\n\nexport const CONTEXT_MENU_MICRO_SPRING: Transition = Object.freeze({\n type: \"spring\" as const,\n stiffness: 520,\n damping: 30,\n mass: 0.28,\n});\n\nexport const CONTEXT_MENU_ITEM_TAP = Object.freeze({\n transform: toGpuTransform({\n scale: 0.97,\n }),\n});\n\nexport const menuContentVariants: Variants = Object.freeze({\n hidden: {\n opacity: 0,\n },\n visible: {\n opacity: 1,\n transition: {\n duration: CONTEXT_MENU_TIERS.MICRO.duration,\n ease: CONTEXT_MENU_EASINGS.SOFT,\n delay: 0.04,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: DURATION_TOKENS.MICRO,\n ease: CONTEXT_MENU_EASINGS.EXIT,\n },\n },\n});\n\nexport const menuItemVariants: Variants = Object.freeze({\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n y: CONTEXT_MENU_TIERS.MICRO.distance,\n scale: 0.992,\n }),\n },\n visible: (index = 0) => ({\n opacity: 1,\n transform: toGpuTransform(),\n transition: {\n duration: CONTEXT_MENU_TIERS.MICRO.duration,\n ease: CONTEXT_MENU_EASINGS.EMPHASIZED,\n delay: 0.04 + Math.min(Math.max(Number(index) || 0, 0) * 0.042, 0.21),\n },\n }),\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n y: -3,\n scale: 0.994,\n }),\n transition: {\n duration: DURATION_TOKENS.MICRO,\n ease: CONTEXT_MENU_EASINGS.EXIT,\n },\n },\n});\n\nexport const menuPopVariants: Variants = Object.freeze({\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.96,\n }),\n transformOrigin: \"top left\",\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transformOrigin: \"top left\",\n transition: {\n duration: CONTEXT_MENU_TIERS.MICRO.duration,\n ease: CONTEXT_MENU_EASINGS.EMPHASIZED,\n },\n },\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.98,\n }),\n transformOrigin: \"top left\",\n transition: {\n duration: DURATION_TOKENS.MICRO,\n ease: CONTEXT_MENU_EASINGS.EXIT,\n },\n },\n});\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Icon } from \"@/atoms\";\nimport { isImageIconSource } from \"@/utils\";\nimport {\n useContextMenu,\n useContextMenuContentModel,\n useContextMenuListener,\n} from \"./hooks\";\nimport { joinClassNames } from \"./dom\";\nimport { resolveMenuItems } from \"./items\";\nimport {\n CONTEXT_MENU_ITEM_TAP,\n CONTEXT_MENU_MICRO_SPRING,\n menuContentVariants,\n menuItemVariants,\n menuPopVariants,\n} from \"./motion\";\nimport {\n type ContextMenuClasses,\n type ContextMenuConfig,\n type ContextMenuContextValue,\n type ContextMenuIcon,\n type ContextMenuPosition,\n type ContextMenuResolvedHeader,\n type ContextMenuResolvedItem,\n} from \"./types\";\n\nexport function ContextMenuHeaderIcon({\n classes,\n icon,\n}: {\n classes: ContextMenuClasses;\n icon: ContextMenuIcon;\n}) {\n const iconClassName = classes.headerIcon;\n\n if (isImageIconSource(icon)) {\n return (\n <div\n className={iconClassName}\n style={{ backgroundImage: `url(${icon})` }}\n />\n );\n }\n return (\n <div className={iconClassName}>\n {typeof icon === \"string\" ? <Icon icon={icon} size={20} /> : icon}\n </div>\n );\n}\n\nexport function ContextMenuHeader({\n classes,\n header,\n}: {\n classes: ContextMenuClasses;\n header: ContextMenuResolvedHeader | null;\n}) {\n if (!header) return null;\n\n return (\n <div className={classes.header}>\n {header.icon && (\n <ContextMenuHeaderIcon classes={classes} icon={header.icon} />\n )}\n <div className={classes.headerText}>\n {header.eyebrow && (\n <div className={classes.headerEyebrow}>{header.eyebrow}</div>\n )}\n {header.title && (\n <div className={classes.headerTitle}>{header.title}</div>\n )}\n {header.description && (\n <div className={classes.headerDescription}>{header.description}</div>\n )}\n </div>\n </div>\n );\n}\n\nexport function ContextMenuItem({\n classes,\n isActive,\n item,\n onHover,\n onSelect,\n setButtonRef,\n}: {\n classes: ContextMenuClasses;\n isActive: boolean;\n item: ContextMenuResolvedItem;\n onHover: () => void;\n onSelect: (item: ContextMenuResolvedItem, event: React.MouseEvent) => void;\n setButtonRef: (node: HTMLButtonElement | null) => void;\n}) {\n if (item.type === \"separator\") {\n return <div className={classes.separator} role=\"separator\" />;\n }\n\n const itemClassName = joinClassNames(classes.item, item.className);\n const itemIconClassName = joinClassNames(\n classes.itemIcon,\n item.itemIconClassName,\n );\n\n return (\n <motion.button\n ref={setButtonRef}\n className={itemClassName}\n data-active={isActive ? \"true\" : undefined}\n aria-disabled={item.disabled}\n disabled={item.disabled}\n role=\"menuitem\"\n type=\"button\"\n whileTap={CONTEXT_MENU_ITEM_TAP}\n transition={CONTEXT_MENU_MICRO_SPRING}\n onMouseEnter={onHover}\n onClick={(event) => onSelect(item, event)}\n >\n {item.icon &&\n (typeof item.icon === \"string\" ? (\n <Icon icon={item.icon} className={itemIconClassName} size={18} />\n ) : (\n item.icon\n ))}\n <span className={classes.itemLabel}>{item.label}</span>\n {item.shortcut && (\n <span className={classes.itemShortcut}>{item.shortcut}</span>\n )}\n </motion.button>\n );\n}\n\nconst EMPTY_MENU_CONTEXT: ContextMenuContextValue = Object.freeze({\n pathname: \"\",\n point: { x: 0, y: 0 },\n});\n\nexport function ContextMenuContent({\n config,\n items,\n menuContext,\n onClose,\n position,\n}: {\n config: ContextMenuConfig;\n items: ContextMenuResolvedItem[];\n menuContext: ContextMenuContextValue;\n onClose: () => void;\n position: ContextMenuPosition;\n}) {\n const {\n menuRef,\n itemRefs,\n classes,\n styles,\n header,\n activeIndex,\n setActiveIndex,\n handleItemSelect,\n handleMenuKeyDown,\n } = useContextMenuContentModel({\n config,\n items,\n menuContext,\n onClose,\n position,\n });\n\n return (\n <div>\n <div\n data-context-menu-overlay\n className={classes.backdrop}\n onMouseDown={onClose}\n style={styles.backdrop}\n />\n <motion.div\n ref={menuRef}\n data-context-menu-ignore\n variants={menuPopVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n className={classes.menu}\n role=\"menu\"\n tabIndex={-1}\n style={{\n ...styles.menu,\n left: position.x || 0,\n top: position.y || 0,\n position: \"fixed\",\n }}\n onMouseLeave={() => setActiveIndex(-1)}\n onKeyDown={handleMenuKeyDown}\n >\n <motion.div\n variants={menuContentVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <ContextMenuHeader classes={classes} header={header} />\n </motion.div>\n\n {items.map((item, index) => (\n <motion.div\n key={item.key || `menu-item-${index}`}\n variants={menuItemVariants}\n custom={index}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <ContextMenuItem\n item={item}\n classes={classes}\n isActive={index === activeIndex}\n onHover={() => {\n if (item.type === \"action\" && !item.disabled) {\n setActiveIndex(index);\n }\n }}\n setButtonRef={(node) => {\n itemRefs.current[index] = node;\n }}\n onSelect={handleItemSelect}\n />\n </motion.div>\n ))}\n </motion.div>\n </div>\n );\n}\n\nconst emptySubscribe = () => () => {};\n\nexport function ContextMenuRenderer() {\n const { closeMenu, config, context, isOpen, items, position } =\n useContextMenu();\n const isMounted = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n if (!isMounted) return null;\n\n const menuContext = context ?? EMPTY_MENU_CONTEXT;\n const resolvedItems = items.length\n ? items\n : resolveMenuItems(config, menuContext);\n\n return createPortal(\n <AnimatePresence>\n {isOpen && config && resolvedItems.length > 0 && (\n <ContextMenuContent\n key=\"context-menu-content\"\n config={config}\n items={resolvedItems}\n menuContext={menuContext}\n position={position}\n onClose={closeMenu}\n />\n )}\n </AnimatePresence>,\n document.body,\n );\n}\n\nexport function ContextMenuGlobal() {\n useContextMenuListener();\n return <ContextMenuRenderer />;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport { CURRENT_PAGE_KEY, GLOBAL_MENU_KEY } from \"./constants\";\nimport {\n ContextMenuContext,\n ContextMenuProvider,\n} from \"./context\";\nimport {\n useContextMenu,\n useContextMenuActions,\n} from \"./hooks\";\nimport { ContextMenuGlobal } from \"./overlay\";\nimport {\n type ContextMenuConfig,\n type ContextMenuDefinition,\n type ContextMenuPageApi,\n type ContextMenuPageConfig,\n} from \"./types\";\n\nfunction selectPageContextMenu(\n config: PageConfig,\n): ContextMenuPageConfig | null {\n return config.contextMenu ?? null;\n}\n\nfunction useContextMenuPage(\n _slice: ContextMenuPageConfig | null,\n page: PageModuleApi,\n): ContextMenuPageApi {\n const actions = useContextMenuActions();\n return useMemo(\n () => ({\n ...actions,\n set: (contextMenu: ContextMenuPageConfig | null) =>\n page.set({ contextMenu }),\n }),\n [actions, page],\n );\n}\n\nexport const contextMenuModule = defineModule({\n id: \"contextMenu\",\n context: ContextMenuContext,\n Provider: ContextMenuProvider,\n uses: [\"dock\"],\n Overlay: ContextMenuGlobal,\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"route\",\n lifecycle: \"immediate\",\n reservedKeys: [CURRENT_PAGE_KEY, GLOBAL_MENU_KEY],\n },\n page: {\n select: selectPageContextMenu,\n entries: (slice: ContextMenuPageConfig, { pathname }) => [\n { key: pathname || CURRENT_PAGE_KEY, value: slice },\n ],\n use: useContextMenuPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n contextMenu: typeof contextMenuModule;\n }\n interface PageConfig {\n contextMenu?: ContextMenuPageConfig | null;\n }\n}\n\nexport function defineContextMenu(\n definition: Partial<ContextMenuConfig> = {},\n): ContextMenuDefinition {\n return Object.freeze({\n config: definition,\n id: definition.id ?? \"context-menu\",\n use: function useDefinedContextMenu(options = {}) {\n return useContextMenu({ ...definition, ...options });\n },\n });\n}\n"]}
|