diff --git a/src/modules/logic-gate-info/components/LogicGateInfoPage.scss b/src/modules/logic-gate-info/components/LogicGateInfoPage.scss
new file mode 100644
index 0000000..10db724
--- /dev/null
+++ b/src/modules/logic-gate-info/components/LogicGateInfoPage.scss
@@ -0,0 +1,33 @@
+@import '../../core/styles/mixins/flex.scss';
+
+#logic-gate-info-page {
+ display: grid;
+ grid-template-columns: 12rem auto;
+ grid-template-rows: 15rem auto 1fr;
+}
+
+#logic-gate-info-page > * {
+ padding: 3rem;
+}
+
+#gate-info-top-right > #gate-info-title {
+ font-size: 3rem;
+}
+
+#gate-info-io-table {
+ @include flex();
+ width: 100%;
+}
+
+#gate-info-io-table,
+#gate-info-read-more {
+ grid-column: 1 / 3;
+}
+
+#gate-info-io-table-paper {
+ width: 100%;
+}
+
+#gate-info-read-more > a {
+ color: #8888ff;
+}
diff --git a/src/modules/logic-gate-info/components/LogicGateInfoPage.tsx b/src/modules/logic-gate-info/components/LogicGateInfoPage.tsx
new file mode 100644
index 0000000..2619bf9
--- /dev/null
+++ b/src/modules/logic-gate-info/components/LogicGateInfoPage.tsx
@@ -0,0 +1,47 @@
+import React, { Fragment } from 'react'
+import '../../logic-gates/components/GatePreview.scss'
+import './LogicGateInfoPage.scss'
+import { withRouter, Redirect } from 'react-router'
+import GatePreview from '../../logic-gates/components/GatePreview'
+import { getTemplateSafely } from '../../logic-gates/helpers/getTemplateSafely'
+import { firstCharUpperCase } from '../../../common/lang/strings/firstCharUpperCase'
+import { descriptions } from '../data/descriptions'
+import LogicGateIoTable from './LogicGateIoTable'
+
+export default withRouter(props => {
+ try {
+ const name = props.match.params.name.toLowerCase()
+ const template = getTemplateSafely(name)
+ const description = descriptions[name] || ''
+
+ return (
+
+
+
+
+
+
{firstCharUpperCase(name)}
+
{description}
+
+
+
+
+
+ Read more:
+ {template.info.map((url, index) => {
+ return (
+
+
+ {url}
+
+
+
+ )
+ })}
+
+
+ }
+})
diff --git a/src/modules/logic-gate-info/components/LogicGateIoTable.tsx b/src/modules/logic-gate-info/components/LogicGateIoTable.tsx
new file mode 100644
index 0000000..12e1e33
--- /dev/null
+++ b/src/modules/logic-gate-info/components/LogicGateIoTable.tsx
@@ -0,0 +1,41 @@
+import React from 'react'
+import { ioTables } from '../data/tables'
+import Table from '@material-ui/core/Table'
+import TableBody from '@material-ui/core/TableBody'
+import TableCell from '@material-ui/core/TableCell'
+import TableHead from '@material-ui/core/TableHead'
+import TableRow from '@material-ui/core/TableRow'
+import Paper from '@material-ui/core/Paper'
+
+export default ({ name }: { name: string }) => {
+ const ioTable = ioTables[name] || {}
+
+ return (
+
+ )
+}
diff --git a/src/modules/logic-gate-info/data/descriptions.ts b/src/modules/logic-gate-info/data/descriptions.ts
new file mode 100644
index 0000000..9d7544c
--- /dev/null
+++ b/src/modules/logic-gate-info/data/descriptions.ts
@@ -0,0 +1,51 @@
+const carryExplanation = (half = true) => `
+ The carry out is necessary to preserve the bit count
+ (the maximum sum of 2 n-bit integers ${
+ half ? '' : 'and a carry'
+ } beeing 1 << (n + 1) - ${half ? 2 : 1})
+`
+
+export const descriptions: Record