@omerdlw/base-framework 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/atoms/button.d.ts +11 -0
- package/dist/atoms/button.d.ts.map +1 -0
- package/dist/atoms/icon.d.ts +15 -0
- package/dist/atoms/icon.d.ts.map +1 -0
- package/dist/atoms/index.d.ts +6 -0
- package/dist/atoms/index.d.ts.map +1 -0
- package/dist/atoms/index.js +169 -0
- package/dist/atoms/index.js.map +1 -0
- package/dist/atoms/spinner.d.ts +9 -0
- package/dist/atoms/spinner.d.ts.map +1 -0
- package/dist/atoms/tooltip.d.ts +18 -0
- package/dist/atoms/tooltip.d.ts.map +1 -0
- package/dist/error/boundary.d.ts +14 -0
- package/dist/error/boundary.d.ts.map +1 -0
- package/dist/error/constants.d.ts +18 -0
- package/dist/error/constants.d.ts.map +1 -0
- package/dist/error/index.d.ts +9 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +688 -0
- package/dist/error/index.js.map +1 -0
- package/dist/error/listener.d.ts +2 -0
- package/dist/error/listener.d.ts.map +1 -0
- package/dist/error/reporter.d.ts +32 -0
- package/dist/error/reporter.d.ts.map +1 -0
- package/dist/error/theme.d.ts +3 -0
- package/dist/error/theme.d.ts.map +1 -0
- package/dist/error/types.d.ts +91 -0
- package/dist/error/types.d.ts.map +1 -0
- package/dist/error/utils.d.ts +21 -0
- package/dist/error/utils.d.ts.map +1 -0
- package/dist/events.d.ts +51 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +88 -0
- package/dist/events.js.map +1 -0
- package/dist/hooks/index.d.ts +17 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +804 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/types.d.ts +58 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/use-async-action.d.ts +3 -0
- package/dist/hooks/use-async-action.d.ts.map +1 -0
- package/dist/hooks/use-click-outside.d.ts +3 -0
- package/dist/hooks/use-click-outside.d.ts.map +1 -0
- package/dist/hooks/use-controllable-state.d.ts +3 -0
- package/dist/hooks/use-controllable-state.d.ts.map +1 -0
- package/dist/hooks/use-debounce.d.ts +2 -0
- package/dist/hooks/use-debounce.d.ts.map +1 -0
- package/dist/hooks/use-fullscreen-state.d.ts +4 -0
- package/dist/hooks/use-fullscreen-state.d.ts.map +1 -0
- package/dist/hooks/use-global-event.d.ts +7 -0
- package/dist/hooks/use-global-event.d.ts.map +1 -0
- package/dist/hooks/use-hotkey.d.ts +4 -0
- package/dist/hooks/use-hotkey.d.ts.map +1 -0
- package/dist/hooks/use-intersection-observer.d.ts +4 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/hooks/use-isomorphic-layout-effect.d.ts +3 -0
- package/dist/hooks/use-isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/hooks/use-media-query.d.ts +2 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/hooks/use-mounted.d.ts +2 -0
- package/dist/hooks/use-mounted.d.ts.map +1 -0
- package/dist/hooks/use-required-context.d.ts +3 -0
- package/dist/hooks/use-required-context.d.ts.map +1 -0
- package/dist/hooks/use-server-action.d.ts +4 -0
- package/dist/hooks/use-server-action.d.ts.map +1 -0
- package/dist/hooks/use-storage-state.d.ts +5 -0
- package/dist/hooks/use-storage-state.d.ts.map +1 -0
- package/dist/hooks/use-store.d.ts +3 -0
- package/dist/hooks/use-store.d.ts.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20415 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/adapters.d.ts +5 -0
- package/dist/kernel/adapters.d.ts.map +1 -0
- package/dist/kernel/compose.d.ts +15 -0
- package/dist/kernel/compose.d.ts.map +1 -0
- package/dist/kernel/constants.d.ts +12 -0
- package/dist/kernel/constants.d.ts.map +1 -0
- package/dist/kernel/context-registry.d.ts +3 -0
- package/dist/kernel/context-registry.d.ts.map +1 -0
- package/dist/kernel/handlers.d.ts +3 -0
- package/dist/kernel/handlers.d.ts.map +1 -0
- package/dist/kernel/hooks.d.ts +7 -0
- package/dist/kernel/hooks.d.ts.map +1 -0
- package/dist/kernel/index.d.ts +14 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +2109 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/installed.d.ts +21 -0
- package/dist/kernel/installed.d.ts.map +1 -0
- package/dist/kernel/module.d.ts +32 -0
- package/dist/kernel/module.d.ts.map +1 -0
- package/dist/kernel/operations.d.ts +21 -0
- package/dist/kernel/operations.d.ts.map +1 -0
- package/dist/kernel/page-controller.d.ts +8 -0
- package/dist/kernel/page-controller.d.ts.map +1 -0
- package/dist/kernel/provider.d.ts +18 -0
- package/dist/kernel/provider.d.ts.map +1 -0
- package/dist/kernel/runtime.d.ts +30 -0
- package/dist/kernel/runtime.d.ts.map +1 -0
- package/dist/kernel/schema.d.ts +13 -0
- package/dist/kernel/schema.d.ts.map +1 -0
- package/dist/kernel/store.d.ts +4 -0
- package/dist/kernel/store.d.ts.map +1 -0
- package/dist/kernel/types.d.ts +233 -0
- package/dist/kernel/types.d.ts.map +1 -0
- package/dist/kernel/utils.d.ts +20 -0
- package/dist/kernel/utils.d.ts.map +1 -0
- package/dist/modules/ambient/constants.d.ts +23 -0
- package/dist/modules/ambient/constants.d.ts.map +1 -0
- package/dist/modules/ambient/context.d.ts +10 -0
- package/dist/modules/ambient/context.d.ts.map +1 -0
- package/dist/modules/ambient/index.d.ts +6 -0
- package/dist/modules/ambient/index.d.ts.map +1 -0
- package/dist/modules/ambient/index.js +896 -0
- package/dist/modules/ambient/index.js.map +1 -0
- package/dist/modules/ambient/module.d.ts +12 -0
- package/dist/modules/ambient/module.d.ts.map +1 -0
- package/dist/modules/ambient/types.d.ts +84 -0
- package/dist/modules/ambient/types.d.ts.map +1 -0
- package/dist/modules/ambient/utils.d.ts +18 -0
- package/dist/modules/ambient/utils.d.ts.map +1 -0
- package/dist/modules/background/constants.d.ts +12 -0
- package/dist/modules/background/constants.d.ts.map +1 -0
- package/dist/modules/background/context.d.ts +13 -0
- package/dist/modules/background/context.d.ts.map +1 -0
- package/dist/modules/background/hooks.d.ts +119 -0
- package/dist/modules/background/hooks.d.ts.map +1 -0
- package/dist/modules/background/index.d.ts +7 -0
- package/dist/modules/background/index.d.ts.map +1 -0
- package/dist/modules/background/index.js +3195 -0
- package/dist/modules/background/index.js.map +1 -0
- package/dist/modules/background/module.d.ts +14 -0
- package/dist/modules/background/module.d.ts.map +1 -0
- package/dist/modules/background/motion.d.ts +13 -0
- package/dist/modules/background/motion.d.ts.map +1 -0
- package/dist/modules/background/overlay.d.ts +49 -0
- package/dist/modules/background/overlay.d.ts.map +1 -0
- package/dist/modules/background/types.d.ts +153 -0
- package/dist/modules/background/types.d.ts.map +1 -0
- package/dist/modules/background/utils.d.ts +56 -0
- package/dist/modules/background/utils.d.ts.map +1 -0
- package/dist/modules/background/youtube/iframe.d.ts +52 -0
- package/dist/modules/background/youtube/iframe.d.ts.map +1 -0
- package/dist/modules/background/youtube/parse.d.ts +17 -0
- package/dist/modules/background/youtube/parse.d.ts.map +1 -0
- package/dist/modules/context-menu/constants.d.ts +8 -0
- package/dist/modules/context-menu/constants.d.ts.map +1 -0
- package/dist/modules/context-menu/context.d.ts +16 -0
- package/dist/modules/context-menu/context.d.ts.map +1 -0
- package/dist/modules/context-menu/hooks.d.ts +31 -0
- package/dist/modules/context-menu/hooks.d.ts.map +1 -0
- package/dist/modules/context-menu/index.d.ts +6 -0
- package/dist/modules/context-menu/index.d.ts.map +1 -0
- package/dist/modules/context-menu/index.js +2008 -0
- package/dist/modules/context-menu/index.js.map +1 -0
- package/dist/modules/context-menu/module.d.ts +12 -0
- package/dist/modules/context-menu/module.d.ts.map +1 -0
- package/dist/modules/context-menu/motion.d.ts +9 -0
- package/dist/modules/context-menu/motion.d.ts.map +1 -0
- package/dist/modules/context-menu/overlay.d.ts +15 -0
- package/dist/modules/context-menu/overlay.d.ts.map +1 -0
- package/dist/modules/context-menu/resolver.d.ts +7 -0
- package/dist/modules/context-menu/resolver.d.ts.map +1 -0
- package/dist/modules/context-menu/state.d.ts +4 -0
- package/dist/modules/context-menu/state.d.ts.map +1 -0
- package/dist/modules/context-menu/types.d.ts +171 -0
- package/dist/modules/context-menu/types.d.ts.map +1 -0
- package/dist/modules/context-menu/utils.d.ts +16 -0
- package/dist/modules/context-menu/utils.d.ts.map +1 -0
- package/dist/modules/controls/constants.d.ts +7 -0
- package/dist/modules/controls/constants.d.ts.map +1 -0
- package/dist/modules/controls/hooks.d.ts +15 -0
- package/dist/modules/controls/hooks.d.ts.map +1 -0
- package/dist/modules/controls/index.d.ts +6 -0
- package/dist/modules/controls/index.d.ts.map +1 -0
- package/dist/modules/controls/index.js +1242 -0
- package/dist/modules/controls/index.js.map +1 -0
- package/dist/modules/controls/module.d.ts +12 -0
- package/dist/modules/controls/module.d.ts.map +1 -0
- package/dist/modules/controls/overlay.d.ts +2 -0
- package/dist/modules/controls/overlay.d.ts.map +1 -0
- package/dist/modules/controls/types.d.ts +86 -0
- package/dist/modules/controls/types.d.ts.map +1 -0
- package/dist/modules/controls/utils.d.ts +9 -0
- package/dist/modules/controls/utils.d.ts.map +1 -0
- package/dist/modules/dock/cards.d.ts +1035 -0
- package/dist/modules/dock/cards.d.ts.map +1 -0
- package/dist/modules/dock/constants.d.ts +157 -0
- package/dist/modules/dock/constants.d.ts.map +1 -0
- package/dist/modules/dock/context.d.ts +26 -0
- package/dist/modules/dock/context.d.ts.map +1 -0
- package/dist/modules/dock/hooks.d.ts +957 -0
- package/dist/modules/dock/hooks.d.ts.map +1 -0
- package/dist/modules/dock/hud.d.ts +43 -0
- package/dist/modules/dock/hud.d.ts.map +1 -0
- package/dist/modules/dock/index.d.ts +27 -0
- package/dist/modules/dock/index.d.ts.map +1 -0
- package/dist/modules/dock/index.js +12111 -0
- package/dist/modules/dock/index.js.map +1 -0
- package/dist/modules/dock/module.d.ts +71 -0
- package/dist/modules/dock/module.d.ts.map +1 -0
- package/dist/modules/dock/motion.d.ts +986 -0
- package/dist/modules/dock/motion.d.ts.map +1 -0
- package/dist/modules/dock/overlay.d.ts +79 -0
- package/dist/modules/dock/overlay.d.ts.map +1 -0
- package/dist/modules/dock/provider.d.ts +3 -0
- package/dist/modules/dock/provider.d.ts.map +1 -0
- package/dist/modules/dock/routing/breadcrumbs.d.ts +43 -0
- package/dist/modules/dock/routing/breadcrumbs.d.ts.map +1 -0
- package/dist/modules/dock/routing/continuity.d.ts +19 -0
- package/dist/modules/dock/routing/continuity.d.ts.map +1 -0
- package/dist/modules/dock/routing/guards.d.ts +21 -0
- package/dist/modules/dock/routing/guards.d.ts.map +1 -0
- package/dist/modules/dock/routing/navigation.d.ts +37 -0
- package/dist/modules/dock/routing/navigation.d.ts.map +1 -0
- package/dist/modules/dock/routing/transactions.d.ts +21 -0
- package/dist/modules/dock/routing/transactions.d.ts.map +1 -0
- package/dist/modules/dock/runtime/commands.d.ts +18 -0
- package/dist/modules/dock/runtime/commands.d.ts.map +1 -0
- package/dist/modules/dock/runtime/display.d.ts +36 -0
- package/dist/modules/dock/runtime/display.d.ts.map +1 -0
- package/dist/modules/dock/runtime/dock.d.ts +123 -0
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -0
- package/dist/modules/dock/state.d.ts +22 -0
- package/dist/modules/dock/state.d.ts.map +1 -0
- package/dist/modules/dock/status/events.d.ts +37 -0
- package/dist/modules/dock/status/events.d.ts.map +1 -0
- package/dist/modules/dock/status/hooks.d.ts +6 -0
- package/dist/modules/dock/status/hooks.d.ts.map +1 -0
- package/dist/modules/dock/status/model.d.ts +65 -0
- package/dist/modules/dock/status/model.d.ts.map +1 -0
- package/dist/modules/dock/surface/context.d.ts +43 -0
- package/dist/modules/dock/surface/context.d.ts.map +1 -0
- package/dist/modules/dock/surface/definition.d.ts +38 -0
- package/dist/modules/dock/surface/definition.d.ts.map +1 -0
- package/dist/modules/dock/surface/hooks.d.ts +123 -0
- package/dist/modules/dock/surface/hooks.d.ts.map +1 -0
- package/dist/modules/dock/surface/machine.d.ts +75 -0
- package/dist/modules/dock/surface/machine.d.ts.map +1 -0
- package/dist/modules/dock/surface/stack.d.ts +38 -0
- package/dist/modules/dock/surface/stack.d.ts.map +1 -0
- package/dist/modules/dock/surface/view-model.d.ts +3 -0
- package/dist/modules/dock/surface/view-model.d.ts.map +1 -0
- package/dist/modules/dock/types.d.ts +1158 -0
- package/dist/modules/dock/types.d.ts.map +1 -0
- package/dist/modules/dock/utils.d.ts +93 -0
- package/dist/modules/dock/utils.d.ts.map +1 -0
- package/dist/modules/index.d.ts +12 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +18020 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/loading/constants.d.ts +5 -0
- package/dist/modules/loading/constants.d.ts.map +1 -0
- package/dist/modules/loading/context.d.ts +13 -0
- package/dist/modules/loading/context.d.ts.map +1 -0
- package/dist/modules/loading/hooks.d.ts +6 -0
- package/dist/modules/loading/hooks.d.ts.map +1 -0
- package/dist/modules/loading/index.d.ts +7 -0
- package/dist/modules/loading/index.d.ts.map +1 -0
- package/dist/modules/loading/index.js +1256 -0
- package/dist/modules/loading/index.js.map +1 -0
- package/dist/modules/loading/module.d.ts +14 -0
- package/dist/modules/loading/module.d.ts.map +1 -0
- package/dist/modules/loading/overlay.d.ts +2 -0
- package/dist/modules/loading/overlay.d.ts.map +1 -0
- package/dist/modules/loading/types.d.ts +47 -0
- package/dist/modules/loading/types.d.ts.map +1 -0
- package/dist/modules/loading/utils.d.ts +4 -0
- package/dist/modules/loading/utils.d.ts.map +1 -0
- package/dist/modules/media/constants.d.ts +7 -0
- package/dist/modules/media/constants.d.ts.map +1 -0
- package/dist/modules/media/context.d.ts +6 -0
- package/dist/modules/media/context.d.ts.map +1 -0
- package/dist/modules/media/hooks.d.ts +3 -0
- package/dist/modules/media/hooks.d.ts.map +1 -0
- package/dist/modules/media/index.d.ts +8 -0
- package/dist/modules/media/index.d.ts.map +1 -0
- package/dist/modules/media/index.js +728 -0
- package/dist/modules/media/index.js.map +1 -0
- package/dist/modules/media/module.d.ts +11 -0
- package/dist/modules/media/module.d.ts.map +1 -0
- package/dist/modules/media/overlay.d.ts +9 -0
- package/dist/modules/media/overlay.d.ts.map +1 -0
- package/dist/modules/media/types.d.ts +77 -0
- package/dist/modules/media/types.d.ts.map +1 -0
- package/dist/modules/media/utils.d.ts +17 -0
- package/dist/modules/media/utils.d.ts.map +1 -0
- package/dist/modules/modal/constants.d.ts +20 -0
- package/dist/modules/modal/constants.d.ts.map +1 -0
- package/dist/modules/modal/context.d.ts +20 -0
- package/dist/modules/modal/context.d.ts.map +1 -0
- package/dist/modules/modal/hooks.d.ts +41 -0
- package/dist/modules/modal/hooks.d.ts.map +1 -0
- package/dist/modules/modal/index.d.ts +7 -0
- package/dist/modules/modal/index.d.ts.map +1 -0
- package/dist/modules/modal/index.js +2672 -0
- package/dist/modules/modal/index.js.map +1 -0
- package/dist/modules/modal/module.d.ts +12 -0
- package/dist/modules/modal/module.d.ts.map +1 -0
- package/dist/modules/modal/motion.d.ts +16 -0
- package/dist/modules/modal/motion.d.ts.map +1 -0
- package/dist/modules/modal/overlay.d.ts +4 -0
- package/dist/modules/modal/overlay.d.ts.map +1 -0
- package/dist/modules/modal/state.d.ts +4 -0
- package/dist/modules/modal/state.d.ts.map +1 -0
- package/dist/modules/modal/types.d.ts +109 -0
- package/dist/modules/modal/types.d.ts.map +1 -0
- package/dist/modules/modal/utils.d.ts +31 -0
- package/dist/modules/modal/utils.d.ts.map +1 -0
- package/dist/modules/notification/constants.d.ts +9 -0
- package/dist/modules/notification/constants.d.ts.map +1 -0
- package/dist/modules/notification/context.d.ts +7 -0
- package/dist/modules/notification/context.d.ts.map +1 -0
- package/dist/modules/notification/hooks.d.ts +10 -0
- package/dist/modules/notification/hooks.d.ts.map +1 -0
- package/dist/modules/notification/index.d.ts +7 -0
- package/dist/modules/notification/index.d.ts.map +1 -0
- package/dist/modules/notification/index.js +905 -0
- package/dist/modules/notification/index.js.map +1 -0
- package/dist/modules/notification/module.d.ts +11 -0
- package/dist/modules/notification/module.d.ts.map +1 -0
- package/dist/modules/notification/motion.d.ts +15 -0
- package/dist/modules/notification/motion.d.ts.map +1 -0
- package/dist/modules/notification/overlay.d.ts +3 -0
- package/dist/modules/notification/overlay.d.ts.map +1 -0
- package/dist/modules/notification/types.d.ts +57 -0
- package/dist/modules/notification/types.d.ts.map +1 -0
- package/dist/modules/notification/utils.d.ts +9 -0
- package/dist/modules/notification/utils.d.ts.map +1 -0
- package/dist/modules/theme.d.ts +3 -0
- package/dist/modules/theme.d.ts.map +1 -0
- package/dist/provider.d.ts +23 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +1973 -0
- package/dist/provider.js.map +1 -0
- package/dist/result.d.ts +50 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +163 -0
- package/dist/result.js.map +1 -0
- package/dist/theme.d.ts +25 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +44 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens/index.d.ts +3 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +325 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/motion.d.ts +315 -0
- package/dist/tokens/motion.d.ts.map +1 -0
- package/dist/tokens/tokens.d.ts +34 -0
- package/dist/tokens/tokens.d.ts.map +1 -0
- package/dist/utils/cn.d.ts +3 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/dom.d.ts +5 -0
- package/dist/utils/dom.d.ts.map +1 -0
- package/dist/utils/index.d.ts +16 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +485 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/number.d.ts +4 -0
- package/dist/utils/number.d.ts.map +1 -0
- package/dist/utils/object.d.ts +7 -0
- package/dist/utils/object.d.ts.map +1 -0
- package/dist/utils/report.d.ts +5 -0
- package/dist/utils/report.d.ts.map +1 -0
- package/dist/utils/scheduler.d.ts +34 -0
- package/dist/utils/scheduler.d.ts.map +1 -0
- package/dist/utils/store.d.ts +11 -0
- package/dist/utils/store.d.ts.map +1 -0
- package/dist/utils/string.d.ts +8 -0
- package/dist/utils/string.d.ts.map +1 -0
- package/dist/utils/timing.d.ts +8 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/user-message.d.ts +20 -0
- package/dist/utils/user-message.d.ts.map +1 -0
- package/package.json +113 -0
|
@@ -0,0 +1,1256 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Icon as Icon$1 } from '@iconify-icon/react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
import '@radix-ui/react-tooltip';
|
|
5
|
+
import { createContext, useState, useRef, useCallback, useEffect, useMemo, useSyncExternalStore, useLayoutEffect, use, useId, useContext, isValidElement, cloneElement, Children } from 'react';
|
|
6
|
+
import 'clsx';
|
|
7
|
+
import 'tailwind-merge';
|
|
8
|
+
import { usePathname } from 'next/navigation';
|
|
9
|
+
|
|
10
|
+
function Icon({
|
|
11
|
+
className = "center",
|
|
12
|
+
color,
|
|
13
|
+
icon,
|
|
14
|
+
onClick,
|
|
15
|
+
size = 20,
|
|
16
|
+
style,
|
|
17
|
+
...props
|
|
18
|
+
}) {
|
|
19
|
+
return /* @__PURE__ */ jsx(
|
|
20
|
+
Icon$1,
|
|
21
|
+
{
|
|
22
|
+
className,
|
|
23
|
+
height: size,
|
|
24
|
+
icon,
|
|
25
|
+
onClick,
|
|
26
|
+
style: { color, ...style },
|
|
27
|
+
width: size,
|
|
28
|
+
...props
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
Icon.displayName = "Icon";
|
|
33
|
+
function Spinner({ className = "", size = 15 }) {
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
className,
|
|
38
|
+
"aria-label": "Loading",
|
|
39
|
+
role: "status",
|
|
40
|
+
children: /* @__PURE__ */ jsx(Icon, { icon: "mingcute:loading-3-fill", size })
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
Spinner.displayName = "Spinner";
|
|
45
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
46
|
+
var activeFullscreenStateIds = /* @__PURE__ */ new Set();
|
|
47
|
+
var ACTIVE_FULLSCREEN_ROOT_SELECTOR = '[data-fullscreen-state-root="true"][data-affect-global-state="true"]';
|
|
48
|
+
var domObserver = null;
|
|
49
|
+
var lastSnapshot = false;
|
|
50
|
+
function getDomSnapshot() {
|
|
51
|
+
if (typeof document === "undefined") {
|
|
52
|
+
return activeFullscreenStateIds.size > 0;
|
|
53
|
+
}
|
|
54
|
+
return document.querySelector(ACTIVE_FULLSCREEN_ROOT_SELECTOR) !== null;
|
|
55
|
+
}
|
|
56
|
+
function emitChange() {
|
|
57
|
+
listeners.forEach((listener) => listener());
|
|
58
|
+
}
|
|
59
|
+
function emitIfSnapshotChanged() {
|
|
60
|
+
const nextSnapshot = getDomSnapshot();
|
|
61
|
+
if (nextSnapshot === lastSnapshot) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
lastSnapshot = nextSnapshot;
|
|
65
|
+
emitChange();
|
|
66
|
+
}
|
|
67
|
+
function ensureDomObserver() {
|
|
68
|
+
if (typeof document === "undefined" || domObserver || listeners.size === 0) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
domObserver = new MutationObserver(() => {
|
|
72
|
+
emitIfSnapshotChanged();
|
|
73
|
+
});
|
|
74
|
+
domObserver.observe(document.documentElement, {
|
|
75
|
+
attributes: true,
|
|
76
|
+
childList: true,
|
|
77
|
+
subtree: true,
|
|
78
|
+
attributeFilter: [
|
|
79
|
+
"data-fullscreen-state",
|
|
80
|
+
"data-fullscreen-state-root",
|
|
81
|
+
"data-affect-global-state"
|
|
82
|
+
]
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function releaseDomObserver() {
|
|
86
|
+
if (listeners.size > 0 || !domObserver) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
domObserver.disconnect();
|
|
90
|
+
domObserver = null;
|
|
91
|
+
}
|
|
92
|
+
function subscribe(listener) {
|
|
93
|
+
listeners.add(listener);
|
|
94
|
+
ensureDomObserver();
|
|
95
|
+
emitIfSnapshotChanged();
|
|
96
|
+
return () => {
|
|
97
|
+
listeners.delete(listener);
|
|
98
|
+
releaseDomObserver();
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function getSnapshot() {
|
|
102
|
+
return getDomSnapshot();
|
|
103
|
+
}
|
|
104
|
+
function useIsFullscreenStateActive() {
|
|
105
|
+
return useSyncExternalStore(subscribe, getSnapshot, () => false);
|
|
106
|
+
}
|
|
107
|
+
function getOrCreateGlobalContext(name, defaultValue) {
|
|
108
|
+
const sym = /* @__PURE__ */ Symbol.for(`@omerdlw/base-framework/context/${name}`);
|
|
109
|
+
const store = globalThis;
|
|
110
|
+
if (!store[sym]) {
|
|
111
|
+
store[sym] = createContext(defaultValue);
|
|
112
|
+
}
|
|
113
|
+
return store[sym];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// src/theme.tsx
|
|
117
|
+
function defineThemeSpec(id) {
|
|
118
|
+
return Object.freeze({ id });
|
|
119
|
+
}
|
|
120
|
+
var EMPTY = /* @__PURE__ */ new Map();
|
|
121
|
+
var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
|
|
122
|
+
function useTheme(spec) {
|
|
123
|
+
const config = useContext(ThemeContext).get(spec.id);
|
|
124
|
+
if (!config) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
`Theme "${spec.id}" is missing. Add its theme file to src/config/ and list it in src/config/index.ts.`
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
slots: config.slots,
|
|
131
|
+
styles: config.styles ?? {}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function useRequiredContext(context, hookName, providerName) {
|
|
135
|
+
const value = use(context);
|
|
136
|
+
if (value === null) {
|
|
137
|
+
throw new Error(`${hookName} must be used within ${providerName}`);
|
|
138
|
+
}
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
function useStore(store, selector = (state) => state, isEqual = Object.is) {
|
|
142
|
+
const cacheRef = useRef({
|
|
143
|
+
isEqual: null,
|
|
144
|
+
selected: void 0,
|
|
145
|
+
selector: null,
|
|
146
|
+
snapshot: null
|
|
147
|
+
});
|
|
148
|
+
const getSelectedSnapshot = useCallback(() => {
|
|
149
|
+
const snapshot = store.getSnapshot();
|
|
150
|
+
const cache = cacheRef.current;
|
|
151
|
+
if (cache.snapshot === snapshot && cache.selector === selector && cache.isEqual === isEqual) {
|
|
152
|
+
return cache.selected;
|
|
153
|
+
}
|
|
154
|
+
const selected = selector(snapshot);
|
|
155
|
+
if (cache.snapshot !== null && cache.isEqual === isEqual && isEqual(cache.selected, selected)) {
|
|
156
|
+
cache.snapshot = snapshot;
|
|
157
|
+
cache.selector = selector;
|
|
158
|
+
return cache.selected;
|
|
159
|
+
}
|
|
160
|
+
cacheRef.current = {
|
|
161
|
+
isEqual,
|
|
162
|
+
selected,
|
|
163
|
+
selector,
|
|
164
|
+
snapshot
|
|
165
|
+
};
|
|
166
|
+
return selected;
|
|
167
|
+
}, [isEqual, selector, store]);
|
|
168
|
+
return useSyncExternalStore(
|
|
169
|
+
store.subscribe,
|
|
170
|
+
getSelectedSnapshot,
|
|
171
|
+
getSelectedSnapshot
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// src/utils/string.ts
|
|
176
|
+
function trimToNull(value) {
|
|
177
|
+
if (value === null || value === void 0) return null;
|
|
178
|
+
const trimmed = String(value).trim();
|
|
179
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/utils/dom.ts
|
|
183
|
+
var isBrowser = typeof window !== "undefined";
|
|
184
|
+
|
|
185
|
+
// src/utils/object.ts
|
|
186
|
+
function isObject(value) {
|
|
187
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
188
|
+
}
|
|
189
|
+
function report(scope, error, level = "error") {
|
|
190
|
+
if (process.env.NODE_ENV === "production" && typeof window !== "undefined") {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
console[level](`[${scope}]`, error);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// src/utils/store.ts
|
|
197
|
+
function freezeStoreSnapshot(state) {
|
|
198
|
+
if (process.env.NODE_ENV === "production" || !state || typeof state !== "object") {
|
|
199
|
+
return state;
|
|
200
|
+
}
|
|
201
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
202
|
+
const freeze = (value) => {
|
|
203
|
+
if (seen.has(value) || Object.isFrozen(value)) return;
|
|
204
|
+
seen.add(value);
|
|
205
|
+
const prototype = Object.getPrototypeOf(value);
|
|
206
|
+
if (Array.isArray(value) || prototype === Object.prototype || prototype === null) {
|
|
207
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
208
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
209
|
+
if (descriptor && "value" in descriptor && descriptor.value !== null) {
|
|
210
|
+
if (typeof descriptor.value === "object") freeze(descriptor.value);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
Object.freeze(value);
|
|
215
|
+
};
|
|
216
|
+
freeze(state);
|
|
217
|
+
return state;
|
|
218
|
+
}
|
|
219
|
+
function createStore(initialState, { freezeSnapshots = true } = {}) {
|
|
220
|
+
const listeners2 = /* @__PURE__ */ new Set();
|
|
221
|
+
const prepare = freezeSnapshots ? freezeStoreSnapshot : (state) => state;
|
|
222
|
+
let snapshot = prepare(initialState);
|
|
223
|
+
const publish = (nextStateOrUpdater) => {
|
|
224
|
+
const nextState = typeof nextStateOrUpdater === "function" ? nextStateOrUpdater(snapshot) : nextStateOrUpdater;
|
|
225
|
+
if (Object.is(snapshot, nextState)) return false;
|
|
226
|
+
snapshot = prepare(nextState);
|
|
227
|
+
for (const listener of listeners2) {
|
|
228
|
+
try {
|
|
229
|
+
listener();
|
|
230
|
+
} catch (error) {
|
|
231
|
+
report("CoreStore subscriber", error, "warn");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return true;
|
|
235
|
+
};
|
|
236
|
+
const setState = (updater) => {
|
|
237
|
+
if (typeof updater === "function") {
|
|
238
|
+
return publish(updater);
|
|
239
|
+
}
|
|
240
|
+
if (snapshot && typeof snapshot === "object" && updater && typeof updater === "object") {
|
|
241
|
+
return publish({ ...snapshot, ...updater });
|
|
242
|
+
}
|
|
243
|
+
return publish(updater);
|
|
244
|
+
};
|
|
245
|
+
return Object.freeze({
|
|
246
|
+
getSnapshot() {
|
|
247
|
+
return snapshot;
|
|
248
|
+
},
|
|
249
|
+
publish,
|
|
250
|
+
setState,
|
|
251
|
+
subscribe(listener) {
|
|
252
|
+
if (typeof listener !== "function") return () => {
|
|
253
|
+
};
|
|
254
|
+
listeners2.add(listener);
|
|
255
|
+
return () => listeners2.delete(listener);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// src/hooks/use-isomorphic-layout-effect.ts
|
|
261
|
+
var useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;
|
|
262
|
+
var EventEmitter = class {
|
|
263
|
+
events = /* @__PURE__ */ new Map();
|
|
264
|
+
debounceTimers = /* @__PURE__ */ new Map();
|
|
265
|
+
subscribe(event, callback) {
|
|
266
|
+
if (typeof event !== "string" || !event || typeof callback !== "function") {
|
|
267
|
+
return () => {
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const listeners2 = this.events.get(event) || /* @__PURE__ */ new Set();
|
|
271
|
+
listeners2.add(callback);
|
|
272
|
+
this.events.set(event, listeners2);
|
|
273
|
+
return () => {
|
|
274
|
+
listeners2.delete(callback);
|
|
275
|
+
if (listeners2.size === 0) this.events.delete(event);
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
emit(event, payload) {
|
|
279
|
+
const listeners2 = this.events.get(event);
|
|
280
|
+
if (!listeners2 || listeners2.size === 0) return;
|
|
281
|
+
const snapshot = Array.from(listeners2);
|
|
282
|
+
for (const callback of snapshot) {
|
|
283
|
+
try {
|
|
284
|
+
callback(payload);
|
|
285
|
+
} catch (error) {
|
|
286
|
+
report(`Event listener (${String(event)})`, error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
emitDebounced(event, payload, waitMs = 100) {
|
|
291
|
+
const existing = this.debounceTimers.get(event);
|
|
292
|
+
if (existing) clearTimeout(existing);
|
|
293
|
+
const timer = setTimeout(() => {
|
|
294
|
+
this.debounceTimers.delete(event);
|
|
295
|
+
this.emit(event, payload);
|
|
296
|
+
}, waitMs);
|
|
297
|
+
this.debounceTimers.set(event, timer);
|
|
298
|
+
}
|
|
299
|
+
cancelDebounced(event) {
|
|
300
|
+
if (event) {
|
|
301
|
+
const timer = this.debounceTimers.get(event);
|
|
302
|
+
if (timer) {
|
|
303
|
+
clearTimeout(timer);
|
|
304
|
+
this.debounceTimers.delete(event);
|
|
305
|
+
}
|
|
306
|
+
} else {
|
|
307
|
+
for (const timer of this.debounceTimers.values()) {
|
|
308
|
+
clearTimeout(timer);
|
|
309
|
+
}
|
|
310
|
+
this.debounceTimers.clear();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
unsubscribeAll(event) {
|
|
314
|
+
this.cancelDebounced(event);
|
|
315
|
+
if (event) this.events.delete(event);
|
|
316
|
+
else this.events.clear();
|
|
317
|
+
}
|
|
318
|
+
hasListeners(event) {
|
|
319
|
+
return Boolean(this.events.get(event)?.size);
|
|
320
|
+
}
|
|
321
|
+
getListenerCount(event) {
|
|
322
|
+
return this.events.get(event)?.size || 0;
|
|
323
|
+
}
|
|
324
|
+
getAllEvents() {
|
|
325
|
+
return [...this.events.keys()];
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
var GLOBAL_EVENTS_KEY = /* @__PURE__ */ Symbol.for("__base_framework_global_events__");
|
|
329
|
+
var _global = globalThis;
|
|
330
|
+
_global[GLOBAL_EVENTS_KEY] ?? (_global[GLOBAL_EVENTS_KEY] = new EventEmitter());
|
|
331
|
+
|
|
332
|
+
// src/kernel/constants.ts
|
|
333
|
+
var DEFAULT_SOURCE = "dynamic";
|
|
334
|
+
var REGISTRY_SOURCES = Object.freeze({
|
|
335
|
+
STATIC: "static",
|
|
336
|
+
DYNAMIC: "dynamic",
|
|
337
|
+
USER: "user"
|
|
338
|
+
});
|
|
339
|
+
var REGISTRY_LIFECYCLES = Object.freeze({
|
|
340
|
+
IMMEDIATE: "immediate",
|
|
341
|
+
GRACEFUL: "graceful",
|
|
342
|
+
PERSISTENT: "persistent",
|
|
343
|
+
ROUTE: "route"
|
|
344
|
+
});
|
|
345
|
+
var REGISTRY_VALIDATION_MODES = Object.freeze({
|
|
346
|
+
WARN: "warn",
|
|
347
|
+
STRICT: "strict"
|
|
348
|
+
});
|
|
349
|
+
var REGISTRY_METADATA_KEYS = Object.freeze([
|
|
350
|
+
"cleanup",
|
|
351
|
+
"cleanupDelayMs",
|
|
352
|
+
"instanceId",
|
|
353
|
+
"lifecycle",
|
|
354
|
+
"priority",
|
|
355
|
+
"source",
|
|
356
|
+
"scope",
|
|
357
|
+
"validation"
|
|
358
|
+
]);
|
|
359
|
+
Object.freeze({
|
|
360
|
+
[REGISTRY_SOURCES.STATIC]: 100,
|
|
361
|
+
[REGISTRY_SOURCES.DYNAMIC]: 200,
|
|
362
|
+
[REGISTRY_SOURCES.USER]: 300
|
|
363
|
+
});
|
|
364
|
+
Object.freeze({
|
|
365
|
+
[REGISTRY_SOURCES.STATIC]: 10,
|
|
366
|
+
[REGISTRY_SOURCES.DYNAMIC]: 20,
|
|
367
|
+
[REGISTRY_SOURCES.USER]: 30
|
|
368
|
+
});
|
|
369
|
+
var REGISTRY_LIFECYCLE_VALUES = new Set(
|
|
370
|
+
Object.values(REGISTRY_LIFECYCLES)
|
|
371
|
+
);
|
|
372
|
+
var REGISTRY_METADATA_KEY_SET = new Set(
|
|
373
|
+
REGISTRY_METADATA_KEYS
|
|
374
|
+
);
|
|
375
|
+
var REGISTRY_SCOPE_KINDS = Object.freeze({
|
|
376
|
+
APP: "app",
|
|
377
|
+
SESSION: "session",
|
|
378
|
+
ROUTE: "route",
|
|
379
|
+
INSTANCE: "instance",
|
|
380
|
+
WORKSPACE: "workspace"
|
|
381
|
+
});
|
|
382
|
+
REGISTRY_SCOPE_KINDS.APP;
|
|
383
|
+
|
|
384
|
+
// src/kernel/utils.ts
|
|
385
|
+
function parseFiniteNumber(value) {
|
|
386
|
+
const parsed = Number(value);
|
|
387
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
388
|
+
}
|
|
389
|
+
function getValidString(value, fallback = null) {
|
|
390
|
+
return trimToNull(value) ?? fallback;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// src/kernel/schema.ts
|
|
394
|
+
function resolveLifecycle(metadata, fallback) {
|
|
395
|
+
const lifecycle = metadata?.lifecycle ?? metadata?.cleanup;
|
|
396
|
+
return lifecycle && REGISTRY_LIFECYCLE_VALUES.has(lifecycle) ? lifecycle : fallback;
|
|
397
|
+
}
|
|
398
|
+
function validateRegistryMetadata(metadata) {
|
|
399
|
+
if (metadata === void 0 || metadata === null)
|
|
400
|
+
return { issues: [], valid: true };
|
|
401
|
+
if (!isObject(metadata))
|
|
402
|
+
return { issues: ["registry metadata must be an object"], valid: false };
|
|
403
|
+
const issues = [];
|
|
404
|
+
Object.keys(metadata).forEach((key) => {
|
|
405
|
+
if (!REGISTRY_METADATA_KEY_SET.has(key))
|
|
406
|
+
issues.push(`unknown registry metadata field: ${key}`);
|
|
407
|
+
});
|
|
408
|
+
if (metadata.source !== void 0 && !getValidString(metadata.source))
|
|
409
|
+
issues.push("source must be a non-empty string");
|
|
410
|
+
if (metadata.instanceId !== void 0 && !getValidString(metadata.instanceId))
|
|
411
|
+
issues.push("instanceId must be a non-empty string");
|
|
412
|
+
if (metadata.scope !== void 0 && !getValidString(metadata.scope))
|
|
413
|
+
issues.push("scope must be a non-empty string");
|
|
414
|
+
if (metadata.priority !== void 0 && parseFiniteNumber(metadata.priority) === null)
|
|
415
|
+
issues.push("priority must be a finite number");
|
|
416
|
+
if (metadata.cleanupDelayMs !== void 0) {
|
|
417
|
+
const delay = parseFiniteNumber(metadata.cleanupDelayMs);
|
|
418
|
+
if (delay === null || delay < 0)
|
|
419
|
+
issues.push("cleanupDelayMs must be a non-negative finite number");
|
|
420
|
+
}
|
|
421
|
+
const lifecycle = metadata.lifecycle ?? metadata.cleanup;
|
|
422
|
+
if (lifecycle !== void 0 && !REGISTRY_LIFECYCLE_VALUES.has(String(lifecycle))) {
|
|
423
|
+
issues.push(
|
|
424
|
+
`lifecycle must be one of: ${[...REGISTRY_LIFECYCLE_VALUES].join(", ")}`
|
|
425
|
+
);
|
|
426
|
+
}
|
|
427
|
+
if (metadata.validation !== void 0 && !Object.values(REGISTRY_VALIDATION_MODES).includes(
|
|
428
|
+
metadata.validation
|
|
429
|
+
)) {
|
|
430
|
+
issues.push(
|
|
431
|
+
`validation must be one of: ${Object.values(REGISTRY_VALIDATION_MODES).join(", ")}`
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
return { issues, valid: issues.length === 0 };
|
|
435
|
+
}
|
|
436
|
+
function normalizeRegistryMetadata(metadata, {
|
|
437
|
+
defaultCleanupDelayMs = null,
|
|
438
|
+
defaultLifecycle = null,
|
|
439
|
+
defaultSource = DEFAULT_SOURCE
|
|
440
|
+
} = {}) {
|
|
441
|
+
const registryMeta = isObject(metadata) ? metadata : {};
|
|
442
|
+
const normalizedDefaultDelay = parseFiniteNumber(defaultCleanupDelayMs);
|
|
443
|
+
const fallbackCleanupDelayMs = normalizedDefaultDelay !== null && normalizedDefaultDelay >= 0 ? normalizedDefaultDelay : null;
|
|
444
|
+
const fallbackLifecycle = defaultLifecycle && REGISTRY_LIFECYCLE_VALUES.has(defaultLifecycle) ? defaultLifecycle : null;
|
|
445
|
+
const source = getValidString(registryMeta.source) || getValidString(defaultSource, DEFAULT_SOURCE) || DEFAULT_SOURCE;
|
|
446
|
+
const scope = getValidString(registryMeta.scope);
|
|
447
|
+
const priority = parseFiniteNumber(registryMeta.priority);
|
|
448
|
+
const lifecycle = resolveLifecycle(registryMeta, fallbackLifecycle);
|
|
449
|
+
const validation = isValidationMode(registryMeta.validation) ? registryMeta.validation : null;
|
|
450
|
+
const cleanupDelayCandidate = parseFiniteNumber(registryMeta.cleanupDelayMs);
|
|
451
|
+
let cleanupDelayMs = cleanupDelayCandidate !== null && cleanupDelayCandidate >= 0 ? cleanupDelayCandidate : fallbackCleanupDelayMs;
|
|
452
|
+
if (lifecycle === REGISTRY_LIFECYCLES.IMMEDIATE) {
|
|
453
|
+
cleanupDelayMs = 0;
|
|
454
|
+
} else if ((lifecycle === REGISTRY_LIFECYCLES.GRACEFUL || lifecycle === REGISTRY_LIFECYCLES.ROUTE) && cleanupDelayMs === null) {
|
|
455
|
+
cleanupDelayMs = fallbackCleanupDelayMs;
|
|
456
|
+
}
|
|
457
|
+
return {
|
|
458
|
+
cleanupDelayMs,
|
|
459
|
+
lifecycle,
|
|
460
|
+
priority,
|
|
461
|
+
registerOptions: {
|
|
462
|
+
...priority !== null && { priority },
|
|
463
|
+
...validation === REGISTRY_VALIDATION_MODES.STRICT && { validation },
|
|
464
|
+
...scope && { scope }
|
|
465
|
+
},
|
|
466
|
+
source,
|
|
467
|
+
...scope && { scope },
|
|
468
|
+
...validation && { validation }
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
function isValidationMode(value) {
|
|
472
|
+
return Object.values(REGISTRY_VALIDATION_MODES).includes(value);
|
|
473
|
+
}
|
|
474
|
+
function pickRegistryMetadata(options) {
|
|
475
|
+
if (!isObject(options)) return {};
|
|
476
|
+
return Object.fromEntries(
|
|
477
|
+
REGISTRY_METADATA_KEYS.filter((key) => options[key] !== void 0).map(
|
|
478
|
+
(key) => [key, options[key]]
|
|
479
|
+
)
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
function createNoopHandle(status = "rejected", reason = "unknown") {
|
|
483
|
+
const handle = Object.assign(() => false, {
|
|
484
|
+
active: false,
|
|
485
|
+
dispose: () => false,
|
|
486
|
+
instanceId: null,
|
|
487
|
+
key: "",
|
|
488
|
+
priority: 0,
|
|
489
|
+
reason,
|
|
490
|
+
source: "",
|
|
491
|
+
status,
|
|
492
|
+
type: "",
|
|
493
|
+
update: () => handle,
|
|
494
|
+
updatedAt: 0,
|
|
495
|
+
validation: "warn"
|
|
496
|
+
});
|
|
497
|
+
return handle;
|
|
498
|
+
}
|
|
499
|
+
createNoopHandle();
|
|
500
|
+
var RegistryContext = getOrCreateGlobalContext(
|
|
501
|
+
"RegistryContext",
|
|
502
|
+
null
|
|
503
|
+
);
|
|
504
|
+
function useRegistryActions() {
|
|
505
|
+
return useRequiredContext(
|
|
506
|
+
RegistryContext,
|
|
507
|
+
"useRegistryActions",
|
|
508
|
+
"RegistryProvider"
|
|
509
|
+
).actions;
|
|
510
|
+
}
|
|
511
|
+
function useRegistrySubscription() {
|
|
512
|
+
return useRequiredContext(
|
|
513
|
+
RegistryContext,
|
|
514
|
+
"useRegistrySubscription",
|
|
515
|
+
"RegistryProvider"
|
|
516
|
+
).subscription;
|
|
517
|
+
}
|
|
518
|
+
function useRegistryValue(type, key) {
|
|
519
|
+
const { getSnapshot: getSnapshot2, subscribe: subscribe2 } = useRegistrySubscription();
|
|
520
|
+
const subscribeToKey = useCallback(
|
|
521
|
+
(listener) => subscribe2(type, key, listener),
|
|
522
|
+
[key, subscribe2, type]
|
|
523
|
+
);
|
|
524
|
+
const getValue = useCallback(
|
|
525
|
+
() => getSnapshot2(type, key),
|
|
526
|
+
[getSnapshot2, key, type]
|
|
527
|
+
);
|
|
528
|
+
return useSyncExternalStore(subscribeToKey, getValue, getValue);
|
|
529
|
+
}
|
|
530
|
+
var EMPTY_MODULES = Object.freeze([]);
|
|
531
|
+
var ModuleHostContext = getOrCreateGlobalContext("ModuleHostContext", null);
|
|
532
|
+
function selectModuleSlice(coreModule, config) {
|
|
533
|
+
const slice = coreModule.page?.select ? coreModule.page.select(config) : config[coreModule.id];
|
|
534
|
+
return slice ?? null;
|
|
535
|
+
}
|
|
536
|
+
function createModulePayload(modules, config, metadata = {}) {
|
|
537
|
+
const payload = {};
|
|
538
|
+
let hasSlices = false;
|
|
539
|
+
for (const coreModule of modules) {
|
|
540
|
+
if (!coreModule.page?.entries) continue;
|
|
541
|
+
const slice = selectModuleSlice(coreModule, config);
|
|
542
|
+
if (slice === null) continue;
|
|
543
|
+
payload[coreModule.id] = slice;
|
|
544
|
+
hasSlices = true;
|
|
545
|
+
}
|
|
546
|
+
if (!hasSlices) return null;
|
|
547
|
+
return {
|
|
548
|
+
...payload,
|
|
549
|
+
registry: {
|
|
550
|
+
...metadata,
|
|
551
|
+
...isObject(config.registry) ? config.registry : {}
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
function useInstalledModules() {
|
|
556
|
+
return use(ModuleHostContext)?.modules ?? EMPTY_MODULES;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// src/kernel/handlers.ts
|
|
560
|
+
function isPersistentLifecycle(lifecycle) {
|
|
561
|
+
return lifecycle === REGISTRY_LIFECYCLES.PERSISTENT;
|
|
562
|
+
}
|
|
563
|
+
function runRegistrationBatch(context, executor) {
|
|
564
|
+
return typeof context.batch === "function" ? context.batch(executor) : executor(context);
|
|
565
|
+
}
|
|
566
|
+
function createEntryCleanupKey(type, key, source, instanceId, scope) {
|
|
567
|
+
return JSON.stringify([
|
|
568
|
+
"entry",
|
|
569
|
+
type,
|
|
570
|
+
key,
|
|
571
|
+
scope ?? null,
|
|
572
|
+
source,
|
|
573
|
+
instanceId
|
|
574
|
+
]);
|
|
575
|
+
}
|
|
576
|
+
function getCleanupScope(context) {
|
|
577
|
+
return context?.cleanupScope || /* @__PURE__ */ new Map();
|
|
578
|
+
}
|
|
579
|
+
function clearCleanupTimer(scope, cleanupKey) {
|
|
580
|
+
const lifecycle = scope.get(cleanupKey);
|
|
581
|
+
if (!lifecycle) return;
|
|
582
|
+
lifecycle.cancelled = true;
|
|
583
|
+
if (lifecycle.timerId !== null) clearTimeout(lifecycle.timerId);
|
|
584
|
+
scope.delete(cleanupKey);
|
|
585
|
+
}
|
|
586
|
+
function scheduleCleanup(scope, cleanupKey, callback, delayMs) {
|
|
587
|
+
clearCleanupTimer(scope, cleanupKey);
|
|
588
|
+
const lifecycle = {
|
|
589
|
+
cancelled: false,
|
|
590
|
+
timerId: null
|
|
591
|
+
};
|
|
592
|
+
lifecycle.timerId = setTimeout(() => {
|
|
593
|
+
if (lifecycle.cancelled || scope.get(cleanupKey) !== lifecycle) return;
|
|
594
|
+
scope.delete(cleanupKey);
|
|
595
|
+
callback();
|
|
596
|
+
}, delayMs);
|
|
597
|
+
scope.set(cleanupKey, lifecycle);
|
|
598
|
+
}
|
|
599
|
+
function collectModuleRegistrations(coreModule, slice, pageMetadata, context) {
|
|
600
|
+
const definition = coreModule.registry;
|
|
601
|
+
const toEntries = coreModule.page?.entries;
|
|
602
|
+
if (!definition || !toEntries || slice == null || slice === false) return [];
|
|
603
|
+
const type = coreModule.id;
|
|
604
|
+
const items = Array.isArray(slice) ? slice : [slice];
|
|
605
|
+
const registrations = [];
|
|
606
|
+
for (const item of items) {
|
|
607
|
+
if (item == null || item === false) continue;
|
|
608
|
+
const itemMetadata = isObject(item) && isObject(item.registry) ? item.registry : {};
|
|
609
|
+
const metadata = { ...pageMetadata, ...itemMetadata };
|
|
610
|
+
if (metadata.validation === "strict" && !validateRegistryMetadata(metadata).valid) {
|
|
611
|
+
continue;
|
|
612
|
+
}
|
|
613
|
+
const payload = isObject(item) ? Object.fromEntries(
|
|
614
|
+
Object.entries(item).filter(([key]) => key !== "registry")
|
|
615
|
+
) : item;
|
|
616
|
+
const { cleanupDelayMs, lifecycle, registerOptions, scope, source } = normalizeRegistryMetadata(metadata, {
|
|
617
|
+
defaultCleanupDelayMs: definition.cleanupDelayMs ?? null,
|
|
618
|
+
defaultLifecycle: definition.lifecycle,
|
|
619
|
+
defaultSource: DEFAULT_SOURCE
|
|
620
|
+
});
|
|
621
|
+
for (const { key, value } of toEntries(payload, context) ?? []) {
|
|
622
|
+
const validation = definition.validate?.(value);
|
|
623
|
+
if (validation && !validation.valid) {
|
|
624
|
+
report(`Registry ${type} config is invalid`, validation.issues, "warn");
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
627
|
+
registrations.push({
|
|
628
|
+
cleanupDelayMs,
|
|
629
|
+
cleanupKey: createEntryCleanupKey(
|
|
630
|
+
type,
|
|
631
|
+
key,
|
|
632
|
+
source,
|
|
633
|
+
context.instanceId,
|
|
634
|
+
scope
|
|
635
|
+
),
|
|
636
|
+
key,
|
|
637
|
+
lifecycle,
|
|
638
|
+
registerOptions,
|
|
639
|
+
scope,
|
|
640
|
+
source,
|
|
641
|
+
type,
|
|
642
|
+
value
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
return registrations;
|
|
647
|
+
}
|
|
648
|
+
var NO_CLEANUP = () => {
|
|
649
|
+
};
|
|
650
|
+
function applyRegistryConfig(config, context) {
|
|
651
|
+
const modules = context.modules ?? [];
|
|
652
|
+
if (!config || modules.length === 0) return NO_CLEANUP;
|
|
653
|
+
const pageMetadata = isObject(config.registry) ? config.registry : {};
|
|
654
|
+
const slices = config;
|
|
655
|
+
const registrations = modules.flatMap((coreModule) => {
|
|
656
|
+
try {
|
|
657
|
+
return collectModuleRegistrations(
|
|
658
|
+
coreModule,
|
|
659
|
+
slices[coreModule.id],
|
|
660
|
+
pageMetadata,
|
|
661
|
+
context
|
|
662
|
+
);
|
|
663
|
+
} catch (error) {
|
|
664
|
+
report(`Registry apply (${coreModule.id})`, error);
|
|
665
|
+
return [];
|
|
666
|
+
}
|
|
667
|
+
});
|
|
668
|
+
if (registrations.length === 0) return NO_CLEANUP;
|
|
669
|
+
const cleanupScope = getCleanupScope(context);
|
|
670
|
+
const owner = (registration) => ({
|
|
671
|
+
instanceId: context.instanceId,
|
|
672
|
+
scope: registration.scope,
|
|
673
|
+
source: registration.source
|
|
674
|
+
});
|
|
675
|
+
runRegistrationBatch(context, (queue) => {
|
|
676
|
+
registrations.forEach(
|
|
677
|
+
({ cleanupKey, key, registerOptions, source, type, value }) => {
|
|
678
|
+
clearCleanupTimer(cleanupScope, cleanupKey);
|
|
679
|
+
queue.register(type, key, value, source, registerOptions);
|
|
680
|
+
}
|
|
681
|
+
);
|
|
682
|
+
});
|
|
683
|
+
return () => {
|
|
684
|
+
const immediate = [];
|
|
685
|
+
registrations.forEach((registration) => {
|
|
686
|
+
if (isPersistentLifecycle(registration.lifecycle)) return;
|
|
687
|
+
const { cleanupDelayMs, cleanupKey, key, type } = registration;
|
|
688
|
+
if (typeof cleanupDelayMs === "number" && cleanupDelayMs > 0) {
|
|
689
|
+
scheduleCleanup(
|
|
690
|
+
cleanupScope,
|
|
691
|
+
cleanupKey,
|
|
692
|
+
() => context.unregister(type, key, owner(registration)),
|
|
693
|
+
cleanupDelayMs
|
|
694
|
+
);
|
|
695
|
+
} else {
|
|
696
|
+
immediate.push(registration);
|
|
697
|
+
}
|
|
698
|
+
});
|
|
699
|
+
if (immediate.length === 0) return;
|
|
700
|
+
runRegistrationBatch(context, (queue) => {
|
|
701
|
+
immediate.forEach(
|
|
702
|
+
(registration) => queue.unregister(
|
|
703
|
+
registration.type,
|
|
704
|
+
registration.key,
|
|
705
|
+
owner(registration)
|
|
706
|
+
)
|
|
707
|
+
);
|
|
708
|
+
});
|
|
709
|
+
};
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// src/kernel/hooks.ts
|
|
713
|
+
function withInstanceId(instanceId, sourceOrOptions, optionsArg) {
|
|
714
|
+
if (typeof sourceOrOptions === "string") {
|
|
715
|
+
return {
|
|
716
|
+
optionsArg: { ...isObject(optionsArg) ? optionsArg : {}, instanceId },
|
|
717
|
+
sourceOrOptions
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
if (isObject(sourceOrOptions)) {
|
|
721
|
+
return {
|
|
722
|
+
optionsArg,
|
|
723
|
+
sourceOrOptions: { ...sourceOrOptions, instanceId }
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
return {
|
|
727
|
+
optionsArg: void 0,
|
|
728
|
+
sourceOrOptions: {
|
|
729
|
+
...isObject(optionsArg) ? optionsArg : {},
|
|
730
|
+
instanceId
|
|
731
|
+
}
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
function withInstanceIdForUnregister(instanceId, sourceOrOptions) {
|
|
735
|
+
if (typeof sourceOrOptions === "string") {
|
|
736
|
+
return { instanceId, source: sourceOrOptions };
|
|
737
|
+
}
|
|
738
|
+
if (isObject(sourceOrOptions)) {
|
|
739
|
+
return { ...sourceOrOptions, instanceId };
|
|
740
|
+
}
|
|
741
|
+
return { instanceId };
|
|
742
|
+
}
|
|
743
|
+
function resolveRegisterArgsWithInstance(instanceId, sourceOrOptions, optionsArg) {
|
|
744
|
+
const input = withInstanceId(instanceId, sourceOrOptions, optionsArg);
|
|
745
|
+
return [input.sourceOrOptions, input.optionsArg];
|
|
746
|
+
}
|
|
747
|
+
var MAX_STABILIZATION_DEPTH = 64;
|
|
748
|
+
function createStableFunctionEntry(fn) {
|
|
749
|
+
const entry = {
|
|
750
|
+
current: fn,
|
|
751
|
+
stable(...args) {
|
|
752
|
+
return entry.current?.apply(this, args);
|
|
753
|
+
}
|
|
754
|
+
};
|
|
755
|
+
return entry;
|
|
756
|
+
}
|
|
757
|
+
function isDirectRegistryComponentPath(path, componentSlices) {
|
|
758
|
+
const match = /^config\.([^.[]+)\.[^.[]+$/.exec(path);
|
|
759
|
+
return Boolean(match && componentSlices.has(match[1]));
|
|
760
|
+
}
|
|
761
|
+
function isReactNodeLike(value) {
|
|
762
|
+
return value === null || value === void 0 || typeof value === "boolean" || typeof value === "string" || typeof value === "number" || isValidElement(value);
|
|
763
|
+
}
|
|
764
|
+
function isStabilizableObject(value) {
|
|
765
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && !isValidElement(value);
|
|
766
|
+
}
|
|
767
|
+
function hasSameObjectKeys(previousValue, nextValue) {
|
|
768
|
+
if (!isStabilizableObject(previousValue) || !isStabilizableObject(nextValue)) {
|
|
769
|
+
return false;
|
|
770
|
+
}
|
|
771
|
+
const previousKeys = Object.keys(previousValue);
|
|
772
|
+
const nextKeys = Object.keys(nextValue);
|
|
773
|
+
if (previousKeys.length !== nextKeys.length) return false;
|
|
774
|
+
return nextKeys.every(
|
|
775
|
+
(key) => Object.prototype.hasOwnProperty.call(previousValue, key)
|
|
776
|
+
);
|
|
777
|
+
}
|
|
778
|
+
function stabilizeRegistryValue(value, path, scope, previousValue, seen = /* @__PURE__ */ new WeakSet(), depth = 0) {
|
|
779
|
+
if (depth > MAX_STABILIZATION_DEPTH) return value;
|
|
780
|
+
if (typeof value === "function") {
|
|
781
|
+
const isComponent = value.name && /^[A-Z]/.test(value.name);
|
|
782
|
+
if (isComponent || isDirectRegistryComponentPath(path, scope.componentSlices)) {
|
|
783
|
+
return value;
|
|
784
|
+
}
|
|
785
|
+
scope.usedPaths.add(path);
|
|
786
|
+
let entry = scope.functionEntries.get(path);
|
|
787
|
+
if (!entry) {
|
|
788
|
+
entry = createStableFunctionEntry(value);
|
|
789
|
+
scope.functionEntries.set(path, entry);
|
|
790
|
+
} else {
|
|
791
|
+
entry.current = value;
|
|
792
|
+
}
|
|
793
|
+
return entry.stable;
|
|
794
|
+
}
|
|
795
|
+
if (value && typeof value === "object") {
|
|
796
|
+
if (seen.has(value)) return value;
|
|
797
|
+
seen.add(value);
|
|
798
|
+
}
|
|
799
|
+
if (isValidElement(value)) {
|
|
800
|
+
const nextProps = stabilizeRegistryValue(
|
|
801
|
+
value.props,
|
|
802
|
+
`${path}.props`,
|
|
803
|
+
scope,
|
|
804
|
+
isValidElement(previousValue) ? previousValue.props : void 0,
|
|
805
|
+
seen,
|
|
806
|
+
depth + 1
|
|
807
|
+
);
|
|
808
|
+
if (isValidElement(previousValue) && previousValue.type === value.type && previousValue.key === value.key && previousValue.props === nextProps) {
|
|
809
|
+
return previousValue;
|
|
810
|
+
}
|
|
811
|
+
return cloneElement(value, nextProps);
|
|
812
|
+
}
|
|
813
|
+
if (Array.isArray(value)) {
|
|
814
|
+
const nextValue = value.every(isReactNodeLike) ? Children.toArray(value) : value;
|
|
815
|
+
const previousArray = Array.isArray(previousValue) ? previousValue : null;
|
|
816
|
+
let hasChanged2 = !previousArray || previousArray.length !== nextValue.length;
|
|
817
|
+
const stabilizedValue2 = nextValue.map((item, index) => {
|
|
818
|
+
const nextItem = stabilizeRegistryValue(
|
|
819
|
+
item,
|
|
820
|
+
`${path}[${index}]`,
|
|
821
|
+
scope,
|
|
822
|
+
previousArray?.[index],
|
|
823
|
+
seen,
|
|
824
|
+
depth + 1
|
|
825
|
+
);
|
|
826
|
+
if (!previousArray || nextItem !== previousArray[index]) {
|
|
827
|
+
hasChanged2 = true;
|
|
828
|
+
}
|
|
829
|
+
return nextItem;
|
|
830
|
+
});
|
|
831
|
+
return !hasChanged2 ? previousArray : stabilizedValue2;
|
|
832
|
+
}
|
|
833
|
+
if (typeof value !== "object" || value === null) {
|
|
834
|
+
return value;
|
|
835
|
+
}
|
|
836
|
+
const source = value;
|
|
837
|
+
const previousRecord = previousValue;
|
|
838
|
+
const stabilizedValue = {};
|
|
839
|
+
const canReusePrevious = hasSameObjectKeys(previousValue, value);
|
|
840
|
+
let hasChanged = !canReusePrevious;
|
|
841
|
+
Object.keys(source).forEach((key) => {
|
|
842
|
+
const nextValue = stabilizeRegistryValue(
|
|
843
|
+
source[key],
|
|
844
|
+
`${path}.${key}`,
|
|
845
|
+
scope,
|
|
846
|
+
previousRecord?.[key],
|
|
847
|
+
seen,
|
|
848
|
+
depth + 1
|
|
849
|
+
);
|
|
850
|
+
stabilizedValue[key] = nextValue;
|
|
851
|
+
if (!canReusePrevious || nextValue !== previousRecord?.[key]) {
|
|
852
|
+
hasChanged = true;
|
|
853
|
+
}
|
|
854
|
+
});
|
|
855
|
+
return !hasChanged ? previousValue : stabilizedValue;
|
|
856
|
+
}
|
|
857
|
+
function useAppliedRegistryConfig(payload, context, componentSlices) {
|
|
858
|
+
const functionEntriesRef = useRef(/* @__PURE__ */ new Map());
|
|
859
|
+
const appliedRef = useRef(null);
|
|
860
|
+
useIsomorphicLayoutEffect(() => {
|
|
861
|
+
const previous = appliedRef.current;
|
|
862
|
+
if (previous && previous.payload === payload && previous.context === context) {
|
|
863
|
+
return;
|
|
864
|
+
}
|
|
865
|
+
const functionEntries = functionEntriesRef.current;
|
|
866
|
+
const usedPaths = /* @__PURE__ */ new Set();
|
|
867
|
+
const config = stabilizeRegistryValue(
|
|
868
|
+
payload,
|
|
869
|
+
"config",
|
|
870
|
+
{ componentSlices, functionEntries, usedPaths },
|
|
871
|
+
previous?.config
|
|
872
|
+
);
|
|
873
|
+
functionEntries.forEach((_entry, path) => {
|
|
874
|
+
if (!usedPaths.has(path)) functionEntries.delete(path);
|
|
875
|
+
});
|
|
876
|
+
if (previous && previous.config === config && previous.context === context) {
|
|
877
|
+
previous.payload = payload;
|
|
878
|
+
return;
|
|
879
|
+
}
|
|
880
|
+
previous?.cleanup();
|
|
881
|
+
appliedRef.current = {
|
|
882
|
+
cleanup: applyRegistryConfig(config, context),
|
|
883
|
+
config,
|
|
884
|
+
context,
|
|
885
|
+
payload
|
|
886
|
+
};
|
|
887
|
+
});
|
|
888
|
+
useIsomorphicLayoutEffect(
|
|
889
|
+
() => () => {
|
|
890
|
+
appliedRef.current?.cleanup();
|
|
891
|
+
appliedRef.current = null;
|
|
892
|
+
},
|
|
893
|
+
[]
|
|
894
|
+
);
|
|
895
|
+
}
|
|
896
|
+
function createRegistryApplyContext(actions, {
|
|
897
|
+
cleanupScope = /* @__PURE__ */ new Map(),
|
|
898
|
+
instanceId,
|
|
899
|
+
modules = [],
|
|
900
|
+
pathname
|
|
901
|
+
}) {
|
|
902
|
+
const stamp = (queue) => ({
|
|
903
|
+
register: (type, key, item, sourceOrOptions, optionsArg) => queue.register(
|
|
904
|
+
type,
|
|
905
|
+
key,
|
|
906
|
+
item,
|
|
907
|
+
...resolveRegisterArgsWithInstance(
|
|
908
|
+
instanceId,
|
|
909
|
+
sourceOrOptions,
|
|
910
|
+
optionsArg
|
|
911
|
+
)
|
|
912
|
+
),
|
|
913
|
+
unregister: (type, key, sourceOrOptions) => queue.unregister(
|
|
914
|
+
type,
|
|
915
|
+
key,
|
|
916
|
+
withInstanceIdForUnregister(instanceId, sourceOrOptions)
|
|
917
|
+
)
|
|
918
|
+
});
|
|
919
|
+
return {
|
|
920
|
+
...stamp(actions),
|
|
921
|
+
batch: (executor) => typeof executor === "function" ? actions.batch((queue) => executor(stamp(queue))) : 0,
|
|
922
|
+
cleanupScope,
|
|
923
|
+
instanceId,
|
|
924
|
+
modules,
|
|
925
|
+
pathname
|
|
926
|
+
};
|
|
927
|
+
}
|
|
928
|
+
function useRegistry(config, metadata) {
|
|
929
|
+
const { batch, register, unregister } = useRegistryActions();
|
|
930
|
+
const pathname = usePathname();
|
|
931
|
+
const modules = useInstalledModules();
|
|
932
|
+
const instanceId = `registry-instance-${useId()}`;
|
|
933
|
+
const [cleanupScope] = useState(
|
|
934
|
+
() => /* @__PURE__ */ new Map()
|
|
935
|
+
);
|
|
936
|
+
const context = useMemo(
|
|
937
|
+
() => createRegistryApplyContext(
|
|
938
|
+
{ batch, register, unregister },
|
|
939
|
+
{
|
|
940
|
+
cleanupScope,
|
|
941
|
+
instanceId,
|
|
942
|
+
modules,
|
|
943
|
+
pathname
|
|
944
|
+
}
|
|
945
|
+
),
|
|
946
|
+
[batch, cleanupScope, instanceId, modules, pathname, register, unregister]
|
|
947
|
+
);
|
|
948
|
+
const payload = useMemo(
|
|
949
|
+
() => config ? createModulePayload(modules, config, metadata) : null,
|
|
950
|
+
[config, metadata, modules]
|
|
951
|
+
);
|
|
952
|
+
const componentSlices = useMemo(
|
|
953
|
+
() => new Set(
|
|
954
|
+
modules.filter(
|
|
955
|
+
(coreModule) => coreModule.registry?.valueKind === "component"
|
|
956
|
+
).map((coreModule) => coreModule.id)
|
|
957
|
+
),
|
|
958
|
+
[modules]
|
|
959
|
+
);
|
|
960
|
+
useAppliedRegistryConfig(payload, context, componentSlices);
|
|
961
|
+
}
|
|
962
|
+
function createPageControllerStore() {
|
|
963
|
+
const listeners2 = /* @__PURE__ */ new Set();
|
|
964
|
+
let stack = [];
|
|
965
|
+
const notify = () => {
|
|
966
|
+
listeners2.forEach((listener) => {
|
|
967
|
+
try {
|
|
968
|
+
listener();
|
|
969
|
+
} catch (error) {
|
|
970
|
+
report("Page controller listener", error);
|
|
971
|
+
}
|
|
972
|
+
});
|
|
973
|
+
};
|
|
974
|
+
return {
|
|
975
|
+
getSnapshot() {
|
|
976
|
+
const top = stack[stack.length - 1];
|
|
977
|
+
return top?.controllerRef?.current || null;
|
|
978
|
+
},
|
|
979
|
+
notify,
|
|
980
|
+
register(id, controllerRef) {
|
|
981
|
+
stack = stack.filter((item) => item.id !== id);
|
|
982
|
+
stack.push({ controllerRef, id });
|
|
983
|
+
notify();
|
|
984
|
+
},
|
|
985
|
+
subscribe(listener) {
|
|
986
|
+
listeners2.add(listener);
|
|
987
|
+
return () => {
|
|
988
|
+
listeners2.delete(listener);
|
|
989
|
+
};
|
|
990
|
+
},
|
|
991
|
+
unregister(id) {
|
|
992
|
+
stack = stack.filter((item) => item.id !== id);
|
|
993
|
+
notify();
|
|
994
|
+
}
|
|
995
|
+
};
|
|
996
|
+
}
|
|
997
|
+
var fallbackStandaloneStore = createPageControllerStore();
|
|
998
|
+
getOrCreateGlobalContext(
|
|
999
|
+
"PageControllerContext",
|
|
1000
|
+
null
|
|
1001
|
+
);
|
|
1002
|
+
getOrCreateGlobalContext(
|
|
1003
|
+
"PageControllerStoreContext",
|
|
1004
|
+
fallbackStandaloneStore
|
|
1005
|
+
);
|
|
1006
|
+
function defineModule(coreModule) {
|
|
1007
|
+
return Object.freeze({ ...coreModule });
|
|
1008
|
+
}
|
|
1009
|
+
createStore(void 0);
|
|
1010
|
+
|
|
1011
|
+
// src/kernel/adapters.tsx
|
|
1012
|
+
function useModuleRegistration(id, value, options) {
|
|
1013
|
+
const coreModule = useInstalledModules().find(
|
|
1014
|
+
(candidate) => candidate.id === id
|
|
1015
|
+
);
|
|
1016
|
+
const config = coreModule && options?.enabled !== false && value != null ? { [id]: value } : null;
|
|
1017
|
+
useRegistry(config, pickRegistryMetadata(options));
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
// src/modules/loading/constants.ts
|
|
1021
|
+
var DEFAULT_LOADING_STATE = Object.freeze({
|
|
1022
|
+
isLoading: false,
|
|
1023
|
+
skeleton: null,
|
|
1024
|
+
minDuration: 0,
|
|
1025
|
+
showOverlay: true,
|
|
1026
|
+
message: null
|
|
1027
|
+
});
|
|
1028
|
+
var LOADING_REGISTRY_KEY = "page-loading";
|
|
1029
|
+
var loadingTheme = defineThemeSpec("loading");
|
|
1030
|
+
|
|
1031
|
+
// src/modules/loading/utils.ts
|
|
1032
|
+
function normalizeLoadingOptions(options = {}) {
|
|
1033
|
+
const minDuration = Number(options.minDuration);
|
|
1034
|
+
return {
|
|
1035
|
+
message: typeof options.message === "string" ? options.message : null,
|
|
1036
|
+
minDuration: Number.isFinite(minDuration) && minDuration > 0 ? minDuration : 0,
|
|
1037
|
+
showOverlay: options.showOverlay !== false,
|
|
1038
|
+
skeleton: options.skeleton ?? null
|
|
1039
|
+
};
|
|
1040
|
+
}
|
|
1041
|
+
function selectPageLoading(loading) {
|
|
1042
|
+
if (loading === void 0 || loading === null) return null;
|
|
1043
|
+
if (typeof loading === "boolean") return { isLoading: loading };
|
|
1044
|
+
if (typeof loading === "string") return { isLoading: true, message: loading };
|
|
1045
|
+
return loading;
|
|
1046
|
+
}
|
|
1047
|
+
var LoadingContext = getOrCreateGlobalContext("LoadingContext", null);
|
|
1048
|
+
function useLoadingRegistration(config, options) {
|
|
1049
|
+
useModuleRegistration("loading", config, options);
|
|
1050
|
+
}
|
|
1051
|
+
function LoadingProvider({ children }) {
|
|
1052
|
+
const [manualState, setManualState] = useState(
|
|
1053
|
+
DEFAULT_LOADING_STATE
|
|
1054
|
+
);
|
|
1055
|
+
const startTimeRef = useRef(null);
|
|
1056
|
+
const minDurationRef = useRef(0);
|
|
1057
|
+
const stopTimerRef = useRef(null);
|
|
1058
|
+
const registryLoading = useRegistryValue(
|
|
1059
|
+
"loading",
|
|
1060
|
+
LOADING_REGISTRY_KEY
|
|
1061
|
+
);
|
|
1062
|
+
const clearStopTimer = useCallback(() => {
|
|
1063
|
+
if (stopTimerRef.current !== null) {
|
|
1064
|
+
clearTimeout(stopTimerRef.current);
|
|
1065
|
+
stopTimerRef.current = null;
|
|
1066
|
+
}
|
|
1067
|
+
}, []);
|
|
1068
|
+
const resetState = useCallback(() => {
|
|
1069
|
+
clearStopTimer();
|
|
1070
|
+
minDurationRef.current = 0;
|
|
1071
|
+
startTimeRef.current = null;
|
|
1072
|
+
setManualState(DEFAULT_LOADING_STATE);
|
|
1073
|
+
}, [clearStopTimer]);
|
|
1074
|
+
const startLoading = useCallback(
|
|
1075
|
+
(options = {}) => {
|
|
1076
|
+
clearStopTimer();
|
|
1077
|
+
const nextState = normalizeLoadingOptions(options);
|
|
1078
|
+
startTimeRef.current = Date.now();
|
|
1079
|
+
minDurationRef.current = nextState.minDuration;
|
|
1080
|
+
setManualState({
|
|
1081
|
+
...nextState,
|
|
1082
|
+
isLoading: true
|
|
1083
|
+
});
|
|
1084
|
+
},
|
|
1085
|
+
[clearStopTimer]
|
|
1086
|
+
);
|
|
1087
|
+
const stopLoading = useCallback(() => {
|
|
1088
|
+
const startTime = startTimeRef.current;
|
|
1089
|
+
const activeMinDuration = minDurationRef.current;
|
|
1090
|
+
if (startTime === null || activeMinDuration === 0) {
|
|
1091
|
+
resetState();
|
|
1092
|
+
return;
|
|
1093
|
+
}
|
|
1094
|
+
const elapsed = Date.now() - startTime;
|
|
1095
|
+
const remaining = activeMinDuration - elapsed;
|
|
1096
|
+
if (remaining <= 0) {
|
|
1097
|
+
resetState();
|
|
1098
|
+
return;
|
|
1099
|
+
}
|
|
1100
|
+
clearStopTimer();
|
|
1101
|
+
stopTimerRef.current = setTimeout(resetState, remaining);
|
|
1102
|
+
}, [clearStopTimer, resetState]);
|
|
1103
|
+
const setLoading = useCallback(
|
|
1104
|
+
(value2) => {
|
|
1105
|
+
if (value2) startLoading();
|
|
1106
|
+
else stopLoading();
|
|
1107
|
+
},
|
|
1108
|
+
[startLoading, stopLoading]
|
|
1109
|
+
);
|
|
1110
|
+
const setSkeleton = useCallback((nextSkeleton) => {
|
|
1111
|
+
setManualState((currentState) => {
|
|
1112
|
+
const skeleton = typeof nextSkeleton === "function" ? nextSkeleton(currentState.skeleton) : nextSkeleton;
|
|
1113
|
+
return currentState.skeleton === skeleton ? currentState : { ...currentState, skeleton };
|
|
1114
|
+
});
|
|
1115
|
+
}, []);
|
|
1116
|
+
const withLoading = useCallback(
|
|
1117
|
+
async (task, options = {}) => {
|
|
1118
|
+
startLoading(
|
|
1119
|
+
typeof options === "string" ? { message: options } : options
|
|
1120
|
+
);
|
|
1121
|
+
try {
|
|
1122
|
+
return typeof task === "function" ? await task() : await task;
|
|
1123
|
+
} finally {
|
|
1124
|
+
stopLoading();
|
|
1125
|
+
}
|
|
1126
|
+
},
|
|
1127
|
+
[startLoading, stopLoading]
|
|
1128
|
+
);
|
|
1129
|
+
useEffect(() => clearStopTimer, [clearStopTimer]);
|
|
1130
|
+
const state = useMemo(() => {
|
|
1131
|
+
if (registryLoading?.isLoading) {
|
|
1132
|
+
const normalized = normalizeLoadingOptions(registryLoading);
|
|
1133
|
+
return {
|
|
1134
|
+
...normalized,
|
|
1135
|
+
isLoading: true,
|
|
1136
|
+
isPageLoading: true
|
|
1137
|
+
};
|
|
1138
|
+
}
|
|
1139
|
+
return {
|
|
1140
|
+
...manualState,
|
|
1141
|
+
isPageLoading: manualState.isLoading
|
|
1142
|
+
};
|
|
1143
|
+
}, [manualState, registryLoading]);
|
|
1144
|
+
const actions = useMemo(
|
|
1145
|
+
() => ({
|
|
1146
|
+
setLoading,
|
|
1147
|
+
setSkeleton,
|
|
1148
|
+
startLoading,
|
|
1149
|
+
stopLoading,
|
|
1150
|
+
withLoading
|
|
1151
|
+
}),
|
|
1152
|
+
[setLoading, setSkeleton, startLoading, stopLoading, withLoading]
|
|
1153
|
+
);
|
|
1154
|
+
const [store] = useState(
|
|
1155
|
+
() => createStore(state, { freezeSnapshots: false })
|
|
1156
|
+
);
|
|
1157
|
+
useIsomorphicLayoutEffect(() => {
|
|
1158
|
+
store.publish(state);
|
|
1159
|
+
}, [state, store]);
|
|
1160
|
+
const value = useMemo(
|
|
1161
|
+
() => ({ actions, store }),
|
|
1162
|
+
[actions, store]
|
|
1163
|
+
);
|
|
1164
|
+
return /* @__PURE__ */ jsx(LoadingContext, { value, children });
|
|
1165
|
+
}
|
|
1166
|
+
function useLoadingState() {
|
|
1167
|
+
const { store } = useRequiredContext(
|
|
1168
|
+
LoadingContext,
|
|
1169
|
+
"useLoadingState",
|
|
1170
|
+
"LoadingProvider"
|
|
1171
|
+
);
|
|
1172
|
+
return useStore(store);
|
|
1173
|
+
}
|
|
1174
|
+
function useLoadingActions() {
|
|
1175
|
+
return useRequiredContext(
|
|
1176
|
+
LoadingContext,
|
|
1177
|
+
"useLoadingActions",
|
|
1178
|
+
"LoadingProvider"
|
|
1179
|
+
).actions;
|
|
1180
|
+
}
|
|
1181
|
+
function useLoading(config, options) {
|
|
1182
|
+
useLoadingRegistration(config, options);
|
|
1183
|
+
const actions = useLoadingActions();
|
|
1184
|
+
const state = useLoadingState();
|
|
1185
|
+
return useMemo(() => ({ ...state, ...actions }), [actions, state]);
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
// src/modules/loading/hooks.ts
|
|
1189
|
+
function useLoadingOverlayModel() {
|
|
1190
|
+
const { isLoading, skeleton, showOverlay } = useLoadingState();
|
|
1191
|
+
const isFullscreenStateActive = useIsFullscreenStateActive();
|
|
1192
|
+
const isVisible = isLoading && showOverlay && !isFullscreenStateActive;
|
|
1193
|
+
const theme = useTheme(loadingTheme);
|
|
1194
|
+
return { skeleton, isVisible, theme };
|
|
1195
|
+
}
|
|
1196
|
+
function LoadingOverlay() {
|
|
1197
|
+
const { skeleton, isVisible, theme } = useLoadingOverlayModel();
|
|
1198
|
+
if (!isVisible) return null;
|
|
1199
|
+
return /* @__PURE__ */ jsx(
|
|
1200
|
+
"div",
|
|
1201
|
+
{
|
|
1202
|
+
className: theme.slots.overlay,
|
|
1203
|
+
"aria-label": "Loading",
|
|
1204
|
+
"aria-busy": "true",
|
|
1205
|
+
role: "status",
|
|
1206
|
+
style: theme.styles.overlay,
|
|
1207
|
+
children: skeleton || /* @__PURE__ */ jsx(Spinner, { size: 30 })
|
|
1208
|
+
}
|
|
1209
|
+
);
|
|
1210
|
+
}
|
|
1211
|
+
function useLoadingPage(_slice, page) {
|
|
1212
|
+
const actions = useLoadingActions();
|
|
1213
|
+
return useMemo(
|
|
1214
|
+
() => ({
|
|
1215
|
+
...actions,
|
|
1216
|
+
set: (loading) => page.set({ loading })
|
|
1217
|
+
}),
|
|
1218
|
+
[actions, page]
|
|
1219
|
+
);
|
|
1220
|
+
}
|
|
1221
|
+
function defineLoading(definition = {}) {
|
|
1222
|
+
const { id = "loading", ...config } = selectPageLoading(definition) ?? {};
|
|
1223
|
+
return Object.freeze({
|
|
1224
|
+
config,
|
|
1225
|
+
id,
|
|
1226
|
+
use: function useDefinedLoading(overrides = {}, options = {}) {
|
|
1227
|
+
return useLoading(
|
|
1228
|
+
{ ...config, ...selectPageLoading(overrides) },
|
|
1229
|
+
options
|
|
1230
|
+
);
|
|
1231
|
+
}
|
|
1232
|
+
});
|
|
1233
|
+
}
|
|
1234
|
+
var loadingModule = defineModule({
|
|
1235
|
+
id: "loading",
|
|
1236
|
+
context: LoadingContext,
|
|
1237
|
+
Provider: LoadingProvider,
|
|
1238
|
+
Overlay: LoadingOverlay,
|
|
1239
|
+
registry: {
|
|
1240
|
+
cleanupDelayMs: 600,
|
|
1241
|
+
keyPolicy: "singleton",
|
|
1242
|
+
lifecycle: "graceful",
|
|
1243
|
+
singletonKey: LOADING_REGISTRY_KEY
|
|
1244
|
+
},
|
|
1245
|
+
page: {
|
|
1246
|
+
select: (config) => selectPageLoading(config.loading),
|
|
1247
|
+
entries: (slice) => [
|
|
1248
|
+
{ key: LOADING_REGISTRY_KEY, value: slice }
|
|
1249
|
+
],
|
|
1250
|
+
use: useLoadingPage
|
|
1251
|
+
}
|
|
1252
|
+
});
|
|
1253
|
+
|
|
1254
|
+
export { DEFAULT_LOADING_STATE, LOADING_REGISTRY_KEY, LoadingContext, LoadingOverlay, LoadingProvider, defineLoading, loadingModule, loadingTheme, normalizeLoadingOptions, selectPageLoading, useLoading, useLoadingActions, useLoadingRegistration, useLoadingState };
|
|
1255
|
+
//# sourceMappingURL=index.js.map
|
|
1256
|
+
//# sourceMappingURL=index.js.map
|