orn-ui 0.2.9 → 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 +67 -52
- package/README.md +5 -9
- 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 +197 -156
- 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 +199 -158
- 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 +223 -165
- 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,26 +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
|
+
/**
|
|
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.
|
|
42
|
+
*/
|
|
43
|
+
const VALUE_CHAR = 6.5;
|
|
44
|
+
/** Gutter cap: a wide axis can't eat the plot. */
|
|
45
|
+
const VALUE_GUTTER_MAX = 0.3;
|
|
46
|
+
/** Category gutter when they go on the left (horizontal bars). */
|
|
29
47
|
const CATEGORY_GUTTER = 64;
|
|
30
|
-
/**
|
|
48
|
+
/** Gutter for the bottom labels. */
|
|
31
49
|
const BOTTOM_GUTTER = 16;
|
|
32
|
-
/**
|
|
50
|
+
/** Fraction of the band width taken by the bars; the rest is room. */
|
|
33
51
|
const BAND_FILL = 0.7;
|
|
34
|
-
/**
|
|
52
|
+
/** Room around the radar so the axis labels fit. */
|
|
35
53
|
const RADAR_INSET = 26;
|
|
36
54
|
const DIM_OPACITY = 0.3;
|
|
37
55
|
const useStyles = createStyles(theme => ({
|
|
@@ -73,7 +91,7 @@ const useStyles = createStyles(theme => ({
|
|
|
73
91
|
}
|
|
74
92
|
}));
|
|
75
93
|
|
|
76
|
-
/**
|
|
94
|
+
/** Controlled or own state, with the same contract in both cases. */
|
|
77
95
|
function useControlled(controlled, fallback) {
|
|
78
96
|
const [own, setOwn] = useState(fallback);
|
|
79
97
|
const isControlled = controlled !== undefined;
|
|
@@ -81,10 +99,10 @@ function useControlled(controlled, fallback) {
|
|
|
81
99
|
}
|
|
82
100
|
|
|
83
101
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
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.
|
|
88
106
|
*/
|
|
89
107
|
function useDomain(measured, domain) {
|
|
90
108
|
const widest = useRef(null);
|
|
@@ -98,19 +116,20 @@ function useDomain(measured, domain) {
|
|
|
98
116
|
|
|
99
117
|
/**
|
|
100
118
|
* Chart
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
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.
|
|
105
123
|
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
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`.
|
|
109
127
|
*
|
|
110
|
-
* Gestalt:
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
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.
|
|
114
133
|
*/
|
|
115
134
|
export function Chart(props) {
|
|
116
135
|
const {
|
|
@@ -129,10 +148,11 @@ export function Chart(props) {
|
|
|
129
148
|
onSelect,
|
|
130
149
|
tooltip = true,
|
|
131
150
|
formatValue = formatNumber,
|
|
132
|
-
animate = true,
|
|
151
|
+
animate: animateProp = true,
|
|
133
152
|
duration,
|
|
134
153
|
emptyText,
|
|
135
154
|
accessibilityLabel,
|
|
155
|
+
surfaceColor,
|
|
136
156
|
style,
|
|
137
157
|
testID
|
|
138
158
|
} = props;
|
|
@@ -140,6 +160,9 @@ export function Chart(props) {
|
|
|
140
160
|
const styles = useStyles();
|
|
141
161
|
const allowFontScaling = useAllowFontScaling();
|
|
142
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;
|
|
143
166
|
const [width, setWidth] = useState(0);
|
|
144
167
|
const [hidden, setHidden, hiddenIsControlled] = useControlled(hiddenKeys, defaultHiddenKeys ?? []);
|
|
145
168
|
const [pick, setPick, selectionIsControlled] = useControlled(selected, null);
|
|
@@ -148,15 +171,15 @@ export function Chart(props) {
|
|
|
148
171
|
const decimate = polyline ? props.decimate : false;
|
|
149
172
|
|
|
150
173
|
/**
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
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.
|
|
155
178
|
*/
|
|
156
179
|
const rows = useMemo(() => {
|
|
157
180
|
const windowed = windowSize && windowSize > 0 ? data.slice(-windowSize) : data;
|
|
158
181
|
if (!polyline || decimate === false || width === 0) return windowed;
|
|
159
|
-
//
|
|
182
|
+
// One point every two pixels: more can't be seen but still has to be paid for.
|
|
160
183
|
const target = typeof decimate === 'number' ? decimate : Math.floor(width / 2);
|
|
161
184
|
if (windowed.length <= target) return windowed;
|
|
162
185
|
const lead = series.find(item => !hidden.includes(item.key))?.key ?? series[0]?.key;
|
|
@@ -167,10 +190,10 @@ export function Chart(props) {
|
|
|
167
190
|
const ids = useMemo(() => rows.map((row, index) => selectBy ? selectBy(row, index) : String(index)), [rows, selectBy]);
|
|
168
191
|
|
|
169
192
|
/**
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
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.
|
|
174
197
|
*/
|
|
175
198
|
const selection = useMemo(() => {
|
|
176
199
|
if (!pick) return null;
|
|
@@ -186,8 +209,8 @@ export function Chart(props) {
|
|
|
186
209
|
};
|
|
187
210
|
}, [pick, ids, rows, labels]);
|
|
188
211
|
|
|
189
|
-
//
|
|
190
|
-
//
|
|
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.
|
|
191
214
|
const palette = seriesPalette(theme, Math.max(1, isPie ? rows.length : series.length));
|
|
192
215
|
const entries = useMemo(() => isPie ? labels.map((label, index) => ({
|
|
193
216
|
key: label,
|
|
@@ -207,9 +230,9 @@ export function Chart(props) {
|
|
|
207
230
|
}, [hidden, hiddenIsControlled, setHidden, onHiddenKeysChange]);
|
|
208
231
|
|
|
209
232
|
/**
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
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.
|
|
213
236
|
*/
|
|
214
237
|
const applySelection = useCallback(hit => {
|
|
215
238
|
const row = hit ? rows[hit.index] : undefined;
|
|
@@ -221,9 +244,9 @@ export function Chart(props) {
|
|
|
221
244
|
seriesKey: hit.seriesKey,
|
|
222
245
|
value: toNumber(row[hit.seriesKey]) ?? 0
|
|
223
246
|
} : null;
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
//
|
|
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.
|
|
227
250
|
const same = next && selection && next.id === selection.id && next.seriesKey === selection.seriesKey;
|
|
228
251
|
const value = same ? null : next;
|
|
229
252
|
if (!selectionIsControlled) setPick(value);
|
|
@@ -248,77 +271,80 @@ export function Chart(props) {
|
|
|
248
271
|
tooltip,
|
|
249
272
|
testID
|
|
250
273
|
};
|
|
251
|
-
return /*#__PURE__*/
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
children: filters.
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
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`
|
|
308
339
|
}) : null]
|
|
309
|
-
})
|
|
310
|
-
items: entries,
|
|
311
|
-
hidden: hidden,
|
|
312
|
-
onToggle: toggleable ? applyHidden : undefined,
|
|
313
|
-
testID: testID && `${testID}-legend`
|
|
314
|
-
}) : null]
|
|
340
|
+
})
|
|
315
341
|
});
|
|
316
342
|
}
|
|
317
343
|
Chart.displayName = 'Chart';
|
|
318
344
|
|
|
319
|
-
// ──
|
|
345
|
+
// ── what the three plots share ─────────────────────────────────────────────
|
|
320
346
|
|
|
321
|
-
/**
|
|
347
|
+
/** Tooltip rows for a category on the x axis. */
|
|
322
348
|
function tooltipRowsAt(rows, index, visible, format) {
|
|
323
349
|
const row = rows[index];
|
|
324
350
|
if (!row) return [];
|
|
@@ -333,12 +359,12 @@ function tooltipRowsAt(rows, index, visible, format) {
|
|
|
333
359
|
}).filter(item => item !== null);
|
|
334
360
|
}
|
|
335
361
|
|
|
336
|
-
// ──
|
|
362
|
+
// ── bars, line and area ────────────────────────────────────────────────────
|
|
337
363
|
|
|
338
|
-
/**
|
|
364
|
+
/** Width of one strip of the area fill, in pixels. Thinner = more views. */
|
|
339
365
|
const STRIP_WIDTH = 4;
|
|
340
366
|
const MAX_STRIPS = 140;
|
|
341
|
-
/**
|
|
367
|
+
/** Room between two bars of the same group. */
|
|
342
368
|
const GROUP_GAP = 2;
|
|
343
369
|
const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
344
370
|
const {
|
|
@@ -369,36 +395,49 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
369
395
|
yAxis
|
|
370
396
|
} = props;
|
|
371
397
|
const theme = useTheme();
|
|
398
|
+
const surface = useChartSurface();
|
|
372
399
|
const horizontal = type === 'bar' && orientation === 'horizontal';
|
|
373
400
|
const keys = useMemo(() => visible.map(entry => entry.key), [visible]);
|
|
374
|
-
const leftGutter = yAxis ? horizontal ? CATEGORY_GUTTER : VALUE_GUTTER : 0;
|
|
375
401
|
const bottomGutter = xAxis ? BOTTOM_GUTTER : 0;
|
|
376
|
-
const plotW = Math.max(1, width - leftGutter);
|
|
377
|
-
const plotH = Math.max(1, height - bottomGutter);
|
|
378
402
|
|
|
379
|
-
//
|
|
380
|
-
//
|
|
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.
|
|
381
405
|
const measured = useMemo(() => extent(rows, keys, {
|
|
382
406
|
stacked,
|
|
383
407
|
includeZero: type !== 'line'
|
|
384
408
|
}), [rows, keys, stacked, type]);
|
|
385
409
|
const [low, high] = useDomain(measured, domain);
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
410
|
+
|
|
411
|
+
// A hand-set domain is respected as is; a measured one (or 'sticky') is
|
|
412
|
+
// rounded, which is what makes the axis legible.
|
|
413
|
+
const nice = useMemo(() => Array.isArray(domain) ? exactTicks(low, high, tickCount) : niceScale(low, high, tickCount), [domain, low, high, tickCount]);
|
|
414
|
+
|
|
415
|
+
/**
|
|
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.
|
|
420
|
+
*/
|
|
421
|
+
const leftGutter = useMemo(() => {
|
|
422
|
+
if (!yAxis) return 0;
|
|
423
|
+
if (horizontal) return CATEGORY_GUTTER;
|
|
424
|
+
const longest = nice.values.reduce((widest, value) => Math.max(widest, formatValue(value).length), 0);
|
|
425
|
+
const wanted = Math.ceil(longest * VALUE_CHAR) + theme.tokens.spacing.sm;
|
|
426
|
+
return Math.max(VALUE_GUTTER, Math.min(wanted, Math.floor(width * VALUE_GUTTER_MAX)));
|
|
427
|
+
}, [yAxis, horizontal, nice, formatValue, width, theme.tokens.spacing.sm]);
|
|
428
|
+
const plotW = Math.max(1, width - leftGutter);
|
|
429
|
+
const plotH = Math.max(1, height - bottomGutter);
|
|
430
|
+
const toPixel = useMemo(() => horizontal ? linearScale([nice.min, nice.max], [0, plotW]) : linearScale([nice.min, nice.max], [plotH, 0]), [horizontal, nice, plotW, plotH]);
|
|
431
|
+
const scale = useMemo(() => ({
|
|
432
|
+
nice,
|
|
433
|
+
toPixel
|
|
434
|
+
}), [nice, toPixel]);
|
|
396
435
|
const band = (horizontal ? plotH : plotW) / Math.max(1, rows.length);
|
|
397
436
|
const centerOf = useCallback(index => (index + 0.5) * band, [band]);
|
|
398
437
|
const baseline = scale.toPixel(clamp(0, scale.nice.min, scale.nice.max));
|
|
399
438
|
const stacks = useMemo(() => stacked ? rows.map(row => stackRow(row, keys)) : null, [stacked, rows, keys]);
|
|
400
439
|
|
|
401
|
-
/**
|
|
440
|
+
/** A series' points: `to` is the value, `from` the floor it is filled from. */
|
|
402
441
|
const pointsFor = useCallback((key, edge) => {
|
|
403
442
|
const out = [];
|
|
404
443
|
rows.forEach((row, index) => {
|
|
@@ -421,8 +460,8 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
421
460
|
return out;
|
|
422
461
|
}, [rows, stacks, centerOf, scale, baseline]);
|
|
423
462
|
const pickAt = useCallback((index, event) => {
|
|
424
|
-
//
|
|
425
|
-
//
|
|
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.
|
|
426
465
|
const touch = (horizontal ? event?.nativeEvent?.locationX : event?.nativeEvent?.locationY) ?? 0;
|
|
427
466
|
let bestKey = keys[0] ?? '';
|
|
428
467
|
let bestDistance = Infinity;
|
|
@@ -530,10 +569,10 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
530
569
|
},
|
|
531
570
|
children: [type === 'area' ?
|
|
532
571
|
/*#__PURE__*/
|
|
533
|
-
//
|
|
534
|
-
//
|
|
535
|
-
//
|
|
536
|
-
//
|
|
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.
|
|
537
576
|
_jsx(View, {
|
|
538
577
|
pointerEvents: "none",
|
|
539
578
|
style: {
|
|
@@ -570,7 +609,7 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
570
609
|
}), dots ? raw.map((point, index) => /*#__PURE__*/_jsx(Dot, {
|
|
571
610
|
point: point,
|
|
572
611
|
color: entry.color,
|
|
573
|
-
ringColor:
|
|
612
|
+
ringColor: surface,
|
|
574
613
|
size: selection?.index === index ? 8 : 6,
|
|
575
614
|
testID: testID && `${testID}-dot-${entry.key}-${index}`
|
|
576
615
|
}, index)) : null]
|
|
@@ -650,15 +689,15 @@ const CartesianPlot = /*#__PURE__*/memo(props => {
|
|
|
650
689
|
});
|
|
651
690
|
CartesianPlot.displayName = 'CartesianPlot';
|
|
652
691
|
|
|
653
|
-
// ──
|
|
692
|
+
// ── pie and donut ──────────────────────────────────────────────────────────
|
|
654
693
|
|
|
655
694
|
const DONUT_RADIUS = 0.6;
|
|
656
|
-
/**
|
|
695
|
+
/** How far the selected slice pops out, in pixels. */
|
|
657
696
|
const EXPLODE = 8;
|
|
658
|
-
/**
|
|
697
|
+
/** Where the label falls, as a fraction between the hole and the edge. */
|
|
659
698
|
const LABEL_AT = 0.62;
|
|
660
699
|
|
|
661
|
-
/**
|
|
700
|
+
/** White or black, whichever reads over the color. An odd color doesn't break: it falls back to `text`. */
|
|
662
701
|
function inkOn(background, theme) {
|
|
663
702
|
try {
|
|
664
703
|
return contrast(background, theme.colors.white) >= contrast(background, theme.colors.black) ? theme.colors.white : theme.colors.black;
|
|
@@ -685,6 +724,7 @@ const PiePlot = /*#__PURE__*/memo(props => {
|
|
|
685
724
|
valueKey
|
|
686
725
|
} = props;
|
|
687
726
|
const theme = useTheme();
|
|
727
|
+
const surface = useChartSurface();
|
|
688
728
|
const styles = useStyles();
|
|
689
729
|
const allowFontScaling = useAllowFontScaling();
|
|
690
730
|
const center = {
|
|
@@ -694,8 +734,8 @@ const PiePlot = /*#__PURE__*/memo(props => {
|
|
|
694
734
|
const radius = Math.max(0, Math.min(width, height) / 2 - 2);
|
|
695
735
|
const hole = clamp(innerRadius ?? (donut ? DONUT_RADIUS : 0), 0, 0.9) * radius;
|
|
696
736
|
const arcs = useMemo(() => {
|
|
697
|
-
//
|
|
698
|
-
// 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.
|
|
699
739
|
const values = rows.map((row, index) => visible.some(entry => entry.key === labels[index]) ? toNumber(row[valueKey]) ?? 0 : 0);
|
|
700
740
|
return arcsFor(values);
|
|
701
741
|
}, [rows, labels, visible, valueKey]);
|
|
@@ -705,8 +745,8 @@ const PiePlot = /*#__PURE__*/memo(props => {
|
|
|
705
745
|
y: event?.nativeEvent?.locationY ?? 0
|
|
706
746
|
};
|
|
707
747
|
const distance = Math.hypot(point.x - center.x, point.y - center.y);
|
|
708
|
-
//
|
|
709
|
-
//
|
|
748
|
+
// A donut's hole isn't part of any slice, and neither is the area
|
|
749
|
+
// outside the circle: both release the selection.
|
|
710
750
|
if (distance > radius || distance < hole) return onPick(null);
|
|
711
751
|
const index = arcAt(arcs, angleOf(center, point));
|
|
712
752
|
if (index === -1) return onPick(null);
|
|
@@ -738,11 +778,11 @@ const PiePlot = /*#__PURE__*/memo(props => {
|
|
|
738
778
|
width: hole * 2,
|
|
739
779
|
height: hole * 2,
|
|
740
780
|
borderRadius: hole,
|
|
741
|
-
backgroundColor:
|
|
781
|
+
backgroundColor: surface
|
|
742
782
|
}
|
|
743
783
|
}) : null, sliceLabels === 'none' ? null : arcs.map(arc => {
|
|
744
|
-
//
|
|
745
|
-
//
|
|
784
|
+
// A very thin slice has nowhere to write: the label would spill
|
|
785
|
+
// over its neighbors and none would be readable.
|
|
746
786
|
if (arc.sweep < 18) return null;
|
|
747
787
|
const at = polar(center, hole + (radius - hole) * LABEL_AT, arc.start + arc.sweep / 2);
|
|
748
788
|
const color = entries[arc.index]?.color ?? theme.colors.primary;
|
|
@@ -787,7 +827,7 @@ PiePlot.displayName = 'PiePlot';
|
|
|
787
827
|
|
|
788
828
|
// ── radar ──────────────────────────────────────────────────────────────────
|
|
789
829
|
|
|
790
|
-
/**
|
|
830
|
+
/** Strips per side of the polygon when it is filled. More = cleaner edge, more views. */
|
|
791
831
|
const RADAR_STEPS = 5;
|
|
792
832
|
const RADAR_FILL_OPACITY = 0.18;
|
|
793
833
|
const RADAR_LABEL_WIDTH = 56;
|
|
@@ -810,6 +850,7 @@ const RadarPlot = /*#__PURE__*/memo(props => {
|
|
|
810
850
|
dots
|
|
811
851
|
} = props;
|
|
812
852
|
const theme = useTheme();
|
|
853
|
+
const surface = useChartSurface();
|
|
813
854
|
const styles = useStyles();
|
|
814
855
|
const allowFontScaling = useAllowFontScaling();
|
|
815
856
|
const center = {
|
|
@@ -820,8 +861,8 @@ const RadarPlot = /*#__PURE__*/memo(props => {
|
|
|
820
861
|
const angles = useMemo(() => radarAngles(rows.length), [rows.length]);
|
|
821
862
|
const keys = useMemo(() => visible.map(entry => entry.key), [visible]);
|
|
822
863
|
|
|
823
|
-
//
|
|
824
|
-
//
|
|
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.
|
|
825
866
|
const measured = useMemo(() => [0, extent(rows, keys, {
|
|
826
867
|
includeZero: true
|
|
827
868
|
})[1]], [rows, keys]);
|
|
@@ -866,11 +907,11 @@ const RadarPlot = /*#__PURE__*/memo(props => {
|
|
|
866
907
|
},
|
|
867
908
|
children: [fill ?
|
|
868
909
|
/*#__PURE__*/
|
|
869
|
-
//
|
|
870
|
-
//
|
|
871
|
-
//
|
|
872
|
-
//
|
|
873
|
-
//
|
|
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.
|
|
874
915
|
_jsx(View, {
|
|
875
916
|
pointerEvents: "none",
|
|
876
917
|
style: {
|
|
@@ -898,7 +939,7 @@ const RadarPlot = /*#__PURE__*/memo(props => {
|
|
|
898
939
|
}), dots ? points.map((point, index) => /*#__PURE__*/_jsx(Dot, {
|
|
899
940
|
point: point,
|
|
900
941
|
color: entry.color,
|
|
901
|
-
ringColor:
|
|
942
|
+
ringColor: surface,
|
|
902
943
|
size: selection?.index === index ? 8 : 6
|
|
903
944
|
}, index)) : null]
|
|
904
945
|
}, entry.key);
|