diff --git a/app.js b/app.js index 2bc4d29..3b9a4a8 100644 --- a/app.js +++ b/app.js @@ -6,179 +6,201 @@ import { html } from "https://esm.sh/htm/react"; import styled from 'https://esm.sh/styled-components?deps=react@18'; import { createElement as h, useState, useEffect, useRef } from 'https://esm.sh/react@18'; 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 StyledRoot = styled.div` .Boxcast-Upper { background: white; box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.1); -} -.Boxcast-Player -{ - .boxcast-well-container - { - display: none; - } - .boxcast-well - { - display:flex; - justify-content: center; - align-items: center; - gap: 10px 10px; - min-height: 10px; - margin: 0; - & > span, .boxcast-linkback + .Boxcast-Player + { + .boxcast-well-container { - display:none; + display: none; } - - & > * + .boxcast-well { + display:flex; + justify-content: center; + align-items: center; + gap: 10px 10px; + min-height: 10px; margin: 0; + + & > span, .boxcast-linkback + { + display:none; + } + + & > * + { + margin: 0; + } } } + .Boxcast-Active + { + text-align: center; + padding:20px; + background: white; + & > * { margin: 0; } + } } -.Boxcast-Active -{ - text-align: center; - padding:20px; - background: white; - & > * { margin: 0; } -} + .Boxcast-Playlist { max-width: 550px; margin: 30px auto; -} -.Partition -{ - margin: 15px 0 0 0; - padding: 0 0 8px 0; - border-bottom: 1px solid #dddddd; - text-align: center; -} -.Broadcast -{ - position: relative; - display: flex; - padding: 5px 0 5px 0; - & > * + .Partition { - box-sizing: border-box; - padding: 5px; + margin: 15px 0 0 0; + padding: 0 0 8px 0; + border-bottom: 1px solid #dddddd; + text-align: center; } - - .Pointer + .Broadcast { - width: 75px; - text-align: right; - .Badge - { - display: inline-block; - border-radius: 20px; - padding: 2px 8px; - font-size: 12px; - font-weight: 900; - font-family: sans-serif; - letter-spacing: 0.1em; - text-transform: uppercase; - text-align: center; + position: relative; + display: flex; + padding: 5px 0 5px 0; - &.Next + & > * + { + box-sizing: border-box; + padding: 5px; + } + + .Pointer + { + width: 75px; + text-align: right; + .Badge { - background: yellow; - color: black; - } - &.Soon - { - background: orange; - color: white; - } - &.Live - { - background: limegreen; - color: white; + display: inline-block; + border-radius: 20px; + padding: 2px 8px; + font-size: 12px; + font-weight: 900; + font-family: sans-serif; + letter-spacing: 0.1em; + text-transform: uppercase; + text-align: center; + + &.Next + { + background: yellow; + color: black; + } + &.Soon + { + background: orange; + color: white; + } + &.Live + { + background: red; + color: white; + } } } - } - .Time - { - width: 80px; - font-size: 16px; - text-align: right; - } - .Title - { - flex: 1; - font-weight: 900; - } - .Control - { - width: 80px; - - } - - button - { - appearance: none; - display: inline-block; - padding: 5px 10px 5px 10px; - background: black; - cursor: pointer; - border: none; - color: white; - font-size: 10px; - font-weight: 900; - transition: all 0.4s; - } - button[disabled] - { - background: red !important; - border-radius: 20px; - } - button:hover - { - border-radius: 20px; - } - &.future button - { - background: #aaa; - } - - @media(max-width:500px) - { - flex-wrap: wrap; .Time { - order: 0; - width: 30%; + width: 80px; + font-size: 16px; + text-align: right; } .Title { - order: 1; - flex: none; - width: 60%; - } - .Pointer - { - order: 2; - width: 30%; + flex: 1; + font-weight: 900; } .Control { - order: 3; - width: 60%; + width: 100px; + + } + + button + { + position: relative; + appearance: none; + display: block; + width: 100%; + padding: 5px 10px 5px 10px; + background: black; + cursor: pointer; + border: none; + color: white; + font-size: 14px; + font-weight: 600; + transition: all 0.4s; + + &::before + { + content: " "; + display: block; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + border: 0px solid transparent; + outline: 0px solid red; + transition: all 0.4s; + } + } + button[disabled]::before + { + top: -5px; + left: -5px; + border: 5px solid transparent; + outline: 5px solid red; + } + button:hover::before + { + outline: 5px solid red; + } + &.future button + { + background: #aaa; + } + + @media(max-width:500px) + { + flex-wrap: wrap; + .Time + { + order: 0; + width: 30%; + } + .Title + { + order: 1; + flex: none; + width: 60%; + } + .Pointer + { + order: 2; + width: 30%; + } + .Control + { + order: 3; + width: 60%; + } } } } -.Alert + +.Boxcast-Alert { position: fixed; right: 20px; @@ -319,23 +341,29 @@ const App = props => }; Player.current.loadChannel(props.channel, settings); - - document.documentElement.style.scrollBehavior = "smooth"; - window.location = (`#${PlayerID}`); } , [SelectedGet]); + + /** @type {(inItem:Boxcast.Broadcast)=>void} */ + const SelectionTransition = (inItem) => + { + SelectedSet(inItem.id); + document.documentElement.style.scrollBehavior = "smooth"; + window.location = "#"+PlayerID; + }; + return html` <${StyledRoot}>
${LeadingGet?.name}
- +