diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx
index 34c9a38..6015bc4 100644
--- a/src/components/Toolbar.jsx
+++ b/src/components/Toolbar.jsx
@@ -1,4 +1,4 @@
-import '../scss/main.scss';
+
import React from 'react';
import { Tab, Tabs, TabList, TabPanel } from 'react-tabs';
import Search from './Search.jsx';
diff --git a/src/components/Viewport.jsx b/src/components/Viewport.jsx
index 3292a94..9c10de8 100644
--- a/src/components/Viewport.jsx
+++ b/src/components/Viewport.jsx
@@ -1,4 +1,3 @@
-import '../scss/main.scss';
import React from 'react';
import Map from '../js/map/map.js';
import { areEqual } from '../js/data/utilities.js';
diff --git a/src/components/presentational/CardCaret.js b/src/components/presentational/CardCaret.js
new file mode 100644
index 0000000..36994b3
--- /dev/null
+++ b/src/components/presentational/CardCaret.js
@@ -0,0 +1,18 @@
+import React from 'react';
+
+const CardCaret = ({ isHighlighted, toggle }) => {
+
+ let classes = (isHighlighted)
+ ? 'arrow-down'
+ : 'arrow-down folded';
+
+ return (
+
+ );
+}
+
+export default CardCaret;
diff --git a/src/components/presentational/CardCategory.js b/src/components/presentational/CardCategory.js
new file mode 100644
index 0000000..a106112
--- /dev/null
+++ b/src/components/presentational/CardCategory.js
@@ -0,0 +1,13 @@
+import React from 'react';
+
+const CardCategory = ({ categoryTitle, categoryLabel, colorType }) => (
+
+
{categoryTitle}
+
+
+ {categoryLabel}
+
+
+);
+
+export default CardCategory;
diff --git a/src/components/presentational/CardLocation.js b/src/components/presentational/CardLocation.js
new file mode 100644
index 0000000..7dd26c0
--- /dev/null
+++ b/src/components/presentational/CardLocation.js
@@ -0,0 +1,26 @@
+import React from 'react';
+
+import copy from '../../js/data/copy.json';
+import {isNotNullNorUndefined} from '../../js/data/utilities';
+
+const CardLocation = ({ language, location }) => {
+
+ const location_lang = copy[language].cardstack.location;
+ if (isNotNullNorUndefined(location)) {
+ return (
+
+
{location_lang}
+
{location}
+
+ );
+ } else {
+ return (
+
+
{location_lang}
+
Sin localización conocida.
+
+ );
+ }
+}
+
+export default CardLocation;
diff --git a/src/components/presentational/CardNarrative.js b/src/components/presentational/CardNarrative.js
new file mode 100644
index 0000000..9610215
--- /dev/null
+++ b/src/components/presentational/CardNarrative.js
@@ -0,0 +1,13 @@
+import React from 'react';
+
+import CardNarrativeLink from './CardNarrativeLink';
+
+const CardNarrative = (props) => (
+
+
Connected events
+
Next:
+
Previous:
+
+);
+
+export default CardNarrative;
diff --git a/src/components/presentational/CardNarrativeLink.js b/src/components/presentational/CardNarrativeLink.js
new file mode 100644
index 0000000..febffc5
--- /dev/null
+++ b/src/components/presentational/CardNarrativeLink.js
@@ -0,0 +1,17 @@
+import React from 'react';
+
+const CardNarrativeLink = ({ event, makeTimelabel, select }) => {
+ if (event !== null) {
+ const timelabel = makeTimelabel(event.timestamp);
+
+ return (
+
select(event)}>
+ {`${timelabel} - ${event.location}`}
+
+ );
+ }
+
+ return (
None);
+}
+
+export default CardNarrativeLink;
diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js
new file mode 100644
index 0000000..4597d49
--- /dev/null
+++ b/src/components/presentational/CardSource.js
@@ -0,0 +1,16 @@
+import React from 'react';
+
+import copy from '../../js/data/copy.json';
+
+const CardSource = ({ source, language }) => {
+ const source_lang = copy[language].cardstack.source;
+
+ return (
+
+
{source_lang}
+
{source}
+
+ );
+}
+
+export default CardSource;
diff --git a/src/components/presentational/CardSummary.js b/src/components/presentational/CardSummary.js
new file mode 100644
index 0000000..bb4f10f
--- /dev/null
+++ b/src/components/presentational/CardSummary.js
@@ -0,0 +1,18 @@
+import React from 'react';
+
+import copy from '../../js/data/copy.json';
+
+const CardSummary = ({ language, description, isHighlighted }) => {
+
+ const summary = copy[language].cardstack.description;
+ const descriptionText = (isHighlighted) ? description : `${description.substring(0, 40)}...`;
+
+ return (
+
+
{summary}
+
{descriptionText}
+
+ );
+}
+
+export default CardSummary;
diff --git a/src/components/presentational/CardTags.js b/src/components/presentational/CardTags.js
new file mode 100644
index 0000000..46088cb
--- /dev/null
+++ b/src/components/presentational/CardTags.js
@@ -0,0 +1,29 @@
+import React from 'react';
+
+import copy from '../../js/data/copy.json';
+
+const CardTags = ({ tags, language }) => {
+ const label = copy[language].cardstack.people;
+
+ return (
+
+
{label}
+
{
+ tags.map((tag, idx) => {
+ return (
+
+ {tag.name}
+ {
+ (idx < tags.length - 1)
+ ? ','
+ : ''
+ }
+
+ );
+ })
+ }
+
+);
+}
+
+export default CardTags;
diff --git a/src/components/presentational/CardTimestamp.js b/src/components/presentational/CardTimestamp.js
new file mode 100644
index 0000000..d645e82
--- /dev/null
+++ b/src/components/presentational/CardTimestamp.js
@@ -0,0 +1,30 @@
+import React from 'react';
+
+import copy from '../../js/data/copy.json';
+import {isNotNullNorUndefined} from '../../js/data/utilities';
+
+const CardTimestamp = ({ makeTimelabel, language, timestamp }) => {
+
+ const daytime_lang = copy[language].cardstack.timestamp;
+ const estimated_lang = copy[language].cardstack.estimated;
+ const unknown_lang = copy[language].cardstack.unknown_time;
+
+ if (isNotNullNorUndefined(timestamp)) {
+ const timelabel = makeTimelabel(timestamp);
+ return (
+
+
{daytime_lang}
+ {timelabel}
+
+ );
+ } else {
+ return (
+
+
{daytime_lang}
+ {unknown_lang}
+
+ );
+ }
+}
+
+export default CardTimestamp;
diff --git a/src/components/Checkbox.jsx b/src/components/presentational/Checkbox.jsx
similarity index 91%
rename from src/components/Checkbox.jsx
rename to src/components/presentational/Checkbox.jsx
index 2bdd8dc..c57d409 100644
--- a/src/components/Checkbox.jsx
+++ b/src/components/presentational/Checkbox.jsx
@@ -1,4 +1,3 @@
-import '../scss/main.scss';
import React from 'react';
export default ({ label, isActive, onClickCheckbox }) => (
diff --git a/src/components/presentational/Spinner.js b/src/components/presentational/Spinner.js
new file mode 100644
index 0000000..e3bad6d
--- /dev/null
+++ b/src/components/presentational/Spinner.js
@@ -0,0 +1,12 @@
+import React from 'react';
+
+const Spinner = ({}) => {
+ return (
+
+ )
+}
+
+export default Spinner;
diff --git a/src/js/data/copy.json b/src/js/data/copy.json
index 2138326..66efb16 100644
--- a/src/js/data/copy.json
+++ b/src/js/data/copy.json
@@ -56,6 +56,7 @@
"cardstack": {
"header": "eventos seleccionados",
"unknown_location": "Localización desconocida",
+ "unknown_time": "Día y hora desconocida",
"timestamp": "Día y hora",
"estimated": "aproximado",
"location": "Localización",
@@ -129,6 +130,7 @@
"timestamp": "Day and time",
"unknown_location": "Unknown location",
"estimated": "estimated",
+ "unknown_time": "Unknown time",
"location": "Localization",
"incident_type": "Type of action",
"description": "Summary of facts",