@fountain-ui/core 1.16.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/build/commonjs/Modal/Modal.js +10 -1
  3. package/build/commonjs/Modal/Modal.js.map +1 -1
  4. package/build/commonjs/Modal/index.js +10 -2
  5. package/build/commonjs/Modal/index.js.map +1 -1
  6. package/build/commonjs/Pagination/Pagination.js +2 -2
  7. package/build/commonjs/Pagination/Pagination.js.map +1 -1
  8. package/build/commonjs/hooks/useCollapsibleAppBar.js +7 -1
  9. package/build/commonjs/hooks/useCollapsibleAppBar.js.map +1 -1
  10. package/build/commonjs/hooks/useFadeInAppBar.js +7 -0
  11. package/build/commonjs/hooks/useFadeInAppBar.js.map +1 -1
  12. package/build/commonjs/index.js +7 -0
  13. package/build/commonjs/index.js.map +1 -1
  14. package/build/commonjs/internal/icons/ChevronLeft.js +23 -0
  15. package/build/commonjs/internal/icons/ChevronLeft.js.map +1 -0
  16. package/build/commonjs/internal/icons/ChevronRight.js +23 -0
  17. package/build/commonjs/internal/icons/ChevronRight.js.map +1 -0
  18. package/build/commonjs/internal/icons/index.js +16 -0
  19. package/build/commonjs/internal/icons/index.js.map +1 -1
  20. package/build/module/Modal/Modal.js +6 -1
  21. package/build/module/Modal/Modal.js.map +1 -1
  22. package/build/module/Modal/index.js +1 -1
  23. package/build/module/Modal/index.js.map +1 -1
  24. package/build/module/Pagination/Pagination.js +1 -1
  25. package/build/module/Pagination/Pagination.js.map +1 -1
  26. package/build/module/hooks/useCollapsibleAppBar.js +8 -2
  27. package/build/module/hooks/useCollapsibleAppBar.js.map +1 -1
  28. package/build/module/hooks/useFadeInAppBar.js +8 -1
  29. package/build/module/hooks/useFadeInAppBar.js.map +1 -1
  30. package/build/module/index.js +1 -1
  31. package/build/module/index.js.map +1 -1
  32. package/build/module/internal/icons/ChevronLeft.js +9 -0
  33. package/build/module/internal/icons/ChevronLeft.js.map +1 -0
  34. package/build/module/internal/icons/ChevronRight.js +9 -0
  35. package/build/module/internal/icons/ChevronRight.js.map +1 -0
  36. package/build/module/internal/icons/index.js +2 -0
  37. package/build/module/internal/icons/index.js.map +1 -1
  38. package/build/typescript/Modal/Modal.d.ts +11 -0
  39. package/build/typescript/Modal/ModalProps.d.ts +2 -1
  40. package/build/typescript/Modal/index.d.ts +2 -1
  41. package/build/typescript/hooks/useCollapsibleAppBar.d.ts +1 -0
  42. package/build/typescript/hooks/useFadeInAppBar.d.ts +1 -0
  43. package/build/typescript/index.d.ts +2 -1
  44. package/build/typescript/internal/icons/ChevronLeft.d.ts +113 -0
  45. package/build/typescript/internal/icons/ChevronRight.d.ts +113 -0
  46. package/build/typescript/internal/icons/index.d.ts +2 -0
  47. package/package.json +3 -3
  48. package/src/Modal/Modal.tsx +15 -1
  49. package/src/Modal/ModalProps.ts +2 -1
  50. package/src/Modal/index.ts +3 -2
  51. package/src/Pagination/Pagination.tsx +1 -1
  52. package/src/hooks/useCollapsibleAppBar.ts +7 -2
  53. package/src/hooks/useFadeInAppBar.ts +9 -1
  54. package/src/index.ts +2 -1
  55. package/src/internal/icons/ChevronLeft.tsx +11 -0
  56. package/src/internal/icons/ChevronRight.tsx +11 -0
  57. package/src/internal/icons/index.ts +2 -0
@@ -0,0 +1,113 @@
1
+ import React from 'react';
2
+ declare const _default: React.MemoExoticComponent<{
3
+ (props: {
4
+ readonly style?: import("@emotion/native").ReactNativeStyle | import("@emotion/native").ReactNativeStyle[] | undefined;
5
+ readonly width?: import("react-native-svg").NumberProp | undefined;
6
+ readonly height?: import("react-native-svg").NumberProp | undefined;
7
+ readonly viewBox?: string | undefined;
8
+ preserveAspectRatio?: string | undefined;
9
+ readonly color?: import("react-native-svg").Color | undefined;
10
+ title?: string | undefined;
11
+ opacity?: import("react-native-svg").NumberProp | undefined;
12
+ readonly fill?: import("react-native-svg").Color | undefined;
13
+ fillOpacity?: import("react-native-svg").NumberProp | undefined;
14
+ fillRule?: import("react-native-svg").FillRule | undefined;
15
+ stroke?: import("react-native-svg").Color | undefined;
16
+ strokeWidth?: import("react-native-svg").NumberProp | undefined;
17
+ strokeOpacity?: import("react-native-svg").NumberProp | undefined;
18
+ strokeDasharray?: import("react-native-svg").NumberProp | readonly import("react-native-svg").NumberProp[] | undefined;
19
+ strokeDashoffset?: import("react-native-svg").NumberProp | undefined;
20
+ strokeLinecap?: import("react-native-svg").Linecap | undefined;
21
+ strokeLinejoin?: import("react-native-svg").Linejoin | undefined;
22
+ strokeMiterlimit?: import("react-native-svg").NumberProp | undefined;
23
+ clipRule?: import("react-native-svg").FillRule | undefined;
24
+ clipPath?: string | undefined;
25
+ transform?: string | import("react-native-svg").TransformObject | import("react-native-svg").ColumnMajorTransformMatrix | undefined;
26
+ translate?: import("react-native-svg").NumberArray | undefined;
27
+ translateX?: import("react-native-svg").NumberProp | undefined;
28
+ translateY?: import("react-native-svg").NumberProp | undefined;
29
+ origin?: import("react-native-svg").NumberArray | undefined;
30
+ originX?: import("react-native-svg").NumberProp | undefined;
31
+ originY?: import("react-native-svg").NumberProp | undefined;
32
+ scale?: import("react-native-svg").NumberArray | undefined;
33
+ scaleX?: import("react-native-svg").NumberProp | undefined;
34
+ scaleY?: import("react-native-svg").NumberProp | undefined;
35
+ skew?: import("react-native-svg").NumberArray | undefined;
36
+ skewX?: import("react-native-svg").NumberProp | undefined;
37
+ skewY?: import("react-native-svg").NumberProp | undefined;
38
+ rotation?: import("react-native-svg").NumberProp | undefined;
39
+ x?: import("react-native-svg").NumberArray | undefined;
40
+ y?: import("react-native-svg").NumberArray | undefined;
41
+ vectorEffect?: "none" | "inherit" | "non-scaling-stroke" | "nonScalingStroke" | "default" | "uri" | undefined;
42
+ pointerEvents?: "auto" | "none" | "box-none" | "box-only" | undefined;
43
+ onStartShouldSetResponder?: ((event: import("react-native").GestureResponderEvent) => boolean) | undefined;
44
+ onMoveShouldSetResponder?: ((event: import("react-native").GestureResponderEvent) => boolean) | undefined;
45
+ onResponderEnd?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
46
+ onResponderGrant?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
47
+ onResponderReject?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
48
+ onResponderMove?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
49
+ onResponderRelease?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
50
+ onResponderStart?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
51
+ onResponderTerminationRequest?: ((event: import("react-native").GestureResponderEvent) => boolean) | undefined;
52
+ onResponderTerminate?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
53
+ onStartShouldSetResponderCapture?: ((event: import("react-native").GestureResponderEvent) => boolean) | undefined;
54
+ onMoveShouldSetResponderCapture?: ((event: import("react-native").GestureResponderEvent) => boolean) | undefined;
55
+ disabled?: boolean | undefined;
56
+ onPress?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
57
+ onPressIn?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
58
+ onPressOut?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
59
+ onLongPress?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
60
+ delayPressIn?: number | undefined;
61
+ delayPressOut?: number | undefined;
62
+ delayLongPress?: number | undefined;
63
+ id?: string | undefined;
64
+ marker?: string | undefined;
65
+ markerStart?: string | undefined;
66
+ markerMid?: string | undefined;
67
+ markerEnd?: string | undefined;
68
+ mask?: string | undefined;
69
+ hitSlop?: import("react-native").Insets | undefined;
70
+ onLayout?: ((event: import("react-native").LayoutChangeEvent) => void) | undefined;
71
+ removeClippedSubviews?: boolean | undefined;
72
+ testID?: string | undefined;
73
+ nativeID?: string | undefined;
74
+ collapsable?: boolean | undefined;
75
+ needsOffscreenAlphaCompositing?: boolean | undefined;
76
+ renderToHardwareTextureAndroid?: boolean | undefined;
77
+ focusable?: boolean | undefined;
78
+ shouldRasterizeIOS?: boolean | undefined;
79
+ isTVSelectable?: boolean | undefined;
80
+ hasTVPreferredFocus?: boolean | undefined;
81
+ tvParallaxProperties?: import("react-native").TVParallaxProperties | undefined;
82
+ tvParallaxShiftDistanceX?: number | undefined;
83
+ tvParallaxShiftDistanceY?: number | undefined;
84
+ tvParallaxTiltAngle?: number | undefined;
85
+ tvParallaxMagnification?: number | undefined;
86
+ onTouchStart?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
87
+ onTouchMove?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
88
+ onTouchEnd?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
89
+ onTouchCancel?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
90
+ onTouchEndCapture?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
91
+ accessible?: boolean | undefined;
92
+ accessibilityActions?: readonly Readonly<{
93
+ name: string;
94
+ label?: string | undefined;
95
+ }>[] | undefined;
96
+ accessibilityLabel?: string | undefined;
97
+ accessibilityRole?: import("react-native").AccessibilityRole | undefined;
98
+ accessibilityState?: import("react-native").AccessibilityState | undefined;
99
+ accessibilityHint?: string | undefined;
100
+ accessibilityValue?: import("react-native").AccessibilityValue | undefined;
101
+ onAccessibilityAction?: ((event: import("react-native").AccessibilityActionEvent) => void) | undefined;
102
+ accessibilityLiveRegion?: "none" | "polite" | "assertive" | undefined;
103
+ importantForAccessibility?: "auto" | "yes" | "no" | "no-hide-descendants" | undefined;
104
+ accessibilityElementsHidden?: boolean | undefined;
105
+ accessibilityViewIsModal?: boolean | undefined;
106
+ onAccessibilityEscape?: (() => void) | undefined;
107
+ onAccessibilityTap?: (() => void) | undefined;
108
+ onMagicTap?: (() => void) | undefined;
109
+ accessibilityIgnoresInvertColors?: boolean | undefined;
110
+ }): JSX.Element;
111
+ displayName: string;
112
+ }>;
113
+ export default _default;
@@ -1,6 +1,8 @@
1
1
  export { default as Checkbox } from './Checkbox';
2
2
  export { default as CheckboxChecked } from './CheckboxChecked';
3
3
  export { default as ChevronDown } from './ChevronDown';
4
+ export { default as ChevronLeft } from './ChevronLeft';
5
+ export { default as ChevronRight } from './ChevronRight';
4
6
  export { default as CircularProgress } from './CircularProgress';
5
7
  export { default as Close } from './Close';
6
8
  export { default as Radio } from './Radio';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fountain-ui/core",
3
- "version": "1.16.0",
3
+ "version": "1.19.0",
4
4
  "author": "Fountain-UI Team",
5
5
  "description": "React components that implement Tappytoon's Fountain Design.",
6
6
  "license": "MIT",
@@ -14,7 +14,7 @@
14
14
  "prepare": "bob build"
15
15
  },
16
16
  "dependencies": {
17
- "@fountain-ui/styles": "^1.4.1",
17
+ "@fountain-ui/styles": "^1.5.0",
18
18
  "@fountain-ui/utils": "^1.1.0"
19
19
  },
20
20
  "peerDependencies": {
@@ -67,5 +67,5 @@
67
67
  "publishConfig": {
68
68
  "access": "public"
69
69
  },
70
- "gitHead": "0738cec018c008c9993b8d432ca8aaa44d7c3f77"
70
+ "gitHead": "471da1539616fd885a946692a80d94533e10ce02"
71
71
  }
@@ -6,6 +6,20 @@ import Slide from '../Slide';
6
6
  import SimpleBackdrop from './SimpleBackdrop';
7
7
  import type ModalProps from './ModalProps';
8
8
 
9
+ export type ModalCloseReasonType = 'OUTSIDE_PRESS' | 'HARDWARE_BACK_PRESS' | 'CLOSE_BUTTON_PRESS' | 'UNKNOWN';
10
+
11
+ export interface ModalCloseEvent {
12
+ metadata: {
13
+ reason: ModalCloseReasonType
14
+ };
15
+ }
16
+
17
+ export const createModalCloseEvent = (reason: ModalCloseReasonType) => ({
18
+ metadata: {
19
+ reason,
20
+ },
21
+ });
22
+
9
23
  export default function Modal(props: ModalProps) {
10
24
  const {
11
25
  animationStyle,
@@ -21,7 +35,7 @@ export default function Modal(props: ModalProps) {
21
35
 
22
36
  const handleBackdropPress = () => {
23
37
  if (onClose) {
24
- onClose();
38
+ onClose(createModalCloseEvent('OUTSIDE_PRESS'));
25
39
  }
26
40
  };
27
41
 
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { ViewProps } from 'react-native';
3
3
  import type { ComponentProps, OverridableComponentProps } from '../types';
4
+ import { ModalCloseEvent } from './Modal';
4
5
 
5
6
  export default interface ModalProps extends OverridableComponentProps<ViewProps, {
6
7
  /**
@@ -34,7 +35,7 @@ export default interface ModalProps extends OverridableComponentProps<ViewProps,
34
35
  /**
35
36
  * Callback fired when the component requests to be closed.
36
37
  */
37
- onClose?: () => void,
38
+ onClose?: (event?: ModalCloseEvent) => void,
38
39
 
39
40
  /**
40
41
  * If `true`, the modal is visible.
@@ -1,2 +1,3 @@
1
- export { default } from './Modal';
2
- export type { default as ModalProps } from './ModalProps';
1
+ export { default, createModalCloseEvent } from './Modal';
2
+ export type { ModalCloseEvent } from './Modal';
3
+ export type { default as ModalProps } from './ModalProps';
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { View } from 'react-native';
3
- import { ChevronLeft, ChevronRight } from '@fountain-ui/icons';
4
3
  import { NamedStylesStringUnion, UseStyles } from '@fountain-ui/styles';
5
4
  import { times } from '@fountain-ui/utils';
5
+ import { ChevronLeft, ChevronRight } from '../internal/icons';
6
6
  import { css, useTheme } from '../styles';
7
7
  import IconButton from '../IconButton';
8
8
  import PaginationItem from '../PaginationItem';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { Falsy, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';
2
+ import { Falsy, Keyboard, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';
3
3
  import Animated from 'react-native-reanimated';
4
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
5
5
  import { useHeight } from '../internal/hooks';
@@ -22,6 +22,7 @@ export interface ContentInsets {
22
22
  }
23
23
 
24
24
  export interface Options {
25
+ keyboardDismissMode?: 'none' | 'on-drag';
25
26
  translucent?: boolean;
26
27
  }
27
28
 
@@ -35,6 +36,7 @@ export interface CollapsibleAppBar {
35
36
  }
36
37
 
37
38
  const defaultOptions: Required<Options> = {
39
+ keyboardDismissMode: 'none',
38
40
  translucent: false,
39
41
  };
40
42
 
@@ -43,7 +45,7 @@ const ANIMATION_DURATION_MILLIS = 100;
43
45
  const SUPPORTS_DRAG_DETECTION = Platform.OS !== 'web';
44
46
 
45
47
  export default function useCollapsibleAppBar(userOptions: Options = defaultOptions): CollapsibleAppBar {
46
- const { translucent }: Required<Options> = {
48
+ const { translucent, keyboardDismissMode }: Required<Options> = {
47
49
  ...defaultOptions,
48
50
  ...userOptions,
49
51
  };
@@ -106,6 +108,9 @@ export default function useCollapsibleAppBar(userOptions: Options = defaultOptio
106
108
 
107
109
  const scrollHandler = Animated.useAnimatedScrollHandler({
108
110
  onBeginDrag: () => {
111
+ if (keyboardDismissMode === 'on-drag') {
112
+ Animated.runOnJS(Keyboard.dismiss)();
113
+ }
109
114
  lastTranslateY.value = translateY.value;
110
115
  },
111
116
  onMomentumBegin: () => {
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { Falsy, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';
2
+ import { Falsy, Keyboard, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';
3
3
  import Animated from 'react-native-reanimated';
4
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
5
5
  import { rgb } from '@fountain-ui/utils';
@@ -17,6 +17,7 @@ export interface Options {
17
17
  fadeInBeginY?: number | ((endY: number, appBarHeight: number) => number);
18
18
  fadeInEndY?: number | ((appBarHeight: number) => number);
19
19
  floating?: boolean;
20
+ keyboardDismissMode?: 'none' | 'on-drag';
20
21
  translucent?: boolean;
21
22
  }
22
23
 
@@ -34,6 +35,7 @@ const defaultOptions: Required<Options> = {
34
35
  fadeInBeginY: (endY, appBarHeight) => endY - appBarHeight,
35
36
  fadeInEndY: (appBarHeight) => appBarHeight,
36
37
  floating: true,
38
+ keyboardDismissMode: 'none',
37
39
  translucent: false,
38
40
  };
39
41
 
@@ -45,6 +47,7 @@ export default function useFadeInAppBar(userOptions: Options = defaultOptions):
45
47
  fadeInBeginY,
46
48
  fadeInEndY,
47
49
  floating,
50
+ keyboardDismissMode,
48
51
  translucent,
49
52
  }: Required<Options> = {
50
53
  ...defaultOptions,
@@ -89,6 +92,11 @@ export default function useFadeInAppBar(userOptions: Options = defaultOptions):
89
92
  }));
90
93
 
91
94
  const scrollHandler = Animated.useAnimatedScrollHandler({
95
+ onBeginDrag: () => {
96
+ if (keyboardDismissMode === 'on-drag') {
97
+ Animated.runOnJS(Keyboard.dismiss)();
98
+ }
99
+ },
92
100
  onScroll: (event) => {
93
101
  const offsetY = event.contentOffset.y;
94
102
 
package/src/index.ts CHANGED
@@ -105,7 +105,8 @@ export * from './Menu';
105
105
  export { default as MenuItem } from './MenuItem';
106
106
  export * from './MenuItem';
107
107
 
108
- export { default as Modal } from './Modal';
108
+ export { default as Modal, createModalCloseEvent } from './Modal';
109
+ export type { ModalCloseEvent } from './Modal';
109
110
  export * from './Modal';
110
111
 
111
112
  export { default as Pagination } from './Pagination';
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { Path } from 'react-native-svg';
3
+ import { createSvgIcon } from '../../utils';
4
+
5
+ export default createSvgIcon(
6
+ <Path
7
+ fillRule="evenodd"
8
+ clipRule="evenodd"
9
+ d="M6.76965 9.46973L12.2697 3.96973L13.3303 5.03039L8.36064 10.0001L13.3303 14.9697L12.2697 16.0304L6.76965 10.5304L6.76965 9.46973Z"
10
+ />
11
+ , 'ChevronLeft');
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { Path } from 'react-native-svg';
3
+ import { createSvgIcon } from '../../utils';
4
+
5
+ export default createSvgIcon(
6
+ <Path
7
+ fillRule="evenodd"
8
+ clipRule="evenodd"
9
+ d="M13.3303 10.5303L7.83032 16.0303L6.76966 14.9697L11.7393 10L6.76966 5.03033L7.83032 3.96968L13.3303 9.46967V10.5303Z"
10
+ />
11
+ , 'ChevronRight');
@@ -1,6 +1,8 @@
1
1
  export { default as Checkbox } from './Checkbox';
2
2
  export { default as CheckboxChecked } from './CheckboxChecked';
3
3
  export { default as ChevronDown } from './ChevronDown';
4
+ export { default as ChevronLeft } from './ChevronLeft';
5
+ export { default as ChevronRight } from './ChevronRight';
4
6
  export { default as CircularProgress } from './CircularProgress';
5
7
  export { default as Close } from './Close';
6
8
  export { default as Radio } from './Radio';