@trackunit/react-table 2.7.75 → 2.7.76-alpha-55a192f4ee4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.js CHANGED
@@ -529,6 +529,15 @@ const validateTableState = (raw) => {
529
529
  const result = tableStateSchema.safeParse(raw);
530
530
  return result.success ? result.data : undefined;
531
531
  };
532
+ /**
533
+ * Changes reported before `clientSideUserId` resolves carry no owner — the user
534
+ * was already editing while their id was in flight — so the identity that
535
+ * resolves adopts them. Once a defined identity owns the reported state it must
536
+ * not be adopted by a later identity, including a brief window where the
537
+ * current id is unset: treating that gap as unowned would copy one person's
538
+ * layout into the next user's scoped storage.
539
+ */
540
+ const isOwnedByCurrentUser = (ownerId, clientSideUserId) => ownerId === undefined || ownerId === clientSideUserId;
532
541
  /**
533
542
  * Persists and restores table column state (order, sizing, visibility, sorting, pinning, expanded) using
534
543
  * the URL **hash fragment** and localStorage.
@@ -551,7 +560,8 @@ const validateTableState = (raw) => {
551
560
  *
552
561
  * On mount, state is loaded from the hash (or legacy search param as a
553
562
  * one-shot fallback) and merged with localStorage so fields omitted from
554
- * the URL, such as `expanded`, still survive reloads. Changes are
563
+ * the URL, such as `expanded`, still survive reloads. Hydration does not
564
+ * trigger this hook's persistence effect. Only user-reported changes are
555
565
  * debounced (300 ms) and synced to both the hash and localStorage.
556
566
  *
557
567
  * `onTableStateChange` takes a *partial* state and merges it into whatever
@@ -560,6 +570,12 @@ const validateTableState = (raw) => {
560
570
  * their mount-time values. A field reported empty is dropped from the stored
561
571
  * state, and once every field is empty the entry is removed altogether.
562
572
  *
573
+ * Reported state is scoped to the identity that reported it: when the current
574
+ * user changes, state reported by the previous user is discarded instead of
575
+ * being written to the new user's storage. Hydrating a layout shared through
576
+ * the URL is unaffected — it renders for anyone and only becomes the reader's
577
+ * persisted layout once they change the table themselves.
578
+ *
563
579
  * @param persistenceKey - Unique key used to store and retrieve the table state.
564
580
  * Must be camelCase and at most 15 characters (e.g. "userTable", "assetList").
565
581
  * @returns {UseTablePersistenceResult} An object containing:
@@ -592,6 +608,8 @@ const useTablePersistence = (persistenceKey) => {
592
608
  // `?<key>=...` search param into the hash on first load.
593
609
  urlLocation: "hash",
594
610
  });
611
+ // Identity that reported the state currently held in `pendingState`.
612
+ const pendingOwnerIdRef = react.useRef(undefined);
595
613
  const [pendingState, setPendingState] = react.useState(null);
596
614
  const debouncedPending = reactComponents.useDebounce(pendingState, { delay: 300 });
597
615
  const hasReportedChange = debouncedPending !== null;
@@ -599,12 +617,12 @@ const useTablePersistence = (persistenceKey) => {
599
617
  if (!debouncedPending && !initialState) {
600
618
  return undefined;
601
619
  }
602
- const columnOrder = debouncedPending?.columnOrder ?? initialState?.columnOrder;
603
- const columnSizing = debouncedPending?.columnSizing ?? initialState?.columnSizing;
604
- const columnVisibility = debouncedPending?.columnVisibility ?? initialState?.columnVisibility;
605
- const sorting = debouncedPending?.sorting ?? initialState?.sorting;
606
- const columnPinning = debouncedPending?.columnPinning ?? initialState?.columnPinning;
607
- const expanded = debouncedPending?.expanded ?? initialState?.expanded;
620
+ const columnOrder = debouncedPending?.state.columnOrder ?? initialState?.columnOrder;
621
+ const columnSizing = debouncedPending?.state.columnSizing ?? initialState?.columnSizing;
622
+ const columnVisibility = debouncedPending?.state.columnVisibility ?? initialState?.columnVisibility;
623
+ const sorting = debouncedPending?.state.sorting ?? initialState?.sorting;
624
+ const columnPinning = debouncedPending?.state.columnPinning ?? initialState?.columnPinning;
625
+ const expanded = debouncedPending?.state.expanded ?? initialState?.expanded;
608
626
  const state = {};
609
627
  if (columnOrder && columnOrder.length > 0) {
610
628
  state.columnOrder = columnOrder;
@@ -630,18 +648,54 @@ const useTablePersistence = (persistenceKey) => {
630
648
  if (!newTableState) {
631
649
  return;
632
650
  }
633
- setPendingState(previousState => ({ ...previousState, ...newTableState }));
634
- }, []);
651
+ const reporterId = clientSideUserId;
652
+ const previousOwnerId = pendingOwnerIdRef.current;
653
+ if (!isOwnedByCurrentUser(previousOwnerId, reporterId)) {
654
+ if (reporterId === undefined) {
655
+ return;
656
+ }
657
+ pendingOwnerIdRef.current = reporterId;
658
+ // State left behind by another identity is dropped rather than merged, so
659
+ // this user's change builds on their own persisted state.
660
+ setPendingState({ ownerId: reporterId, state: { ...newTableState } });
661
+ return;
662
+ }
663
+ if (reporterId !== undefined) {
664
+ pendingOwnerIdRef.current = reporterId;
665
+ }
666
+ setPendingState(previousState => ({
667
+ ownerId: reporterId,
668
+ state: { ...previousState?.state, ...newTableState },
669
+ }));
670
+ }, [clientSideUserId]);
635
671
  react.useEffect(() => {
636
- if (!currentState) {
672
+ // Initial URL/localStorage hydration is read-only. Do not rely on
673
+ // `usePersistedState` deduplicating an attempted write.
674
+ if (!hasReportedChange || !currentState) {
637
675
  return;
638
676
  }
677
+ // Writing here after the current user changed would copy the previous
678
+ // user's reported state into this user's scoped storage — the debounced
679
+ // state outlives the identity that produced it.
680
+ const debouncedOwnerId = debouncedPending.ownerId;
681
+ const pendingOwnerId = pendingOwnerIdRef.current;
682
+ const hasCrossUserOwner = !isOwnedByCurrentUser(debouncedOwnerId, clientSideUserId) ||
683
+ !isOwnedByCurrentUser(pendingOwnerId, clientSideUserId);
684
+ const ownerChangedDuringDebounce = pendingOwnerId !== undefined && debouncedOwnerId !== pendingOwnerId;
685
+ if (hasCrossUserOwner || ownerChangedDuringDebounce) {
686
+ return;
687
+ }
688
+ // State reported before identity resolution is adopted by the first
689
+ // identity that resolves. Hydration-only runs cannot reach this branch.
690
+ if (debouncedOwnerId === undefined && clientSideUserId !== undefined) {
691
+ pendingOwnerIdRef.current = clientSideUserId;
692
+ }
639
693
  if (sharedUtils.objectKeys(currentState).length === 0) {
640
694
  clearState();
641
695
  return;
642
696
  }
643
697
  persistState(currentState);
644
- }, [clearState, currentState, persistState]);
698
+ }, [clearState, clientSideUserId, currentState, debouncedPending, hasReportedChange, persistState]);
645
699
  return react.useMemo(() => ({
646
700
  onTableStateChange,
647
701
  initialState,
package/index.esm.js CHANGED
@@ -3,7 +3,7 @@ import { registerTranslations, useNamespaceTranslation, NamespaceTrans } from '@
3
3
  import { Icon, MenuItem, Button, Tooltip, useOverflowItems, MoreMenu, MenuContent, Spacer, usePersistedState, useDebounce, Text, cvaInteractableItem, Popover, PopoverTrigger, IconButton, PopoverContent, cvaMenuList, cvaMenu, useBidirectionalScroll, noPagination, Card, Spinner, EmptyState } from '@trackunit/react-components';
4
4
  import { Link } from '@tanstack/react-router';
5
5
  import { objectValues, VISIBLE_ONLY_COLUMN_VISIBILITY_KEY, objectKeys, nonNullable, objectEntries } from '@trackunit/shared-utils';
6
- import { useMemo, Children, cloneElement, useCallback, useState, useEffect, useRef, createElement } from 'react';
6
+ import { useMemo, Children, cloneElement, useCallback, useRef, useState, useEffect, createElement } from 'react';
7
7
  import { cva } from '@trackunit/css-class-variance-utilities';
8
8
  import { useCurrentUser } from '@trackunit/react-core-hooks';
9
9
  import { z } from 'zod';
@@ -528,6 +528,15 @@ const validateTableState = (raw) => {
528
528
  const result = tableStateSchema.safeParse(raw);
529
529
  return result.success ? result.data : undefined;
530
530
  };
531
+ /**
532
+ * Changes reported before `clientSideUserId` resolves carry no owner — the user
533
+ * was already editing while their id was in flight — so the identity that
534
+ * resolves adopts them. Once a defined identity owns the reported state it must
535
+ * not be adopted by a later identity, including a brief window where the
536
+ * current id is unset: treating that gap as unowned would copy one person's
537
+ * layout into the next user's scoped storage.
538
+ */
539
+ const isOwnedByCurrentUser = (ownerId, clientSideUserId) => ownerId === undefined || ownerId === clientSideUserId;
531
540
  /**
532
541
  * Persists and restores table column state (order, sizing, visibility, sorting, pinning, expanded) using
533
542
  * the URL **hash fragment** and localStorage.
@@ -550,7 +559,8 @@ const validateTableState = (raw) => {
550
559
  *
551
560
  * On mount, state is loaded from the hash (or legacy search param as a
552
561
  * one-shot fallback) and merged with localStorage so fields omitted from
553
- * the URL, such as `expanded`, still survive reloads. Changes are
562
+ * the URL, such as `expanded`, still survive reloads. Hydration does not
563
+ * trigger this hook's persistence effect. Only user-reported changes are
554
564
  * debounced (300 ms) and synced to both the hash and localStorage.
555
565
  *
556
566
  * `onTableStateChange` takes a *partial* state and merges it into whatever
@@ -559,6 +569,12 @@ const validateTableState = (raw) => {
559
569
  * their mount-time values. A field reported empty is dropped from the stored
560
570
  * state, and once every field is empty the entry is removed altogether.
561
571
  *
572
+ * Reported state is scoped to the identity that reported it: when the current
573
+ * user changes, state reported by the previous user is discarded instead of
574
+ * being written to the new user's storage. Hydrating a layout shared through
575
+ * the URL is unaffected — it renders for anyone and only becomes the reader's
576
+ * persisted layout once they change the table themselves.
577
+ *
562
578
  * @param persistenceKey - Unique key used to store and retrieve the table state.
563
579
  * Must be camelCase and at most 15 characters (e.g. "userTable", "assetList").
564
580
  * @returns {UseTablePersistenceResult} An object containing:
@@ -591,6 +607,8 @@ const useTablePersistence = (persistenceKey) => {
591
607
  // `?<key>=...` search param into the hash on first load.
592
608
  urlLocation: "hash",
593
609
  });
610
+ // Identity that reported the state currently held in `pendingState`.
611
+ const pendingOwnerIdRef = useRef(undefined);
594
612
  const [pendingState, setPendingState] = useState(null);
595
613
  const debouncedPending = useDebounce(pendingState, { delay: 300 });
596
614
  const hasReportedChange = debouncedPending !== null;
@@ -598,12 +616,12 @@ const useTablePersistence = (persistenceKey) => {
598
616
  if (!debouncedPending && !initialState) {
599
617
  return undefined;
600
618
  }
601
- const columnOrder = debouncedPending?.columnOrder ?? initialState?.columnOrder;
602
- const columnSizing = debouncedPending?.columnSizing ?? initialState?.columnSizing;
603
- const columnVisibility = debouncedPending?.columnVisibility ?? initialState?.columnVisibility;
604
- const sorting = debouncedPending?.sorting ?? initialState?.sorting;
605
- const columnPinning = debouncedPending?.columnPinning ?? initialState?.columnPinning;
606
- const expanded = debouncedPending?.expanded ?? initialState?.expanded;
619
+ const columnOrder = debouncedPending?.state.columnOrder ?? initialState?.columnOrder;
620
+ const columnSizing = debouncedPending?.state.columnSizing ?? initialState?.columnSizing;
621
+ const columnVisibility = debouncedPending?.state.columnVisibility ?? initialState?.columnVisibility;
622
+ const sorting = debouncedPending?.state.sorting ?? initialState?.sorting;
623
+ const columnPinning = debouncedPending?.state.columnPinning ?? initialState?.columnPinning;
624
+ const expanded = debouncedPending?.state.expanded ?? initialState?.expanded;
607
625
  const state = {};
608
626
  if (columnOrder && columnOrder.length > 0) {
609
627
  state.columnOrder = columnOrder;
@@ -629,18 +647,54 @@ const useTablePersistence = (persistenceKey) => {
629
647
  if (!newTableState) {
630
648
  return;
631
649
  }
632
- setPendingState(previousState => ({ ...previousState, ...newTableState }));
633
- }, []);
650
+ const reporterId = clientSideUserId;
651
+ const previousOwnerId = pendingOwnerIdRef.current;
652
+ if (!isOwnedByCurrentUser(previousOwnerId, reporterId)) {
653
+ if (reporterId === undefined) {
654
+ return;
655
+ }
656
+ pendingOwnerIdRef.current = reporterId;
657
+ // State left behind by another identity is dropped rather than merged, so
658
+ // this user's change builds on their own persisted state.
659
+ setPendingState({ ownerId: reporterId, state: { ...newTableState } });
660
+ return;
661
+ }
662
+ if (reporterId !== undefined) {
663
+ pendingOwnerIdRef.current = reporterId;
664
+ }
665
+ setPendingState(previousState => ({
666
+ ownerId: reporterId,
667
+ state: { ...previousState?.state, ...newTableState },
668
+ }));
669
+ }, [clientSideUserId]);
634
670
  useEffect(() => {
635
- if (!currentState) {
671
+ // Initial URL/localStorage hydration is read-only. Do not rely on
672
+ // `usePersistedState` deduplicating an attempted write.
673
+ if (!hasReportedChange || !currentState) {
636
674
  return;
637
675
  }
676
+ // Writing here after the current user changed would copy the previous
677
+ // user's reported state into this user's scoped storage — the debounced
678
+ // state outlives the identity that produced it.
679
+ const debouncedOwnerId = debouncedPending.ownerId;
680
+ const pendingOwnerId = pendingOwnerIdRef.current;
681
+ const hasCrossUserOwner = !isOwnedByCurrentUser(debouncedOwnerId, clientSideUserId) ||
682
+ !isOwnedByCurrentUser(pendingOwnerId, clientSideUserId);
683
+ const ownerChangedDuringDebounce = pendingOwnerId !== undefined && debouncedOwnerId !== pendingOwnerId;
684
+ if (hasCrossUserOwner || ownerChangedDuringDebounce) {
685
+ return;
686
+ }
687
+ // State reported before identity resolution is adopted by the first
688
+ // identity that resolves. Hydration-only runs cannot reach this branch.
689
+ if (debouncedOwnerId === undefined && clientSideUserId !== undefined) {
690
+ pendingOwnerIdRef.current = clientSideUserId;
691
+ }
638
692
  if (objectKeys(currentState).length === 0) {
639
693
  clearState();
640
694
  return;
641
695
  }
642
696
  persistState(currentState);
643
- }, [clearState, currentState, persistState]);
697
+ }, [clearState, clientSideUserId, currentState, debouncedPending, hasReportedChange, persistState]);
644
698
  return useMemo(() => ({
645
699
  onTableStateChange,
646
700
  initialState,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../../../libs/react/table/migrations/entry.ts"],"names":[],"mappings":"","sourcesContent":["export {};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/react-table",
3
- "version": "2.7.75",
3
+ "version": "2.7.76-alpha-55a192f4ee4.0",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "engines": {
@@ -11,15 +11,15 @@
11
11
  "react-dnd": "16.0.1",
12
12
  "react-dnd-html5-backend": "16.0.1",
13
13
  "tailwind-merge": "^2.0.0",
14
- "@trackunit/react-components": "2.13.26",
15
- "@trackunit/react-core-hooks": "1.21.64",
16
- "@trackunit/shared-utils": "1.16.49",
17
- "@trackunit/css-class-variance-utilities": "2.0.14",
18
- "@trackunit/ui-icons": "1.14.43",
19
- "@trackunit/react-table-base-components": "2.7.20",
20
- "@trackunit/react-form-components": "2.6.74",
21
- "@trackunit/i18n-library-translation": "2.4.64",
22
- "@trackunit/iris-app-runtime-core-api": "1.17.61",
14
+ "@trackunit/react-components": "2.13.27-alpha-55a192f4ee4.0",
15
+ "@trackunit/react-core-hooks": "1.21.65-alpha-55a192f4ee4.0",
16
+ "@trackunit/shared-utils": "1.16.50-alpha-55a192f4ee4.0",
17
+ "@trackunit/css-class-variance-utilities": "2.0.15-alpha-55a192f4ee4.0",
18
+ "@trackunit/ui-icons": "1.14.44-alpha-55a192f4ee4.0",
19
+ "@trackunit/react-table-base-components": "2.7.21-alpha-55a192f4ee4.0",
20
+ "@trackunit/react-form-components": "2.6.75-alpha-55a192f4ee4.0",
21
+ "@trackunit/i18n-library-translation": "2.4.65-alpha-55a192f4ee4.0",
22
+ "@trackunit/iris-app-runtime-core-api": "1.17.62-alpha-55a192f4ee4.0",
23
23
  "zod": "^3.25.76"
24
24
  },
25
25
  "peerDependencies": {
@@ -27,7 +27,7 @@ export declare const ActionButton: ({ action, id, ...rest }: ActionButtonProps)
27
27
  * @param {string} [dataTestId] - Optional data test ID.
28
28
  * @returns {ReactElement} - The MenuItem component for the given action.
29
29
  */
30
- export declare const actionDataToMenuItem: (action: ActionModel, dataTestId?: string) => import("react").JSX.Element;
30
+ export declare const actionDataToMenuItem: (action: ActionModel, dataTestId?: string) => import("react/jsx-runtime").JSX.Element;
31
31
  /**
32
32
  * Converts an action model to an ActionButton component.
33
33
  * These should be shown in the ActionSheet.
@@ -36,5 +36,5 @@ export declare const actionDataToMenuItem: (action: ActionModel, dataTestId?: st
36
36
  * @param action - The action model to convert.
37
37
  * @returns {*} The ActionButton component for the given action.
38
38
  */
39
- export declare const actionDataToActionButton: (action: ActionModel) => import("react").JSX.Element;
39
+ export declare const actionDataToActionButton: (action: ActionModel) => import("react/jsx-runtime").JSX.Element;
40
40
  export {};
@@ -127,4 +127,4 @@ export interface ActionSheetProps extends CommonProps, Styleable {
127
127
  * @param {ActionSheetProps} props - The props for the ActionSheet component
128
128
  * @returns {ReactElement} ActionSheet component
129
129
  */
130
- export declare const ActionSheet: ({ actions, dropdownActions, moreActions, selections, resetSelection, className, style, "data-testid": dataTestId, }: ActionSheetProps) => import("react").JSX.Element;
130
+ export declare const ActionSheet: ({ actions, dropdownActions, moreActions, selections, resetSelection, className, style, "data-testid": dataTestId, }: ActionSheetProps) => import("react/jsx-runtime").JSX.Element;
@@ -10,4 +10,4 @@ export declare const TextWithTooltip: ({ children, tooltipLabel, weight, }: {
10
10
  children: ReactNode;
11
11
  tooltipLabel?: string;
12
12
  weight?: TextWeight;
13
- }) => import("react").JSX.Element;
13
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -81,7 +81,8 @@ type UseTablePersistenceResult = {
81
81
  *
82
82
  * On mount, state is loaded from the hash (or legacy search param as a
83
83
  * one-shot fallback) and merged with localStorage so fields omitted from
84
- * the URL, such as `expanded`, still survive reloads. Changes are
84
+ * the URL, such as `expanded`, still survive reloads. Hydration does not
85
+ * trigger this hook's persistence effect. Only user-reported changes are
85
86
  * debounced (300 ms) and synced to both the hash and localStorage.
86
87
  *
87
88
  * `onTableStateChange` takes a *partial* state and merges it into whatever
@@ -90,6 +91,12 @@ type UseTablePersistenceResult = {
90
91
  * their mount-time values. A field reported empty is dropped from the stored
91
92
  * state, and once every field is empty the entry is removed altogether.
92
93
  *
94
+ * Reported state is scoped to the identity that reported it: when the current
95
+ * user changes, state reported by the previous user is discarded instead of
96
+ * being written to the new user's storage. Hydrating a layout shared through
97
+ * the URL is unaffected — it renders for anyone and only becomes the reader's
98
+ * persisted layout once they change the table themselves.
99
+ *
93
100
  * @param persistenceKey - Unique key used to store and retrieve the table state.
94
101
  * Must be camelCase and at most 15 characters (e.g. "userTable", "assetList").
95
102
  * @returns {UseTablePersistenceResult} An object containing:
@@ -13,5 +13,5 @@ interface ColumnActionsProps<TData> {
13
13
  * @param {Header<TData, unknown>} props.header The header of the current column provided by React Table.
14
14
  * @param {number} props.visibleColumnsCount The number of visible columns in the table.
15
15
  */
16
- declare const ColumnActions: <TData>({ header, visibleColumnsCount, setSorting, getColumn }: ColumnActionsProps<TData>) => import("react").JSX.Element | null;
16
+ declare const ColumnActions: <TData>({ header, visibleColumnsCount, setSorting, getColumn }: ColumnActionsProps<TData>) => import("react/jsx-runtime").JSX.Element | null;
17
17
  export default ColumnActions;
@@ -15,7 +15,7 @@ export interface ColumnFilterProps<TColumnFilter extends object, TColumnFilterVa
15
15
  * @param {ColumnFilterProps<TColumnFilter, TColumnFilterValue>} props - The props object containing necessary properties.
16
16
  * @returns {ReactElement | null} A React JSX element representing the ColumnFilter component or null if columns are not provided.
17
17
  */
18
- export declare const ColumnFilter: <TColumnFilter extends object, TColumnFilterValue>({ columns, setColumnOrder, defaultColumnOrder, columnOrder, onUserEvent, setColumnSize, }: ColumnFilterProps<TColumnFilter, TColumnFilterValue>) => import("react").JSX.Element;
18
+ export declare const ColumnFilter: <TColumnFilter extends object, TColumnFilterValue>({ columns, setColumnOrder, defaultColumnOrder, columnOrder, onUserEvent, setColumnSize, }: ColumnFilterProps<TColumnFilter, TColumnFilterValue>) => import("react/jsx-runtime").JSX.Element;
19
19
  export interface ColumnFiltersDragAndDropProps<TColumnFiltersDragAndDrop extends object, TColumnFiltersDragAndDropValue> {
20
20
  columns: Array<Column<TColumnFiltersDragAndDrop, TColumnFiltersDragAndDropValue>>;
21
21
  setColumnOrder: (updater: Updater<ColumnOrderState>) => void;
@@ -28,5 +28,5 @@ interface ColumnFilterItemProps {
28
28
  * @param {boolean} [props.isSortDisabled] - Optional flag to disable sorting.
29
29
  * @returns {Element} A React component rendering the column filter item.
30
30
  */
31
- export declare const ColumnFilterItem: ({ name, onToggle, toggled, disabled, index, moveColumn, onDrop, onCancelDrop, id, isSortDisabled, }: ColumnFilterItemProps) => import("react").JSX.Element;
31
+ export declare const ColumnFilterItem: ({ name, onToggle, toggled, disabled, index, moveColumn, onDrop, onCancelDrop, id, isSortDisabled, }: ColumnFilterItemProps) => import("react/jsx-runtime").JSX.Element;
32
32
  export {};
@@ -26,7 +26,7 @@ export type TranslationFunction = TransForLibs<TranslationKeys>;
26
26
  /**
27
27
  * Trans for this specific library.
28
28
  */
29
- export declare const Trans: (props: NamespaceTransProps<TranslationKeys>) => import("react").JSX.Element;
29
+ export declare const Trans: (props: NamespaceTransProps<TranslationKeys>) => import("react/jsx-runtime").JSX.Element;
30
30
  /**
31
31
  * Registers the translations for this library
32
32
  */