From 7b7d4862cf75ab954a3692b9bbc8a908f642e1c4 Mon Sep 17 00:00:00 2001 From: oyar Date: Mon, 17 Oct 2022 07:39:57 +0100 Subject: [PATCH] feat: add Svg component (#1091) --- .storybook/stories/Svg.stories.tsx | 99 ++++++++++++++++++++++++++++++ README.md | 13 ++++ src/core/Svg.tsx | 81 ++++++++++++++++++++++++ src/core/index.ts | 1 + 4 files changed, 194 insertions(+) create mode 100644 .storybook/stories/Svg.stories.tsx create mode 100644 src/core/Svg.tsx diff --git a/.storybook/stories/Svg.stories.tsx b/.storybook/stories/Svg.stories.tsx new file mode 100644 index 000000000..540e83384 --- /dev/null +++ b/.storybook/stories/Svg.stories.tsx @@ -0,0 +1,99 @@ +import { useEffect } from '@storybook/addons' +import { useArgs } from '@storybook/client-api' +import { ComponentMeta } from '@storybook/react' +import * as React from 'react' +import { ComponentProps, FC, Suspense } from 'react' +import { MathUtils, NoToneMapping, Vector3 } from 'three' +import { Svg, SvgProps } from '../../src' +import { Setup } from '../Setup' + +const svgRecord = { + Tiger: 'models/svg/tiger.svg', + 'Three.js': 'models/svg/threejs.svg', + 'Joins and caps': 'models/svg/lineJoinsAndCaps.svg', + Hexagon: 'models/svg/hexagon.svg', + Energy: 'models/svg/energy.svg', + 'Test 1': 'models/svg/tests/1.svg', + 'Test 2': 'models/svg/tests/2.svg', + 'Test 3': 'models/svg/tests/3.svg', + 'Test 4': 'models/svg/tests/4.svg', + 'Test 5': 'models/svg/tests/5.svg', + 'Test 6': 'models/svg/tests/6.svg', + 'Test 7': 'models/svg/tests/7.svg', + 'Test 8': 'models/svg/tests/8.svg', + 'Test 9': 'models/svg/tests/9.svg', + Units: 'models/svg/tests/units.svg', + Ordering: 'models/svg/tests/ordering.svg', + Defs: 'models/svg/tests/testDefs/Svg-defs.svg', + Defs2: 'models/svg/tests/testDefs/Svg-defs2.svg', + Defs3: 'models/svg/tests/testDefs/Wave-defs.svg', + Defs4: 'models/svg/tests/testDefs/defs4.svg', + Defs5: 'models/svg/tests/testDefs/defs5.svg', + 'Style CSS inside defs': 'models/svg/style-css-inside-defs.svg', + 'Multiple CSS classes': 'models/svg/multiple-css-classes.svg', + 'Zero Radius': 'models/svg/zero-radius.svg', + 'Styles in svg tag': 'models/svg/tests/styles.svg', + 'Round join': 'models/svg/tests/roundJoinPrecisionIssue.svg', +} + +const url = 'https://threejs.org/examples' + +interface SvgStoryProps extends SvgProps { + svg: string + fillWireframe: boolean + strokesWireframe: boolean +} + +const args: SvgStoryProps = { + src: `${url}/${svgRecord.Tiger}`, + svg: svgRecord.Tiger, + skipFill: false, + skipStrokes: false, + fillWireframe: false, + strokesWireframe: false, +} + +export default { + title: 'Abstractions/Svg', + component: Svg, + decorators: [ + (storyFn) => ( + st.gl.setClearColor('#ccc')} + cameraPosition={new Vector3(0, 0, 200)} + lights={false} + > + {storyFn()} + + ), + ], + args, + argTypes: { + svg: { + options: svgRecord, + control: { + type: 'select', + }, + }, + }, +} + +export const SvgSt: FC = ({ svg, fillWireframe, strokesWireframe, ...props }) => { + const [_, updateArgs] = useArgs() + useEffect(() => { + updateArgs({ src: `${url}/${svg || svgRecord.Tiger}` }) + }, [svg]) + return ( + + + + + ) +} diff --git a/README.md b/README.md index eea7d4a30..81b79e089 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ The `native` route of the library **does not** export `Html` or `Loader`. The de
  • useAnimations
  • MarchingCubes
  • Decal
  • +
  • Svg
  • Shaders