@vef-framework-react/starter 2.2.2 → 2.3.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.
Files changed (112) hide show
  1. package/dist/cjs/helpers/auth.cjs +1 -1
  2. package/dist/cjs/routes/layout.cjs +1 -1
  3. package/dist/cjs/stores/app.cjs +1 -1
  4. package/dist/es/components/access-denied/access-denied-icon.js +1 -1
  5. package/dist/es/components/access-denied/index.js +1 -1
  6. package/dist/es/components/app/index.js +1 -1
  7. package/dist/es/components/base-layout/index.js +1 -1
  8. package/dist/es/components/base-layout/styles.js +1 -1
  9. package/dist/es/components/base-layout/use-base-layout.js +1 -1
  10. package/dist/es/components/error/error-icon.js +1 -1
  11. package/dist/es/components/error/index.js +1 -1
  12. package/dist/es/components/index.js +1 -1
  13. package/dist/es/components/layout/components/footer.js +1 -1
  14. package/dist/es/components/layout/components/header/boy-icon.js +1 -1
  15. package/dist/es/components/layout/components/header/breadcrumb-navigation.js +1 -1
  16. package/dist/es/components/layout/components/header/color-scheme.js +1 -1
  17. package/dist/es/components/layout/components/header/fullscreen.js +1 -1
  18. package/dist/es/components/layout/components/header/girl-icon.js +1 -1
  19. package/dist/es/components/layout/components/header/index.js +1 -1
  20. package/dist/es/components/layout/components/header/menu-burger.js +1 -1
  21. package/dist/es/components/layout/components/header/menu-fold-left-icon.js +1 -1
  22. package/dist/es/components/layout/components/header/menu-unfold-left-icon.js +1 -1
  23. package/dist/es/components/layout/components/header/search.js +1 -1
  24. package/dist/es/components/layout/components/header/theme-config.js +1 -1
  25. package/dist/es/components/layout/components/header/user-avatar.js +1 -1
  26. package/dist/es/components/layout/components/honeycomb-pattern.js +1 -1
  27. package/dist/es/components/layout/components/index.js +1 -1
  28. package/dist/es/components/layout/components/logo.js +1 -1
  29. package/dist/es/components/layout/components/menu.js +1 -1
  30. package/dist/es/components/layout/components/search/index.js +1 -1
  31. package/dist/es/components/layout/components/search/keyboard-arrow-down-icon.js +1 -1
  32. package/dist/es/components/layout/components/search/keyboard-arrow-up-icon.js +1 -1
  33. package/dist/es/components/layout/components/search/keyboard-control-icon.js +1 -1
  34. package/dist/es/components/layout/components/search/keyboard-esc-icon.js +1 -1
  35. package/dist/es/components/layout/components/search/keyboard-help.js +1 -1
  36. package/dist/es/components/layout/components/search/keyboard-return-icon.js +1 -1
  37. package/dist/es/components/layout/components/search/keyboard-shift-icon.js +1 -1
  38. package/dist/es/components/layout/components/search/keyboard.js +1 -1
  39. package/dist/es/components/layout/components/search/letter-s-icon.js +1 -1
  40. package/dist/es/components/layout/components/search/search-result-item.js +1 -1
  41. package/dist/es/components/layout/components/search/search-result.js +1 -1
  42. package/dist/es/components/layout/components/sidebar.js +1 -1
  43. package/dist/es/components/layout/components/tabs/context-menu.js +1 -1
  44. package/dist/es/components/layout/components/tabs/index.js +1 -1
  45. package/dist/es/components/layout/components/tabs/main-content-maximum.js +1 -1
  46. package/dist/es/components/layout/components/tabs/reload.js +1 -1
  47. package/dist/es/components/layout/components/tabs/tab-item.js +1 -1
  48. package/dist/es/components/layout/components/tabs/tab-list.js +1 -1
  49. package/dist/es/components/layout/components/tabs/tabs-container.js +1 -1
  50. package/dist/es/components/layout/components/theme-config/color-scheme-switcher.js +1 -1
  51. package/dist/es/components/layout/components/theme-config/color-scheme.js +1 -1
  52. package/dist/es/components/layout/components/theme-config/config-item.js +1 -1
  53. package/dist/es/components/layout/components/theme-config/index.js +1 -1
  54. package/dist/es/components/layout/components/theme-config/menu-layout-card.js +1 -1
  55. package/dist/es/components/layout/components/theme-config/menu-layout.js +1 -1
  56. package/dist/es/components/layout/components/theme-config/operations.js +1 -1
  57. package/dist/es/components/layout/components/theme-config/theme-color-picker.js +1 -1
  58. package/dist/es/components/layout/components/theme-config/theme-colors.js +1 -1
  59. package/dist/es/components/layout/hooks/index.js +1 -1
  60. package/dist/es/components/layout/hooks/use-color-scheme-updater.js +1 -1
  61. package/dist/es/components/layout/hooks/use-menu-navigate.js +1 -1
  62. package/dist/es/components/layout/hooks/use-tab-navigate.js +1 -1
  63. package/dist/es/components/layout/index.js +1 -1
  64. package/dist/es/components/layout/store.js +1 -1
  65. package/dist/es/components/layout/styles.js +1 -1
  66. package/dist/es/components/login/icon-login.js +1 -1
  67. package/dist/es/components/login/index.js +1 -1
  68. package/dist/es/components/login/styles.js +1 -1
  69. package/dist/es/components/login/welcome-messages.js +1 -1
  70. package/dist/es/components/n-progress/components/bar.js +1 -1
  71. package/dist/es/components/n-progress/components/container.js +1 -1
  72. package/dist/es/components/n-progress/components/index.js +1 -1
  73. package/dist/es/components/n-progress/event.js +1 -1
  74. package/dist/es/components/n-progress/index.js +1 -1
  75. package/dist/es/components/not-found/index.js +1 -1
  76. package/dist/es/components/not-found/not-found-icon.js +1 -1
  77. package/dist/es/components/router-provider/context.js +1 -1
  78. package/dist/es/components/router-provider/index.js +1 -1
  79. package/dist/es/components/theme-config-provider/global-style.js +1 -1
  80. package/dist/es/components/theme-config-provider/index.js +1 -1
  81. package/dist/es/components/theme-config-provider/use-color-mode-effect.js +1 -1
  82. package/dist/es/components/theme-config-provider/use-theme-config.js +1 -1
  83. package/dist/es/constants/event.js +1 -1
  84. package/dist/es/constants/index.js +1 -1
  85. package/dist/es/constants/router.js +1 -1
  86. package/dist/es/constants/storage.js +1 -1
  87. package/dist/es/helpers/api.js +1 -1
  88. package/dist/es/helpers/app-version.js +1 -1
  89. package/dist/es/helpers/app.js +1 -1
  90. package/dist/es/helpers/auth.js +10 -2
  91. package/dist/es/helpers/event.js +1 -1
  92. package/dist/es/helpers/index.js +1 -1
  93. package/dist/es/helpers/query.js +1 -1
  94. package/dist/es/helpers/router.js +1 -1
  95. package/dist/es/hooks/index.js +1 -1
  96. package/dist/es/hooks/use-route-full-path.js +1 -1
  97. package/dist/es/index.js +1 -1
  98. package/dist/es/routes/access-denied.js +1 -1
  99. package/dist/es/routes/index.js +1 -1
  100. package/dist/es/routes/layout.js +20 -18
  101. package/dist/es/routes/login.js +1 -1
  102. package/dist/es/routes/root.js +1 -1
  103. package/dist/es/stores/app.js +8 -4
  104. package/dist/es/stores/index.js +1 -1
  105. package/dist/es/stores/tab.js +1 -1
  106. package/dist/es/stores/theme.js +1 -1
  107. package/dist/types/index.d.ts +1 -1
  108. package/dist/types/routes/index.d.ts +1 -1
  109. package/dist/types/routes/layout.d.ts +19 -16
  110. package/dist/types/stores/app.d.ts +4 -3
  111. package/dist/types/types/common.d.ts +8 -2
  112. package/package.json +5 -5
@@ -1,3 +1,3 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "./bar.js";
3
3
  import "./container.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { createEventEmitter as e } from "@vef-framework-react/shared";
3
3
  //#region src/components/n-progress/event.ts
4
4
  var t = e();
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { Bar as e } from "./components/bar.js";
3
3
  import { Container as t } from "./components/container.js";
4
4
  import { nProgressEventEmitter as n } from "./event.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "../../constants/router.js";
3
3
  import { NotFoundIcon as e } from "./not-found-icon.js";
4
4
  import { Button as t, Center as n, Icon as r, Result as i } from "@vef-framework-react/components";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { jsx as e, jsxs as t } from "@emotion/react/jsx-runtime";
3
3
  //#region src/components/not-found/not-found-icon.tsx
4
4
  function n(n) {
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { createContext as e, use as t } from "react";
3
3
  //#region src/components/router-provider/context.ts
4
4
  var n = e(null);
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { useRouterContextHook as e } from "./context.js";
3
3
  import { useMemo as t } from "react";
4
4
  import { jsx as n } from "@emotion/react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "@emotion/react";
3
3
  //#region src/components/theme-config-provider/global-style.ts
4
4
  function e() {
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { useColorModeEffect as e } from "./use-color-mode-effect.js";
3
3
  import { useThemeConfig as t } from "./use-theme-config.js";
4
4
  import { ConfigProvider as n } from "@vef-framework-react/components";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { useThemeStore as e } from "../../stores/theme.js";
3
3
  import { useEffect as t } from "react";
4
4
  //#region src/components/theme-config-provider/use-color-mode-effect.ts
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { useThemeStore as e } from "../../stores/theme.js";
3
3
  import { globalStyle as t } from "./global-style.js";
4
4
  import { useShallow as n } from "@vef-framework-react/core";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  //#region src/constants/event.ts
3
3
  var e = "__vef_access_denied_event", t = "__vef_unauthenticated_event";
4
4
  //#endregion
@@ -1,3 +1,3 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "./event.js";
3
3
  import "./router.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  //#region src/constants/router.ts
3
3
  var e = "/login", t = "/_common/login", n = "/", r = "/_layout", i = "/access-denied", a = "/_common/access-denied";
4
4
  //#endregion
@@ -1,2 +1,2 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  //#endregion
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { useAppStore as e } from "../stores/app.js";
3
3
  import { emitAccessDenied as t, emitUnauthenticated as n } from "./event.js";
4
4
  import { showErrorMessage as r, showInfoMessage as i, showSuccessMessage as a, showWarningMessage as o } from "@vef-framework-react/components";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { Button as e, Group as t, Icon as n, Text as r, globalCssVars as i, showInfoNotification as a } from "@vef-framework-react/components";
3
3
  import { joinPaths as o } from "@vef-framework-react/shared";
4
4
  import { Fragment as s, jsx as c, jsxs as l } from "@emotion/react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { RouterContextHookProvider as e } from "../components/router-provider/context.js";
3
3
  import { App as t } from "../components/app/index.js";
4
4
  import { StrictMode as n } from "react";
@@ -1,9 +1,17 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { LOGIN_ROUTE_PATH as e } from "../constants/router.js";
3
3
  import { useAppStore as t } from "../stores/app.js";
4
4
  //#region src/helpers/auth.ts
5
5
  async function n(n) {
6
- t.setState({ isAuthenticated: !1 }, !0), await n.navigate({ to: e }), n.invalidate({
6
+ t.setState({
7
+ isAuthenticated: !1,
8
+ authTokens: void 0,
9
+ userInfo: void 0,
10
+ userMenuMap: void 0,
11
+ menuPathMap: void 0,
12
+ menuItems: void 0,
13
+ permissionTokens: void 0
14
+ }), await n.navigate({ to: e }), n.invalidate({
7
15
  sync: !0,
8
16
  forcePending: !0
9
17
  });
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { ACCESS_DENIED_EVENT as e, UNAUTHENTICATED_EVENT as t } from "../constants/event.js";
3
3
  import { createEventEmitter as n } from "@vef-framework-react/shared";
4
4
  //#region src/helpers/event.ts
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "./event.js";
3
3
  import "./api.js";
4
4
  import "./app-version.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { SYMBOL_PAGINATION as e, SYMBOL_SORT as t } from "@vef-framework-react/components";
3
3
  //#region src/helpers/query.ts
4
4
  function n(...e) {
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { ACCESS_DENIED_ROUTE_PATH as e } from "../constants/router.js";
3
3
  import { useAppStore as t } from "../stores/app.js";
4
4
  import { useTabStore as n } from "../stores/tab.js";
@@ -1,2 +1,2 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "./use-route-full-path.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { useMemo as e } from "react";
3
3
  import { useLocation as t, useRouter as n } from "@tanstack/react-router";
4
4
  //#region src/hooks/use-route-full-path.ts
package/dist/es/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { ACCESS_DENIED_ROUTE_ID as e, ACCESS_DENIED_ROUTE_PATH as t, INDEX_ROUTE_ID as n, INDEX_ROUTE_PATH as r, LOGIN_ROUTE_ID as i, LOGIN_ROUTE_PATH as a } from "./constants/router.js";
3
3
  import { useAppStore as o } from "./stores/app.js";
4
4
  import { useTabStore as s } from "./stores/tab.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "../constants/router.js";
3
3
  import { AccessDenied as e } from "../components/access-denied/index.js";
4
4
  //#region src/routes/access-denied.ts
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "./access-denied.js";
3
3
  import "./layout.js";
4
4
  import "./login.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { ACCESS_DENIED_ROUTE_PATH as e, LOGIN_ROUTE_PATH as t } from "../constants/router.js";
3
3
  import { useAppStore as n } from "../stores/app.js";
4
4
  import { Error as r } from "../components/error/index.js";
@@ -37,38 +37,40 @@ function p(e) {
37
37
  function m(e) {
38
38
  return e.filter((e) => e.type !== "view").map((e) => Object.freeze(p(e)));
39
39
  }
40
- function h({ fetchUserInfo: o, ...p }) {
41
- function h() {
40
+ function h({ fetchUserInfo: o, beforeLoad: p, loader: h, ...g }) {
41
+ function _() {
42
42
  return /* @__PURE__ */ c(i, {
43
- ...p,
43
+ ...g,
44
44
  children: /* @__PURE__ */ c(l, {})
45
45
  });
46
46
  }
47
47
  return {
48
- beforeLoad: ({ location: r }) => {
49
- let { isAuthenticated: i, userMenuMap: a } = n.getState();
50
- if (!i) throw u({
48
+ beforeLoad: async (r) => {
49
+ let { location: i } = r, { isAuthenticated: a, userMenuMap: o } = n.getState();
50
+ if (!a) throw u({
51
51
  to: t,
52
- search: { redirect: r.href }
52
+ search: { redirect: i.href }
53
53
  });
54
- if (a && !a.has(r.pathname)) throw u({
54
+ if (o && !o.has(i.pathname)) throw u({
55
55
  to: e,
56
56
  replace: !0
57
57
  });
58
+ return await p?.(r) ?? {};
58
59
  },
59
- loader: async ({ location: t }) => {
60
- let { permTokens: r, ...i } = await o(), { menus: a } = i, s = Object.freeze(d(a)), c = Object.freeze(f(a)), l = Object.freeze(m(a));
60
+ loader: async (t) => {
61
+ let { location: r } = t, { permissionTokens: i, ...a } = await o(), { menus: s } = a, c = Object.freeze(d(s)), l = Object.freeze(f(s)), p = Object.freeze(m(s));
61
62
  if (n.setState({
62
63
  ...n.getState(),
63
- userInfo: Object.freeze(i),
64
- userMenuMap: s,
65
- menuPathMap: c,
66
- menuItems: l,
67
- permTokens: Object.freeze(new Set(r))
68
- }), !s.has(t.pathname)) throw u({
64
+ userInfo: Object.freeze(a),
65
+ userMenuMap: c,
66
+ menuPathMap: l,
67
+ menuItems: p,
68
+ permissionTokens: Object.freeze(new Set(i))
69
+ }), !c.has(r.pathname)) throw u({
69
70
  to: e,
70
71
  replace: !0
71
72
  });
73
+ if (h) return await h(t);
72
74
  },
73
75
  pendingComponent: () => /* @__PURE__ */ c(s, {
74
76
  description: "页面玩命加载中, 请稍后...",
@@ -77,7 +79,7 @@ function h({ fetchUserInfo: o, ...p }) {
77
79
  }),
78
80
  errorComponent: r,
79
81
  notFoundComponent: a,
80
- component: h,
82
+ component: _,
81
83
  staleTime: Infinity,
82
84
  shouldReload: !1
83
85
  };
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "../constants/router.js";
3
3
  import { useAppStore as e } from "../stores/app.js";
4
4
  import { Login as t } from "../components/login/index.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { useAppStore as e } from "../stores/app.js";
3
3
  import { jsx as t } from "@emotion/react/jsx-runtime";
4
4
  import { Outlet as n, useLocation as r, useRouteContext as i } from "@tanstack/react-router";
@@ -1,12 +1,16 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { createPersistedStore as e } from "@vef-framework-react/core";
3
3
  //#region src/stores/app.ts
4
- var t = e(() => ({ isAuthenticated: !1 }), {
4
+ var t = e(() => ({
5
+ isAuthenticated: !1,
6
+ custom: {}
7
+ }), {
5
8
  name: "app",
6
9
  storage: "local",
7
- selector: ({ isAuthenticated: e, authTokens: t }) => ({
10
+ selector: ({ isAuthenticated: e, custom: t, authTokens: n }) => ({
8
11
  isAuthenticated: e,
9
- authTokens: t
12
+ custom: t,
13
+ authTokens: n
10
14
  })
11
15
  });
12
16
  //#endregion
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "./app.js";
3
3
  import "./tab.js";
4
4
  import "./theme.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import "../constants/router.js";
3
3
  import { createPersistedStore as e, originalState as t } from "@vef-framework-react/core";
4
4
  //#region src/stores/tab.ts
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.2.2 made by Venus | 2026-05-18T12:44:01.943Z */
1
+ /*! @vef-framework-react/starter v2.3.0 made by Venus | 2026-05-22T09:39:55.761Z */
2
2
  import { createPersistedStore as e } from "@vef-framework-react/core";
3
3
  import { omit as t } from "@vef-framework-react/shared";
4
4
  //#region src/stores/theme.ts
@@ -1,6 +1,6 @@
1
1
  export { type LoginChallenge, type LoginChallengeRenderer, type LoginChallengeRendererProps, type LoginChallengeRenderers, type LoginParams, type LoginProps, type LoginResult, type PasswordLoginParams, type ResolveChallengeParams } from './components';
2
2
  export { ACCESS_DENIED_ROUTE_ID, ACCESS_DENIED_ROUTE_PATH, INDEX_ROUTE_ID, INDEX_ROUTE_PATH, LOGIN_ROUTE_ID, LOGIN_ROUTE_PATH } from './constants';
3
3
  export { createApiClient, createApp, createRouter, dispatchCustomEvent, emitAccessDenied, emitUnauthenticated, extractQueryParams, handleClientLogout, noopMutationFn, setupAppVersionNotification, type ApiClientOptions, type AppChangelog, type AppVersionNotificationOptions, type RouterOptions } from './helpers';
4
- export { createAccessDeniedRouteOptions, createLayoutRouteOptions, createLoginRouteOptions, createRootRouteOptions } from './routes';
4
+ export { createAccessDeniedRouteOptions, createLayoutRouteOptions, createLoginRouteOptions, createRootRouteOptions, type LayoutBeforeLoadArgs, type LayoutLoaderArgs } from './routes';
5
5
  export { useAppStore, useTabStore, useThemeStore, type AppState, type ColorScheme, type Tab, type TabState, type ThemeColors, type ThemeState } from './stores';
6
6
  export type * from './types';
@@ -1,4 +1,4 @@
1
1
  export { createAccessDeniedRouteOptions } from './access-denied';
2
- export { createLayoutRouteOptions } from './layout';
2
+ export { createLayoutRouteOptions, type LayoutBeforeLoadArgs, type LayoutLoaderArgs } from './layout';
3
3
  export { createLoginRouteOptions } from './login';
4
4
  export { createRootRouteOptions } from './root';
@@ -1,22 +1,25 @@
1
- import { ParsedLocation } from '@tanstack/react-router';
2
- import { Awaitable, Except } from '@vef-framework-react/shared';
1
+ import { RouteLoaderFn, RouteOptions } from '@tanstack/react-router';
2
+ import { AnyObject, Awaitable, EmptyObject, Except } from '@vef-framework-react/shared';
3
3
  import { LayoutProps, Error, NotFound } from '../components';
4
4
  import { UserInfo } from '../types';
5
- interface LayoutRouteOptions extends Except<LayoutProps, "children"> {
5
+ export type LayoutBeforeLoadArgs = Parameters<NonNullable<RouteOptions<unknown, any, any>["beforeLoad"]>>[0];
6
+ type BaseLayoutLoaderArgs = Parameters<RouteLoaderFn<unknown, any, any>>[0];
7
+ export type LayoutLoaderArgs<TBeforeLoadContext extends AnyObject = EmptyObject> = Except<BaseLayoutLoaderArgs, "context"> & {
8
+ context: BaseLayoutLoaderArgs["context"] & TBeforeLoadContext;
9
+ };
10
+ interface LayoutRouteOptions<TBeforeLoadContext extends AnyObject = EmptyObject, TLoaderData = void> extends Except<LayoutProps, "children"> {
6
11
  fetchUserInfo: () => Awaitable<UserInfo>;
12
+ beforeLoad?: (args: LayoutBeforeLoadArgs) => Awaitable<TBeforeLoadContext | void>;
13
+ loader?: (args: LayoutLoaderArgs<TBeforeLoadContext>) => Awaitable<TLoaderData>;
7
14
  }
8
- export declare function createLayoutRouteOptions({ fetchUserInfo, ...layoutProps }: LayoutRouteOptions): {
9
- readonly beforeLoad: ({ location }: {
10
- location: ParsedLocation;
11
- }) => void;
12
- readonly loader: ({ location }: {
13
- location: ParsedLocation;
14
- }) => Promise<void>;
15
- readonly pendingComponent: () => import("@emotion/react/jsx-runtime").JSX.Element;
16
- readonly errorComponent: typeof Error;
17
- readonly notFoundComponent: typeof NotFound;
18
- readonly component: () => import("@emotion/react/jsx-runtime").JSX.Element;
19
- readonly staleTime: number;
20
- readonly shouldReload: false;
15
+ export declare function createLayoutRouteOptions<TBeforeLoadContext extends AnyObject = EmptyObject, TLoaderData = void>({ fetchUserInfo, beforeLoad, loader, ...layoutProps }: LayoutRouteOptions<TBeforeLoadContext, TLoaderData>): {
16
+ beforeLoad: (args: LayoutBeforeLoadArgs) => Promise<TBeforeLoadContext>;
17
+ loader: (args: LayoutLoaderArgs<TBeforeLoadContext>) => Promise<TLoaderData | undefined>;
18
+ pendingComponent: () => import("@emotion/react/jsx-runtime").JSX.Element;
19
+ errorComponent: typeof Error;
20
+ notFoundComponent: typeof NotFound;
21
+ component: () => import("@emotion/react/jsx-runtime").JSX.Element;
22
+ staleTime: number;
23
+ shouldReload: boolean;
21
24
  };
22
25
  export {};
@@ -1,14 +1,15 @@
1
1
  import { MenuItem } from '@vef-framework-react/components';
2
2
  import { AuthTokens, UseBoundStoreWithPersist } from '@vef-framework-react/core';
3
3
  import { Except } from '@vef-framework-react/shared';
4
- import { UserInfo, UserMenu } from '../types';
4
+ import { AppCustomState, UserInfo, UserMenu } from '../types';
5
5
  export interface AppState {
6
6
  isAuthenticated: boolean;
7
7
  authTokens?: Readonly<AuthTokens>;
8
- userInfo?: Readonly<Except<UserInfo, "permTokens">>;
8
+ userInfo?: Readonly<Except<UserInfo, "permissionTokens">>;
9
9
  userMenuMap?: Readonly<Map<string, Readonly<UserMenu>>>;
10
10
  menuPathMap?: Readonly<Map<string, readonly string[]>>;
11
11
  menuItems?: ReadonlyArray<Readonly<MenuItem>>;
12
- permTokens?: Readonly<Set<string>>;
12
+ permissionTokens?: Readonly<Set<string>>;
13
+ custom: AppCustomState;
13
14
  }
14
15
  export declare const useAppStore: UseBoundStoreWithPersist<AppState>;
@@ -1,4 +1,4 @@
1
- import { LiteralUnion, MaybeNull } from '@vef-framework-react/shared';
1
+ import { AnyObject, LiteralUnion, MaybeNull } from '@vef-framework-react/shared';
2
2
  export type Gender = "male" | "female" | "unknown";
3
3
  export type UserMenuType = LiteralUnion<"directory" | "menu" | "view" | "report", string>;
4
4
  export interface UserMenu {
@@ -19,6 +19,9 @@ export interface UserMenu {
19
19
  * @example
20
20
  * declare module "@vef-framework-react/starter" {
21
21
  * interface Register {
22
+ * appCustomState: {
23
+ * appId?: string;
24
+ * };
22
25
  * userDetails: {
23
26
  * department: string;
24
27
  * organization: string;
@@ -35,6 +38,9 @@ export interface UserMenu {
35
38
  */
36
39
  export interface Register {
37
40
  }
41
+ export type AppCustomState = Register extends {
42
+ appCustomState: infer T extends AnyObject;
43
+ } ? T : AnyObject;
38
44
  /**
39
45
  * Default shape of `UserInfo['details']` before projects augment `Register`.
40
46
  */
@@ -63,7 +69,7 @@ export interface UserInfo {
63
69
  name: string;
64
70
  gender: Gender;
65
71
  avatar?: MaybeNull<string>;
66
- permTokens: string[];
72
+ permissionTokens: string[];
67
73
  menus: UserMenu[];
68
74
  details: ResolvedUserDetails;
69
75
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vef-framework-react/starter",
3
3
  "type": "module",
4
- "version": "2.2.2",
4
+ "version": "2.3.0",
5
5
  "private": false,
6
6
  "description": "Starter for VEF framework",
7
7
  "author": {
@@ -64,10 +64,10 @@
64
64
  "@tanstack/react-router": "^1.170.1",
65
65
  "react": "^19.2.6",
66
66
  "react-dom": "^19.2.6",
67
- "@vef-framework-react/components": "2.2.2",
68
- "@vef-framework-react/core": "2.2.2",
69
- "@vef-framework-react/shared": "2.2.2",
70
- "@vef-framework-react/hooks": "2.2.2"
67
+ "@vef-framework-react/components": "2.3.0",
68
+ "@vef-framework-react/core": "2.3.0",
69
+ "@vef-framework-react/hooks": "2.3.0",
70
+ "@vef-framework-react/shared": "2.3.0"
71
71
  },
72
72
  "scripts": {
73
73
  "clean": "rimraf dist",