@omerdlw/base-framework 1.0.1 → 1.0.2
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/atoms/index.d.ts +0 -1
- package/dist/atoms/index.d.ts.map +1 -1
- package/dist/atoms/index.js +1 -64
- package/dist/atoms/index.js.map +1 -1
- package/dist/error/index.js +22 -25
- package/dist/error/index.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +97 -4
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/types.d.ts +11 -0
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/hooks/use-controllable-state.d.ts +1 -1
- package/dist/hooks/use-controllable-state.d.ts.map +1 -1
- package/dist/hooks/use-hotkey.d.ts +1 -1
- package/dist/hooks/use-hotkey.d.ts.map +1 -1
- package/dist/index.js +10811 -10696
- package/dist/index.js.map +1 -1
- package/dist/kernel/adapters.d.ts.map +1 -1
- package/dist/kernel/index.d.ts +1 -0
- package/dist/kernel/index.d.ts.map +1 -1
- package/dist/kernel/index.js +13 -84
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/installed.d.ts.map +1 -1
- package/dist/kernel/page-controller.d.ts.map +1 -1
- package/dist/kernel/provider.d.ts.map +1 -1
- package/dist/modules/ambient/constants.d.ts +1 -1
- package/dist/modules/ambient/constants.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +180 -326
- package/dist/modules/ambient/index.js.map +1 -1
- package/dist/modules/ambient/module.d.ts.map +1 -1
- package/dist/modules/background/constants.d.ts +4 -2
- package/dist/modules/background/constants.d.ts.map +1 -1
- package/dist/modules/background/context.d.ts +3 -0
- package/dist/modules/background/context.d.ts.map +1 -1
- package/dist/modules/background/hooks.d.ts +1 -1
- package/dist/modules/background/index.d.ts +2 -2
- package/dist/modules/background/index.d.ts.map +1 -1
- package/dist/modules/background/index.js +1172 -1270
- package/dist/modules/background/index.js.map +1 -1
- package/dist/modules/background/overlay.d.ts +1 -1
- package/dist/modules/background/overlay.d.ts.map +1 -1
- package/dist/modules/background/types.d.ts +1 -1
- package/dist/modules/background/types.d.ts.map +1 -1
- package/dist/modules/context-menu/constants.d.ts +1 -1
- package/dist/modules/context-menu/constants.d.ts.map +1 -1
- package/dist/modules/context-menu/context.d.ts.map +1 -1
- package/dist/modules/context-menu/hooks.d.ts.map +1 -1
- package/dist/modules/context-menu/index.js +135 -240
- package/dist/modules/context-menu/index.js.map +1 -1
- package/dist/modules/controls/constants.d.ts +1 -1
- package/dist/modules/controls/constants.d.ts.map +1 -1
- package/dist/modules/controls/hooks.d.ts +1 -1
- package/dist/modules/controls/index.js +31 -165
- package/dist/modules/controls/index.js.map +1 -1
- package/dist/modules/controls/types.d.ts +1 -1
- package/dist/modules/controls/types.d.ts.map +1 -1
- package/dist/modules/dock/cards.d.ts +1 -1
- package/dist/modules/dock/constants.d.ts +1 -1
- package/dist/modules/dock/constants.d.ts.map +1 -1
- package/dist/modules/dock/context.d.ts +10 -6
- package/dist/modules/dock/context.d.ts.map +1 -1
- package/dist/modules/dock/hooks.d.ts +4 -4
- package/dist/modules/dock/hooks.d.ts.map +1 -1
- package/dist/modules/dock/index.d.ts +1 -1
- package/dist/modules/dock/index.d.ts.map +1 -1
- package/dist/modules/dock/index.js +2063 -2083
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts +1 -1
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.js +10193 -10350
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loading/constants.d.ts +4 -2
- package/dist/modules/loading/constants.d.ts.map +1 -1
- package/dist/modules/loading/context.d.ts +3 -0
- package/dist/modules/loading/context.d.ts.map +1 -1
- package/dist/modules/loading/hooks.d.ts +1 -1
- package/dist/modules/loading/hooks.d.ts.map +1 -1
- package/dist/modules/loading/index.d.ts +2 -2
- package/dist/modules/loading/index.d.ts.map +1 -1
- package/dist/modules/loading/index.js +121 -225
- package/dist/modules/loading/index.js.map +1 -1
- package/dist/modules/loading/types.d.ts +1 -1
- package/dist/modules/loading/types.d.ts.map +1 -1
- package/dist/modules/media/constants.d.ts +2 -1
- package/dist/modules/media/constants.d.ts.map +1 -1
- package/dist/modules/media/context.d.ts +3 -0
- package/dist/modules/media/context.d.ts.map +1 -1
- package/dist/modules/media/index.d.ts +2 -2
- package/dist/modules/media/index.d.ts.map +1 -1
- package/dist/modules/media/index.js +61 -218
- package/dist/modules/media/index.js.map +1 -1
- package/dist/modules/modal/constants.d.ts +1 -1
- package/dist/modules/modal/constants.d.ts.map +1 -1
- package/dist/modules/modal/context.d.ts.map +1 -1
- package/dist/modules/modal/hooks.d.ts +2 -2
- package/dist/modules/modal/index.js +31 -293
- package/dist/modules/modal/index.js.map +1 -1
- package/dist/modules/notification/constants.d.ts +4 -2
- package/dist/modules/notification/constants.d.ts.map +1 -1
- package/dist/modules/notification/context.d.ts +4 -0
- package/dist/modules/notification/context.d.ts.map +1 -1
- package/dist/modules/notification/hooks.d.ts +1 -1
- package/dist/modules/notification/index.d.ts +2 -3
- package/dist/modules/notification/index.d.ts.map +1 -1
- package/dist/modules/notification/index.js +65 -151
- package/dist/modules/notification/index.js.map +1 -1
- package/dist/modules/notification/module.d.ts.map +1 -1
- package/dist/provider.js +255 -257
- package/dist/provider.js.map +1 -1
- package/dist/theme.d.ts +1 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +2 -2
- package/dist/theme.js.map +1 -1
- package/dist/utils/dom.d.ts +2 -0
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +28 -19
- package/dist/utils/index.js.map +1 -1
- package/docs/modules/loading.md +1 -1
- package/package.json +48 -2
- package/dist/hooks/use-async-action.d.ts +0 -3
- package/dist/hooks/use-async-action.d.ts.map +0 -1
- package/dist/hooks/use-debounce.d.ts +0 -2
- package/dist/hooks/use-debounce.d.ts.map +0 -1
- package/dist/hooks/use-intersection-observer.d.ts +0 -4
- package/dist/hooks/use-intersection-observer.d.ts.map +0 -1
- package/dist/hooks/use-media-query.d.ts +0 -2
- package/dist/hooks/use-media-query.d.ts.map +0 -1
- package/dist/hooks/use-mounted.d.ts +0 -2
- package/dist/hooks/use-mounted.d.ts.map +0 -1
- package/dist/hooks/use-server-action.d.ts +0 -4
- package/dist/hooks/use-server-action.d.ts.map +0 -1
- package/dist/hooks/use-storage-state.d.ts +0 -5
- package/dist/hooks/use-storage-state.d.ts.map +0 -1
- package/dist/modules/theme.d.ts +0 -3
- package/dist/modules/theme.d.ts.map +0 -1
- package/dist/utils/json.d.ts +0 -3
- package/dist/utils/json.d.ts.map +0 -1
package/dist/theme.d.ts
CHANGED
|
@@ -22,4 +22,5 @@ export declare function ThemeProvider({ children, themes, }: {
|
|
|
22
22
|
themes: readonly ThemeEntry[];
|
|
23
23
|
}): import("react").FunctionComponentElement<import("react").ProviderProps<ReadonlyMap<string, ThemeConfig<string>>>>;
|
|
24
24
|
export declare function useTheme<S extends string>(spec: ThemeSpec<S>): ResolvedTheme<S>;
|
|
25
|
+
export { useTheme as useModuleTheme };
|
|
25
26
|
//# sourceMappingURL=theme.d.ts.map
|
package/dist/theme.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAClD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM;IAC7C,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAE1E;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAC9B,UAAU,CAEZ;AAQD,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,qHAGA;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GACjB,aAAa,CAAC,CAAC,CAAC,CAWlB;AAED,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,CAAC"}
|
package/dist/theme.js
CHANGED
|
@@ -30,7 +30,7 @@ function useTheme(spec) {
|
|
|
30
30
|
const config = useContext(ThemeContext).get(spec.id);
|
|
31
31
|
if (!config) {
|
|
32
32
|
throw new Error(
|
|
33
|
-
`Theme "${spec.id}" is missing.
|
|
33
|
+
`Theme "${spec.id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
36
|
return {
|
|
@@ -39,6 +39,6 @@ function useTheme(spec) {
|
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
export { ThemeProvider, defineTheme, defineThemeSpec, useTheme };
|
|
42
|
+
export { ThemeProvider, defineTheme, defineThemeSpec, useTheme as useModuleTheme, useTheme };
|
|
43
43
|
//# sourceMappingURL=theme.js.map
|
|
44
44
|
//# sourceMappingURL=theme.js.map
|
package/dist/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/kernel/context-registry.ts","../src/theme.tsx"],"names":[],"mappings":";;AAEO,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;;;ACkBO,SAAS,gBAAkC,EAAA,EAA0B;AAC1E,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,CAAA;AAC7B;AAEO,SAAS,WAAA,CACd,MACA,MAAA,EACY;AACZ,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,MAAA,EAAuC;AAC/D;
|
|
1
|
+
{"version":3,"sources":["../src/kernel/context-registry.ts","../src/theme.tsx"],"names":[],"mappings":";;AAEO,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;;;ACkBO,SAAS,gBAAkC,EAAA,EAA0B;AAC1E,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,CAAA;AAC7B;AAEO,SAAS,WAAA,CACd,MACA,MAAA,EACY;AACZ,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,MAAA,EAAuC;AAC/D;AAEA,IAAM,KAAA,uBAAuD,GAAA,EAAI;AACjE,IAAM,YAAA,GAAe,wBAAA,CAEnB,cAAA,EAAgB,KAAK,CAAA;AAGhB,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AACvE,EAAA,OAAO,cAAc,YAAA,CAAa,QAAA,EAAU,EAAE,KAAA,EAAO,OAAA,IAAW,QAAQ,CAAA;AAC1E;AAEO,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","file":"theme.js","sourcesContent":["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","\"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"]}
|
package/dist/utils/dom.d.ts
CHANGED
package/dist/utils/dom.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,EAAE,OAAuC,CAAC;AAWhE,wBAAgB,uBAAuB,IAAI,MAAM,IAAI,CAkCpD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAInC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAGvC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { cn } from "./cn";
|
|
2
|
-
export { isBrowser, acquireGlobalScrollLock } from "./dom";
|
|
2
|
+
export { isBrowser, acquireGlobalScrollLock, getCurrentPath, getSiteUrl, } from "./dom";
|
|
3
3
|
export { trimToNull, stripTrailingSlash, normalizePath, isImageIconSource, } from "./string";
|
|
4
4
|
export { clamp, toFiniteNumber } from "./number";
|
|
5
5
|
export { isObject, isPlainObject, shallowEqual, toArray } from "./object";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,cAAc,EACd,UAAU,GACX,MAAM,OAAO,CAAC;AACf,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -6,6 +6,26 @@ function cn(...inputs) {
|
|
|
6
6
|
return twMerge(clsx(inputs));
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
// src/utils/string.ts
|
|
10
|
+
function trimToNull(value) {
|
|
11
|
+
if (value === null || value === void 0) return null;
|
|
12
|
+
const trimmed = String(value).trim();
|
|
13
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
14
|
+
}
|
|
15
|
+
function stripTrailingSlash(url) {
|
|
16
|
+
if (typeof url !== "string") return "";
|
|
17
|
+
return url.replace(/\/+$/, "");
|
|
18
|
+
}
|
|
19
|
+
function normalizePath(path) {
|
|
20
|
+
const trimmed = trimToNull(path);
|
|
21
|
+
if (!trimmed) return "";
|
|
22
|
+
if (trimmed === "/") return "/";
|
|
23
|
+
return stripTrailingSlash(trimmed);
|
|
24
|
+
}
|
|
25
|
+
function isImageIconSource(icon) {
|
|
26
|
+
return typeof icon === "string" && (icon.startsWith("http://") || icon.startsWith("https://") || icon.startsWith("/") || icon.startsWith("data:image/"));
|
|
27
|
+
}
|
|
28
|
+
|
|
9
29
|
// src/utils/dom.ts
|
|
10
30
|
var isBrowser = typeof window !== "undefined";
|
|
11
31
|
var globalScrollLockCount = 0;
|
|
@@ -39,25 +59,14 @@ function acquireGlobalScrollLock() {
|
|
|
39
59
|
globalScrollLockStyles = null;
|
|
40
60
|
};
|
|
41
61
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const trimmed = String(value).trim();
|
|
47
|
-
return trimmed.length > 0 ? trimmed : null;
|
|
62
|
+
function getSiteUrl() {
|
|
63
|
+
return stripTrailingSlash(
|
|
64
|
+
process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000"
|
|
65
|
+
);
|
|
48
66
|
}
|
|
49
|
-
function
|
|
50
|
-
if (
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
function normalizePath(path) {
|
|
54
|
-
const trimmed = trimToNull(path);
|
|
55
|
-
if (!trimmed) return "";
|
|
56
|
-
if (trimmed === "/") return "/";
|
|
57
|
-
return stripTrailingSlash(trimmed);
|
|
58
|
-
}
|
|
59
|
-
function isImageIconSource(icon) {
|
|
60
|
-
return typeof icon === "string" && (icon.startsWith("http://") || icon.startsWith("https://") || icon.startsWith("/") || icon.startsWith("data:image/"));
|
|
67
|
+
function getCurrentPath() {
|
|
68
|
+
if (!isBrowser) return "/";
|
|
69
|
+
return `${window.location.pathname}${window.location.search}`;
|
|
61
70
|
}
|
|
62
71
|
|
|
63
72
|
// src/utils/number.ts
|
|
@@ -415,6 +424,6 @@ function createScheduler({
|
|
|
415
424
|
});
|
|
416
425
|
}
|
|
417
426
|
|
|
418
|
-
export { USER_MESSAGES, UserError, acquireGlobalScrollLock, clamp, cn, createScheduler, createStore, debounce, isBrowser, isImageIconSource, isObject, isPlainObject, normalizePath, report, setReportSink, shallowEqual, stripTrailingSlash, throttle, toArray, toFiniteNumber, toUserMessage, trimToNull };
|
|
427
|
+
export { USER_MESSAGES, UserError, acquireGlobalScrollLock, clamp, cn, createScheduler, createStore, debounce, getCurrentPath, getSiteUrl, isBrowser, isImageIconSource, isObject, isPlainObject, normalizePath, report, setReportSink, shallowEqual, stripTrailingSlash, throttle, toArray, toFiniteNumber, toUserMessage, trimToNull };
|
|
419
428
|
//# sourceMappingURL=index.js.map
|
|
420
429
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/cn.ts","../../src/utils/dom.ts","../../src/utils/string.ts","../../src/utils/number.ts","../../src/utils/object.ts","../../src/utils/timing.ts","../../src/utils/report.ts","../../src/utils/user-message.ts","../../src/utils/store.ts","../../src/utils/scheduler.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","export 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","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","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 function debounce<T extends (...args: never[]) => void>(\n func: T,\n wait: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n function debounced(...args: Parameters<T>): void {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n func(...args);\n }, wait);\n }\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n return debounced;\n}\n\nexport function throttle<T extends (...args: never[]) => void>(\n func: T,\n limit: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let lastRan = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const throttled: ((...args: Parameters<T>) => void) & {\n cancel: () => void;\n } = function (...args: Parameters<T>): void {\n const now = Date.now();\n if (now - lastRan >= limit) {\n lastRan = now;\n func(...args);\n } else if (timerId === null) {\n timerId = setTimeout(\n () => {\n lastRan = Date.now();\n timerId = null;\n func(...args);\n },\n limit - (now - lastRan),\n );\n }\n };\n throttled.cancel = () => {\n if (timerId === null) return;\n clearTimeout(timerId);\n timerId = null;\n };\n return throttled;\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","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\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","import { report } from \"./report\";\nconst DEFAULT_SCHEDULER_FRAME_MS = 16;\n\nconst EMPTY_SCHEDULER_TASKS: readonly ScheduledTaskSnapshot[] = Object.freeze(\n [],\n);\n\nfunction getDefaultSchedulerNow(): number {\n return typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport interface ScheduledTaskSnapshot {\n readonly createdAt: number;\n readonly dueAt: number;\n readonly id: number;\n readonly kind: \"timer\" | \"frame\";\n readonly label: string;\n}\n\nexport interface SchedulerSnapshot {\n readonly pendingCount: number;\n readonly tasks: readonly ScheduledTaskSnapshot[];\n}\n\nexport type ScheduleHandle = ReturnType<typeof setTimeout> | number;\n\nexport interface CoreSchedulerOptions {\n cancelFrame?: (id: ScheduleHandle) => void;\n clearTimer?: (id: ScheduleHandle) => void;\n defaultLabel?: string;\n now?: () => number;\n requestFrame?: (cb: (time: number) => void) => ScheduleHandle;\n scheduleTimer?: (cb: () => void, delayMs?: number) => ScheduleHandle;\n}\n\nexport function createScheduler({\n cancelFrame = typeof window !== \"undefined\" &&\n typeof window.cancelAnimationFrame === \"function\"\n ? (id: ScheduleHandle) => window.cancelAnimationFrame(id as number)\n : (id: ScheduleHandle) => clearTimeout(id),\n clearTimer = (id: ScheduleHandle) => clearTimeout(id),\n defaultLabel = \"scheduled-task\",\n now = getDefaultSchedulerNow,\n requestFrame = typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ? (cb: FrameRequestCallback) => window.requestAnimationFrame(cb)\n : (cb: FrameRequestCallback) =>\n setTimeout(cb, DEFAULT_SCHEDULER_FRAME_MS) as unknown as number,\n scheduleTimer = (cb: () => void, delayMs?: number) => setTimeout(cb, delayMs),\n}: CoreSchedulerOptions = {}) {\n const listeners = new Set<() => void>();\n const tasks = new Map<\n number,\n {\n cancel: (id: ScheduleHandle) => void;\n createdAt: number;\n dueAt: number;\n id: number;\n kind: \"timer\" | \"frame\";\n label: string;\n nativeId: ScheduleHandle;\n }\n >();\n let nextTaskId = 0;\n let snapshot: SchedulerSnapshot = {\n pendingCount: 0,\n tasks: EMPTY_SCHEDULER_TASKS,\n };\n\n const publish = () => {\n const currentTasks: ScheduledTaskSnapshot[] = [];\n for (const task of tasks.values()) {\n currentTasks.push({\n createdAt: task.createdAt,\n dueAt: task.dueAt,\n id: task.id,\n kind: task.kind,\n label: task.label,\n });\n }\n\n snapshot = {\n pendingCount: tasks.size,\n tasks: currentTasks,\n };\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Scheduler subscriber\", error, \"warn\");\n }\n }\n };\n\n const scheduleInternal = (\n kind: \"timer\" | \"frame\",\n callback: (timestamp: number) => void,\n delayMs: number,\n options: { label?: string } = {},\n ): number | null => {\n if (typeof callback !== \"function\") return null;\n\n const safeDelay = Math.max(0, Number(delayMs) || 0);\n const taskId = ++nextTaskId;\n const createdAt = now();\n\n const invoke = (timestamp = now()) => {\n if (!tasks.has(taskId)) return;\n tasks.delete(taskId);\n publish();\n callback(timestamp);\n };\n\n const nativeId =\n kind === \"frame\"\n ? requestFrame(invoke)\n : scheduleTimer(invoke, safeDelay);\n\n tasks.set(taskId, {\n cancel: kind === \"frame\" ? cancelFrame : clearTimer,\n createdAt,\n dueAt:\n createdAt + (kind === \"frame\" ? DEFAULT_SCHEDULER_FRAME_MS : safeDelay),\n id: taskId,\n kind,\n label:\n typeof options.label === \"string\" && options.label\n ? options.label\n : defaultLabel,\n nativeId,\n });\n\n publish();\n return taskId;\n };\n\n const cancel = (taskId: number): boolean => {\n const task = tasks.get(taskId);\n if (!task) return false;\n\n tasks.delete(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n\n publish();\n return true;\n };\n\n return Object.freeze({\n cancel,\n cancelAll(): number[] {\n if (tasks.size === 0) return [];\n\n const taskIds: number[] = [];\n for (const [taskId, task] of tasks) {\n taskIds.push(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n }\n\n tasks.clear();\n publish();\n return taskIds;\n },\n getSnapshot(): SchedulerSnapshot {\n return snapshot;\n },\n now,\n schedule(\n callback: (timestamp: number) => void,\n delayMs = 0,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\"timer\", callback, delayMs, options);\n },\n scheduleFrame(\n callback: (timestamp: number) => void,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\n \"frame\",\n callback,\n DEFAULT_SCHEDULER_FRAME_MS,\n options,\n );\n },\n subscribe(listener: () => void): () => void {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/utils/string.ts","../../src/utils/dom.ts","../../src/utils/number.ts","../../src/utils/object.ts","../../src/utils/timing.ts","../../src/utils/report.ts","../../src/utils/user-message.ts","../../src/utils/store.ts","../../src/utils/scheduler.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\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 function debounce<T extends (...args: never[]) => void>(\n func: T,\n wait: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n function debounced(...args: Parameters<T>): void {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n func(...args);\n }, wait);\n }\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n return debounced;\n}\n\nexport function throttle<T extends (...args: never[]) => void>(\n func: T,\n limit: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let lastRan = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const throttled: ((...args: Parameters<T>) => void) & {\n cancel: () => void;\n } = function (...args: Parameters<T>): void {\n const now = Date.now();\n if (now - lastRan >= limit) {\n lastRan = now;\n func(...args);\n } else if (timerId === null) {\n timerId = setTimeout(\n () => {\n lastRan = Date.now();\n timerId = null;\n func(...args);\n },\n limit - (now - lastRan),\n );\n }\n };\n throttled.cancel = () => {\n if (timerId === null) return;\n clearTimeout(timerId);\n timerId = null;\n };\n return throttled;\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","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\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","import { report } from \"./report\";\nconst DEFAULT_SCHEDULER_FRAME_MS = 16;\n\nconst EMPTY_SCHEDULER_TASKS: readonly ScheduledTaskSnapshot[] = Object.freeze(\n [],\n);\n\nfunction getDefaultSchedulerNow(): number {\n return typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport interface ScheduledTaskSnapshot {\n readonly createdAt: number;\n readonly dueAt: number;\n readonly id: number;\n readonly kind: \"timer\" | \"frame\";\n readonly label: string;\n}\n\nexport interface SchedulerSnapshot {\n readonly pendingCount: number;\n readonly tasks: readonly ScheduledTaskSnapshot[];\n}\n\nexport type ScheduleHandle = ReturnType<typeof setTimeout> | number;\n\nexport interface CoreSchedulerOptions {\n cancelFrame?: (id: ScheduleHandle) => void;\n clearTimer?: (id: ScheduleHandle) => void;\n defaultLabel?: string;\n now?: () => number;\n requestFrame?: (cb: (time: number) => void) => ScheduleHandle;\n scheduleTimer?: (cb: () => void, delayMs?: number) => ScheduleHandle;\n}\n\nexport function createScheduler({\n cancelFrame = typeof window !== \"undefined\" &&\n typeof window.cancelAnimationFrame === \"function\"\n ? (id: ScheduleHandle) => window.cancelAnimationFrame(id as number)\n : (id: ScheduleHandle) => clearTimeout(id),\n clearTimer = (id: ScheduleHandle) => clearTimeout(id),\n defaultLabel = \"scheduled-task\",\n now = getDefaultSchedulerNow,\n requestFrame = typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ? (cb: FrameRequestCallback) => window.requestAnimationFrame(cb)\n : (cb: FrameRequestCallback) =>\n setTimeout(cb, DEFAULT_SCHEDULER_FRAME_MS) as unknown as number,\n scheduleTimer = (cb: () => void, delayMs?: number) => setTimeout(cb, delayMs),\n}: CoreSchedulerOptions = {}) {\n const listeners = new Set<() => void>();\n const tasks = new Map<\n number,\n {\n cancel: (id: ScheduleHandle) => void;\n createdAt: number;\n dueAt: number;\n id: number;\n kind: \"timer\" | \"frame\";\n label: string;\n nativeId: ScheduleHandle;\n }\n >();\n let nextTaskId = 0;\n let snapshot: SchedulerSnapshot = {\n pendingCount: 0,\n tasks: EMPTY_SCHEDULER_TASKS,\n };\n\n const publish = () => {\n const currentTasks: ScheduledTaskSnapshot[] = [];\n for (const task of tasks.values()) {\n currentTasks.push({\n createdAt: task.createdAt,\n dueAt: task.dueAt,\n id: task.id,\n kind: task.kind,\n label: task.label,\n });\n }\n\n snapshot = {\n pendingCount: tasks.size,\n tasks: currentTasks,\n };\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Scheduler subscriber\", error, \"warn\");\n }\n }\n };\n\n const scheduleInternal = (\n kind: \"timer\" | \"frame\",\n callback: (timestamp: number) => void,\n delayMs: number,\n options: { label?: string } = {},\n ): number | null => {\n if (typeof callback !== \"function\") return null;\n\n const safeDelay = Math.max(0, Number(delayMs) || 0);\n const taskId = ++nextTaskId;\n const createdAt = now();\n\n const invoke = (timestamp = now()) => {\n if (!tasks.has(taskId)) return;\n tasks.delete(taskId);\n publish();\n callback(timestamp);\n };\n\n const nativeId =\n kind === \"frame\"\n ? requestFrame(invoke)\n : scheduleTimer(invoke, safeDelay);\n\n tasks.set(taskId, {\n cancel: kind === \"frame\" ? cancelFrame : clearTimer,\n createdAt,\n dueAt:\n createdAt + (kind === \"frame\" ? DEFAULT_SCHEDULER_FRAME_MS : safeDelay),\n id: taskId,\n kind,\n label:\n typeof options.label === \"string\" && options.label\n ? options.label\n : defaultLabel,\n nativeId,\n });\n\n publish();\n return taskId;\n };\n\n const cancel = (taskId: number): boolean => {\n const task = tasks.get(taskId);\n if (!task) return false;\n\n tasks.delete(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n\n publish();\n return true;\n };\n\n return Object.freeze({\n cancel,\n cancelAll(): number[] {\n if (tasks.size === 0) return [];\n\n const taskIds: number[] = [];\n for (const [taskId, task] of tasks) {\n taskIds.push(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n }\n\n tasks.clear();\n publish();\n return taskIds;\n },\n getSnapshot(): SchedulerSnapshot {\n return snapshot;\n },\n now,\n schedule(\n callback: (timestamp: number) => void,\n delayMs = 0,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\"timer\", callback, delayMs, options);\n },\n scheduleFrame(\n callback: (timestamp: number) => void,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\n \"frame\",\n callback,\n DEFAULT_SCHEDULER_FRAME_MS,\n options,\n );\n },\n subscribe(listener: () => void): () => void {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n"]}
|
package/docs/modules/loading.md
CHANGED
|
@@ -153,5 +153,5 @@ No classes or inline styles in the module. The `loadingTheme` slot `overlay` (st
|
|
|
153
153
|
|
|
154
154
|
## 9. Dependencies
|
|
155
155
|
|
|
156
|
-
- **Uses:** `@omerdlw/base-framework/kernel` (`defineModule`, `useModuleRegistration`, `useRegistryValue`), `@omerdlw/base-framework/atoms` (`Spinner
|
|
156
|
+
- **Uses:** `@omerdlw/base-framework/kernel` (`defineModule`, `useModuleRegistration`, `useRegistryValue`), `@omerdlw/base-framework/atoms` (`Spinner`), `@omerdlw/base-framework/hooks` (`useIsFullscreenStateActive`), `@omerdlw/base-framework/utils` (`createStore`), `@omerdlw/base-framework/theme`.
|
|
157
157
|
- **Used by:** `src/core/provider.tsx` (installs it); the **dock**, which reads `isLoading` and calls `stopLoading` through `definePeer("loading")` (inert when not installed); pages and features through `useLoading*` / `page.modules.loading`.
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omerdlw/base-framework",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Microkernel engine and first-party declarative UI modules for app-like Next.js products.",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
6
7
|
"main": "./dist/index.js",
|
|
7
8
|
"types": "./dist/index.d.ts",
|
|
8
9
|
"exports": {
|
|
@@ -61,6 +62,51 @@
|
|
|
61
62
|
"import": "./dist/atoms/index.js",
|
|
62
63
|
"default": "./dist/atoms/index.js"
|
|
63
64
|
},
|
|
65
|
+
"./dock": {
|
|
66
|
+
"types": "./dist/modules/dock/index.d.ts",
|
|
67
|
+
"import": "./dist/modules/dock/index.js",
|
|
68
|
+
"default": "./dist/modules/dock/index.js"
|
|
69
|
+
},
|
|
70
|
+
"./modal": {
|
|
71
|
+
"types": "./dist/modules/modal/index.d.ts",
|
|
72
|
+
"import": "./dist/modules/modal/index.js",
|
|
73
|
+
"default": "./dist/modules/modal/index.js"
|
|
74
|
+
},
|
|
75
|
+
"./notification": {
|
|
76
|
+
"types": "./dist/modules/notification/index.d.ts",
|
|
77
|
+
"import": "./dist/modules/notification/index.js",
|
|
78
|
+
"default": "./dist/modules/notification/index.js"
|
|
79
|
+
},
|
|
80
|
+
"./ambient": {
|
|
81
|
+
"types": "./dist/modules/ambient/index.d.ts",
|
|
82
|
+
"import": "./dist/modules/ambient/index.js",
|
|
83
|
+
"default": "./dist/modules/ambient/index.js"
|
|
84
|
+
},
|
|
85
|
+
"./background": {
|
|
86
|
+
"types": "./dist/modules/background/index.d.ts",
|
|
87
|
+
"import": "./dist/modules/background/index.js",
|
|
88
|
+
"default": "./dist/modules/background/index.js"
|
|
89
|
+
},
|
|
90
|
+
"./context-menu": {
|
|
91
|
+
"types": "./dist/modules/context-menu/index.d.ts",
|
|
92
|
+
"import": "./dist/modules/context-menu/index.js",
|
|
93
|
+
"default": "./dist/modules/context-menu/index.js"
|
|
94
|
+
},
|
|
95
|
+
"./controls": {
|
|
96
|
+
"types": "./dist/modules/controls/index.d.ts",
|
|
97
|
+
"import": "./dist/modules/controls/index.js",
|
|
98
|
+
"default": "./dist/modules/controls/index.js"
|
|
99
|
+
},
|
|
100
|
+
"./loading": {
|
|
101
|
+
"types": "./dist/modules/loading/index.d.ts",
|
|
102
|
+
"import": "./dist/modules/loading/index.js",
|
|
103
|
+
"default": "./dist/modules/loading/index.js"
|
|
104
|
+
},
|
|
105
|
+
"./media": {
|
|
106
|
+
"types": "./dist/modules/media/index.d.ts",
|
|
107
|
+
"import": "./dist/modules/media/index.js",
|
|
108
|
+
"default": "./dist/modules/media/index.js"
|
|
109
|
+
},
|
|
64
110
|
"./modules": {
|
|
65
111
|
"types": "./dist/modules/index.d.ts",
|
|
66
112
|
"import": "./dist/modules/index.js",
|
|
@@ -80,7 +126,7 @@
|
|
|
80
126
|
"LICENSE"
|
|
81
127
|
],
|
|
82
128
|
"scripts": {
|
|
83
|
-
"build": "tsup && tsc --emitDeclarationOnly --outDir dist",
|
|
129
|
+
"build": "rm -rf dist && tsup && tsc --emitDeclarationOnly --outDir dist",
|
|
84
130
|
"prepublishOnly": "npm run build",
|
|
85
131
|
"dev": "tsup --watch",
|
|
86
132
|
"type-check": "tsc --noEmit",
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { UseAsyncActionOptions, UseAsyncActionResult } from "./types";
|
|
2
|
-
export declare function useAsyncAction<TArgs extends unknown[] = unknown[], TResult = unknown>(actionFn: (...args: TArgs) => Promise<TResult>, options?: UseAsyncActionOptions<TResult>): UseAsyncActionResult<TArgs, TResult>;
|
|
3
|
-
//# sourceMappingURL=use-async-action.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-async-action.d.ts","sourceRoot":"","sources":["../../src/hooks/use-async-action.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEtE,wBAAgB,cAAc,CAC5B,KAAK,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EACnC,OAAO,GAAG,OAAO,EAEjB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,EAC9C,OAAO,GAAE,qBAAqB,CAAC,OAAO,CAAM,GAC3C,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAmEtC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounce.d.ts","sourceRoot":"","sources":["../../src/hooks/use-debounce.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAE,MAAY,GAAG,CAAC,CAS/D"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type RefObject } from "react";
|
|
2
|
-
import { UseIntersectionObserverOptions, UseIntersectionObserverResult } from "./types";
|
|
3
|
-
export declare function useIntersectionObserver<T extends Element = Element>(targetRef: RefObject<T | null> | null | undefined, options?: UseIntersectionObserverOptions): UseIntersectionObserverResult;
|
|
4
|
-
//# sourceMappingURL=use-intersection-observer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-intersection-observer.d.ts","sourceRoot":"","sources":["../../src/hooks/use-intersection-observer.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpE,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,EAC9B,MAAM,SAAS,CAAC;AAEjB,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EACjE,SAAS,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,OAAO,GAAE,8BAAmC,GAC3C,6BAA6B,CAiD/B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-media-query.d.ts","sourceRoot":"","sources":["../../src/hooks/use-media-query.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,OAAe,GAC9B,OAAO,CAuBT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-mounted.d.ts","sourceRoot":"","sources":["../../src/hooks/use-mounted.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,IAAI,OAAO,CAMpC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type Result } from "@/result";
|
|
2
|
-
import { UseServerActionOptions, UseServerActionResult } from "./types";
|
|
3
|
-
export declare function useServerAction<TArgs extends unknown[] = unknown[], T = unknown, E = string>(actionFn: (...args: TArgs) => Promise<Result<T, E>>, options?: UseServerActionOptions<T, E>): UseServerActionResult<TArgs, T, E>;
|
|
4
|
-
//# sourceMappingURL=use-server-action.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-server-action.d.ts","sourceRoot":"","sources":["../../src/hooks/use-server-action.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAExE,wBAAgB,eAAe,CAC7B,KAAK,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EACnC,CAAC,GAAG,OAAO,EACX,CAAC,GAAG,MAAM,EAEV,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EACnD,OAAO,GAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAM,GACzC,qBAAqB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CA6EpC"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { UseStorageStateOptions } from "./types";
|
|
2
|
-
export declare function useStorageState<T>(key: string, initialValue: T, options?: UseStorageStateOptions<T>): [T, (next: T | ((prev: T) => T)) => void, () => void];
|
|
3
|
-
export declare function useLocalStorage<T>(key: string, initialValue: T, options?: Omit<UseStorageStateOptions<T>, "storage">): [T, (next: T | ((prev: T) => T)) => void, () => void];
|
|
4
|
-
export declare function useSessionStorage<T>(key: string, initialValue: T, options?: Omit<UseStorageStateOptions<T>, "storage">): [T, (next: T | ((prev: T) => T)) => void, () => void];
|
|
5
|
-
//# sourceMappingURL=use-storage-state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-storage-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-storage-state.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAajD,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,EACf,OAAO,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACtC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC,CAgHvD;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,EACf,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GACnD,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,EACf,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GACnD,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC,CAEvD"}
|
package/dist/modules/theme.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/modules/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,QAAQ,IAAI,cAAc,GAC3B,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAC"}
|
package/dist/utils/json.d.ts
DELETED
package/dist/utils/json.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,GAAG,OAAO,EACvC,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,CAAC,GAAG,IAAW,GACxB,CAAC,GAAG,IAAI,CAOV;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,QAAQ,GAAE,MAAW,GACpB,MAAM,CAMR"}
|