Compare commits
7 Commits
core-story
...
feature/si
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
709b10cef3 | ||
|
|
ec8c5d27e8 | ||
|
|
cf6fab2c4f | ||
|
|
5088afe69a | ||
|
|
95af903642 | ||
|
|
9fee284097 | ||
|
|
11a4272f16 |
21
nx.json
21
nx.json
@@ -5,13 +5,7 @@
|
||||
"default": {
|
||||
"runner": "nx/tasks-runners/default",
|
||||
"options": {
|
||||
"cacheableOperations": [
|
||||
"build",
|
||||
"lint",
|
||||
"test",
|
||||
"e2e",
|
||||
"build-storybook"
|
||||
]
|
||||
"cacheableOperations": ["build", "lint", "test", "e2e"]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -36,14 +30,6 @@
|
||||
"{workspaceRoot}/.eslintrc.json",
|
||||
"{workspaceRoot}/.eslintignore"
|
||||
]
|
||||
},
|
||||
"build-storybook": {
|
||||
"inputs": [
|
||||
"default",
|
||||
"^production",
|
||||
"{projectRoot}/.storybook/**/*",
|
||||
"{projectRoot}/tsconfig.storybook.json"
|
||||
]
|
||||
}
|
||||
},
|
||||
"namedInputs": {
|
||||
@@ -53,10 +39,7 @@
|
||||
"!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)",
|
||||
"!{projectRoot}/tsconfig.spec.json",
|
||||
"!{projectRoot}/jest.config.[jt]s",
|
||||
"!{projectRoot}/.eslintrc.json",
|
||||
"!{projectRoot}/**/*.stories.@(js|jsx|ts|tsx|mdx)",
|
||||
"!{projectRoot}/.storybook/**/*",
|
||||
"!{projectRoot}/tsconfig.storybook.json"
|
||||
"!{projectRoot}/.eslintrc.json"
|
||||
],
|
||||
"sharedGlobals": ["{workspaceRoot}/babel.config.json"]
|
||||
},
|
||||
|
||||
15315
package-lock.json
generated
15315
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
18
package.json
18
package.json
@@ -20,20 +20,10 @@
|
||||
"@nrwl/js": "15.9.2",
|
||||
"@nrwl/linter": "15.9.2",
|
||||
"@nrwl/next": "15.9.2",
|
||||
"@nrwl/react": "^15.9.2",
|
||||
"@nrwl/react": "15.9.2",
|
||||
"@nrwl/rollup": "15.9.2",
|
||||
"@nrwl/storybook": "15.9.2",
|
||||
"@nrwl/webpack": "15.9.2",
|
||||
"@nrwl/workspace": "15.9.2",
|
||||
"@nx/js": "16.6.0",
|
||||
"@rollup/plugin-url": "^7.0.0",
|
||||
"@storybook/addon-essentials": "7.0.18",
|
||||
"@storybook/addon-interactions": "7.0.18",
|
||||
"@storybook/core-server": "7.0.18",
|
||||
"@storybook/jest": "~0.1.0",
|
||||
"@storybook/react-webpack5": "^7.0.18",
|
||||
"@storybook/test-runner": "^0.11.0",
|
||||
"@storybook/testing-library": "~0.2.0",
|
||||
"@svgr/rollup": "^6.1.2",
|
||||
"@swc/core": "^1.2.173",
|
||||
"@swc/helpers": "~0.5.0",
|
||||
@@ -49,7 +39,6 @@
|
||||
"@typescript-eslint/parser": "^5.36.1",
|
||||
"babel-jest": "^29.4.1",
|
||||
"chai": "^4.3.7",
|
||||
"core-js": "^3.6.5",
|
||||
"cypress": "^12.2.0",
|
||||
"eslint": "~8.15.0",
|
||||
"eslint-config-next": "13.1.1",
|
||||
@@ -69,16 +58,11 @@
|
||||
"react-test-renderer": "18.2.0",
|
||||
"rehype-stringify": "^9.0.3",
|
||||
"remark": "^14.0.3",
|
||||
"storybook-tailwind-dark-mode": "^1.0.22",
|
||||
"swc-loader": "0.1.15",
|
||||
"ts-jest": "^29.0.5",
|
||||
"ts-node": "10.9.1",
|
||||
"typescript": "~4.9.5",
|
||||
"unist-util-select": "^4.0.3",
|
||||
"unist-util-visit": "^4.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
User-agent: *
|
||||
Allow: /$
|
||||
Disallow: /
|
||||
@@ -16,7 +16,7 @@
|
||||
"build": "tsc && vite build && npm run build-tailwind && npm run fix-leaflet",
|
||||
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
||||
"storybook": "storybook dev -p 6006",
|
||||
"build-storybook": "storybook build && cp ./.storybook/robots.txt ./storybook-static",
|
||||
"build-storybook": "storybook build",
|
||||
"build-tailwind": "NODE_ENV=production npx tailwindcss --postcss -c tailwind.config.js -i src/index.css -o ./dist/style.css --minify",
|
||||
"prepare": "npm run build",
|
||||
"fix-leaflet": "node ./scripts/fix-leaflet.cjs"
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
import type { StorybookConfig } from '@storybook/react-webpack5';
|
||||
|
||||
const config: StorybookConfig = {
|
||||
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
|
||||
addons: [
|
||||
'@storybook/addon-essentials',
|
||||
'@storybook/addon-interactions',
|
||||
'@nrwl/react/plugins/storybook',
|
||||
'storybook-tailwind-dark-mode'
|
||||
],
|
||||
framework: {
|
||||
name: '@storybook/react-webpack5',
|
||||
options: {},
|
||||
},
|
||||
};
|
||||
|
||||
export default config;
|
||||
|
||||
// To customize your webpack configuration you can use the webpackFinal field.
|
||||
// Check https://storybook.js.org/docs/react/builders/webpack#extending-storybooks-webpack-config
|
||||
// and https://nx.dev/packages/storybook/documents/custom-builder-configs
|
||||
@@ -1,14 +0,0 @@
|
||||
import './tailwind-imports.css';
|
||||
|
||||
const preview = {
|
||||
globalTypes: {
|
||||
darkMode: {
|
||||
defaultValue: false, // Enable dark mode by default on all stories
|
||||
},
|
||||
className: {
|
||||
defaultValue: 'dark', // Set your custom dark mode class name
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default preview;
|
||||
@@ -1,3 +0,0 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
@@ -1,31 +0,0 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"emitDecoratorMetadata": true,
|
||||
"outDir": ""
|
||||
},
|
||||
"files": [
|
||||
"../../node_modules/@nx/react/typings/styled-jsx.d.ts",
|
||||
"../../node_modules/@nx/react/typings/cssmodule.d.ts",
|
||||
"../../node_modules/@nx/react/typings/image.d.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"src/**/*.spec.ts",
|
||||
"src/**/*.test.ts",
|
||||
"src/**/*.spec.js",
|
||||
"src/**/*.test.js",
|
||||
"src/**/*.spec.tsx",
|
||||
"src/**/*.test.tsx",
|
||||
"src/**/*.spec.jsx",
|
||||
"src/**/*.test.js"
|
||||
],
|
||||
"include": [
|
||||
"src/**/*.stories.ts",
|
||||
"src/**/*.stories.js",
|
||||
"src/**/*.stories.jsx",
|
||||
"src/**/*.stories.tsx",
|
||||
"src/**/*.stories.mdx",
|
||||
".storybook/*.js",
|
||||
".storybook/*.ts"
|
||||
]
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
// libs/shared/ui/postcss.config.js
|
||||
const { join } = require('path');
|
||||
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {
|
||||
config: join(__dirname, 'tailwind.config.js'),
|
||||
},
|
||||
autoprefixer: {},
|
||||
},
|
||||
};
|
||||
@@ -34,37 +34,6 @@
|
||||
"jestConfig": "packages/core/jest.config.ts",
|
||||
"passWithNoTests": true
|
||||
}
|
||||
},
|
||||
"storybook": {
|
||||
"executor": "@nrwl/storybook:storybook",
|
||||
"options": {
|
||||
"port": 4400,
|
||||
"configDir": "packages/core/.storybook"
|
||||
},
|
||||
"configurations": {
|
||||
"ci": {
|
||||
"quiet": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"build-storybook": {
|
||||
"executor": "@nrwl/storybook:build",
|
||||
"outputs": ["{options.outputDir}"],
|
||||
"options": {
|
||||
"outputDir": "dist/storybook/core",
|
||||
"configDir": "packages/core/.storybook"
|
||||
},
|
||||
"configurations": {
|
||||
"ci": {
|
||||
"quiet": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"test-storybook": {
|
||||
"executor": "nx:run-commands",
|
||||
"options": {
|
||||
"command": "test-storybook -c packages/core/.storybook --url=http://localhost:4400"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
import React from 'react';
|
||||
import type { Meta, StoryObj } from '@storybook/react';
|
||||
|
||||
import { Card } from './Card';
|
||||
|
||||
const meta: Meta<typeof Card> = {
|
||||
component: Card,
|
||||
};
|
||||
|
||||
export default meta;
|
||||
type Story = StoryObj<typeof Card>;
|
||||
|
||||
/*
|
||||
*👇 Render functions are a framework specific feature to allow you control on how the component renders.
|
||||
* See https://storybook.js.org/docs/react/api/csf
|
||||
* to learn how to use render functions.
|
||||
*/
|
||||
|
||||
const blog = {
|
||||
urlPath: "#",
|
||||
title: "Card title goes here",
|
||||
date: "2021-01-01",
|
||||
description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, diam quis accumsan maximus, quam libero porttitor nisl, vita",
|
||||
}
|
||||
|
||||
export const Primary: Story = {
|
||||
render: () => (
|
||||
<Card className="md:col-span-3">
|
||||
<Card.Title href={`${blog.urlPath}`}>
|
||||
{blog.title}
|
||||
</Card.Title>
|
||||
<Card.Eyebrow
|
||||
as="time"
|
||||
dateTime={blog.date}
|
||||
className="md:hidden"
|
||||
decorate
|
||||
>
|
||||
{blog.date}
|
||||
</Card.Eyebrow>
|
||||
{blog.description && (
|
||||
<Card.Description>
|
||||
{blog.description}
|
||||
</Card.Description>
|
||||
)}
|
||||
<Card.Cta>Read article</Card.Cta>
|
||||
</Card>
|
||||
),
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
const { createGlobPatternsForDependencies } = require('@nrwl/next/tailwind');
|
||||
const { join } = require('path');
|
||||
// const defaultTheme = require("tailwindcss/defaultTheme");
|
||||
const colors = require("tailwindcss/colors");
|
||||
|
||||
module.exports = {
|
||||
content: [
|
||||
join(__dirname, './src/**/*.{js,ts,jsx,tsx}'),
|
||||
...createGlobPatternsForDependencies(__dirname),
|
||||
],
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
// support wider width for large screens >1440px eg. in hero
|
||||
maxWidth: {
|
||||
"8xl": "88rem",
|
||||
},
|
||||
// fontFamily: {
|
||||
// sans: ["ui-sans-serif", ...defaultTheme.fontFamily.sans],
|
||||
// serif: ["ui-serif", ...defaultTheme.fontFamily.serif],
|
||||
// mono: ["ui-monospace", ...defaultTheme.fontFamily.mono],
|
||||
// headings: ["-apple-system", ...defaultTheme.fontFamily.sans],
|
||||
// },
|
||||
colors: {
|
||||
background: {
|
||||
DEFAULT: colors.white,
|
||||
dark: colors.slate[900],
|
||||
},
|
||||
primary: {
|
||||
DEFAULT: colors.gray[700],
|
||||
dark: colors.gray[300],
|
||||
},
|
||||
secondary: {
|
||||
DEFAULT: colors.sky[400],
|
||||
dark: colors.sky[400],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
/* eslint global-require: off */
|
||||
// plugins: [
|
||||
// require("@tailwindcss/typography")
|
||||
// ],
|
||||
};
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"jsx": "react-jsx",
|
||||
"module": "es2020",
|
||||
"moduleResolution": "node",
|
||||
@@ -23,9 +22,6 @@
|
||||
},
|
||||
{
|
||||
"path": "./tsconfig.spec.json"
|
||||
},
|
||||
{
|
||||
"path": "./.storybook/tsconfig.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -17,11 +17,7 @@
|
||||
"**/*.spec.js",
|
||||
"**/*.test.js",
|
||||
"**/*.spec.jsx",
|
||||
"**/*.test.jsx",
|
||||
"**/*.stories.ts",
|
||||
"**/*.stories.js",
|
||||
"**/*.stories.jsx",
|
||||
"**/*.stories.tsx"
|
||||
"**/*.test.jsx"
|
||||
],
|
||||
"include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"]
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ export function Hero() {
|
||||
{/* Commented code on line 37, 39 and 113 will reenable the two columns hero */}
|
||||
<div className="mx-auto grid max-w-2xl grid-cols-1 gap-y-16 gap-x-8 px-4 lg:max-w-8xl lg:grid-cols-2 lg:px-8 xl:gap-x-16 xl:px-12">
|
||||
<div className="relative mb-10 lg:mb-0 md:text-center lg:text-left">
|
||||
<div>
|
||||
<div role="heading">
|
||||
<h1 className="inline bg-gradient-to-r from-blue-500 via-blue-300 to-blue-500 bg-clip-text text-5xl tracking-tight text-transparent">
|
||||
The JavaScript framework for data portals
|
||||
</h1>
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
import { ArticleJsonLd } from 'next-seo';
|
||||
import { useRouter } from 'next/router';
|
||||
|
||||
export default function JSONLD({
|
||||
meta,
|
||||
source,
|
||||
}: {
|
||||
meta: any;
|
||||
source: string;
|
||||
}): JSX.Element {
|
||||
if (!source) {
|
||||
return <></>;
|
||||
}
|
||||
|
||||
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://portaljs.org';
|
||||
const pageUrl = `${baseUrl}/${meta.urlPath}`;
|
||||
|
||||
const imageMatches = source.match(
|
||||
/(?<=src: ")(.*)\.((png)|(jpg)|(jpeg))(?=")/g
|
||||
);
|
||||
let images = [];
|
||||
if (imageMatches) {
|
||||
images = [...imageMatches];
|
||||
images = images.map((img) =>
|
||||
img.startsWith('http')
|
||||
? img
|
||||
: `${baseUrl}${img.startsWith('/') ? '' : '/'}${img}`
|
||||
);
|
||||
}
|
||||
|
||||
let Component: JSX.Element;
|
||||
|
||||
const isBlog: boolean =
|
||||
/^blog\/.*/.test(meta.urlPath) || meta.filetype === 'blog';
|
||||
const isDoc: boolean = /^((docs)|(howtos\/)|(guide\/)).*/.test(meta.urlPath);
|
||||
|
||||
if (isBlog) {
|
||||
Component = (
|
||||
<ArticleJsonLd
|
||||
type="BlogPosting"
|
||||
url={pageUrl}
|
||||
title={meta.title}
|
||||
datePublished={meta.date}
|
||||
dateModified={meta.date}
|
||||
authorName={meta.authors.length ? meta.authors[0].name : 'PortalJS'}
|
||||
description={meta.description}
|
||||
images={images}
|
||||
/>
|
||||
);
|
||||
} else if (isDoc) {
|
||||
Component = (
|
||||
<ArticleJsonLd
|
||||
url={pageUrl}
|
||||
title={meta.title}
|
||||
images={images}
|
||||
datePublished={meta.date}
|
||||
dateModified={meta.date}
|
||||
authorName={meta.authors.length ? meta.authors[0].name : 'PortalJS'}
|
||||
description={meta.description}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return Component;
|
||||
}
|
||||
@@ -54,14 +54,12 @@ function useTableOfContents(tableOfContents) {
|
||||
export default function Layout({
|
||||
children,
|
||||
title,
|
||||
description,
|
||||
tableOfContents = [],
|
||||
isHomePage = false,
|
||||
sidebarTree = [],
|
||||
}: {
|
||||
children;
|
||||
title?: string;
|
||||
description?: string;
|
||||
tableOfContents?;
|
||||
urlPath?: string;
|
||||
sidebarTree?: [];
|
||||
@@ -84,7 +82,7 @@ export default function Layout({
|
||||
|
||||
return (
|
||||
<>
|
||||
{title && <NextSeo title={title} description={description} />}
|
||||
{title && <NextSeo title={title} />}
|
||||
<Nav />
|
||||
<div className="mx-auto p-6 bg-background dark:bg-background-dark">
|
||||
{isHomePage && <Hero />}
|
||||
|
||||
@@ -20,7 +20,7 @@ export default function NavItem({ item }) {
|
||||
};
|
||||
|
||||
return (
|
||||
<Menu as="div" role="menu" className="relative">
|
||||
<Menu as="div" className="relative">
|
||||
<Menu.Item>
|
||||
{Object.prototype.hasOwnProperty.call(item, 'href') ? (
|
||||
<Link
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 416 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 187 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 467 KiB |
@@ -1,64 +0,0 @@
|
||||
---
|
||||
title: 'Enhancing Geospatial Data Visualization with PortalJS'
|
||||
date: 2023-07-18
|
||||
authors: ['João Demenech', 'Luccas Mateus', 'Yoana Popova']
|
||||
filetype: 'blog'
|
||||
---
|
||||
|
||||
Are you keen on building rich and interactive data portals? Do you find value in the power and flexibility of JavaScript, Nextjs, and React? In that case, allow us to introduce you to [PortalJS](https://portaljs.org/), a state-of-the-art framework leveraging these technologies to help you build amazing data portals.
|
||||
|
||||
Perhaps you already understand that the effective data visualization lies in the adept utilization of various data components. Within [PortalJS](https://portaljs.org/), we take data visualization a step further. It's not just about displaying data - it's about telling a captivating story through the strategic orchestration of a diverse array of data components.
|
||||
|
||||
We are now eager to share our latest enhancement to [PortalJS](https://portaljs.org/): maps, a powerful tool for visualizing geospatial data. In this post, we will to take you on a tour of our experiments and progress in enhancing map functionalities on [PortalJS](https://portaljs.org/). Our journey into this innovative feature is still in its early stages, with new facets being unveiled and refined as we perfect our API. Still, this exciting development opens a new avenue for visualizing data, enhancing your ability to convey complex geospatial information with clarity and precision.
|
||||
|
||||
## Exploring Map Formats
|
||||
|
||||
Maps play a crucial role in geospatial data visualization. Several formats exist for storing and sharing this type of data, with GeoJSON, KML, and shapefiles being among the most popular. As a prominent figure in the field of open-source data portal platforms, [PortalJS](https://portaljs.org/) strives to support as many map formats as possible.
|
||||
|
||||
Taking inspiration from the ckanext-geoview extension, we currently support KML and GeoJSON formats in [PortalJS](https://portaljs.org/). This remarkable extension is a plugin for CKAN, the world’s leading open source data management system, that enables users to visualize geospatial data in diverse formats on an interactive map. Apart from KML and GeoJSON formats support, our roadmap entails extending compatibility to encompass all other formats supported by ckanext-geoview. Rest assured, we are committed to empowering users with a wide array of map format options in the future.
|
||||
|
||||
So, what makes these formats special?
|
||||
|
||||
- **GeoJSON**: This format uses JSON to depict simple geographic features and their associated attributes. It's often hailed as the most popular choice in the field.
|
||||
- **KML**: An XML-based format, KML can store details like placemarks, paths, polygons, and styles.
|
||||
- **Shapefiles**: These are file collections that store vector data—points, lines, and polygons—and their attributes.
|
||||
|
||||
## Unveiling the Power of Leaflet and OpenLayers
|
||||
|
||||
To display maps in [PortalJS](https://portaljs.org/), we utilize two powerful JavaScript libraries for creating interactive maps based on different layers: Leaflet and OpenLayers. Each offers distinct advantages (and disadvantages), inspiring us to integrate both and give users the flexibility to choose.
|
||||
|
||||
Leaflet is the leading open-source JavaScript library known for its mobile-friendly, interactive maps. With its compact size (just 42 KB of JS), it provides all the map features most developers need. Leaflet is designed with simplicity, performance and usability in mind. It works efficiently across all major desktop and mobile platforms.
|
||||
|
||||
OpenLayers is a high-performance library packed with features for creating interactive web maps. OpenLayers can display map tiles, vector data, and markers sourced from anywhere on any webpage. It's an excellent tool for leveraging geographic information of all kinds.
|
||||
|
||||
## Introducing Map Feature
|
||||
|
||||
Both components have some similar features and props, such as:
|
||||
|
||||
### Polygons and points
|
||||
|
||||

|
||||
|
||||
Our initial version enables the use of both vectors and points to display information. Points are simpler and faster to render than vectors, but they have less detail and interactivity. For example, if you have data that is represented by coordinates or addresses, you can use points to show them on the map. This way, you can avoid time-consuming loading and rendering complex vector shapes that may slow down your map.
|
||||
|
||||
### Tooltips
|
||||
|
||||

|
||||
|
||||
We have implemented an exciting feature that enhances the usability of our map component: tooltips. When you hover over a polygon or point on the map, a small pop-up window, known as a tooltip, appears. This tooltip provides relevant details about the feature under your cursor, according to what features the map creator wants to highlight. For example, when exploring countries, you can effortlessly discover their name, population, and area by hovering over them. Similarly, hovering over cities reveals useful information like their name, temperature, and elevation. To enable this handy tooltip functionality on our map, simply include a tooltip prop when using the map component.
|
||||
|
||||
### Focus
|
||||
|
||||

|
||||
|
||||
Users can also choose a region of focus, which will depend on the data, by setting initial center coordinates and zoom level. This is especially helpful for maps that are not global, such as the ones that use data from a specific country, city or region.
|
||||
|
||||
## Mapping the Future with PortalJS
|
||||
|
||||
Through our ongoing enhancements to the [PortalJS library](https://storybook.portaljs.org/), we aim to empower users to create engaging and informative data portals featuring diverse map formats and data components.
|
||||
|
||||
Why not give [PortalJS](https://portaljs.org/) a try today and discover the possibilities for your own data portals? To get started, check out our comprehensive documentation here: [PortalJS Documentation](https://portaljs.org/docs).
|
||||
|
||||
Have questions or comments about using [PortalJS](https://portaljs.org/) for your data portals? Feel free to share your thoughts on our [Discord channel](https://discord.com/invite/EeyfGrGu4U). We're here to help you make the most of your data.
|
||||
|
||||
Stay tuned for more exciting developments as we continue to enhance [PortalJS](https://portaljs.org/)!
|
||||
@@ -264,7 +264,7 @@ The above script will output the following to the terminal:
|
||||
|
||||
## Done!
|
||||
|
||||
That's it! We've just created a simple catalog of our GitHub projects using markdown files and the MarkdownDB package. You can find the [full code for this tutorial here](https://github.com/datopian/markdowndb/tree/main/examples/basic-example).
|
||||
That's it! We've just created a simple catalog of our GitHub projects using markdown files and the MarkdownDB package. You can find the full code for this tutorial [here](https://github.com/datopian/markdowndb/tree/main/examples/basic-example).
|
||||
|
||||
We look forward to seeing the amazing applications you'll build with this tool!
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const config = {
|
||||
title: 'PortalJS - The JavaScript framework for data portals.',
|
||||
description:
|
||||
'PortalJS is a JavaScript framework for rapidly building rich data portal frontends using a modern frontend approach.',
|
||||
'PortalJS is a framework for rapidly building rich data portal frontends using a modern frontend approach.',
|
||||
theme: {
|
||||
default: 'dark',
|
||||
toggleIcon: '/images/theme-button.svg',
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
title: 'Creating new datasets'
|
||||
description: 'PortalJS Tutorial II - Learn how to create new datasets on a data portal'
|
||||
---
|
||||
<NextSeo title="Creating new datasets - PortalJS" />
|
||||
|
||||
# Creating new datasets
|
||||
|
||||
So far, the PortalJS app we created only has a single page displaying a dataset. Data catalogs and data portals generally showcase many different datasets.
|
||||
|
||||
@@ -11,7 +10,7 @@ Let's explore how to add and display more datasets to our portal.
|
||||
|
||||
As you have seen, in this example a dataset page is just a markdown file on disk plus a data file.
|
||||
|
||||
To create a new data showcase page we just create a new markdown file in the `content/` folder and a new data file in the `public/` folder.
|
||||
To create a new data showcase page we just create a new markdown file in the `content/` folder and a new data file in the `public/` folder.
|
||||
|
||||
Let's do that now. Create a `content/my-incredible-dataset` folder, and inside this new folder create a `index.md` file with the following content:
|
||||
|
||||
@@ -20,7 +19,7 @@ Let's do that now. Create a `content/my-incredible-dataset` folder, and inside t
|
||||
|
||||
This is my incredible dataset.
|
||||
|
||||
## Chart
|
||||
## Chart
|
||||
|
||||
<LineChart
|
||||
title="US Population By Decade"
|
||||
@@ -43,7 +42,7 @@ Year,Population (mi)
|
||||
|
||||
Note that pages are associated with a route based on their pathname, so, to see the new data page, access http://localhost:3000/my-incredible-dataset from the browser. You should see the following:
|
||||
|
||||
<img src="/assets/docs/my-incredible-dataset.png" alt="Page of a new dataset created on a PortalJS data portal" />
|
||||
<img src="/assets/docs/my-incredible-dataset.png" />
|
||||
|
||||
> [!tip]
|
||||
> In this tutorial we opted for storing content as markdown files and data as CSV files in the app, but PortalJS can have metadata, data and content stored anywhere.
|
||||
@@ -59,11 +58,12 @@ List of available datasets:
|
||||
|
||||
- [My Awesome Dataset](/my-awesome-dataset)
|
||||
- [My Incredible Dataset](/my-incredible-dataset)
|
||||
|
||||
```
|
||||
|
||||
From the browser, access http://localhost:3000. You should see the following:
|
||||
|
||||
<img src="/assets/docs/datasets-index-page.png" alt="PortalJS data portal with multiple datasets" />
|
||||
<img src="/assets/docs/datasets-index-page.png" />
|
||||
|
||||
At this point, the app has multiple datasets, and users can find and navigate to any dataset they want. In the next lesson, you are going to learn how to improve this experience with search.
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
title: Getting Started
|
||||
description: 'Getting started guide and tutorial about data portal-building with PortalJS'
|
||||
---
|
||||
<NextSeo title="Getting Started - PortalJS" />
|
||||
|
||||
# Getting Started
|
||||
|
||||
Welcome to the PortalJS documentation!
|
||||
|
||||
@@ -39,7 +38,7 @@ Let's check it's working and what we have! Open http://localhost:3000 from your
|
||||
|
||||
You should see a page like this when you access http://localhost:3000. This is the starter template page which shows the most simple data portal you could have: a simple README plus csv file.
|
||||
|
||||
<img src="/assets/examples/basic-example.png" alt="Initial state of the PortalJS tutorial project" />
|
||||
<img src="/assets/examples/basic-example.png" />
|
||||
|
||||
### Editing the Page
|
||||
|
||||
@@ -52,8 +51,8 @@ Let’s try editing the starter page.
|
||||
|
||||
After refreshing the page, you should see the new text:
|
||||
|
||||
<img src="/assets/docs/editing-the-page-1.png" alt="PortalJS tutorial project after a simple change is made by a user" />
|
||||
<img src="/assets/docs/editing-the-page-1.png" />
|
||||
|
||||
Congratulations! The app is up and running and you learned how to edit a page. In the next lesson, you are going to learn how to create new datasets.
|
||||
Congratulations! The app is up and running and you learned how to edit a page. In the next lesson, you are going to learn how to create new datasets.
|
||||
|
||||
<DocsPagination next="/docs/creating-new-datasets" />
|
||||
|
||||
@@ -26,7 +26,7 @@ This example makes use of the [markdowndb](https://github.com/datopian/markdownd
|
||||
|
||||
From the browser, access http://localhost:3000. You should see the following, you now have a searchable automatic list of your datasets:
|
||||
|
||||

|
||||

|
||||
|
||||
To make this catalog look even better, we can change the text that is being displayed for each dataset to a title. Let's do that by adding the "title" [frontmatter field](https://daily-dev-tips.com/posts/what-exactly-is-frontmatter/) to the first dataset in the list. Change `content/my-awesome-dataset/index.md` to the following:
|
||||
|
||||
@@ -46,7 +46,7 @@ Built with PortalJS
|
||||
|
||||
Rerun `npm run mddb` and, from the browser, access http://localhost:3000. You should see the title appearing instead of the folder name:
|
||||
|
||||

|
||||

|
||||
|
||||
Any frontmatter attribute that you add will automatically get indexed and be usable in the search box.
|
||||
|
||||
@@ -102,7 +102,7 @@ List of available datasets:
|
||||
|
||||
You now have a filter in your page with all possible values automatically added to it.
|
||||
|
||||

|
||||

|
||||
|
||||
In the next lesson, you are going to learn how to display metadata on the dataset page.
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
If you go now to `http://localhost:3000/my-awesome-dataset`, you will see that we now have two titles on the page. That's because `title` is one of the default metadata fields supported by PortalJS.
|
||||
|
||||

|
||||

|
||||
|
||||
Change the content inside `/content/my-awesome-dataset/index.md` to this.
|
||||
|
||||
@@ -15,7 +15,7 @@ author: 'Rufus Pollock'
|
||||
description: 'An awesome dataset displaying some awesome data'
|
||||
modified: '2023-05-04'
|
||||
files: ['data.csv']
|
||||
group: 'Awesome'
|
||||
groups: ['Awesome']
|
||||
---
|
||||
|
||||
Built with PortalJS
|
||||
@@ -27,7 +27,7 @@ Built with PortalJS
|
||||
|
||||
Once you refresh the page at `http://localhost:3000/my-awesome-dataset` you should see something like this at the top:
|
||||
|
||||

|
||||

|
||||
|
||||
These are the standard metadata fields that will be shown at the top of the page if you add them.
|
||||
|
||||
@@ -35,6 +35,6 @@ These are the standard metadata fields that will be shown at the top of the page
|
||||
- `author`, `description`, and `modified` which gets displayed below the title
|
||||
- `files` that get displayed as a table with two columns: `File` which is linked directly to the file, and `Format` which show the file format.
|
||||
|
||||
Feel free to experiment with these metadata fields. At this point, you might want to deploy the app, and that's what you are going to learn in the next lesson.
|
||||
Feel free to experiment with these metadata fields. At this point, you might want to deploy the app, and that's what you are going to learn in the next lesson.
|
||||
|
||||
<DocsPagination prev="/docs/searching-datasets" next="/docs/deploying-your-portaljs-app" />
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
---
|
||||
showToc: false
|
||||
showSidebar: false
|
||||
title: 'Markdown-based Websites Guide'
|
||||
title: "Markdown-based Websites Guide"
|
||||
disableTitle: true
|
||||
description: Create markdown-based websites and data portals, update it, add collaborators and discover markdown superpowers with Flowershow and PortalJS
|
||||
---
|
||||
|
||||
<Hero title="Markdown-based Websites" subtitle="Create markdown-based website, update it, add collaborators and discover markdown superpowers" />
|
||||
|
||||
## Tutorials
|
||||
|
||||
### Tutorial 1: Create a website from scratch using markdown and PortalJS
|
||||
# Tutorial 1: Create a website from scratch using markdown and PortalJS
|
||||
|
||||
In this tutorial we will walk you through creating an elegant, fully functional website written in simple markdown and published with PortalJS.
|
||||
|
||||
@@ -22,7 +19,7 @@ By the end of this tutorial you will:
|
||||
Below is a screenshot of how the final website will look like:
|
||||
![[tutorial-1-result.png]]
|
||||
|
||||
#### Setup a sandbox website including live publishing
|
||||
### Setup a sandbox website including live publishing
|
||||
|
||||
- Prerequisites: sign up for GitHub and Vercel
|
||||
- Navigate to [datopian/flowershow repository](https://github.com/datopian/flowershow)
|
||||
@@ -30,14 +27,14 @@ Below is a screenshot of how the final website will look like:
|
||||
- Let the site build on Vercel
|
||||
- Visit the site! Yay! Your site is working! 🎉
|
||||
|
||||
#### Now, let's edit the front page
|
||||
### Now, let's edit the front page
|
||||
|
||||
- Navigate to `content/index.md` file in the site repository
|
||||
- Add some text to it
|
||||
- Save and watch the site redeploy
|
||||
- Visit the site! Yay! Your changes are live! 🎉
|
||||
|
||||
#### Let's add a page: e.g. about page
|
||||
### Let's add a page: e.g. about page
|
||||
|
||||
- Navigate to the `content` folder in the site repository
|
||||
- Add `about.md` file with some text
|
||||
@@ -47,7 +44,7 @@ Below is a screenshot of how the final website will look like:
|
||||
> [!tip]
|
||||
> Read full tutorial [[create-a-website-from-scratch|here!]]
|
||||
|
||||
### Tutorial 2: Editing your site locally on your computer
|
||||
# Tutorial 2: Editing your site locally on your computer
|
||||
|
||||
In this tutorial, we will walk you through the process of editing your Flowershow website locally on your computer.
|
||||
|
||||
@@ -63,20 +60,20 @@ Below is a screenshot of how the final website will look like:
|
||||
|
||||
![[tutorial-2-result.png]]
|
||||
|
||||
#### Clone the repository to your computer
|
||||
### Clone the repository to your computer
|
||||
|
||||
- Setup GitHub Desktop app with your GitHub account
|
||||
- Grab your site's repository URL
|
||||
- Open GitHub Desktop app and clone the repository
|
||||
- Yay! You have a copy of your website's repository on your computer! 🎉
|
||||
|
||||
#### Now, let's edit in Obsidian
|
||||
### Now, let's edit in Obsidian
|
||||
|
||||
- Open the `/content` folder of the cloned repository in Obsidian
|
||||
- Edit the home page and the about page
|
||||
- Create a folder with the reviews of books you've read
|
||||
|
||||
#### Commit your changes
|
||||
### Commit your changes
|
||||
|
||||
- Commit the changes in GitHub Desktop app
|
||||
- Push the changes to the remote repository
|
||||
@@ -85,112 +82,3 @@ Below is a screenshot of how the final website will look like:
|
||||
|
||||
> [!tip]
|
||||
> Read full tutorial [[edit-a-website-locally|here!]]
|
||||
|
||||
### Tutorial 3: Collaborating with others on your website project
|
||||
|
||||
In this tutorial, we will guide you through collaborating with others on the same website project using GitHub.
|
||||
|
||||
By the end of this tutorial, you will:
|
||||
|
||||
- Understand what a branch is and how to create one.
|
||||
- Understand what a pull request (PR) is and how to create one.
|
||||
- Learn how to review and merge a PR.
|
||||
- Know how to resolve conflicts if they arise.
|
||||
- Collaborate with others using GitHub, following best practices.
|
||||
|
||||
#### Create a new branch
|
||||
|
||||
- Navigate to your site's repository on GitHub
|
||||
- Click on the 'Branch' dropdown menu, type a new branch name and press Enter
|
||||
- Yay! You've created a new branch! 🎉
|
||||
|
||||
#### Now, let's make changes in the new branch
|
||||
|
||||
- Switch to the new branch in GitHub Desktop
|
||||
- Open the `/content` folder of the repository in Obsidian
|
||||
- Edit the `about` page
|
||||
- Commit the changes in GitHub Desktop app and push them to the remote repository on GitHub
|
||||
|
||||
#### Create a pull request (PR)
|
||||
|
||||
- Go back to your site's repository on GitHub
|
||||
- Click on 'New pull request'
|
||||
- Select your branch from the dropdown menu
|
||||
- Write a brief description of your changes, then click on 'Create pull request'
|
||||
- Yay! Your changes are ready to be reviewed! 🎉
|
||||
|
||||
#### Review and merge a pull request
|
||||
|
||||
- Navigate to the 'Pull requests' tab in your repository
|
||||
- Open the newly created pull request
|
||||
- Review the changes, add comments if necessary
|
||||
- If everything is in order, click 'Merge pull request', then 'Confirm merge'
|
||||
- Yay! You've merged your changes into the main branch! 🎉
|
||||
|
||||
#### Resolving conflicts
|
||||
|
||||
- In case of conflicts between your changes and those on the main branch, GitHub will alert you
|
||||
- Follow the on-screen instructions to resolve the conflicts and merge your changes
|
||||
|
||||
> [!tip]
|
||||
> Read full tutorial [[collaborate-on-website-project|here!]] (TBD)
|
||||
|
||||
### Tutorial 4: Customising your website locally and previewing your changes locally
|
||||
|
||||
In this tutorial, we will dive into the more technical aspects of website customisation, but this time, everything will be done locally. You'll learn how to preview your site on your own machine before pushing changes to the live site, ensuring everything looks and works exactly as you want.
|
||||
|
||||
By the end of this tutorial, you will:
|
||||
|
||||
- Understand how to preview your site locally.
|
||||
- Know how to change your website's title and description.
|
||||
- Learn how to customise your website's appearance using Tailwind themes.
|
||||
- Understand how to configure the navbar, navigation links, and logo.
|
||||
- Learn how to integrate Google Analytics into your website.
|
||||
- Be aware of additional customisation options for deeper customisation.
|
||||
|
||||
#### Previewing the site locally
|
||||
|
||||
- Navigate to your website's repository directory on your computer using command line
|
||||
- Install the site's dependencies
|
||||
- Start the local development server
|
||||
- Visit the local address displayed in your command line. Yay! You can now preview your changes locally, live! 🎉
|
||||
|
||||
#### Changing the site title and description
|
||||
|
||||
- Perfect! You've personalised your site's title and description! 🎉
|
||||
|
||||
#### Configuring the title, description and navbar
|
||||
|
||||
- Open the `content/config.mjs` file in your code editor
|
||||
- Edit the `title` and `description` fields
|
||||
- Edit the fields in the `navbar` field to customise your navbar's title and logo. Then, add navigation links to `navLinks` field (these will be displayed in the navbar). Save and refresh your local site to see the changes.
|
||||
|
||||
#### Integrating with Google Analytics
|
||||
|
||||
- Still in the `content/config.mjs` file, navigate to the `analytics` field
|
||||
- Enter your Google Analytics tracking ID, save and refresh your local site to ensure it's integrated correctly
|
||||
- Excellent! Your website is now integrated with Google Analytics! 🎉
|
||||
|
||||
#### Customising the Tailwind theme
|
||||
|
||||
- Open `tailwind.config.js` file in your code editor
|
||||
- Change the light and dark theme colours and fonts to your liking, save and refresh your local site to see the changes
|
||||
- Awesome! Your website now has a new look! 🎉
|
||||
|
||||
When you're happy with all your changes, use GitHub Desktop to commit your changes and push them back to your GitHub repository.
|
||||
|
||||
In addition to these topics, the full tutorial shows you what other customisations options are available and where to find information on these.
|
||||
|
||||
> [!tip]
|
||||
> Read full tutorial here! (TBD)
|
||||
|
||||
|
||||
## Howtos
|
||||
|
||||
- [[quickly-create-a-sandbox-website|How to quickly create a sandbox website]]
|
||||
- [[edit-text-on-a-single-md-page|How to quickly edit text on a single Markdown-based page]]
|
||||
- [[add-a-simple-md-page|How to add a simple Markdown page]]
|
||||
- [[edit-or-add-md-pages-locally|How to edit or add Markdown-based pages locally on your computer]]
|
||||
- [[how-to-add-images-to-a-md-page|How to add images to a Markdown-based page]]
|
||||
- [[publish-obsidian-vault-to-github|How to push an Obsidian vault to a GitHub repository]]
|
||||
- [[create-a-simple-catalog-of-anything|How to create a simple catalog of anything in Obsidian]]
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
---
|
||||
title: How to quickly add a simple Markdown-based page
|
||||
date: 2023-07-27
|
||||
authors: ['Lauren Wigmore', 'Ola Rubaj']
|
||||
filetype: 'blog'
|
||||
---
|
||||
|
||||
Welcome to this howto on how to quickly add a simple Markdown-based page to your website. The steps here are designed for non-technical contributors. There's no need to know how to code!
|
||||
Welcome to this tutorial on how to quickly add a simple Markdown-based page to your website. The steps here are designed for non-technical contributors. There's no need to know how to code!
|
||||
|
||||
> [!important]
|
||||
> This "How to" is only recommended for very simple Markdown pages, e.g. those without images, links to other pages, diagrams, or other elements that can't be previewed in GitHub preview mode.
|
||||
> This "How to" is only recommended for very simple Markdown pages, e.g. those without images, links to other pages, diagrams, or other elements that can't be previewed in GitHub preview mode.
|
||||
|
||||
> [!tip]
|
||||
>[!tip]
|
||||
> If you are unfamiliar with Markdown (and its different flavours and extra elements supported by Flowershow based websites), check out [this short guide](https://flowershow.app/docs/syntax) on available syntax elements.
|
||||
|
||||
## Steps
|
||||
@@ -23,15 +20,15 @@ Welcome to this howto on how to quickly add a simple Markdown-based page to your
|
||||
> [!tip]
|
||||
> If you want to add your page to a new subfolder, in the "Name your file..." field, first type the name of the new subfolder, followed by a forward slash, .e.g., `blog/`. After you hit the slash, you'll see the name field gets cleared, but the path before it has been extended with your subfolder name. You can repeat this process if you want to put your file into further nested subfolders. Then, simply type the name of the file with ".md" extension.
|
||||
|
||||
5. Paste or write the contents of the file in Markdown format.
|
||||
5. Paste or write the contents of the file in Markdown format.
|
||||
6. (Optionally) Switch to the "Preview" mode, by toggling from "Edit" -> "Preview" at the top of the file content, to see a rough visualisation of your changes. Keep in mind though, that the actual website may have different styling and may support additional Markdown elements that GitHub doesn't render on the preview.
|
||||
7. When you're happy with the content, click on the “Commit changes...” button. In the "Commit message" field, provide a concise summary of your changes. If necessary, you can add further explanation in the "Extended description" text field. Then select “Commit directly to the main branch”, and hit "Commit changes."
|
||||
8. The site is now going to be rebuilt to reflect the changes saved to the `main` branch. This can take up to a few minutes. After this time you should see your page live.
|
||||
5. When you're happy with the content, click on the “Commit changes...” button. In the "Commit message" field, provide a concise summary of your changes. If necessary, you can add further explanation in the "Extended description" text field. Then select “Commit directly to the main branch”, and hit "Commit changes."
|
||||
6. The site is now going to be rebuilt to reflect the changes saved to the `main` branch. This can take up to a few minutes. After this time you should see your page live.
|
||||
|
||||
## Summary
|
||||
|
||||
Congratulations, you've now learned how to create a new Markdown page on your Flowershow-based website.
|
||||
Congratulations, you've now learned how to create a new Markdown page on your Flowershow-based website.
|
||||
|
||||
If anything is not clear to you, or you have suggestions on how we can make this 'How to' better, please don't hesitate to let us know.
|
||||
If anything is not clear to you, or you have suggestions on how we can make this 'How to' better, please don't hesitate to let us know.
|
||||
|
||||
Happy editing!
|
||||
|
||||
@@ -3,6 +3,13 @@ title: How to add or edit content on the Life Itself ecosystem page
|
||||
isDraft: true
|
||||
---
|
||||
|
||||
## Contents
|
||||
|
||||
1. [Introduction](#introduction)
|
||||
2. [How to edit and add to the site](#how-to-edit-and-add-to-the-site)
|
||||
3. [Glossary](#glossary)
|
||||
4. [Contact](#contact)
|
||||
|
||||
## Introduction
|
||||
|
||||
From the outset, we have argued that any successful mapping effort must be collaborative and participatory. To make it as simple as possible to contribute, we have opened up the site, giving it a wiki-like structure, meaning people can contribute and add items directly - no coding required. We hope this can support the ongoing growth of our contributor community, and empower users to continue in collective efforts to make the map ever more useful and informative.
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
---
|
||||
title: How to add Google Analytics?
|
||||
description: Learn to implement Google Analytics on PortalJS data portals
|
||||
---
|
||||
# How to add Google Analytics?
|
||||
|
||||
>[!todo] Prerequisites
|
||||
>- [Google Analytics account](https://support.google.com/analytics/answer/9304153?hl=en)
|
||||
@@ -77,4 +74,4 @@ export default function MyApp({ Component, pageProps }) {
|
||||
```
|
||||
|
||||
>[!info]
|
||||
> For more info on measuring pageviews with Google Analytics see [Google Analytics documentation](https://developers.google.com/analytics/devguides/collection/gtagjs/pages).
|
||||
> For more info on measuring pageviews with Google Analytics see [Google Analytics documentation](https://developers.google.com/analytics/devguides/collection/gtagjs/pages).
|
||||
@@ -1,7 +1,4 @@
|
||||
---
|
||||
title: How to add a simple blog?
|
||||
description: How to add a simple blog on a PortalJS data portal
|
||||
---
|
||||
# How to add a simple blog?
|
||||
|
||||
## Setup
|
||||
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
---
|
||||
title: How to add user comments?
|
||||
description: Learn how to add user comments on a PortalJS data portal
|
||||
---
|
||||
# How to add user comments?
|
||||
|
||||
![[comments-example.png]]
|
||||
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
---
|
||||
title: How to create data-rich documents with charts and tables?
|
||||
description: Learn how to create a data-rich document with charts and tables on a PortalJS data portal
|
||||
---
|
||||
# How to create data-rich documents with charts and tables?
|
||||
|
||||
> [!info] Prerequisites
|
||||
> If you want to enrich your markdown content with charts and tables, you first need to add support for rendering markdown files in your PortalJS app. Follow [[markdown|this guide]] to learn how to do this.
|
||||
@@ -18,12 +15,12 @@ Now, in order to use these components in your markdown files, we need to pass th
|
||||
|
||||
```tsx
|
||||
// e.g. /blog/[[...slug]].tsx
|
||||
import fs from 'fs';
|
||||
import { LineChart, Table, Catalog, Vega, VegaLite } from '@portaljs/components';
|
||||
import fs from "fs";
|
||||
import { LineChart, Table, Catalog, Vega, VegaLite } from "@portaljs/components";
|
||||
|
||||
import { MdxRemote } from 'next-mdx-remote';
|
||||
import clientPromise from '@/lib/mddb.mjs';
|
||||
import parse from '@/lib/markdown';
|
||||
import { MdxRemote } from "next-mdx-remote";
|
||||
import clientPromise from "@/lib/mddb.mjs";
|
||||
import parse from "@/lib/markdown";
|
||||
|
||||
const components = {
|
||||
Table: Table,
|
||||
@@ -32,35 +29,37 @@ const components = {
|
||||
LineChart: LineChart,
|
||||
};
|
||||
|
||||
export default function Page({ source }) {
|
||||
source = JSON.parse(source);
|
||||
|
||||
return (
|
||||
<>
|
||||
<MdxRemote source={source} components={components} />
|
||||
</>
|
||||
);
|
||||
export default function Page({ source }) {
|
||||
source = JSON.parse(source);
|
||||
|
||||
return (
|
||||
<>
|
||||
<MdxRemote source={source} components={components} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
// Import metadata of a file matching the static path and return its parsed source and frontmatter object
|
||||
export const getStaticProps = async ({ params }) => {
|
||||
const urlPath = params?.slug ? (params.slug as string[]).join('/') : '/';
|
||||
const urlPath = params?.slug ? (params.slug as string[]).join("/") : "/";
|
||||
|
||||
const mddb = await clientPromise;
|
||||
const dbFile = await mddb.getFileByUrl(urlPath);
|
||||
const filePath = dbFile!.file_path;
|
||||
// const frontMatter = dbFile!.metadata ?? {};
|
||||
const mddb = await clientPromise;
|
||||
const dbFile = await mddb.getFileByUrl(urlPath);
|
||||
const filePath = dbFile!.file_path;
|
||||
// const frontMatter = dbFile!.metadata ?? {};
|
||||
|
||||
const source = fs.readFileSync(filePath, { encoding: 'utf-8' });
|
||||
const { mdxSource } = await parse(source, 'mdx', {});
|
||||
const source = fs.readFileSync(filePath, { encoding: "utf-8" });
|
||||
const { mdxSource } = await parse(source, "mdx", {});
|
||||
|
||||
return {
|
||||
props: {
|
||||
source: JSON.stringify(mdxSource),
|
||||
// frontMatter
|
||||
},
|
||||
};
|
||||
return {
|
||||
props: {
|
||||
source: JSON.stringify(mdxSource),
|
||||
// frontMatter
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
You can now use these components in your markdown, like so:
|
||||
@@ -94,39 +93,39 @@ Example usage:
|
||||
cols={[
|
||||
{
|
||||
key: 'id',
|
||||
name: 'ID',
|
||||
name: 'ID'
|
||||
},
|
||||
{
|
||||
key: 'firstName',
|
||||
name: 'First name',
|
||||
name: 'First name'
|
||||
},
|
||||
{
|
||||
key: 'lastName',
|
||||
name: 'Last name',
|
||||
name: 'Last name'
|
||||
},
|
||||
{
|
||||
key: 'age',
|
||||
name: 'Age',
|
||||
},
|
||||
name: 'Age'
|
||||
}
|
||||
]}
|
||||
data={[
|
||||
{
|
||||
age: 35,
|
||||
firstName: 'Jon',
|
||||
id: 1,
|
||||
lastName: 'Snow',
|
||||
lastName: 'Snow'
|
||||
},
|
||||
{
|
||||
age: 42,
|
||||
firstName: 'Cersei',
|
||||
id: 2,
|
||||
lastName: 'Lannister',
|
||||
},
|
||||
lastName: 'Lannister'
|
||||
}
|
||||
]}
|
||||
/>
|
||||
```
|
||||
|
||||
> [!info]
|
||||
>[!info]
|
||||
> More info on the [storybook page](https://storybook.portaljs.org/?path=/docs/components-table--docs)
|
||||
|
||||
### Linechart
|
||||
@@ -140,16 +139,31 @@ Example usage:
|
||||
```js
|
||||
<LineChart
|
||||
data={[
|
||||
['1850', -0.41765878],
|
||||
['1851', -0.2333498],
|
||||
['1852', -0.22939907],
|
||||
['1853', -0.27035445],
|
||||
['1854', -0.29163003],
|
||||
[
|
||||
'1850',
|
||||
-0.41765878
|
||||
],
|
||||
[
|
||||
'1851',
|
||||
-0.2333498
|
||||
],
|
||||
[
|
||||
'1852',
|
||||
-0.22939907
|
||||
],
|
||||
[
|
||||
'1853',
|
||||
-0.27035445
|
||||
],
|
||||
[
|
||||
'1854',
|
||||
-0.29163003
|
||||
]
|
||||
]}
|
||||
/>
|
||||
/>
|
||||
```
|
||||
|
||||
> [!info]
|
||||
>[!info]
|
||||
> More info on the [storybook page](https://storybook.portaljs.org/?path=/docs/components-linechart--docs)
|
||||
|
||||
### Vega chart
|
||||
@@ -165,30 +179,30 @@ Example usage:
|
||||
table: [
|
||||
{
|
||||
x: 1850,
|
||||
y: -0.418,
|
||||
y: -0.418
|
||||
},
|
||||
{
|
||||
x: 2020,
|
||||
y: 0.923,
|
||||
},
|
||||
],
|
||||
y: 0.923
|
||||
}
|
||||
]
|
||||
}}
|
||||
spec={{
|
||||
$schema: 'https://vega.github.io/schema/vega-lite/v4.json',
|
||||
data: {
|
||||
name: 'table',
|
||||
name: 'table'
|
||||
},
|
||||
encoding: {
|
||||
x: {
|
||||
field: 'x',
|
||||
type: 'ordinal',
|
||||
type: 'ordinal'
|
||||
},
|
||||
y: {
|
||||
field: 'y',
|
||||
type: 'quantitative',
|
||||
},
|
||||
type: 'quantitative'
|
||||
}
|
||||
},
|
||||
mark: 'bar',
|
||||
mark: 'bar'
|
||||
}}
|
||||
/>
|
||||
```
|
||||
@@ -208,35 +222,35 @@ Example usage:
|
||||
table: [
|
||||
{
|
||||
x: 1850,
|
||||
y: -0.418,
|
||||
y: -0.418
|
||||
},
|
||||
{
|
||||
x: 2020,
|
||||
y: 0.923,
|
||||
},
|
||||
],
|
||||
y: 0.923
|
||||
}
|
||||
]
|
||||
}}
|
||||
spec={{
|
||||
$schema: 'https://vega.github.io/schema/vega-lite/v4.json',
|
||||
data: {
|
||||
name: 'table',
|
||||
name: 'table'
|
||||
},
|
||||
encoding: {
|
||||
x: {
|
||||
field: 'x',
|
||||
type: 'ordinal',
|
||||
type: 'ordinal'
|
||||
},
|
||||
y: {
|
||||
field: 'y',
|
||||
type: 'quantitative',
|
||||
},
|
||||
type: 'quantitative'
|
||||
}
|
||||
},
|
||||
mark: 'bar',
|
||||
mark: 'bar'
|
||||
}}
|
||||
/>
|
||||
```
|
||||
|
||||
> [!info]
|
||||
>[!info]
|
||||
> More info on the [storybook page](https://storybook.portaljs.org/?path=/docs/components-vegalite--docs)
|
||||
|
||||
### Catalog
|
||||
@@ -255,21 +269,28 @@ Example usage:
|
||||
metadata: {
|
||||
'details-of-task': 'Detect and categorise abusive language in social media data',
|
||||
language: 'Albanian',
|
||||
'level-of-annotation': ['Posts'],
|
||||
'level-of-annotation': [
|
||||
'Posts'
|
||||
],
|
||||
'link-to-data': 'https://doi.org/10.6084/m9.figshare.19333298.v1',
|
||||
'link-to-publication': 'https://arxiv.org/abs/2107.13592',
|
||||
medium: ['Text'],
|
||||
medium: [
|
||||
'Text'
|
||||
],
|
||||
'percentage-abusive': 13.2,
|
||||
platform: ['Instagram', 'Youtube'],
|
||||
platform: [
|
||||
'Instagram',
|
||||
'Youtube'
|
||||
],
|
||||
reference: 'Nurce, E., Keci, J., Derczynski, L., 2021. Detecting Abusive Albanian. arXiv:2107.13592',
|
||||
'size-of-dataset': 11874,
|
||||
'task-description': 'Hierarchical (offensive/not; untargeted/targeted; person/group/other)',
|
||||
title: 'Detecting Abusive Albanian',
|
||||
title: 'Detecting Abusive Albanian'
|
||||
},
|
||||
url_path: 'dataset-4',
|
||||
url_path: 'dataset-4'
|
||||
},
|
||||
]}
|
||||
/>
|
||||
/>
|
||||
```
|
||||
|
||||
You can also add facets that are going to act as filters for your metadata.
|
||||
@@ -284,23 +305,30 @@ You can also add facets that are going to act as filters for your metadata.
|
||||
metadata: {
|
||||
'details-of-task': 'Detect and categorise abusive language in social media data',
|
||||
language: 'Albanian',
|
||||
'level-of-annotation': ['Posts'],
|
||||
'level-of-annotation': [
|
||||
'Posts'
|
||||
],
|
||||
'link-to-data': 'https://doi.org/10.6084/m9.figshare.19333298.v1',
|
||||
'link-to-publication': 'https://arxiv.org/abs/2107.13592',
|
||||
medium: ['Text'],
|
||||
medium: [
|
||||
'Text'
|
||||
],
|
||||
'percentage-abusive': 13.2,
|
||||
platform: ['Instagram', 'Youtube'],
|
||||
platform: [
|
||||
'Instagram',
|
||||
'Youtube'
|
||||
],
|
||||
reference: 'Nurce, E., Keci, J., Derczynski, L., 2021. Detecting Abusive Albanian. arXiv:2107.13592',
|
||||
'size-of-dataset': 11874,
|
||||
'task-description': 'Hierarchical (offensive/not; untargeted/targeted; person/group/other)',
|
||||
title: 'Detecting Abusive Albanian',
|
||||
title: 'Detecting Abusive Albanian'
|
||||
},
|
||||
url_path: 'dataset-4',
|
||||
url_path: 'dataset-4'
|
||||
},
|
||||
]}
|
||||
facets={['platform', 'language']}
|
||||
/>
|
||||
/>
|
||||
```
|
||||
|
||||
> [!info]
|
||||
|
||||
>[!info]
|
||||
> More info on the [storybook page](https://storybook.portaljs.org/?path=/docs/components-catalog--docs)
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
---
|
||||
title: 'How to edit a page with a code editor or Obsidian'
|
||||
date: 2023-07-27
|
||||
authors: ['Jake Hirsch', 'Ola Rubaj']
|
||||
filetype: 'blog'
|
||||
title: "How to edit a page with a code editor or Obsidian"
|
||||
isDraft: true
|
||||
---
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
---
|
||||
title: How to edit or add Markdown-based pages locally on your computer
|
||||
date: 2023-07-27
|
||||
authors: ['Jake Hirsch', 'Ola Rubaj']
|
||||
filetype: 'blog'
|
||||
---
|
||||
|
||||
## Intro
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
---
|
||||
title: How to quickly edit text on a single Markdown-based page
|
||||
date: 2023-07-27
|
||||
authors: ['Ola Rubaj']
|
||||
filetype: 'blog'
|
||||
title: How to quickly edit text content on a single Markdown-based page
|
||||
---
|
||||
|
||||
Welcome to this tutorial on how to quickly edit text content on a single Markdown-based page. The steps here are designed for non-technical contributors. There's no need to know how to code!
|
||||
Welcome to this tutorial on how to quickly edit text content on a single Markdown-based page. The steps here are designed for non-technical contributors. There's no need to know how to code!
|
||||
|
||||
> [!important]
|
||||
> This "How to" is only recommended for text changes only, e.g. those that don't include adding images, links to other pages, diagrams, or other elements that can't be previewed in GitHub preview mode.
|
||||
> This "How to" is only recommended for text changes only, e.g. those that don't include adding images, links to other pages, diagrams, or other elements that can't be previewed in GitHub preview mode.
|
||||
|
||||
> [!tip]
|
||||
>[!tip]
|
||||
> If you are unfamiliar with Markdown (and its different flavours and extra elements supported by Flowershow based websites), check out [this short guide](https://flowershow.app/docs/syntax) on available syntax elements.
|
||||
|
||||
## Steps
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
---
|
||||
title: How to add images to a Markdown-based page
|
||||
date: 2023-07-27
|
||||
authors: ['Jake Hirsch', 'Ola Rubaj']
|
||||
filetype: 'blog'
|
||||
---
|
||||
|
||||
## Intro
|
||||
|
||||
Here, you will learn how to add images to a Markdown-based page. These instructions show how to add these images locally, on your computer, so first you need to know how to work locally with GitHub Desktop app and Obsidian. If you're new to these tools, we recommend reading this howto first:
|
||||
|
||||
- [[blog/edit-or-add-md-pages-locally|How to edit or add Markdown pages locally]]
|
||||
|
||||
Or you can follow these two tutorials to start from scratch:
|
||||
|
||||
- [[create-a-website-from-scratch|Tutorial 1: Create a Markdown based website from scratch]]
|
||||
- [[edit-a-website-locally|Tutorial 2: Edit your website locally on your computer]]
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- A GitHub account
|
||||
- A GitHub Desktop app
|
||||
- Obsidian
|
||||
|
||||
## Steps
|
||||
|
||||
### Step 1: Set the assets folder as an attachment folder
|
||||
|
||||
In Obsidian, in the root of your vault, create a new folder called 'assets'. Then, right click on and select "set as attachment folder". By doing so, all the images you paste into your note will automatically be saved to this folder (instead of being saved to the root, next to all your notes). This is necessary for your website to display embedded images.
|
||||
|
||||
### Step 2: Copy and paste your image
|
||||
|
||||
Copy whichever image you would like to add and paste it directly into your Obsidian note. You can check that it has been saved to the "assets" folder.
|
||||
|
||||
### Step 3: Commit and push
|
||||
|
||||
To learn more about this step, see the howto or the tutorials listed in the intro section.
|
||||
|
||||
## Summary
|
||||
|
||||
Congratulations, you've now learned how to add an image to your Markdown page!
|
||||
|
||||
If anything is not clear to you, or you have suggestions on how we can make this 'How to' better, please don't hesitate to let us know.
|
||||
|
||||
Happy editing!
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
title: How to format a perfect Markdown-based page
|
||||
date: 2023-07-27
|
||||
authors: ['Lauren Wigmore', 'Ola Rubaj']
|
||||
filetype: 'blog'
|
||||
isDraft: true
|
||||
---
|
||||
|
||||
Welcome to this information guide to help you understand how to format the perfect Markdown-based page for your website. The information here is designed to give you an overview.
|
||||
|
||||
## Types of Markdown Styles
|
||||
|
||||
There are three types of Markdown options that are supported by Flowershow.
|
||||
|
||||
- CommonMark
|
||||
- GitHub Flavored Markdown (GFM) - a superset of CommonMark
|
||||
- Obsidian Flavored Markdown - a superset of CommonMark with most GFM functionalities plus its own syntax elements, such as wikilinks, callouts, LaTeX, mermaid diagrams, and more.
|
||||
|
||||
Each one has extra functionalities building on top of the previous Markdown option.
|
||||
|
||||
Flowershow aims to be fully Obsidian compatible since it supports most Obsidian Flavored Markdown syntax elements and therefore, it is the best to use as an editor.
|
||||
|
||||
## Useful Links
|
||||
|
||||
It would be too complicated (and long) to explain all of the formatting aspects here, so we have included the links below to provide you with this information and more!
|
||||
[Flowershow Documents Page](https://flowershow.app/docs/syntax) - Use this page to see all of the useful key elements that are frequently required on Flowershow pages.
|
||||
[Obsidian help pages](https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown) - Use this to get more information on Obsidian's supported syntax
|
||||
[GFM cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) - Use this as a quick guide to using Markdown for Github
|
||||
|
||||
## Other useful pages
|
||||
|
||||
[How to quickly add a simple Markdown-based page](https://guide.portaljs.org/guides/add-a-simple-md-page)
|
||||
[How to quickly edit text content on a single Markdown-based page](https://guide.portaljs.org/guides/edit-text-on-a-single-md-page)
|
||||
@@ -1,6 +1,5 @@
|
||||
---
|
||||
title: Guides and Tutorials
|
||||
description: Learn more about how you can achieve different data portal features with PortalJS
|
||||
---
|
||||
|
||||
- [[howtos/analytics|How to add web analytics?]]
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
---
|
||||
title: How to add markdown-based content pages?
|
||||
description: Learn how to add markdown-based content pages on PortalJS data portals
|
||||
---
|
||||
# How to add markdown-based content pages?
|
||||
|
||||
## Add content layer to your app
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
---
|
||||
title: How to push an Obsidian vault to a GitHub repository
|
||||
date: 2023-07-27
|
||||
authors: ['Jake Hirsch', 'Ola Rubaj']
|
||||
filetype: 'blog'
|
||||
---
|
||||
|
||||
This howto walks you through the process of setting up your Obsidian vault as a GitHub repository. Here are some of the benefits of doing so:
|
||||
@@ -37,7 +34,7 @@ In this howto, we will use the GitHub Desktop application, an easy-to-use interf
|
||||
|
||||
2.6. Add an optional description.
|
||||
|
||||
2.7. Make sure the checkbox "Initialise this repository with a README" is unchecked, and "Git Ignore" and "License" are set to "None".
|
||||
2.7. Make sure the checkbox "Initialize this repository with a README" is unchecked, and "Git Ignore" and "License" are set to "None".
|
||||
|
||||
2.8. Click on "Create Repository".
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
---
|
||||
title: How to quickly create a sandbox website
|
||||
date: 2023-07-27
|
||||
authors: ['Lauren Wigmore', 'Ola Rubaj']
|
||||
filetype: 'blog'
|
||||
---
|
||||
|
||||
By the end of this guide you will have a working markdown site you can edit, which gets published automatically online 🎉
|
||||
@@ -25,8 +22,13 @@ The website will then be deployed. This takes approximately 1 minute.
|
||||
|
||||
Once you are on the Congratulations screen, click on the preview of your sandbox website to see the live/published version.
|
||||
|
||||
For instructions on how to add and edit pages, we recommend these howtos:
|
||||
For instructions on how to add and edit pages, we recommend these tutorials:
|
||||
|
||||
- [[howtos/add-a-simple-md-page|How to add a simple markdown page]]
|
||||
- [[howtos/edit-text-on-a-single-md-page|How to edit text on a single markdown-based page]]
|
||||
- [[howtos/edit-or-add-md-pages-locally|How to edit or add a markdown page locally on your computer]]
|
||||
- [[edit-a-page-with-code-editor-or-obsidian|How to edit text content on a single Markdown-based page]]
|
||||
- [[add-a-simple-md-page|How to add a simple Markdown-based page]]
|
||||
|
||||
Here are some other links Vercel links that might be useful for you:
|
||||
|
||||
- [Dashboard Features Overview](https://vercel.com/docs/concepts/dashboard-features/overview)
|
||||
- [Dashboard Features](https://vercel.com/docs/concepts/dashboard-features)
|
||||
- [Projects](https://vercel.com/docs/concepts/projects/project-dashboard)
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
---
|
||||
title: How to customize page metadata for SEO?
|
||||
description: Learn to customize page metadata for SEO on data portals with PortalJS
|
||||
---
|
||||
# How to customize page metadata for SEO?
|
||||
|
||||
>[!info]
|
||||
>See [`next-seo` documentation](https://github.com/garmeeh/next-seo) to learn more.
|
||||
@@ -79,4 +76,4 @@ export default function Page() (
|
||||
```
|
||||
|
||||
>[!info]
|
||||
> To learn more on per-page SEO configuration with `next-seo`, see [this docs section](https://github.com/garmeeh/next-seo#add-seo-to-page)
|
||||
> To learn more on per-page SEO configuration with `next-seo`, see [this docs section](https://github.com/garmeeh/next-seo#add-seo-to-page)
|
||||
@@ -1,7 +1,4 @@
|
||||
---
|
||||
title: How to build a sitemap?
|
||||
description: Learn how to build a sitemap for a data portal with PortalJS
|
||||
---
|
||||
# How to build a sitemap?
|
||||
|
||||
## Setup
|
||||
|
||||
@@ -94,4 +91,4 @@ Add this to the scripts section in your `package.json` to regenerate the sitemap
|
||||
|
||||
"prebuild": "node ./scripts/sitemap.mjs",
|
||||
|
||||
```
|
||||
```
|
||||
@@ -1,6 +1,5 @@
|
||||
---
|
||||
title: "Why use these tools to create a catalog?"
|
||||
isDraft: true
|
||||
---
|
||||
|
||||
On this site, we offer a “recipe” which uses a combination of free tools to easily create a directory of information that can be used for multiple purposes. With this method, you can start capturing information quickly and intuitively in a format that is flexible and usable later for various needs. Why does this help us? Because to map information – to collect, organise, structure, and classify it – and present it clearly is a way to make more sense of it and therefore of the world around us.
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import { h } from 'hastscript';
|
||||
import matter from 'gray-matter';
|
||||
import mdxmermaid from 'mdx-mermaid';
|
||||
import remarkCallouts from '@portaljs/remark-callouts';
|
||||
import remarkEmbed from '@portaljs/remark-embed';
|
||||
import remarkGfm from 'remark-gfm';
|
||||
import remarkMath from 'remark-math';
|
||||
import remarkSmartypants from 'remark-smartypants';
|
||||
import remarkToc from 'remark-toc';
|
||||
import remarkWikiLink, { getPermalinks } from '@portaljs/remark-wiki-link';
|
||||
import rehypeAutolinkHeadings from 'rehype-autolink-headings';
|
||||
import rehypeKatex from 'rehype-katex';
|
||||
import rehypeSlug from 'rehype-slug';
|
||||
import rehypePrismPlus from 'rehype-prism-plus';
|
||||
import { serialize } from 'next-mdx-remote/serialize';
|
||||
import { h } from "hastscript";
|
||||
import matter from "gray-matter";
|
||||
import mdxmermaid from "mdx-mermaid";
|
||||
import remarkCallouts from "@portaljs/remark-callouts";
|
||||
import remarkEmbed from "@portaljs/remark-embed";
|
||||
import remarkGfm from "remark-gfm";
|
||||
import remarkMath from "remark-math";
|
||||
import remarkSmartypants from "remark-smartypants";
|
||||
import remarkToc from "remark-toc";
|
||||
import remarkWikiLink, { getPermalinks } from "@portaljs/remark-wiki-link";
|
||||
import rehypeAutolinkHeadings from "rehype-autolink-headings";
|
||||
import rehypeKatex from "rehype-katex";
|
||||
import rehypeSlug from "rehype-slug";
|
||||
import rehypePrismPlus from "rehype-prism-plus";
|
||||
import { serialize } from "next-mdx-remote/serialize";
|
||||
|
||||
import * as tw from '../tailwind.config';
|
||||
import { siteConfig } from '../config/siteConfig';
|
||||
import * as tw from "../tailwind.config";
|
||||
import { siteConfig } from "../config/siteConfig";
|
||||
|
||||
/**
|
||||
* Parse a markdown or MDX file to an MDX source form + front matter data
|
||||
@@ -36,14 +36,14 @@ const parse = async function (source, format, scope) {
|
||||
remarkPlugins: [
|
||||
remarkEmbed,
|
||||
remarkGfm,
|
||||
[remarkSmartypants, { quotes: false, dashes: 'oldschool' }],
|
||||
[remarkSmartypants, { quotes: false, dashes: "oldschool" }],
|
||||
remarkMath,
|
||||
remarkCallouts,
|
||||
[remarkWikiLink, { permalinks, pathFormat: 'obsidian-short' }],
|
||||
[remarkWikiLink, { permalinks, pathFormat: "obsidian-short" }],
|
||||
[
|
||||
remarkToc,
|
||||
{
|
||||
heading: 'Table of contents',
|
||||
heading: "Table of contents",
|
||||
tight: true,
|
||||
},
|
||||
],
|
||||
@@ -54,29 +54,29 @@ const parse = async function (source, format, scope) {
|
||||
[
|
||||
rehypeAutolinkHeadings,
|
||||
{
|
||||
properties: { className: 'heading-link' },
|
||||
properties: { className: "heading-link" },
|
||||
test(element) {
|
||||
return (
|
||||
['h2', 'h3', 'h4', 'h5', 'h6'].includes(element.tagName) &&
|
||||
element.properties?.id !== 'table-of-contents' &&
|
||||
element.properties?.className !== 'blockquote-heading'
|
||||
["h2", "h3", "h4", "h5", "h6"].includes(element.tagName) &&
|
||||
element.properties?.id !== "table-of-contents" &&
|
||||
element.properties?.className !== "blockquote-heading"
|
||||
);
|
||||
},
|
||||
content(node) {
|
||||
content() {
|
||||
return [
|
||||
h(
|
||||
'svg',
|
||||
"svg",
|
||||
{
|
||||
xmlns: 'http:www.w3.org/2000/svg',
|
||||
xmlns: "http:www.w3.org/2000/svg",
|
||||
fill: tw.theme.extend.colors.secondary.DEFAULT,
|
||||
viewBox: '0 0 20 20',
|
||||
className: 'w-5 h-5',
|
||||
viewBox: "0 0 20 20",
|
||||
className: "w-5 h-5",
|
||||
},
|
||||
[
|
||||
h('path', {
|
||||
fillRule: 'evenodd',
|
||||
clipRule: 'evenodd',
|
||||
d: 'M9.493 2.853a.75.75 0 00-1.486-.205L7.545 6H4.198a.75.75 0 000 1.5h3.14l-.69 5H3.302a.75.75 0 000 1.5h3.14l-.435 3.148a.75.75 0 001.486.205L7.955 14h2.986l-.434 3.148a.75.75 0 001.486.205L12.456 14h3.346a.75.75 0 000-1.5h-3.14l.69-5h3.346a.75.75 0 000-1.5h-3.14l.435-3.147a.75.75 0 00-1.486-.205L12.045 6H9.059l.434-3.147zM8.852 7.5l-.69 5h2.986l.69-5H8.852z',
|
||||
h("path", {
|
||||
fillRule: "evenodd",
|
||||
clipRule: "evenodd",
|
||||
d: "M9.493 2.853a.75.75 0 00-1.486-.205L7.545 6H4.198a.75.75 0 000 1.5h3.14l-.69 5H3.302a.75.75 0 000 1.5h3.14l-.435 3.148a.75.75 0 001.486.205L7.955 14h2.986l-.434 3.148a.75.75 0 001.486.205L12.456 14h3.346a.75.75 0 000-1.5h-3.14l.69-5h3.346a.75.75 0 000-1.5h-3.14l.435-3.147a.75.75 0 00-1.486-.205L12.045 6H9.059l.434-3.147zM8.852 7.5l-.69 5h2.986l.69-5H8.852z",
|
||||
}),
|
||||
]
|
||||
),
|
||||
@@ -84,7 +84,7 @@ const parse = async function (source, format, scope) {
|
||||
},
|
||||
},
|
||||
],
|
||||
[rehypeKatex, { output: 'mathml' }],
|
||||
[rehypeKatex, { output: "mathml" }],
|
||||
[rehypePrismPlus, { ignoreMissing: true }],
|
||||
],
|
||||
format,
|
||||
|
||||
@@ -2,10 +2,4 @@
|
||||
module.exports = {
|
||||
siteUrl: process.env.SITE_URL || 'https://portaljs.org',
|
||||
generateRobotsTxt: true,
|
||||
robotsTxtOptions: {
|
||||
policies: [
|
||||
{ userAgent: '*', disallow: '/people' },
|
||||
{ userAgent: '*', disallow: '/?amp=1' },
|
||||
],
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ import { GetStaticProps, GetStaticPropsResult } from 'next';
|
||||
import { CustomAppProps } from './_app.jsx';
|
||||
import computeFields from '@/lib/computeFields';
|
||||
import { getAuthorsDetails } from '@/lib/getAuthorsDetails';
|
||||
import JSONLD from '@/components/JSONLD';
|
||||
|
||||
export default function Page({ source, meta, sidebarTree }) {
|
||||
source = JSON.parse(source);
|
||||
@@ -30,18 +29,14 @@ export default function Page({ source, meta, sidebarTree }) {
|
||||
}, [router.asPath]); // update table of contents on route change with next/link
|
||||
|
||||
return (
|
||||
<>
|
||||
<JSONLD meta={meta} source={source.compiledSource} />
|
||||
<Layout
|
||||
tableOfContents={tableOfContents}
|
||||
title={meta.title}
|
||||
description={meta.description}
|
||||
sidebarTree={sidebarTree}
|
||||
urlPath={meta.urlPath}
|
||||
>
|
||||
<MDXPage source={source} frontMatter={meta} />
|
||||
</Layout>
|
||||
</>
|
||||
<Layout
|
||||
tableOfContents={tableOfContents}
|
||||
title={meta.title}
|
||||
sidebarTree={sidebarTree}
|
||||
urlPath={meta.urlPath}
|
||||
>
|
||||
<MDXPage source={source} frontMatter={meta} />
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ function MyApp({ Component, pageProps }) {
|
||||
/>
|
||||
<Script
|
||||
id="gtag-init"
|
||||
strategy="lazyOnload"
|
||||
strategy="afterInteractive"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
@@ -3,15 +3,12 @@ import computeFields from '@/lib/computeFields';
|
||||
import clientPromise from '@/lib/mddb';
|
||||
import { BlogsList, SimpleLayout } from '@portaljs/core';
|
||||
import * as fs from 'fs';
|
||||
import { NextSeo } from 'next-seo';
|
||||
import {NextSeo} from 'next-seo';
|
||||
|
||||
export default function Blog({ blogs }) {
|
||||
return (
|
||||
<>
|
||||
<NextSeo
|
||||
title="Blog posts"
|
||||
description="Find news and more information about rapidly building rich data portals using a modern frontend framework in the PortalJS blog"
|
||||
/>
|
||||
<NextSeo title="Blog posts" />
|
||||
<Layout>
|
||||
<SimpleLayout title="Blog posts">
|
||||
<BlogsList blogs={blogs} />
|
||||
@@ -53,9 +50,12 @@ export async function getStaticProps() {
|
||||
const blogList = await Promise.all(blogsWithComputedFields);
|
||||
|
||||
const blogsSorted = blogList.sort(
|
||||
(a, b) => new Date(b?.date).getTime() - new Date(a?.date).getTime()
|
||||
(a, b) =>
|
||||
new Date(b?.date).getTime() -
|
||||
new Date(a?.date).getTime()
|
||||
);
|
||||
|
||||
|
||||
return {
|
||||
props: {
|
||||
blogs: blogsSorted,
|
||||
|
||||
@@ -8,7 +8,6 @@ import { useRouter } from 'next/router';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { collectHeadings } from '@portaljs/core';
|
||||
import Head from 'next/head';
|
||||
import { LogoJsonLd } from 'next-seo';
|
||||
|
||||
export default function Home({ sidebarTree }) {
|
||||
const router = useRouter();
|
||||
@@ -25,10 +24,6 @@ export default function Home({ sidebarTree }) {
|
||||
|
||||
return (
|
||||
<>
|
||||
<LogoJsonLd
|
||||
url="https://portaljs.org"
|
||||
logo="https://portaljs.org/icon.png"
|
||||
/>
|
||||
<Layout
|
||||
isHomePage={true}
|
||||
tableOfContents={tableOfContents}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@import '@portaljs/remark-callouts/styles.css';
|
||||
@import "@portaljs/remark-callouts/styles.css";
|
||||
@import './prism.css';
|
||||
|
||||
html,
|
||||
@@ -31,7 +31,7 @@ html {
|
||||
|
||||
/* tooltip fade-out clip */
|
||||
.tooltip-body::after {
|
||||
content: '';
|
||||
content: "";
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 3.6rem; /* multiple of $line-height used on the tooltip body (defined in tooltipBodyStyle) */
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
"skipDefaultLibCheck": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@portaljs/core": ["packages/core/src/index.ts"],
|
||||
"@portaljs/portaljs-components": [
|
||||
"packages/portaljs-components/src/index.ts"
|
||||
]
|
||||
],
|
||||
"@portaljs/core": ["packages/core/src/index.ts"]
|
||||
}
|
||||
},
|
||||
"exclude": ["node_modules", "tmp"]
|
||||
|
||||
Reference in New Issue
Block a user