@vef-framework-react/starter 2.1.12 → 2.2.1

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 (111) hide show
  1. package/dist/cjs/components/login/index.cjs +1 -1
  2. package/dist/es/components/access-denied/access-denied-icon.js +1 -1
  3. package/dist/es/components/access-denied/index.js +1 -1
  4. package/dist/es/components/app/index.js +1 -1
  5. package/dist/es/components/base-layout/index.js +1 -1
  6. package/dist/es/components/base-layout/styles.js +1 -1
  7. package/dist/es/components/base-layout/use-base-layout.js +1 -1
  8. package/dist/es/components/error/error-icon.js +1 -1
  9. package/dist/es/components/error/index.js +1 -1
  10. package/dist/es/components/index.js +1 -1
  11. package/dist/es/components/layout/components/footer.js +1 -1
  12. package/dist/es/components/layout/components/header/boy-icon.js +1 -1
  13. package/dist/es/components/layout/components/header/breadcrumb-navigation.js +1 -1
  14. package/dist/es/components/layout/components/header/color-scheme.js +1 -1
  15. package/dist/es/components/layout/components/header/fullscreen.js +1 -1
  16. package/dist/es/components/layout/components/header/girl-icon.js +1 -1
  17. package/dist/es/components/layout/components/header/index.js +1 -1
  18. package/dist/es/components/layout/components/header/menu-burger.js +1 -1
  19. package/dist/es/components/layout/components/header/menu-fold-left-icon.js +1 -1
  20. package/dist/es/components/layout/components/header/menu-unfold-left-icon.js +1 -1
  21. package/dist/es/components/layout/components/header/search.js +1 -1
  22. package/dist/es/components/layout/components/header/theme-config.js +1 -1
  23. package/dist/es/components/layout/components/header/user-avatar.js +1 -1
  24. package/dist/es/components/layout/components/honeycomb-pattern.js +1 -1
  25. package/dist/es/components/layout/components/index.js +1 -1
  26. package/dist/es/components/layout/components/logo.js +1 -1
  27. package/dist/es/components/layout/components/menu.js +1 -1
  28. package/dist/es/components/layout/components/search/index.js +1 -1
  29. package/dist/es/components/layout/components/search/keyboard-arrow-down-icon.js +1 -1
  30. package/dist/es/components/layout/components/search/keyboard-arrow-up-icon.js +1 -1
  31. package/dist/es/components/layout/components/search/keyboard-control-icon.js +1 -1
  32. package/dist/es/components/layout/components/search/keyboard-esc-icon.js +1 -1
  33. package/dist/es/components/layout/components/search/keyboard-help.js +1 -1
  34. package/dist/es/components/layout/components/search/keyboard-return-icon.js +1 -1
  35. package/dist/es/components/layout/components/search/keyboard-shift-icon.js +1 -1
  36. package/dist/es/components/layout/components/search/keyboard.js +1 -1
  37. package/dist/es/components/layout/components/search/letter-s-icon.js +1 -1
  38. package/dist/es/components/layout/components/search/search-result-item.js +1 -1
  39. package/dist/es/components/layout/components/search/search-result.js +1 -1
  40. package/dist/es/components/layout/components/sidebar.js +1 -1
  41. package/dist/es/components/layout/components/tabs/context-menu.js +1 -1
  42. package/dist/es/components/layout/components/tabs/index.js +1 -1
  43. package/dist/es/components/layout/components/tabs/main-content-maximum.js +1 -1
  44. package/dist/es/components/layout/components/tabs/reload.js +1 -1
  45. package/dist/es/components/layout/components/tabs/tab-item.js +1 -1
  46. package/dist/es/components/layout/components/tabs/tab-list.js +1 -1
  47. package/dist/es/components/layout/components/tabs/tabs-container.js +1 -1
  48. package/dist/es/components/layout/components/theme-config/color-scheme-switcher.js +1 -1
  49. package/dist/es/components/layout/components/theme-config/color-scheme.js +1 -1
  50. package/dist/es/components/layout/components/theme-config/config-item.js +1 -1
  51. package/dist/es/components/layout/components/theme-config/index.js +1 -1
  52. package/dist/es/components/layout/components/theme-config/menu-layout-card.js +1 -1
  53. package/dist/es/components/layout/components/theme-config/menu-layout.js +1 -1
  54. package/dist/es/components/layout/components/theme-config/operations.js +1 -1
  55. package/dist/es/components/layout/components/theme-config/theme-color-picker.js +1 -1
  56. package/dist/es/components/layout/components/theme-config/theme-colors.js +1 -1
  57. package/dist/es/components/layout/hooks/index.js +1 -1
  58. package/dist/es/components/layout/hooks/use-color-scheme-updater.js +1 -1
  59. package/dist/es/components/layout/hooks/use-menu-navigate.js +1 -1
  60. package/dist/es/components/layout/hooks/use-tab-navigate.js +1 -1
  61. package/dist/es/components/layout/index.js +1 -1
  62. package/dist/es/components/layout/store.js +1 -1
  63. package/dist/es/components/layout/styles.js +1 -1
  64. package/dist/es/components/login/icon-login.js +1 -1
  65. package/dist/es/components/login/index.js +148 -73
  66. package/dist/es/components/login/styles.js +1 -1
  67. package/dist/es/components/login/welcome-messages.js +1 -1
  68. package/dist/es/components/n-progress/components/bar.js +1 -1
  69. package/dist/es/components/n-progress/components/container.js +1 -1
  70. package/dist/es/components/n-progress/components/index.js +1 -1
  71. package/dist/es/components/n-progress/event.js +1 -1
  72. package/dist/es/components/n-progress/index.js +1 -1
  73. package/dist/es/components/not-found/index.js +1 -1
  74. package/dist/es/components/not-found/not-found-icon.js +1 -1
  75. package/dist/es/components/router-provider/context.js +1 -1
  76. package/dist/es/components/router-provider/index.js +1 -1
  77. package/dist/es/components/theme-config-provider/global-style.js +1 -1
  78. package/dist/es/components/theme-config-provider/index.js +1 -1
  79. package/dist/es/components/theme-config-provider/use-color-mode-effect.js +1 -1
  80. package/dist/es/components/theme-config-provider/use-theme-config.js +1 -1
  81. package/dist/es/constants/event.js +1 -1
  82. package/dist/es/constants/index.js +1 -1
  83. package/dist/es/constants/router.js +1 -1
  84. package/dist/es/constants/storage.js +1 -0
  85. package/dist/es/helpers/api.js +1 -1
  86. package/dist/es/helpers/app-version.js +1 -1
  87. package/dist/es/helpers/app.js +1 -1
  88. package/dist/es/helpers/auth.js +1 -1
  89. package/dist/es/helpers/event.js +1 -1
  90. package/dist/es/helpers/index.js +1 -1
  91. package/dist/es/helpers/query.js +1 -1
  92. package/dist/es/helpers/router.js +1 -1
  93. package/dist/es/hooks/index.js +1 -1
  94. package/dist/es/hooks/use-route-full-path.js +1 -1
  95. package/dist/es/index.js +1 -1
  96. package/dist/es/routes/access-denied.js +1 -1
  97. package/dist/es/routes/index.js +1 -1
  98. package/dist/es/routes/layout.js +1 -1
  99. package/dist/es/routes/login.js +1 -1
  100. package/dist/es/routes/root.js +1 -1
  101. package/dist/es/stores/app.js +1 -1
  102. package/dist/es/stores/index.js +1 -1
  103. package/dist/es/stores/tab.js +1 -1
  104. package/dist/es/stores/theme.js +1 -1
  105. package/dist/types/components/index.d.ts +1 -1
  106. package/dist/types/components/login/index.d.ts +3 -3
  107. package/dist/types/components/login/payload.d.ts +33 -14
  108. package/dist/types/components/login/props.d.ts +92 -4
  109. package/dist/types/index.d.ts +1 -1
  110. package/dist/types/types/common.d.ts +25 -1
  111. package/package.json +10 -10
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
2
2
  import "./event.js";
3
3
  import "./router.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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 +1,2 @@
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
1
2
  //#endregion
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
2
2
  import "./use-route-full-path.js";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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";
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
2
2
  import { createPersistedStore as e } from "@vef-framework-react/core";
3
3
  //#region src/stores/app.ts
4
4
  var t = e(() => ({ isAuthenticated: !1 }), {
@@ -1,4 +1,4 @@
1
- /*! @vef-framework-react/starter v2.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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.1.12 made by Venus | 2026-05-07T08:00:51.476Z */
1
+ /*! @vef-framework-react/starter v2.2.1 made by Venus | 2026-05-18T08:56:01.320Z */
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
@@ -3,7 +3,7 @@ export { App, type AppProps } from './app';
3
3
  export { BaseLayout, type BaseLayoutProps } from './base-layout';
4
4
  export { Error } from './error';
5
5
  export { Layout, type LayoutProps } from './layout';
6
- export { Login, type LoginChallenge, type LoginParams, type LoginProps, type LoginResult, type PasswordLoginParams } from './login';
6
+ export { Login, type LoginChallenge, type LoginChallengeRenderer, type LoginChallengeRendererProps, type LoginChallengeRenderers, type LoginParams, type LoginProps, type LoginResult, type PasswordLoginParams, type ResolveChallengeParams } from './login';
7
7
  export { NProgress, nProgressEventEmitter } from './n-progress';
8
8
  export { NotFound } from './not-found';
9
9
  export { RouterContextHookProvider, RouterProvider, type RouterProviderProps, type UseRouterContext } from './router-provider';
@@ -1,4 +1,4 @@
1
1
  import { LoginProps } from './props';
2
- export declare function Login({ logo, title, description, publicKey, onLogin }: LoginProps): React.ReactNode;
3
- export { type LoginChallenge, type LoginParams, type LoginResult, type PasswordLoginParams } from './payload';
4
- export { type LoginProps } from './props';
2
+ export declare function Login({ logo, title, description, publicKey, onLogin, onResolveChallenge, challengeRenderers }: LoginProps): import("@emotion/react/jsx-runtime").JSX.Element;
3
+ export { type LoginChallenge, type LoginParams, type LoginResult, type PasswordLoginParams, type ResolveChallengeParams } from './payload';
4
+ export { type LoginChallengeRenderer, type LoginChallengeRendererProps, type LoginChallengeRenderers, type LoginProps } from './props';
@@ -1,4 +1,5 @@
1
1
  import { AuthTokens } from '../../models';
2
+ import { ResolvedChallenges } from '../../types/common';
2
3
  /**
3
4
  * The payload for login
4
5
  */
@@ -31,21 +32,19 @@ export interface PasswordLoginParams extends BaseLoginParams<string> {
31
32
  }
32
33
  /**
33
34
  * A challenge the user must complete during login (e.g., 2FA, department selection).
35
+ *
36
+ * When `Register['challenges']` is augmented by the consuming project, this becomes
37
+ * a discriminated union narrowed per `type`, with `data` typed to the augmented
38
+ * spec. Without augmentation, it degrades to `{ type: string; data: unknown }` —
39
+ * exactly today's wire shape.
34
40
  */
35
- export interface LoginChallenge {
36
- /**
37
- * The challenge type identifier (e.g., "totp", "select_department")
38
- */
39
- type: string;
40
- /**
41
- * Optional challenge-specific data
42
- */
43
- data?: unknown;
44
- /**
45
- * Whether the challenge is required
46
- */
47
- required: boolean;
48
- }
41
+ export type LoginChallenge = {
42
+ [K in keyof ResolvedChallenges]: {
43
+ type: K;
44
+ data: ResolvedChallenges[K]["data"];
45
+ required: boolean;
46
+ };
47
+ }[keyof ResolvedChallenges];
49
48
  /**
50
49
  * The result of a login attempt.
51
50
  * When a challenge is pending, tokens is undefined and challengeToken + challenge are set.
@@ -69,4 +68,24 @@ export interface LoginResult {
69
68
  */
70
69
  challenge?: LoginChallenge;
71
70
  }
71
+ /**
72
+ * The payload for submitting a challenge response back to the server.
73
+ * Shape mirrors the backend security/auth.resolve_challenge action.
74
+ */
75
+ export interface ResolveChallengeParams {
76
+ /**
77
+ * The token returned with the pending challenge that carries intermediate state.
78
+ */
79
+ challengeToken: string;
80
+ /**
81
+ * The challenge type identifier being resolved (must match the pending challenge).
82
+ */
83
+ type: string;
84
+ /**
85
+ * The user's answer to the challenge. The concrete shape is decided by each
86
+ * challenge type — e.g. a department id string for "department_selection",
87
+ * a TOTP code string for "totp", etc.
88
+ */
89
+ response: unknown;
90
+ }
72
91
  export {};
@@ -1,9 +1,73 @@
1
1
  import { ReactNode } from 'react';
2
- import { LoginParams, LoginResult } from './payload';
2
+ import { ResolvedChallenges } from '../../types/common';
3
+ import { LoginChallenge, LoginParams, LoginResult, ResolveChallengeParams } from './payload';
3
4
  /**
4
- * The props of the Login component.
5
+ * Arguments passed to a challenge renderer. Renderers are stateless from the
6
+ * Login component's perspective — they consume `challenge` for prompt data
7
+ * and call `resolve` / `cancel` to drive the flow forward or backward.
8
+ *
9
+ * Parameterised by `K`, the specific challenge type the renderer is bound to.
10
+ * When projects augment `Register['challenges']`, `challenge.data` and the
11
+ * `resolve` argument are both narrowed to the corresponding spec entry.
5
12
  */
6
- export interface LoginProps {
13
+ export interface LoginChallengeRendererProps<K extends keyof ResolvedChallenges = keyof ResolvedChallenges> {
14
+ /**
15
+ * The pending challenge to present (type identifier and challenge-specific data).
16
+ */
17
+ challenge: Extract<LoginChallenge, {
18
+ type: K;
19
+ }>;
20
+ /**
21
+ * Submit the user's answer to the current challenge. The concrete shape of
22
+ * `response` is dictated by the augmented `ResolvedChallenges[K]['response']`;
23
+ * without augmentation, it falls back to `unknown`.
24
+ * Returns once the resulting `LoginResult` has been applied — either the
25
+ * next challenge is shown or authentication completes and navigation runs.
26
+ */
27
+ resolve: (response: ResolvedChallenges[K]["response"]) => Promise<void>;
28
+ /**
29
+ * Abandon the challenge and return to the initial credentials form.
30
+ * The held challenge token is discarded; the user must log in again.
31
+ */
32
+ cancel: () => void;
33
+ /**
34
+ * Whether a resolve call is currently in flight. Useful for disabling
35
+ * submit buttons inside the renderer.
36
+ */
37
+ pending: boolean;
38
+ /**
39
+ * Encrypts a sensitive plaintext using the same scheme the initial login
40
+ * uses for credentials. Present only when the Login component received a
41
+ * `publicKey`; renderers handling sensitive responses (e.g. a new password
42
+ * for `password_change`) should call this before invoking `resolve`.
43
+ * Absent when no `publicKey` was configured.
44
+ *
45
+ * May throw if the underlying RSA encryption fails (invalid key, empty
46
+ * plaintext, etc.). Renderers should catch in their submit handler and
47
+ * surface a user-visible error rather than letting the rejection escape.
48
+ */
49
+ encrypt?: (plaintext: string) => string;
50
+ }
51
+ /**
52
+ * A renderer responsible for displaying and resolving a single challenge type.
53
+ * Business apps register one per challenge type they support; the Login
54
+ * component looks up the renderer by `challenge.type` at runtime.
55
+ */
56
+ export type LoginChallengeRenderer<K extends keyof ResolvedChallenges = keyof ResolvedChallenges> = (props: LoginChallengeRendererProps<K>) => ReactNode;
57
+ /**
58
+ * The full renderer registry — one renderer per known challenge type. When
59
+ * `Register['challenges']` is augmented, TypeScript enforces exhaustiveness
60
+ * (every declared challenge must have a renderer) and per-key typing of the
61
+ * `challenge.data` / `resolve` payloads.
62
+ */
63
+ export type LoginChallengeRenderers = {
64
+ [K in keyof ResolvedChallenges]: LoginChallengeRenderer<K>;
65
+ };
66
+ /**
67
+ * The shared subset of LoginProps, independent of whether the flow may
68
+ * surface challenges.
69
+ */
70
+ interface BaseLoginProps {
7
71
  /**
8
72
  * The logo of the login page.
9
73
  */
@@ -17,7 +81,8 @@ export interface LoginProps {
17
81
  */
18
82
  description?: string;
19
83
  /**
20
- * The public key for encrypting the password.
84
+ * The public key for encrypting credentials (and sensitive challenge
85
+ * responses via `LoginChallengeRendererProps.encrypt`).
21
86
  */
22
87
  publicKey?: string;
23
88
  /**
@@ -25,3 +90,26 @@ export interface LoginProps {
25
90
  */
26
91
  onLogin: (params: LoginParams) => Promise<LoginResult>;
27
92
  }
93
+ /**
94
+ * Challenge-aware Login wiring. `onResolveChallenge` and `challengeRenderers`
95
+ * are required together: a server that can return challenges needs both a
96
+ * transport (`onResolveChallenge`) and a presenter (`challengeRenderers`).
97
+ */
98
+ interface LoginPropsWithChallenge {
99
+ onResolveChallenge: (params: ResolveChallengeParams) => Promise<LoginResult>;
100
+ challengeRenderers: LoginChallengeRenderers;
101
+ }
102
+ /**
103
+ * Login wiring for backends that never issue challenges.
104
+ */
105
+ interface LoginPropsWithoutChallenge {
106
+ onResolveChallenge?: never;
107
+ challengeRenderers?: never;
108
+ }
109
+ /**
110
+ * The props of the Login component. Either both challenge hooks are wired
111
+ * up, or neither is — partial wiring would leave the UI stranded on a
112
+ * challenge it cannot dispatch.
113
+ */
114
+ export type LoginProps = BaseLoginProps & (LoginPropsWithChallenge | LoginPropsWithoutChallenge);
115
+ export {};
@@ -1,4 +1,4 @@
1
- export { type LoginChallenge, type LoginParams, type LoginResult, type PasswordLoginParams } from './components';
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
4
  export { createAccessDeniedRouteOptions, createLayoutRouteOptions, createLoginRouteOptions, createRootRouteOptions } from './routes';
@@ -13,7 +13,8 @@ export interface UserMenu {
13
13
  * Extension registry for framework types.
14
14
  *
15
15
  * Projects augment this interface via `declare module` to refine
16
- * extensible fields such as `UserInfo['details']`.
16
+ * extensible fields such as `UserInfo['details']` or the set of
17
+ * login challenge types the backend may issue.
17
18
  *
18
19
  * @example
19
20
  * declare module "@vef-framework-react/starter" {
@@ -22,6 +23,13 @@ export interface UserMenu {
22
23
  * department: string;
23
24
  * organization: string;
24
25
  * };
26
+ * challenges: {
27
+ * department_selection: {
28
+ * data: { departments: Array<{ id: string; name: string }> };
29
+ * response: string;
30
+ * };
31
+ * totp: { response: string };
32
+ * };
25
33
  * }
26
34
  * }
27
35
  */
@@ -34,6 +42,22 @@ export type UserDetails = Record<string, unknown>;
34
42
  type ResolvedUserDetails = Register extends {
35
43
  userDetails: infer T extends UserDetails;
36
44
  } ? T : UserDetails;
45
+ /**
46
+ * Contract for a single login challenge type. `data` is the payload the
47
+ * server attaches to the challenge for the renderer to display; `response`
48
+ * is the value the renderer feeds back to `resolve`.
49
+ */
50
+ export interface ChallengeSpec {
51
+ data?: unknown;
52
+ response: unknown;
53
+ }
54
+ /**
55
+ * Resolved challenge registry. Falls back to an open `Record` so codebases
56
+ * that never augment `Register['challenges']` retain today's loose typing.
57
+ */
58
+ export type ResolvedChallenges = Register extends {
59
+ challenges: infer T extends Record<string, ChallengeSpec>;
60
+ } ? T : Record<string, ChallengeSpec>;
37
61
  export interface UserInfo {
38
62
  id: string;
39
63
  name: string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vef-framework-react/starter",
3
3
  "type": "module",
4
- "version": "2.1.12",
4
+ "version": "2.2.1",
5
5
  "private": false,
6
6
  "description": "Starter for VEF framework",
7
7
  "author": {
@@ -54,20 +54,20 @@
54
54
  "react-dom": ">=19"
55
55
  },
56
56
  "dependencies": {
57
- "@ant-design/icons": "^6.1.1",
57
+ "@ant-design/icons": "^6.2.2",
58
58
  "@emotion/react": "^11.14.0",
59
59
  "@tanem/react-nprogress": "^6.0.3",
60
60
  "compare-versions": "^6.1.1",
61
- "lucide-react": "^1.9.0"
61
+ "lucide-react": "^1.16.0"
62
62
  },
63
63
  "devDependencies": {
64
- "@tanstack/react-router": "^1.168.23",
65
- "react": "^19.2.5",
66
- "react-dom": "^19.2.5",
67
- "@vef-framework-react/components": "2.1.12",
68
- "@vef-framework-react/hooks": "2.1.12",
69
- "@vef-framework-react/shared": "2.1.12",
70
- "@vef-framework-react/core": "2.1.12"
64
+ "@tanstack/react-router": "^1.170.1",
65
+ "react": "^19.2.6",
66
+ "react-dom": "^19.2.6",
67
+ "@vef-framework-react/components": "2.2.1",
68
+ "@vef-framework-react/core": "2.2.1",
69
+ "@vef-framework-react/hooks": "2.2.1",
70
+ "@vef-framework-react/shared": "2.2.1"
71
71
  },
72
72
  "scripts": {
73
73
  "clean": "rimraf dist",