diff --git a/components/HeroHeader.tsx b/components/HeroHeader.tsx
new file mode 100644
index 0000000000..3ee28b68e3
--- /dev/null
+++ b/components/HeroHeader.tsx
@@ -0,0 +1,135 @@
+import raf from 'raf'
+import random from 'random'
+import React, { Component } from 'react'
+import FluidAnimation from 'react-fluid-animation'
+
+const exp = random.exponential()
+const numSplatsPerEpoch = 1
+const minSplatRadius = 0.01
+const maxSplatRadius = 0.03
+
+export class HeroHeader extends Component<{
+ className?: string
+}> {
+ _time: number = Date.now()
+ _direction: number
+ _tickRaf: any
+ _timeout: any
+ _animation: any
+
+ componentDidMount() {
+ this._time = Date.now()
+ this._direction = 1
+ this._reset()
+ this._tick()
+ }
+
+ componentWillUnmount() {
+ if (this._tickRaf) {
+ raf.cancel(this._tickRaf)
+ this._tickRaf = null
+ }
+
+ if (this._timeout) {
+ clearTimeout(this._timeout)
+ this._timeout = null
+ }
+ }
+
+ render() {
+ return (
+
+ )
+ }
+
+ _animationRef = (ref) => {
+ this._animation = ref
+ this._reset()
+ }
+
+ _reset() {
+ if (this._animation) {
+ this._animation.config.splatRadius = random.float(
+ minSplatRadius,
+ maxSplatRadius
+ )
+ this._animation.addRandomSplats(random.int(100, 180))
+ }
+ }
+
+ _tick = () => {
+ this._tickRaf = null
+ this._timeout = null
+
+ let scale = 1.0
+
+ if (this._animation) {
+ const w = this._animation.width
+ const h = this._animation.height
+
+ // adjust the intensity scale depending on the canvas width, so it's less
+ // intense on smaller screens
+ const s = Math.max(0.1, Math.min(1, w / 1200))
+ scale = Math.pow(s, 1.2)
+
+ this._animation.config.splatRadius = random.float(
+ minSplatRadius * scale,
+ maxSplatRadius * scale
+ )
+
+ const splats = []
+ for (let i = 0; i < numSplatsPerEpoch; ++i) {
+ const color = [random.float(10), random.float(10), random.float(10)]
+
+ const w0 = w / 3.0
+ const w1 = (w * 2.0) / 3.0
+
+ const h0 = h / 3.0
+ const h1 = (h * 2.0) / 3.0
+
+ // eslint-disable-next-line no-constant-condition
+ while (true) {
+ const x = random.float(w)
+ const y = random.float(h)
+
+ // favor uniformly distributed samples within the center-ish of the canvas
+ if (x > w0 && x < w1 && y > h0 && y < h1) {
+ continue
+ }
+
+ const dx = random.float(-1, 1) * random.float(200, 3000) * scale
+ const dy = random.float(-1, 1) * random.float(200, 3000) * scale
+ const splat = { x, y, dx, dy, color }
+ splats.push(splat)
+ break
+ }
+
+ // old version which generated samples along a circle
+ // const t = random.float(2 * Math.PI)
+ // const cos = Math.cos(t)
+ // const sin = Math.sin(t)
+ // const x = w / 2 + r * cos
+ // const y = h / 2 + r * sin + yOffset
+ // const k = random.float() > 0.98 ? random.float(3, 10) : 1
+ // const dx = k * random.float(-1, 1) * random.float(50, 300) * cos
+ // const dy = k * random.float(-1, 1) * random.float(50, 300) * sin
+ // const splat = { x, y, dx, dy, color }
+ // splats.push(splat)
+ }
+
+ this._animation.addSplats(splats)
+ }
+
+ // using an exponential distribution here allows us to favor bursts of activity
+ // but also allow for more occasional pauses
+ const dampenedScale = Math.pow(scale, 0.2)
+ const timeout = (exp() * 100) / dampenedScale
+
+ this._timeout = setTimeout(() => {
+ this._tickRaf = raf(this._tick)
+ }, timeout)
+ }
+}
diff --git a/components/NotionPage.tsx b/components/NotionPage.tsx
index 629d3ce248..ce6c81ee28 100644
--- a/components/NotionPage.tsx
+++ b/components/NotionPage.tsx
@@ -4,7 +4,13 @@ import Image from 'next/legacy/image'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { type PageBlock } from 'notion-types'
-import { formatDate, getBlockTitle, getPageProperty } from 'notion-utils'
+import {
+ formatDate,
+ getBlockTitle,
+ getPageProperty,
+ normalizeTitle,
+ parsePageId
+} from 'notion-utils'
import * as React from 'react'
import BodyClassName from 'react-body-classname'
import {
@@ -80,15 +86,6 @@ const Collection = dynamic(() =>
(m) => m.Collection
)
)
-const Equation = dynamic(() =>
- import('react-notion-x/build/third-party/equation').then((m) => m.Equation)
-)
-const Pdf = dynamic(
- () => import('react-notion-x/build/third-party/pdf').then((m) => m.Pdf),
- {
- ssr: false
- }
-)
const Modal = dynamic(
() =>
import('react-notion-x/build/third-party/modal').then((m) => {
@@ -152,11 +149,35 @@ const propertyTextValue = (
return defaultFn()
}
+const propertySelectValue = (
+ { schema, value, key, pageHeader },
+ defaultFn: () => React.ReactNode
+) => {
+ value = normalizeTitle(value)
+
+ if (pageHeader && schema.type === 'multi_select' && value) {
+ return (
+
+ {defaultFn()}
+
+ )
+ }
+
+ return defaultFn()
+}
+
+const HeroHeader = dynamic<{ className?: string }>(
+ () => import('./HeroHeader').then((m) => m.HeroHeader),
+ { ssr: false }
+)
+
export function NotionPage({
site,
recordMap,
error,
- pageId
+ pageId,
+ tagsPage,
+ propertyToFilterName
}: types.PageProps) {
const router = useRouter()
const lite = useSearchParam('lite')
@@ -167,14 +188,13 @@ export function NotionPage({
nextLink: Link,
Code,
Collection,
- Equation,
- Pdf,
Modal,
Tweet,
Header: NotionPageHeader,
propertyLastEditedTimeValue,
propertyTextValue,
- propertyDateValue
+ propertyDateValue,
+ propertySelectValue
}),
[]
)
@@ -199,6 +219,8 @@ export function NotionPage({
// parsePageId(block?.id) === parsePageId(site?.rootNotionPageId)
const isBlogPost =
block?.type === 'page' && block?.parent_table === 'collection'
+ const isBioPage =
+ parsePageId(block?.id) === parsePageId('8d0062776d0c4afca96eb1ace93a7538')
const showTableOfContents = !!isBlogPost
const minTableOfContentsItems = 3
@@ -212,6 +234,16 @@ export function NotionPage({
const footer = React.useMemo(() => , [])
+ const pageCover = React.useMemo(() => {
+ if (isBioPage) {
+ return (
+
+ )
+ } else {
+ return null
+ }
+ }, [isBioPage])
+
if (router.isFallback) {
return
}
@@ -220,7 +252,9 @@ export function NotionPage({
return
}
- const title = getBlockTitle(block, recordMap) || site.name
+ const name = getBlockTitle(block, recordMap) || site.name
+ const title =
+ tagsPage && propertyToFilterName ? `${propertyToFilterName} ${name}` : name
console.log('notion page', {
isDev: config.isDev,
@@ -269,7 +303,8 @@ export function NotionPage({
diff --git a/components/PageHead.tsx b/components/PageHead.tsx
index ccc4bfc737..3532fb9612 100644
--- a/components/PageHead.tsx
+++ b/components/PageHead.tsx
@@ -95,6 +95,7 @@ export function PageHead({
href={rssFeedUrl}
title={site?.name}
/>
+
diff --git a/lib/types.ts b/lib/types.ts
index e1d38d2bec..e596ac484e 100644
--- a/lib/types.ts
+++ b/lib/types.ts
@@ -16,6 +16,8 @@ export interface PageProps {
recordMap?: ExtendedRecordMap
pageId?: string
error?: PageError
+ tagsPage?: boolean
+ propertyToFilterName?: string | string
}
export interface ExtendedTweetRecordMap extends ExtendedRecordMap {
diff --git a/package.json b/package.json
index 452b457dfb..8041c9d351 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
"expiry-map": "^2.0.0",
"fathom-client": "^3.4.1",
"ky": "^1.7.2",
+ "lodash.omit": "^4.5.0",
"lqip-modern": "^2.2.1",
"next": "^15.0.3",
"notion-client": "^7.1.3",
@@ -47,9 +48,12 @@
"p-memoize": "^7.1.1",
"posthog-js": "^1.181.0",
"prismjs": "^1.29.0",
+ "raf": "^3.4.1",
+ "random": "^5.1.1",
"react": "^18.2.0",
"react-body-classname": "^1.3.1",
"react-dom": "^18.2.0",
+ "react-fluid-animation": "^1.0.1",
"react-notion-x": "^7.2.3",
"react-tweet": "^3.2.1",
"react-use": "^17.4.2",
@@ -58,7 +62,9 @@
"devDependencies": {
"@fisch0920/eslint-config": "^1.4.0",
"@next/bundle-analyzer": "^15.0.2",
+ "@types/lodash.omit": "^4.5.6",
"@types/node": "^22.8.6",
+ "@types/raf": "^3.4.3",
"@types/react": "^18.0.21",
"cross-env": "^7.0.2",
"eslint": "^8.57.1",
diff --git a/pages/[pageId].tsx b/pages/[pageId].tsx
index 35bf6a5db6..adb8f1b06e 100644
--- a/pages/[pageId].tsx
+++ b/pages/[pageId].tsx
@@ -14,7 +14,7 @@ export const getStaticProps: GetStaticProps = async (
try {
const props = await resolveNotionPage(domain, rawPageId)
- return { props, revalidate: 10 }
+ return { props, revalidate: 60 }
} catch (err) {
console.error('page error', domain, rawPageId, err)
diff --git a/pages/_app.tsx b/pages/_app.tsx
index d7fd2ba7fe..4d07130488 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -1,5 +1,6 @@
// used for rendering equations (optional)
-import 'katex/dist/katex.min.css'
+// import 'katex/dist/katex.min.css'
+
// used for code syntax highlighting (optional)
import 'prismjs/themes/prism-coy.css'
// core styles shared by all of react-notion-x (required)
diff --git a/pages/_document.tsx b/pages/_document.tsx
index 28cc023758..1dc14e2c8a 100644
--- a/pages/_document.tsx
+++ b/pages/_document.tsx
@@ -12,9 +12,19 @@ export default class MyDocument extends Document {
rel='icon'
type='image/png'
sizes='32x32'
- href='favicon.png'
+ href='favicon-32x32.png'
+ />
+
+
-
diff --git a/pages/index.tsx b/pages/index.tsx
index daa05b7918..228cc6c80d 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -6,7 +6,7 @@ export const getStaticProps = async () => {
try {
const props = await resolveNotionPage(domain)
- return { props, revalidate: 10 }
+ return { props, revalidate: 60 }
} catch (err) {
console.error('page error', domain, err)
diff --git a/pages/robots.txt.tsx b/pages/robots.txt.tsx
index 2b374f49c6..3b77c6094a 100644
--- a/pages/robots.txt.tsx
+++ b/pages/robots.txt.tsx
@@ -14,8 +14,11 @@ export const getServerSideProps: GetServerSideProps = async ({ req, res }) => {
}
}
- // cache for up to one day
- res.setHeader('Cache-Control', 'public, max-age=86400, immutable')
+ // cache at vercel edge for up to one day
+ res.setHeader(
+ 'Cache-Control',
+ 'max-age=0, s-maxage=86400, stale-while-revalidate=3600'
+ )
res.setHeader('Content-Type', 'text/plain')
// only allow the site to be crawlable on the production deployment
diff --git a/pages/tags/[tagName].tsx b/pages/tags/[tagName].tsx
new file mode 100644
index 0000000000..61204c826a
--- /dev/null
+++ b/pages/tags/[tagName].tsx
@@ -0,0 +1,139 @@
+import { domain, isDev, rootNotionPageId } from 'lib/config'
+import { resolveNotionPage } from 'lib/resolve-notion-page'
+import omit from 'lodash.omit'
+import { type ExtendedRecordMap } from 'notion-types'
+import { normalizeTitle } from 'notion-utils'
+import React from 'react'
+
+import { NotionPage } from '@/components/NotionPage'
+
+const tagsPropertyNameLowerCase = 'tags'
+
+export const getStaticProps = async (context) => {
+ const rawTagName = (context.params.tagName as string) || ''
+
+ try {
+ const props = await resolveNotionPage(domain, rootNotionPageId)
+ let propertyToFilterName: string = null
+
+ if ((props as any).recordMap) {
+ const recordMap = (props as any).recordMap as ExtendedRecordMap
+ const collection = Object.values(recordMap.collection)[0]?.value
+
+ if (collection) {
+ const galleryView = Object.values(recordMap.collection_view).find(
+ (view) => view.value?.type === 'gallery'
+ )?.value
+
+ if (galleryView) {
+ const galleryBlock = Object.values(recordMap.block).find(
+ (block) =>
+ block.value?.type === 'collection_view' &&
+ block.value.view_ids?.includes(galleryView.id)
+ )
+
+ if (galleryBlock?.value) {
+ recordMap.block = {
+ [galleryBlock.value.id]: galleryBlock,
+ ...omit(recordMap.block, [galleryBlock.value.id])
+ }
+
+ const propertyToFilter = Object.entries(collection.schema).find(
+ (property) =>
+ property[1]?.name?.toLowerCase() === tagsPropertyNameLowerCase
+ )
+ const propertyToFilterId = propertyToFilter?.[0]
+ const filteredValue = normalizeTitle(rawTagName)
+ propertyToFilterName = propertyToFilter?.[1]?.options.find(
+ (option) => normalizeTitle(option.value) === filteredValue
+ )?.value
+
+ if (propertyToFilterId && filteredValue) {
+ const query =
+ recordMap.collection_query[collection.id]?.[galleryView.id]
+ const queryResults = query?.collection_group_results ?? query
+
+ if (queryResults) {
+ queryResults.blockIds = queryResults.blockIds.filter((id) => {
+ const block = recordMap.block[id]?.value
+ if (!block || !block.properties) {
+ return false
+ }
+
+ const value = block.properties[propertyToFilterId]?.[0]?.[0]
+ if (!value) {
+ return false
+ }
+
+ const values = value.split(',')
+ if (
+ // eslint-disable-next-line unicorn/prefer-array-some
+ !values.find(
+ (value: string) => normalizeTitle(value) === filteredValue
+ )
+ ) {
+ return false
+ }
+
+ return true
+ })
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return {
+ props: {
+ ...props,
+ tagsPage: true,
+ propertyToFilterName
+ },
+ revalidate: 10
+ }
+ } catch (err) {
+ console.error('page error', domain, rawTagName, err)
+
+ // we don't want to publish the error version of this page, so
+ // let next.js know explicitly that incremental SSG failed
+ throw err
+ }
+}
+
+export async function getStaticPaths() {
+ if (!isDev) {
+ const props = await resolveNotionPage(domain, rootNotionPageId)
+
+ if ((props as any).recordMap) {
+ const recordMap = (props as any).recordMap as ExtendedRecordMap
+ const collection = Object.values(recordMap.collection)[0]?.value
+
+ if (collection) {
+ const propertyToFilterSchema = Object.entries(collection.schema).find(
+ (property) =>
+ property[1]?.name?.toLowerCase() === tagsPropertyNameLowerCase
+ )?.[1]
+
+ const paths = propertyToFilterSchema.options
+ .map((option) => normalizeTitle(option.value))
+ .filter(Boolean)
+ .map((slug) => `/tags/${slug}`)
+
+ return {
+ paths,
+ fallback: true
+ }
+ }
+ }
+ }
+
+ return {
+ paths: [],
+ fallback: true
+ }
+}
+
+export default function NotionTagsPage(props) {
+ return
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index be02629a53..5574ac721a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -32,6 +32,9 @@ importers:
ky:
specifier: ^1.7.2
version: 1.7.2
+ lodash.omit:
+ specifier: ^4.5.0
+ version: 4.5.0
lqip-modern:
specifier: ^2.2.1
version: 2.2.1
@@ -59,6 +62,12 @@ importers:
prismjs:
specifier: ^1.29.0
version: 1.29.0
+ raf:
+ specifier: ^3.4.1
+ version: 3.4.1
+ random:
+ specifier: ^5.1.1
+ version: 5.1.1
react:
specifier: ^18.2.0
version: 18.3.1
@@ -68,6 +77,9 @@ importers:
react-dom:
specifier: ^18.2.0
version: 18.3.1(react@18.3.1)
+ react-fluid-animation:
+ specifier: ^1.0.1
+ version: 1.0.1(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-notion-x:
specifier: ^7.2.3
version: 7.2.3(@babel/runtime@7.26.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -87,9 +99,15 @@ importers:
'@next/bundle-analyzer':
specifier: ^15.0.2
version: 15.0.2
+ '@types/lodash.omit':
+ specifier: ^4.5.6
+ version: 4.5.9
'@types/node':
specifier: ^22.8.6
version: 22.8.6
+ '@types/raf':
+ specifier: ^3.4.3
+ version: 3.4.3
'@types/react':
specifier: ^18.0.21
version: 18.3.12
@@ -405,6 +423,12 @@ packages:
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ '@types/lodash.omit@4.5.9':
+ resolution: {integrity: sha512-zuAVFLUPJMOzsw6yawshsYGgq2hWUHtsZgeXHZmSFhaQQFC6EQ021uDKHkSjOpNhSvtNSU9165/o3o/Q51GpTw==}
+
+ '@types/lodash@4.17.13':
+ resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
+
'@types/node@22.8.6':
resolution: {integrity: sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==}
@@ -414,6 +438,9 @@ packages:
'@types/prop-types@15.7.13':
resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
+ '@types/raf@3.4.3':
+ resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==}
+
'@types/react@18.3.12':
resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==}
@@ -591,6 +618,9 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ batch-processor@1.0.0:
+ resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==}
+
brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
@@ -805,6 +835,9 @@ packages:
electron-to-chromium@1.5.50:
resolution: {integrity: sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==}
+ element-resize-detector@1.2.4:
+ resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==}
+
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -1457,6 +1490,9 @@ packages:
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ lodash.omit@4.5.0:
+ resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==}
+
loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
@@ -1782,6 +1818,9 @@ packages:
resolution: {integrity: sha512-MbkAjpwka/dMHaCfQ75RY1FXX3IewBVu6NGZOcxerRFlaBiIkZmUoR0jotX5VUzYZEXAGzSFtknWs5xRKliXPA==}
engines: {node: '>=18'}
+ performance-now@2.1.0:
+ resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -1835,6 +1874,13 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ raf@3.4.1:
+ resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==}
+
+ random@5.1.1:
+ resolution: {integrity: sha512-iidvORUvXY1ItoYxO0eduHCKl22QV0G6460vRHe862dUagJKPhRyjUGwK8ioOCG4NRuFvExHFpqMngsnr2miwA==}
+ engines: {node: '>=18'}
+
react-body-classname@1.3.1:
resolution: {integrity: sha512-PxskbhmoV8kzIyspjiIc/smQkyyBOQHeUsrh1oj9CC5O1Kg/4gvHWPKsYGWEIq0X51TtCT941u/ulM1dTZ/bOw==}
@@ -1846,6 +1892,14 @@ packages:
react-fast-compare@3.2.2:
resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+ react-fluid-animation@1.0.1:
+ resolution: {integrity: sha512-+6Ld/cPmpCqkBCcf8Ch0yAbSwB+qWCHem+SkAestxWbqFDyhdX5waIaNemREq1owD5h3iAxqQfA+7XDPFYyaVA==}
+ engines: {node: '>=8', npm: '>=5'}
+ peerDependencies:
+ prop-types: ^15.5.4
+ react: ^15.0.0 || ^16.0.0
+ react-dom: ^15.0.0 || ^16.0.0
+
react-hotkeys-hook@4.6.1:
resolution: {integrity: sha512-XlZpbKUj9tkfgPgT9gA+1p7Ey6vFIZHttUjPqpTdyT5nqQ8mHL7elxvSbaC+dpSiHUSmr21Ya1mDxBZG3aje4Q==}
peerDependencies:
@@ -1905,6 +1959,12 @@ packages:
peerDependencies:
react: ^16.3.0 || ^17.0.0 || ^18.0.0
+ react-sizeme@2.6.12:
+ resolution: {integrity: sha512-tL4sCgfmvapYRZ1FO2VmBmjPVzzqgHA7kI8lSJ6JS6L78jXFNRdOZFpXyK6P1NBZvKPPCZxReNgzZNUajAerZw==}
+ peerDependencies:
+ react: ^0.14.0 || ^15.0.0-0 || ^16.0.0
+ react-dom: ^0.14.0 || ^15.0.0-0 || ^16.0.0
+
react-tweet@3.2.1:
resolution: {integrity: sha512-dktP3RMuwRB4pnSDocKpSsW5Hq1IXRW6fONkHhxT5EBIXsKZzdQuI70qtub1XN2dtZdkJWWxfBm/Q+kN+vRYFA==}
peerDependencies:
@@ -2059,6 +2119,9 @@ packages:
resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==}
engines: {node: '>=6.9'}
+ shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+
sharp@0.33.5:
resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2226,6 +2289,10 @@ packages:
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ throttle-debounce@2.3.0:
+ resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==}
+ engines: {node: '>=8'}
+
throttle-debounce@3.0.1:
resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==}
engines: {node: '>=10'}
@@ -2476,8 +2543,8 @@ snapshots:
'@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3)
'@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.3)
eslint-config-prettier: 9.1.0(eslint@8.57.1)
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)
eslint-plugin-jest-dom: 5.4.0(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
@@ -2694,6 +2761,12 @@ snapshots:
'@types/json5@0.0.29': {}
+ '@types/lodash.omit@4.5.9':
+ dependencies:
+ '@types/lodash': 4.17.13
+
+ '@types/lodash@4.17.13': {}
+
'@types/node@22.8.6':
dependencies:
undici-types: 6.19.8
@@ -2702,6 +2775,8 @@ snapshots:
'@types/prop-types@15.7.13': {}
+ '@types/raf@3.4.3': {}
+
'@types/react@18.3.12':
dependencies:
'@types/prop-types': 15.7.13
@@ -2923,6 +2998,8 @@ snapshots:
balanced-match@1.0.2: {}
+ batch-processor@1.0.0: {}
+
brace-expansion@1.1.11:
dependencies:
balanced-match: 1.0.2
@@ -3129,6 +3206,10 @@ snapshots:
electron-to-chromium@1.5.50: {}
+ element-resize-detector@1.2.4:
+ dependencies:
+ batch-processor: 1.0.0
+
emoji-regex@8.0.0:
optional: true
@@ -3257,37 +3338,37 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1):
+ eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.7
enhanced-resolve: 5.17.1
eslint: 8.57.1
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
fast-glob: 3.3.2
get-tsconfig: 4.8.1
is-bun-module: 1.2.1
is-glob: 4.0.3
optionalDependencies:
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1)
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@@ -3298,7 +3379,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -3923,6 +4004,8 @@ snapshots:
lodash.merge@4.6.2: {}
+ lodash.omit@4.5.0: {}
+
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
@@ -4250,6 +4333,8 @@ snapshots:
- supports-color
optional: true
+ performance-now@2.1.0: {}
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -4291,6 +4376,12 @@ snapshots:
queue-microtask@1.2.3: {}
+ raf@3.4.1:
+ dependencies:
+ performance-now: 2.1.0
+
+ random@5.1.1: {}
+
react-body-classname@1.3.1(react@18.3.1):
dependencies:
prop-types: 15.8.1
@@ -4306,6 +4397,14 @@ snapshots:
react-fast-compare@3.2.2: {}
+ react-fluid-animation@1.0.1(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ prop-types: 15.8.1
+ raf: 3.4.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-sizeme: 2.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
react-hotkeys-hook@4.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
react: 18.3.1
@@ -4389,6 +4488,15 @@ snapshots:
dependencies:
react: 18.3.1
+ react-sizeme@2.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ element-resize-detector: 1.2.4
+ invariant: 2.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ shallowequal: 1.1.0
+ throttle-debounce: 2.3.0
+
react-tweet@3.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@swc/helpers': 0.5.13
@@ -4573,6 +4681,8 @@ snapshots:
set-harmonic-interval@1.0.1: {}
+ shallowequal@1.1.0: {}
+
sharp@0.33.5:
dependencies:
color: 4.2.3
@@ -4782,6 +4892,8 @@ snapshots:
text-table@0.2.0: {}
+ throttle-debounce@2.3.0: {}
+
throttle-debounce@3.0.1: {}
tiny-invariant@1.3.3:
diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png
new file mode 100644
index 0000000000..245f47bf6c
Binary files /dev/null and b/public/android-chrome-192x192.png differ
diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png
new file mode 100644
index 0000000000..f4b647f5cd
Binary files /dev/null and b/public/android-chrome-512x512.png differ
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
new file mode 100644
index 0000000000..53809c3610
Binary files /dev/null and b/public/apple-touch-icon.png differ
diff --git a/public/favicon-128x128.png b/public/favicon-128x128.png
deleted file mode 100644
index 8be6cf3486..0000000000
Binary files a/public/favicon-128x128.png and /dev/null differ
diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png
new file mode 100644
index 0000000000..aad1806166
Binary files /dev/null and b/public/favicon-16x16.png differ
diff --git a/public/favicon-192x192.png b/public/favicon-192x192.png
deleted file mode 100644
index a53861f38e..0000000000
Binary files a/public/favicon-192x192.png and /dev/null differ
diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png
new file mode 100644
index 0000000000..9ce7d63c65
Binary files /dev/null and b/public/favicon-32x32.png differ
diff --git a/public/favicon-96x96.png b/public/favicon-96x96.png
new file mode 100644
index 0000000000..49012ca3a1
Binary files /dev/null and b/public/favicon-96x96.png differ
diff --git a/public/favicon.ico b/public/favicon.ico
index ea2f437d9d..c787b24958 100644
Binary files a/public/favicon.ico and b/public/favicon.ico differ
diff --git a/public/favicon.png b/public/favicon.png
deleted file mode 100644
index d91bdfb3cb..0000000000
Binary files a/public/favicon.png and /dev/null differ
diff --git a/public/manifest.json b/public/manifest.json
index f961a3cec2..a8fa10ff2d 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -1,21 +1,36 @@
{
- "name": "Next.js Notion Starter Kit",
- "short_name": "Starter Kit",
+ "name": "Transitive Bullshit",
+ "short_name": "Transitive BS",
"icons": [
{
- "src": "/favicon.png",
+ "src": "/favicon-16x16.png",
+ "type": "image/png",
+ "sizes": "16x16"
+ },
+ {
+ "src": "/favicon-32x32.png",
"type": "image/png",
"sizes": "32x32"
},
{
- "src": "/favicon-128x128.png",
+ "src": "/favicon-96x96.png",
"type": "image/png",
- "sizes": "128x128"
+ "sizes": "96x96"
},
{
- "src": "/favicon-192x192.png",
+ "src": "/apple-touch-icon.png",
"type": "image/png",
- "sizes": "192x192"
+ "sizes": "180x180"
+ },
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
}
],
"theme_color": "#000000",
diff --git a/public/page-cover.jpg b/public/page-cover.jpg
new file mode 100644
index 0000000000..a7386748b7
Binary files /dev/null and b/public/page-cover.jpg differ
diff --git a/public/page-icon.png b/public/page-icon.png
new file mode 100644
index 0000000000..b1ead0023c
Binary files /dev/null and b/public/page-icon.png differ
diff --git a/site.config.ts b/site.config.ts
index cded79c3bf..375b8e5fe2 100644
--- a/site.config.ts
+++ b/site.config.ts
@@ -2,19 +2,19 @@ import { siteConfig } from './lib/site-config'
export default siteConfig({
// the site's root Notion page (required)
- rootNotionPageId: '7875426197cf461698809def95960ebf',
+ rootNotionPageId: '78fc5a4b88d74b0e824e29407e9f1ec1',
// if you want to restrict pages to a single notion workspace (optional)
// (this should be a Notion ID; see the docs for how to extract this)
- rootNotionSpaceId: null,
+ rootNotionSpaceId: 'fde5ac74eea345278f004482710e1af3',
// basic site info (required)
- name: 'Next.js Notion Starter Kit',
- domain: 'nextjs-notion-starter-kit.transitivebullsh.it',
+ name: 'Transitive Bullshit',
+ domain: 'transitivebullsh.it',
author: 'Travis Fischer',
// open graph metadata (optional)
- description: 'Example Next.js Notion Starter Kit Site',
+ description: 'Personal site of Travis Fischer aka Transitive Bullshit',
// social usernames (optional)
twitter: 'transitive_bs',
@@ -26,8 +26,8 @@ export default siteConfig({
// default notion icon and cover images for site-wide consistency (optional)
// page-specific values will override these site-wide defaults
- defaultPageIcon: null,
- defaultPageCover: null,
+ defaultPageIcon: 'https://transitivebullsh.it/page-icon.png',
+ defaultPageCover: 'https://transitivebullsh.it/page-cover.jpg',
defaultPageCoverPosition: 0.5,
// whether or not to enable support for LQIP preview images (optional)
@@ -36,7 +36,7 @@ export default siteConfig({
// whether or not redis is enabled for caching generated preview images (optional)
// NOTE: if you enable redis, you need to set the `REDIS_HOST` and `REDIS_PASSWORD`
// environment variables. see the readme for more info
- isRedisEnabled: false,
+ isRedisEnabled: true,
// map of notion page IDs to URL paths (optional)
// any pages defined here will override their default URL paths
@@ -48,18 +48,21 @@ export default siteConfig({
// }
pageUrlOverrides: null,
+ pageUrlAdditions: {
+ '/the-social-audio-revolution': 'c4deaf33cc924ad7a5b9f69c6ae04a01'
+ },
+
// whether to use the default notion navigation style or a custom one with links to
- // important pages. To use `navigationLinks`, set `navigationStyle` to `custom`.
- navigationStyle: 'default'
- // navigationStyle: 'custom',
- // navigationLinks: [
- // {
- // title: 'About',
- // pageId: 'f1199d37579b41cbabfc0b5174f4256a'
- // },
- // {
- // title: 'Contact',
- // pageId: '6a29ebcb935a4f0689fe661ab5f3b8d1'
- // }
- // ]
+ // important pages
+ navigationStyle: 'custom',
+ navigationLinks: [
+ {
+ title: 'About',
+ pageId: '8d0062776d0c4afca96eb1ace93a7538'
+ },
+ {
+ title: 'Contact',
+ pageId: '9a7ddf2973444067bbc5ce0a4e0e0058'
+ }
+ ]
})
diff --git a/styles/notion.css b/styles/notion.css
index 94a7f309fe..548b617f50 100644
--- a/styles/notion.css
+++ b/styles/notion.css
@@ -21,10 +21,23 @@
line-height: 1.65;
}
-.index-page {
+.index-page,
+.tags-page {
--notion-max-width: 900px;
}
+.tags-page .notion-collection-header {
+ display: none;
+}
+
+.tags-page .notion-gallery {
+ padding-top: 2em;
+}
+
+.tags-page .notion-gallery-grid {
+ padding-top: 4em;
+}
+
.notion-text {
padding: 0.5em 2px;
}
@@ -202,6 +215,14 @@
box-shadow: 2px 2px 8px 4px rgba(15, 15, 15, 0.1);
}
+.notion-page-cover-hero {
+ cursor: grab;
+}
+
+.notion-page-cover-hero:active {
+ cursor: grabbing;
+}
+
@media only screen and (max-width: 1200px) {
.notion-page-cover-wrapper,
.notion-page-cover-wrapper span,
@@ -347,10 +368,22 @@
background: none !important;
}
+.notion-row {
+ overflow: unset;
+}
+
+.notion-block-f382a57807bc40779860eb079d0144f2 img.medium-zoom-image {
+ border-radius: 8px;
+ box-shadow: 4px 4px 24px rgb(0 0 0 / 21%);
+}
+.notion-block-f382a57807bc40779860eb079d0144f2 span {
+ overflow: visible !important;
+}
+
/* if you don't want rounded page icon images, remove this */
.notion-page-icon-hero.notion-page-icon-image {
border-radius: 50%;
- box-shadow: 0 8px 40px 0 rgb(0 0 0 / 21%);
+ box-shadow: 4px 4px 24px 0 rgb(0 0 0 / 21%);
}
.notion-page-icon-hero.notion-page-icon-image span,
.notion-page-icon-hero.notion-page-icon-image img {
@@ -400,6 +433,47 @@
color: var(--fg-color-2);
}
-.notion-equation.notion-equation-block{
+.notion-equation.notion-equation-block {
align-items: center;
}
+
+.notion-block-dfc7f709ae3e42c69292f6543d5586f0 .notion-collection-header {
+ display: none;
+}
+
+.notion-block-dfc7f709ae3e42c69292f6543d5586f0
+ .notion-collection-column-title-icon {
+ display: none;
+}
+
+.notion-block-dfc7f709ae3e42c69292f6543d5586f0
+ .notion-table
+ .notion-page-icon-inline {
+ display: none;
+}
+
+.notion-block-dfc7f709ae3e42c69292f6543d5586f0 .notion-table {
+ width: 100% !important;
+ max-width: 100vw !important;
+ margin: 1em 0;
+}
+
+.notion-block-dfc7f709ae3e42c69292f6543d5586f0 .notion-table-view {
+ padding-left: 12px !important;
+ padding-right: 12px !important;
+}
+
+.notion-block-266ce1a8316f44ecbd36e3908ebdba78
+ .notion-page-icon-hero.notion-page-icon-image {
+ border-radius: unset;
+ box-shadow: none;
+}
+
+.notion-block-266ce1a8316f44ecbd36e3908ebdba78
+ .notion-page-icon-hero.notion-page-icon-image
+ img,
+.notion-block-266ce1a8316f44ecbd36e3908ebdba78
+ .notion-page-icon-hero.notion-page-icon-image
+ span {
+ border-radius: unset;
+}