aboutsummaryrefslogtreecommitdiff
path: root/components/selection.tsx
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2021-06-13 12:15:07 +0200
committerlonkaars <loek@pipeframe.xyz>2021-06-13 12:15:07 +0200
commiteee30e2556e555affbd0f3034b4b2089352cea7c (patch)
tree66283b3ac9ffe25d668d6fcbb606183568bb2509 /components/selection.tsx
parent4efcd3068a574b3f1aee5b39d883f999d142e482 (diff)
added selection component
Diffstat (limited to 'components/selection.tsx')
-rw-r--r--components/selection.tsx89
1 files changed, 89 insertions, 0 deletions
diff --git a/components/selection.tsx b/components/selection.tsx
new file mode 100644
index 0000000..4a0812f
--- /dev/null
+++ b/components/selection.tsx
@@ -0,0 +1,89 @@
+import { CSSProperties } from 'react';
+import { slideTypes } from '../timeline';
+
+type cornerTypes = 'round' | 'diamond' | 'square' | 'square-s';
+var slideTypeToCornerType = {
+ default: 'diamond',
+ loop: 'square',
+ speedChange: 'square',
+ delay: 'round',
+};
+
+function Corner(props: {
+ type: cornerTypes;
+ direction: 'tl' | 'tr' | 'bl' | 'br';
+}) {
+ var className = 'corner posabs ' + props.direction + ' ';
+
+ if (props.direction[0] == 't') className += 't0 ';
+ if (props.direction[0] == 'b') className += 'b0 ';
+ if (props.direction[1] == 'l') className += 'l0 ';
+ if (props.direction[1] == 'r') className += 'r0 ';
+
+ var style: CSSProperties = { transform: '' };
+ if (props.direction[0] == 'b') style.transform += 'scaleY(-1) ';
+ if (props.direction[1] == 'l') style.transform += 'scaleX(-1) ';
+
+ if (props.type == 'square-s') {
+ className += 'small ';
+ return <svg
+ className={className}
+ style={style}
+ width='6'
+ height='6'
+ viewBox='0 0 6 6'
+ fill='none'
+ xmlns='http://www.w3.org/2000/svg'
+ >
+ <path d='M0 0V2C2.20914 2 4 3.79083 4 6H6C6 2.68628 3.31371 0 0 0Z' />
+ </svg>;
+ }
+
+ return <svg
+ className={className}
+ style={style}
+ width='12'
+ height='12'
+ viewBox='0 0 12 12'
+ fill='none'
+ xmlns='http://www.w3.org/2000/svg'
+ >
+ {{
+ 'round': <path
+ d='M0 0V2C0.185921 2 0.370657 2.00507 0.554077 2.01509C1.22229 2.05158 1.87304 2.15368 2.5 2.31505C5.5312 3.09523 8.00618 5.26093 9.20959 8.09678C9.65396 9.14397 9.92495 10.2825 9.98653 11.4765C9.99547 11.6498 10 11.8244 10 12H12C12 11.8325 11.9966 11.6658 11.9898 11.5C11.929 10.0177 11.5994 8.60473 11.0483 7.3086C9.57234 3.83704 6.50794 1.20364 2.76743 0.320679C1.9651 0.131286 1.13166 0.0224302 0.276113 0.00311406C0.184326 0.00104172 0.0922847 0 0 0Z'
+ />,
+ 'diamond': <path
+ d='M4.5858 1.75739L10.2427 7.41424C11.3679 8.53946 12 10.0656 12 11.6569L12 12L10 12L10 11.6569C10 10.596 9.57858 9.57859 8.82845 8.82844L3.1716 3.17159C2.42145 2.42147 1.40403 1.99999 0.343174 2.00001L0 1.99999L2.15792e-05 1.07896e-05L0.343141 0C1.93447 1.07896e-05 3.46059 0.632151 4.5858 1.75739Z'
+ />,
+ 'square': <path
+ d='M6 0H0.5H0V2H0.5H6C8.20914 2 10 3.79083 10 6V11.5V12H12V11.5V6C12 2.68628 9.31371 0 6 0Z'
+ />,
+ }[props.type]}
+ </svg>;
+}
+
+export default function Selection(props: {
+ width: number;
+ height: number;
+ left?: slideTypes;
+ right?: slideTypes;
+}) {
+ var small = props.width < 24 || props.height < 24;
+ return <div
+ className='selection'
+ style={{
+ width: props.width,
+ height: props.height,
+ '--corner-size': small ? '6px' : '12px',
+ } as CSSProperties}
+ >
+ <div className='posabs dispinbl t0 bar top' />
+ <div className='posabs dispinbl r0 bar right' />
+ <div className='posabs dispinbl b0 bar bottom' />
+ <div className='posabs dispinbl l0 bar left' />
+ <Corner type={small ? 'square-s' : slideTypeToCornerType[props.right] as cornerTypes} direction='tr' />
+ <Corner type={small ? 'square-s' : slideTypeToCornerType[props.right] as cornerTypes} direction='br' />
+ <Corner type={small ? 'square-s' : slideTypeToCornerType[props.left] as cornerTypes} direction='tl' />
+ <Corner type={small ? 'square-s' : slideTypeToCornerType[props.left] as cornerTypes} direction='bl' />
+ </div>;
+}