From c54e398eb1e1251a6c25cae53cd5592d3f72f414 Mon Sep 17 00:00:00 2001 From: TreetopFlyer Date: Tue, 26 Apr 2022 13:49:43 -0400 Subject: [PATCH] react + styled-components --- app.js | 145 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 80 insertions(+), 65 deletions(-) diff --git a/app.js b/app.js index 5d3cd36..f5fb873 100644 --- a/app.js +++ b/app.js @@ -2,50 +2,76 @@ /// import 'https://js.boxcast.com/v3.min.js'; -import { h, html, render } from "https://esm.sh/htm/preact"; -import { useReducer, useState, useEffect, useLayoutEffect, useMemo, useRef } from 'https://esm.sh/preact/hooks'; +import { html } from "https://esm.sh/htm/react"; +import styled, { css, keyframes } from 'https://esm.sh/styled-components'; +import { createElement as h, useState, useEffect, useRef } from 'https://esm.sh/react'; +import { createRoot } from "https://esm.sh/react-dom/client"; + import State01 from "./testdata-01.json" assert { type: "json" }; import State02 from "./testdata-02.json" assert { type: "json" }; import State03 from "./testdata-03.json" assert { type: "json" }; const Styles = { - Broadcast: - { - position: "relative", - display: "flex", - padding: "5px 0 5px 0", - }, - Time: - { - width: "75px", - marginRight: "5px", - fontSize: "16px", - textAlign: "right", - }, - Partition: - { - margin: "10px 0 0 0", - }, - Pointer: - { - width: "75px", - }, - Alert: - { - position: "fixed", - right: "20px", - bottom: "20px", - width: "300px", - height: "200px", - background: "#333", - borderRadius: "5px", - transition: "all 0.4s", - color: "#fff", - textAlign: "center", - } + }; -const PlayerID = "boxcast-player" + +const StyledRoot = styled.div` +.Partition +{ + margin: 10px 0 0 0; +} +.Broadcast +{ + position: relative; + display: flex; + padding: 5px 0 5px 0; + .Time + { + width: 75px; + margin-right: 5px; + font-size: 16px; + text-align: right; + } + .Pointer + { + width: 75px; + } +} +.Alert +{ + position: fixed; + right: 20px; + bottom: -300px; + width: 300px; + height: 200px; + background: #333; + border-radius: 5px; + transition: bottom 0.4s; + color: #fff; + text-align: center; + + &.Show + { + bottom: 20px; + } + + .Close + { + display: inline-block; + position: absolute; + padding: 5px 10px 5px 10px; + border-radius: 20px; + top: -15px; + right: 10px; + background: #000000; + cursor: pointer; + color: #fff; + } +} +`; + +const PlayerID = "boxcast-player"; /** @type {(props:{channel:string, interval:number})=>any} */ const App = props => @@ -144,7 +170,7 @@ const App = props => , [SelectedGet]) return html` -
+ <${StyledRoot}>
@@ -165,13 +191,13 @@ const App = props => )) }
- ${ AlertGet ? h(BroadcastAlert, - { - broadcast: LeadingGet, - clickWatch: ()=>{ SelectedSet(LeadingGet); AlertSet(false); }, - clickDismiss: ()=>{ AlertSet(false) } - }) : null } -
+
+ { AlertSet(false); }}>Dismiss ✕ +

A new session is starting:

+

${LeadingGet?.name}

+ +
+ `; } @@ -191,7 +217,7 @@ const BroadcastItem = ({item, previous, priority, selected, select}) => let partition; if(!previous || (previous.start.Date !== item.start.Date)) { - partition = html`

${item.start.Day}, ${item.start.Month} ${item.start.Date}

` + partition = html`

${item.start.Day}, ${item.start.Month} ${item.start.Date}

` } let buttonText; @@ -214,27 +240,16 @@ const BroadcastItem = ({item, previous, priority, selected, select}) => return html` ${ partition } -
-
${ pointerText }
-
${item.start.Hours}:${item.start.Minutes} ${item.start.M}
- ${item.name} - +
+
${ pointerText }
+
${item.start.Hours}:${item.start.Minutes} ${item.start.M}
+
${item.name} +
+ +
`; }; -/** @type { (props:{broadcast:Boxcast.Broadcast, clickWatch:()=>void, clickDismiss:()=>void})=>any } */ -const BroadcastAlert = ({broadcast, clickWatch, clickDismiss}) => -{ - return html` -
- X -

A new session is starting:

-

${broadcast.name}

- -
- `; -} - /** @type {(inDate:string)=>Boxcast.Date} */ const DateParse = (inDateString) => { @@ -259,4 +274,4 @@ const DateParse = (inDateString) => }; /** @type {(inChannel:string, inSelector:string)=>void} */ -export default (inChannel, inSelector) => render(h(App, {channel:inChannel, interval:50000}), document.querySelector(inSelector)); \ No newline at end of file +export default (inChannel, inSelector) => createRoot(document.querySelector(inSelector)).render(h(App, {channel:inChannel, interval:50000})); \ No newline at end of file