Skip to content
This repository has been archived by the owner on Mar 8, 2024. It is now read-only.

Commit

Permalink
feat: Removed CSX and simplified styles. Allow className everywhere.
Browse files Browse the repository at this point in the history
  • Loading branch information
ShogunPanda committed Jun 15, 2020
1 parent f58a764 commit 1c5fee3
Show file tree
Hide file tree
Showing 38 changed files with 1,235 additions and 1,173 deletions.
79 changes: 44 additions & 35 deletions lib/components/browse-happy.js
Original file line number Diff line number Diff line change
@@ -1,58 +1,67 @@
import { percent, rem } from 'csx';
import React from 'react';
import { style } from 'typestyle';
import { classes, style } from 'typestyle';
import { colorAmber200, colorAmber500, colorRed700, colorWhite } from '../styling/colors';
import { debugClassName } from '../styling/mixins';
import { createMemoizedComponent } from '../utils/dom-utils';
export function isModernBrowser() {
try {
return (Array.from(new Map([[1, 2]]).entries()).join(',') === '1,2' &&
CSS.supports('display', 'grid') &&
CSS.supports('display', 'flex'));
}
catch (e) {
// Some of these are not supported. Assume legacy browser.
return false;
}
}
// #region style
export const browseHappyClassName = style(debugClassName('browse-happy'), {
width: percent(100),
width: '100%',
position: 'fixed',
bottom: 0,
left: 0,
zIndex: 100,
backgroundColor: colorRed700,
color: colorWhite,
padding: rem(1),
paddingBottom: `calc(${rem(1)} + env(safe-area-inset-bottom))`,
textAlign: 'center',
paddingTop: '1rem',
paddingBottom: 'calc(1rem + env(safe-area-inset-bottom))',
paddingLeft: 'calc(1rem + env(safe-area-inset-left))',
paddingRight: 'calc(1rem + env(safe-area-inset-right))',
textAlign: 'center'
});
export const browseHappyHiddenClassName = style(debugClassName('browse-happy-hidden'), {
$unique: true,
display: 'none'
});
export const browseHappyLinkClassName = style(debugClassName('browse-happy-link'), {
$unique: true,
color: colorAmber500,
fontWeight: 'bold',
$nest: {
'&[data-hidden=true]': { display: 'none' },
'& a': {
color: colorAmber500,
fontWeight: 'bold',
$nest: {
'&:hover, &:focus, &:active': { color: colorAmber200 }
}
}
'&:hover, &:focus, &:active': { color: colorAmber200 }
}
});
export const BrowseHappy = createMemoizedComponent('BrowseHappy', function (props) {
var _a;
const message = (_a = props.message) !== null && _a !== void 0 ? _a : 'Your browser is obsolete. For the best browsing experience, update it for free by visiting';
return (React.createElement("div", { id: "browseHappy", className: browseHappyClassName, "data-hidden": typeof window === 'undefined' },
// #endregion style
export function isModernBrowser() {
try {
return (Array.from(new Map([[1, 2]]).entries()).join(',') === '1,2' &&
CSS.supports('display', 'grid') &&
CSS.supports('display', 'flex') &&
CSS.supports('color', 'var(--var)'));
}
catch (e) {
// Some of these are not supported. Assume legacy browser.
return false;
}
}
export const BrowseHappy = createMemoizedComponent('BrowseHappy', function ({ message, className }) {
message = message !== null && message !== void 0 ? message : 'Your browser is obsolete. For the best browsing experience, update it for free by visiting';
return (React.createElement("div", { id: "browseHappy", className: classes(browseHappyClassName, typeof window === 'undefined' && browseHappyHiddenClassName, className) },
React.createElement("span", null,
message,
"\u00A0"),
React.createElement("a", { href: "https://browsehappy.com/", target: "_blank", rel: "noopener noreferrer" }, "BrowseHappy"),
React.createElement("a", { href: "https://browsehappy.com/", target: "_blank", rel: "noopener noreferrer", className: browseHappyLinkClassName }, "BrowseHappy"),
"."));
});
export const BrowseHappySSR = `
document.addEventListener('DOMContentLoaded', function(){
${isModernBrowser}
document.addEventListener('DOMContentLoaded', function() {
${isModernBrowser};
const element = document.getElementById('browseHappy')
if(isModernBrowser()) element.remove()
else element.removeAttribute('data-hidden')
const element = document.getElementById('browseHappy');
if(isModernBrowser()) {
element.remove();
} else {
element.classList.remove('${browseHappyHiddenClassName}');
}
});
`;
9 changes: 4 additions & 5 deletions lib/components/icons.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { em } from 'csx';
import React from 'react';
import { classes, style } from 'typestyle';
import { debugClassName } from '../styling/mixins';
import { createMemoizedComponent } from '../utils/dom-utils';
// #region style
export const iconClassName = style(debugClassName('icon'), {
width: em(1),
height: em(1),
width: '1em',
height: '1em',
display: 'inline-block',
verticalAlign: 'middle',
strokeWidth: 0,
Expand All @@ -22,8 +22,7 @@ export const iconsDefinitionsClassName = style(debugClassName('icons-definitions
export const Icon = createMemoizedComponent('Icon', function ({ name, className, onClick }) {
const icon = ICONS.tags[name];
if (!icon) {
console.error(`Missing icon ${name}.`);
return null;
throw new Error(`Missing icon ${name}.`);
}
return (React.createElement("svg", { className: classes(iconClassName, `Icon-${name}`, className), onClick: onClick },
React.createElement("use", { xlinkHref: `#${icon.toString()}` })));
Expand Down
35 changes: 17 additions & 18 deletions lib/components/made-in-italy.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
import { em, percent } from 'csx';
import React from 'react';
import { style } from 'typestyle';
import { classes, style } from 'typestyle';
import { colorBlack, colorWhite } from '../styling/colors';
import { debugClassName } from '../styling/mixins';
import { createMemoizedComponent } from '../utils/dom-utils';
import { Ribbon } from './ribbon';
// #region style
export const madeInItalyClassName = style(debugClassName('made-in-italy'), {
background: 'linear-gradient(90deg, #009246, #009246 30%, #f1f2f1 30%, #f1f2f1 70%, #ce2b37 70%)',
$nest: {
'& a': {
display: 'inline-block',
width: percent(60),
fontWeight: 'bold',
fontSize: em(0.85),
lineHeight: 1,
color: colorBlack,
textShadow: `0 0 0.5rem ${colorWhite}`,
padding: em(0.5)
}
}
background: 'linear-gradient(90deg, #009246, #009246 30%, #f1f2f1 30%, #f1f2f1 70%, #ce2b37 70%)'
});
export const MadeInItaly = createMemoizedComponent('MadeInItaly', function ({ position }) {
return (React.createElement(Ribbon, { className: madeInItalyClassName, position: position },
React.createElement("a", { href: "http://www.italia.it", target: "_blank", rel: "noopener noreferrer" }, "Made by a proud Italian!")));
export const madeInItalyLinkClassName = style(debugClassName('made-in-italy-link'), {
display: 'inline-block',
width: '60%',
fontWeight: 'bold',
fontSize: '0.85em',
lineHeight: 1,
color: colorBlack,
textShadow: `0 0 5px ${colorWhite}`,
padding: '5px'
});
// #endregion style
export const MadeInItaly = createMemoizedComponent('MadeInItaly', function ({ position, className }) {
return (React.createElement(Ribbon, { className: classes(madeInItalyClassName, className), position: position },
React.createElement("a", { className: madeInItalyLinkClassName, href: "http://www.italia.it", target: "_blank", rel: "noopener noreferrer" }, "Made by a proud Italian!")));
});
79 changes: 41 additions & 38 deletions lib/components/new-version-checker.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,36 @@
import { percent, rem } from 'csx';
import React, { useEffect, useState } from 'react';
import { style } from 'typestyle';
import { classes, style } from 'typestyle';
import { colorAmber200, colorAmber500, colorGreen900, colorWhite } from '../styling/colors';
import { debugClassName } from '../styling/mixins';
import { createMemoizedComponent } from '../utils/dom-utils';
// #region style
export const newVersionCheckerClassName = style(debugClassName('new-version-checker'), {
width: '100%',
position: 'fixed',
top: 0,
left: 0,
zIndex: 100,
backgroundColor: colorGreen900,
color: colorWhite,
paddingTop: 'calc(1rem + env(safe-area-inset-top))',
paddingBottom: '1rem',
paddingLeft: 'calc(1rem + env(safe-area-inset-left))',
paddingRight: 'calc(1rem + env(safe-area-inset-right))',
textAlign: 'center'
});
export const newVersionCheckerHiddenClassName = style(debugClassName('new-version-checker-hidden'), {
$unique: true,
display: 'none'
});
export const newVersionCheckerLinkClassName = style(debugClassName('new-version-checker-link'), {
$unique: true,
color: colorAmber500,
fontWeight: 'bold',
$nest: {
'&:hover, &:focus, &:active': { color: colorAmber200 }
}
});
// #endregion style
export function listenForUpdates(currentVersion, callback) {
if (!navigator.serviceWorker) {
return;
Expand All @@ -17,59 +44,35 @@ export function listenForUpdates(currentVersion, callback) {
}
export function updateVersion(ev) {
ev.preventDefault();
location.reload(true); // tslint:disable-line deprecation
location.reload(true);
}
export const newVersionCheckerClassName = style(debugClassName('new-version-checker'), {
width: percent(100),
position: 'fixed',
top: 0,
left: 0,
zIndex: 100,
backgroundColor: colorGreen900,
color: colorWhite,
padding: rem(1),
paddingTop: `calc(${rem(1)} + env(safe-area-inset-top))`,
paddingBottom: rem(1),
paddingLeft: `calc(${rem(1)} + env(safe-area-inset-left))`,
paddingRight: `calc(${rem(1)} + env(safe-area-inset-right))`,
textAlign: 'center',
$nest: {
'&[data-hidden=true]': { display: 'none' },
'& a': {
color: colorAmber500,
fontWeight: 'bold',
$nest: {
'&:hover, &:focus, &:active': { color: colorAmber200 }
}
}
}
});
export const NewVersionChecker = createMemoizedComponent('NewVersionChecker', function ({ currentVersion, message, action }) {
export const NewVersionChecker = createMemoizedComponent('NewVersionChecker', function ({ currentVersion, message, className, action }) {
const [newVersionAvailable, setNewVersionAvailable] = useState(false);
useEffect(() => {
listenForUpdates(currentVersion, () => setNewVersionAvailable(true));
}, []);
// The check on window is for SSR
// tslint:disable-next-line strict-type-predicates
if (typeof window !== 'undefined' && !newVersionAvailable) {
return null;
}
message = message !== null && message !== void 0 ? message : 'There is a shiny new version.';
action = action !== null && action !== void 0 ? action : 'Update now!';
return (React.createElement("div", { id: "newVersionChecker", className: newVersionCheckerClassName, "data-current-version": currentVersion, "data-hidden": typeof window === 'undefined' || !newVersionAvailable },
return (React.createElement("div", { id: "newVersionChecker", className: classes(newVersionCheckerClassName, (typeof window === 'undefined' || !newVersionAvailable) && newVersionCheckerHiddenClassName, className), "data-current-version": currentVersion },
React.createElement("span", null,
message,
"\u00A0"),
React.createElement("a", { href: "#", onClick: updateVersion }, action)));
React.createElement("a", { href: "#", onClick: updateVersion, className: newVersionCheckerLinkClassName }, action)));
});
export const NewVersionCheckerSSR = `
document.addEventListener('DOMContentLoaded', function(){
${listenForUpdates}
${updateVersion}
const element = document.getElementById('newVersionChecker')
${listenForUpdates};
${updateVersion};
element.querySelector('a').addEventListener('click', updateVersion, false)
listenForUpdates(element.getAttribute('data-current-version'), () => element.removeAttribute('data-hidden'))
const element = document.getElementById('newVersionChecker');
element.querySelector('a').addEventListener('click', updateVersion, false);
listenForUpdates(element.getAttribute('data-current-version'), () => {
element.classList.remove('${newVersionCheckerHiddenClassName}');
});
});
`;
108 changes: 50 additions & 58 deletions lib/components/ribbon.js
Original file line number Diff line number Diff line change
@@ -1,64 +1,56 @@
import { percent, px, rem } from 'csx';
import React from 'react';
import { classes, media, style } from 'typestyle';
import { maxWidth7xx } from '../styling/breakpoints';
import { classes, style } from 'typestyle';
import { colorGrey500, colorGrey800 } from '../styling/colors';
import { debugClassName } from '../styling/mixins';
import { createMemoizedComponent } from '../utils/dom-utils';
// #region style
const ribbonBaseClassName = style(debugClassName('ribbon-base'), {
display: 'var(--rl-ribbon-display)',
position: 'fixed',
backfaceVisibility: 'hidden',
zIndex: 99,
border: `1px solid ${colorGrey800}`,
boxShadow: `0 0 0.5rem ${colorGrey500}`,
padding: '0 2%',
textAlign: 'center'
});
// 29.28% = 100% - (100% / sqrt(2))
export const ribbonPositionsClassesNames = {
'top-left': style(debugClassName('ribbon-top-left'), {
top: 0,
left: 0,
bottom: 'auto',
right: 'auto',
transform: 'translate(-29.28%, -100%) rotate(-45deg)',
transformOrigin: 'bottom right'
}),
'top-right': style(debugClassName('ribbon-top-right'), {
top: 0,
left: 'auto',
bottom: 'auto',
right: 0,
transform: 'translate(29.28%, -100%) rotate(45deg)',
transformOrigin: 'bottom left'
}),
'bottom-right': style(debugClassName('ribbon-bottom-right'), {
top: 'auto',
left: 'auto',
bottom: 0,
right: 0,
transform: 'translate(29.28%, 100%) rotate(-45deg)',
transformOrigin: 'top left'
}),
'bottom-left': style(debugClassName('ribbon-bottom-left'), {
top: 'auto',
left: 0,
bottom: 0,
right: 'auto',
transform: 'translate(-29.28%, 100%) rotate(45deg)',
transformOrigin: 'top right'
})
};
export const Ribbon = createMemoizedComponent('Ribbon', function ({ position, className, children }) {
let positionCss = null;
// ${percent(29.28)} = ${percent(100)} - (${percent(100)} / sqrt(2))
switch (position) {
case 'top-left':
positionCss = {
top: 0,
left: 0,
bottom: 'auto',
right: 'auto',
transform: `translate(${percent(-29.28)}, ${percent(-100)}) rotate(-45deg)`,
transformOrigin: 'bottom right'
};
break;
case 'bottom-left':
positionCss = {
top: 'auto',
left: 0,
bottom: 0,
right: 'auto',
transform: `translate(${percent(-29.28)}, ${percent(100)}) rotate(45deg)`,
transformOrigin: 'top right'
};
break;
case 'bottom-right':
positionCss = {
top: 'auto',
left: 'auto',
bottom: 0,
right: 0,
transform: `translate(${percent(29.28)}, ${percent(100)}) rotate(-45deg)`,
transformOrigin: 'top left'
};
break;
default:
// top-right by default
positionCss = {
top: 0,
left: 'auto',
bottom: 'auto',
right: 0,
transform: `translate(${percent(29.28)}, ${percent(-100)}) rotate(45deg)`,
transformOrigin: 'bottom left'
};
break;
}
const baseClassName = style(debugClassName('ribbon'), {
position: 'fixed',
backfaceVisibility: 'hidden',
zIndex: 99,
border: `${px(1)} solid ${colorGrey800}`,
boxShadow: `0 0 ${rem(0.5)} ${colorGrey500}`,
padding: `0 ${percent(2)}`,
textAlign: 'center'
}, positionCss, media({ maxWidth: maxWidth7xx }, { display: 'none' }));
return React.createElement("div", { className: classes(baseClassName, className) }, children);
var _a;
const positionClassName = (_a = ribbonPositionsClassesNames[position]) !== null && _a !== void 0 ? _a : ribbonPositionsClassesNames['top-right'];
return React.createElement("div", { className: classes(ribbonBaseClassName, positionClassName, className) }, children);
});

0 comments on commit 1c5fee3

Please sign in to comment.