@donotdev/ui 0.0.7 → 0.0.9

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 (204) hide show
  1. package/assets/fonts/fonts.css +4 -4
  2. package/dist/components/auth/AuthHeader.d.ts +5 -0
  3. package/dist/components/auth/AuthHeader.d.ts.map +1 -1
  4. package/dist/components/auth/AuthHeader.js +22 -8
  5. package/dist/components/auth/AuthMenu.d.ts +6 -1
  6. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  7. package/dist/components/auth/AuthMenu.js +3 -3
  8. package/dist/components/common/AppLoading.d.ts +1 -1
  9. package/dist/components/common/AppLoading.d.ts.map +1 -1
  10. package/dist/components/common/AppLoading.js +0 -1
  11. package/dist/components/common/Loader.d.ts +4 -4
  12. package/dist/components/common/Loader.d.ts.map +1 -1
  13. package/dist/components/common/Loader.js +11 -12
  14. package/dist/components/common/LoadingMessage.d.ts +1 -9
  15. package/dist/components/common/LoadingMessage.d.ts.map +1 -1
  16. package/dist/components/common/LoadingMessage.js +0 -1
  17. package/dist/components/common/LoadingScreen.d.ts +1 -9
  18. package/dist/components/common/LoadingScreen.d.ts.map +1 -1
  19. package/dist/components/common/LoadingScreen.js +0 -1
  20. package/dist/components/common/RedirectOverlay.d.ts +37 -0
  21. package/dist/components/common/RedirectOverlay.d.ts.map +1 -0
  22. package/dist/components/common/RedirectOverlay.js +243 -0
  23. package/dist/components/common/TechBento.d.ts.map +1 -1
  24. package/dist/components/common/TechBento.js +1 -0
  25. package/dist/components/common/index.d.ts +1 -0
  26. package/dist/components/common/index.d.ts.map +1 -1
  27. package/dist/components/common/index.js +1 -0
  28. package/dist/components/layout/components/FloatingLanguageSwitcher.d.ts +1 -9
  29. package/dist/components/layout/components/FloatingLanguageSwitcher.d.ts.map +1 -1
  30. package/dist/components/layout/components/FloatingLanguageSwitcher.js +0 -1
  31. package/dist/components/layout/components/header/CacheSettings.d.ts.map +1 -1
  32. package/dist/components/layout/components/header/HeaderMenu.d.ts.map +1 -1
  33. package/dist/components/layout/components/header/SettingsMenu.d.ts.map +1 -1
  34. package/dist/components/layout/components/header/SettingsMenu.js +1 -2
  35. package/dist/components/layout/components/header/ThemeToggle.d.ts +1 -1
  36. package/dist/components/layout/components/header/ThemeToggle.d.ts.map +1 -1
  37. package/dist/components/layout/components/header/ThemeToggle.js +5 -4
  38. package/dist/crud/components/DisplayFieldRenderer.d.ts +3 -11
  39. package/dist/crud/components/DisplayFieldRenderer.d.ts.map +1 -1
  40. package/dist/crud/components/DisplayFieldRenderer.js +4 -3
  41. package/dist/crud/components/EntityDisplayRenderer.d.ts +2 -2
  42. package/dist/crud/components/fields/display/AvatarFieldDisplay.d.ts +2 -2
  43. package/dist/crud/components/fields/display/BadgeFieldDisplay.d.ts +2 -2
  44. package/dist/crud/components/fields/display/ButtonFieldDisplay.d.ts +2 -2
  45. package/dist/crud/components/fields/display/CheckboxFieldDisplay.d.ts +2 -2
  46. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts +3 -11
  47. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts.map +1 -1
  48. package/dist/crud/components/fields/display/DateFieldDisplay.js +0 -1
  49. package/dist/crud/components/fields/display/DropdownDisplay.d.ts +2 -2
  50. package/dist/crud/components/fields/display/FileFieldDisplay.d.ts +2 -2
  51. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts +3 -11
  52. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -1
  53. package/dist/crud/components/fields/display/GeoPointFieldDisplay.js +0 -1
  54. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts +3 -3
  55. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -1
  56. package/dist/crud/components/fields/display/HiddenFieldDisplay.js +0 -9
  57. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts +3 -11
  58. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts.map +1 -1
  59. package/dist/crud/components/fields/display/ImageFieldDisplay.js +0 -1
  60. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts +3 -11
  61. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts.map +1 -1
  62. package/dist/crud/components/fields/display/LinkFieldDisplay.js +0 -1
  63. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts +3 -11
  64. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts.map +1 -1
  65. package/dist/crud/components/fields/display/MapFieldDisplay.js +0 -1
  66. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts +3 -11
  67. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -1
  68. package/dist/crud/components/fields/display/MultiDropdownDisplay.js +0 -1
  69. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts +3 -11
  70. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -1
  71. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.js +0 -1
  72. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts +3 -11
  73. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts.map +1 -1
  74. package/dist/crud/components/fields/display/NumberFieldDisplay.js +0 -1
  75. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts +3 -3
  76. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -1
  77. package/dist/crud/components/fields/display/PasswordFieldDisplay.js +0 -1
  78. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts +3 -11
  79. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -1
  80. package/dist/crud/components/fields/display/PhoneNumberDisplay.js +0 -1
  81. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts +3 -11
  82. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts.map +1 -1
  83. package/dist/crud/components/fields/display/RadioFieldDisplay.js +0 -1
  84. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts +3 -11
  85. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts.map +1 -1
  86. package/dist/crud/components/fields/display/RangeFieldDisplay.js +0 -1
  87. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts +3 -11
  88. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -1
  89. package/dist/crud/components/fields/display/ReferenceFieldDisplay.js +0 -1
  90. package/dist/crud/components/fields/display/RichTextDisplay.d.ts +25 -0
  91. package/dist/crud/components/fields/display/RichTextDisplay.d.ts.map +1 -0
  92. package/dist/crud/components/fields/display/RichTextDisplay.js +104 -0
  93. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts +3 -11
  94. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts.map +1 -1
  95. package/dist/crud/components/fields/display/TextAreaDisplay.js +0 -1
  96. package/dist/crud/components/fields/display/TextFieldDisplay.d.ts +2 -2
  97. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts +3 -11
  98. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -1
  99. package/dist/crud/components/fields/display/TimestampFieldDisplay.js +0 -1
  100. package/dist/crud/components/fields/display/index.d.ts +1 -0
  101. package/dist/crud/components/fields/display/index.d.ts.map +1 -1
  102. package/dist/crud/components/fields/display/index.js +1 -0
  103. package/dist/dndev.css +827 -126
  104. package/dist/index.js +64 -4
  105. package/dist/internal/common/ErrorFallback.d.ts +1 -10
  106. package/dist/internal/common/ErrorFallback.d.ts.map +1 -1
  107. package/dist/internal/common/GlobalErrorFallback.d.ts +1 -9
  108. package/dist/internal/common/GlobalErrorFallback.d.ts.map +1 -1
  109. package/dist/internal/common/RouteErrorFallback.js +1 -1
  110. package/dist/internal/devtools/components/DebugDialog.d.ts.map +1 -1
  111. package/dist/internal/devtools/components/DebugDialog.js +3 -1
  112. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
  113. package/dist/internal/devtools/components/DesignTab.js +25 -3
  114. package/dist/internal/devtools/components/MaskedValue.d.ts.map +1 -1
  115. package/dist/internal/devtools/components/MaskedValue.js +1 -1
  116. package/dist/internal/devtools/components/StoresTab.js +1 -1
  117. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  118. package/dist/internal/initializers/BaseStoresInitializer.js +1 -2
  119. package/dist/internal/initializers/NextJsStoresInitializer.d.ts.map +1 -1
  120. package/dist/internal/layout/DnDevLayout.d.ts.map +1 -1
  121. package/dist/internal/layout/DnDevLayout.js +4 -5
  122. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  123. package/dist/internal/layout/components/PerformanceHints.d.ts.map +1 -1
  124. package/dist/internal/layout/components/PerformanceHints.js +3 -2
  125. package/dist/internal/layout/components/footer/FooterLegalLinks.js +2 -2
  126. package/dist/internal/layout/config/defaults.d.ts +0 -10
  127. package/dist/internal/layout/config/defaults.d.ts.map +1 -1
  128. package/dist/internal/layout/config/defaults.js +12 -1
  129. package/dist/internal/layout/config/presets/admin.d.ts +2 -2
  130. package/dist/internal/layout/config/presets/admin.d.ts.map +1 -1
  131. package/dist/internal/layout/config/presets/admin.js +15 -6
  132. package/dist/internal/layout/config/presets/blog.d.ts.map +1 -1
  133. package/dist/internal/layout/config/presets/blog.js +7 -1
  134. package/dist/internal/layout/config/presets/docs.d.ts.map +1 -1
  135. package/dist/internal/layout/config/presets/docs.js +7 -5
  136. package/dist/internal/layout/config/presets/game.d.ts.map +1 -1
  137. package/dist/internal/layout/config/presets/game.js +7 -2
  138. package/dist/internal/layout/config/presets/moolti.d.ts.map +1 -1
  139. package/dist/internal/layout/config/presets/moolti.js +10 -3
  140. package/dist/internal/layout/zones/DnDevFooter.d.ts +1 -13
  141. package/dist/internal/layout/zones/DnDevFooter.d.ts.map +1 -1
  142. package/dist/internal/layout/zones/DnDevHeader.d.ts +1 -14
  143. package/dist/internal/layout/zones/DnDevHeader.d.ts.map +1 -1
  144. package/dist/internal/layout/zones/DnDevMergedBar.d.ts +2 -14
  145. package/dist/internal/layout/zones/DnDevMergedBar.d.ts.map +1 -1
  146. package/dist/internal/layout/zones/DnDevMergedBar.js +11 -3
  147. package/dist/internal/layout/zones/DnDevSidebar.d.ts +1 -14
  148. package/dist/internal/layout/zones/DnDevSidebar.d.ts.map +1 -1
  149. package/dist/providers/NextJsAppProviders.d.ts.map +1 -1
  150. package/dist/providers/NextJsAppProviders.js +4 -1
  151. package/dist/routing/AuthGuard.d.ts.map +1 -1
  152. package/dist/routing/GoTo.d.ts +3 -1
  153. package/dist/routing/GoTo.d.ts.map +1 -1
  154. package/dist/routing/GoTo.js +6 -2
  155. package/dist/routing/GoToDialog.d.ts +1 -1
  156. package/dist/routing/GoToDialog.d.ts.map +1 -1
  157. package/dist/routing/GoToDialog.js +3 -5
  158. package/dist/routing/NavigationItem.d.ts +1 -1
  159. package/dist/routing/NavigationItem.d.ts.map +1 -1
  160. package/dist/routing/NavigationItem.js +0 -1
  161. package/dist/routing/hooks/hooks.next.d.ts +1 -0
  162. package/dist/routing/hooks/hooks.next.d.ts.map +1 -1
  163. package/dist/routing/hooks/hooks.next.js +1 -1
  164. package/dist/routing/hooks/hooks.vite.d.ts +1 -0
  165. package/dist/routing/hooks/hooks.vite.d.ts.map +1 -1
  166. package/dist/routing/hooks/hooks.vite.js +1 -1
  167. package/dist/routing/hooks/useNavigate.next.d.ts.map +1 -1
  168. package/dist/routing/hooks/useNavigate.next.js +1 -1
  169. package/dist/routing/hooks/useNavigate.vite.d.ts.map +1 -1
  170. package/dist/routing/hooks/useRouteParam.next.d.ts +18 -0
  171. package/dist/routing/hooks/useRouteParam.next.d.ts.map +1 -0
  172. package/dist/routing/hooks/useRouteParam.next.js +38 -0
  173. package/dist/routing/hooks/useRouteParam.vite.d.ts +18 -0
  174. package/dist/routing/hooks/useRouteParam.vite.d.ts.map +1 -0
  175. package/dist/routing/hooks/useRouteParam.vite.js +38 -0
  176. package/dist/routing/index.d.ts +1 -1
  177. package/dist/routing/index.d.ts.map +1 -1
  178. package/dist/routing/index.js +1 -1
  179. package/dist/routing/useGoTo.d.ts.map +1 -1
  180. package/dist/styles/index.css +823 -122
  181. package/dist/utils/assetResolver.d.ts +1 -1
  182. package/dist/utils/assetResolver.d.ts.map +1 -1
  183. package/dist/utils/assetResolver.js +1 -2
  184. package/dist/utils/index.d.ts +0 -1
  185. package/dist/utils/index.d.ts.map +1 -1
  186. package/dist/utils/index.js +0 -1
  187. package/dist/utils/tList.d.ts +1 -1
  188. package/dist/utils/tList.d.ts.map +1 -1
  189. package/dist/utils/useAuthSafe.d.ts +0 -33
  190. package/dist/utils/useAuthSafe.d.ts.map +1 -1
  191. package/dist/utils/useAuthSafe.js +34 -1
  192. package/dist/utils/useCrudSafe.d.ts +12 -6
  193. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  194. package/dist/utils/useCrudSafe.js +11 -7
  195. package/dist/utils/useOAuthSafe.d.ts.map +1 -1
  196. package/dist/utils/useStripeBillingSafe.d.ts +1 -34
  197. package/dist/utils/useStripeBillingSafe.d.ts.map +1 -1
  198. package/dist/utils/useStripeBillingSafe.js +34 -1
  199. package/dist/vite-routing/AppRoutes.d.ts +1 -1
  200. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  201. package/dist/vite-routing/AppRoutes.js +0 -1
  202. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  203. package/dist/vite-routing/RootLayout.js +6 -6
  204. package/package.json +9 -9
@@ -1,20 +1,8 @@
1
- /**
2
- * @fileoverview DnDevMergedBar Zone Component
3
- * @description Mobile navigation bar with Sheet trigger.
4
- *
5
- * Position: fixed (top or bottom)
6
- * Slots: trigger (visible bar) + top/content/bottom (Sheet content)
7
- * CSS: display:none on desktop, display:flex on mobile
8
- *
9
- * @version 0.0.1
10
- * @since 0.0.1
11
- * @author AMBROISE PARK Consulting
12
- */
13
- import { type ReactNode } from 'react';
1
+ import type { ReactNode } from 'react';
14
2
  export interface DnDevMergedBarProps {
15
3
  /** Bar position */
16
4
  position: 'top' | 'bottom';
17
- /** Bar height (default: 64px for top, 48px for bottom) */
5
+ /** Bar height (default: CSS uses var(--header-height) for top, 48px for bottom) */
18
6
  height?: string;
19
7
  /** Trigger slot - ReactNode from preset or consumer override */
20
8
  trigger?: ReactNode | null;
@@ -1 +1 @@
1
- {"version":3,"file":"DnDevMergedBar.d.ts","sourceRoot":"","sources":["../../../../src/internal/layout/zones/DnDevMergedBar.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAY7C,MAAM,WAAW,mBAAmB;IAClC,mBAAmB;IACnB,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC3B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,4DAA4D;IAC5D,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,iBAAS,uBAAuB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,OAAO,EACP,GAAG,EACH,OAAO,EACP,MAAM,GACP,EAAE,mBAAmB,GAAG,SAAS,CAiDjC;AAED,eAAO,MAAM,cAAc,qEAAgC,CAAC"}
1
+ {"version":3,"file":"DnDevMergedBar.d.ts","sourceRoot":"","sources":["../../../../src/internal/layout/zones/DnDevMergedBar.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,mBAAmB;IAClC,mBAAmB;IACnB,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC3B,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,4DAA4D;IAC5D,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,iBAAS,uBAAuB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,OAAO,EACP,GAAG,EACH,OAAO,EACP,MAAM,GACP,EAAE,mBAAmB,GAAG,SAAS,CA8DjC;AAED,eAAO,MAAM,cAAc,qEAAgC,CAAC"}
@@ -12,9 +12,11 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
12
12
  * @since 0.0.1
13
13
  * @author AMBROISE PARK Consulting
14
14
  */
15
- import { memo } from 'react';
16
15
  import { ChevronUp, Menu } from 'lucide-react';
16
+ import { memo, useState, useEffect } from 'react';
17
17
  import { Stack, Button, Sheet, BUTTON_VARIANT, Separator, SEPARATOR_VARIANT, } from '@donotdev/components';
18
+ import { useTranslation } from '@donotdev/core';
19
+ import { useLocation } from '@donotdev/ui/routing/hooks';
18
20
  /**
19
21
  * DnDevMergedBar - Mobile navigation zone
20
22
  *
@@ -24,12 +26,18 @@ import { Stack, Button, Sheet, BUTTON_VARIANT, Separator, SEPARATOR_VARIANT, } f
24
26
  * - top/content/bottom: Sheet content (default: derived from sidebar)
25
27
  */
26
28
  function DnDevMergedBarComponent({ position, height, trigger, top, content, bottom, }) {
27
- const barHeight = height || (position === 'top' ? '64px' : '48px');
29
+ const { t } = useTranslation('dndev');
28
30
  const Icon = position === 'top' ? Menu : ChevronUp;
29
31
  const sheetSide = position === 'top' ? 'left' : position;
32
+ const [open, setOpen] = useState(false);
33
+ const location = useLocation();
34
+ // Close sheet when route changes
35
+ useEffect(() => {
36
+ setOpen(false);
37
+ }, [location.pathname]);
30
38
  // Build sheet content
31
39
  const sheetNode = (_jsxs(Stack, { direction: "column", gap: "medium", className: "merged-bar-sheet-content", children: [top && (_jsxs(_Fragment, { children: [top, _jsx(Separator, { variant: SEPARATOR_VARIANT.MUTED })] })), content && _jsx("div", { className: "merged-bar-sheet-scroll", children: content }), bottom && (_jsxs(_Fragment, { children: [_jsx(Separator, { variant: SEPARATOR_VARIANT.MUTED }), bottom] }))] }));
32
40
  const triggerButton = (_jsx(Button, { variant: BUTTON_VARIANT.GHOST, icon: Icon, "aria-label": "Open navigation" }));
33
- return (_jsx("div", { className: "merged-bar", "data-position": position, children: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "merged-bar-trigger", children: [trigger, _jsx(Sheet, { trigger: triggerButton, side: sheetSide, children: sheetNode })] }) }));
41
+ return (_jsx("div", { className: "merged-bar", "data-position": position, children: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "merged-bar-trigger", children: [trigger, _jsx(Sheet, { trigger: triggerButton, side: sheetSide, open: open, onOpenChange: setOpen, title: t('sheet.navigation', { defaultValue: 'Navigation' }), children: sheetNode })] }) }));
34
42
  }
35
43
  export const DnDevMergedBar = memo(DnDevMergedBarComponent);
@@ -1,17 +1,4 @@
1
- /**
2
- * @fileoverview DnDevSidebar Zone Component
3
- * @description Flat sidebar zone with resize mechanics built-in.
4
- *
5
- * Structure: aside > nav + resize-handle
6
- * No nesting. Resize logic on aside directly.
7
- *
8
- * Slots: top | content | bottom
9
- *
10
- * @version 0.0.1
11
- * @since 0.0.1
12
- * @author AMBROISE PARK Consulting
13
- */
14
- import { type ReactNode } from 'react';
1
+ import type { ReactNode } from 'react';
15
2
  export interface DnDevSidebarProps {
16
3
  /** Top slot - ReactNode from preset or consumer override */
17
4
  top?: ReactNode | null;
@@ -1 +1 @@
1
- {"version":3,"file":"DnDevSidebar.d.ts","sourceRoot":"","sources":["../../../../src/internal/layout/zones/DnDevSidebar.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAS1E,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,iBAAS,qBAAqB,CAAC,EAC7B,GAAG,EACH,OAAO,EACP,MAAM,EACN,YAAiD,EACjD,QAAyC,EACzC,QAAyC,GAC1C,EAAE,iBAAiB,GAAG,SAAS,CAiM/B;AAED,eAAO,MAAM,YAAY,mEAA8B,CAAC"}
1
+ {"version":3,"file":"DnDevSidebar.d.ts","sourceRoot":"","sources":["../../../../src/internal/layout/zones/DnDevSidebar.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,iBAAS,qBAAqB,CAAC,EAC7B,GAAG,EACH,OAAO,EACP,MAAM,EACN,YAAiD,EACjD,QAAyC,EACzC,QAAyC,GAC1C,EAAE,iBAAiB,GAAG,SAAS,CAiM/B;AAED,eAAO,MAAM,YAAY,mEAA8B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"NextJsAppProviders.d.ts","sourceRoot":"","sources":["../../src/providers/NextJsAppProviders.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAkDxD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CA4ChE"}
1
+ {"version":3,"file":"NextJsAppProviders.d.ts","sourceRoot":"","sources":["../../src/providers/NextJsAppProviders.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAuDxD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CAiDhE"}
@@ -28,6 +28,9 @@ const PWAUpdateNotification = lazy(() => import('../internal/layout/components/P
28
28
  const LicenseWatermark = lazy(() => import('../components/license/LicenseWatermark').then((m) => ({
29
29
  default: m.LicenseWatermark,
30
30
  })));
31
+ const RedirectOverlay = lazy(() => import('../components/common/RedirectOverlay').then((m) => ({
32
+ default: m.RedirectOverlay,
33
+ })));
31
34
  /**
32
35
  * ConsentBanner - Lazy loaded consent component
33
36
  * Only shows if user hasn't consented yet
@@ -46,5 +49,5 @@ function ConsentBanner() {
46
49
  }
47
50
  export function NextJsAppProviders(props) {
48
51
  const { config = {}, layout, children, serverCookies, customStores } = props;
49
- return (_jsxs(AppConfigProvider, { config: config, platform: "nextjs", children: [_jsx(SentryInitializer, {}), _jsx(HelmetProvider, { children: _jsxs(NextJsStoresInitializer, { serverCookies: serverCookies, customStores: customStores, children: [_jsx(FaviconHead, {}), _jsx(PerformanceHints, {}), _jsx(QueryProviders, { children: _jsxs(UIProviders, { children: [_jsx(DnDevLayout, { layout: layout, children: children }), _jsx(ConsentBanner, {}), _jsx(Suspense, { fallback: null, children: _jsx(PWAUpdateNotification, {}) }), _jsx(Suspense, { fallback: null, children: _jsx(LicenseWatermark, {}) })] }) })] }) })] }));
52
+ return (_jsxs(AppConfigProvider, { config: config, platform: "nextjs", children: [_jsx(SentryInitializer, {}), _jsx(HelmetProvider, { children: _jsxs(NextJsStoresInitializer, { serverCookies: serverCookies, customStores: customStores, children: [_jsx(FaviconHead, {}), _jsx(PerformanceHints, {}), _jsx(QueryProviders, { children: _jsxs(UIProviders, { children: [_jsx(DnDevLayout, { layout: layout, children: children }), _jsx(ConsentBanner, {}), _jsx(Suspense, { fallback: null, children: _jsx(PWAUpdateNotification, {}) }), _jsx(Suspense, { fallback: null, children: _jsx(LicenseWatermark, {}) }), _jsx(Suspense, { fallback: null, children: _jsx(RedirectOverlay, {}) })] }) })] }) })] }));
50
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AuthGuard.d.ts","sourceRoot":"","sources":["../../src/routing/AuthGuard.tsx"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAGf,OAAO,EAGL,UAAU,EACV,kBAAkB,EAClB,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AAYxB;;GAEG;AACH,UAAU,cAAc;IACtB,wCAAwC;IACxC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IACvB,wCAAwC;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,QAAQ,EACR,QAAQ,EAAE,QAAiB,GAC5B,EAAE,cAAc,2CA2HhB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAG9D;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,uBAAiB,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,WAAW,IACvB,OAAO,UAAU,CAAC,KAAK,GACvB,OAAO,UAAU,CAAC,IAAI,GACtB,OAAO,UAAU,CAAC,KAAK,CAS1B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,IAAI,EACA,OAAO,UAAU,CAAC,KAAK,GACvB,OAAO,UAAU,CAAC,IAAI,GACtB,OAAO,UAAU,CAAC,KAAK,GAC1B,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY;;;;;;EAW3B;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,EAC3B,IAAI,EAAE,QAAQ,GAAG,KAAK,WAEW,CAAC,6CAOnC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;IAC3B,iCAAiC;kBACrB,KAAK;IAEjB,oCAAoC;oBACtB,QAAQ;IAEtB,yCAAyC;gBAC/B,QAAQ;IAKlB,uDAAuD;iBAC5C,QAAQ;IAKnB,gCAAgC;iBAExB,CAAC,OAAO,kBAAkB,EAAE,MAAM,OAAO,kBAAkB,CAAC,KACjE,QAAQ;IAKX,eAAe;eACN,QAAQ;IAKjB,mBAAmB;mBACN,QAAQ;IAKrB,sCAAsC;oBACxB,QAAQ;IAMtB,wBAAwB;uBACL,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,KAAG,QAAQ;CAItE,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"AuthGuard.d.ts","sourceRoot":"","sources":["../../src/routing/AuthGuard.tsx"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAEf,OAAO,EAGL,UAAU,EACV,kBAAkB,EAClB,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AAaxB;;GAEG;AACH,UAAU,cAAc;IACtB,wCAAwC;IACxC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IACvB,wCAAwC;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,QAAQ,EACR,QAAQ,EAAE,QAAiB,GAC5B,EAAE,cAAc,2CA2HhB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAG9D;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,uBAAiB,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,WAAW,IACvB,OAAO,UAAU,CAAC,KAAK,GACvB,OAAO,UAAU,CAAC,IAAI,GACtB,OAAO,UAAU,CAAC,KAAK,CAS1B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,IAAI,EACA,OAAO,UAAU,CAAC,KAAK,GACvB,OAAO,UAAU,CAAC,IAAI,GACtB,OAAO,UAAU,CAAC,KAAK,GAC1B,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY;;;;;;EAW3B;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,EAC3B,IAAI,EAAE,QAAQ,GAAG,KAAK,WAEW,CAAC,6CAOnC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;IAC3B,iCAAiC;kBACrB,KAAK;IAEjB,oCAAoC;oBACtB,QAAQ;IAEtB,yCAAyC;gBAC/B,QAAQ;IAKlB,uDAAuD;iBAC5C,QAAQ;IAKnB,gCAAgC;iBAExB,CAAC,OAAO,kBAAkB,EAAE,MAAM,OAAO,kBAAkB,CAAC,KACjE,QAAQ;IAKX,eAAe;eACN,QAAQ;IAKjB,mBAAmB;mBACN,QAAQ;IAKrB,sCAAsC;oBACxB,QAAQ;IAMtB,wBAAwB;uBACL,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,KAAG,QAAQ;CAItE,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -7,6 +7,8 @@ export interface GoToProps {
7
7
  display?: (typeof DISPLAY)[keyof typeof DISPLAY];
8
8
  /** Additional CSS class */
9
9
  className?: string;
10
+ /** Optional callback called after opening command dialog (e.g., to close parent dropdown) */
11
+ onOpen?: () => void;
10
12
  }
11
13
  /**
12
14
  * GoTo - Command palette trigger button
@@ -14,6 +16,6 @@ export interface GoToProps {
14
16
  * Simple button: Search icon + "Go to" label + keyboard shortcut.
15
17
  * Opens command dialog on click.
16
18
  */
17
- export declare const GoTo: ({ display, className }: GoToProps) => import("react/jsx-runtime").JSX.Element;
19
+ export declare const GoTo: ({ display, className, onOpen }: GoToProps) => import("react/jsx-runtime").JSX.Element;
18
20
  export default GoTo;
19
21
  //# sourceMappingURL=GoTo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GoTo.d.ts","sourceRoot":"","sources":["../../src/routing/GoTo.tsx"],"names":[],"mappings":"AAaA,OAAO,EAA0B,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGvE,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;IACjD,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GAAI,wBAAuC,SAAS,4CAiCpE,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"GoTo.d.ts","sourceRoot":"","sources":["../../src/routing/GoTo.tsx"],"names":[],"mappings":"AAaA,OAAO,EAA0B,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGvE,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;IACjD,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GAAI,gCAA+C,SAAS,4CAsC5E,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -17,14 +17,18 @@ import { useOverlayStore, useTranslation } from '@donotdev/core';
17
17
  * Simple button: Search icon + "Go to" label + keyboard shortcut.
18
18
  * Opens command dialog on click.
19
19
  */
20
- export const GoTo = ({ display = DISPLAY.AUTO, className }) => {
20
+ export const GoTo = ({ display = DISPLAY.AUTO, className, onOpen }) => {
21
21
  const { t } = useTranslation('dndev');
22
22
  const openCommandDialog = useOverlayStore((state) => state.openCommandDialog);
23
23
  // Platform-aware shortcut (Mac: ⌘K, others: Ctrl+K)
24
24
  const isMac = typeof navigator !== 'undefined' &&
25
25
  /Mac|iPhone|iPad/.test(navigator.platform);
26
26
  const shortcut = isMac ? '⌘K' : 'Ctrl+K';
27
- return (_jsxs(Button, { variant: BUTTON_VARIANT.OUTLINE, display: display, icon: Search, onClick: () => openCommandDialog(), className: className, "aria-label": t('goTo.ariaLabel', 'Go to page'), children: [t('goTo.label', 'Go to'), _jsx("kbd", { style: {
27
+ const handleClick = () => {
28
+ openCommandDialog();
29
+ onOpen?.(); // Call optional callback (e.g., to close parent dropdown)
30
+ };
31
+ return (_jsxs(Button, { variant: BUTTON_VARIANT.OUTLINE, display: display, icon: Search, onClick: handleClick, className: className, "aria-label": t('goTo.ariaLabel', 'Go to page'), children: [t('goTo.label', 'Go to'), _jsx("kbd", { style: {
28
32
  marginInlineStart: 'var(--gap-sm)',
29
33
  padding: '0.125rem 0.375rem',
30
34
  fontSize: 'var(--font-size-xs)',
@@ -1,4 +1,4 @@
1
- import { type ComponentType } from 'react';
1
+ import type { ComponentType } from 'react';
2
2
  /**
3
3
  * GoToDialog - Navigation command palette
4
4
  * Only renders when dialog is open
@@ -1 +1 @@
1
- {"version":3,"file":"GoToDialog.d.ts","sourceRoot":"","sources":["../../src/routing/GoToDialog.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAkC,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AA4K3E;;;GAGG;AACH,QAAA,MAAM,UAAU,EAAE,aAUjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"GoToDialog.d.ts","sourceRoot":"","sources":["../../src/routing/GoToDialog.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AA2J3C;;;GAGG;AACH,QAAA,MAAM,UAAU,EAAE,aAUjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -8,11 +8,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
8
  * @since 0.0.1
9
9
  * @author AMBROISE PARK Consulting
10
10
  */
11
- import { Star, StarOff, Clock, ArrowRight, Search, Link as LinkIcon, } from 'lucide-react';
11
+ import { Clock, Link as LinkIcon, Star } from 'lucide-react';
12
12
  import { useCallback, useEffect, useRef } from 'react';
13
- import { Badge, Command, CommandDialog, } from '@donotdev/components';
14
- import { useOverlayStore } from '@donotdev/core';
15
- import { useTranslation } from '@donotdev/core';
13
+ import { Badge, Command, CommandDialog } from '@donotdev/components';
14
+ import { useOverlayStore, useTranslation } from '@donotdev/core';
16
15
  import { useGoTo } from './useGoTo';
17
16
  import { Icon } from '../components/common/icon';
18
17
  /**
@@ -23,7 +22,6 @@ const GoToDialogContent = () => {
23
22
  const inputRef = useRef(null);
24
23
  // Store state
25
24
  const isCommandDialogOpen = useOverlayStore((state) => state.isCommandDialogOpen);
26
- const commandDialogInitialSearch = useOverlayStore((state) => state.commandDialogInitialSearch);
27
25
  const closeCommandDialog = useOverlayStore((state) => state.closeCommandDialog);
28
26
  // Navigation hook
29
27
  const { navigationItems, favoriteItems, recentItems, toggleFavorite, isFavorite, navigateToItem, } = useGoTo();
@@ -1,5 +1,5 @@
1
- import { type ComponentType } from 'react';
2
1
  import type { NavigationRoute } from '@donotdev/core';
2
+ import type { ComponentType } from 'react';
3
3
  interface NavigationItemProps {
4
4
  route: NavigationRoute;
5
5
  showIcons?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationItem.d.ts","sourceRoot":"","sources":["../../src/routing/NavigationItem.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,UAAU,mBAAmB;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,mBAAmB,CAiBtE,CAAC"}
1
+ {"version":3,"file":"NavigationItem.d.ts","sourceRoot":"","sources":["../../src/routing/NavigationItem.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,UAAU,mBAAmB;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,mBAAmB,CAiBtE,CAAC"}
@@ -9,7 +9,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
9
  * @author AMBROISE PARK Consulting
10
10
  */
11
11
  import { Link as LinkIcon } from 'lucide-react';
12
- import {} from 'react';
13
12
  import { navigationMenuTriggerStylePrimitive } from '@donotdev/components';
14
13
  import { Link } from './Link';
15
14
  import { Icon } from '../components/common/icon';
@@ -10,6 +10,7 @@
10
10
  export { useNavigate, useBack, useRefresh, usePrefetch, } from './useNavigate.next';
11
11
  export { useLocation } from './useLocation.next';
12
12
  export { useParams } from './useParams.next';
13
+ export { useRouteParam } from './useRouteParam.next';
13
14
  export { useSearchParams } from './useSearchParams.next';
14
15
  export { useMatch } from './useMatch.next';
15
16
  export { useQueryParams } from './useQueryParams.next';
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.next.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/hooks.next.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"hooks.next.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/hooks.next.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{useCallback as f}from"react";import{useRouter as h}from"next/navigation";import{isClient as x,useOverlayStore as S}from"@donotdev/core";function d(){let e=h(),t=S(r=>r.closeAll);return f((r,i)=>{if(r==="back")return t(),e.back();if(t(),i?.preserveScroll&&x()){let o=window.scrollY;i?.replace?e.replace(r):e.push(r),requestAnimationFrame(()=>{window.scrollTo({top:o,behavior:"auto"})});return}return i?.replace?e.replace(r):e.push(r)},[e,t])}function y(){let e=h();return f(()=>e.back(),[e])}function k(){let e=h();return f(()=>e.refresh(),[e])}function T(){let e=h();return f(t=>e.prefetch(t),[e])}import{usePathname as v,useSearchParams as b}from"next/navigation";function l(){let e=v(),t=b(),r=t.toString()?`?${t.toString()}`:"";return{pathname:e||"/",search:r,hash:"",state:null}}import{useParams as w}from"next/navigation";function C(){return w()}import{useSearchParams as I}from"next/navigation";function g(){return I()}import{usePathname as N}from"next/navigation";function G(e){let t=N(),r=e.replace(/:[^/]+/g,"([^/]+)").replace(/\*/g,".*"),i=new RegExp(`^${r}$`),o=t.match(i);if(!o)return null;let s=e.match(/:[^/]+/g)?.map(a=>a.slice(1))||[],n={};return s.forEach((a,c)=>{n[a]=o[c+1]||""}),{params:n,pathname:t,pattern:e}}import{useCallback as R}from"react";function $(){let e=g(),t=d(),r=l(),i=R((n,a)=>{let c=new URLSearchParams(e.toString());c.set(n,a);let m=c.toString(),P=`${r.pathname||"/"}${m?`?${m}`:""}`;t(P)},[e,t,r.pathname]),o=R(n=>{let a=new URLSearchParams(e.toString());a.delete(n);let c=a.toString(),u=`${r.pathname||"/"}${c?`?${c}`:""}`;t(u)},[e,t,r.pathname]),s=R(()=>{let n=r.pathname||"/";t(n)},[t,r.pathname]);return{query:e,setQuery:i,removeQuery:o,clearQueries:s}}import{useMemo as L}from"react";import{isClient as E,FEATURE_STATUS as Q}from"@donotdev/core";import{useAuthConfig as F}from"@donotdev/core";import{DEGRADED_AUTH_API as K}from"@donotdev/core";import*as O from"@donotdev/auth";var A=O?.useAuth;function U(e){return K[e]}function p(e){return A?A(e):U(e)}function M(e={}){let{auth:t,redirectTo:r,condition:i}=e;if(!E())return{shouldRedirect:!1,redirectTo:null,isChecking:!1};let o=l(),s=F(),n=p("user"),a=p("can"),c=p("status");return L(()=>{if(c===Q.INITIALIZING)return{shouldRedirect:!1,redirectTo:null,isChecking:!0};if(i){let u=i(n,c);return{shouldRedirect:u,redirectTo:u&&r||null,isChecking:!1}}if(t!==!1&&t!==void 0){if(!a)return{shouldRedirect:!1,redirectTo:null,isChecking:!1};if(!a.navigate(t)){let u=null;return typeof t=="object"&&t.required&&!n?o.search.includes("code=")||o.search.includes("state=")||o.search.includes("error=")?u=`${s.authRoute}${o.search}`:u=s.authRoute:typeof t=="object"&&t.role?u=s.roleRoute:typeof t=="object"&&t.tier?u=s.tierRoute:u=s.roleRoute,{shouldRedirect:!0,redirectTo:r||u,isChecking:!1}}}return{shouldRedirect:!1,redirectTo:null,isChecking:!1}},[t,c,n,a,i,r,o.search,s.authRoute,s.roleRoute,s.tierRoute])}export{y as useBack,l as useLocation,G as useMatch,d as useNavigate,C as useParams,T as usePrefetch,$ as useQueryParams,M as useRedirectGuard,k as useRefresh,g as useSearchParams};
1
+ "use client";import{useRouter as f}from"next/navigation";import{useCallback as h}from"react";import{isClient as S,useOverlayStore as y}from"@donotdev/core";function d(){let e=f(),t=y(r=>r.closeAll);return h((r,i)=>{if(r==="back")return t(),e.back();if(t(),i?.preserveScroll&&S()){let o=window.scrollY;i?.replace?e.replace(r):e.push(r),requestAnimationFrame(()=>{window.scrollTo({top:o,behavior:"auto"})});return}return i?.replace?e.replace(r):e.push(r)},[e,t])}function k(){let e=f();return h(()=>e.back(),[e])}function v(){let e=f();return h(()=>e.refresh(),[e])}function T(){let e=f();return h(t=>e.prefetch(t),[e])}import{usePathname as b,useSearchParams as w}from"next/navigation";function l(){let e=b(),t=w(),r=t.toString()?`?${t.toString()}`:"";return{pathname:e||"/",search:r,hash:"",state:null}}import{useParams as C}from"next/navigation";function g(){return C()}function I(e){let r=g()[e];if(typeof r=="string")return r;if(Array.isArray(r)&&r.length>0)return r[0]}import{useSearchParams as N}from"next/navigation";function R(){return N()}import{usePathname as G}from"next/navigation";function $(e){let t=G(),r=e.replace(/:[^/]+/g,"([^/]+)").replace(/\*/g,".*"),i=new RegExp(`^${r}$`),o=t.match(i);if(!o)return null;let s=e.match(/:[^/]+/g)?.map(a=>a.slice(1))||[],n={};return s.forEach((a,c)=>{n[a]=o[c+1]||""}),{params:n,pathname:t,pattern:e}}import{useCallback as P}from"react";function K(){let e=R(),t=d(),r=l(),i=P((n,a)=>{let c=new URLSearchParams(e.toString());c.set(n,a);let m=c.toString(),A=`${r.pathname||"/"}${m?`?${m}`:""}`;t(A)},[e,t,r.pathname]),o=P(n=>{let a=new URLSearchParams(e.toString());a.delete(n);let c=a.toString(),u=`${r.pathname||"/"}${c?`?${c}`:""}`;t(u)},[e,t,r.pathname]),s=P(()=>{let n=r.pathname||"/";t(n)},[t,r.pathname]);return{query:e,setQuery:i,removeQuery:o,clearQueries:s}}import{useMemo as E}from"react";import{isClient as Q,FEATURE_STATUS as F}from"@donotdev/core";import{useAuthConfig as M}from"@donotdev/core";import*as O from"@donotdev/auth";import{DEGRADED_AUTH_API as U}from"@donotdev/core";var x=O?.useAuth;function L(e){return U[e]}function p(e){return x?x(e):L(e)}function j(e={}){let{auth:t,redirectTo:r,condition:i}=e;if(!Q())return{shouldRedirect:!1,redirectTo:null,isChecking:!1};let o=l(),s=M(),n=p("user"),a=p("can"),c=p("status");return E(()=>{if(c===F.INITIALIZING)return{shouldRedirect:!1,redirectTo:null,isChecking:!0};if(i){let u=i(n,c);return{shouldRedirect:u,redirectTo:u&&r||null,isChecking:!1}}if(t!==!1&&t!==void 0){if(!a)return{shouldRedirect:!1,redirectTo:null,isChecking:!1};if(!a.navigate(t)){let u=null;return typeof t=="object"&&t.required&&!n?o.search.includes("code=")||o.search.includes("state=")||o.search.includes("error=")?u=`${s.authRoute}${o.search}`:u=s.authRoute:typeof t=="object"&&t.role?u=s.roleRoute:typeof t=="object"&&t.tier?u=s.tierRoute:u=s.roleRoute,{shouldRedirect:!0,redirectTo:r||u,isChecking:!1}}}return{shouldRedirect:!1,redirectTo:null,isChecking:!1}},[t,c,n,a,i,r,o.search,s.authRoute,s.roleRoute,s.tierRoute])}export{k as useBack,l as useLocation,$ as useMatch,d as useNavigate,g as useParams,T as usePrefetch,K as useQueryParams,j as useRedirectGuard,v as useRefresh,I as useRouteParam,R as useSearchParams};
@@ -10,6 +10,7 @@
10
10
  export { useNavigate, useBack, useRefresh, usePrefetch, } from './useNavigate.vite';
11
11
  export { useLocation } from './useLocation.vite';
12
12
  export { useParams } from './useParams.vite';
13
+ export { useRouteParam } from './useRouteParam.vite';
13
14
  export { useSearchParams } from './useSearchParams.vite';
14
15
  export { useMatch } from './useMatch.vite';
15
16
  export { useQueryParams } from './useQueryParams.vite';
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.vite.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/hooks.vite.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"hooks.vite.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/hooks.vite.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{useCallback as m}from"react";import{useNavigate as A}from"react-router-dom";import{isClient as x,useOverlayStore as S}from"@donotdev/core";function p(){let e=A(),t=S(r=>r.closeAll);return m((r,i)=>r==="back"?(t(),e(-1)):(t(),i?.replace?e(r,{replace:!0}):e(r)),[e,t])}function y(){let e=A();return m(()=>e(-1),[e])}function v(){return m(()=>{x()&&window.location.reload()},[])}function k(){return m(e=>{},[])}import{useLocation as T}from"react-router-dom";function l(){return T()}import{useParams as C}from"react-router-dom";function I(){return C()}import{useSearchParams as b}from"react-router-dom";function d(){return b()[0]}import{useMatch as G}from"react-router-dom";function w(e){return G(e)}import{useCallback as R}from"react";function N(){let e=d(),t=p(),r=l(),i=R((n,u)=>{let a=new URLSearchParams(e.toString());a.set(n,u);let f=a.toString(),g=`${r.pathname||"/"}${f?`?${f}`:""}`;t(g)},[e,t,r.pathname]),c=R(n=>{let u=new URLSearchParams(e.toString());u.delete(n);let a=u.toString(),o=`${r.pathname||"/"}${a?`?${a}`:""}`;t(o)},[e,t,r.pathname]),s=R(()=>{let n=r.pathname||"/";t(n)},[t,r.pathname]);return{query:e,setQuery:i,removeQuery:c,clearQueries:s}}import{useMemo as U}from"react";import{isClient as $,FEATURE_STATUS as M}from"@donotdev/core";import{useAuthConfig as Q}from"@donotdev/core";import{DEGRADED_AUTH_API as K}from"@donotdev/core";import*as L from"@donotdev/auth";var P=L?.useAuth;function O(e){return K[e]}function h(e){return P?P(e):O(e)}function E(e={}){let{auth:t,redirectTo:r,condition:i}=e;if(!$())return{shouldRedirect:!1,redirectTo:null,isChecking:!1};let c=l(),s=Q(),n=h("user"),u=h("can"),a=h("status");return U(()=>{if(a===M.INITIALIZING)return{shouldRedirect:!1,redirectTo:null,isChecking:!0};if(i){let o=i(n,a);return{shouldRedirect:o,redirectTo:o&&r||null,isChecking:!1}}if(t!==!1&&t!==void 0){if(!u)return{shouldRedirect:!1,redirectTo:null,isChecking:!1};if(!u.navigate(t)){let o=null;return typeof t=="object"&&t.required&&!n?c.search.includes("code=")||c.search.includes("state=")||c.search.includes("error=")?o=`${s.authRoute}${c.search}`:o=s.authRoute:typeof t=="object"&&t.role?o=s.roleRoute:typeof t=="object"&&t.tier?o=s.tierRoute:o=s.roleRoute,{shouldRedirect:!0,redirectTo:r||o,isChecking:!1}}}return{shouldRedirect:!1,redirectTo:null,isChecking:!1}},[t,a,n,u,i,r,c.search,s.authRoute,s.roleRoute,s.tierRoute])}export{y as useBack,l as useLocation,w as useMatch,p as useNavigate,I as useParams,k as usePrefetch,N as useQueryParams,E as useRedirectGuard,v as useRefresh,d as useSearchParams};
1
+ "use client";import{useCallback as m}from"react";import{useNavigate as P}from"react-router-dom";import{isClient as y,useOverlayStore as S}from"@donotdev/core";function h(){let e=P(),t=S(r=>r.closeAll);return m((r,i)=>r==="back"?(t(),e(-1)):(t(),i?.replace?e(r,{replace:!0}):e(r)),[e,t])}function v(){let e=P();return m(()=>e(-1),[e])}function k(){return m(()=>{y()&&window.location.reload()},[])}function T(){return m(e=>{},[])}import{useLocation as C}from"react-router-dom";function f(){return C()}import{useParams as I}from"react-router-dom";function d(){return I()}function b(e){let r=d()[e];if(typeof r=="string")return r;if(Array.isArray(r)&&r.length>0)return r[0]}import{useSearchParams as G}from"react-router-dom";function g(){return G()[0]}import{useMatch as w}from"react-router-dom";function N(e){return w(e)}import{useCallback as R}from"react";function K(){let e=g(),t=h(),r=f(),i=R((n,u)=>{let a=new URLSearchParams(e.toString());a.set(n,u);let l=a.toString(),A=`${r.pathname||"/"}${l?`?${l}`:""}`;t(A)},[e,t,r.pathname]),c=R(n=>{let u=new URLSearchParams(e.toString());u.delete(n);let a=u.toString(),o=`${r.pathname||"/"}${a?`?${a}`:""}`;t(o)},[e,t,r.pathname]),s=R(()=>{let n=r.pathname||"/";t(n)},[t,r.pathname]);return{query:e,setQuery:i,removeQuery:c,clearQueries:s}}import{useMemo as $}from"react";import{isClient as M,FEATURE_STATUS as Q}from"@donotdev/core";import{useAuthConfig as E}from"@donotdev/core";import*as L from"@donotdev/auth";import{DEGRADED_AUTH_API as O}from"@donotdev/core";var x=L?.useAuth;function U(e){return O[e]}function p(e){return x?x(e):U(e)}function _(e={}){let{auth:t,redirectTo:r,condition:i}=e;if(!M())return{shouldRedirect:!1,redirectTo:null,isChecking:!1};let c=f(),s=E(),n=p("user"),u=p("can"),a=p("status");return $(()=>{if(a===Q.INITIALIZING)return{shouldRedirect:!1,redirectTo:null,isChecking:!0};if(i){let o=i(n,a);return{shouldRedirect:o,redirectTo:o&&r||null,isChecking:!1}}if(t!==!1&&t!==void 0){if(!u)return{shouldRedirect:!1,redirectTo:null,isChecking:!1};if(!u.navigate(t)){let o=null;return typeof t=="object"&&t.required&&!n?c.search.includes("code=")||c.search.includes("state=")||c.search.includes("error=")?o=`${s.authRoute}${c.search}`:o=s.authRoute:typeof t=="object"&&t.role?o=s.roleRoute:typeof t=="object"&&t.tier?o=s.tierRoute:o=s.roleRoute,{shouldRedirect:!0,redirectTo:r||o,isChecking:!1}}}return{shouldRedirect:!1,redirectTo:null,isChecking:!1}},[t,a,n,u,i,r,c.search,s.authRoute,s.roleRoute,s.tierRoute])}export{v as useBack,f as useLocation,N as useMatch,h as useNavigate,d as useParams,T as usePrefetch,K as useQueryParams,_ as useRedirectGuard,k as useRefresh,b as useRouteParam,g as useSearchParams};
@@ -1 +1 @@
1
- {"version":3,"file":"useNavigate.next.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/useNavigate.next.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,wBAAgB,WAAW,SAKlB,MAAM,YAAY,eAAe,UA0BzC;AAED,wBAAgB,OAAO,eAGtB;AAED,wBAAgB,UAAU,eAGzB;AAED,wBAAgB,WAAW,SAED,MAAM,UAC/B"}
1
+ {"version":3,"file":"useNavigate.next.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/useNavigate.next.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,wBAAgB,WAAW,SAKlB,MAAM,YAAY,eAAe,UA0BzC;AAED,wBAAgB,OAAO,eAGtB;AAED,wBAAgB,UAAU,eAGzB;AAED,wBAAgB,WAAW,SAED,MAAM,UAC/B"}
@@ -8,8 +8,8 @@
8
8
  * @since 0.0.1
9
9
  * @author AMBROISE PARK Consulting
10
10
  */
11
- import { useCallback } from 'react';
12
11
  import { useRouter as useNextRouter } from 'next/navigation';
12
+ import { useCallback } from 'react';
13
13
  import { isClient, useOverlayStore } from '@donotdev/core';
14
14
  export function useNavigate() {
15
15
  const router = useNextRouter();
@@ -1 +1 @@
1
- {"version":3,"file":"useNavigate.vite.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/useNavigate.vite.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,wBAAgB,WAAW,SAKlB,MAAM,YAAY,eAAe,0BAazC;AAED,wBAAgB,OAAO,+BAGtB;AAED,wBAAgB,UAAU,eAIzB;AAED,wBAAgB,WAAW,UACA,MAAM,UAGhC"}
1
+ {"version":3,"file":"useNavigate.vite.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/useNavigate.vite.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,wBAAgB,WAAW,SAKlB,MAAM,YAAY,eAAe,0BAazC;AAED,wBAAgB,OAAO,+BAGtB;AAED,wBAAgB,UAAU,eAIzB;AAED,wBAAgB,WAAW,UACA,MAAM,UAGhC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Safely extract a route parameter as a string
3
+ *
4
+ * Handles the fact that useParams can return string | string[] | undefined.
5
+ * For standard path parameters (not catch-all routes), this will always be a string.
6
+ *
7
+ * @param paramName - Name of the route parameter
8
+ * @returns The parameter value as a string, or undefined if not present
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * // Route: /product/:id
13
+ * const id = useRouteParam('id'); // string | undefined
14
+ * if (!id) return <NotFound />;
15
+ * ```
16
+ */
17
+ export declare function useRouteParam(paramName: string): string | undefined;
18
+ //# sourceMappingURL=useRouteParam.next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRouteParam.next.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/useRouteParam.next.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAanE"}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ // packages/ui/src/routing/hooks/useRouteParam.next.ts
3
+ /**
4
+ * @fileoverview useRouteParam hook - Next.js implementation
5
+ * @description Helper hook to safely extract a single route parameter as a string
6
+ *
7
+ * @version 0.0.1
8
+ * @since 0.0.1
9
+ * @author AMBROISE PARK Consulting
10
+ */
11
+ import { useParams } from './useParams.next';
12
+ /**
13
+ * Safely extract a route parameter as a string
14
+ *
15
+ * Handles the fact that useParams can return string | string[] | undefined.
16
+ * For standard path parameters (not catch-all routes), this will always be a string.
17
+ *
18
+ * @param paramName - Name of the route parameter
19
+ * @returns The parameter value as a string, or undefined if not present
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * // Route: /product/:id
24
+ * const id = useRouteParam('id'); // string | undefined
25
+ * if (!id) return <NotFound />;
26
+ * ```
27
+ */
28
+ export function useRouteParam(paramName) {
29
+ const params = useParams();
30
+ const value = params[paramName];
31
+ if (typeof value === 'string') {
32
+ return value;
33
+ }
34
+ if (Array.isArray(value) && value.length > 0) {
35
+ return value[0];
36
+ }
37
+ return undefined;
38
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Safely extract a route parameter as a string
3
+ *
4
+ * Handles the fact that useParams can return string | string[] | undefined.
5
+ * For standard path parameters (not catch-all routes), this will always be a string.
6
+ *
7
+ * @param paramName - Name of the route parameter
8
+ * @returns The parameter value as a string, or undefined if not present
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * // Route: /product/:id
13
+ * const id = useRouteParam('id'); // string | undefined
14
+ * if (!id) return <NotFound />;
15
+ * ```
16
+ */
17
+ export declare function useRouteParam(paramName: string): string | undefined;
18
+ //# sourceMappingURL=useRouteParam.vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRouteParam.vite.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/useRouteParam.vite.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAanE"}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ // packages/ui/src/routing/hooks/useRouteParam.vite.ts
3
+ /**
4
+ * @fileoverview useRouteParam hook - Vite/React Router implementation
5
+ * @description Helper hook to safely extract a single route parameter as a string
6
+ *
7
+ * @version 0.0.1
8
+ * @since 0.0.1
9
+ * @author AMBROISE PARK Consulting
10
+ */
11
+ import { useParams } from './useParams.vite';
12
+ /**
13
+ * Safely extract a route parameter as a string
14
+ *
15
+ * Handles the fact that useParams can return string | string[] | undefined.
16
+ * For standard path parameters (not catch-all routes), this will always be a string.
17
+ *
18
+ * @param paramName - Name of the route parameter
19
+ * @returns The parameter value as a string, or undefined if not present
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * // Route: /product/:id
24
+ * const id = useRouteParam('id'); // string | undefined
25
+ * if (!id) return <NotFound />;
26
+ * ```
27
+ */
28
+ export function useRouteParam(paramName) {
29
+ const params = useParams();
30
+ const value = params[paramName];
31
+ if (typeof value === 'string') {
32
+ return value;
33
+ }
34
+ if (Array.isArray(value) && value.length > 0) {
35
+ return value[0];
36
+ }
37
+ return undefined;
38
+ }
@@ -15,7 +15,7 @@ export { default as GoToWrapper } from './GoToWrapper';
15
15
  export { default as GoToInput } from './GoToInput';
16
16
  export * from './DnDevNavigationMenu';
17
17
  export { default as NotFoundPage } from './404';
18
- export { useNavigate, useBack, useRefresh, usePrefetch, useLocation, useParams, useSearchParams, useMatch, useQueryParams, useRedirectGuard, } from '@donotdev/ui/routing/hooks';
18
+ export { useNavigate, useBack, useRefresh, usePrefetch, useLocation, useParams, useRouteParam, useSearchParams, useMatch, useQueryParams, useRedirectGuard, } from '@donotdev/ui/routing/hooks';
19
19
  export type { NavigateOptions, RedirectGuardOptions, RedirectGuardResult, } from '@donotdev/ui/routing/hooks';
20
20
  export * from './useNavigation';
21
21
  export * from './useGoTo';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAGH,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnD,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,OAAO,CAAC;AAOhD,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,eAAe,EACf,QAAQ,EACR,cAAc,EACd,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAGH,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnD,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,OAAO,CAAC;AAOhD,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,EACd,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
@@ -23,6 +23,6 @@ export { default as NotFoundPage } from './404';
23
23
  // - hooks.vite.ts when bundled with Vite (vite-app condition)
24
24
  // - hooks.next.ts when bundled with Next.js (default condition)
25
25
  // NOTE: Explicit named exports required - esbuild can't re-export with 'export *' from external
26
- export { useNavigate, useBack, useRefresh, usePrefetch, useLocation, useParams, useSearchParams, useMatch, useQueryParams, useRedirectGuard, } from '@donotdev/ui/routing/hooks';
26
+ export { useNavigate, useBack, useRefresh, usePrefetch, useLocation, useParams, useRouteParam, useSearchParams, useMatch, useQueryParams, useRedirectGuard, } from '@donotdev/ui/routing/hooks';
27
27
  export * from './useNavigation';
28
28
  export * from './useGoTo';
@@ -1 +1 @@
1
- {"version":3,"file":"useGoTo.d.ts","sourceRoot":"","sources":["../../src/routing/useGoTo.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,eAAO,MAAM,OAAO;;;;2BA4BT,MAAM;uBAQN,MAAM;2BAcN,MAAM;CAehB,CAAC"}
1
+ {"version":3,"file":"useGoTo.d.ts","sourceRoot":"","sources":["../../src/routing/useGoTo.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,eAAO,MAAM,OAAO;;;;2BA4BT,MAAM;uBAQN,MAAM;2BAcN,MAAM;CAehB,CAAC"}