mirror of
https://github.com/PeWu/topola-viewer.git
synced 2026-04-11 00:56:16 +00:00
Replaced usages of Responsive with @artsy/fresnel
Responsive has been removed in newest versions of semantic-ui-react
This commit is contained in:
5
package-lock.json
generated
5
package-lock.json
generated
@@ -4,6 +4,11 @@
|
|||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@artsy/fresnel": {
|
||||||
|
"version": "1.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@artsy/fresnel/-/fresnel-1.3.1.tgz",
|
||||||
|
"integrity": "sha512-p3tZxhtUWELqok1VLAYjGlMaBl30K6U+PVYXuV/8xD+Y+wgTxMMIrrKU61zKaRh3Py7xj9if9rpsOESVGJD4Wg=="
|
||||||
|
},
|
||||||
"@babel/code-frame": {
|
"@babel/code-frame": {
|
||||||
"version": "7.12.13",
|
"version": "7.12.13",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"main": "src/index.tsx",
|
"main": "src/index.tsx",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@artsy/fresnel": "^1.3.1",
|
||||||
"array.prototype.flatmap": "^1.2.4",
|
"array.prototype.flatmap": "^1.2.4",
|
||||||
"canvas-toBlob": "^1.0.0",
|
"canvas-toBlob": "^1.0.0",
|
||||||
"d3-array": "^2.12.1",
|
"d3-array": "^2.12.1",
|
||||||
|
|||||||
13
src/app.tsx
13
src/app.tsx
@@ -3,16 +3,18 @@ import * as queryString from 'query-string';
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import {analyticsEvent} from './util/analytics';
|
import {analyticsEvent} from './util/analytics';
|
||||||
import {Chart, ChartComponent, ChartType} from './chart';
|
import {Chart, ChartComponent, ChartType} from './chart';
|
||||||
|
import {DataSourceEnum, SourceSelection} from './datasource/data_source';
|
||||||
import {Details} from './details';
|
import {Details} from './details';
|
||||||
import {EmbeddedDataSource, EmbeddedSourceSpec} from './datasource/embedded';
|
import {EmbeddedDataSource, EmbeddedSourceSpec} from './datasource/embedded';
|
||||||
import {FormattedMessage, WrappedComponentProps} from 'react-intl';
|
import {FormattedMessage, WrappedComponentProps} from 'react-intl';
|
||||||
import {TopolaData} from './util/gedcom_util';
|
import {getI18nMessage} from './util/error_i18n';
|
||||||
import {IndiInfo} from 'topola';
|
import {IndiInfo} from 'topola';
|
||||||
import {Intro} from './intro';
|
import {Intro} from './intro';
|
||||||
import {Loader, Message, Portal, Responsive} from 'semantic-ui-react';
|
import {Loader, Message, Portal} from 'semantic-ui-react';
|
||||||
|
import {Media} from './util/media';
|
||||||
import {Redirect, Route, RouteComponentProps, Switch} from 'react-router-dom';
|
import {Redirect, Route, RouteComponentProps, Switch} from 'react-router-dom';
|
||||||
import {TopBar} from './menu/top_bar';
|
import {TopBar} from './menu/top_bar';
|
||||||
import {DataSourceEnum, SourceSelection} from './datasource/data_source';
|
import {TopolaData} from './util/gedcom_util';
|
||||||
import {
|
import {
|
||||||
getSelection,
|
getSelection,
|
||||||
UploadSourceSpec,
|
UploadSourceSpec,
|
||||||
@@ -26,7 +28,6 @@ import {
|
|||||||
WikiTreeDataSource,
|
WikiTreeDataSource,
|
||||||
WikiTreeSourceSpec,
|
WikiTreeSourceSpec,
|
||||||
} from './datasource/wikitree';
|
} from './datasource/wikitree';
|
||||||
import {getI18nMessage} from './util/error_i18n';
|
|
||||||
|
|
||||||
/** Shows an error message in the middle of the screen. */
|
/** Shows an error message in the middle of the screen. */
|
||||||
function ErrorMessage(props: {message?: string}) {
|
function ErrorMessage(props: {message?: string}) {
|
||||||
@@ -478,12 +479,12 @@ export class App extends React.Component<
|
|||||||
ref={(ref) => (this.chartRef = ref)}
|
ref={(ref) => (this.chartRef = ref)}
|
||||||
/>
|
/>
|
||||||
{this.state.showSidePanel ? (
|
{this.state.showSidePanel ? (
|
||||||
<Responsive minWidth={768} id="sidePanel">
|
<Media at="large" className="sidePanel">
|
||||||
<Details
|
<Details
|
||||||
gedcom={this.state.data!.gedcom}
|
gedcom={this.state.data!.gedcom}
|
||||||
indi={this.state.selection!.id}
|
indi={this.state.selection!.id}
|
||||||
/>
|
/>
|
||||||
</Responsive>
|
</Media>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import {select, Selection} from 'd3-selection';
|
|
||||||
import {interpolateNumber} from 'd3-interpolate';
|
|
||||||
import {injectIntl, WrappedComponentProps} from 'react-intl';
|
import {injectIntl, WrappedComponentProps} from 'react-intl';
|
||||||
|
import {interpolateNumber} from 'd3-interpolate';
|
||||||
import {max, min} from 'd3-array';
|
import {max, min} from 'd3-array';
|
||||||
import {Responsive} from 'semantic-ui-react';
|
import {Media} from './util/media';
|
||||||
import {saveAs} from 'file-saver';
|
import {saveAs} from 'file-saver';
|
||||||
|
import {select, Selection} from 'd3-selection';
|
||||||
|
import 'd3-transition';
|
||||||
import {
|
import {
|
||||||
D3ZoomEvent,
|
D3ZoomEvent,
|
||||||
zoom,
|
zoom,
|
||||||
@@ -12,7 +13,6 @@ import {
|
|||||||
ZoomedElementBaseType,
|
ZoomedElementBaseType,
|
||||||
zoomTransform,
|
zoomTransform,
|
||||||
} from 'd3-zoom';
|
} from 'd3-zoom';
|
||||||
import 'd3-transition';
|
|
||||||
import {
|
import {
|
||||||
JsonGedcomData,
|
JsonGedcomData,
|
||||||
ChartHandle,
|
ChartHandle,
|
||||||
@@ -309,7 +309,7 @@ export class ChartComponent extends React.PureComponent<
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div id="svgContainer">
|
<div id="svgContainer">
|
||||||
<Responsive minWidth={768} className="zoom">
|
<Media at="large" className="zoom">
|
||||||
<button className="zoom-in" onClick={() => this.zoom(ZOOM_FACTOR)}>
|
<button className="zoom-in" onClick={() => this.zoom(ZOOM_FACTOR)}>
|
||||||
+
|
+
|
||||||
</button>
|
</button>
|
||||||
@@ -319,7 +319,7 @@ export class ChartComponent extends React.PureComponent<
|
|||||||
>
|
>
|
||||||
−
|
−
|
||||||
</button>
|
</button>
|
||||||
</Responsive>
|
</Media>
|
||||||
<svg id="chartSvg">
|
<svg id="chartSvg">
|
||||||
<g id="chart" />
|
<g id="chart" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ body, html {
|
|||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
#sidePanel {
|
.sidePanel {
|
||||||
flex: 0 0 320px;
|
flex: 0 0 320px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
border-left: solid #ccc 1px;
|
border-left: solid #ccc 1px;
|
||||||
@@ -68,7 +68,7 @@ div.ui.card.intro {
|
|||||||
-webkit-filter: blur(8px) opacity(30%);
|
-webkit-filter: blur(8px) opacity(30%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.zoom {
|
div.zoom {
|
||||||
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
|
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@@ -137,3 +137,7 @@ div.ui.card.intro {
|
|||||||
height: 24px;
|
height: 24px;
|
||||||
margin-right: 5px
|
margin-right: 5px
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ui.top.attached.menu {
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {App} from './app';
|
|||||||
import {detect} from 'detect-browser';
|
import {detect} from 'detect-browser';
|
||||||
import {HashRouter as Router, Route} from 'react-router-dom';
|
import {HashRouter as Router, Route} from 'react-router-dom';
|
||||||
import {IntlProvider} from 'react-intl';
|
import {IntlProvider} from 'react-intl';
|
||||||
|
import {MediaContextProvider, mediaStyles} from './util/media';
|
||||||
import './index.css';
|
import './index.css';
|
||||||
import 'semantic-ui-css/semantic.min.css';
|
import 'semantic-ui-css/semantic.min.css';
|
||||||
import 'canvas-toBlob';
|
import 'canvas-toBlob';
|
||||||
@@ -35,9 +36,12 @@ if (browser && browser.name === 'ie') {
|
|||||||
} else {
|
} else {
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<IntlProvider locale={language} messages={messages[language]}>
|
<IntlProvider locale={language} messages={messages[language]}>
|
||||||
|
<MediaContextProvider>
|
||||||
|
<style>{mediaStyles}</style>
|
||||||
<Router>
|
<Router>
|
||||||
<Route component={App} />
|
<Route component={App} />
|
||||||
</Router>
|
</Router>
|
||||||
|
</MediaContextProvider>
|
||||||
</IntlProvider>,
|
</IntlProvider>,
|
||||||
document.querySelector('#root'),
|
document.querySelector('#root'),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import * as queryString from 'query-string';
|
import * as queryString from 'query-string';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import logo from './topola.jpg';
|
import logo from './topola.jpg';
|
||||||
import {Card, Grid, Image, Responsive} from 'semantic-ui-react';
|
import {Card, Grid, Image} from 'semantic-ui-react';
|
||||||
import {FormattedMessage} from 'react-intl';
|
import {FormattedMessage} from 'react-intl';
|
||||||
import {Link} from 'react-router-dom';
|
import {Link} from 'react-router-dom';
|
||||||
|
import {Media} from './util/media';
|
||||||
|
|
||||||
/** Link that loads a GEDCOM file from URL. */
|
/** Link that loads a GEDCOM file from URL. */
|
||||||
function GedcomLink(props: {url: string; text: string}) {
|
function GedcomLink(props: {url: string; text: string}) {
|
||||||
@@ -112,24 +113,24 @@ export function Intro() {
|
|||||||
<div id="content">
|
<div id="content">
|
||||||
<div className="backgroundImage" />
|
<div className="backgroundImage" />
|
||||||
<Card className="intro">
|
<Card className="intro">
|
||||||
<Responsive as={Card.Content} minWidth={768}>
|
<Card.Content as={Media} at="large">
|
||||||
<Card.Header>
|
<Card.Header>
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id="intro.title"
|
id="intro.title"
|
||||||
defaultMessage="Topola Genealogy Viewer"
|
defaultMessage="Topola Genealogy Viewer"
|
||||||
/>
|
/>
|
||||||
</Card.Header>
|
</Card.Header>
|
||||||
</Responsive>
|
</Card.Content>
|
||||||
<Card.Content>
|
<Card.Content>
|
||||||
<Responsive as={Grid} minWidth={768}>
|
<Grid as={Media} at="large">
|
||||||
<Grid.Row>
|
<Grid.Row>
|
||||||
<Grid.Column width={5}>
|
<Grid.Column width={5}>
|
||||||
<Image src={logo} alt="Topola logo" />
|
<Image src={logo} alt="Topola logo" />
|
||||||
</Grid.Column>
|
</Grid.Column>
|
||||||
<Grid.Column width={11}>{contents}</Grid.Column>
|
<Grid.Column width={11}>{contents}</Grid.Column>
|
||||||
</Grid.Row>
|
</Grid.Row>
|
||||||
</Responsive>
|
</Grid>
|
||||||
<Responsive maxWidth={767}>
|
<Media at="small">
|
||||||
<Image
|
<Image
|
||||||
src={logo}
|
src={logo}
|
||||||
alt="Topola logo"
|
alt="Topola logo"
|
||||||
@@ -138,7 +139,7 @@ export function Intro() {
|
|||||||
className="blockImage"
|
className="blockImage"
|
||||||
/>
|
/>
|
||||||
{contents}
|
{contents}
|
||||||
</Responsive>
|
</Media>
|
||||||
</Card.Content>
|
</Card.Content>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
import * as queryString from 'query-string';
|
import * as queryString from 'query-string';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
import {Dropdown, Icon, Menu} from 'semantic-ui-react';
|
||||||
import {FormattedMessage} from 'react-intl';
|
import {FormattedMessage} from 'react-intl';
|
||||||
import {IndiInfo, JsonGedcomData} from 'topola';
|
import {IndiInfo, JsonGedcomData} from 'topola';
|
||||||
import {Link} from 'react-router-dom';
|
import {Link} from 'react-router-dom';
|
||||||
|
import {Media} from '../util/media';
|
||||||
import {MenuType} from './menu_item';
|
import {MenuType} from './menu_item';
|
||||||
import {RouteComponentProps} from 'react-router-dom';
|
import {RouteComponentProps} from 'react-router-dom';
|
||||||
|
import {SearchBar} from './search';
|
||||||
import {UploadMenu} from './upload_menu';
|
import {UploadMenu} from './upload_menu';
|
||||||
import {UrlMenu} from './url_menu';
|
import {UrlMenu} from './url_menu';
|
||||||
import {WikiTreeLoginMenu, WikiTreeMenu} from './wikitree_menu';
|
import {WikiTreeLoginMenu, WikiTreeMenu} from './wikitree_menu';
|
||||||
import {Icon, Menu, Dropdown, Responsive} from 'semantic-ui-react';
|
|
||||||
import {SearchBar} from './search';
|
|
||||||
|
|
||||||
enum ScreenSize {
|
enum ScreenSize {
|
||||||
LARGE,
|
LARGE,
|
||||||
@@ -344,26 +345,26 @@ export class TopBar extends React.Component<RouteComponentProps & Props> {
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Responsive
|
<Menu
|
||||||
as={Menu}
|
as={Media}
|
||||||
|
at="large"
|
||||||
attached="top"
|
attached="top"
|
||||||
inverted
|
inverted
|
||||||
color="blue"
|
color="blue"
|
||||||
size="large"
|
size="large"
|
||||||
minWidth={768}
|
|
||||||
>
|
>
|
||||||
{this.desktopMenus()}
|
{this.desktopMenus()}
|
||||||
</Responsive>
|
</Menu>
|
||||||
<Responsive
|
<Menu
|
||||||
as={Menu}
|
as={Media}
|
||||||
|
at="small"
|
||||||
attached="top"
|
attached="top"
|
||||||
inverted
|
inverted
|
||||||
color="blue"
|
color="blue"
|
||||||
size="large"
|
size="large"
|
||||||
maxWidth={767}
|
|
||||||
>
|
>
|
||||||
{this.mobileMenus()}
|
{this.mobileMenus()}
|
||||||
</Responsive>
|
</Menu>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
11
src/util/media.ts
Normal file
11
src/util/media.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import {createMedia} from '@artsy/fresnel';
|
||||||
|
|
||||||
|
/** Defines the breakpoints at which to show different UI variants. */
|
||||||
|
const AppMedia = createMedia({
|
||||||
|
breakpoints: {
|
||||||
|
small: 320,
|
||||||
|
large: 768,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
export const mediaStyles = AppMedia.createMediaStyle();
|
||||||
|
export const {Media, MediaContextProvider} = AppMedia;
|
||||||
Reference in New Issue
Block a user