orn-ui 0.2.10 → 0.3.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/AGENTS.md +66 -51
- package/README.md +3 -7
- package/lib/commonjs/atoms/Avatar.js +77 -5
- package/lib/commonjs/atoms/Avatar.js.map +1 -1
- package/lib/commonjs/atoms/Badge.js +17 -8
- package/lib/commonjs/atoms/Badge.js.map +1 -1
- package/lib/commonjs/atoms/Button.js +108 -39
- package/lib/commonjs/atoms/Button.js.map +1 -1
- package/lib/commonjs/atoms/Card.js +24 -2
- package/lib/commonjs/atoms/Card.js.map +1 -1
- package/lib/commonjs/atoms/Checkbox.js +41 -10
- package/lib/commonjs/atoms/Checkbox.js.map +1 -1
- package/lib/commonjs/atoms/Divider.js +30 -5
- package/lib/commonjs/atoms/Divider.js.map +1 -1
- package/lib/commonjs/atoms/EmptyState.js +58 -20
- package/lib/commonjs/atoms/EmptyState.js.map +1 -1
- package/lib/commonjs/atoms/Fab.js +32 -12
- package/lib/commonjs/atoms/Fab.js.map +1 -1
- package/lib/commonjs/atoms/Gradient.js +102 -36
- package/lib/commonjs/atoms/Gradient.js.map +1 -1
- package/lib/commonjs/atoms/IconButton.js +25 -4
- package/lib/commonjs/atoms/IconButton.js.map +1 -1
- package/lib/commonjs/atoms/Image.js +61 -25
- package/lib/commonjs/atoms/Image.js.map +1 -1
- package/lib/commonjs/atoms/Input.js +105 -17
- package/lib/commonjs/atoms/Input.js.map +1 -1
- package/lib/commonjs/atoms/KeyValueRow.js +37 -9
- package/lib/commonjs/atoms/KeyValueRow.js.map +1 -1
- package/lib/commonjs/atoms/PressableScale.js +25 -5
- package/lib/commonjs/atoms/PressableScale.js.map +1 -1
- package/lib/commonjs/atoms/ShinyText.js +29 -29
- package/lib/commonjs/atoms/Skeleton.js +28 -13
- package/lib/commonjs/atoms/Skeleton.js.map +1 -1
- package/lib/commonjs/atoms/Spinner.js +81 -22
- package/lib/commonjs/atoms/Spinner.js.map +1 -1
- package/lib/commonjs/atoms/Text.js +56 -5
- package/lib/commonjs/atoms/Text.js.map +1 -1
- package/lib/commonjs/atoms/Transition.js +46 -43
- package/lib/commonjs/atoms/Transition.js.map +1 -1
- package/lib/commonjs/atoms/index.js +6 -0
- package/lib/commonjs/atoms/index.js.map +1 -1
- package/lib/commonjs/atoms/inputValidation.js +56 -0
- package/lib/commonjs/atoms/inputValidation.js.map +1 -0
- package/lib/commonjs/icons/Icon.js +4 -4
- package/lib/commonjs/icons/defaultIcons.js +576 -24
- package/lib/commonjs/icons/defaultIcons.js.map +1 -1
- package/lib/commonjs/icons/index.js +6 -0
- package/lib/commonjs/icons/index.js.map +1 -1
- package/lib/commonjs/molecules/AvatarHeader.js +47 -14
- package/lib/commonjs/molecules/AvatarHeader.js.map +1 -1
- package/lib/commonjs/molecules/FormActions.js +25 -9
- package/lib/commonjs/molecules/FormActions.js.map +1 -1
- package/lib/commonjs/molecules/InfoRow.js +30 -14
- package/lib/commonjs/molecules/InfoRow.js.map +1 -1
- package/lib/commonjs/molecules/OptionCard.js +37 -22
- package/lib/commonjs/molecules/OptionCard.js.map +1 -1
- package/lib/commonjs/molecules/SegmentedControl.js +103 -14
- package/lib/commonjs/molecules/SegmentedControl.js.map +1 -1
- package/lib/commonjs/molecules/Stepper.js +61 -16
- package/lib/commonjs/molecules/Stepper.js.map +1 -1
- package/lib/commonjs/molecules/Steps.js +105 -41
- package/lib/commonjs/molecules/Steps.js.map +1 -1
- package/lib/commonjs/molecules/SymmetricGrid.js +26 -18
- package/lib/commonjs/molecules/SymmetricGrid.js.map +1 -1
- package/lib/commonjs/organisms/Alert.js +49 -35
- package/lib/commonjs/organisms/Alert.js.map +1 -1
- package/lib/commonjs/organisms/AlertProvider.js +10 -10
- package/lib/commonjs/organisms/BottomSheet.js +137 -85
- package/lib/commonjs/organisms/BottomSheet.js.map +1 -1
- package/lib/commonjs/organisms/Chart.js +174 -154
- package/lib/commonjs/organisms/Chart.js.map +1 -1
- package/lib/commonjs/organisms/DateField.js +36 -20
- package/lib/commonjs/organisms/DateField.js.map +1 -1
- package/lib/commonjs/organisms/DatePicker.js +56 -33
- package/lib/commonjs/organisms/DatePicker.js.map +1 -1
- package/lib/commonjs/organisms/List.js +62 -34
- package/lib/commonjs/organisms/List.js.map +1 -1
- package/lib/commonjs/organisms/Modal.js +120 -82
- package/lib/commonjs/organisms/Modal.js.map +1 -1
- package/lib/commonjs/organisms/NavigationBar.js +63 -24
- package/lib/commonjs/organisms/NavigationBar.js.map +1 -1
- package/lib/commonjs/organisms/OptionWheel.js +64 -64
- package/lib/commonjs/organisms/OptionWheel.js.map +1 -1
- package/lib/commonjs/organisms/ReorderableList.js +48 -27
- package/lib/commonjs/organisms/ReorderableList.js.map +1 -1
- package/lib/commonjs/organisms/Screen.js +68 -35
- package/lib/commonjs/organisms/Screen.js.map +1 -1
- package/lib/commonjs/organisms/SearchList.js +56 -26
- package/lib/commonjs/organisms/SearchList.js.map +1 -1
- package/lib/commonjs/organisms/Select.js +45 -24
- package/lib/commonjs/organisms/Select.js.map +1 -1
- package/lib/commonjs/organisms/Slides.js +36 -23
- package/lib/commonjs/organisms/Slides.js.map +1 -1
- package/lib/commonjs/organisms/ThemeToggle.js +10 -9
- package/lib/commonjs/organisms/ThemeToggle.js.map +1 -1
- package/lib/commonjs/organisms/Timeline.js +73 -56
- package/lib/commonjs/organisms/Timeline.js.map +1 -1
- package/lib/commonjs/organisms/Toast.js +46 -15
- package/lib/commonjs/organisms/Toast.js.map +1 -1
- package/lib/commonjs/organisms/ToastProvider.js +14 -10
- package/lib/commonjs/organisms/ToastProvider.js.map +1 -1
- package/lib/commonjs/organisms/Wizard.js +40 -15
- package/lib/commonjs/organisms/Wizard.js.map +1 -1
- package/lib/commonjs/organisms/chart/frame.js +25 -25
- package/lib/commonjs/organisms/chart/frame.js.map +1 -1
- package/lib/commonjs/organisms/chart/marks.js +42 -42
- package/lib/commonjs/organisms/chart/math.js +84 -85
- package/lib/commonjs/organisms/chart/math.js.map +1 -1
- package/lib/commonjs/organisms/chart/palette.js +28 -28
- package/lib/commonjs/organisms/imperativeBridge.js +5 -5
- package/lib/commonjs/organisms/imperativeBridge.js.map +1 -1
- package/lib/commonjs/organisms/useSlides.js +53 -21
- package/lib/commonjs/organisms/useSlides.js.map +1 -1
- package/lib/commonjs/safe-area/SafeAreaUIProvider.js +9 -66
- package/lib/commonjs/safe-area/SafeAreaUIProvider.js.map +1 -1
- package/lib/commonjs/safe-area/index.js.map +1 -1
- package/lib/commonjs/theme/KeyboardAvoidance.js +206 -0
- package/lib/commonjs/theme/KeyboardAvoidance.js.map +1 -0
- package/lib/commonjs/theme/NativeOverlay.js +263 -0
- package/lib/commonjs/theme/NativeOverlay.js.map +1 -0
- package/lib/commonjs/theme/UIProvider.js +86 -33
- package/lib/commonjs/theme/UIProvider.js.map +1 -1
- package/lib/commonjs/theme/colors.js +17 -17
- package/lib/commonjs/theme/colors.js.map +1 -1
- package/lib/commonjs/theme/createStyles.js +19 -16
- package/lib/commonjs/theme/createStyles.js.map +1 -1
- package/lib/commonjs/theme/createTheme.js +6 -6
- package/lib/commonjs/theme/index.js +6 -0
- package/lib/commonjs/theme/index.js.map +1 -1
- package/lib/commonjs/theme/insets.js +1 -1
- package/lib/commonjs/theme/labels.js +29 -1
- package/lib/commonjs/theme/labels.js.map +1 -1
- package/lib/commonjs/theme/palettes.js +25 -23
- package/lib/commonjs/theme/palettes.js.map +1 -1
- package/lib/commonjs/theme/tokens.js +28 -14
- package/lib/commonjs/theme/tokens.js.map +1 -1
- package/lib/commonjs/theme/useKeyboardField.js +36 -0
- package/lib/commonjs/theme/useKeyboardField.js.map +1 -0
- package/lib/commonjs/theme/useReduceMotion.js +31 -0
- package/lib/commonjs/theme/useReduceMotion.js.map +1 -0
- package/lib/module/atoms/Avatar.js +79 -8
- package/lib/module/atoms/Avatar.js.map +1 -1
- package/lib/module/atoms/Badge.js +17 -8
- package/lib/module/atoms/Badge.js.map +1 -1
- package/lib/module/atoms/Button.js +110 -41
- package/lib/module/atoms/Button.js.map +1 -1
- package/lib/module/atoms/Card.js +24 -2
- package/lib/module/atoms/Card.js.map +1 -1
- package/lib/module/atoms/Checkbox.js +42 -11
- package/lib/module/atoms/Checkbox.js.map +1 -1
- package/lib/module/atoms/Divider.js +31 -6
- package/lib/module/atoms/Divider.js.map +1 -1
- package/lib/module/atoms/EmptyState.js +58 -20
- package/lib/module/atoms/EmptyState.js.map +1 -1
- package/lib/module/atoms/Fab.js +33 -13
- package/lib/module/atoms/Fab.js.map +1 -1
- package/lib/module/atoms/Gradient.js +103 -37
- package/lib/module/atoms/Gradient.js.map +1 -1
- package/lib/module/atoms/IconButton.js +25 -4
- package/lib/module/atoms/IconButton.js.map +1 -1
- package/lib/module/atoms/Image.js +61 -25
- package/lib/module/atoms/Image.js.map +1 -1
- package/lib/module/atoms/Input.js +108 -20
- package/lib/module/atoms/Input.js.map +1 -1
- package/lib/module/atoms/KeyValueRow.js +37 -9
- package/lib/module/atoms/KeyValueRow.js.map +1 -1
- package/lib/module/atoms/PressableScale.js +25 -5
- package/lib/module/atoms/PressableScale.js.map +1 -1
- package/lib/module/atoms/ShinyText.js +29 -29
- package/lib/module/atoms/Skeleton.js +30 -13
- package/lib/module/atoms/Skeleton.js.map +1 -1
- package/lib/module/atoms/Spinner.js +82 -23
- package/lib/module/atoms/Spinner.js.map +1 -1
- package/lib/module/atoms/Text.js +56 -5
- package/lib/module/atoms/Text.js.map +1 -1
- package/lib/module/atoms/Transition.js +41 -42
- package/lib/module/atoms/Transition.js.map +1 -1
- package/lib/module/atoms/index.js +1 -1
- package/lib/module/atoms/index.js.map +1 -1
- package/lib/module/atoms/inputValidation.js +52 -0
- package/lib/module/atoms/inputValidation.js.map +1 -0
- package/lib/module/icons/Icon.js +4 -4
- package/lib/module/icons/defaultIcons.js +574 -24
- package/lib/module/icons/defaultIcons.js.map +1 -1
- package/lib/module/icons/index.js +1 -1
- package/lib/module/icons/index.js.map +1 -1
- package/lib/module/molecules/AvatarHeader.js +47 -14
- package/lib/module/molecules/AvatarHeader.js.map +1 -1
- package/lib/module/molecules/FormActions.js +25 -9
- package/lib/module/molecules/FormActions.js.map +1 -1
- package/lib/module/molecules/InfoRow.js +30 -14
- package/lib/module/molecules/InfoRow.js.map +1 -1
- package/lib/module/molecules/OptionCard.js +37 -22
- package/lib/module/molecules/OptionCard.js.map +1 -1
- package/lib/module/molecules/SegmentedControl.js +107 -18
- package/lib/module/molecules/SegmentedControl.js.map +1 -1
- package/lib/module/molecules/Stepper.js +63 -18
- package/lib/module/molecules/Stepper.js.map +1 -1
- package/lib/module/molecules/Steps.js +107 -43
- package/lib/module/molecules/Steps.js.map +1 -1
- package/lib/module/molecules/SymmetricGrid.js +26 -18
- package/lib/module/molecules/SymmetricGrid.js.map +1 -1
- package/lib/module/organisms/Alert.js +51 -37
- package/lib/module/organisms/Alert.js.map +1 -1
- package/lib/module/organisms/AlertProvider.js +10 -10
- package/lib/module/organisms/BottomSheet.js +142 -88
- package/lib/module/organisms/BottomSheet.js.map +1 -1
- package/lib/module/organisms/Chart.js +176 -156
- package/lib/module/organisms/Chart.js.map +1 -1
- package/lib/module/organisms/DateField.js +36 -20
- package/lib/module/organisms/DateField.js.map +1 -1
- package/lib/module/organisms/DatePicker.js +56 -33
- package/lib/module/organisms/DatePicker.js.map +1 -1
- package/lib/module/organisms/List.js +62 -34
- package/lib/module/organisms/List.js.map +1 -1
- package/lib/module/organisms/Modal.js +122 -84
- package/lib/module/organisms/Modal.js.map +1 -1
- package/lib/module/organisms/NavigationBar.js +64 -25
- package/lib/module/organisms/NavigationBar.js.map +1 -1
- package/lib/module/organisms/OptionWheel.js +64 -64
- package/lib/module/organisms/OptionWheel.js.map +1 -1
- package/lib/module/organisms/ReorderableList.js +48 -27
- package/lib/module/organisms/ReorderableList.js.map +1 -1
- package/lib/module/organisms/Screen.js +70 -37
- package/lib/module/organisms/Screen.js.map +1 -1
- package/lib/module/organisms/SearchList.js +56 -26
- package/lib/module/organisms/SearchList.js.map +1 -1
- package/lib/module/organisms/Select.js +46 -25
- package/lib/module/organisms/Select.js.map +1 -1
- package/lib/module/organisms/Slides.js +37 -24
- package/lib/module/organisms/Slides.js.map +1 -1
- package/lib/module/organisms/ThemeToggle.js +11 -10
- package/lib/module/organisms/ThemeToggle.js.map +1 -1
- package/lib/module/organisms/Timeline.js +73 -56
- package/lib/module/organisms/Timeline.js.map +1 -1
- package/lib/module/organisms/Toast.js +47 -16
- package/lib/module/organisms/Toast.js.map +1 -1
- package/lib/module/organisms/ToastProvider.js +15 -11
- package/lib/module/organisms/ToastProvider.js.map +1 -1
- package/lib/module/organisms/Wizard.js +41 -16
- package/lib/module/organisms/Wizard.js.map +1 -1
- package/lib/module/organisms/chart/frame.js +25 -25
- package/lib/module/organisms/chart/frame.js.map +1 -1
- package/lib/module/organisms/chart/marks.js +42 -42
- package/lib/module/organisms/chart/math.js +84 -85
- package/lib/module/organisms/chart/math.js.map +1 -1
- package/lib/module/organisms/chart/palette.js +28 -28
- package/lib/module/organisms/imperativeBridge.js +5 -5
- package/lib/module/organisms/imperativeBridge.js.map +1 -1
- package/lib/module/organisms/useSlides.js +53 -21
- package/lib/module/organisms/useSlides.js.map +1 -1
- package/lib/module/safe-area/SafeAreaUIProvider.js +10 -65
- package/lib/module/safe-area/SafeAreaUIProvider.js.map +1 -1
- package/lib/module/safe-area/index.js +1 -0
- package/lib/module/safe-area/index.js.map +1 -1
- package/lib/module/theme/KeyboardAvoidance.js +198 -0
- package/lib/module/theme/KeyboardAvoidance.js.map +1 -0
- package/lib/module/theme/NativeOverlay.js +257 -0
- package/lib/module/theme/NativeOverlay.js.map +1 -0
- package/lib/module/theme/UIProvider.js +88 -35
- package/lib/module/theme/UIProvider.js.map +1 -1
- package/lib/module/theme/colors.js +17 -17
- package/lib/module/theme/colors.js.map +1 -1
- package/lib/module/theme/createStyles.js +20 -16
- package/lib/module/theme/createStyles.js.map +1 -1
- package/lib/module/theme/createTheme.js +6 -6
- package/lib/module/theme/index.js +1 -1
- package/lib/module/theme/index.js.map +1 -1
- package/lib/module/theme/insets.js +1 -1
- package/lib/module/theme/labels.js +29 -1
- package/lib/module/theme/labels.js.map +1 -1
- package/lib/module/theme/palettes.js +25 -23
- package/lib/module/theme/palettes.js.map +1 -1
- package/lib/module/theme/tokens.js +27 -13
- package/lib/module/theme/tokens.js.map +1 -1
- package/lib/module/theme/useKeyboardField.js +33 -0
- package/lib/module/theme/useKeyboardField.js.map +1 -0
- package/lib/module/theme/useReduceMotion.js +28 -0
- package/lib/module/theme/useReduceMotion.js.map +1 -0
- package/lib/typescript/atoms/Avatar.d.ts +35 -5
- package/lib/typescript/atoms/Avatar.d.ts.map +1 -1
- package/lib/typescript/atoms/Badge.d.ts +14 -3
- package/lib/typescript/atoms/Badge.d.ts.map +1 -1
- package/lib/typescript/atoms/Button.d.ts +34 -3
- package/lib/typescript/atoms/Button.d.ts.map +1 -1
- package/lib/typescript/atoms/Card.d.ts +13 -2
- package/lib/typescript/atoms/Card.d.ts.map +1 -1
- package/lib/typescript/atoms/Checkbox.d.ts +26 -1
- package/lib/typescript/atoms/Checkbox.d.ts.map +1 -1
- package/lib/typescript/atoms/Divider.d.ts +18 -1
- package/lib/typescript/atoms/Divider.d.ts.map +1 -1
- package/lib/typescript/atoms/EmptyState.d.ts +30 -3
- package/lib/typescript/atoms/EmptyState.d.ts.map +1 -1
- package/lib/typescript/atoms/Fab.d.ts +24 -4
- package/lib/typescript/atoms/Fab.d.ts.map +1 -1
- package/lib/typescript/atoms/Gradient.d.ts +21 -15
- package/lib/typescript/atoms/Gradient.d.ts.map +1 -1
- package/lib/typescript/atoms/IconButton.d.ts +18 -4
- package/lib/typescript/atoms/IconButton.d.ts.map +1 -1
- package/lib/typescript/atoms/Image.d.ts +39 -17
- package/lib/typescript/atoms/Image.d.ts.map +1 -1
- package/lib/typescript/atoms/Input.d.ts +57 -7
- package/lib/typescript/atoms/Input.d.ts.map +1 -1
- package/lib/typescript/atoms/KeyValueRow.d.ts +16 -4
- package/lib/typescript/atoms/KeyValueRow.d.ts.map +1 -1
- package/lib/typescript/atoms/PressableScale.d.ts +12 -5
- package/lib/typescript/atoms/PressableScale.d.ts.map +1 -1
- package/lib/typescript/atoms/ShinyText.d.ts +17 -17
- package/lib/typescript/atoms/ShinyText.d.ts.map +1 -1
- package/lib/typescript/atoms/Skeleton.d.ts +12 -7
- package/lib/typescript/atoms/Skeleton.d.ts.map +1 -1
- package/lib/typescript/atoms/Spinner.d.ts +29 -1
- package/lib/typescript/atoms/Spinner.d.ts.map +1 -1
- package/lib/typescript/atoms/Text.d.ts +46 -0
- package/lib/typescript/atoms/Text.d.ts.map +1 -1
- package/lib/typescript/atoms/Transition.d.ts +19 -15
- package/lib/typescript/atoms/Transition.d.ts.map +1 -1
- package/lib/typescript/atoms/index.d.ts +3 -3
- package/lib/typescript/atoms/index.d.ts.map +1 -1
- package/lib/typescript/atoms/inputValidation.d.ts +29 -0
- package/lib/typescript/atoms/inputValidation.d.ts.map +1 -0
- package/lib/typescript/icons/Icon.d.ts +4 -4
- package/lib/typescript/icons/defaultIcons.d.ts +19 -2
- package/lib/typescript/icons/defaultIcons.d.ts.map +1 -1
- package/lib/typescript/icons/index.d.ts +2 -2
- package/lib/typescript/icons/index.d.ts.map +1 -1
- package/lib/typescript/icons/types.d.ts +13 -3
- package/lib/typescript/icons/types.d.ts.map +1 -1
- package/lib/typescript/molecules/AvatarHeader.d.ts +23 -4
- package/lib/typescript/molecules/AvatarHeader.d.ts.map +1 -1
- package/lib/typescript/molecules/FormActions.d.ts +21 -4
- package/lib/typescript/molecules/FormActions.d.ts.map +1 -1
- package/lib/typescript/molecules/InfoRow.d.ts +17 -3
- package/lib/typescript/molecules/InfoRow.d.ts.map +1 -1
- package/lib/typescript/molecules/OptionCard.d.ts +20 -5
- package/lib/typescript/molecules/OptionCard.d.ts.map +1 -1
- package/lib/typescript/molecules/SegmentedControl.d.ts +18 -2
- package/lib/typescript/molecules/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/molecules/Stepper.d.ts +23 -7
- package/lib/typescript/molecules/Stepper.d.ts.map +1 -1
- package/lib/typescript/molecules/Steps.d.ts +18 -4
- package/lib/typescript/molecules/Steps.d.ts.map +1 -1
- package/lib/typescript/molecules/SymmetricGrid.d.ts +15 -5
- package/lib/typescript/molecules/SymmetricGrid.d.ts.map +1 -1
- package/lib/typescript/organisms/Alert.d.ts +28 -2
- package/lib/typescript/organisms/Alert.d.ts.map +1 -1
- package/lib/typescript/organisms/AlertProvider.d.ts +10 -10
- package/lib/typescript/organisms/AlertProvider.d.ts.map +1 -1
- package/lib/typescript/organisms/BottomSheet.d.ts +20 -5
- package/lib/typescript/organisms/BottomSheet.d.ts.map +1 -1
- package/lib/typescript/organisms/Chart.d.ts +86 -75
- package/lib/typescript/organisms/Chart.d.ts.map +1 -1
- package/lib/typescript/organisms/DateField.d.ts +17 -3
- package/lib/typescript/organisms/DateField.d.ts.map +1 -1
- package/lib/typescript/organisms/DatePicker.d.ts +7 -11
- package/lib/typescript/organisms/DatePicker.d.ts.map +1 -1
- package/lib/typescript/organisms/List.d.ts +30 -3
- package/lib/typescript/organisms/List.d.ts.map +1 -1
- package/lib/typescript/organisms/Modal.d.ts +30 -3
- package/lib/typescript/organisms/Modal.d.ts.map +1 -1
- package/lib/typescript/organisms/NavigationBar.d.ts +26 -7
- package/lib/typescript/organisms/NavigationBar.d.ts.map +1 -1
- package/lib/typescript/organisms/OptionWheel.d.ts +20 -16
- package/lib/typescript/organisms/OptionWheel.d.ts.map +1 -1
- package/lib/typescript/organisms/ReorderableList.d.ts +20 -11
- package/lib/typescript/organisms/ReorderableList.d.ts.map +1 -1
- package/lib/typescript/organisms/Screen.d.ts +27 -8
- package/lib/typescript/organisms/Screen.d.ts.map +1 -1
- package/lib/typescript/organisms/SearchList.d.ts +46 -3
- package/lib/typescript/organisms/SearchList.d.ts.map +1 -1
- package/lib/typescript/organisms/Select.d.ts +26 -6
- package/lib/typescript/organisms/Select.d.ts.map +1 -1
- package/lib/typescript/organisms/Slides.d.ts +44 -26
- package/lib/typescript/organisms/Slides.d.ts.map +1 -1
- package/lib/typescript/organisms/ThemeToggle.d.ts +6 -2
- package/lib/typescript/organisms/ThemeToggle.d.ts.map +1 -1
- package/lib/typescript/organisms/Timeline.d.ts +26 -9
- package/lib/typescript/organisms/Timeline.d.ts.map +1 -1
- package/lib/typescript/organisms/Toast.d.ts +19 -4
- package/lib/typescript/organisms/Toast.d.ts.map +1 -1
- package/lib/typescript/organisms/ToastProvider.d.ts +8 -8
- package/lib/typescript/organisms/ToastProvider.d.ts.map +1 -1
- package/lib/typescript/organisms/Wizard.d.ts +24 -6
- package/lib/typescript/organisms/Wizard.d.ts.map +1 -1
- package/lib/typescript/organisms/chart/frame.d.ts +21 -21
- package/lib/typescript/organisms/chart/frame.d.ts.map +1 -1
- package/lib/typescript/organisms/chart/marks.d.ts +28 -28
- package/lib/typescript/organisms/chart/marks.d.ts.map +1 -1
- package/lib/typescript/organisms/chart/math.d.ts +69 -70
- package/lib/typescript/organisms/chart/math.d.ts.map +1 -1
- package/lib/typescript/organisms/chart/palette.d.ts +2 -2
- package/lib/typescript/organisms/chart/palette.d.ts.map +1 -1
- package/lib/typescript/organisms/imperativeBridge.d.ts +4 -4
- package/lib/typescript/organisms/useSlides.d.ts +8 -16
- package/lib/typescript/organisms/useSlides.d.ts.map +1 -1
- package/lib/typescript/safe-area/SafeAreaUIProvider.d.ts +9 -7
- package/lib/typescript/safe-area/SafeAreaUIProvider.d.ts.map +1 -1
- package/lib/typescript/safe-area/index.d.ts.map +1 -1
- package/lib/typescript/theme/KeyboardAvoidance.d.ts +62 -0
- package/lib/typescript/theme/KeyboardAvoidance.d.ts.map +1 -0
- package/lib/typescript/theme/NativeOverlay.d.ts +43 -0
- package/lib/typescript/theme/NativeOverlay.d.ts.map +1 -0
- package/lib/typescript/theme/UIProvider.d.ts +38 -20
- package/lib/typescript/theme/UIProvider.d.ts.map +1 -1
- package/lib/typescript/theme/colors.d.ts +13 -13
- package/lib/typescript/theme/colors.d.ts.map +1 -1
- package/lib/typescript/theme/createStyles.d.ts +20 -14
- package/lib/typescript/theme/createStyles.d.ts.map +1 -1
- package/lib/typescript/theme/createTheme.d.ts +5 -5
- package/lib/typescript/theme/index.d.ts +1 -1
- package/lib/typescript/theme/index.d.ts.map +1 -1
- package/lib/typescript/theme/insets.d.ts +1 -1
- package/lib/typescript/theme/insets.d.ts.map +1 -1
- package/lib/typescript/theme/labels.d.ts +57 -2
- package/lib/typescript/theme/labels.d.ts.map +1 -1
- package/lib/typescript/theme/palettes.d.ts +25 -19
- package/lib/typescript/theme/palettes.d.ts.map +1 -1
- package/lib/typescript/theme/tokens.d.ts +15 -8
- package/lib/typescript/theme/tokens.d.ts.map +1 -1
- package/lib/typescript/theme/types.d.ts +7 -7
- package/lib/typescript/theme/types.d.ts.map +1 -1
- package/lib/typescript/theme/useKeyboardField.d.ts +17 -0
- package/lib/typescript/theme/useKeyboardField.d.ts.map +1 -0
- package/lib/typescript/theme/useReduceMotion.d.ts +7 -0
- package/lib/typescript/theme/useReduceMotion.d.ts.map +1 -0
- package/llms.txt +4 -4
- package/package.json +15 -14
- package/registry/alert-provider.json +4 -3
- package/registry/alert.json +3 -2
- package/registry/avatar-header.json +1 -1
- package/registry/avatar.json +3 -2
- package/registry/badge.json +1 -1
- package/registry/bottom-sheet.json +1 -1
- package/registry/button.json +3 -2
- package/registry/card.json +1 -1
- package/registry/chart.json +5 -5
- package/registry/checkbox.json +3 -2
- package/registry/core.json +31 -15
- package/registry/date-field.json +1 -1
- package/registry/date-picker.json +3 -2
- package/registry/divider.json +1 -1
- package/registry/empty-state.json +4 -2
- package/registry/fab.json +3 -2
- package/registry/form-actions.json +3 -2
- package/registry/gradient.json +1 -1
- package/registry/icon-button.json +3 -2
- package/registry/image.json +1 -1
- package/registry/index.json +79 -61
- package/registry/info-row.json +1 -1
- package/registry/input.json +5 -1
- package/registry/key-value-row.json +1 -1
- package/registry/list.json +3 -1
- package/registry/manifest.json +3 -1
- package/registry/modal.json +1 -1
- package/registry/navigation-bar.json +1 -1
- package/registry/option-card.json +3 -2
- package/registry/option-wheel.json +1 -1
- package/registry/pressable-scale.json +3 -2
- package/registry/reorderable-list.json +1 -1
- package/registry/screen.json +1 -1
- package/registry/search-list.json +7 -1
- package/registry/segmented-control.json +1 -1
- package/registry/select.json +1 -1
- package/registry/shiny-text.json +1 -1
- package/registry/skeleton.json +3 -2
- package/registry/slides.json +2 -2
- package/registry/spinner.json +1 -1
- package/registry/stepper.json +1 -1
- package/registry/steps.json +1 -1
- package/registry/symmetric-grid.json +1 -1
- package/registry/theme-toggle.json +1 -1
- package/registry/timeline.json +1 -1
- package/registry/title.json +1 -1
- package/registry/toast-provider.json +2 -2
- package/registry/toast.json +1 -1
- package/registry/transition.json +1 -1
- package/registry/wizard.json +1 -1
- package/src/atoms/Avatar.tsx +117 -26
- package/src/atoms/Badge.tsx +20 -9
- package/src/atoms/Button.tsx +102 -30
- package/src/atoms/Card.tsx +23 -3
- package/src/atoms/Checkbox.tsx +49 -12
- package/src/atoms/Divider.tsx +34 -4
- package/src/atoms/EmptyState.tsx +63 -16
- package/src/atoms/Fab.tsx +56 -9
- package/src/atoms/Gradient.tsx +92 -41
- package/src/atoms/IconButton.tsx +27 -4
- package/src/atoms/Image.tsx +74 -28
- package/src/atoms/Input.tsx +129 -19
- package/src/atoms/KeyValueRow.tsx +72 -28
- package/src/atoms/PressableScale.tsx +31 -7
- package/src/atoms/ShinyText.tsx +31 -31
- package/src/atoms/Skeleton.tsx +37 -17
- package/src/atoms/Spinner.tsx +87 -24
- package/src/atoms/Text.tsx +66 -6
- package/src/atoms/Transition.tsx +40 -44
- package/src/atoms/index.ts +3 -3
- package/src/atoms/inputValidation.ts +59 -0
- package/src/icons/Icon.tsx +4 -4
- package/src/icons/defaultIcons.tsx +445 -22
- package/src/icons/index.ts +2 -2
- package/src/icons/types.ts +26 -4
- package/src/molecules/AvatarHeader.tsx +88 -34
- package/src/molecules/FormActions.tsx +36 -6
- package/src/molecules/InfoRow.tsx +39 -12
- package/src/molecules/OptionCard.tsx +55 -20
- package/src/molecules/SegmentedControl.tsx +135 -15
- package/src/molecules/Stepper.tsx +73 -19
- package/src/molecules/Steps.tsx +121 -39
- package/src/molecules/SymmetricGrid.tsx +28 -12
- package/src/organisms/Alert.tsx +97 -26
- package/src/organisms/AlertProvider.tsx +13 -13
- package/src/organisms/BottomSheet.tsx +115 -43
- package/src/organisms/Chart.tsx +193 -164
- package/src/organisms/DateField.tsx +40 -15
- package/src/organisms/DatePicker.tsx +53 -32
- package/src/organisms/List.tsx +64 -15
- package/src/organisms/Modal.tsx +122 -63
- package/src/organisms/NavigationBar.tsx +73 -23
- package/src/organisms/OptionWheel.tsx +70 -66
- package/src/organisms/ReorderableList.tsx +49 -27
- package/src/organisms/Screen.tsx +79 -42
- package/src/organisms/SearchList.tsx +84 -20
- package/src/organisms/Select.tsx +63 -29
- package/src/organisms/Slides.tsx +63 -44
- package/src/organisms/ThemeToggle.tsx +15 -6
- package/src/organisms/Timeline.tsx +79 -62
- package/src/organisms/Toast.tsx +50 -15
- package/src/organisms/ToastProvider.tsx +17 -13
- package/src/organisms/Wizard.tsx +58 -21
- package/src/organisms/chart/frame.tsx +35 -35
- package/src/organisms/chart/marks.tsx +53 -53
- package/src/organisms/chart/math.ts +93 -94
- package/src/organisms/chart/palette.ts +28 -28
- package/src/organisms/imperativeBridge.ts +5 -5
- package/src/organisms/useSlides.ts +66 -31
- package/src/safe-area/SafeAreaUIProvider.tsx +9 -70
- package/src/safe-area/index.ts +1 -0
- package/src/theme/KeyboardAvoidance.tsx +216 -0
- package/src/theme/NativeOverlay.tsx +269 -0
- package/src/theme/UIProvider.tsx +109 -46
- package/src/theme/colors.ts +21 -21
- package/src/theme/createStyles.ts +23 -19
- package/src/theme/createTheme.ts +6 -6
- package/src/theme/index.ts +1 -1
- package/src/theme/insets.ts +1 -1
- package/src/theme/labels.ts +85 -2
- package/src/theme/palettes.ts +33 -25
- package/src/theme/tokens.ts +27 -13
- package/src/theme/types.ts +7 -7
- package/src/theme/useKeyboardField.ts +33 -0
- package/src/theme/useReduceMotion.ts +27 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import React, { memo, useCallback, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import React, { createContext, memo, useCallback, useContext, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { Pressable, Text, View } from 'react-native';
|
|
5
5
|
import { contrast } from '../theme/colors';
|
|
6
6
|
import { createStyles } from '../theme/createStyles';
|
|
7
7
|
import { useAllowFontScaling, useLabels, useTheme } from '../theme/UIProvider';
|
|
8
|
+
import { useReduceMotion } from '../theme/useReduceMotion';
|
|
8
9
|
import { SegmentedControl } from '../molecules/SegmentedControl';
|
|
9
10
|
import { Bar, Dot, Polyline, Wedge } from './chart/marks';
|
|
10
11
|
import { AxisLabels, CartesianGrid, Legend, RadarGrid, Tooltip } from './chart/frame';
|
|
@@ -12,35 +13,43 @@ import { seriesPalette } from './chart/palette';
|
|
|
12
13
|
import { angleOf, arcAt, arcsFor, clamp, exactTicks, extent, fanStrips, formatNumber, growExtent, linearScale, lttbIndices, niceScale, polar, radarAngles, sampleY, smoothPoints, stackRow, toNumber } from './chart/math';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* A filter in the top bar. Chart doesn't filter anything on its own: it shows
|
|
17
|
+
* the control and reports. Whoever has the data decides what "last 7 days"
|
|
18
|
+
* means, and that can't be guessed from here.
|
|
18
19
|
*/
|
|
19
|
-
|
|
20
|
-
// 'pie' y 'donut' van separados aunque compartan todo: con un solo miembro
|
|
21
|
-
// cuyo `type` fuera `'pie' | 'donut'`, TypeScript no saca ese miembro de la
|
|
22
|
-
// unión al descartarlo, y el resto del componente deja de estrecharse.
|
|
23
20
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
21
|
+
/** Background the marks paint "holes" with (donut center, point rings). */
|
|
22
|
+
const ChartSurfaceContext = /*#__PURE__*/createContext(undefined);
|
|
23
|
+
function useChartSurface() {
|
|
24
|
+
const theme = useTheme();
|
|
25
|
+
return useContext(ChartSurfaceContext) ?? theme.colors.surfaceRaised;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 'pie' and 'donut' are kept separate even though they share everything: with
|
|
29
|
+
// a single member whose `type` were `'pie' | 'donut'`, TypeScript doesn't drop
|
|
30
|
+
// that member from the union when ruling it out, and the rest of the component
|
|
31
|
+
// stops narrowing.
|
|
32
|
+
|
|
24
33
|
const DEFAULT_HEIGHT = 220;
|
|
25
34
|
const DEFAULT_TICKS = 4;
|
|
26
|
-
/**
|
|
35
|
+
/** Floor of the value-label gutter, on the left. */
|
|
27
36
|
const VALUE_GUTTER = 38;
|
|
28
37
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
38
|
+
* Estimated width of a label character. React Native doesn't measure text
|
|
39
|
+
* without rendering it, and measuring to decide the layout would make the
|
|
40
|
+
* chart show up shifted for a frame; at `fontSize.xs` a digit is around
|
|
41
|
+
* 0.6em, and too much is better than too little — extra room, no clipped number.
|
|
33
42
|
*/
|
|
34
43
|
const VALUE_CHAR = 6.5;
|
|
35
|
-
/**
|
|
44
|
+
/** Gutter cap: a wide axis can't eat the plot. */
|
|
36
45
|
const VALUE_GUTTER_MAX = 0.3;
|
|
37
|
-
/**
|
|
46
|
+
/** Category gutter when they go on the left (horizontal bars). */
|
|
38
47
|
const CATEGORY_GUTTER = 64;
|
|
39
|
-
/**
|
|
48
|
+
/** Gutter for the bottom labels. */
|
|
40
49
|
const BOTTOM_GUTTER = 16;
|
|
41
|
-
/**
|
|
50
|
+
/** Fraction of the band width taken by the bars; the rest is room. */
|
|
42
51
|
const BAND_FILL = 0.7;
|
|
43
|
-
/**
|
|
52
|
+
/** Room around the radar so the axis labels fit. */
|
|
44
53
|
const RADAR_INSET = 26;
|
|
45
54
|
const DIM_OPACITY = 0.3;
|
|
46
55
|
const useStyles = createStyles(theme => ({
|
|
@@ -82,7 +91,7 @@ const useStyles = createStyles(theme => ({
|
|
|
82
91
|
}
|
|
83
92
|
}));
|
|
84
93
|
|
|
85
|
-
/**
|
|
94
|
+
/** Controlled or own state, with the same contract in both cases. */
|
|
86
95
|
function useControlled(controlled, fallback) {
|
|
87
96
|
const [own, setOwn] = useState(fallback);
|
|
88
97
|
const isControlled = controlled !== undefined;
|
|
@@ -90,10 +99,10 @@ function useControlled(controlled, fallback) {
|
|
|
90
99
|
}
|
|
91
100
|
|
|
92
101
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
102
|
+
* Resolves the value axis domain from what the consumer asked for. In
|
|
103
|
+
* 'sticky' the reference lives in a ref: what matters isn't this render's
|
|
104
|
+
* domain but the widest one seen so far, and keeping it in state would fire
|
|
105
|
+
* an extra render for every tick that widens the axis.
|
|
97
106
|
*/
|
|
98
107
|
function useDomain(measured, domain) {
|
|
99
108
|
const widest = useRef(null);
|
|
@@ -107,19 +116,20 @@ function useDomain(measured, domain) {
|
|
|
107
116
|
|
|
108
117
|
/**
|
|
109
118
|
* Chart
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
119
|
+
* Bars (vertical, horizontal, grouped, stacked), line, area, pie, donut and
|
|
120
|
+
* radar in a single component, because what changes between them is the mark
|
|
121
|
+
* being drawn and not the rest: data, scale, axes, legend, tooltip, selection
|
|
122
|
+
* and filters are the same six mechanisms in all of them.
|
|
114
123
|
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
124
|
+
* It is drawn with `View`: React Native ships no vector canvas and the library
|
|
125
|
+
* can't add one. The three primitives are in `chart/marks.tsx` and the whole
|
|
126
|
+
* geometry, without React, in `chart/math.ts`.
|
|
118
127
|
*
|
|
119
|
-
* Gestalt:
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
128
|
+
* Gestalt: common fate — when you tap a category, everything that isn't it
|
|
129
|
+
* drops to {@link DIM_OPACITY} at once, so what is highlighted reads as a group
|
|
130
|
+
* and not as a loose mark. The legend uses similarity: the same color as the
|
|
131
|
+
* series, which is why it can turn it off without having to explain what it
|
|
132
|
+
* turns off.
|
|
123
133
|
*/
|
|
124
134
|
export function Chart(props) {
|
|
125
135
|
const {
|
|
@@ -138,10 +148,11 @@ export function Chart(props) {
|
|
|
138
148
|
onSelect,
|
|
139
149
|
tooltip = true,
|
|
140
150
|
formatValue = formatNumber,
|
|
141
|
-
animate = true,
|
|
151
|
+
animate: animateProp = true,
|
|
142
152
|
duration,
|
|
143
153
|
emptyText,
|
|
144
154
|
accessibilityLabel,
|
|
155
|
+
surfaceColor,
|
|
145
156
|
style,
|
|
146
157
|
testID
|
|
147
158
|
} = props;
|
|
@@ -149,6 +160,9 @@ export function Chart(props) {
|
|
|
149
160
|
const styles = useStyles();
|
|
150
161
|
const allowFontScaling = useAllowFontScaling();
|
|
151
162
|
const uiLabels = useLabels();
|
|
163
|
+
// Reduce Motion: the marks appear in their final shape instead of growing.
|
|
164
|
+
const reduceMotion = useReduceMotion();
|
|
165
|
+
const animate = animateProp && !reduceMotion;
|
|
152
166
|
const [width, setWidth] = useState(0);
|
|
153
167
|
const [hidden, setHidden, hiddenIsControlled] = useControlled(hiddenKeys, defaultHiddenKeys ?? []);
|
|
154
168
|
const [pick, setPick, selectionIsControlled] = useControlled(selected, null);
|
|
@@ -157,15 +171,15 @@ export function Chart(props) {
|
|
|
157
171
|
const decimate = polyline ? props.decimate : false;
|
|
158
172
|
|
|
159
173
|
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
174
|
+
* What gets drawn: the window of `data`, and from that the points that fit.
|
|
175
|
+
* Decimation runs over the whole row, chosen with the first visible series:
|
|
176
|
+
* the series share the x axis, so keeping different indexes per series would
|
|
177
|
+
* break the alignment, the touch layer and the tooltip.
|
|
164
178
|
*/
|
|
165
179
|
const rows = useMemo(() => {
|
|
166
180
|
const windowed = windowSize && windowSize > 0 ? data.slice(-windowSize) : data;
|
|
167
181
|
if (!polyline || decimate === false || width === 0) return windowed;
|
|
168
|
-
//
|
|
182
|
+
// One point every two pixels: more can't be seen but still has to be paid for.
|
|
169
183
|
const target = typeof decimate === 'number' ? decimate : Math.floor(width / 2);
|
|
170
184
|
if (windowed.length <= target) return windowed;
|
|
171
185
|
const lead = series.find(item => !hidden.includes(item.key))?.key ?? series[0]?.key;
|
|
@@ -176,10 +190,10 @@ export function Chart(props) {
|
|
|
176
190
|
const ids = useMemo(() => rows.map((row, index) => selectBy ? selectBy(row, index) : String(index)), [rows, selectBy]);
|
|
177
191
|
|
|
178
192
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
193
|
+
* The selection is stored by `id` and resolved against the current rows:
|
|
194
|
+
* if the datum shifted, the highlight follows it; if it left the window, it
|
|
195
|
+
* disappears. Blindly reusing the index would point at the datum that ended
|
|
196
|
+
* up in that spot, which isn't the one anyone picked.
|
|
183
197
|
*/
|
|
184
198
|
const selection = useMemo(() => {
|
|
185
199
|
if (!pick) return null;
|
|
@@ -195,8 +209,8 @@ export function Chart(props) {
|
|
|
195
209
|
};
|
|
196
210
|
}, [pick, ids, rows, labels]);
|
|
197
211
|
|
|
198
|
-
//
|
|
199
|
-
//
|
|
212
|
+
// In a pie the categories are the rows; in the rest, the columns. The
|
|
213
|
+
// color, the legend and what a tap on it turns off depend on that.
|
|
200
214
|
const palette = seriesPalette(theme, Math.max(1, isPie ? rows.length : series.length));
|
|
201
215
|
const entries = useMemo(() => isPie ? labels.map((label, index) => ({
|
|
202
216
|
key: label,
|
|
@@ -216,9 +230,9 @@ export function Chart(props) {
|
|
|
216
230
|
}, [hidden, hiddenIsControlled, setHidden, onHiddenKeysChange]);
|
|
217
231
|
|
|
218
232
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
233
|
+
* The plots report what was tapped —row and series— and the whole selection
|
|
234
|
+
* is built here: it is the only place that knows `selectBy`, the labels and
|
|
235
|
+
* the actual rows, so the three don't repeat the building.
|
|
222
236
|
*/
|
|
223
237
|
const applySelection = useCallback(hit => {
|
|
224
238
|
const row = hit ? rows[hit.index] : undefined;
|
|
@@ -230,9 +244,9 @@ export function Chart(props) {
|
|
|
230
244
|
seriesKey: hit.seriesKey,
|
|
231
245
|
value: toNumber(row[hit.seriesKey]) ?? 0
|
|
232
246
|
} : null;
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
//
|
|
247
|
+
// Tapping what is already selected releases it: without that there would
|
|
248
|
+
// be no way back to the whole chart without tapping outside, and
|
|
249
|
+
// "outside" doesn't always exist on a scrolling screen.
|
|
236
250
|
const same = next && selection && next.id === selection.id && next.seriesKey === selection.seriesKey;
|
|
237
251
|
const value = same ? null : next;
|
|
238
252
|
if (!selectionIsControlled) setPick(value);
|
|
@@ -257,77 +271,80 @@ export function Chart(props) {
|
|
|
257
271
|
tooltip,
|
|
258
272
|
testID
|
|
259
273
|
};
|
|
260
|
-
return /*#__PURE__*/
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
children: filters.
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
274
|
+
return /*#__PURE__*/_jsx(ChartSurfaceContext.Provider, {
|
|
275
|
+
value: surfaceColor ?? theme.colors.surfaceRaised,
|
|
276
|
+
children: /*#__PURE__*/_jsxs(View, {
|
|
277
|
+
style: [styles.root, style],
|
|
278
|
+
testID: testID,
|
|
279
|
+
accessible: false,
|
|
280
|
+
children: [filters && filters.length > 0 ? /*#__PURE__*/_jsx(View, {
|
|
281
|
+
style: styles.filters,
|
|
282
|
+
children: filters.map(filter => /*#__PURE__*/_jsx(SegmentedControl, {
|
|
283
|
+
options: filter.options,
|
|
284
|
+
value: filter.value,
|
|
285
|
+
onChange: filter.onChange,
|
|
286
|
+
testID: testID && `${testID}-filter-${filter.key}`
|
|
287
|
+
}, filter.key))
|
|
288
|
+
}) : null, /*#__PURE__*/_jsxs(View, {
|
|
289
|
+
style: [styles.plot, {
|
|
290
|
+
height
|
|
291
|
+
}],
|
|
292
|
+
onLayout: onLayout,
|
|
293
|
+
accessible: true,
|
|
294
|
+
accessibilityRole: "image",
|
|
295
|
+
accessibilityLabel: accessibilityLabel,
|
|
296
|
+
testID: testID && `${testID}-plot`,
|
|
297
|
+
children: [width === 0 || empty ? null : props.type === 'pie' || props.type === 'donut' ? /*#__PURE__*/_jsx(PiePlot, {
|
|
298
|
+
...shared,
|
|
299
|
+
donut: props.type === 'donut',
|
|
300
|
+
innerRadius: props.innerRadius,
|
|
301
|
+
sliceLabels: props.sliceLabels ?? 'percent',
|
|
302
|
+
valueKey: series[0]?.key ?? ''
|
|
303
|
+
}) : props.type === 'radar' ? /*#__PURE__*/_jsx(RadarPlot, {
|
|
304
|
+
...shared,
|
|
305
|
+
domain: props.domain,
|
|
306
|
+
levels: props.levels ?? 4,
|
|
307
|
+
fill: props.fill ?? true,
|
|
308
|
+
thickness: props.thickness ?? 2,
|
|
309
|
+
dots: props.dots ?? true
|
|
310
|
+
}) : /*#__PURE__*/_jsx(CartesianPlot, {
|
|
311
|
+
...shared,
|
|
312
|
+
type: props.type,
|
|
313
|
+
orientation: props.type === 'bar' ? props.orientation ?? 'vertical' : 'vertical',
|
|
314
|
+
stacked: props.type === 'bar' || props.type === 'area' ? props.stacked ?? false : false,
|
|
315
|
+
barRadius: props.type === 'bar' ? props.barRadius ?? theme.tokens.radius.xs : 0,
|
|
316
|
+
smooth: props.type !== 'bar' ? props.smooth ?? false : false,
|
|
317
|
+
thickness: props.type !== 'bar' ? props.thickness ?? 2 : 0,
|
|
318
|
+
dots: props.type === 'line' ? props.dots ?? true : props.type === 'area' ? props.dots ?? false : false,
|
|
319
|
+
fillOpacity: props.type === 'area' ? props.fillOpacity ?? 0.22 : 0,
|
|
320
|
+
domain: props.domain,
|
|
321
|
+
grid: props.grid ?? true,
|
|
322
|
+
ticks: props.ticks ?? DEFAULT_TICKS,
|
|
323
|
+
xAxis: props.xAxis ?? true,
|
|
324
|
+
yAxis: props.yAxis ?? true
|
|
325
|
+
}), empty ? /*#__PURE__*/_jsx(View, {
|
|
326
|
+
style: styles.empty,
|
|
327
|
+
testID: testID && `${testID}-empty`,
|
|
328
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
329
|
+
allowFontScaling: allowFontScaling,
|
|
330
|
+
style: styles.emptyText,
|
|
331
|
+
children: emptyText ?? uiLabels.noResultsTitle
|
|
332
|
+
})
|
|
333
|
+
}) : null]
|
|
334
|
+
}), showLegend ? /*#__PURE__*/_jsx(Legend, {
|
|
335
|
+
items: entries,
|
|
336
|
+
hidden: hidden,
|
|
337
|
+
onToggle: toggleable ? applyHidden : undefined,
|
|
338
|
+
testID: testID && `${testID}-legend`
|
|
317
339
|
}) : null]
|
|
318
|
-
})
|
|
319
|
-
items: entries,
|
|
320
|
-
hidden: hidden,
|
|
321
|
-
onToggle: toggleable ? applyHidden : undefined,
|
|
322
|
-
testID: testID && `${testID}-legend`
|
|
323
|
-
}) : null]
|
|
340
|
+
})
|
|
324
341
|
});
|
|
325
342
|
}
|
|
326
343
|
Chart.displayName = 'Chart';
|
|
327
344
|
|
|
328
|
-
// ──
|
|
345
|
+
// ── what the three plots share ─────────────────────────────────────────────
|
|
329
346
|
|
|
330
|
-
/**
|
|
347
|
+
/** Tooltip rows for a category on the x axis. */
|
|
331
348
|
function tooltipRowsAt(rows, index, visible, format) {
|
|
332
349
|
const row = rows[index];
|
|
333
350
|
if (!row) return [];
|
|
@@ -342,12 +359,12 @@ function tooltipRowsAt(rows, index, visible, format) {
|
|
|
342
359
|
}).filter(item => item !== null);
|
|
343
360
|
}
|
|
344
361
|
|
|
345
|
-
// ──
|
|
362
|
+
// ── bars, line and area ────────────────────────────────────────────────────
|
|
346
363
|
|
|
347
|
-
/**
|
|
364
|
+
/** Width of one strip of the area fill, in pixels. Thinner = more views. */
|
|
348
365
|
const STRIP_WIDTH = 4;
|
|
349
366
|
const MAX_STRIPS = 140;
|
|
350
|
-
/**
|
|
367
|
+
/** Room between two bars of the same group. */
|
|
351
368
|
const GROUP_GAP = 2;
|
|
352
369
|
const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
353
370
|
const {
|
|
@@ -378,27 +395,28 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
378
395
|
yAxis
|
|
379
396
|
} = props;
|
|
380
397
|
const theme = useTheme();
|
|
398
|
+
const surface = useChartSurface();
|
|
381
399
|
const horizontal = type === 'bar' && orientation === 'horizontal';
|
|
382
400
|
const keys = useMemo(() => visible.map(entry => entry.key), [visible]);
|
|
383
401
|
const bottomGutter = xAxis ? BOTTOM_GUTTER : 0;
|
|
384
402
|
|
|
385
|
-
//
|
|
386
|
-
//
|
|
403
|
+
// The line may not touch zero (a temperature, a ranking); a bar does have
|
|
404
|
+
// to, because its length is what states the value.
|
|
387
405
|
const measured = useMemo(() => extent(rows, keys, {
|
|
388
406
|
stacked,
|
|
389
407
|
includeZero: type !== 'line'
|
|
390
408
|
}), [rows, keys, stacked, type]);
|
|
391
409
|
const [low, high] = useDomain(measured, domain);
|
|
392
410
|
|
|
393
|
-
//
|
|
394
|
-
//
|
|
411
|
+
// A hand-set domain is respected as is; a measured one (or 'sticky') is
|
|
412
|
+
// rounded, which is what makes the axis legible.
|
|
395
413
|
const nice = useMemo(() => Array.isArray(domain) ? exactTicks(low, high, tickCount) : niceScale(low, high, tickCount), [domain, low, high, tickCount]);
|
|
396
414
|
|
|
397
415
|
/**
|
|
398
|
-
*
|
|
399
|
-
* `formatValue`
|
|
400
|
-
*
|
|
401
|
-
*
|
|
416
|
+
* The gutter comes from the longest label, not from a constant: with a
|
|
417
|
+
* custom `formatValue` ("$3000", "1.250 ms") a fixed width clips the number
|
|
418
|
+
* and the axis ends up saying "$30…". The ticks don't depend on the plot's
|
|
419
|
+
* width, so they can be measured before splitting it up.
|
|
402
420
|
*/
|
|
403
421
|
const leftGutter = useMemo(() => {
|
|
404
422
|
if (!yAxis) return 0;
|
|
@@ -419,7 +437,7 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
419
437
|
const baseline = scale.toPixel(clamp(0, scale.nice.min, scale.nice.max));
|
|
420
438
|
const stacks = useMemo(() => stacked ? rows.map(row => stackRow(row, keys)) : null, [stacked, rows, keys]);
|
|
421
439
|
|
|
422
|
-
/**
|
|
440
|
+
/** A series' points: `to` is the value, `from` the floor it is filled from. */
|
|
423
441
|
const pointsFor = useCallback((key, edge) => {
|
|
424
442
|
const out = [];
|
|
425
443
|
rows.forEach((row, index) => {
|
|
@@ -442,8 +460,8 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
442
460
|
return out;
|
|
443
461
|
}, [rows, stacks, centerOf, scale, baseline]);
|
|
444
462
|
const pickAt = useCallback((index, event) => {
|
|
445
|
-
//
|
|
446
|
-
//
|
|
463
|
+
// Which series the finger landed on: the one whose mark is closest to
|
|
464
|
+
// the touch on the value axis. With a single series it is always that one.
|
|
447
465
|
const touch = (horizontal ? event?.nativeEvent?.locationX : event?.nativeEvent?.locationY) ?? 0;
|
|
448
466
|
let bestKey = keys[0] ?? '';
|
|
449
467
|
let bestDistance = Infinity;
|
|
@@ -551,10 +569,10 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
551
569
|
},
|
|
552
570
|
children: [type === 'area' ?
|
|
553
571
|
/*#__PURE__*/
|
|
554
|
-
//
|
|
555
|
-
//
|
|
556
|
-
//
|
|
557
|
-
//
|
|
572
|
+
// Opacity goes on the group, not on each strip: the half
|
|
573
|
+
// pixel of overlap that hides the antialias seam is
|
|
574
|
+
// composited twice and leaves a vertical stripe every four
|
|
575
|
+
// pixels. Dimming the whole group, it is painted only once.
|
|
558
576
|
_jsx(View, {
|
|
559
577
|
pointerEvents: "none",
|
|
560
578
|
style: {
|
|
@@ -591,7 +609,7 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
591
609
|
}), dots ? raw.map((point, index) => /*#__PURE__*/_jsx(Dot, {
|
|
592
610
|
point: point,
|
|
593
611
|
color: entry.color,
|
|
594
|
-
ringColor:
|
|
612
|
+
ringColor: surface,
|
|
595
613
|
size: selection?.index === index ? 8 : 6,
|
|
596
614
|
testID: testID && `${testID}-dot-${entry.key}-${index}`
|
|
597
615
|
}, index)) : null]
|
|
@@ -671,15 +689,15 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
671
689
|
});
|
|
672
690
|
CartesianPlot.displayName = 'CartesianPlot';
|
|
673
691
|
|
|
674
|
-
// ──
|
|
692
|
+
// ── pie and donut ──────────────────────────────────────────────────────────
|
|
675
693
|
|
|
676
694
|
const DONUT_RADIUS = 0.6;
|
|
677
|
-
/**
|
|
695
|
+
/** How far the selected slice pops out, in pixels. */
|
|
678
696
|
const EXPLODE = 8;
|
|
679
|
-
/**
|
|
697
|
+
/** Where the label falls, as a fraction between the hole and the edge. */
|
|
680
698
|
const LABEL_AT = 0.62;
|
|
681
699
|
|
|
682
|
-
/**
|
|
700
|
+
/** White or black, whichever reads over the color. An odd color doesn't break: it falls back to `text`. */
|
|
683
701
|
function inkOn(background, theme) {
|
|
684
702
|
try {
|
|
685
703
|
return contrast(background, theme.colors.white) >= contrast(background, theme.colors.black) ? theme.colors.white : theme.colors.black;
|
|
@@ -706,6 +724,7 @@ const PiePlot = /*#__PURE__*/memo(props => {
|
|
|
706
724
|
valueKey
|
|
707
725
|
} = props;
|
|
708
726
|
const theme = useTheme();
|
|
727
|
+
const surface = useChartSurface();
|
|
709
728
|
const styles = useStyles();
|
|
710
729
|
const allowFontScaling = useAllowFontScaling();
|
|
711
730
|
const center = {
|
|
@@ -715,8 +734,8 @@ const PiePlot = /*#__PURE__*/memo(props => {
|
|
|
715
734
|
const radius = Math.max(0, Math.min(width, height) / 2 - 2);
|
|
716
735
|
const hole = clamp(innerRadius ?? (donut ? DONUT_RADIUS : 0), 0, 0.9) * radius;
|
|
717
736
|
const arcs = useMemo(() => {
|
|
718
|
-
//
|
|
719
|
-
// 100%,
|
|
737
|
+
// A turned-off category is worth 0: it leaves the pie and the rest share
|
|
738
|
+
// the 100%, which is what whoever turned it off from the legend expects.
|
|
720
739
|
const values = rows.map((row, index) => visible.some(entry => entry.key === labels[index]) ? toNumber(row[valueKey]) ?? 0 : 0);
|
|
721
740
|
return arcsFor(values);
|
|
722
741
|
}, [rows, labels, visible, valueKey]);
|
|
@@ -726,8 +745,8 @@ const PiePlot = /*#__PURE__*/memo(props => {
|
|
|
726
745
|
y: event?.nativeEvent?.locationY ?? 0
|
|
727
746
|
};
|
|
728
747
|
const distance = Math.hypot(point.x - center.x, point.y - center.y);
|
|
729
|
-
//
|
|
730
|
-
//
|
|
748
|
+
// A donut's hole isn't part of any slice, and neither is the area
|
|
749
|
+
// outside the circle: both release the selection.
|
|
731
750
|
if (distance > radius || distance < hole) return onPick(null);
|
|
732
751
|
const index = arcAt(arcs, angleOf(center, point));
|
|
733
752
|
if (index === -1) return onPick(null);
|
|
@@ -759,11 +778,11 @@ const PiePlot = /*#__PURE__*/memo(props => {
|
|
|
759
778
|
width: hole * 2,
|
|
760
779
|
height: hole * 2,
|
|
761
780
|
borderRadius: hole,
|
|
762
|
-
backgroundColor:
|
|
781
|
+
backgroundColor: surface
|
|
763
782
|
}
|
|
764
783
|
}) : null, sliceLabels === 'none' ? null : arcs.map(arc => {
|
|
765
|
-
//
|
|
766
|
-
//
|
|
784
|
+
// A very thin slice has nowhere to write: the label would spill
|
|
785
|
+
// over its neighbors and none would be readable.
|
|
767
786
|
if (arc.sweep < 18) return null;
|
|
768
787
|
const at = polar(center, hole + (radius - hole) * LABEL_AT, arc.start + arc.sweep / 2);
|
|
769
788
|
const color = entries[arc.index]?.color ?? theme.colors.primary;
|
|
@@ -808,7 +827,7 @@ PiePlot.displayName = 'PiePlot';
|
|
|
808
827
|
|
|
809
828
|
// ── radar ──────────────────────────────────────────────────────────────────
|
|
810
829
|
|
|
811
|
-
/**
|
|
830
|
+
/** Strips per side of the polygon when it is filled. More = cleaner edge, more views. */
|
|
812
831
|
const RADAR_STEPS = 5;
|
|
813
832
|
const RADAR_FILL_OPACITY = 0.18;
|
|
814
833
|
const RADAR_LABEL_WIDTH = 56;
|
|
@@ -831,6 +850,7 @@ const RadarPlot = /*#__PURE__*/memo(props => {
|
|
|
831
850
|
dots
|
|
832
851
|
} = props;
|
|
833
852
|
const theme = useTheme();
|
|
853
|
+
const surface = useChartSurface();
|
|
834
854
|
const styles = useStyles();
|
|
835
855
|
const allowFontScaling = useAllowFontScaling();
|
|
836
856
|
const center = {
|
|
@@ -841,8 +861,8 @@ const RadarPlot = /*#__PURE__*/memo(props => {
|
|
|
841
861
|
const angles = useMemo(() => radarAngles(rows.length), [rows.length]);
|
|
842
862
|
const keys = useMemo(() => visible.map(entry => entry.key), [visible]);
|
|
843
863
|
|
|
844
|
-
//
|
|
845
|
-
//
|
|
864
|
+
// The radar measures from the center, and the center is 0: a minimum other
|
|
865
|
+
// than zero would make two similar values look miles apart.
|
|
846
866
|
const measured = useMemo(() => [0, extent(rows, keys, {
|
|
847
867
|
includeZero: true
|
|
848
868
|
})[1]], [rows, keys]);
|
|
@@ -887,11 +907,11 @@ const RadarPlot = /*#__PURE__*/memo(props => {
|
|
|
887
907
|
},
|
|
888
908
|
children: [fill ?
|
|
889
909
|
/*#__PURE__*/
|
|
890
|
-
//
|
|
891
|
-
//
|
|
892
|
-
//
|
|
893
|
-
//
|
|
894
|
-
//
|
|
910
|
+
// Opacity goes on the group, not on each strip. Per strip, the
|
|
911
|
+
// 0.4° overlap that hides the antialias seam is composited
|
|
912
|
+
// twice and leaves a darker radius at each cut: the fill ends
|
|
913
|
+
// up looking like a spider web. Applied to the group, the strips
|
|
914
|
+
// paint opaque against each other and the whole is dimmed once.
|
|
895
915
|
_jsx(View, {
|
|
896
916
|
pointerEvents: "none",
|
|
897
917
|
style: {
|
|
@@ -919,7 +939,7 @@ const RadarPlot = /*#__PURE__*/memo(props => {
|
|
|
919
939
|
}), dots ? points.map((point, index) => /*#__PURE__*/_jsx(Dot, {
|
|
920
940
|
point: point,
|
|
921
941
|
color: entry.color,
|
|
922
|
-
ringColor:
|
|
942
|
+
ringColor: surface,
|
|
923
943
|
size: selection?.index === index ? 8 : 6
|
|
924
944
|
}, index)) : null]
|
|
925
945
|
}, entry.key);
|