зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
1dcbdcf59e
Коммит
32fba16ff7
|
@ -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=J’ai compris
|
|||
# what is shown for the homepage, new windows, and new tabs.
|
||||
prefs_home_header=Contenu de la page d’accueil de Firefox
|
||||
prefs_home_description=Choisissez le contenu que vous souhaitez pour la page d’accueil de Firefox.
|
||||
|
||||
prefs_content_discovery_header=Page d’accueil 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 d’articles
|
||||
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>
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче