From d9b8ae95bda6d7d7ed4759e0d85e31d796d3daca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Mon, 30 Oct 2023 18:48:17 -0400 Subject: [PATCH] Add icons and color to hint --- bun.lockb | Bin 177048 -> 177412 bytes package.json | 1 + src/components/DocumentView/Block.tsx | 3 ++ src/components/DocumentView/Embed.tsx | 30 +++++++++++ src/components/DocumentView/Heading.tsx | 34 ++++-------- src/components/DocumentView/Hint.tsx | 66 ++++++++++++++++++++++-- src/components/DocumentView/spacing.ts | 49 ++++++++++++++++++ 7 files changed, 156 insertions(+), 27 deletions(-) create mode 100644 src/components/DocumentView/Embed.tsx create mode 100644 src/components/DocumentView/spacing.ts diff --git a/bun.lockb b/bun.lockb index f6fe2ed7c9f6ff3d04806ad6f725d019cda0659b..9b88c5248df61180c2bf53c21f4228055aeb0649 100755 GIT binary patch delta 34704 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 P_j>6yci(jCujTwN-mF<` delta 34329 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 N(LJ}Ob<$tU|6jO7S7!hK diff --git a/package.json b/package.json index 6548ea7e1..82112485a 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@geist-ui/icons": "^1.0.2", "@gitbook/api": "^0.11.1", "@readme/openapi-parser": "^2.5.0", + "assert-never": "^1.2.1", "bun-types": "^1.0.7", "next": "13.5.6", "react": "^18", diff --git a/src/components/DocumentView/Block.tsx b/src/components/DocumentView/Block.tsx index ba5e48e1f..1a781ef1c 100644 --- a/src/components/DocumentView/Block.tsx +++ b/src/components/DocumentView/Block.tsx @@ -13,6 +13,7 @@ import { Tabs } from './Tabs'; import { Expandable } from './Expandable'; import { Table } from './Table'; import { Swagger } from './Swagger'; +import { Embed } from './Embed'; export interface BlockProps extends DocumentContextProps { block: T; @@ -49,6 +50,8 @@ export function Block(props: BlockProps) { return ; case 'swagger': return ; + case 'embed': + return ; default: return
Unsupported block {block.type}
; } diff --git a/src/components/DocumentView/Embed.tsx b/src/components/DocumentView/Embed.tsx new file mode 100644 index 000000000..856f2681b --- /dev/null +++ b/src/components/DocumentView/Embed.tsx @@ -0,0 +1,30 @@ +import { tcls } from '@/lib/tailwind'; +import { BlockProps } from './Block'; +import { Blocks } from './Blocks'; +import { DocumentBlockEmbed } from '@gitbook/api'; +import { api } from '@/lib/api'; + +export async function Embed(props: BlockProps) { + const { block, style, ...contextProps } = props; + + const { data: embed } = await api().urls.getEmbedByUrl({ url: block.data.url }); + + // TODO caption + + if (embed.type === 'rich') { + return ( +
+ ); + } else { + return ( +
+
{embed.title}
+
+ ); + } +} diff --git a/src/components/DocumentView/Heading.tsx b/src/components/DocumentView/Heading.tsx index 20713b285..f4655fd76 100644 --- a/src/components/DocumentView/Heading.tsx +++ b/src/components/DocumentView/Heading.tsx @@ -3,19 +3,18 @@ import IconHash from '@geist-ui/icons/hash'; import { BlockProps } from './Block'; import { Inlines } from './Inlines'; import { DocumentBlockHeading } from '@gitbook/api'; +import { getBlockTextStyle } from './spacing'; export function Heading(props: BlockProps) { const { block, style, ...contextProps } = props; - const headingStyle = STYLES[block.type]; + const textStyle = getBlockTextStyle(block); + const Tag = TAGS[block.type]; const id = block.meta?.id ?? ''; return ( - +
) { 'group-hover:opacity-100', 'group-focus:opacity-100', 'lg:flex', - headingStyle.lineHeight, + textStyle.lineHeight, )} > ) {
-
+ ); } -const STYLES = { - 'heading-1': { - tag: 'h2', - lineHeight: 'h-9', - className: ['text-3xl', 'font-semibold'], - }, - 'heading-2': { - tag: 'h3', - lineHeight: 'h-8', - className: ['text-2xl', 'font-semibold'], - }, - 'heading-3': { - tag: 'h4', - lineHeight: 'h-6', - className: ['text-base', 'font-semibold'], - }, +const TAGS: { [type in DocumentBlockHeading['type']]: string } = { + // The h1 is reserved for the page title + 'heading-1': 'h2', + 'heading-2': 'h3', + 'heading-3': 'h4', }; diff --git a/src/components/DocumentView/Hint.tsx b/src/components/DocumentView/Hint.tsx index 44bddcc2e..c08001fcb 100644 --- a/src/components/DocumentView/Hint.tsx +++ b/src/components/DocumentView/Hint.tsx @@ -1,17 +1,75 @@ -import { tcls } from '@/lib/tailwind'; +import { ClassValue, tcls } from '@/lib/tailwind'; import { BlockProps } from './Block'; import { Blocks } from './Blocks'; import { DocumentBlockHint } from '@gitbook/api'; +import IconInfo from '@geist-ui/icons/info'; +import IconAlertTriangle from '@geist-ui/icons/alertTriangle'; +import IconAlertCircle from '@geist-ui/icons/alertCircle'; +import IconCheckInCircle from '@geist-ui/icons/checkInCircle'; +import { getBlockTextStyle } from './spacing'; export function Hint(props: BlockProps) { const { block, style, ...contextProps } = props; + const hintStyle = HINT_STYLES[block.data.style]; + const firstLine = getBlockTextStyle(block.nodes[0]); return ( -
-
-
{/* TODO icon */} +
+
+
); } + +const HINT_STYLES: { + [style in DocumentBlockHint['data']['style']]: { + icon: React.ComponentType<{ className?: string }>; + iconStyle: ClassValue; + style: ClassValue; + }; +} = { + info: { + icon: IconInfo, + iconStyle: ['text-blue-500'], + style: ['border-blue-500'], + }, + warning: { + icon: IconAlertCircle, + iconStyle: ['text-orange-500'], + style: ['border-orange-500'], + }, + danger: { + icon: IconAlertTriangle, + iconStyle: ['text-red-500'], + style: ['border-red-500'], + }, + success: { + icon: IconCheckInCircle, + iconStyle: ['text-green-500'], + style: ['border-green-500'], + }, +}; diff --git a/src/components/DocumentView/spacing.ts b/src/components/DocumentView/spacing.ts new file mode 100644 index 000000000..6505d5e7c --- /dev/null +++ b/src/components/DocumentView/spacing.ts @@ -0,0 +1,49 @@ +import { ClassValue } from '@/lib/tailwind'; +import { DocumentBlockListItem, DocumentBlocksEssentials } from '@gitbook/api'; +import { assertNever } from 'assert-never'; + +/** + * Get the line height of a block + */ +export function getBlockTextStyle(block: DocumentBlocksEssentials | DocumentBlockListItem): { + /** Tailwind class for the text size */ + textSize: ClassValue; + /** Tailwind class for the height (h-*) */ + lineHeight: ClassValue; +} { + switch (block.type) { + case 'paragraph': + return { + textSize: ['text-base'], + lineHeight: 'h-6', + }; + case 'heading-1': + return { + textSize: ['text-3xl', 'font-semibold'], + lineHeight: 'h-9', + }; + case 'heading-2': + return { + textSize: ['text-2xl', 'font-semibold'], + lineHeight: 'h-8', + }; + case 'heading-3': + return { + textSize: ['text-base', 'font-semibold'], + lineHeight: 'h-6', + }; + case 'divider': + return { + textSize: [], + lineHeight: 'h-6', + }; + case 'list-ordered': + case 'list-tasks': + case 'list-unordered': + return getBlockTextStyle(block.nodes[0]); + case 'list-item': + return getBlockTextStyle(block.nodes[0]); + default: + assertNever(block); + } +}