diff --git a/packages/core/src/layout/ItemCard/ItemCard.stories.tsx b/packages/core/src/layout/ItemCard/ItemCard.stories.tsx
new file mode 100644
index 0000000000..46b93da370
--- /dev/null
+++ b/packages/core/src/layout/ItemCard/ItemCard.stories.tsx
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react';
+import { ItemCard } from '.';
+import { Grid } from '@material-ui/core';
+
+export default {
+ title: 'Item Card',
+ component: ItemCard,
+};
+
+export const Default = () => (
+
+
+ {}}
+ />
+
+
+ {}}
+ />
+
+
+);
+
+export const Tags = () => (
+
+
+
+
+
+
+
+
+);
diff --git a/plugins/techdocs/src/reader/components/DocsCard.tsx b/packages/core/src/layout/ItemCard/ItemCard.tsx
similarity index 96%
rename from plugins/techdocs/src/reader/components/DocsCard.tsx
rename to packages/core/src/layout/ItemCard/ItemCard.tsx
index 68f42bf84a..86ad53e8dd 100644
--- a/plugins/techdocs/src/reader/components/DocsCard.tsx
+++ b/packages/core/src/layout/ItemCard/ItemCard.tsx
@@ -37,7 +37,7 @@ const useStyles = makeStyles(theme => ({
},
}));
-type DocsCardProps = {
+type ItemCardProps = {
description: string;
tags?: string[];
title: string;
@@ -45,7 +45,7 @@ type DocsCardProps = {
label: string;
onClick?: () => void;
};
-export const DocsCard: FC = ({
+export const ItemCard: FC = ({
description,
tags,
title,
diff --git a/packages/core/src/layout/ItemCard/index.ts b/packages/core/src/layout/ItemCard/index.ts
new file mode 100644
index 0000000000..b38dd2acc2
--- /dev/null
+++ b/packages/core/src/layout/ItemCard/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { ItemCard } from './ItemCard';
diff --git a/packages/core/src/layout/index.ts b/packages/core/src/layout/index.ts
index e2de159ec6..e8245119f3 100644
--- a/packages/core/src/layout/index.ts
+++ b/packages/core/src/layout/index.ts
@@ -26,3 +26,4 @@ export * from './Sidebar';
export * from './SignInPage';
export * from './TabbedCard';
export * from './HeaderTabs';
+export * from './ItemCard';
diff --git a/plugins/techdocs/src/reader/components/Reader.tsx b/plugins/techdocs/src/reader/components/Reader.tsx
index a4ff03af47..1d7a85a6ba 100644
--- a/plugins/techdocs/src/reader/components/Reader.tsx
+++ b/plugins/techdocs/src/reader/components/Reader.tsx
@@ -20,16 +20,17 @@ import { useAsync } from 'react-use';
import { useLocation, useParams, useNavigate } from 'react-router-dom';
import { Grid } from '@material-ui/core';
-import { Header, Content } from '@backstage/core';
+import { Header, Content, ItemCard } from '@backstage/core';
import transformer, {
addBaseUrl,
rewriteDocLinks,
addEventListener,
+ removeMkdocsHeader,
+ modifyCss,
} from '../transformers';
import { docStorageURL } from '../../config';
import URLParser from '../urlParser';
-import { DocsCard } from './DocsCard';
const useFetch = (url: string) => {
const state = useAsync(async () => {
@@ -77,6 +78,16 @@ export const Reader = () => {
rewriteDocLinks({
componentId,
}),
+ modifyCss({
+ cssTransforms: {
+ '.md-main__inner': [{ 'margin-top': '0' }],
+ '.md-sidebar': [{ top: '0' }, { width: '20rem' }],
+ '.md-typeset': [{ 'font-size': '1rem' }],
+ '.md-nav': [{ 'font-size': '1rem' }],
+ '.md-grid': [{ 'max-width': '80vw' }],
+ },
+ }),
+ removeMkdocsHeader(),
]);
divElement.shadowRoot.innerHTML = '';
@@ -93,39 +104,37 @@ export const Reader = () => {
return (
<>
- {componentId ? (
-
- ) : (
- <>
-
+
-
-
-
- navigate('/docs/mkdocs')}
- tags={['Developer Tool']}
- title="MkDocs"
- label="Read Docs"
- description="MkDocs is a fast, simple and downright gorgeous static site generator that's geared towards building project documentation. "
- />
-
-
- navigate('/docs/backstage-microsite')}
- tags={['Service']}
- title="Backstage"
- label="Read Docs"
- description="Getting started guides, API Overview, documentation around how to Create a Plugin and more. "
- />
-
+
+ {componentId ? (
+
+ ) : (
+
+
+ navigate('/docs/mkdocs')}
+ tags={['Developer Tool']}
+ title="MkDocs"
+ label="Read Docs"
+ description="MkDocs is a fast, simple and downright gorgeous static site generator that's geared towards building project documentation. "
+ />
-
- >
- )}
+
+ navigate('/docs/backstage-microsite')}
+ tags={['Service']}
+ title="Backstage"
+ label="Read Docs"
+ description="Getting started guides, API Overview, documentation around how to Create a Plugin and more. "
+ />
+
+
+ )}
+
>
);
};
diff --git a/plugins/techdocs/src/reader/transformers/index.ts b/plugins/techdocs/src/reader/transformers/index.ts
index 64c5527fe7..f49f496277 100644
--- a/plugins/techdocs/src/reader/transformers/index.ts
+++ b/plugins/techdocs/src/reader/transformers/index.ts
@@ -17,6 +17,8 @@
export * from './addBaseUrl';
export * from './rewriteDocLinks';
export * from './addEventListener';
+export * from './removeMkdocsHeader';
+export * from './modifyCss';
export type Transformer = (dom: Element) => Element;
diff --git a/plugins/techdocs/src/reader/transformers/modifyCss.ts b/plugins/techdocs/src/reader/transformers/modifyCss.ts
new file mode 100644
index 0000000000..5116baac45
--- /dev/null
+++ b/plugins/techdocs/src/reader/transformers/modifyCss.ts
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import type { Transformer } from './index';
+
+type ModifyCssOptions = {
+ // Example: { '.md-container': { 'marginTop': '10px' }}
+ cssTransforms: { [key: string]: { [key: string]: string }[] };
+};
+
+export const modifyCss = ({ cssTransforms }: ModifyCssOptions): Transformer => {
+ return dom => {
+ Object.entries(cssTransforms).forEach(([cssSelector, cssChanges]) => {
+ const elementsToChange = Array.from(
+ dom.querySelectorAll(cssSelector),
+ );
+ if (elementsToChange.length < 1) return;
+
+ cssChanges.forEach(changes => {
+ elementsToChange.forEach((element: HTMLElement) => {
+ Object.entries(changes).forEach(([cssProperty, cssValue]) => {
+ element.style.setProperty(cssProperty, cssValue);
+ });
+ });
+ });
+ });
+
+ return dom;
+ };
+};
diff --git a/plugins/techdocs/src/reader/transformers/removeMkdocsHeader.ts b/plugins/techdocs/src/reader/transformers/removeMkdocsHeader.ts
new file mode 100644
index 0000000000..087574b2de
--- /dev/null
+++ b/plugins/techdocs/src/reader/transformers/removeMkdocsHeader.ts
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import type { Transformer } from './index';
+
+export const removeMkdocsHeader = (): Transformer => {
+ return dom => {
+ // Remove the header
+ dom.querySelector('.md-header')?.remove();
+
+ return dom;
+ };
+};