Bug 1521836 - Add component refinement, context sources and bug fixes to Activity Stream r=k88hudson

Differential Revision: https://phabricator.services.mozilla.com/D17328

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Ed Lee 2019-01-23 15:40:47 +00:00
Родитель 1dcbdcf59e
Коммит 32fba16ff7
459 изменённых файлов: 1097 добавлений и 1036 удалений

Просмотреть файл

@ -93,8 +93,6 @@ for (const src of ${JSON.stringify(scripts, null, 2)}) {
script.src = src;
}
</script>`;
// Comment to indicate if prerendered version of html is used. See Bug 1516034
const isPrerenderedStatus = "<!-- Prerendered version html not shown -->";
return `<!doctype html>
<html lang="${options.locale}" dir="${options.direction}">
<head>
@ -106,11 +104,10 @@ for (const src of ${JSON.stringify(scripts, null, 2)}) {
<link rel="stylesheet" href="${options.baseUrl}css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root">${isPrerendered ? html : ""}</div>
<div id="root">${isPrerendered ? html : "<!-- Regular React Rendering -->"}</div>
<div id="snippets-container">
<div id="snippets"></div>
</div>${options.noscripts ? "" : scriptTag}
${isPrerendered ? "" : isPrerenderedStatus}
</body>
</html>
`;

Просмотреть файл

@ -68,7 +68,7 @@ class DiscoveryStreamAdmin extends React.PureComponent {
</Row>
<Row>
<td className="min">Data last fetched</td>
<td>{relativeTime(feeds[feed.url].lastUpdated) || "(no data)"}</td>
<td>{relativeTime(feeds[feed.url] ? feeds[feed.url].lastUpdated : null) || "(no data)"}</td>
</Row>
</React.Fragment>
);

Просмотреть файл

@ -4,6 +4,7 @@ import {Hero} from "content-src/components/DiscoveryStreamComponents/Hero/Hero";
import {HorizontalRule} from "content-src/components/DiscoveryStreamComponents/HorizontalRule/HorizontalRule";
import {ImpressionStats} from "content-src/components/DiscoveryStreamImpressionStats/ImpressionStats";
import {List} from "content-src/components/DiscoveryStreamComponents/List/List";
import {Navigation} from "content-src/components/DiscoveryStreamComponents/Navigation/Navigation";
import React from "react";
import {SectionTitle} from "content-src/components/DiscoveryStreamComponents/SectionTitle/SectionTitle";
import {selectLayoutRender} from "content-src/lib/selectLayoutRender";
@ -39,33 +40,22 @@ export function isAllowedCSS(property, value) {
url.slice(5).startsWith(prefix)));
}
function maybeInjectSpocs(data, spocs) {
if (!data || !spocs || !spocs.positions || !spocs.positions.length) {
return data;
}
const recommendations = [...data.recommendations];
for (let position of spocs.positions) {
const {result} = position;
if (result) {
// Insert spoc into the desired index.
recommendations.splice(position.index, 0, result);
}
}
return {
...data,
recommendations,
};
}
export class _DiscoveryStreamBase extends React.PureComponent {
constructor(props) {
super(props);
this.onStyleMount = this.onStyleMount.bind(this);
}
/**
* Extracts the recommendation rows from component for the impression ping.
* If `component.data.recommendations` is unset, returns an empty array.
*
* The row size is determined by the following rules:
* - Use `component.properties.items` from the endpoint if it's specified
* - Otherwise, use the length of recommendation array
* - The row size is capped by the argument `limit`, which could be one of
* [`MAX_ROW_HERO`, `MAX_ROWS_LIST`, `MAX_ROWS_CARDGRID`]
*/
extractRows(component, limit) {
if (component.data && component.data.recommendations) {
const items = Math.min(limit, component.properties.items || component.data.recommendations.length);
@ -107,7 +97,7 @@ export class _DiscoveryStreamBase extends React.PureComponent {
});
// Set the actual desired selectors scoped to the component
const prefix = `.ds-layout > .ds-column:nth-child(${rowIndex + 1}) > :nth-child(${componentIndex + 1})`;
const prefix = `.ds-layout > .ds-column:nth-child(${rowIndex + 1}) .ds-column-grid > :nth-child(${componentIndex + 1})`;
// NB: Splitting on "," doesn't work with strings with commas, but
// we're okay with not supporting those selectors
rule.selectorText = selectors.split(",").map(selector => prefix +
@ -128,16 +118,25 @@ export class _DiscoveryStreamBase extends React.PureComponent {
switch (component.type) {
case "TopSites":
return (<TopSites />);
return (<TopSites header={component.header} />);
case "SectionTitle":
return (<SectionTitle />);
return (
<SectionTitle
header={component.header} />
);
case "Navigation":
return (
<Navigation
links={component.properties.links}
alignment={component.properties.alignment} />
);
case "CardGrid":
rows = this.extractRows(component, MAX_ROWS_CARDGRID);
return (
<ImpressionStats rows={rows} dispatch={this.props.dispatch} source={component.type}>
<CardGrid
title={component.header && component.header.title}
data={maybeInjectSpocs(component.data, component.spocs)}
data={component.data}
feed={component.feed}
border={component.properties.border}
type={component.type}
@ -151,7 +150,7 @@ export class _DiscoveryStreamBase extends React.PureComponent {
<ImpressionStats rows={rows} dispatch={this.props.dispatch} source={component.type}>
<Hero
title={component.header && component.header.title}
data={maybeInjectSpocs(component.data, component.spocs)}
data={component.data}
border={component.properties.border}
type={component.type}
dispatch={this.props.dispatch}
@ -161,12 +160,13 @@ export class _DiscoveryStreamBase extends React.PureComponent {
case "HorizontalRule":
return (<HorizontalRule />);
case "List":
rows = this.extractRows(component,
Math.min(component.properties.items, MAX_ROWS_LIST));
rows = this.extractRows(component, MAX_ROWS_LIST);
return (
<ImpressionStats rows={rows} dispatch={this.props.dispatch} source={component.type}>
<List
feed={component.feed}
hasImages={component.properties.has_images}
hasNumbers={component.properties.has_numbers}
items={component.properties.items}
type={component.type}
header={component.header} />
@ -191,12 +191,14 @@ export class _DiscoveryStreamBase extends React.PureComponent {
<div className="discovery-stream ds-layout">
{layoutRender.map((row, rowIndex) => (
<div key={`row-${rowIndex}`} className={`ds-column ds-column-${row.width}`}>
{row.components.map((component, componentIndex) => {
styles[rowIndex] = [...styles[rowIndex] || [], component.styles];
return (<div key={`component-${componentIndex}`}>
{this.renderComponent(component)}
</div>);
})}
<div className="ds-column-grid">
{row.components.map((component, componentIndex) => {
styles[rowIndex] = [...styles[rowIndex] || [], component.styles];
return (<div key={`component-${componentIndex}`}>
{this.renderComponent(component)}
</div>);
})}
</div>
</div>
))}
{this.renderStyles(styles)}

Просмотреть файл

@ -1,14 +1,11 @@
.outer-wrapper .discovery-stream.ds-layout a {
// XXX note that this only looks right in the light theme
color: $grey-90;
}
.discovery-stream.ds-layout {
$columns: 12;
--gridColumnGap: 48px;
--gridRowGap: 24px;
display: grid;
grid-template-columns: repeat($columns, 1fr);
grid-column-gap: 48px;
grid-row-gap: 10px;
grid-column-gap: var(--gridColumnGap);
grid-row-gap: var(--gridRowGap);
width: 936px;
margin: 0 auto;
@ -21,8 +18,15 @@
$columns: $columns - 1;
}
.ds-column {
.ds-column-grid {
display: grid;
grid-row-gap: 10px;
grid-row-gap: var(--gridRowGap);
}
.ds-header {
font-size: 17px;
line-height: 24px;
color: $grey-90;
margin: 16px 0;
}
}

Просмотреть файл

@ -17,18 +17,30 @@ export class CardGrid extends React.PureComponent {
key={`dscard-${index}`}
image_src={rec.image_src}
title={rec.title}
excerpt={rec.title}
excerpt={rec.excerpt}
url={rec.url}
id={rec.id}
index={index}
type={this.props.type}
context={rec.context}
dispatch={this.props.dispatch}
source={rec.domain} />
));
let divisibility = ``;
if (this.props.items % 4 === 0) {
divisibility = `divisible-by-4`;
} else if (this.props.items % 3 === 0) {
divisibility = `divisible-by-3`;
}
return (
<div className="ds-card-grid">
{cards}
<div>
<div className="ds-header">{this.props.title}</div>
<div className={`ds-card-grid ds-card-grid-${divisibility}`}>
{cards}
</div>
</div>
);
}

Просмотреть файл

@ -24,5 +24,9 @@
.ds-column-12 & {
grid-template-columns: repeat(4, 1fr);
grid-gap: 24px;
&.ds-card-grid-divisible-by-3 {
grid-template-columns: repeat(3, 1fr);
}
}
}

Просмотреть файл

@ -32,7 +32,11 @@ export class DSCard extends React.PureComponent {
<div className="meta">
<header className="title">{this.props.title}</header>
<p className="excerpt">{this.props.excerpt}</p>
<p className="source">{this.props.source}</p>
{this.props.context ? (
<p className="context">{this.props.context}</p>
) : (
<p className="source">{this.props.source}</p>
)}
</div>
</a>
);

Просмотреть файл

@ -11,6 +11,16 @@ $excerpt-line-height: 20;
border: 5px solid $grey-30;
box-shadow: 0 1px 4px $grey-30;
border-radius: 4px;
header {
color: $blue-60;
}
}
&:active {
header {
color: $blue-70;
}
}
.img-wrapper {
@ -45,13 +55,6 @@ $excerpt-line-height: 20;
font-size: $header-font-size * 1px;
color: $grey-90;
&:hover {
color: $blue-60;
}
&:active {
color: $blue-70;
}
}
p {
@ -60,4 +63,8 @@ $excerpt-line-height: 20;
color: $grey-50;
margin: 8px 0;
}
.context {
color: $teal-70;
}
}

Просмотреть файл

@ -49,6 +49,7 @@ export class Hero extends React.PureComponent {
index={index + 1}
type={this.props.type}
dispatch={this.props.dispatch}
context={truncateText(rec.context || "", 22)}
source={truncateText(`TODO: SOURCE`, 22)} />
));
@ -63,7 +64,11 @@ export class Hero extends React.PureComponent {
<div className="meta">
<header>{truncateText(heroRec.title, 28)}</header>
<p>{truncateText(heroRec.excerpt, 114)}</p>
<p>{truncateText(`TODO: SOURCE`, 22)}</p>
{heroRec.context ? (
<p className="context">{truncateText(heroRec.context, 22)}</p>
) : (
<p>{truncateText(`TODO: SOURCE`, 22)}</p>
)}
</div>
</a>
<div className="cards">

Просмотреть файл

@ -1,10 +1,3 @@
.ds-header {
font-size: 17px;
line-height: 24px;
color: $grey-90;
margin: 16px 0;
}
.ds-hero {
.img {
border: 0.5px solid $black-10;
@ -66,6 +59,10 @@
p {
font-size: 13px;
&.context {
color: $teal-70;
}
}
}
}
@ -86,7 +83,6 @@
}
}
.cards {
display: grid;
grid-template-columns: repeat(2, 1fr);

Просмотреть файл

@ -66,16 +66,23 @@ export function _List(props) {
<ListItem {...rec} key={`ds-list-item-${index}`} index={index} type={props.type} dispatch={props.dispatch} />)
);
const listStyles = [
"ds-list",
props.hasImages ? "ds-list-images" : "",
props.hasNumbers ? "ds-list-numbers" : "",
];
return (
<div>
<h3 className="ds-list-title">{props.header && props.header.title}</h3>
{props.header && props.header.title ? <div className="ds-header">{props.header.title}</div> : null }
<hr className="ds-list-border" />
<ul className="ds-list">{recMarkup}</ul>
<ul className={listStyles.join(" ")}>{recMarkup}</ul>
</div>
);
}
_List.defaultProps = {
hasImages: false, // Display images for each item
hasNumbers: false, // Display numbers for each item
items: 6, // Number of stories to display. TODO: get from endpoint
};

Просмотреть файл

@ -2,21 +2,6 @@
$item-font-size: 13;
$item-line-height: 20;
.ds-list-title {
color: $grey-90;
// reset these, which come from the browser's <hr> implementation
margin-block-start: 0;
margin-block-end: 0;
// Since we don't have a border, we use padding instead of margin in order to
// defeat margin collapsing.
padding: 8px 0;
line-height: 24px;
font-size: 17px;
}
.ds-list-border {
border: 1px solid $grey-40-36;
@ -53,6 +38,49 @@ $item-line-height: 20;
grid-row-gap: 18px;
}
a {
// XXX note that this only looks right in the light theme
color: $grey-90;
}
}
.ds-list-images {
.ds-list-item .ds-list-image {
display: block;
}
}
.ds-list-numbers {
$counter-whitespace: ($item-line-height - $item-font-size) * 1px;
$counter-size: ($item-font-size) * 2px + $counter-whitespace;
$counter-padded-size: $counter-size + $counter-whitespace * 1.5;
.ds-list-item {
counter-increment: list;
}
.ds-list-item-link {
padding-inline-start: $counter-padded-size;
&::before {
background-color: var(--newtab-link-secondary-color);
border-radius: $counter-size;
color: $white;
content: counter(list);
font-size: 1.2em;
height: $counter-size;
line-height: $counter-size;
margin-inline-start: -$counter-padded-size;
margin-top: $counter-whitespace / 2;
position: absolute;
text-align: center;
width: $counter-size;
}
&:hover::before {
background-color: var(--newtab-link-primary-color);
}
}
}
// XXX this is gross, and attaches the bottom-border to the item above.
@ -106,6 +134,7 @@ $item-line-height: 20;
}
.ds-list-image {
display: none;
width: 72px;
height: 72px;
object-fit: cover;

Просмотреть файл

@ -0,0 +1,22 @@
import React from "react";
export class Topic extends React.PureComponent {
render() {
const {url, name} = this.props;
return (<li><a key={name} href={url}>{name}</a></li>);
}
}
export class Navigation extends React.PureComponent {
render() {
const {links} = this.props || [];
const {alignment} = this.props || "centered";
return (
<span className={`ds-navigation ds-navigation-${alignment}`}>
<ul>
{links && links.map(t => <Topic key={t.name} url={t.url} name={t.name} />)}
</ul>
</span>
);
}
}

Просмотреть файл

@ -0,0 +1,45 @@
.ds-navigation {
&.ds-navigation-centered {
text-align: center;
}
&.ds-navigation-right-aligned {
text-align: end;
}
ul {
margin: 0;
padding: 0;
}
ul li {
display: inline-block;
&::after {
content: '';
padding: 8px;
}
&:last-child::after {
content: none;
}
a {
&:hover {
// text-decoration: underline; didn't quite match comps.
border-bottom: 1px solid var(--newtab-link-primary-color);
&:active,
&:visited {
border-bottom: 1px solid $blue-70;
}
}
&:active,
&:visited {
color: $blue-70;
}
}
}
}

Просмотреть файл

@ -1,22 +1,13 @@
import React from "react";
export class Topic extends React.PureComponent {
render() {
const {url, name} = this.props;
return (<li><a key={name} href={url}>{name}</a></li>);
}
}
export class SectionTitle extends React.PureComponent {
render() {
const {topics} = this.props;
const {header: {title, subtitle}} = this.props;
return (
<span className="ds-section-title">
<ul>
{topics && topics.map(t => <Topic key={t.name} url={t.url} name={t.name} />)}
<li><a className="ds-more-recommendations">More Recommendations</a></li>
</ul>
</span>
<div className="ds-section-title">
<div className="title">{title}</div>
{subtitle ? <div className="subtitle">{subtitle}</div> : null}
</div>
);
}
}

Просмотреть файл

@ -1,30 +1,15 @@
.ds-section-title {
ul {
margin: 0;
padding: 0;
text-align: center;
.title {
line-height: 48px;
font-size: 36px;
color: $grey-90;
}
ul li {
display: inline-block;
&::after {
content: '';
padding: 8px;
}
&:last-child::after {
content: none;
}
}
.ds-more-recommendations::after {
background: url('../data/content/assets/topic-show-more-12.svg') no-repeat center center;
content: '';
-moz-context-properties: fill;
display: inline-block;
height: 16px;
margin-inline-start: 5px;
vertical-align: top;
width: 12px;
.subtitle {
line-height: 24px;
font-size: 15px;
color: $grey-50;
}
}

Просмотреть файл

@ -4,8 +4,15 @@ import React from "react";
export class _TopSites extends React.PureComponent {
render() {
const header = this.props.header || {};
return (
<div className="ds-top-sites">
{header.title ? (
<div className="ds-header">
<span className="icon icon-small-spacer icon-topsites" />
<span>{header.title}</span>
</div>
) : null}
<OldTopSites />
</div>
);

Просмотреть файл

@ -14,17 +14,25 @@ export const selectLayoutRender = createSelector(
function layoutRender(layout, feeds, spocs) {
let spocIndex = 0;
function calculateSpocs(component) {
return component.spocs.positions.map(position => {
const rickRoll = Math.random();
if (spocs.data.spocs[spocIndex] && rickRoll <= component.spocs.probability) {
return {
...position,
result: spocs.data.spocs[spocIndex++],
};
function maybeInjectSpocs(data, spocsConfig) {
if (data &&
spocsConfig && spocsConfig.positions && spocsConfig.positions.length &&
spocs.data.spocs && spocs.data.spocs.length) {
const recommendations = [...data.recommendations];
for (let position of spocsConfig.positions) {
let rickRoll = Math.random();
if (spocs.data.spocs[spocIndex] && rickRoll <= spocsConfig.probability) {
recommendations.splice(position.index, 0, spocs.data.spocs[spocIndex++]);
}
}
return position;
});
return {
...data,
recommendations,
};
}
return data;
}
return layout.map(row => ({
@ -37,15 +45,7 @@ export const selectLayoutRender = createSelector(
return component;
}
// Calculate if we should display a spoc or not.
if (component.spocs && spocs.data.spocs && spocs.data.spocs.length) {
component.spocs = {
...component.spocs,
positions: calculateSpocs(component),
};
}
return {...component, data: feeds[component.feed.url].data};
return {...component, data: maybeInjectSpocs(feeds[component.feed.url].data, component.spocs)};
}),
}));
}

Просмотреть файл

@ -151,6 +151,7 @@ input {
@import '../components/DiscoveryStreamComponents/Hero/Hero';
@import '../components/DiscoveryStreamComponents/HorizontalRule/HorizontalRule';
@import '../components/DiscoveryStreamComponents/List/List';
@import '../components/DiscoveryStreamComponents/Navigation/Navigation';
@import '../components/DiscoveryStreamComponents/SectionTitle/SectionTitle';
@import '../components/DiscoveryStreamComponents/TopSites/TopSites';
@import '../components/DiscoveryStreamComponents/DSCard/DSCard';

Просмотреть файл

@ -1765,14 +1765,13 @@ main {
.more-recommendations:dir(rtl)::after {
transform: scaleX(-1); }
.outer-wrapper .discovery-stream.ds-layout a {
color: #0C0C0D; }
.discovery-stream.ds-layout {
--gridColumnGap: 48px;
--gridRowGap: 24px;
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-column-gap: 48px;
grid-row-gap: 10px;
grid-column-gap: var(--gridColumnGap);
grid-row-gap: var(--gridRowGap);
width: 936px;
margin: 0 auto; }
.discovery-stream.ds-layout .ds-column-12 {
@ -1811,9 +1810,14 @@ main {
.discovery-stream.ds-layout .ds-column-1 {
grid-column-start: auto;
grid-column-end: span 1; }
.discovery-stream.ds-layout .ds-column {
.discovery-stream.ds-layout .ds-column-grid {
display: grid;
grid-row-gap: 10px; }
grid-row-gap: var(--gridRowGap); }
.discovery-stream.ds-layout .ds-header {
font-size: 17px;
line-height: 24px;
color: #0C0C0D;
margin: 16px 0; }
.ds-card-grid {
display: grid; }
@ -1834,12 +1838,11 @@ main {
.ds-column-12 .ds-card-grid {
grid-template-columns: repeat(4, 1fr);
grid-gap: 24px; }
.ds-header {
font-size: 17px;
line-height: 24px;
color: #0C0C0D;
margin: 16px 0; }
.ds-column-9 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-10 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-3 {
grid-template-columns: repeat(3, 1fr); }
.ds-hero .img {
border: 0.5px solid rgba(0, 0, 0, 0.1);
@ -1881,6 +1884,8 @@ main {
color: #003EAA; }
.ds-hero .wrapper .meta p {
font-size: 13px; }
.ds-hero .wrapper .meta p.context {
color: #008EA4; }
.ds-column-5 .ds-hero .wrapper,
.ds-column-6 .ds-hero .wrapper,
@ -1947,14 +1952,6 @@ main {
grid-template-columns: repeat(4, 1fr);
grid-column-gap: 24px; }
.ds-list-title {
color: #0C0C0D;
margin-block-start: 0;
margin-block-end: 0;
padding: 8px 0;
line-height: 24px;
font-size: 17px; }
.ds-list-border {
border: 1px solid rgba(177, 177, 179, 0.36);
margin-block-start: 8px;
@ -1977,6 +1974,32 @@ main {
.ds-column-12 .ds-list {
grid-template-columns: repeat(3, 1fr);
grid-row-gap: 18px; }
.ds-list a {
color: #0C0C0D; }
.ds-list-images .ds-list-item .ds-list-image {
display: block; }
.ds-list-numbers .ds-list-item {
counter-increment: list; }
.ds-list-numbers .ds-list-item-link {
padding-inline-start: 43.5px; }
.ds-list-numbers .ds-list-item-link::before {
background-color: var(--newtab-link-secondary-color);
border-radius: 33px;
color: #FFF;
content: counter(list);
font-size: 1.2em;
height: 33px;
line-height: 33px;
margin-inline-start: -43.5px;
margin-top: 3.5px;
position: absolute;
text-align: center;
width: 33px; }
.ds-list-numbers .ds-list-item-link:hover::before {
background-color: var(--newtab-link-primary-color); }
.ds-list-item:nth-child(-n+3) {
border-bottom: 2px solid rgba(177, 177, 179, 0.36);
@ -2007,6 +2030,7 @@ main {
display: flex;
flex-direction: column; }
.ds-list-item .ds-list-image {
display: none;
width: 72px;
height: 72px;
object-fit: cover;
@ -2014,27 +2038,40 @@ main {
box-sizing: border-box;
border-radius: 4px; }
.ds-section-title ul {
.ds-navigation.ds-navigation-centered {
text-align: center; }
.ds-navigation.ds-navigation-right-aligned {
text-align: end; }
.ds-navigation ul {
margin: 0;
padding: 0; }
.ds-section-title ul li {
.ds-navigation ul li {
display: inline-block; }
.ds-section-title ul li::after {
.ds-navigation ul li::after {
content: '•';
padding: 8px; }
.ds-section-title ul li:last-child::after {
.ds-navigation ul li:last-child::after {
content: none; }
.ds-navigation ul li a:hover {
border-bottom: 1px solid var(--newtab-link-primary-color); }
.ds-navigation ul li a:hover:active, .ds-navigation ul li a:hover:visited {
border-bottom: 1px solid #003EAA; }
.ds-navigation ul li a:active, .ds-navigation ul li a:visited {
color: #003EAA; }
.ds-section-title .ds-more-recommendations::after {
background: url("../data/content/assets/topic-show-more-12.svg") no-repeat center center;
content: '';
-moz-context-properties: fill;
display: inline-block;
height: 16px;
margin-inline-start: 5px;
vertical-align: top;
width: 12px; }
.ds-section-title {
text-align: center; }
.ds-section-title .title {
line-height: 48px;
font-size: 36px;
color: #0C0C0D; }
.ds-section-title .subtitle {
line-height: 24px;
font-size: 15px;
color: #737373; }
.ds-top-sites .top-sites {
padding: 0; }
@ -2118,6 +2155,10 @@ main {
border: 5px solid #D7D7DB;
box-shadow: 0 1px 4px #D7D7DB;
border-radius: 4px; }
.ds-card:hover header {
color: #0060DF; }
.ds-card:active header {
color: #003EAA; }
.ds-card .img-wrapper {
width: 100%;
border: 0.5px solid rgba(0, 0, 0, 0.1);
@ -2139,15 +2180,13 @@ main {
line-height: 24px;
font-size: 17px;
color: #0C0C0D; }
.ds-card header:hover {
color: #0060DF; }
.ds-card header:active {
color: #003EAA; }
.ds-card p {
font-size: 13px;
line-height: 20px;
color: #737373;
margin: 8px 0; }
.ds-card .context {
color: #008EA4; }
.ASRouterButton {
font-weight: 600;

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -1768,14 +1768,13 @@ main {
.more-recommendations:dir(rtl)::after {
transform: scaleX(-1); }
.outer-wrapper .discovery-stream.ds-layout a {
color: #0C0C0D; }
.discovery-stream.ds-layout {
--gridColumnGap: 48px;
--gridRowGap: 24px;
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-column-gap: 48px;
grid-row-gap: 10px;
grid-column-gap: var(--gridColumnGap);
grid-row-gap: var(--gridRowGap);
width: 936px;
margin: 0 auto; }
.discovery-stream.ds-layout .ds-column-12 {
@ -1814,9 +1813,14 @@ main {
.discovery-stream.ds-layout .ds-column-1 {
grid-column-start: auto;
grid-column-end: span 1; }
.discovery-stream.ds-layout .ds-column {
.discovery-stream.ds-layout .ds-column-grid {
display: grid;
grid-row-gap: 10px; }
grid-row-gap: var(--gridRowGap); }
.discovery-stream.ds-layout .ds-header {
font-size: 17px;
line-height: 24px;
color: #0C0C0D;
margin: 16px 0; }
.ds-card-grid {
display: grid; }
@ -1837,12 +1841,11 @@ main {
.ds-column-12 .ds-card-grid {
grid-template-columns: repeat(4, 1fr);
grid-gap: 24px; }
.ds-header {
font-size: 17px;
line-height: 24px;
color: #0C0C0D;
margin: 16px 0; }
.ds-column-9 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-10 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-3 {
grid-template-columns: repeat(3, 1fr); }
.ds-hero .img {
border: 0.5px solid rgba(0, 0, 0, 0.1);
@ -1884,6 +1887,8 @@ main {
color: #003EAA; }
.ds-hero .wrapper .meta p {
font-size: 13px; }
.ds-hero .wrapper .meta p.context {
color: #008EA4; }
.ds-column-5 .ds-hero .wrapper,
.ds-column-6 .ds-hero .wrapper,
@ -1950,14 +1955,6 @@ main {
grid-template-columns: repeat(4, 1fr);
grid-column-gap: 24px; }
.ds-list-title {
color: #0C0C0D;
margin-block-start: 0;
margin-block-end: 0;
padding: 8px 0;
line-height: 24px;
font-size: 17px; }
.ds-list-border {
border: 1px solid rgba(177, 177, 179, 0.36);
margin-block-start: 8px;
@ -1980,6 +1977,32 @@ main {
.ds-column-12 .ds-list {
grid-template-columns: repeat(3, 1fr);
grid-row-gap: 18px; }
.ds-list a {
color: #0C0C0D; }
.ds-list-images .ds-list-item .ds-list-image {
display: block; }
.ds-list-numbers .ds-list-item {
counter-increment: list; }
.ds-list-numbers .ds-list-item-link {
padding-inline-start: 43.5px; }
.ds-list-numbers .ds-list-item-link::before {
background-color: var(--newtab-link-secondary-color);
border-radius: 33px;
color: #FFF;
content: counter(list);
font-size: 1.2em;
height: 33px;
line-height: 33px;
margin-inline-start: -43.5px;
margin-top: 3.5px;
position: absolute;
text-align: center;
width: 33px; }
.ds-list-numbers .ds-list-item-link:hover::before {
background-color: var(--newtab-link-primary-color); }
.ds-list-item:nth-child(-n+3) {
border-bottom: 2px solid rgba(177, 177, 179, 0.36);
@ -2010,6 +2033,7 @@ main {
display: flex;
flex-direction: column; }
.ds-list-item .ds-list-image {
display: none;
width: 72px;
height: 72px;
object-fit: cover;
@ -2017,27 +2041,40 @@ main {
box-sizing: border-box;
border-radius: 4px; }
.ds-section-title ul {
.ds-navigation.ds-navigation-centered {
text-align: center; }
.ds-navigation.ds-navigation-right-aligned {
text-align: end; }
.ds-navigation ul {
margin: 0;
padding: 0; }
.ds-section-title ul li {
.ds-navigation ul li {
display: inline-block; }
.ds-section-title ul li::after {
.ds-navigation ul li::after {
content: '•';
padding: 8px; }
.ds-section-title ul li:last-child::after {
.ds-navigation ul li:last-child::after {
content: none; }
.ds-navigation ul li a:hover {
border-bottom: 1px solid var(--newtab-link-primary-color); }
.ds-navigation ul li a:hover:active, .ds-navigation ul li a:hover:visited {
border-bottom: 1px solid #003EAA; }
.ds-navigation ul li a:active, .ds-navigation ul li a:visited {
color: #003EAA; }
.ds-section-title .ds-more-recommendations::after {
background: url("../data/content/assets/topic-show-more-12.svg") no-repeat center center;
content: '';
-moz-context-properties: fill;
display: inline-block;
height: 16px;
margin-inline-start: 5px;
vertical-align: top;
width: 12px; }
.ds-section-title {
text-align: center; }
.ds-section-title .title {
line-height: 48px;
font-size: 36px;
color: #0C0C0D; }
.ds-section-title .subtitle {
line-height: 24px;
font-size: 15px;
color: #737373; }
.ds-top-sites .top-sites {
padding: 0; }
@ -2121,6 +2158,10 @@ main {
border: 5px solid #D7D7DB;
box-shadow: 0 1px 4px #D7D7DB;
border-radius: 4px; }
.ds-card:hover header {
color: #0060DF; }
.ds-card:active header {
color: #003EAA; }
.ds-card .img-wrapper {
width: 100%;
border: 0.5px solid rgba(0, 0, 0, 0.1);
@ -2142,15 +2183,13 @@ main {
line-height: 24px;
font-size: 17px;
color: #0C0C0D; }
.ds-card header:hover {
color: #0060DF; }
.ds-card header:active {
color: #003EAA; }
.ds-card p {
font-size: 13px;
line-height: 20px;
color: #737373;
margin: 8px 0; }
.ds-card .context {
color: #008EA4; }
.ASRouterButton {
font-weight: 600;

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -1765,14 +1765,13 @@ main {
.more-recommendations:dir(rtl)::after {
transform: scaleX(-1); }
.outer-wrapper .discovery-stream.ds-layout a {
color: #0C0C0D; }
.discovery-stream.ds-layout {
--gridColumnGap: 48px;
--gridRowGap: 24px;
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-column-gap: 48px;
grid-row-gap: 10px;
grid-column-gap: var(--gridColumnGap);
grid-row-gap: var(--gridRowGap);
width: 936px;
margin: 0 auto; }
.discovery-stream.ds-layout .ds-column-12 {
@ -1811,9 +1810,14 @@ main {
.discovery-stream.ds-layout .ds-column-1 {
grid-column-start: auto;
grid-column-end: span 1; }
.discovery-stream.ds-layout .ds-column {
.discovery-stream.ds-layout .ds-column-grid {
display: grid;
grid-row-gap: 10px; }
grid-row-gap: var(--gridRowGap); }
.discovery-stream.ds-layout .ds-header {
font-size: 17px;
line-height: 24px;
color: #0C0C0D;
margin: 16px 0; }
.ds-card-grid {
display: grid; }
@ -1834,12 +1838,11 @@ main {
.ds-column-12 .ds-card-grid {
grid-template-columns: repeat(4, 1fr);
grid-gap: 24px; }
.ds-header {
font-size: 17px;
line-height: 24px;
color: #0C0C0D;
margin: 16px 0; }
.ds-column-9 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-10 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-3,
.ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-3 {
grid-template-columns: repeat(3, 1fr); }
.ds-hero .img {
border: 0.5px solid rgba(0, 0, 0, 0.1);
@ -1881,6 +1884,8 @@ main {
color: #003EAA; }
.ds-hero .wrapper .meta p {
font-size: 13px; }
.ds-hero .wrapper .meta p.context {
color: #008EA4; }
.ds-column-5 .ds-hero .wrapper,
.ds-column-6 .ds-hero .wrapper,
@ -1947,14 +1952,6 @@ main {
grid-template-columns: repeat(4, 1fr);
grid-column-gap: 24px; }
.ds-list-title {
color: #0C0C0D;
margin-block-start: 0;
margin-block-end: 0;
padding: 8px 0;
line-height: 24px;
font-size: 17px; }
.ds-list-border {
border: 1px solid rgba(177, 177, 179, 0.36);
margin-block-start: 8px;
@ -1977,6 +1974,32 @@ main {
.ds-column-12 .ds-list {
grid-template-columns: repeat(3, 1fr);
grid-row-gap: 18px; }
.ds-list a {
color: #0C0C0D; }
.ds-list-images .ds-list-item .ds-list-image {
display: block; }
.ds-list-numbers .ds-list-item {
counter-increment: list; }
.ds-list-numbers .ds-list-item-link {
padding-inline-start: 43.5px; }
.ds-list-numbers .ds-list-item-link::before {
background-color: var(--newtab-link-secondary-color);
border-radius: 33px;
color: #FFF;
content: counter(list);
font-size: 1.2em;
height: 33px;
line-height: 33px;
margin-inline-start: -43.5px;
margin-top: 3.5px;
position: absolute;
text-align: center;
width: 33px; }
.ds-list-numbers .ds-list-item-link:hover::before {
background-color: var(--newtab-link-primary-color); }
.ds-list-item:nth-child(-n+3) {
border-bottom: 2px solid rgba(177, 177, 179, 0.36);
@ -2007,6 +2030,7 @@ main {
display: flex;
flex-direction: column; }
.ds-list-item .ds-list-image {
display: none;
width: 72px;
height: 72px;
object-fit: cover;
@ -2014,27 +2038,40 @@ main {
box-sizing: border-box;
border-radius: 4px; }
.ds-section-title ul {
.ds-navigation.ds-navigation-centered {
text-align: center; }
.ds-navigation.ds-navigation-right-aligned {
text-align: end; }
.ds-navigation ul {
margin: 0;
padding: 0; }
.ds-section-title ul li {
.ds-navigation ul li {
display: inline-block; }
.ds-section-title ul li::after {
.ds-navigation ul li::after {
content: '•';
padding: 8px; }
.ds-section-title ul li:last-child::after {
.ds-navigation ul li:last-child::after {
content: none; }
.ds-navigation ul li a:hover {
border-bottom: 1px solid var(--newtab-link-primary-color); }
.ds-navigation ul li a:hover:active, .ds-navigation ul li a:hover:visited {
border-bottom: 1px solid #003EAA; }
.ds-navigation ul li a:active, .ds-navigation ul li a:visited {
color: #003EAA; }
.ds-section-title .ds-more-recommendations::after {
background: url("../data/content/assets/topic-show-more-12.svg") no-repeat center center;
content: '';
-moz-context-properties: fill;
display: inline-block;
height: 16px;
margin-inline-start: 5px;
vertical-align: top;
width: 12px; }
.ds-section-title {
text-align: center; }
.ds-section-title .title {
line-height: 48px;
font-size: 36px;
color: #0C0C0D; }
.ds-section-title .subtitle {
line-height: 24px;
font-size: 15px;
color: #737373; }
.ds-top-sites .top-sites {
padding: 0; }
@ -2118,6 +2155,10 @@ main {
border: 5px solid #D7D7DB;
box-shadow: 0 1px 4px #D7D7DB;
border-radius: 4px; }
.ds-card:hover header {
color: #0060DF; }
.ds-card:active header {
color: #003EAA; }
.ds-card .img-wrapper {
width: 100%;
border: 0.5px solid rgba(0, 0, 0, 0.1);
@ -2139,15 +2180,13 @@ main {
line-height: 24px;
font-size: 17px;
color: #0C0C0D; }
.ds-card header:hover {
color: #0060DF; }
.ds-card header:active {
color: #003EAA; }
.ds-card p {
font-size: 13px;
line-height: 20px;
color: #737373;
margin: 8px 0; }
.ds-card .context {
color: #008EA4; }
.ASRouterButton {
font-weight: 600;

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -2567,7 +2567,7 @@ class DiscoveryStreamAdmin extends react__WEBPACK_IMPORTED_MODULE_4___default.a.
react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(
"td",
null,
relativeTime(feeds[feed.url].lastUpdated) || "(no data)"
relativeTime(feeds[feed.url] ? feeds[feed.url].lastUpdated : null) || "(no data)"
)
)
);
@ -7090,7 +7090,11 @@ class DSCard_DSCard extends external_React_default.a.PureComponent {
{ className: "excerpt" },
this.props.excerpt
),
external_React_default.a.createElement(
this.props.context ? external_React_default.a.createElement(
"p",
{ className: "context" },
this.props.context
) : external_React_default.a.createElement(
"p",
{ className: "source" },
this.props.source
@ -7116,18 +7120,36 @@ class CardGrid_CardGrid extends external_React_default.a.PureComponent {
key: `dscard-${index}`,
image_src: rec.image_src,
title: rec.title,
excerpt: rec.title,
excerpt: rec.excerpt,
url: rec.url,
id: rec.id,
index: index,
type: this.props.type,
context: rec.context,
dispatch: this.props.dispatch,
source: rec.domain }));
let divisibility = ``;
if (this.props.items % 4 === 0) {
divisibility = `divisible-by-4`;
} else if (this.props.items % 3 === 0) {
divisibility = `divisible-by-3`;
}
return external_React_default.a.createElement(
"div",
{ className: "ds-card-grid" },
cards
null,
external_React_default.a.createElement(
"div",
{ className: "ds-header" },
this.props.title
),
external_React_default.a.createElement(
"div",
{ className: `ds-card-grid ds-card-grid-${divisibility}` },
cards
)
);
}
}
@ -7188,6 +7210,7 @@ class Hero_Hero extends external_React_default.a.PureComponent {
index: index + 1,
type: this.props.type,
dispatch: this.props.dispatch,
context: truncateText(rec.context || "", 22),
source: truncateText(`TODO: SOURCE`, 22) }));
return external_React_default.a.createElement(
@ -7222,7 +7245,11 @@ class Hero_Hero extends external_React_default.a.PureComponent {
null,
truncateText(heroRec.excerpt, 114)
),
external_React_default.a.createElement(
heroRec.context ? external_React_default.a.createElement(
"p",
{ className: "context" },
truncateText(heroRec.context, 22)
) : external_React_default.a.createElement(
"p",
null,
truncateText(`TODO: SOURCE`, 22)
@ -7334,32 +7361,35 @@ function _List(props) {
let recMarkup = recs.slice(0, props.items).map((rec, index) => external_React_default.a.createElement(List_ListItem, _extends({}, rec, { key: `ds-list-item-${index}`, index: index, type: props.type, dispatch: props.dispatch })));
const listStyles = ["ds-list", props.hasImages ? "ds-list-images" : "", props.hasNumbers ? "ds-list-numbers" : ""];
return external_React_default.a.createElement(
"div",
null,
external_React_default.a.createElement(
"h3",
{ className: "ds-list-title" },
props.header && props.header.title
),
props.header && props.header.title ? external_React_default.a.createElement(
"div",
{ className: "ds-header" },
props.header.title
) : null,
external_React_default.a.createElement("hr", { className: "ds-list-border" }),
external_React_default.a.createElement(
"ul",
{ className: "ds-list" },
{ className: listStyles.join(" ") },
recMarkup
)
);
}
_List.defaultProps = {
hasImages: false, // Display images for each item
hasNumbers: false, // Display numbers for each item
items: 6 // Number of stories to display. TODO: get from endpoint
};
const List = Object(external_ReactRedux_["connect"])(state => ({ DiscoveryStream: state.DiscoveryStream }))(_List);
// CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/SectionTitle/SectionTitle.jsx
// CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/Navigation/Navigation.jsx
class SectionTitle_Topic extends external_React_default.a.PureComponent {
class Navigation_Topic extends external_React_default.a.PureComponent {
render() {
const { url, name } = this.props;
return external_React_default.a.createElement(
@ -7374,29 +7404,43 @@ class SectionTitle_Topic extends external_React_default.a.PureComponent {
}
}
class SectionTitle_SectionTitle extends external_React_default.a.PureComponent {
class Navigation_Navigation extends external_React_default.a.PureComponent {
render() {
const { topics } = this.props;
const { links } = this.props || [];
const { alignment } = this.props || "centered";
return external_React_default.a.createElement(
"span",
{ className: "ds-section-title" },
{ className: `ds-navigation ds-navigation-${alignment}` },
external_React_default.a.createElement(
"ul",
null,
topics && topics.map(t => external_React_default.a.createElement(SectionTitle_Topic, { key: t.name, url: t.url, name: t.name })),
external_React_default.a.createElement(
"li",
null,
external_React_default.a.createElement(
"a",
{ className: "ds-more-recommendations" },
"More Recommendations"
)
)
links && links.map(t => external_React_default.a.createElement(Navigation_Topic, { key: t.name, url: t.url, name: t.name }))
)
);
}
}
// CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/SectionTitle/SectionTitle.jsx
class SectionTitle_SectionTitle extends external_React_default.a.PureComponent {
render() {
const { header: { title, subtitle } } = this.props;
return external_React_default.a.createElement(
"div",
{ className: "ds-section-title" },
external_React_default.a.createElement(
"div",
{ className: "title" },
title
),
subtitle ? external_React_default.a.createElement(
"div",
{ className: "subtitle" },
subtitle
) : null
);
}
}
// CONCATENATED MODULE: ./node_modules/reselect/es/index.js
function defaultEqualityCheck(a, b) {
return a === b;
@ -7531,16 +7575,22 @@ const selectLayoutRender = createSelector(
function layoutRender(layout, feeds, spocs) {
let spocIndex = 0;
function calculateSpocs(component) {
return component.spocs.positions.map(position => {
const rickRoll = Math.random();
if (spocs.data.spocs[spocIndex] && rickRoll <= component.spocs.probability) {
return Object.assign({}, position, {
result: spocs.data.spocs[spocIndex++]
});
function maybeInjectSpocs(data, spocsConfig) {
if (data && spocsConfig && spocsConfig.positions && spocsConfig.positions.length && spocs.data.spocs && spocs.data.spocs.length) {
const recommendations = [...data.recommendations];
for (let position of spocsConfig.positions) {
let rickRoll = Math.random();
if (spocs.data.spocs[spocIndex] && rickRoll <= spocsConfig.probability) {
recommendations.splice(position.index, 0, spocs.data.spocs[spocIndex++]);
}
}
return position;
});
return Object.assign({}, data, {
recommendations
});
}
return data;
}
return layout.map(row => Object.assign({}, row, {
@ -7552,14 +7602,7 @@ function layoutRender(layout, feeds, spocs) {
return component;
}
// Calculate if we should display a spoc or not.
if (component.spocs && spocs.data.spocs && spocs.data.spocs.length) {
component.spocs = Object.assign({}, component.spocs, {
positions: calculateSpocs(component)
});
}
return Object.assign({}, component, { data: feeds[component.feed.url].data });
return Object.assign({}, component, { data: maybeInjectSpocs(feeds[component.feed.url].data, component.spocs) });
})
}));
});
@ -7573,9 +7616,20 @@ var TopSites = __webpack_require__(30);
class TopSites_TopSites extends external_React_default.a.PureComponent {
render() {
const header = this.props.header || {};
return external_React_default.a.createElement(
"div",
{ className: "ds-top-sites" },
header.title ? external_React_default.a.createElement(
"div",
{ className: "ds-header" },
external_React_default.a.createElement("span", { className: "icon icon-small-spacer icon-topsites" }),
external_React_default.a.createElement(
"span",
null,
header.title
)
) : null,
external_React_default.a.createElement(TopSites["TopSites"], null)
);
}
@ -7597,6 +7651,7 @@ const TopSites_TopSites_TopSites = Object(external_ReactRedux_["connect"])(state
// According to the Pocket API endpoint specs, `component.properties.items` is a required property with following values:
// - List 1-6 items
// - Hero 1-5 items
@ -7626,32 +7681,22 @@ function isAllowedCSS(property, value) {
return !urls || urls.every(url => ALLOWED_CSS_URL_PREFIXES.some(prefix => url.slice(5).startsWith(prefix)));
}
function maybeInjectSpocs(data, spocs) {
if (!data || !spocs || !spocs.positions || !spocs.positions.length) {
return data;
}
const recommendations = [...data.recommendations];
for (let position of spocs.positions) {
const { result } = position;
if (result) {
// Insert spoc into the desired index.
recommendations.splice(position.index, 0, result);
}
}
return Object.assign({}, data, {
recommendations
});
}
class DiscoveryStreamBase_DiscoveryStreamBase extends external_React_default.a.PureComponent {
constructor(props) {
super(props);
this.onStyleMount = this.onStyleMount.bind(this);
}
/**
* Extracts the recommendation rows from component for the impression ping.
* If `component.data.recommendations` is unset, returns an empty array.
*
* The row size is determined by the following rules:
* - Use `component.properties.items` from the endpoint if it's specified
* - Otherwise, use the length of recommendation array
* - The row size is capped by the argument `limit`, which could be one of
* [`MAX_ROW_HERO`, `MAX_ROWS_LIST`, `MAX_ROWS_CARDGRID`]
*/
extractRows(component, limit) {
if (component.data && component.data.recommendations) {
const items = Math.min(limit, component.properties.items || component.data.recommendations.length);
@ -7693,7 +7738,7 @@ class DiscoveryStreamBase_DiscoveryStreamBase extends external_React_default.a.P
});
// Set the actual desired selectors scoped to the component
const prefix = `.ds-layout > .ds-column:nth-child(${rowIndex + 1}) > :nth-child(${componentIndex + 1})`;
const prefix = `.ds-layout > .ds-column:nth-child(${rowIndex + 1}) .ds-column-grid > :nth-child(${componentIndex + 1})`;
// NB: Splitting on "," doesn't work with strings with commas, but
// we're okay with not supporting those selectors
rule.selectorText = selectors.split(",").map(selector => prefix + (
@ -7714,9 +7759,14 @@ class DiscoveryStreamBase_DiscoveryStreamBase extends external_React_default.a.P
switch (component.type) {
case "TopSites":
return external_React_default.a.createElement(TopSites_TopSites_TopSites, null);
return external_React_default.a.createElement(TopSites_TopSites_TopSites, { header: component.header });
case "SectionTitle":
return external_React_default.a.createElement(SectionTitle_SectionTitle, null);
return external_React_default.a.createElement(SectionTitle_SectionTitle, {
header: component.header });
case "Navigation":
return external_React_default.a.createElement(Navigation_Navigation, {
links: component.properties.links,
alignment: component.properties.alignment });
case "CardGrid":
rows = this.extractRows(component, MAX_ROWS_CARDGRID);
return external_React_default.a.createElement(
@ -7724,7 +7774,7 @@ class DiscoveryStreamBase_DiscoveryStreamBase extends external_React_default.a.P
{ rows: rows, dispatch: this.props.dispatch, source: component.type },
external_React_default.a.createElement(CardGrid_CardGrid, {
title: component.header && component.header.title,
data: maybeInjectSpocs(component.data, component.spocs),
data: component.data,
feed: component.feed,
border: component.properties.border,
type: component.type,
@ -7738,7 +7788,7 @@ class DiscoveryStreamBase_DiscoveryStreamBase extends external_React_default.a.P
{ rows: rows, dispatch: this.props.dispatch, source: component.type },
external_React_default.a.createElement(Hero_Hero, {
title: component.header && component.header.title,
data: maybeInjectSpocs(component.data, component.spocs),
data: component.data,
border: component.properties.border,
type: component.type,
dispatch: this.props.dispatch,
@ -7747,12 +7797,14 @@ class DiscoveryStreamBase_DiscoveryStreamBase extends external_React_default.a.P
case "HorizontalRule":
return external_React_default.a.createElement(HorizontalRule_HorizontalRule, null);
case "List":
rows = this.extractRows(component, Math.min(component.properties.items, MAX_ROWS_LIST));
rows = this.extractRows(component, MAX_ROWS_LIST);
return external_React_default.a.createElement(
ImpressionStats["ImpressionStats"],
{ rows: rows, dispatch: this.props.dispatch, source: component.type },
external_React_default.a.createElement(List, {
feed: component.feed,
hasImages: component.properties.has_images,
hasNumbers: component.properties.has_numbers,
items: component.properties.items,
type: component.type,
header: component.header })
@ -7782,14 +7834,18 @@ class DiscoveryStreamBase_DiscoveryStreamBase extends external_React_default.a.P
layoutRender.map((row, rowIndex) => external_React_default.a.createElement(
"div",
{ key: `row-${rowIndex}`, className: `ds-column ds-column-${row.width}` },
row.components.map((component, componentIndex) => {
styles[rowIndex] = [...(styles[rowIndex] || []), component.styles];
return external_React_default.a.createElement(
"div",
{ key: `component-${componentIndex}` },
this.renderComponent(component)
);
})
external_React_default.a.createElement(
"div",
{ className: "ds-column-grid" },
row.components.map((component, componentIndex) => {
styles[rowIndex] = [...(styles[rowIndex] || []), component.styles];
return external_React_default.a.createElement(
"div",
{ key: `component-${componentIndex}` },
this.renderComponent(component)
);
})
)
)),
this.renderStyles(styles)
);

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=Entesos
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Contingut d'inici del Firefox
prefs_home_description=Trieu el contingut que voleu a la pantalla d'inici del Firefox.
prefs_content_discovery_header=Inici del Firefox
prefs_content_discovery_description=El descobriment de contingut en la pàgina d'inici del Firefox us permet descobrir articles de gran qualitat i rellevants de tot el web.
prefs_content_discovery_button=Desactiva el descobriment de contingut
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals

Просмотреть файл

@ -91,6 +91,9 @@ section_disclaimer_topstories_buttontext=Ok, rozumím
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Obsah domovské stránky Firefoxu
prefs_home_description=Vyberte obsah, který chcete mít na výchozí domovské stránce Firefoxu.
prefs_content_discovery_header=Domovská stránka Firefoxu
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=W pórěźe, som zrozměł
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Wopśimjeśe startowego boka Firefox
prefs_home_description=Wubjeŕśo, kótare wopśimjeśe cośo na swójej startowej wobrazowce Firefox měś.
prefs_content_discovery_header=Startowy bok Firefox
prefs_content_discovery_description=Content Discovery na startowem boku Firefox wam zmóžnja, w interneśe relewantne nastawki wusokeje kwality namakaś.
prefs_content_discovery_button=Content Discovery znjemóžniś
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +149,6 @@ pocket_read_more=Woblubowane temy:
# end of the list of popular topic links.
pocket_read_even_more=Dalšne powěźeńki se woglědaś
pocket_more_reccommendations=Dalšne pórucenja
pocket_learn_more=Dalšne informacije
pocket_how_it_works=Kak funkcioněrujo
pocket_cta_button=Pocket wobstaraś
pocket_cta_text=Składujśo tšojeńka, kótarež se wam spódobuju, w Pocket a žywśo swój duch z fasciněrujucymi cytańkami.

Просмотреть файл

@ -73,7 +73,7 @@ search_header=Serĉo de {search_engine_name}
# LOCALIZATION NOTE (search_web_placeholder): This is shown in the searchbox when
# the user hasn't typed anything yet.
search_web_placeholder=Serĉi la reton
search_web_placeholder=Serĉi en la teksaĵo
# LOCALIZATION NOTE (section_disclaimer_topstories): This is shown below
# the topstories section title to provide additional information about
@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=En ordo, mi komprenis
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Enhavo de la hejmekrano de Firefox
prefs_home_description=Elektu la enhavon, kiun vi volas en via hejmekrano de Firefox.
prefs_content_discovery_header=Eka paĝo de Firefox
prefs_content_discovery_description=Malkovro de enhavo en la eka paĝo de Firefox permesas al vi trovi altkvalitajn elstarajn artikolojn el la tuta teksaĵo.
prefs_content_discovery_button=Malaktivigi malkovron de enhavo
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +149,6 @@ pocket_read_more=Ĉefaj temoj:
# end of the list of popular topic links.
pocket_read_even_more=Montri pli da artikoloj
pocket_more_reccommendations=Pli da rekomendoj
pocket_learn_more=Pli da informo
pocket_how_it_works=Kiel funkcias tio
pocket_cta_button=Instali Pocket
pocket_cta_text=Konservu viajn ŝatatajn artikolojn en Pocket, kaj stimulu vian menson per ravaj legaĵoj.

Просмотреть файл

@ -91,6 +91,10 @@ section_disclaimer_topstories_buttontext=Ok, entendido
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Contenido de la página de inicio de Firefox
prefs_home_description=Seleccione el contenido que desea en la pantalla de inicio de Firefox.
prefs_content_discovery_header=Página de inicio de Firefox
prefs_content_discovery_button=Desactivar Content Discovery
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +148,6 @@ pocket_read_more=Temas populares:
# end of the list of popular topic links.
pocket_read_even_more=Ver más historias
pocket_more_reccommendations=Más recomendaciones
pocket_learn_more=Saber más
pocket_how_it_works=Cómo funciona
pocket_cta_button=Obtener Pocket
pocket_cta_text=Guarde en Pocket las historias que le gustan y alimente su mente con lecturas fascinantes.

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=Ulertuta
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Firefoxen hasiera-orriko edukia
prefs_home_description=Aukeratu zein eduki nahi duzun Firefoxen hasiera-orriko pantailan.
prefs_content_discovery_header=Firefoxen hasiera
prefs_content_discovery_description=Firefoxen hasierako edukien aurkikuntzaren bidez kalitate altuko artikulu esanguratsuak aurki ditzakezu webean.
prefs_content_discovery_button=Desgaitu edukien aurkikuntza
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals

Просмотреть файл

@ -91,6 +91,9 @@ section_disclaimer_topstories_buttontext=Jai compris
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Contenu de la page daccueil de Firefox
prefs_home_description=Choisissez le contenu que vous souhaitez pour la page daccueil de Firefox.
prefs_content_discovery_header=Page daccueil de Firefox
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +147,6 @@ pocket_read_more=Sujets populaires :
# end of the list of popular topic links.
pocket_read_even_more=Afficher plus darticles
pocket_more_reccommendations=Plus de recommandations
pocket_learn_more=En savoir plus
pocket_how_it_works=Mode d'emploi
pocket_cta_button=Installer Pocket
pocket_cta_text=Enregistrez les articles que vous aimez dans Pocket, et stimulez votre imagination avec des lectures fascinantes.

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=בסדר, הבנתי
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=תוכן מסך הבית של Firefox
prefs_home_description=בחירת תוכן שיוצג במסך הבית של Firefox.
prefs_content_discovery_header=מסך הבית של Firefox
prefs_content_discovery_description=גילוי תוכן במסך הבית של Firefox מאפשר לך לגלות מאמרים רלוונטים ובאיכות גבוהה מכל רחבי הרשת.
prefs_content_discovery_button=השבתת גילוי תוכן
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +149,6 @@ pocket_read_more=נושאים פופולריים:
# end of the list of popular topic links.
pocket_read_even_more=צפייה בחדשות נוספות
pocket_more_reccommendations=המלצות נוספות
pocket_learn_more=מידע נוסף
pocket_how_it_works=איך זה עובד
pocket_cta_button=קבלת Pocket

Просмотреть файл

@ -91,6 +91,9 @@ section_disclaimer_topstories_buttontext=ठीक है, समझ गए
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Firefox होम सामग्री
prefs_home_description=चुनें जो सामग्री आप अपने Firefox होम स्क्रीन पर चाहते हैं ।
prefs_content_discovery_header=Firefox मुखपृष्ठ
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=W porjadku, sym zrozumił
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Wobsah startoweje strony Firefox
prefs_home_description=Wubjerće, kotry wobsah chceće na swojej startowej wobrazowce Firefox měć.
prefs_content_discovery_header=Startowa strona Firefox
prefs_content_discovery_description=Content Discovery na startowej stronje Firefox wam zmóžnja, w interneće relewantne nastawki wysokeje kwality namakać.
prefs_content_discovery_button=Content Discovery znjemóžnić
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +149,6 @@ pocket_read_more=Woblubowane temy:
# end of the list of popular topic links.
pocket_read_even_more=Dalše zdźělenki sej wobhladać
pocket_more_reccommendations=Dalše doporučenja
pocket_learn_more=Dalše informacije
pocket_how_it_works=Kak funguje
pocket_cta_button=Pocket wobstarać
pocket_cta_text=Składujće stawizny, kotrež so wam spodobuja, w Pocket a žiwće swój duch z fascinowacymi čitančkami.

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=Ok, io comprende
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Pagina initial de Firefox
prefs_home_description=Elige qual contento tu desira pro tu pagina initial de Firefox.
prefs_content_discovery_header=Pagina initial de Firefox
prefs_content_discovery_description=Content Discovery in Firefox Home te consenti de discoperir articulos pertinente, de alte qualitate, in le Web.
prefs_content_discovery_button=Clauder Content Discovery
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals

Просмотреть файл

@ -91,6 +91,9 @@ section_disclaimer_topstories_buttontext=Ih, awi-t-id
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Agbur agejdan Firefox
prefs_home_description=Fren agbur i tebɣiḍ deg ugdil agejdan Firefox.
prefs_content_discovery_header=Asebter agejdan Firefox
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +147,6 @@ pocket_read_more=Isental ittwasnen aṭas:
# end of the list of popular topic links.
pocket_read_even_more=Wali ugar n teqsiḍin
pocket_more_reccommendations=Ugar n iwellihen
pocket_learn_more=Issin ugar
pocket_how_it_works=Amek iteddu
pocket_cta_button=Awi-d Pocket
pocket_cta_text=Sekles tiqṣiḍin i tḥemmleḍ deg Pocket, sedhu allaɣ-ik s tɣuri ifazen.

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=Gerai, supratau
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=„Firefox“ pradžios turinys
prefs_home_description=Pasirinkite, kokį turinį norite matyti „Firefox“ pradžios ekrane
prefs_content_discovery_header=„Firefox“ pradžios tinklalapis
prefs_content_discovery_description=„Firefox“ turinio atradimas pradžios tinklalapyje leidžia atrasti aukštos kokybės ir jums galimai įdomius straipsnius iš interneto.
prefs_content_discovery_button=Išjungti turinio atradimą
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +149,6 @@ pocket_read_more=Populiarios temos:
# end of the list of popular topic links.
pocket_read_even_more=Rodyti daugiau straipsnių
pocket_more_reccommendations=Daugiau rekomendacijų
pocket_learn_more=Sužinoti daugiau
pocket_how_it_works=Kaip tai veikia
pocket_cta_button=Gauti „Pocket“
pocket_cta_text=Išsaugokite patinkančius straipsnius į „Pocket“, bei sužadinkite savo mintis stulbinančiomis istorijomis.

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=Ok, entendi
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Conteúdo inicial do Firefox
prefs_home_description=Escolha que conteúdo você quer na sua tela inicial do Firefox.
prefs_content_discovery_header=Página inicial do Firefox
prefs_content_discovery_description=A descoberta de conteúdo na página inicial do Firefox permite descobrir artigos relevantes, de alta qualidade, pela web afora.
prefs_content_discovery_button=Desativar descoberta de conteúdo
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +149,6 @@ pocket_read_more=Tópicos populares:
# end of the list of popular topic links.
pocket_read_even_more=Ver mais histórias
pocket_more_reccommendations=Mais recomendações
pocket_learn_more=Saiba mais
pocket_how_it_works=Como funciona
pocket_cta_button=Adicionar o Pocket
pocket_cta_text=Salve as histórias que você gosta no Pocket e abasteça sua mente com leituras fascinantes.

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=Ок, понятно
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Домашняя страница Firefox
prefs_home_description=Выберите, какое содержимое вы хотите видеть на домашней странице Firefox.
prefs_content_discovery_header=Домашняя страница Firefox
prefs_content_discovery_description=Обнаружение содержимого на домашней странице Firefox позволит вам находить высококачественные релевантные статьи со всего Интернета.
prefs_content_discovery_button=Отключить обнаружение содержимого
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +149,6 @@ pocket_read_more=Популярные темы:
# end of the list of popular topic links.
pocket_read_even_more=Больше статей
pocket_more_reccommendations=Ещё рекомендации
pocket_learn_more=Подробнее
pocket_how_it_works=Как это работает
pocket_cta_button=Загрузить Pocket
pocket_cta_text=Сохраняйте интересные статьи в Pocket и подпитывайте свой ум увлекательным чтением.

Просмотреть файл

@ -91,6 +91,11 @@ section_disclaimer_topstories_buttontext=Razumem
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Vsebina domače strani Firefoxa
prefs_home_description=Izberite vsebino, ki jo želite prikazati na domači strani Firefoxa.
prefs_content_discovery_header=Domača stran Firefoxa
prefs_content_discovery_description=Odkrivanje vsebine na Firefoxovi domači strani vam pomaga odkriti kakovostne članke na spletu, ki bi vas utegnili zanimati.
prefs_content_discovery_button=Izklopi odkrivanje vsebine
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
@ -144,7 +149,6 @@ pocket_read_more=Priljubljene teme:
# end of the list of popular topic links.
pocket_read_even_more=Prikaži več vesti
pocket_more_reccommendations=Več priporočil
pocket_learn_more=Več o tem
pocket_how_it_works=Kako deluje
pocket_cta_button=Prenesi Pocket
pocket_cta_text=Shranite zgodbe, ki jih imate radi, v Pocket, in napolnite svoje misli z navdušujočim branjem.

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -40,9 +40,9 @@ window.gActivityStreamStrings = {
"section_disclaimer_topstories_buttontext": "Entesos",
"prefs_home_header": "Contingut d'inici del Firefox",
"prefs_home_description": "Trieu el contingut que voleu a la pantalla d'inici del Firefox.",
"prefs_content_discovery_header": "Firefox Home",
"prefs_content_discovery_description": "Content Discovery in Firefox Home allows you to discover high-quality, relevant articles from across the web.",
"prefs_content_discovery_button": "Turn Off Content Discovery",
"prefs_content_discovery_header": "Inici del Firefox",
"prefs_content_discovery_description": "El descobriment de contingut en la pàgina d'inici del Firefox us permet descobrir articles de gran qualitat i rellevants de tot el web.",
"prefs_content_discovery_button": "Desactiva el descobriment de contingut",
"prefs_section_rows_option": "{num} fila;{num} files",
"prefs_search_header": "Cerca web",
"prefs_topsites_description": "El llocs que visiteu més sovint",

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -9,10 +9,9 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<!-- Prerendered version html not shown -->
</body>
</html>

Просмотреть файл

@ -13,6 +13,5 @@
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Просмотреть файл

@ -36,6 +36,5 @@ for (const src of [
script.src = src;
}
</script>
</body>
</html>

Просмотреть файл

@ -9,7 +9,7 @@
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
@ -35,6 +35,5 @@ for (const src of [
script.src = src;
}
</script>
<!-- Prerendered version html not shown -->
</body>
</html>

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше