@hero-design/rn 0.0.0-integrate-basic-table-20251229041814 → 0.0.0-integrate-basic-table-20251229143430

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 (28) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/CHANGELOG.md +3 -1
  3. package/es/index.js +205 -66
  4. package/lib/index.js +205 -66
  5. package/package.json +1 -1
  6. package/src/components/Progress/SegmentedBar/StyledSegmentedBar.tsx +29 -0
  7. package/src/components/Progress/SegmentedBar/__tests__/index.spec.tsx +42 -0
  8. package/src/components/Progress/SegmentedBar/__tests__/utils.spec.tsx +24 -0
  9. package/src/components/Progress/SegmentedBar/constants.ts +6 -0
  10. package/src/components/Progress/SegmentedBar/hooks/validation.ts +27 -0
  11. package/src/components/Progress/SegmentedBar/index.tsx +120 -0
  12. package/src/components/Progress/SegmentedBar/types.ts +45 -0
  13. package/src/components/Progress/SegmentedBar/utils.ts +16 -0
  14. package/src/components/Progress/index.tsx +2 -0
  15. package/src/theme/__tests__/__snapshots__/index.spec.ts.snap +2 -0
  16. package/src/theme/components/progress.ts +2 -0
  17. package/src/types.ts +2 -0
  18. package/src/utils/helpers.ts +6 -0
  19. package/types/components/Progress/SegmentedBar/StyledSegmentedBar.d.ts +16 -0
  20. package/types/components/Progress/SegmentedBar/constants.d.ts +5 -0
  21. package/types/components/Progress/SegmentedBar/hooks/validation.d.ts +4 -0
  22. package/types/components/Progress/SegmentedBar/index.d.ts +4 -0
  23. package/types/components/Progress/SegmentedBar/types.d.ts +39 -0
  24. package/types/components/Progress/SegmentedBar/utils.d.ts +2 -0
  25. package/types/components/Progress/index.d.ts +1 -0
  26. package/types/theme/components/progress.d.ts +2 -0
  27. package/types/types.d.ts +2 -1
  28. package/types/utils/helpers.d.ts +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hero-design/rn",
3
- "version": "0.0.0-integrate-basic-table-20251229041814",
3
+ "version": "0.0.0-integrate-basic-table-20251229143430",
4
4
  "license": "MIT",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -0,0 +1,29 @@
1
+ import styled from '@emotion/native';
2
+ import Box from '../../Box';
3
+
4
+ const StyledHeader = styled(Box)(({ theme }) => ({
5
+ flexDirection: 'row',
6
+ justifyContent: 'space-between',
7
+ alignItems: 'baseline',
8
+ marginBottom: theme.__hd__.progress.space.segmentedHeaderMarginBottom,
9
+ }));
10
+
11
+ const StyledTrack = styled(Box)(({ theme }) => ({
12
+ width: '100%',
13
+ height: theme.__hd__.progress.sizes.barHeight,
14
+ borderRadius: theme.__hd__.progress.radii.default,
15
+ overflow: 'hidden',
16
+ flexDirection: 'row',
17
+ }));
18
+
19
+ const StyledSegment = styled(Box)<{
20
+ themeColor: string;
21
+ themeWidthPercent: number;
22
+ }>(({ themeColor, themeWidthPercent }) => ({
23
+ backgroundColor: themeColor,
24
+ flexGrow: 0,
25
+ flexShrink: 0,
26
+ width: `${themeWidthPercent}%`,
27
+ }));
28
+
29
+ export { StyledHeader, StyledSegment, StyledTrack };
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import renderWithTheme from '../../../../testHelpers/renderWithTheme';
3
+ import ProgressSegmentedBar from '..';
4
+ import { SEGMENTED_BAR_ERRORS } from '../constants';
5
+
6
+ describe('Progress.SegmentedBar', () => {
7
+ it('renders correctly with header', () => {
8
+ const { getByTestId, getByText } = renderWithTheme(
9
+ <ProgressSegmentedBar
10
+ testID="progress-segmented"
11
+ headerConfig={{ left: 'Title', right: 'Right' }}
12
+ data={[
13
+ { label: 'A', data: 25 },
14
+ { label: 'B', data: 25 },
15
+ ]}
16
+ />
17
+ );
18
+
19
+ expect(getByTestId('progress-segmented')).toBeVisible();
20
+ expect(getByTestId('progress-segmented-header')).toBeVisible();
21
+ expect(getByTestId('progress-segmented-track')).toBeVisible();
22
+ expect(getByTestId('progress-segmented-segment-A')).toBeVisible();
23
+ expect(getByTestId('progress-segmented-segment-B')).toBeVisible();
24
+ expect(getByTestId('progress-segmented-segment-remainder')).toBeVisible();
25
+ expect(getByText('Title')).toBeVisible();
26
+ expect(getByText('Right')).toBeVisible();
27
+ });
28
+
29
+ it('throws on negative segment value', () => {
30
+ expect(() =>
31
+ renderWithTheme(
32
+ <ProgressSegmentedBar
33
+ testID="progress-segmented"
34
+ data={[
35
+ { label: 'A', data: 25 },
36
+ { label: 'B', data: -10 },
37
+ ]}
38
+ />
39
+ )
40
+ ).toThrow(SEGMENTED_BAR_ERRORS.negativeValue.replace('$value', '-10'));
41
+ });
42
+ });
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { getTextComponent } from '../utils';
3
+ import Typography from '../../../Typography';
4
+
5
+ const TextComponent = (
6
+ <Typography.Caption intent="muted">Sample Text</Typography.Caption>
7
+ );
8
+
9
+ describe('getTextComponent', () => {
10
+ it('should return null when content is falsy', () => {
11
+ expect(getTextComponent(null, TextComponent)).toBeNull();
12
+ expect(getTextComponent(undefined, TextComponent)).toBeNull();
13
+ });
14
+
15
+ it('should return TextComponent when content is a string or number', () => {
16
+ expect(getTextComponent('Progress', TextComponent)).toBe(TextComponent);
17
+ expect(getTextComponent(50, TextComponent)).toBe(TextComponent);
18
+ });
19
+
20
+ it('should return content when it is a ReactNode', () => {
21
+ const customContent = <Typography.Body>Custom Content</Typography.Body>;
22
+ expect(getTextComponent(customContent, TextComponent)).toBe(customContent);
23
+ });
24
+ });
@@ -0,0 +1,6 @@
1
+ export const MIN_PROGRESS_VALUE = 0;
2
+ export const MAX_PROGRESS_VALUE = 100;
3
+
4
+ export const SEGMENTED_BAR_ERRORS = {
5
+ negativeValue: '[Progress.SegmentedBar] value:$value is less than 0',
6
+ } as const;
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+
3
+ import { SEGMENTED_BAR_ERRORS } from '../constants';
4
+
5
+ import { assert } from '../../../../utils/helpers';
6
+
7
+ export const useValidateSegmentedBarData = ({
8
+ values,
9
+ dataLength,
10
+ }: {
11
+ dataLength: number;
12
+ values: number[];
13
+ }) => {
14
+ const { hasNegativeValue, negativeValue } = React.useMemo(() => {
15
+ const foundNegativeValue = values.find((value) => value < 0);
16
+
17
+ return {
18
+ hasNegativeValue: foundNegativeValue !== undefined,
19
+ negativeValue: foundNegativeValue,
20
+ };
21
+ }, [dataLength, values]);
22
+
23
+ assert(
24
+ !hasNegativeValue,
25
+ SEGMENTED_BAR_ERRORS.negativeValue.replace('$value', String(negativeValue))
26
+ );
27
+ };
@@ -0,0 +1,120 @@
1
+ import { useTheme } from '@emotion/react';
2
+ import type { ReactElement } from 'react';
3
+ import React from 'react';
4
+
5
+ import Typography from '../../Typography';
6
+
7
+ import Box from '../../Box';
8
+ import { MAX_PROGRESS_VALUE, MIN_PROGRESS_VALUE } from './constants';
9
+ import { useValidateSegmentedBarData } from './hooks/validation';
10
+ import { StyledHeader, StyledSegment, StyledTrack } from './StyledSegmentedBar';
11
+ import type { ProgressSegmentedBarProps } from './types';
12
+ import { getTextComponent } from './utils';
13
+
14
+ const ProgressSegmentedBar = ({
15
+ data,
16
+ headerConfig,
17
+ style,
18
+ testID,
19
+ ...nativeProps
20
+ }: ProgressSegmentedBarProps): ReactElement => {
21
+ const values = React.useMemo(() => data.map((s) => s.data), [data]);
22
+ useValidateSegmentedBarData({ dataLength: data.length, values });
23
+
24
+ const theme = useTheme();
25
+ const totalPercent = React.useMemo(
26
+ () => values.reduce((acc, value) => acc + value, 0),
27
+ [values]
28
+ );
29
+
30
+ const ariaValueMax =
31
+ totalPercent > MAX_PROGRESS_VALUE ? totalPercent : MAX_PROGRESS_VALUE;
32
+
33
+ const remainderPercent = React.useMemo(() => {
34
+ return totalPercent >= MAX_PROGRESS_VALUE
35
+ ? 0
36
+ : MAX_PROGRESS_VALUE - totalPercent;
37
+ }, [totalPercent]);
38
+
39
+ // Mock colors
40
+ const segmentColors = [
41
+ theme.colors.primary,
42
+ theme.colors.success,
43
+ theme.colors.warning,
44
+ theme.colors.error,
45
+ theme.colors.info,
46
+ theme.colors.archived,
47
+ ];
48
+
49
+ const headerRight = React.useMemo(
50
+ () =>
51
+ getTextComponent(
52
+ headerConfig?.right,
53
+ <Typography.Caption intent="muted">
54
+ {headerConfig?.right}
55
+ </Typography.Caption>
56
+ ),
57
+ [headerConfig?.right]
58
+ );
59
+
60
+ const showHeader = Boolean(headerConfig?.left || headerRight);
61
+
62
+ return (
63
+ <Box {...nativeProps} style={style} testID={testID}>
64
+ {showHeader ? (
65
+ <StyledHeader testID={testID ? `${testID}-header` : undefined}>
66
+ {headerConfig?.left ? (
67
+ <Typography.Body
68
+ variant="regular-bold"
69
+ testID={testID ? `${testID}-header-left` : undefined}
70
+ >
71
+ {headerConfig.left}
72
+ </Typography.Body>
73
+ ) : null}
74
+
75
+ {headerRight ? (
76
+ <Box testID={testID ? `${testID}-header-right` : undefined}>
77
+ {headerRight}
78
+ </Box>
79
+ ) : null}
80
+ </StyledHeader>
81
+ ) : null}
82
+
83
+ <StyledTrack
84
+ testID={testID ? `${testID}-track` : undefined}
85
+ accessibilityRole="progressbar"
86
+ accessibilityValue={{
87
+ min: MIN_PROGRESS_VALUE,
88
+ max: ariaValueMax,
89
+ now: totalPercent,
90
+ }}
91
+ >
92
+ {data.map((s, index) => {
93
+ const segmentColor = segmentColors[index % segmentColors.length];
94
+
95
+ return (
96
+ <StyledSegment
97
+ key={`${s.label}-${segmentColor}`}
98
+ themeColor={segmentColor}
99
+ themeWidthPercent={s.data}
100
+ testID={testID ? `${testID}-segment-${s.label}` : undefined}
101
+ />
102
+ );
103
+ })}
104
+
105
+ {remainderPercent > 0 ? (
106
+ <StyledSegment
107
+ key="remainder"
108
+ themeColor={
109
+ theme.__hd__.progress.colors.segmentedRemainderBackground
110
+ }
111
+ themeWidthPercent={remainderPercent}
112
+ testID={testID ? `${testID}-segment-remainder` : undefined}
113
+ />
114
+ ) : null}
115
+ </StyledTrack>
116
+ </Box>
117
+ );
118
+ };
119
+
120
+ export default ProgressSegmentedBar;
@@ -0,0 +1,45 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ import type { ViewProps } from 'react-native';
4
+
5
+ export interface SegmentedBarSeries<Data> {
6
+ /**
7
+ * Label of series.
8
+ */
9
+ label: string;
10
+ /**
11
+ * Data of series.
12
+ */
13
+ data: Data;
14
+ }
15
+
16
+ export type SegmentedBarData = Array<SegmentedBarSeries<number>>;
17
+
18
+ export interface SegmentedBarHeaderConfig {
19
+ /**
20
+ * Left header content.
21
+ */
22
+ left?: string;
23
+ /**
24
+ * Right header content.
25
+ */
26
+ right?: ReactNode;
27
+ }
28
+
29
+ export interface ProgressSegmentedBarProps extends ViewProps {
30
+ /**
31
+ * Segmented data.
32
+ *
33
+ * Each segment value is treated as a percentage amount.
34
+ *
35
+ * Runtime validation:
36
+ * - Throws if any segment value is negative.
37
+ * - Values do not need to sum to 100; if the total exceeds 100, the bar will be fully filled and no remainder segment will be shown.
38
+ */
39
+ data: SegmentedBarData;
40
+
41
+ /**
42
+ * Optional header content.
43
+ */
44
+ headerConfig?: SegmentedBarHeaderConfig;
45
+ }
@@ -0,0 +1,16 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ export const getTextComponent = (
4
+ content: ReactNode,
5
+ textElement: ReactNode
6
+ ): ReactNode => {
7
+ if (!content) {
8
+ return null;
9
+ }
10
+
11
+ if (typeof content === 'string' || typeof content === 'number') {
12
+ return textElement;
13
+ }
14
+
15
+ return content;
16
+ };
@@ -1,10 +1,12 @@
1
1
  import ProgressCircle from './ProgressCircle';
2
2
  import ProgressBar from './ProgressBar';
3
3
  import ProgressStep from './ProgressStep';
4
+ import ProgressSegmentedBar from './SegmentedBar';
4
5
 
5
6
  const Progress = {
6
7
  Circle: ProgressCircle,
7
8
  Bar: ProgressBar,
9
+ SegmentedBar: ProgressSegmentedBar,
8
10
  Step: ProgressStep,
9
11
  } as const;
10
12
 
@@ -1046,6 +1046,7 @@ exports[`theme returns correct theme object 1`] = `
1046
1046
  "warning": "#000000",
1047
1047
  "warningInverted": "#000000",
1048
1048
  },
1049
+ "segmentedRemainderBackground": "#dadbde",
1049
1050
  "step": {
1050
1051
  "complete": "#401960",
1051
1052
  "current": "#ccd2d3",
@@ -1062,6 +1063,7 @@ exports[`theme returns correct theme object 1`] = `
1062
1063
  "stepHeight": 8,
1063
1064
  },
1064
1065
  "space": {
1066
+ "segmentedHeaderMarginBottom": 8,
1065
1067
  "stepGap": 4,
1066
1068
  },
1067
1069
  },
@@ -37,6 +37,7 @@ const getProgressTheme = (theme: GlobalTheme) => {
37
37
  incomplete: theme.colors.archivedSurface,
38
38
  current: theme.colors.decorativePrimarySurface,
39
39
  },
40
+ segmentedRemainderBackground: theme.colors.archivedSurface,
40
41
  };
41
42
 
42
43
  const sizes = {
@@ -52,6 +53,7 @@ const getProgressTheme = (theme: GlobalTheme) => {
52
53
 
53
54
  const space = {
54
55
  stepGap: theme.space.xsmall,
56
+ segmentedHeaderMarginBottom: theme.space.small,
55
57
  };
56
58
 
57
59
  return { colors, sizes, radii, space };
package/src/types.ts CHANGED
@@ -59,6 +59,7 @@ import type { ThemeScale } from './components/Box/types';
59
59
  import type { TimePickerProps } from './components/TimePicker/types';
60
60
  import type { DatePickerProps } from './components/DatePicker/types';
61
61
  import type { SegmentedControlItemConfig } from './components/SegmentedControl/types';
62
+ import type { ProgressSegmentedBarProps } from './components/Progress/SegmentedBar/types';
62
63
 
63
64
  export type {
64
65
  Space,
@@ -114,4 +115,5 @@ export type {
114
115
  TimePickerProps,
115
116
  DatePickerProps,
116
117
  SegmentedControlItemConfig,
118
+ ProgressSegmentedBarProps,
117
119
  };
@@ -233,3 +233,9 @@ export const transformKebabCaseToCamelCase = <T extends string>(
233
233
  /[a-z]/.test(char) ? char.toUpperCase() : char
234
234
  ) as CamelCase<T>;
235
235
  };
236
+
237
+ export function assert(condition: unknown, message: string): asserts condition {
238
+ if (!condition) {
239
+ throw new Error(message);
240
+ }
241
+ }
@@ -0,0 +1,16 @@
1
+ declare const StyledHeader: import("@emotion/native").StyledComponent<import("../../Box").BoxProps & {
2
+ theme?: import("@emotion/react").Theme;
3
+ as?: React.ElementType;
4
+ }, {}, {}>;
5
+ declare const StyledTrack: import("@emotion/native").StyledComponent<import("../../Box").BoxProps & {
6
+ theme?: import("@emotion/react").Theme;
7
+ as?: React.ElementType;
8
+ }, {}, {}>;
9
+ declare const StyledSegment: import("@emotion/native").StyledComponent<import("../../Box").BoxProps & {
10
+ theme?: import("@emotion/react").Theme;
11
+ as?: React.ElementType;
12
+ } & {
13
+ themeColor: string;
14
+ themeWidthPercent: number;
15
+ }, {}, {}>;
16
+ export { StyledHeader, StyledSegment, StyledTrack };
@@ -0,0 +1,5 @@
1
+ export declare const MIN_PROGRESS_VALUE = 0;
2
+ export declare const MAX_PROGRESS_VALUE = 100;
3
+ export declare const SEGMENTED_BAR_ERRORS: {
4
+ readonly negativeValue: "[Progress.SegmentedBar] value:$value is less than 0";
5
+ };
@@ -0,0 +1,4 @@
1
+ export declare const useValidateSegmentedBarData: ({ values, dataLength, }: {
2
+ dataLength: number;
3
+ values: number[];
4
+ }) => void;
@@ -0,0 +1,4 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { ProgressSegmentedBarProps } from './types';
3
+ declare const ProgressSegmentedBar: ({ data, headerConfig, style, testID, ...nativeProps }: ProgressSegmentedBarProps) => ReactElement;
4
+ export default ProgressSegmentedBar;
@@ -0,0 +1,39 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ViewProps } from 'react-native';
3
+ export interface SegmentedBarSeries<Data> {
4
+ /**
5
+ * Label of series.
6
+ */
7
+ label: string;
8
+ /**
9
+ * Data of series.
10
+ */
11
+ data: Data;
12
+ }
13
+ export type SegmentedBarData = Array<SegmentedBarSeries<number>>;
14
+ export interface SegmentedBarHeaderConfig {
15
+ /**
16
+ * Left header content.
17
+ */
18
+ left?: string;
19
+ /**
20
+ * Right header content.
21
+ */
22
+ right?: ReactNode;
23
+ }
24
+ export interface ProgressSegmentedBarProps extends ViewProps {
25
+ /**
26
+ * Segmented data.
27
+ *
28
+ * Each segment value is treated as a percentage amount.
29
+ *
30
+ * Runtime validation:
31
+ * - Throws if any segment value is negative.
32
+ * - Values do not need to sum to 100; if the total exceeds 100, the bar will be fully filled and no remainder segment will be shown.
33
+ */
34
+ data: SegmentedBarData;
35
+ /**
36
+ * Optional header content.
37
+ */
38
+ headerConfig?: SegmentedBarHeaderConfig;
39
+ }
@@ -0,0 +1,2 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare const getTextComponent: (content: ReactNode, textElement: ReactNode) => ReactNode;
@@ -1,6 +1,7 @@
1
1
  declare const Progress: {
2
2
  readonly Circle: ({ value, renderValue, intent, style, testID, ...nativeProps }: import("./ProgressCircle").ProgressCircleProps) => import("react").ReactElement;
3
3
  readonly Bar: ({ value, intent, style, testID, ...nativeProps }: import("./ProgressBar").ProgressBarProps) => import("react").ReactElement;
4
+ readonly SegmentedBar: ({ data, headerConfig, style, testID, ...nativeProps }: import("./SegmentedBar/types").ProgressSegmentedBarProps) => import("react").ReactElement;
4
5
  readonly Step: ({ steps, current, onLayout, ...props }: import("./ProgressStep").ProgressStepProps) => import("react").JSX.Element;
5
6
  };
6
7
  export default Progress;
@@ -34,6 +34,7 @@ declare const getProgressTheme: (theme: GlobalTheme) => {
34
34
  incomplete: string;
35
35
  current: string;
36
36
  };
37
+ segmentedRemainderBackground: string;
37
38
  };
38
39
  sizes: {
39
40
  circleDiameter: number;
@@ -46,6 +47,7 @@ declare const getProgressTheme: (theme: GlobalTheme) => {
46
47
  };
47
48
  space: {
48
49
  stepGap: number;
50
+ segmentedHeaderMarginBottom: number;
49
51
  };
50
52
  };
51
53
  export default getProgressTheme;
package/types/types.d.ts CHANGED
@@ -39,4 +39,5 @@ import type { ThemeScale } from './components/Box/types';
39
39
  import type { TimePickerProps } from './components/TimePicker/types';
40
40
  import type { DatePickerProps } from './components/DatePicker/types';
41
41
  import type { SegmentedControlItemConfig } from './components/SegmentedControl/types';
42
- export type { Space, CaptionProps, Radii, TitleProps, CarouselData, CarouselImageProps, PinInputHandler, ThemeScale, ToastProps, ActionGroupProps, ToolbarItemProps, BottomNavigationTabType, IconName, SingleSelectProps, MultiSelectProps, ListRenderOptionInfo, SectionListRenderOptionInfo, SelectOptionType, SwipeableProps, RichTextEditorProps, RichTextEditorRef, TabType, TextInputProps, TextProps, TextInputHandles, Theme, CardCarouselHandles, FABHandles, ActionGroupHandles, ActionItemProps, SliderRangeValue, CalendarDateRange, LocaleCode, LocaleValues, DateTimeFormats, ColumnChartProps, LineChartProps, Scale, SystemPalette, BrandSystemPalette, GlobalSystemPalette, IconProps, CheckboxProps, SwitchOptionType, BoxProps, BodyProps, ToolbarButtonName, ListItemProps, IconButtonProps, BadgeProps, TimePickerProps, DatePickerProps, SegmentedControlItemConfig, };
42
+ import type { ProgressSegmentedBarProps } from './components/Progress/SegmentedBar/types';
43
+ export type { Space, CaptionProps, Radii, TitleProps, CarouselData, CarouselImageProps, PinInputHandler, ThemeScale, ToastProps, ActionGroupProps, ToolbarItemProps, BottomNavigationTabType, IconName, SingleSelectProps, MultiSelectProps, ListRenderOptionInfo, SectionListRenderOptionInfo, SelectOptionType, SwipeableProps, RichTextEditorProps, RichTextEditorRef, TabType, TextInputProps, TextProps, TextInputHandles, Theme, CardCarouselHandles, FABHandles, ActionGroupHandles, ActionItemProps, SliderRangeValue, CalendarDateRange, LocaleCode, LocaleValues, DateTimeFormats, ColumnChartProps, LineChartProps, Scale, SystemPalette, BrandSystemPalette, GlobalSystemPalette, IconProps, CheckboxProps, SwitchOptionType, BoxProps, BodyProps, ToolbarButtonName, ListItemProps, IconButtonProps, BadgeProps, TimePickerProps, DatePickerProps, SegmentedControlItemConfig, ProgressSegmentedBarProps, };
@@ -11,3 +11,4 @@ export declare const useKeyboard: () => {
11
11
  };
12
12
  export type CamelCase<S extends string> = S extends `${infer F}-${infer R}` ? R extends `${string}-${string}` ? `${F}${Capitalize<CamelCase<R>>}` : `${F}${Capitalize<R>}` : never;
13
13
  export declare const transformKebabCaseToCamelCase: <T extends string>(string: T) => CamelCase<T>;
14
+ export declare function assert(condition: unknown, message: string): asserts condition;