import { JSX, onMount, VoidComponent } from 'solid-js'; import { timeline } from '@motionone/dom'; import { Line } from './types'; // Thanks to https://dev.to/ycmjason/how-to-create-range-in-javascript-539i export function* range(start: number, end: number): Generator { for (let i = start; i <= end; i++) { yield i; } } const validTransportModes = ["bus", "tram", "metro", "rer", "transilien", "funicular", "ter", "unknown"]; export const TransportModeWeights: Record = { bus: 1, tram: 2, val: 3, funicular: 4, metro: 5, rer: 6, transilien: 7, ter: 8, }; export function getTransportModeSrc(mode: string, color: boolean = true): string | undefined { let ret = undefined; if (validTransportModes.includes(mode)) { return `/carrramba-encore-rate/public/symbole_${mode}_${color ? "" : "support_fonce_"}RVB.svg`; } return ret; } export function renderLineTransportMode(line: Line): JSX.Element { return } function renderBusLinePicto(line: Line): JSX.Element { return (
{line.shortName}
); } function renderTramLinePicto(line: Line): JSX.Element { const lineStyle = { fill: `#${line.backColorHexa}` }; return (
{line.shortName}
); } function renderMetroLinePicto(line: Line): JSX.Element { return (
{line.shortName}
); } function renderTrainLinePicto(line: Line): JSX.Element { return (
{line.shortName}
); } export function renderLinePicto(line: Line): JSX.Element { switch (line.transportMode) { case "bus": case "funicular": return renderBusLinePicto(line); case "tram": return renderTramLinePicto(line); /* case "val": */ case "metro": return renderMetroLinePicto(line); case "transilien": case "rer": case "ter": return renderTrainLinePicto(line); } } export type PositionedPanel = { position: number; // TODO: Should be PassagesPanelComponent ? panel: JSX.Element; }; export const ScrollingText: VoidComponent<{ height: number, width: number, content: string }> = (props) => { let viewBoxRef: SVGSVGElement | undefined = undefined; let textRef: SVGTextElement | undefined = undefined; onMount(() => { if (viewBoxRef !== undefined && textRef !== undefined) { const overlap = textRef.getComputedTextLength() - viewBoxRef.viewBox.baseVal.width; if (overlap > 0) { timeline( [ [textRef, { x: [-overlap] }, { duration: 5 }], [textRef, { x: [0] }, { duration: 2 }], ], { repeat: Infinity }, ); } } }); return ( {props.content} ); }