From 9a6f4e8c4b9543ffc585ac8613bcbc103efc37b7 Mon Sep 17 00:00:00 2001 From: Steve Ruiz Date: Thu, 29 Feb 2024 16:28:45 +0000 Subject: [PATCH] [docs] design shuffle (#2951) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR incorporates design tweaks from #2922 without the home page or content changes. These are: - Replacing all `hello@tldraw.com` with `sales@tldraw.com` - Fix mailto links. - Showing the first item in a section on direct routes to the section - Splitting the article page for human-written content from article page for generated content - Splitting the layout for the landing page from the rest of the site (temporarily identical to the regular content) - Removing headings from left sidebar - Restoring headings in right sidebar for human-written pages with > 1 heading link - Styling block quote - Adjusting section link appearance / layout in header / menu - Changing the order of search results to preference docs over examples - Updating copy on events - Removing copy on user interface menus - Adding hero as prop to all articles - Updated icon - Fixing a few broken links - Replaces the sandpack code blocks with hljs code blocks, except in examples. ### Change Type - [x] `documentation` — Changes to the documentation only[^2] --- apps/docs/README.md | 4 +- apps/docs/api/tldraw.api.json | 200 +---- .../docs/app/{ => (content)}/[...id]/page.tsx | 37 +- apps/docs/app/{ => (content)}/cla/page.tsx | 2 +- apps/docs/app/(content)/layout.tsx | 10 + .../docs/app/{ => (content)}/license/page.tsx | 0 apps/docs/app/(landing)/layout.tsx | 10 + apps/docs/app/{ => (landing)}/page.tsx | 0 apps/docs/app/layout.tsx | 10 +- apps/docs/app/not-found.tsx | 22 +- apps/docs/app/providers.tsx | 2 +- apps/docs/components/ArticleDocsPage.tsx | 12 +- apps/docs/components/ArticleHeadingLinks.tsx | 46 + .../components/ArticleReferenceDocsPage.tsx | 36 + apps/docs/components/CategoryDocsPage.tsx | 6 +- apps/docs/components/ExampleDocsPage.tsx | 27 +- apps/docs/components/FancyBox.tsx | 45 +- apps/docs/components/Footer.tsx | 6 +- apps/docs/components/Header.tsx | 67 +- apps/docs/components/Icons.tsx | 2 +- apps/docs/components/Mdx.tsx | 4 +- apps/docs/components/Search.tsx | 2 +- apps/docs/components/SectionDocsPage.tsx | 2 +- apps/docs/components/Sidebar.tsx | 40 +- apps/docs/components/mdx-components/code.tsx | 7 +- .../components/mdx-components/generic.tsx | 13 +- apps/docs/components/mdx-components/index.ts | 2 + apps/docs/content/authors.json | 4 +- apps/docs/content/community/license.mdx | 2 +- apps/docs/content/docs/user-interface.mdx | 107 +-- .../content/getting-started/quick-start.mdx | 97 +-- apps/docs/content/sections.json | 20 +- apps/docs/package.json | 6 +- apps/docs/public/tldraw_dev_dark.png | Bin 0 -> 22845 bytes apps/docs/public/tldraw_dev_light.png | Bin 0 -> 23387 bytes .../scripts/functions/checkBrokenLinks.ts | 44 +- .../scripts/functions/createApiMarkdown.ts | 2 + .../functions/generateExamplesContent.ts | 13 +- .../docs/scripts/functions/generateSection.ts | 3 + apps/docs/scripts/functions/getApiMarkdown.ts | 4 +- apps/docs/styles/globals.css | 196 ++++- apps/docs/styles/parameters-table.css | 8 - apps/docs/types/content-types.ts | 7 +- packages/tldraw/api-report.md | 133 ++- packages/tldraw/api/api.json | 819 +++++++++++++++++- packages/tldraw/src/lib/ui/TldrawUi.tsx | 16 +- yarn.lock | 791 +++-------------- 47 files changed, 1587 insertions(+), 1299 deletions(-) rename apps/docs/app/{ => (content)}/[...id]/page.tsx (75%) rename apps/docs/app/{ => (content)}/cla/page.tsx (99%) create mode 100644 apps/docs/app/(content)/layout.tsx rename apps/docs/app/{ => (content)}/license/page.tsx (100%) create mode 100644 apps/docs/app/(landing)/layout.tsx rename apps/docs/app/{ => (landing)}/page.tsx (100%) create mode 100644 apps/docs/components/ArticleHeadingLinks.tsx create mode 100644 apps/docs/components/ArticleReferenceDocsPage.tsx create mode 100644 apps/docs/public/tldraw_dev_dark.png create mode 100644 apps/docs/public/tldraw_dev_light.png diff --git a/apps/docs/README.md b/apps/docs/README.md index dff81f0f0..3bec967e7 100644 --- a/apps/docs/README.md +++ b/apps/docs/README.md @@ -138,7 +138,7 @@ Please see our [contributing guide](https://github.com/tldraw/tldraw/blob/main/C The tldraw source code and its distributions are provided under the [tldraw license](https://github.com/tldraw/tldraw/blob/master/LICENSE.md). This license does not permit commercial use. -If you wish to use this project in commercial product, you need to purchase a commercial license. matPlease contact us at [hello@tldraw.com](mailto:hello@tldraw.com) for more inforion about obtaining a commercial license. +If you wish to use this project in commercial product, you need to purchase a commercial license. matPlease contact us at [sales@tldraw.com](mailto:sales@tldraw.com) for more inforion about obtaining a commercial license. ## Trademarks @@ -146,4 +146,4 @@ Copyright (c) 2023-present tldraw Inc. The tldraw name and logo are trademarks o ## Contact -Find us on Twitter at [@tldraw](https://twitter.com/tldraw) or email [hello@tldraw.com](mailto://hello@tldraw.com). You can also [join our discord](https://discord.gg/rhsyWMUJxd) for quick help and support. +Find us on Twitter at [@tldraw](https://twitter.com/tldraw) or email [sales@tldraw.com](mailto://sales@tldraw.com). You can also [join our discord](https://discord.gg/rhsyWMUJxd) for quick help and support. diff --git a/apps/docs/api/tldraw.api.json b/apps/docs/api/tldraw.api.json index 47506ddfa..0fbcc7551 100644 --- a/apps/docs/api/tldraw.api.json +++ b/apps/docs/api/tldraw.api.json @@ -4448,39 +4448,6 @@ }, "implementsTokenRanges": [] }, - { - "kind": "Function", - "canonicalReference": "@tldraw/tldraw!EditSubmenu:function(1)", - "docComment": "/**\n * @public\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare function EditSubmenu(): " - }, - { - "kind": "Content", - "text": "import(\"react/jsx-runtime\")." - }, - { - "kind": "Reference", - "text": "JSX.Element", - "canonicalReference": "@types/react!JSX.Element:interface" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "packages/tldraw/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx", - "returnTypeTokenRange": { - "startIndex": 1, - "endIndex": 3 - }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [], - "name": "EditSubmenu" - }, { "kind": "Class", "canonicalReference": "@tldraw/tldraw!EmbedShapeUtil:class", @@ -5434,72 +5401,6 @@ ], "name": "exportAs" }, - { - "kind": "Function", - "canonicalReference": "@tldraw/tldraw!ExportFileContentSubMenu:function(1)", - "docComment": "/**\n * @public\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare function ExportFileContentSubMenu(): " - }, - { - "kind": "Content", - "text": "import(\"react/jsx-runtime\")." - }, - { - "kind": "Reference", - "text": "JSX.Element", - "canonicalReference": "@types/react!JSX.Element:interface" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "packages/tldraw/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx", - "returnTypeTokenRange": { - "startIndex": 1, - "endIndex": 3 - }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [], - "name": "ExportFileContentSubMenu" - }, - { - "kind": "Function", - "canonicalReference": "@tldraw/tldraw!ExtrasGroup:function(1)", - "docComment": "/**\n * @public\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare function ExtrasGroup(): " - }, - { - "kind": "Content", - "text": "import(\"react/jsx-runtime\")." - }, - { - "kind": "Reference", - "text": "JSX.Element", - "canonicalReference": "@types/react!JSX.Element:interface" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "packages/tldraw/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx", - "returnTypeTokenRange": { - "startIndex": 1, - "endIndex": 3 - }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [], - "name": "ExtrasGroup" - }, { "kind": "Function", "canonicalReference": "@tldraw/tldraw!fitFrameToContent:function(1)", @@ -11858,39 +11759,6 @@ }, "implementsTokenRanges": [] }, - { - "kind": "Function", - "canonicalReference": "@tldraw/tldraw!ObjectSubmenu:function(1)", - "docComment": "/**\n * @public\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare function ObjectSubmenu(): " - }, - { - "kind": "Content", - "text": "import(\"react/jsx-runtime\")." - }, - { - "kind": "Reference", - "text": "JSX.Element", - "canonicalReference": "@types/react!JSX.Element:interface" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "packages/tldraw/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx", - "returnTypeTokenRange": { - "startIndex": 1, - "endIndex": 3 - }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [], - "name": "ObjectSubmenu" - }, { "kind": "Function", "canonicalReference": "@tldraw/tldraw!OfflineIndicator:function(1)", @@ -12001,39 +11869,6 @@ ], "name": "parseTldrawJsonFile" }, - { - "kind": "Function", - "canonicalReference": "@tldraw/tldraw!PreferencesGroup:function(1)", - "docComment": "/**\n * @public\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare function PreferencesGroup(): " - }, - { - "kind": "Content", - "text": "import(\"react/jsx-runtime\")." - }, - { - "kind": "Reference", - "text": "JSX.Element", - "canonicalReference": "@types/react!JSX.Element:interface" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "packages/tldraw/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx", - "returnTypeTokenRange": { - "startIndex": 1, - "endIndex": 3 - }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [], - "name": "PreferencesGroup" - }, { "kind": "Function", "canonicalReference": "@tldraw/tldraw!preloadFont:function(1)", @@ -22963,7 +22798,7 @@ }, { "kind": "Content", - "text": "'action.align-bottom' | 'action.align-center-horizontal.short' | 'action.align-center-horizontal' | 'action.align-center-vertical.short' | 'action.align-center-vertical' | 'action.align-left' | 'action.align-right' | 'action.align-top' | 'action.back-to-content' | 'action.bring-forward' | 'action.bring-to-front' | 'action.convert-to-bookmark' | 'action.convert-to-embed' | 'action.copy-as-json.short' | 'action.copy-as-json' | 'action.copy-as-png.short' | 'action.copy-as-png' | 'action.copy-as-svg.short' | 'action.copy-as-svg' | 'action.copy' | 'action.cut' | 'action.delete' | 'action.distribute-horizontal.short' | 'action.distribute-horizontal' | 'action.distribute-vertical.short' | 'action.distribute-vertical' | 'action.duplicate' | 'action.edit-link' | 'action.exit-pen-mode' | 'action.export-as-json.short' | 'action.export-as-json' | 'action.export-as-png.short' | 'action.export-as-png' | 'action.export-as-svg.short' | 'action.export-as-svg' | 'action.fit-frame-to-content' | 'action.flip-horizontal.short' | 'action.flip-horizontal' | 'action.flip-vertical.short' | 'action.flip-vertical' | 'action.fork-project' | 'action.group' | 'action.insert-embed' | 'action.insert-media' | 'action.leave-shared-project' | 'action.new-project' | 'action.new-shared-project' | 'action.open-cursor-chat' | 'action.open-embed-link' | 'action.open-file' | 'action.pack' | 'action.paste' | 'action.print' | 'action.redo' | 'action.remove-frame' | 'action.rename' | 'action.rotate-ccw' | 'action.rotate-cw' | 'action.save-copy' | 'action.select-all' | 'action.select-none' | 'action.send-backward' | 'action.send-to-back' | 'action.share-project' | 'action.stack-horizontal.short' | 'action.stack-horizontal' | 'action.stack-vertical.short' | 'action.stack-vertical' | 'action.stop-following' | 'action.stretch-horizontal.short' | 'action.stretch-horizontal' | 'action.stretch-vertical.short' | 'action.stretch-vertical' | 'action.toggle-auto-size' | 'action.toggle-dark-mode.menu' | 'action.toggle-dark-mode' | 'action.toggle-debug-mode.menu' | 'action.toggle-debug-mode' | 'action.toggle-edge-scrolling.menu' | 'action.toggle-edge-scrolling' | 'action.toggle-focus-mode.menu' | 'action.toggle-focus-mode' | 'action.toggle-grid.menu' | 'action.toggle-grid' | 'action.toggle-lock' | 'action.toggle-reduce-motion.menu' | 'action.toggle-reduce-motion' | 'action.toggle-snap-mode.menu' | 'action.toggle-snap-mode' | 'action.toggle-tool-lock.menu' | 'action.toggle-tool-lock' | 'action.toggle-transparent.context-menu' | 'action.toggle-transparent.menu' | 'action.toggle-transparent' | 'action.undo' | 'action.ungroup' | 'action.unlock-all' | 'action.zoom-in' | 'action.zoom-out' | 'action.zoom-to-100' | 'action.zoom-to-fit' | 'action.zoom-to-selection' | 'actions-menu.title' | 'align-style.end' | 'align-style.justify' | 'align-style.middle' | 'align-style.start' | 'arrowheadEnd-style.arrow' | 'arrowheadEnd-style.bar' | 'arrowheadEnd-style.diamond' | 'arrowheadEnd-style.dot' | 'arrowheadEnd-style.inverted' | 'arrowheadEnd-style.none' | 'arrowheadEnd-style.pipe' | 'arrowheadEnd-style.square' | 'arrowheadEnd-style.triangle' | 'arrowheadStart-style.arrow' | 'arrowheadStart-style.bar' | 'arrowheadStart-style.diamond' | 'arrowheadStart-style.dot' | 'arrowheadStart-style.inverted' | 'arrowheadStart-style.none' | 'arrowheadStart-style.pipe' | 'arrowheadStart-style.square' | 'arrowheadStart-style.triangle' | 'color-style.black' | 'color-style.blue' | 'color-style.green' | 'color-style.grey' | 'color-style.light-blue' | 'color-style.light-green' | 'color-style.light-red' | 'color-style.light-violet' | 'color-style.orange' | 'color-style.red' | 'color-style.violet' | 'color-style.yellow' | 'context-menu.arrange' | 'context-menu.copy-as' | 'context-menu.export-as' | 'context-menu.move-to-page' | 'context-menu.reorder' | 'context.pages.new-page' | 'cursor-chat.type-to-chat' | 'dash-style.dashed' | 'dash-style.dotted' | 'dash-style.draw' | 'dash-style.solid' | 'debug-panel.more' | 'document.default-name' | 'edit-link-dialog.cancel' | 'edit-link-dialog.clear' | 'edit-link-dialog.detail' | 'edit-link-dialog.invalid-url' | 'edit-link-dialog.save' | 'edit-link-dialog.title' | 'edit-link-dialog.url' | 'edit-pages-dialog.move-down' | 'edit-pages-dialog.move-up' | 'embed-dialog.back' | 'embed-dialog.cancel' | 'embed-dialog.create' | 'embed-dialog.instruction' | 'embed-dialog.invalid-url' | 'embed-dialog.title' | 'embed-dialog.url' | 'file-system.confirm-clear.cancel' | 'file-system.confirm-clear.continue' | 'file-system.confirm-clear.description' | 'file-system.confirm-clear.dont-show-again' | 'file-system.confirm-clear.title' | 'file-system.confirm-open.cancel' | 'file-system.confirm-open.description' | 'file-system.confirm-open.dont-show-again' | 'file-system.confirm-open.open' | 'file-system.confirm-open.title' | 'file-system.file-open-error.file-format-version-too-new' | 'file-system.file-open-error.generic-corrupted-file' | 'file-system.file-open-error.not-a-tldraw-file' | 'file-system.file-open-error.title' | 'file-system.shared-document-file-open-error.description' | 'file-system.shared-document-file-open-error.title' | 'fill-style.none' | 'fill-style.pattern' | 'fill-style.semi' | 'fill-style.solid' | 'focus-mode.toggle-focus-mode' | 'font-style.draw' | 'font-style.mono' | 'font-style.sans' | 'font-style.serif' | 'geo-style.arrow-down' | 'geo-style.arrow-left' | 'geo-style.arrow-right' | 'geo-style.arrow-up' | 'geo-style.check-box' | 'geo-style.cloud' | 'geo-style.diamond' | 'geo-style.ellipse' | 'geo-style.hexagon' | 'geo-style.octagon' | 'geo-style.oval' | 'geo-style.pentagon' | 'geo-style.rectangle' | 'geo-style.rhombus-2' | 'geo-style.rhombus' | 'geo-style.star' | 'geo-style.trapezoid' | 'geo-style.triangle' | 'geo-style.x-box' | 'help-menu.about' | 'help-menu.discord' | 'help-menu.github' | 'help-menu.keyboard-shortcuts' | 'help-menu.title' | 'help-menu.twitter' | 'home-project-dialog.description' | 'home-project-dialog.ok' | 'home-project-dialog.title' | 'menu.copy-as' | 'menu.edit' | 'menu.export-as' | 'menu.file' | 'menu.language' | 'menu.object' | 'menu.preferences' | 'menu.title' | 'menu.view' | 'navigation-zone.toggle-minimap' | 'navigation-zone.zoom' | 'opacity-style.0.1' | 'opacity-style.0.25' | 'opacity-style.0.5' | 'opacity-style.0.75' | 'opacity-style.1' | 'page-menu.create-new-page' | 'page-menu.edit-done' | 'page-menu.edit-start' | 'page-menu.go-to-page' | 'page-menu.max-page-count-reached' | 'page-menu.new-page-initial-name' | 'page-menu.submenu.delete' | 'page-menu.submenu.duplicate-page' | 'page-menu.submenu.move-down' | 'page-menu.submenu.move-up' | 'page-menu.submenu.rename' | 'page-menu.submenu.title' | 'page-menu.title' | 'people-menu.change-color' | 'people-menu.change-name' | 'people-menu.follow' | 'people-menu.following' | 'people-menu.invite' | 'people-menu.leading' | 'people-menu.title' | 'people-menu.user' | 'rename-project-dialog.cancel' | 'rename-project-dialog.rename' | 'rename-project-dialog.title' | 'share-menu.copy-link-note' | 'share-menu.copy-link' | 'share-menu.copy-readonly-link-note' | 'share-menu.copy-readonly-link' | 'share-menu.create-snapshot-link' | 'share-menu.default-project-name' | 'share-menu.fork-note' | 'share-menu.offline-note' | 'share-menu.project-too-large' | 'share-menu.readonly-link' | 'share-menu.save-note' | 'share-menu.share-project' | 'share-menu.snapshot-link-note' | 'share-menu.title' | 'share-menu.upload-failed' | 'sharing.confirm-leave.cancel' | 'sharing.confirm-leave.description' | 'sharing.confirm-leave.dont-show-again' | 'sharing.confirm-leave.leave' | 'sharing.confirm-leave.title' | 'shortcuts-dialog.collaboration' | 'shortcuts-dialog.edit' | 'shortcuts-dialog.file' | 'shortcuts-dialog.preferences' | 'shortcuts-dialog.title' | 'shortcuts-dialog.tools' | 'shortcuts-dialog.transform' | 'shortcuts-dialog.view' | 'size-style.l' | 'size-style.m' | 'size-style.s' | 'size-style.xl' | 'spline-style.cubic' | 'spline-style.line' | 'status.offline' | 'status.online' | 'style-panel.align' | 'style-panel.arrowhead-end' | 'style-panel.arrowhead-start' | 'style-panel.arrowheads' | 'style-panel.color' | 'style-panel.dash' | 'style-panel.fill' | 'style-panel.font' | 'style-panel.geo' | 'style-panel.mixed' | 'style-panel.opacity' | 'style-panel.position' | 'style-panel.size' | 'style-panel.spline' | 'style-panel.title' | 'style-panel.vertical-align' | 'toast.close' | 'toast.error.copy-fail.desc' | 'toast.error.copy-fail.title' | 'toast.error.export-fail.desc' | 'toast.error.export-fail.title' | 'tool-panel.drawing' | 'tool-panel.more' | 'tool-panel.shapes' | 'tool.arrow-down' | 'tool.arrow-left' | 'tool.arrow-right' | 'tool.arrow-up' | 'tool.arrow' | 'tool.asset' | 'tool.check-box' | 'tool.cloud' | 'tool.diamond' | 'tool.draw' | 'tool.ellipse' | 'tool.embed' | 'tool.eraser' | 'tool.frame' | 'tool.hand' | 'tool.hexagon' | 'tool.highlight' | 'tool.laser' | 'tool.line' | 'tool.note' | 'tool.octagon' | 'tool.oval' | 'tool.pentagon' | 'tool.rectangle' | 'tool.rhombus' | 'tool.select' | 'tool.star' | 'tool.text' | 'tool.trapezoid' | 'tool.triangle' | 'tool.x-box' | 'verticalAlign-style.end' | 'verticalAlign-style.middle' | 'verticalAlign-style.start' | 'vscode.file-open.backup-failed' | 'vscode.file-open.backup-saved' | 'vscode.file-open.backup' | 'vscode.file-open.desc' | 'vscode.file-open.dont-show-again' | 'vscode.file-open.open'" + "text": "'action.align-bottom' | 'action.align-center-horizontal.short' | 'action.align-center-horizontal' | 'action.align-center-vertical.short' | 'action.align-center-vertical' | 'action.align-left' | 'action.align-right' | 'action.align-top' | 'action.back-to-content' | 'action.bring-forward' | 'action.bring-to-front' | 'action.convert-to-bookmark' | 'action.convert-to-embed' | 'action.copy-as-json.short' | 'action.copy-as-json' | 'action.copy-as-png.short' | 'action.copy-as-png' | 'action.copy-as-svg.short' | 'action.copy-as-svg' | 'action.copy' | 'action.cut' | 'action.delete' | 'action.distribute-horizontal.short' | 'action.distribute-horizontal' | 'action.distribute-vertical.short' | 'action.distribute-vertical' | 'action.duplicate' | 'action.edit-link' | 'action.exit-pen-mode' | 'action.export-as-json.short' | 'action.export-as-json' | 'action.export-as-png.short' | 'action.export-as-png' | 'action.export-as-svg.short' | 'action.export-as-svg' | 'action.fit-frame-to-content' | 'action.flip-horizontal.short' | 'action.flip-horizontal' | 'action.flip-vertical.short' | 'action.flip-vertical' | 'action.fork-project' | 'action.group' | 'action.insert-embed' | 'action.insert-media' | 'action.leave-shared-project' | 'action.new-project' | 'action.new-shared-project' | 'action.open-cursor-chat' | 'action.open-embed-link' | 'action.open-file' | 'action.pack' | 'action.paste' | 'action.print' | 'action.redo' | 'action.remove-frame' | 'action.rename' | 'action.rotate-ccw' | 'action.rotate-cw' | 'action.save-copy' | 'action.select-all' | 'action.select-none' | 'action.send-backward' | 'action.send-to-back' | 'action.share-project' | 'action.stack-horizontal.short' | 'action.stack-horizontal' | 'action.stack-vertical.short' | 'action.stack-vertical' | 'action.stop-following' | 'action.stretch-horizontal.short' | 'action.stretch-horizontal' | 'action.stretch-vertical.short' | 'action.stretch-vertical' | 'action.toggle-auto-size' | 'action.toggle-dark-mode.menu' | 'action.toggle-dark-mode' | 'action.toggle-debug-mode.menu' | 'action.toggle-debug-mode' | 'action.toggle-edge-scrolling.menu' | 'action.toggle-edge-scrolling' | 'action.toggle-focus-mode.menu' | 'action.toggle-focus-mode' | 'action.toggle-grid.menu' | 'action.toggle-grid' | 'action.toggle-lock' | 'action.toggle-reduce-motion.menu' | 'action.toggle-reduce-motion' | 'action.toggle-snap-mode.menu' | 'action.toggle-snap-mode' | 'action.toggle-tool-lock.menu' | 'action.toggle-tool-lock' | 'action.toggle-transparent.context-menu' | 'action.toggle-transparent.menu' | 'action.toggle-transparent' | 'action.undo' | 'action.ungroup' | 'action.unlock-all' | 'action.zoom-in' | 'action.zoom-out' | 'action.zoom-to-100' | 'action.zoom-to-fit' | 'action.zoom-to-selection' | 'actions-menu.title' | 'align-style.end' | 'align-style.justify' | 'align-style.middle' | 'align-style.start' | 'arrowheadEnd-style.arrow' | 'arrowheadEnd-style.bar' | 'arrowheadEnd-style.diamond' | 'arrowheadEnd-style.dot' | 'arrowheadEnd-style.inverted' | 'arrowheadEnd-style.none' | 'arrowheadEnd-style.pipe' | 'arrowheadEnd-style.square' | 'arrowheadEnd-style.triangle' | 'arrowheadStart-style.arrow' | 'arrowheadStart-style.bar' | 'arrowheadStart-style.diamond' | 'arrowheadStart-style.dot' | 'arrowheadStart-style.inverted' | 'arrowheadStart-style.none' | 'arrowheadStart-style.pipe' | 'arrowheadStart-style.square' | 'arrowheadStart-style.triangle' | 'color-style.black' | 'color-style.blue' | 'color-style.green' | 'color-style.grey' | 'color-style.light-blue' | 'color-style.light-green' | 'color-style.light-red' | 'color-style.light-violet' | 'color-style.orange' | 'color-style.red' | 'color-style.violet' | 'color-style.yellow' | 'context-menu.arrange' | 'context-menu.copy-as' | 'context-menu.export-as' | 'context-menu.move-to-page' | 'context-menu.reorder' | 'context.pages.new-page' | 'cursor-chat.type-to-chat' | 'dash-style.dashed' | 'dash-style.dotted' | 'dash-style.draw' | 'dash-style.solid' | 'debug-panel.more' | 'document.default-name' | 'edit-link-dialog.cancel' | 'edit-link-dialog.clear' | 'edit-link-dialog.detail' | 'edit-link-dialog.invalid-url' | 'edit-link-dialog.save' | 'edit-link-dialog.title' | 'edit-link-dialog.url' | 'edit-pages-dialog.move-down' | 'edit-pages-dialog.move-up' | 'embed-dialog.back' | 'embed-dialog.cancel' | 'embed-dialog.create' | 'embed-dialog.instruction' | 'embed-dialog.invalid-url' | 'embed-dialog.title' | 'embed-dialog.url' | 'file-system.confirm-clear.cancel' | 'file-system.confirm-clear.continue' | 'file-system.confirm-clear.description' | 'file-system.confirm-clear.dont-show-again' | 'file-system.confirm-clear.title' | 'file-system.confirm-open.cancel' | 'file-system.confirm-open.description' | 'file-system.confirm-open.dont-show-again' | 'file-system.confirm-open.open' | 'file-system.confirm-open.title' | 'file-system.file-open-error.file-format-version-too-new' | 'file-system.file-open-error.generic-corrupted-file' | 'file-system.file-open-error.not-a-tldraw-file' | 'file-system.file-open-error.title' | 'file-system.shared-document-file-open-error.description' | 'file-system.shared-document-file-open-error.title' | 'fill-style.none' | 'fill-style.pattern' | 'fill-style.semi' | 'fill-style.solid' | 'focus-mode.toggle-focus-mode' | 'font-style.draw' | 'font-style.mono' | 'font-style.sans' | 'font-style.serif' | 'geo-style.arrow-down' | 'geo-style.arrow-left' | 'geo-style.arrow-right' | 'geo-style.arrow-up' | 'geo-style.check-box' | 'geo-style.cloud' | 'geo-style.diamond' | 'geo-style.ellipse' | 'geo-style.hexagon' | 'geo-style.octagon' | 'geo-style.oval' | 'geo-style.pentagon' | 'geo-style.rectangle' | 'geo-style.rhombus-2' | 'geo-style.rhombus' | 'geo-style.star' | 'geo-style.trapezoid' | 'geo-style.triangle' | 'geo-style.x-box' | 'help-menu.about' | 'help-menu.discord' | 'help-menu.github' | 'help-menu.keyboard-shortcuts' | 'help-menu.title' | 'help-menu.twitter' | 'home-project-dialog.description' | 'home-project-dialog.ok' | 'home-project-dialog.title' | 'menu.copy-as' | 'menu.edit' | 'menu.export-as' | 'menu.file' | 'menu.language' | 'menu.preferences' | 'menu.title' | 'menu.view' | 'navigation-zone.toggle-minimap' | 'navigation-zone.zoom' | 'opacity-style.0.1' | 'opacity-style.0.25' | 'opacity-style.0.5' | 'opacity-style.0.75' | 'opacity-style.1' | 'page-menu.create-new-page' | 'page-menu.edit-done' | 'page-menu.edit-start' | 'page-menu.go-to-page' | 'page-menu.max-page-count-reached' | 'page-menu.new-page-initial-name' | 'page-menu.submenu.delete' | 'page-menu.submenu.duplicate-page' | 'page-menu.submenu.move-down' | 'page-menu.submenu.move-up' | 'page-menu.submenu.rename' | 'page-menu.submenu.title' | 'page-menu.title' | 'people-menu.change-color' | 'people-menu.change-name' | 'people-menu.follow' | 'people-menu.following' | 'people-menu.invite' | 'people-menu.leading' | 'people-menu.title' | 'people-menu.user' | 'rename-project-dialog.cancel' | 'rename-project-dialog.rename' | 'rename-project-dialog.title' | 'share-menu.copy-link-note' | 'share-menu.copy-link' | 'share-menu.copy-readonly-link-note' | 'share-menu.copy-readonly-link' | 'share-menu.create-snapshot-link' | 'share-menu.default-project-name' | 'share-menu.fork-note' | 'share-menu.offline-note' | 'share-menu.project-too-large' | 'share-menu.readonly-link' | 'share-menu.save-note' | 'share-menu.share-project' | 'share-menu.snapshot-link-note' | 'share-menu.title' | 'share-menu.upload-failed' | 'sharing.confirm-leave.cancel' | 'sharing.confirm-leave.description' | 'sharing.confirm-leave.dont-show-again' | 'sharing.confirm-leave.leave' | 'sharing.confirm-leave.title' | 'shortcuts-dialog.collaboration' | 'shortcuts-dialog.edit' | 'shortcuts-dialog.file' | 'shortcuts-dialog.preferences' | 'shortcuts-dialog.title' | 'shortcuts-dialog.tools' | 'shortcuts-dialog.transform' | 'shortcuts-dialog.view' | 'size-style.l' | 'size-style.m' | 'size-style.s' | 'size-style.xl' | 'spline-style.cubic' | 'spline-style.line' | 'status.offline' | 'status.online' | 'style-panel.align' | 'style-panel.arrowhead-end' | 'style-panel.arrowhead-start' | 'style-panel.arrowheads' | 'style-panel.color' | 'style-panel.dash' | 'style-panel.fill' | 'style-panel.font' | 'style-panel.geo' | 'style-panel.mixed' | 'style-panel.opacity' | 'style-panel.position' | 'style-panel.size' | 'style-panel.spline' | 'style-panel.title' | 'style-panel.vertical-align' | 'toast.close' | 'toast.error.copy-fail.desc' | 'toast.error.copy-fail.title' | 'toast.error.export-fail.desc' | 'toast.error.export-fail.title' | 'tool-panel.drawing' | 'tool-panel.more' | 'tool-panel.shapes' | 'tool.arrow-down' | 'tool.arrow-left' | 'tool.arrow-right' | 'tool.arrow-up' | 'tool.arrow' | 'tool.asset' | 'tool.check-box' | 'tool.cloud' | 'tool.diamond' | 'tool.draw' | 'tool.ellipse' | 'tool.embed' | 'tool.eraser' | 'tool.frame' | 'tool.hand' | 'tool.hexagon' | 'tool.highlight' | 'tool.laser' | 'tool.line' | 'tool.note' | 'tool.octagon' | 'tool.oval' | 'tool.pentagon' | 'tool.rectangle' | 'tool.rhombus' | 'tool.select' | 'tool.star' | 'tool.text' | 'tool.trapezoid' | 'tool.triangle' | 'tool.x-box' | 'verticalAlign-style.end' | 'verticalAlign-style.middle' | 'verticalAlign-style.start' | 'vscode.file-open.backup-failed' | 'vscode.file-open.backup-saved' | 'vscode.file-open.backup' | 'vscode.file-open.desc' | 'vscode.file-open.dont-show-again' | 'vscode.file-open.open'" }, { "kind": "Content", @@ -24804,39 +24639,6 @@ }, "implementsTokenRanges": [] }, - { - "kind": "Function", - "canonicalReference": "@tldraw/tldraw!ViewSubmenu:function(1)", - "docComment": "/**\n * @public\n */\n", - "excerptTokens": [ - { - "kind": "Content", - "text": "export declare function ViewSubmenu(): " - }, - { - "kind": "Content", - "text": "import(\"react/jsx-runtime\")." - }, - { - "kind": "Reference", - "text": "JSX.Element", - "canonicalReference": "@types/react!JSX.Element:interface" - }, - { - "kind": "Content", - "text": ";" - } - ], - "fileUrlPath": "packages/tldraw/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx", - "returnTypeTokenRange": { - "startIndex": 1, - "endIndex": 3 - }, - "releaseTag": "Public", - "overloadIndex": 1, - "parameters": [], - "name": "ViewSubmenu" - }, { "kind": "Class", "canonicalReference": "@tldraw/tldraw!ZoomTool:class", diff --git a/apps/docs/app/[...id]/page.tsx b/apps/docs/app/(content)/[...id]/page.tsx similarity index 75% rename from apps/docs/app/[...id]/page.tsx rename to apps/docs/app/(content)/[...id]/page.tsx index ff9623678..0c1af5ad4 100644 --- a/apps/docs/app/[...id]/page.tsx +++ b/apps/docs/app/(content)/[...id]/page.tsx @@ -1,12 +1,20 @@ import { ArticleDocsPage } from '@/components/ArticleDocsPage' +import { ArticleReferenceDocsPage } from '@/components/ArticleReferenceDocsPage' import { CategoryDocsPage } from '@/components/CategoryDocsPage' import { ExampleDocsPage } from '@/components/ExampleDocsPage' import { SectionDocsPage } from '@/components/SectionDocsPage' +import { Article, Category, Section } from '@/types/content-types' import { getDb } from '@/utils/ContentDatabase' import { Metadata } from 'next' import { notFound } from 'next/navigation' -async function getContentForPath(path: string) { +async function getContentForPath( + path: string +): Promise< + | { type: 'section'; section: Section } + | { type: 'category'; category: Category } + | { type: 'article'; article: Article } +> { const db = await getDb() const section = await db.db.get(`SELECT * FROM sections WHERE sections.path = ?`, path) @@ -105,6 +113,28 @@ export default async function ContentPage({ params }: { params: { id: string | s switch (content.type) { case 'section': { + const db = await getDb() + let firstArticleInSection: Article | undefined + + const categories = await db.getCategoriesForSection(content.section.id) + + for (const category of categories) { + const articles = await db.getCategoryArticles(content.section.id, category.id) + const article = articles[0] + if (article) { + firstArticleInSection = article + break + } + } + + if (firstArticleInSection) { + const article = await db.getArticle(firstArticleInSection.id) + if (article?.componentCode) { + return + } + return + } + return } case 'category': { @@ -114,6 +144,11 @@ export default async function ContentPage({ params }: { params: { id: string | s if (content.article.componentCode) { return } + + if (content.article.sectionId === 'reference') { + return + } + return } default: { diff --git a/apps/docs/app/cla/page.tsx b/apps/docs/app/(content)/cla/page.tsx similarity index 99% rename from apps/docs/app/cla/page.tsx rename to apps/docs/app/(content)/cla/page.tsx index 6b18571e9..e0552fc11 100644 --- a/apps/docs/app/cla/page.tsx +++ b/apps/docs/app/(content)/cla/page.tsx @@ -10,7 +10,7 @@ export default async function ClaPage() { <>
-
+

Contributor License Agreement

diff --git a/apps/docs/app/(content)/layout.tsx b/apps/docs/app/(content)/layout.tsx new file mode 100644 index 000000000..df8cc6b78 --- /dev/null +++ b/apps/docs/app/(content)/layout.tsx @@ -0,0 +1,10 @@ +import { Footer } from '@/components/Footer' + +export default async function ContentLayout({ children }: { children: React.ReactNode }) { + return ( +
+
{children}
+
+
+ ) +} diff --git a/apps/docs/app/license/page.tsx b/apps/docs/app/(content)/license/page.tsx similarity index 100% rename from apps/docs/app/license/page.tsx rename to apps/docs/app/(content)/license/page.tsx diff --git a/apps/docs/app/(landing)/layout.tsx b/apps/docs/app/(landing)/layout.tsx new file mode 100644 index 000000000..df8cc6b78 --- /dev/null +++ b/apps/docs/app/(landing)/layout.tsx @@ -0,0 +1,10 @@ +import { Footer } from '@/components/Footer' + +export default async function ContentLayout({ children }: { children: React.ReactNode }) { + return ( +
+
{children}
+
+
+ ) +} diff --git a/apps/docs/app/page.tsx b/apps/docs/app/(landing)/page.tsx similarity index 100% rename from apps/docs/app/page.tsx rename to apps/docs/app/(landing)/page.tsx diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx index c48332103..8c6f7e874 100644 --- a/apps/docs/app/layout.tsx +++ b/apps/docs/app/layout.tsx @@ -1,4 +1,3 @@ -import { Footer } from '@/components/Footer' import { Analytics } from '@vercel/analytics/react' import { Metadata, Viewport } from 'next' import AutoRefresh from '../components/AutoRefresh' @@ -7,9 +6,9 @@ import '../styles/hljs.css' import '../styles/parameters-table.css' import { Providers } from './providers' -const TITLE = 'tldraw docs' +const TITLE = 'tldraw SDK' const DESCRIPTION = - 'Developer documentation for tldraw. Build infinite canvas experiences for the web.' + 'Infinite canvas SDK from tldraw. Build whiteboards, design tools, and canvas experiences for the web.' const TWITTER_HANDLE = '@tldraw' const TWITTER_CARD = 'social-twitter.png' const FACEBOOK_CARD = 'social-og.png' @@ -70,10 +69,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo -
-
{children}
-
-
+ {children}
diff --git a/apps/docs/app/not-found.tsx b/apps/docs/app/not-found.tsx index 8b3efd97f..1852ae3cd 100644 --- a/apps/docs/app/not-found.tsx +++ b/apps/docs/app/not-found.tsx @@ -7,15 +7,17 @@ export default async function NotFound() { const sidebar = await db.getSidebarContentList({}) return ( - <> -
- -
-
-

Not found.

-
-

There's nothing here. :(

-
- +
+
+
+ +
+
+

Not found.

+
+

There's nothing here. :(

+
+
+
) } diff --git a/apps/docs/app/providers.tsx b/apps/docs/app/providers.tsx index 0a3ebf8d3..67b86afc9 100644 --- a/apps/docs/app/providers.tsx +++ b/apps/docs/app/providers.tsx @@ -3,5 +3,5 @@ import { ThemeProvider } from 'next-themes' export function Providers({ children }: { children: any }) { - return {children} + return {children} } diff --git a/apps/docs/components/ArticleDocsPage.tsx b/apps/docs/components/ArticleDocsPage.tsx index c62d7798c..ff4d69b8f 100644 --- a/apps/docs/components/ArticleDocsPage.tsx +++ b/apps/docs/components/ArticleDocsPage.tsx @@ -1,8 +1,8 @@ import { Article } from '@/types/content-types' import { getDb } from '@/utils/ContentDatabase' import { ArticleDetails } from './ArticleDetails' +import { ArticleHeadingLinks } from './ArticleHeadingLinks' import { ArticleNavLinks } from './ArticleNavLinks' -import { Breadcrumb } from './Breadcrumb' import { Header } from './Header' import { Mdx } from './Mdx' import { Sidebar } from './Sidebar' @@ -20,22 +20,20 @@ export async function ArticleDocsPage({ article }: { article: Article }) { articleId: article.id, }) - const isGenerated = article.sectionId === 'reference' - return ( <>
- -
+ +
-

{article.title}

{article.hero && hero} {article.content && } - {isGenerated ? null : } + {links && }
+ ) } diff --git a/apps/docs/components/ArticleHeadingLinks.tsx b/apps/docs/components/ArticleHeadingLinks.tsx new file mode 100644 index 000000000..6c5773a5e --- /dev/null +++ b/apps/docs/components/ArticleHeadingLinks.tsx @@ -0,0 +1,46 @@ +/* eslint-disable no-useless-escape */ +import { Article, ArticleHeading, ArticleHeadings } from '@/types/content-types' +import Link from 'next/link' + +export function ArticleHeadingLinks({ + headingLinks, +}: { + article: Article + headingLinks: ArticleHeadings +}) { + const linksToShow = headingLinks.filter((heading) => heading.level < 4) + + if (linksToShow.length <= 1) return null + + return ( + + ) +} + +function HeaderLink({ heading }: { heading: ArticleHeading }) { + return ( +
  • + + {heading.level > 2 ? {'–'} : null} + + {heading.isCode ? ( + {heading.title.replace(/\[([^\]]+)\]\([^\)]+\)/g, '$1')} + ) : ( + heading.title.replace(/\[([^\]]+)\]\([^\)]+\)/g, '$1') + )} + + +
  • + ) +} diff --git a/apps/docs/components/ArticleReferenceDocsPage.tsx b/apps/docs/components/ArticleReferenceDocsPage.tsx new file mode 100644 index 000000000..34cff4a26 --- /dev/null +++ b/apps/docs/components/ArticleReferenceDocsPage.tsx @@ -0,0 +1,36 @@ +import { Article } from '@/types/content-types' +import { getDb } from '@/utils/ContentDatabase' +import { ArticleNavLinks } from './ArticleNavLinks' +import { Breadcrumb } from './Breadcrumb' +import { Header } from './Header' +import { Mdx } from './Mdx' +import { Sidebar } from './Sidebar' +import { Image } from './mdx-components/generic' + +export async function ArticleReferenceDocsPage({ article }: { article: Article }) { + const db = await getDb() + const section = await db.getSection(article.sectionId) + const category = await db.getCategory(article.categoryId) + const links = await db.getArticleLinks(article) + const sidebar = await db.getSidebarContentList({ + sectionId: section.id, + categoryId: category.id, + articleId: article.id, + }) + + return ( + <> +
    + +
    +
    + +

    {article.title}

    +
    + {article.hero && hero} + {article.content && } + {links && } +
    + + ) +} diff --git a/apps/docs/components/CategoryDocsPage.tsx b/apps/docs/components/CategoryDocsPage.tsx index 894a66102..34f5724c0 100644 --- a/apps/docs/components/CategoryDocsPage.tsx +++ b/apps/docs/components/CategoryDocsPage.tsx @@ -23,10 +23,8 @@ export async function CategoryDocsPage({ category }: { category: Category }) { {articles.length > 0 && (
      {articles.map((article) => ( -
    • - - {article.title} - +
    • + {article.title}
    • ))}
    diff --git a/apps/docs/components/ExampleDocsPage.tsx b/apps/docs/components/ExampleDocsPage.tsx index ae7727f7c..5853d1ed5 100644 --- a/apps/docs/components/ExampleDocsPage.tsx +++ b/apps/docs/components/ExampleDocsPage.tsx @@ -1,18 +1,15 @@ import { Article } from '@/types/content-types' import { getDb } from '@/utils/ContentDatabase' import { ArticleNavLinks } from './ArticleNavLinks' -import { Breadcrumb } from './Breadcrumb' import ExampleCodeBlock from './ExampleCodeBlock' import { Header } from './Header' import { Mdx } from './Mdx' import { Sidebar } from './Sidebar' -import { Image } from './mdx-components/generic' export async function ExampleDocsPage({ article }: { article: Article }) { const db = await getDb() const section = await db.getSection(article.sectionId) const category = await db.getCategory(article.categoryId) - const headings = await db.getArticleHeadings(article.id) const links = await db.getArticleLinks(article) const sidebar = await db.getSidebarContentList({ sectionId: section.id, @@ -23,25 +20,21 @@ export async function ExampleDocsPage({ article }: { article: Article }) { return ( <>
    - -
    + +
    -

    {article.title}

    {article.description &&

    {article.description}

    }
    - {article.hero && hero} {article.content && } - {article.componentCode && ( - - )} + {links && }
    diff --git a/apps/docs/components/FancyBox.tsx b/apps/docs/components/FancyBox.tsx index ffa293014..0b9163c1b 100644 --- a/apps/docs/components/FancyBox.tsx +++ b/apps/docs/components/FancyBox.tsx @@ -1,44 +1,43 @@ 'use client' -import { debounce } from '@/utils/debounce' -import { useEffect, useRef, useState } from 'react' +import { useRef } from 'react' export default function FancyBox() { const rContainer = useRef(null) - const [items, setItems] = useState([]) + // const [items, setItems] = useState([]) - useEffect(() => { - const populate = debounce(() => { - const elm = rContainer.current - if (!elm) return + // useEffect(() => { + // const populate = debounce(() => { + // const elm = rContainer.current + // if (!elm) return - const width = elm.clientWidth - const height = elm.clientHeight + // const width = elm.clientWidth + // const height = elm.clientHeight - const SIZE = 32 + // const SIZE = 32 - const cols = Math.ceil(width / SIZE) - const rows = Math.ceil(height / SIZE) + // const cols = Math.ceil(width / SIZE) + // const rows = Math.ceil(height / SIZE) - const items = Array.from(Array(cols * rows)).map((_, i) => i) + // const items = Array.from(Array(cols * rows)).map((_, i) => i) - setItems(items) - }, 100) + // setItems(items) + // }, 100) - populate() + // populate() - window.addEventListener('resize', populate) - return () => { - window.removeEventListener('resize', populate) - } - }, []) + // window.addEventListener('resize', populate) + // return () => { + // window.removeEventListener('resize', populate) + // } + // }, []) return (
    - {items.map((i) => { + {/* {items.map((i) => { const c = 1 + (i % 7) return
    - })} + })} */}
    ) } diff --git a/apps/docs/components/Footer.tsx b/apps/docs/components/Footer.tsx index 73bd47b18..2d5632cd3 100644 --- a/apps/docs/components/Footer.tsx +++ b/apps/docs/components/Footer.tsx @@ -18,11 +18,7 @@ export function Footer() {

    tldraw © {new Date().getFullYear()}

    - +
    -
    + +
    -
    ) diff --git a/apps/docs/components/Icons.tsx b/apps/docs/components/Icons.tsx index fd72246f5..72e98699e 100644 --- a/apps/docs/components/Icons.tsx +++ b/apps/docs/components/Icons.tsx @@ -13,7 +13,7 @@ export function Chevron({ className }: { className?: string }) { diff --git a/apps/docs/components/Mdx.tsx b/apps/docs/components/Mdx.tsx index 54d0e9fd7..7b320542c 100644 --- a/apps/docs/components/Mdx.tsx +++ b/apps/docs/components/Mdx.tsx @@ -1,8 +1,8 @@ import { MDXRemote } from 'next-mdx-remote/rsc' import rehypeAutolinkHeadings from 'rehype-autolink-headings' +import rehypeHighlight from 'rehype-highlight' import rehypeSlug from 'rehype-slug-custom-id' import { components } from './mdx-components' -// import rehypeHighlight from 'rehype-highlight' interface MdxProps { content: string @@ -17,7 +17,7 @@ export function Mdx({ content }: MdxProps) { mdxOptions: { // remarkPlugins: [remarkGfm, {}], rehypePlugins: [ - // [rehypeHighlight as any, {}], + [rehypeHighlight as any, {}], [rehypeAutolinkHeadings, {}], [rehypeSlug, { enableCustomId: true, maintainCase: true, removeAccents: true }], ], diff --git a/apps/docs/components/Search.tsx b/apps/docs/components/Search.tsx index 4c13a5368..6ad42b869 100644 --- a/apps/docs/components/Search.tsx +++ b/apps/docs/components/Search.tsx @@ -102,7 +102,7 @@ export function Search() { // {searchType === SEARCH_TYPE.NORMAL ? '✨ Search using AI' : '⭐ Search without AI'} // // } - groups={['examples', 'docs', 'reference']} + groups={['docs', 'examples', 'reference']} groupsToLabel={{ examples: 'Examples', docs: 'Articles', reference: 'Reference' }} options={searchResults} isLoading={isLoading} diff --git a/apps/docs/components/SectionDocsPage.tsx b/apps/docs/components/SectionDocsPage.tsx index 33b14fb6c..4d60e9ac1 100644 --- a/apps/docs/components/SectionDocsPage.tsx +++ b/apps/docs/components/SectionDocsPage.tsx @@ -11,7 +11,7 @@ export async function SectionDocsPage({ section }: { section: Section }) { <>
    -
    +

    {section.title}

    diff --git a/apps/docs/components/Sidebar.tsx b/apps/docs/components/Sidebar.tsx index 18fcf1659..0ad0615c2 100644 --- a/apps/docs/components/Sidebar.tsx +++ b/apps/docs/components/Sidebar.tsx @@ -33,7 +33,7 @@ const linkContext = createContext<{ // it keeps re-rendering. let scrollPosition = 0 -export function Sidebar({ headings, links, sectionId, categoryId, articleId }: SidebarProps) { +export function Sidebar({ links, sectionId, categoryId, articleId }: SidebarProps) { const activeId = articleId ?? categoryId ?? sectionId const sidebarRef = useRef(null) @@ -72,7 +72,7 @@ export function Sidebar({ headings, links, sectionId, categoryId, articleId }: S
    - +
    @@ -81,62 +81,48 @@ export function Sidebar({ headings, links, sectionId, categoryId, articleId }: S ) } -export function SidebarLinks({ - headings, - links, -}: { - headings?: ArticleHeadings - links: SidebarContentLink[] -}) { +export function SidebarLinks({ links }: { links: SidebarContentLink[] }) { return ( ) } -function SidebarLink({ headings, ...props }: SidebarContentLink & { headings?: ArticleHeadings }) { +function SidebarLink(props: SidebarContentLink) { switch (props.type) { case 'section': { - return + return } case 'article': { - return + return } case 'category': { - return + return } } } -function SidebarSection({ - title, - children, - headings, -}: SidebarContentSectionLink & { headings?: ArticleHeadings }) { +function SidebarSection({ title, children }: SidebarContentSectionLink) { if (children.length === 0) return null return (
  • - {title && {title}} + {title && {title}}
      {children.map((link) => ( - + ))}
  • ) } -function SidebarCategory({ - title, - children, - headings, -}: SidebarContentCategoryLink & { headings?: ArticleHeadings }) { +function SidebarCategory({ title, children }: SidebarContentCategoryLink) { const linkCtx = useContext(linkContext) if (children.length === 0) return null const hasGroups = children.some((child) => !!(child as SidebarContentArticleLink).groupId) @@ -171,7 +157,7 @@ function SidebarCategory({
      {articles.map((link) => ( - + ))}
    diff --git a/apps/docs/components/mdx-components/code.tsx b/apps/docs/components/mdx-components/code.tsx index b46b2cb01..6e2f38455 100644 --- a/apps/docs/components/mdx-components/code.tsx +++ b/apps/docs/components/mdx-components/code.tsx @@ -5,12 +5,7 @@ import { useTheme } from 'next-themes' import { useEffect, useState } from 'react' export const Code = (props: any) => { - if (!props.className) { - return - } - - const language = props.className.replace('language-', '') - return + return } export function CodeBlock({ code }: { code: SandpackFiles }) { diff --git a/apps/docs/components/mdx-components/generic.tsx b/apps/docs/components/mdx-components/generic.tsx index fd998ec14..01c48635d 100644 --- a/apps/docs/components/mdx-components/generic.tsx +++ b/apps/docs/components/mdx-components/generic.tsx @@ -150,7 +150,7 @@ export const Footnotes = (props: any) => { /* -------------------- API docs -------------------- */ export const ApiHeading = (props: any) => { - return
    + return
    } export const Embed = (props: any) => { @@ -161,3 +161,14 @@ export const Embed = (props: any) => {
    ) } + +/* -------------------- Callouts -------------------- */ + +export const Callout = ({ icon, children }: any) => { + return ( +
    + {icon} +

    {children}

    +
    + ) +} diff --git a/apps/docs/components/mdx-components/index.ts b/apps/docs/components/mdx-components/index.ts index e236d0c7c..072e14878 100644 --- a/apps/docs/components/mdx-components/index.ts +++ b/apps/docs/components/mdx-components/index.ts @@ -4,6 +4,7 @@ import { A, ApiHeading, Blockquote, + Callout, Divider, Embed, Heading1, @@ -56,6 +57,7 @@ export const components = { Image, Small: Small, Video, + Callout, ...customComponents, ...apiComponents, } diff --git a/apps/docs/content/authors.json b/apps/docs/content/authors.json index 11e49001b..28e498b2d 100644 --- a/apps/docs/content/authors.json +++ b/apps/docs/content/authors.json @@ -9,14 +9,14 @@ { "id": "tldraw", "name": "tldraw", - "email": "hello@tldraw.com", + "email": "sales@tldraw.com", "twitter": "tldraw", "image": "tldraw.jpg" }, { "id": "api", "name": "API", - "email": "hello@tldraw.com", + "email": "sales@tldraw.com", "twitter": "tldraw", "image": "api.jpg" } diff --git a/apps/docs/content/community/license.mdx b/apps/docs/content/community/license.mdx index a260a37dc..cf1c5badd 100644 --- a/apps/docs/content/community/license.mdx +++ b/apps/docs/content/community/license.mdx @@ -10,7 +10,7 @@ tldraw uses a dual licensing model to support the development of the project. The project's source code, libraries, and distributions are provided under the [tldraw licence](https://github.com/tldraw/tldraw/blob/master/LICENSE.md). -This license does not permit commercial use. If you wish to use this project in commercial product or enterprise, you need to purchase a commercial license. +This license does not permit commercial use. If you wish to use this project in a commercial product or enterprise, you need to purchase a commercial license. To purchase a commercial license, or for more information, please contact us at [sales@tldraw.com](mailto:sales@tldraw.com). diff --git a/apps/docs/content/docs/user-interface.mdx b/apps/docs/content/docs/user-interface.mdx index 8cbabcb20..45509219f 100644 --- a/apps/docs/content/docs/user-interface.mdx +++ b/apps/docs/content/docs/user-interface.mdx @@ -1,5 +1,5 @@ --- -title: User Interface +title: User interface status: published author: steveruizok date: 3/22/2023 @@ -39,6 +39,27 @@ All of our user interface works by controlling the editor via its `Editor` metho The source for these examples are available in the [tldraw repository](https://github.com/tldraw/tldraw/blob/main/apps/examples/src) or in a [sandbox here](https://stackblitz.com/github/tldraw/tldraw/tree/examples?file=src%2Findex.tsx). +## Events + +The [Tldraw](?) component has a prop, `onUiEvent`, that the user interface will call when certain events occur. + +```tsx +function Example() { + function handleEvent(name, data) { + // do something with the event + } + + return +} +``` + +The `onUiEvent` callback is called with the name of the event as a string and an object with information about the event's source (e.g. `menu` or `context-menu`) and possibly other data specific to each event, such as the direction in an `align-shapes` event. + +Note that `onUiEvent` is only called when interacting with the user interface. It is not called when running commands manually against the app, e.g. calling [Editor#alignShapes](?) will not call `onUiEvent`. + +See the [tldraw repository](https://github.com/tldraw/tldraw/tree/main/apps/examples) for an example of how to customize tldraw's user interface. + + ## Overrides The content of tldraw's menus can be controlled via the `overrides` prop. This prop accepts a [TLUiOverrides](/reference/tldraw/TLUiOverrides) object, which has methods for each part of the user interface, such as the `toolbar` or `keyboardShortcutsMenu`. @@ -99,70 +120,6 @@ const myOverrides: TLUiOverrides = { The `tools` object is a map of [TLUiToolItem](/reference/tldraw/TLUiToolItem)s, with each item keyed under its `id`. -### Toolbar and Menus - -The remaining overrides are for toolbar and the various menus: the main menu, actions menu, context menu, help menu, and the keyboard shortcuts menu. - -Each of these overrides accepts a method that receives the default menu schema and returns a mutated version of that schema. - -```ts -const myOverrides: TLUiOverrides = { - actions(editor, actions) { - // Create a new action or replace an existing one - actions['my-new-action'] = { - id: 'my-new-action', - label: 'My new action', - readonlyOk: true, - kbd: '$u', - onSelect(source: any) { - window.alert('My new action just happened!') - }, - } - return actions - }, - contextMenu(editor, contextMenu, { actions }) { - const newMenuItem = menuItem(actions['my-new-action']) - const newMenuGroup = menuGroup('my-items', newMenuItem) - contextMenu.unshift(newMenuItem) - return contextMenu - }, - menu(editor, menu, { actions }) { - // using the findMenuItem helper - const fileMenu = findMenuItem(menu, ['menu', 'file']) - if (fileMenu.type === 'submenu') { - // add the new item to the file menu's children - const newMenuItem = menuItem(actions['my-new-action']) - fileMenu.children.unshift(newMenuItem) - } - return menu - }, -} -``` - -A menu schema is an array of either [submenus](/reference/tldraw/TLUiSubMenu), [groups](/reference/tldraw/TLUiMenuGroup), [items](/reference/tldraw/TLUiMenuItem), or [custom items](/reference/tldraw/TLUiCustomMenuItem). Each group or submenu may include any of the other types as its children. - -The menu schema is stateful. Referencing atomic properties (such as computed values in the editor) will cause the menu to update when those values change. If you wish for a menu item to disappear from the menu, you can return `null` from the menu method. You can also provide additional options for each item, `disabled` or `checked`. - -```ts -const myOverrides: TLUiOverrides = { - menu(editor, menu, { actions }) { - const selectedShapes = editor.getSelectedShapeIds().length - - const newMenuGroup = menuGroup( - 'my-actions', - selectedShapes > 0 ? menuItem(actions['action-a']) : null, - menuItem(actions['action-b'], { disabled: selectedShapes < 3 }) - ) - - menu.unshift(newMenuGroup) - - return menu - }, -} -``` - -It's recommmended to explore the [default menu schema](https://github.com/tldraw/tldraw/blob/main/packages/tldraw/src/lib/ui/hooks/useMenuSchema.tsx) in order to understand how menu items work. - ### Translations The `translations` method accepts a table of new translations. For example, if you wanted a tool to reference a key `"tools.card"`, then you should at minimum provide an english translation for this key. @@ -176,23 +133,3 @@ const myOverrides: TLUiOverrides = { }, } ``` - -## Events - -The [Tldraw](?) component has a prop, `onUiEvent`, that the user interface will call when certain events occur. - -```tsx -function Example() { - function handleEvent(name, data) { - // do something with the event - } - - return -} -``` - -The `onUiEvent` callback is called with the name of the event as a string and an object with information about the event's source (e.g. `menu` or `context-menu`) and possibly other data specific to each event, such as the direction in an `align-shapes` event. - -Note that `onUiEvent` is only called when interacting with the user interface. It is not called when running commands manually against the app, e.g. calling [Editor#alignShapes](?) will not call `onUiEvent`. - -See the [tldraw repository](https://github.com/tldraw/tldraw/tree/main/apps/examples) for an example of how to customize tldraw's user interface. diff --git a/apps/docs/content/getting-started/quick-start.mdx b/apps/docs/content/getting-started/quick-start.mdx index 1867e09a0..649f15c12 100644 --- a/apps/docs/content/getting-started/quick-start.mdx +++ b/apps/docs/content/getting-started/quick-start.mdx @@ -12,71 +12,64 @@ The tldraw SDK provides a really simple way to craft infinite canvas experiences By the end of this guide you will have made something that looks like this: - + +### 1. Installation -
    -
      -
    1. - ### Installation +- Set up a React project however you normally do. [We recommend Vite](https://vitejs.dev/guide/#scaffolding-your-first-vite-project). +- Install the tldraw library using this command: - - Set up a React project however you normally do. [We recommend Vite](https://vitejs.dev/guide/#scaffolding-your-first-vite-project). - - Install the tldraw library using this command: - - ```bash - npm install tldraw@beta - ``` -
    2. -
    3. - ### Import Styles -
      - To import fonts and CSS for tldraw: +```bash +npm install @tldraw/tldraw@beta +``` - - Create or edit a css file called `index.css` - - Copy and paste this into the file: - ```CSS - @import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&family=Roboto+Mono:wght@400;700&display=swap"); - @import url("tldraw/tldraw.css"); +### 2. Import Styles - body { - font-family: "Inter"; - } - ``` -
    4. -
    5. - ### Render Tldraw Component -
      - To render the Tldraw component +To import fonts and CSS for tldraw: - - Import the `` component from `tldraw` - - Import the `index.css` CSS file from earlier - - Wrap the Tldraw component in a `
      ` element with the style attribute set to: `{ position: 'fixed', inset: 0 }` - -

      This will render a full screen canvas:

      +- Create or edit a css file called `index.css` +- Copy and paste this into the file: - ```javascript - import { Tldraw } from "tldraw"; - import "./index.css"; +```CSS +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@500;700;&display=swap"); +@import url("@tldraw/tldraw/tldraw.css"); - export default function App() { - return ( -
      - -
      - ); - } - ``` -
    6. -
    +body { + font-family: "Inter"; +} +``` -
    +### 3. Render Tldraw Component -### Next Steps +To render the Tldraw component -You did it! Now that you have your canvas working, you may be wondering: what next? You can try: +- Import the `` component from `@tldraw/tldraw` +- Import the `index.css` CSS file from earlier +- Wrap the Tldraw component in a `
    ` element with the style attribute set to: `{ position: 'fixed', inset: 0 }` + +This will render a full screen canvas: + +```javascript +import { Tldraw } from "@tldraw/tldraw"; +import "./index.css"; + +export default function App() { + return ( +
    + +
    + ); +} +``` + +## Next Steps + +Now that you have your canvas working, you may be wondering: what next? + +You can try: - Giving the editor a makeover by [customizing the UI](/docs/user-interface) - Adding your own [shapes](/docs/shapes) and [tools](/docs/tools) - Providing collaboration using [multiplayer](https://github.com/tldraw/tldraw-yjs-example) -We provide the above examples and more in our [examples section](/examples/basic/develop). Go build something creative and please do share it with us in our [#show-and-tell](https://discord.com/invite/SBBEVCA4PG) channel on Discord! +We provide the above examples and more in our [examples section](/examples). Go build something creative and please do share it with us in our [#show-and-tell](https://discord.com/invite/SBBEVCA4PG) channel on Discord! diff --git a/apps/docs/content/sections.json b/apps/docs/content/sections.json index 5ba4169fc..9e7508e23 100644 --- a/apps/docs/content/sections.json +++ b/apps/docs/content/sections.json @@ -9,7 +9,7 @@ { "id": "docs", "title": "Learn tldraw", - "description": "Developer documentation for tldraw.", + "description": "Learn to use the tldraw SDK.", "categories": [], "sidebar_behavior": "show-links" }, @@ -58,7 +58,8 @@ "id": "Namespace", "path": null } - ] + ], + "hero": null }, { "id": "store", @@ -93,7 +94,8 @@ "id": "Namespace", "path": null } - ] + ], + "hero": null }, { "id": "tldraw", @@ -128,7 +130,8 @@ "id": "Namespace", "path": null } - ] + ], + "hero": null }, { "id": "tlschema", @@ -163,7 +166,8 @@ "id": "Namespace", "path": null } - ] + ], + "hero": null }, { "id": "validate", @@ -198,9 +202,11 @@ "id": "Namespace", "path": null } - ] + ], + "hero": null } ], - "sidebar_behavior": "reference" + "sidebar_behavior": "reference", + "hero": null } ] diff --git a/apps/docs/package.json b/apps/docs/package.json index 1f0187397..4b1302103 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -29,7 +29,7 @@ "dev": "concurrently \"NODE_ENV=development next dev --port=3001\" \"tsx ./watcher.ts\" --kill-others", "next-dev": "next dev", "lint": "yarn run -T tsx ../../scripts/lint.ts", - "build": "yarn create-api-markdown && yarn refresh-content && next build", + "build": "yarn create-api-markdown && yarn refresh-content && next build && yarn check-links", "start": "yarn create-api-markdown && yarn refresh-content && next start", "fetch-api-source": "yarn run -T tsx --tsconfig ./tsconfig.content.json ./scripts/fetch-api-source.ts", "fetch-releases": "yarn run -T tsx --tsconfig ./tsconfig.content.json ./scripts/fetch-releases.ts", @@ -54,7 +54,6 @@ "@types/sqlite3": "^3.1.9", "@types/ws": "^8.5.9", "@vercel/analytics": "^1.1.1", - "broken-link-checker": "^0.7.8", "classnames": "^2.3.2", "concurrently": "^8.2.2", "dotenv": "^16.3.1", @@ -87,5 +86,8 @@ "unist-util-visit": "^5.0.0", "vectra": "^0.4.4", "ws": "^8.16.0" + }, + "devDependencies": { + "linkinator": "^6.0.4" } } diff --git a/apps/docs/public/tldraw_dev_dark.png b/apps/docs/public/tldraw_dev_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac165aa2573bbe71b2829651407ae64ce744d84 GIT binary patch literal 22845 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�$MJr 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/tldraw_dev_light.png b/apps/docs/public/tldraw_dev_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6499cc3c3077b40b6c491af468387d25b932c4c3 GIT binary patch literal 23387 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 z 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 q^?k-?DwK80r zGGU(`*}AXRU+b<|+x%c&o`IH1iPsXs#yJv@TJr#c|1=Z%@k4;ZSHR_xjlZ4x_ye`B zF*69!MFhtrCj+hwngx-Z?+sLmXYIc0n&DtSm#jH^Zjdlte)#lxKV8pWMi7cw`hr1C z>3-#ovKxx^lm}J4EYi}Z>!k#j7#sp@3^8A$l)d6RvmI~f)0CfQ{n0hKff9_=4y$>w;>q>0y$b7uAfGu4Vh)o&NwM+e#Osh!i10nNc|W&hjpkG zQ>y))yf4ZtzQ2nIc-ssU9EyWtre&B#h{9X(mQyVA{)mf-Lssn}74p<|@BZ8#*}Yx7 zO(8^(v-Qk4Lif{_vbm$-N`=oUN1?umK_X%;?yH3^vsenHusT|tK7`4+v(ls^SRYGk zwXmg1_@ri}q?DN}eA&>E3+C^X7S;64hvv3GMr^A9Z)PRBonPBa6YIk^SG8Gao0aE- z?d_Ys03E|V&O!N}jcPoiMtDq#6R}?Uk}#x~6J5n|J-UY83N};1*n+0|n24jbgqfKa z*dut>c*gEtare*IriAnJFxe}6Afyxpo}r;|1uVreW;&ukREjTo$O^vG(&@V{Ijb0C zK&zA)hq2dHn6O?>a9@jaf!(i|i*VbV4JVr{?uOF7lEZ)OS@E*I{o2iSWLI;9FOV0z zcLB>g5xiNmvFE9uOQ)PSS)d3BoHE&1G>cZ}%r@RZNKI;J|~~&zrhtGC5z&+t;SJ@8 zOz8_y?g_C>`w-5Zj{E$mY$;Cs`}FezX&34$GOI!zxv}kQ{pZD~uW#7I#+MwWKTsj_ zZu+?}L#z9H)LIl@YB(3*?$W#I>oAu%)%4IYgUW5;=LkjG^vY+13|-=)l;dH#C)R^-&P z?J>cz`3^me-0`GlBg+e!R{-lVS?ipU_Mjgsf)Ddc;$|u~oZJXnBkJjit~_Zh6X!8~ zPBEw0lOVrc`l(@$*1ahMMiEo@-s$n6H+EsqBxpz86S_-_Tr~?m zKoj|BsD!pktVZVj+p9R=>)!fnKUmjI{WyB7qj zyt=k}z%=`4+ItjNn?77abOdwx^%`%XvBy*_^>wly3me`9XMzqlY5Dix>>qU(O$T7` zP7dA`4VazQB;*8~6e>%Q&j*+9ty)w2ysT1Zv4s{^z4d5*8W)jY?b=98Yw;n$5Otz2 zu0{T)<41V{fVHv>fmYmi+X4?inebC1f_fmDQ|}dLs_7o#>QV~=ja#X2^%=3kwA(K5 zVKyyTd+E74ji?LlU34l=-xI;_Rw|ES$J-yr>O*9*1>du&CxPQbBum??%nNvnSHfFW z=G^4)bhx+ycmbhGQCwMTa)W>n_G@cy?Vp~*^ZeZ^X>5Z`s|fG#4wJ4L9?zD}aH zBOVeJd%NuKOVdxC6O|jwWrRa`9n`p@!`UNpni2_={EiCm8jhv8oRR8{@f7_q3&<|Vn_CoXot$w^dSAXnLIl-suNr#WIte+^0{P}W_PVad{W zGl}b?+EBuKNlbf3-TC+FXKFIgu--TgQ&S9Z;Lb9`ssOo7H^fgKpJ`ibd!#Z^KkTqL{Q6GPi0286d?PBh;(+xXGfG)$ z*vZW6nYVP`pB>{&q=%%5W0Zz~5 G;r{^=YjN5D literal 0 HcmV?d00001 diff --git a/apps/docs/scripts/functions/checkBrokenLinks.ts b/apps/docs/scripts/functions/checkBrokenLinks.ts index e270263bf..c3e2e7425 100644 --- a/apps/docs/scripts/functions/checkBrokenLinks.ts +++ b/apps/docs/scripts/functions/checkBrokenLinks.ts @@ -1,29 +1,25 @@ import { nicelog } from '@/utils/nicelog' -import blc from 'broken-link-checker' - -const IGNORED_URLS = ['https://twitter.com/tldraw', 'https://tldraw.com'] +import { check } from 'linkinator' export async function checkBrokenLinks() { - nicelog('Checking broken links...') - const checked = new Set() - const checker = new blc.SiteChecker( - { - filterLevel: 1, - }, - { - link(result) { - if (IGNORED_URLS.includes(result.url.original)) return - if (checked.has(result.url.resolved)) return - // nicelog('Checking', result.url.resolved.replace('http://localhost:3001', '')) - if (result.broken) { - nicelog(`BROKEN: ${result.url.resolved} on page ${result.base.resolved}`) - } - checked.add(result.url.resolved) - }, - end() { - nicelog('done') - }, - } + const results = await check({ + path: 'http://localhost:3001', + recurse: true, + }) + + // All good + if (results.passed) return + + // There seems to be a porblem + nicelog( + `𐄂 Broken links detected!\n\n` + + results.links + .filter((result) => result.state !== 'OK') + .map( + (result, i) => + `${i + 1}.\t${result.url}\n\tFrom: ${result.parent}\n\tStatus: ${result.status}` + ) + .join('\n\n') + + '\n\n' ) - checker.enqueue('http://localhost:3001/docs/assets', null) } diff --git a/apps/docs/scripts/functions/createApiMarkdown.ts b/apps/docs/scripts/functions/createApiMarkdown.ts index b40747961..8c4d4bb64 100644 --- a/apps/docs/scripts/functions/createApiMarkdown.ts +++ b/apps/docs/scripts/functions/createApiMarkdown.ts @@ -13,6 +13,7 @@ export async function createApiMarkdown() { description: "Reference for the tldraw package's APIs (generated).", categories: [], sidebar_behavior: 'reference', + hero: null, } const addedCategories = new Set() @@ -55,6 +56,7 @@ export async function createApiMarkdown() { id: title, path: null, })), + hero: null, }) addedCategories.add(categoryName) } diff --git a/apps/docs/scripts/functions/generateExamplesContent.ts b/apps/docs/scripts/functions/generateExamplesContent.ts index 2ef20f0b0..ca17c1b92 100644 --- a/apps/docs/scripts/functions/generateExamplesContent.ts +++ b/apps/docs/scripts/functions/generateExamplesContent.ts @@ -8,13 +8,14 @@ const section: InputSection = { title: 'Examples', description: 'Code recipes for bending tldraw to your will.', categories: [ - { id: 'basic', title: 'Getting Started', description: '', groups: [] }, - { id: 'ui', title: 'UI & Theming', description: '', groups: [] }, - { id: 'shapes/tools', title: 'Shapes & Tools', description: '', groups: [] }, - { id: 'data/assets', title: 'Data & Assets', description: '', groups: [] }, - { id: 'editor-api', title: 'Editor API', description: '', groups: [] }, - { id: 'collaboration', title: 'Collaboration', description: '', groups: [] }, + { id: 'basic', title: 'Getting Started', description: '', groups: [], hero: null }, + { id: 'ui', title: 'UI & Theming', description: '', groups: [], hero: null }, + { id: 'shapes/tools', title: 'Shapes & Tools', description: '', groups: [], hero: null }, + { id: 'data/assets', title: 'Data & Assets', description: '', groups: [], hero: null }, + { id: 'editor-api', title: 'Editor API', description: '', groups: [], hero: null }, + { id: 'collaboration', title: 'Collaboration', description: '', groups: [], hero: null }, ], + hero: null, sidebar_behavior: 'show-links', } diff --git a/apps/docs/scripts/functions/generateSection.ts b/apps/docs/scripts/functions/generateSection.ts index 41da72271..12dffe400 100644 --- a/apps/docs/scripts/functions/generateSection.ts +++ b/apps/docs/scripts/functions/generateSection.ts @@ -166,6 +166,7 @@ export function generateSection(section: InputSection, articles: Articles, index groups: [], path: `/${section.id}/ucg`, content: null, + hero: null, }, ] @@ -188,6 +189,7 @@ export function generateSection(section: InputSection, articles: Articles, index index: i + 1, path: `/${section.id}/${inputCategory.id}`, content: null, + hero: null, groups: inputCategory.groups.map(({ id }, i) => ({ id, title: id, @@ -210,6 +212,7 @@ export function generateSection(section: InputSection, articles: Articles, index index, categories, content: '', + hero: section.hero ?? null, path: `/${section.id}`, } } diff --git a/apps/docs/scripts/functions/getApiMarkdown.ts b/apps/docs/scripts/functions/getApiMarkdown.ts index 68cb4f6d7..b67b8751d 100644 --- a/apps/docs/scripts/functions/getApiMarkdown.ts +++ b/apps/docs/scripts/functions/getApiMarkdown.ts @@ -217,7 +217,7 @@ async function addDocComment(result: Result, member: ApiItem) { if (exampleBlocks.length) { result.markdown += `\n\n` - result.markdown += `##### Example\n\n` + result.markdown += `Example\n\n` for (const example of exampleBlocks) { result.markdown += await MarkdownWriter.docNodeToMarkdown(member, example.content) } @@ -393,7 +393,7 @@ function addTags(result: Result, member: ApiItem) { tags.push('readonly') } tags.push(member.kind.toLowerCase()) - result.markdown += `${tags.join(' ')}\n\n` + result.markdown += `${tags.filter((t) => t.toLowerCase() !== 'none').join(' ')}\n\n` } function addReferences(result: Result, member: ApiItem) { diff --git a/apps/docs/styles/globals.css b/apps/docs/styles/globals.css index 1dd483cbf..ee5b92121 100644 --- a/apps/docs/styles/globals.css +++ b/apps/docs/styles/globals.css @@ -19,13 +19,15 @@ --color-tint-5: rgb(144, 144, 144); --color-tint-6: rgb(81, 81, 81); + --color-blockquote: rgb(242, 247, 255); + /* Light theme */ --color-text: #1d1d1d; --color-text-secondary: #666; --color-background: #ffffff; --color-contrast: #ffffff; --color-accent: #2f80ed; - --color-footer-background: #212529; + --color-footer-background: hsl(240, 5%, 8%); --color-footer-text: #fafafa; --shadow-small: 0px 0px 16px -2px rgba(0, 0, 0, 0.12), 0px 0px 4px 0px rgba(0, 0, 0, 0.12); @@ -47,7 +49,8 @@ --border-radius-menu: 4px; /* Sizes */ - --header-height: 72px; + --header-height: 80px; + --header-padding: 24px; } [data-theme='dark'] { @@ -57,7 +60,7 @@ --color-background: hsl(240, 5%, 8%); --color-contrast: #000; --color-accent: #74b0ff; - --color-footer-background: #0d0d0d; + --color-footer-background: hsl(240, 5%, 8%); --color-footer-text: #ccc; --shadow-small: 0px 0px 16px -2px rgba(0, 0, 0, 0.52), 0px 0px 4px 0px rgba(0, 0, 0, 0.62); @@ -71,6 +74,8 @@ --color-tint-5: rgb(144, 144, 144); --color-tint-6: rgb(186, 186, 186); + --color-blockquote: rgb(34, 47, 55); + /* Code colors */ --hl: #c8c5f1; --hl-0: #5c6370; @@ -93,7 +98,7 @@ html { background-color: #000; border-bottom: none; - scroll-padding-top: var(--header-height); + scroll-padding-top: calc(var(--header-height) + var(--header-padding)); } body { @@ -137,7 +142,7 @@ body { z-index: 900; top: 0px; display: grid; - padding: 16px; + padding: 0px 16px; grid-template-columns: 250px 1fr auto; gap: 16px; justify-content: center; @@ -145,24 +150,31 @@ body { color: var(--color-text); } -.layout__header .lockup { - position: relative; - width: calc(71px * (30 / 18)); - height: calc(18px * (30 / 18)); - background: currentColor; - color: var(--color-text); - margin-bottom: 8px; +.layout__header__left img { + width: calc(136px); + height: auto; } -.layout__header__sections_and_socials { +.layout__header__links { display: flex; align-items: center; justify-content: space-between; + gap: 8px; +} + +.layout__header__sections { + display: flex; + align-items: center; +} + +.layout__header__socials { + display: flex; + align-items: center; } .layout_header__section { text-decoration: none; - padding: 8px 12px; + padding: 13px 12px; font-size: 14px; color: var(--color-text); position: relative; @@ -172,7 +184,7 @@ body { position: absolute; display: block; content: ''; - inset: 7px 1px; + inset: 7px 2px; background-color: var(--bg); border-radius: var(--border-radius-menu); } @@ -241,11 +253,11 @@ body { background-color: currentColor; } -.article { +.main-content { justify-self: center; width: 100%; min-height: calc(100vh - 64px); - padding: 0px 0px 96px 0px; + padding: var(--header-padding) 0px 96px 0px; font-weight: 400; overflow-x: hidden; overflow-y: visible; @@ -354,7 +366,7 @@ body { } .article > h2 { - margin-top: 16px; + margin-top: 48px; } .article > p + h2 { @@ -468,9 +480,10 @@ body { .article > blockquote { max-width: 100%; - margin: 20px 0px; - padding-left: 16px; - border-left: 2px solid var(--color-tint-2); + margin: 32px 0px; + padding: 16px; + border-radius: var(--border-radius-menu); + background-color: var(--color-blockquote); } .article pre { @@ -517,8 +530,7 @@ body { color: var(--color-text); } -.article ol h3, -.article ol li::marker { +.article ol h3 { font-size: 1.17em; line-height: 28px; } @@ -551,7 +563,6 @@ body { .page-header > p { margin-top: 1rem; - } .article table { @@ -624,6 +635,7 @@ body { .article__embed--quickstart { aspect-ratio: 16 / 9; min-height: 405px; + margin: 32px 0px; } @media screen and (max-width: 520px) { @@ -649,8 +661,8 @@ body { .breadcrumb { font-size: 14px; color: var(--color-text); - font-weight: 600; - height: 40px; + font-weight: 500; + padding-bottom: 4px; display: flex; align-items: center; gap: 4px; @@ -675,7 +687,6 @@ body { font-size: 12px; gap: 24px; color: var(--color-footer-text); - border-top: 1px solid rgba(144, 144, 144, 0.28); overflow: hidden; } @@ -781,7 +792,7 @@ body { align-self: start; top: var(--header-height); margin-left: -12px; - padding: 24px 28px 120px 12px; + padding: var(--header-padding) 28px 120px 12px; max-height: calc(100vh); width: 290px; z-index: 800; @@ -815,7 +826,7 @@ body { align-self: start; top: var(--header-height); margin-left: -12px; - padding: 0px 12px 120px 28px; + padding: var(--header-padding) 12px 120px 28px; width: calc(100% + 24px); max-height: calc(100vh); z-index: 800; @@ -934,18 +945,21 @@ body { transition-delay: 0s; } -.sidebar__section__title { +.uppercase_title { + text-transform: uppercase; font-size: 12px; font-weight: 500; + letter-spacing: 0.5px; + color: var(--color-text-secondary); +} + +.sidebar__section__title { margin-bottom: 4px; position: relative; - letter-spacing: 0.5px; - height: 40px; + padding-bottom: 4px; display: flex; align-items: center; justify-content: flex-start; - color: var(--color-text-secondary); - text-transform: uppercase; --bg: transparent; white-space: nowrap; } @@ -958,7 +972,6 @@ body { display: flex; align-items: center; justify-content: space-between; - color: var(--color-text-secondary); white-space: nowrap; background: transparent; border: 0; @@ -971,7 +984,6 @@ body { .sidebar__sections__list > *:nth-last-of-type(n + 2) > .sidebar__list { padding-bottom: 12px; margin-bottom: 12px; - border-bottom: 1px solid var(--color-tint-2); } @media (hover: hover) { @@ -1113,8 +1125,7 @@ body { grid-gap: 40px; } - .layout__header .layout__header__sections_and_socials .layout_header__section, - .layout__header .layout__header__sections_and_socials .NavigationMenuRoot { + .layout__header .NavigationMenuRoot { display: none; } @@ -1122,10 +1133,10 @@ body { position: relative; z-index: 1; display: flex; - justify-content: space-around; - padding: 16px 0; - border-top: 1px solid var(--color-accent); - border-bottom: 1px solid var(--color-accent); + padding: 12px 0px; + border-bottom: 1px solid var(--color-tint-2); + margin-bottom: 12px; + margin-left: -8px; } .NavigationMenuTrigger { @@ -1142,7 +1153,7 @@ body { } .layout__header { - grid-template-columns: auto auto; + grid-template-columns: auto 1fr; justify-content: space-between; } @@ -1227,7 +1238,7 @@ body { display: none; } - .article { + .main-content { padding: 24px 16px 16px 16px; } @@ -1288,6 +1299,14 @@ body { display: none; } + .layout__header__links { + justify-content: flex-end; + } + + .layout__header__sections { + display: none; + } + .article__links__prev { border: none; grid-row: 2; @@ -1327,6 +1346,7 @@ html[data-theme='light'] .hero__dark { } .code-example .sandpack { + margin-top: 20px; margin-bottom: 32px; } @@ -1358,12 +1378,12 @@ html[data-theme='light'] .hero__dark { /* ------------------- Hero images ------------------ */ -.hero__images { - margin: 32px 0px; +.hero__images__wrapper { + padding-bottom: 24px; } -.hero_images > a { - margin: 0px; +.hero__images { + margin: 32px 0px; } .article__image { @@ -1496,3 +1516,83 @@ html[data-theme='light'] .hero__dark { .scroll-light::-webkit-scrollbar-thumb:hover { background-color: rgba(144, 144, 144); } + +/* ------------------ Landing page ------------------ */ + +.landing { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; +} + +.landing__inner { + width: fit-content; + max-width: 960px; + height: fit-content; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.landing__logo { + display: flex; + align-items: center; + justify-content: center; +} + +.landing__logo img { + width: 200px; + height: auto; +} + +[data-theme='dark'] .logo-light { + display: none; +} + +[data-theme='light'] .logo-dark { + display: none; +} + +.landing__blurb { + font-size: 1em; + font-weight: 500; + text-align: center; + margin: 12px 0 16px 0; +} + +.landing__links { + list-style-type: none; + display: flex; + gap: 0px; +} + +.landing__links a { + text-decoration: none; + color: var(--color-text); + padding: 16px 16px; + position: relative; + font-size: inherit; + font-family: inherit; + font-weight: 600; +} + +.landing__links a::after { + position: absolute; + display: block; + content: ''; + top: 8px; + bottom: 8px; + left: 1px; + right: 1px; + background-color: var(--color-tint-1); + border-radius: var(--border-radius-menu); + opacity: 0; +} + +@media (hover: hover) { + .landing__links a:hover::after { + opacity: 1; + } +} diff --git a/apps/docs/styles/parameters-table.css b/apps/docs/styles/parameters-table.css index 781dd2d81..85db57d29 100644 --- a/apps/docs/styles/parameters-table.css +++ b/apps/docs/styles/parameters-table.css @@ -1,11 +1,3 @@ -.article__api-heading { - text-transform: uppercase; - color: var(--color-tint-5); - letter-spacing: 0.07em; - font-size: 12px; - font-weight: 400; -} - .article__parameters-table { table-layout: fixed; } diff --git a/apps/docs/types/content-types.ts b/apps/docs/types/content-types.ts index b97574814..09e8d1885 100644 --- a/apps/docs/types/content-types.ts +++ b/apps/docs/types/content-types.ts @@ -3,6 +3,7 @@ export type InputCategory = { title: string description: string groups: InputGroup[] + hero: string | null } export type InputSection = { @@ -10,6 +11,7 @@ export type InputSection = { title: string description: string categories: InputCategory[] + hero: string | null sidebar_behavior: 'show-links' | 'show-title' | 'hidden' | 'reference' } @@ -56,6 +58,8 @@ export interface Section extends ContentPage { categories: Category[] /** How the section should appear in the sidebar. */ sidebar_behavior: 'show-links' | 'show-title' | 'hidden' | 'reference' + /** The section's hero image (optional). */ + hero: string | null } export interface Category extends ContentPage { @@ -66,6 +70,8 @@ export interface Category extends ContentPage { index: number /** The category's groups */ groups: Group[] + /** The category's hero image (optional). */ + hero: string | null } export interface Group extends ContentPage { @@ -179,7 +185,6 @@ export type SidebarContentLink = | SidebarContentArticleLink export type SidebarContentList = { - headings?: ArticleHeadings sectionId: string | null categoryId: string | null articleId: string | null diff --git a/packages/tldraw/api-report.md b/packages/tldraw/api-report.md index 72a6f0ef0..d217a8b17 100644 --- a/packages/tldraw/api-report.md +++ b/packages/tldraw/api-report.md @@ -1400,7 +1400,136 @@ export const TldrawSelectionBackground: ({ bounds, rotation }: TLSelectionBackgr export const TldrawSelectionForeground: MemoExoticComponent<({ bounds, rotation, }: TLSelectionForegroundProps) => JSX_2.Element | null>; // @public (undocumented) -export const TldrawUi: React_2.NamedExoticComponent; +export const TldrawUi: React_2.NamedExoticComponent<{ + children?: any; + hideUi?: boolean | undefined; + components?: Partial<{ + ContextMenu: null | React_2.ComponentType; + ActionsMenu: null | React_2.ComponentType; + HelpMenu: null | React_2.ComponentType; + ZoomMenu: null | React_2.ComponentType; + MainMenu: null | React_2.ComponentType; + Minimap: null | React_2.ComponentType; + StylePanel: null | React_2.ComponentType; + PageMenu: null | React_2.ComponentType; + NavigationPanel: null | React_2.ComponentType; + Toolbar: null | React_2.ComponentType; + KeyboardShortcutsDialog: null | React_2.ComponentType; + QuickActions: null | React_2.ComponentType; + HelperButtons: null | React_2.ComponentType; + DebugMenu: null | React_2.ComponentType; + MenuPanel: null | React_2.ComponentType; + TopPanel: null | React_2.ComponentType; + SharePanel: null | React_2.ComponentType; + }> | undefined; + renderDebugMenuItems?: (() => React_2.ReactNode) | undefined; + assetUrls?: (RecursivePartial & RecursivePartial) | undefined; + overrides?: Partial<{ + actions: TLUiOverride & { + id?: string | undefined; + }) => string; + removeToast: (id: string) => string; + clearToasts: () => void; + addDialog: (dialog: Omit & { + id?: string | undefined; + }) => string; + clearDialogs: () => void; + removeDialog: (id: string) => string; + updateDialog: (id: string, newDialogData: Partial) => string; + msg: (id?: string | undefined) => string; + isMobile: boolean; + }>; + toolbar: TLUiOverride & { + id?: string | undefined; + }) => string; + removeToast: (id: string) => string; + clearToasts: () => void; + addDialog: (dialog: Omit & { + id?: string | undefined; + }) => string; + clearDialogs: () => void; + removeDialog: (id: string) => string; + updateDialog: (id: string, newDialogData: Partial) => string; + msg: (id?: string | undefined) => string; + isMobile: boolean; + }>; + tools: TLUiOverride void; + } & { + addToast: (toast: Omit & { + id?: string | undefined; + }) => string; + removeToast: (id: string) => string; + clearToasts: () => void; + addDialog: (dialog: Omit & { + id?: string | undefined; + }) => string; + clearDialogs: () => void; + removeDialog: (id: string) => string; + updateDialog: (id: string, newDialogData: Partial) => string; + msg: (id?: string | undefined) => string; + isMobile: boolean; + }>; + translations: Record> | undefined; + }> | Partial<{ + actions: TLUiOverride & { + id?: string | undefined; + }) => string; + removeToast: (id: string) => string; + clearToasts: () => void; + addDialog: (dialog: Omit & { + id?: string | undefined; + }) => string; + clearDialogs: () => void; + removeDialog: (id: string) => string; + updateDialog: (id: string, newDialogData: Partial) => string; + msg: (id?: string | undefined) => string; + isMobile: boolean; + }>; + toolbar: TLUiOverride & { + id?: string | undefined; + }) => string; + removeToast: (id: string) => string; + clearToasts: () => void; + addDialog: (dialog: Omit & { + id?: string | undefined; + }) => string; + clearDialogs: () => void; + removeDialog: (id: string) => string; + updateDialog: (id: string, newDialogData: Partial) => string; + msg: (id?: string | undefined) => string; + isMobile: boolean; + }>; + tools: TLUiOverride void; + } & { + addToast: (toast: Omit & { + id?: string | undefined; + }) => string; + removeToast: (id: string) => string; + clearToasts: () => void; + addDialog: (dialog: Omit & { + id?: string | undefined; + }) => string; + clearDialogs: () => void; + removeDialog: (id: string) => string; + updateDialog: (id: string, newDialogData: Partial) => string; + msg: (id?: string | undefined) => string; + isMobile: boolean; + }>; + translations: Record> | undefined; + }>[] | undefined; + onUiEvent?: TLUiEventHandler | undefined; + forceMobile?: boolean | undefined; +}>; // @public export interface TldrawUiBaseProps { @@ -1518,7 +1647,7 @@ export function TldrawUiPopoverContent({ side, children, align, sideOffset, alig export function TldrawUiPopoverTrigger({ children }: TLUiPopoverTriggerProps): JSX_2.Element; // @public -export type TldrawUiProps = TldrawUiBaseProps & TldrawUiContextProviderProps; +export type TldrawUiProps = Expand; // @internal (undocumented) export const TldrawUiSlider: NamedExoticComponent; diff --git a/packages/tldraw/api/api.json b/packages/tldraw/api/api.json index 4b0992096..254b9b788 100644 --- a/packages/tldraw/api/api.json +++ b/packages/tldraw/api/api.json @@ -16204,16 +16204,808 @@ }, { "kind": "Content", - "text": "<" + "text": "<{\n children?: any;\n hideUi?: boolean | undefined;\n components?: " }, { "kind": "Reference", - "text": "TldrawUiProps", - "canonicalReference": "tldraw!TldrawUiProps:type" + "text": "Partial", + "canonicalReference": "!Partial:type" }, { "kind": "Content", - "text": ">" + "text": "<{\n ContextMenu: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n ActionsMenu: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n HelpMenu: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n ZoomMenu: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n MainMenu: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n Minimap: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n StylePanel: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n PageMenu: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n NavigationPanel: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n Toolbar: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n KeyboardShortcutsDialog: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n QuickActions: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n HelperButtons: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n DebugMenu: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n MenuPanel: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n TopPanel: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n SharePanel: null | " + }, + { + "kind": "Reference", + "text": "React.ComponentType", + "canonicalReference": "@types/react!React.ComponentType:type" + }, + { + "kind": "Content", + "text": ";\n }> | undefined;\n renderDebugMenuItems?: (() => " + }, + { + "kind": "Reference", + "text": "React.ReactNode", + "canonicalReference": "@types/react!React.ReactNode:type" + }, + { + "kind": "Content", + "text": ") | undefined;\n assetUrls?: (import(\"@tldraw/editor\")." + }, + { + "kind": "Reference", + "text": "RecursivePartial", + "canonicalReference": "@tldraw/utils!RecursivePartial:type" + }, + { + "kind": "Content", + "text": " & import(\"@tldraw/editor\")." + }, + { + "kind": "Reference", + "text": "RecursivePartial", + "canonicalReference": "@tldraw/utils!RecursivePartial:type" + }, + { + "kind": "Content", + "text": ") | undefined;\n overrides?: " + }, + { + "kind": "Reference", + "text": "Partial", + "canonicalReference": "!Partial:type" + }, + { + "kind": "Content", + "text": "<{\n actions: import(\"./overrides\")." + }, + { + "kind": "Reference", + "text": "TLUiOverride", + "canonicalReference": "tldraw!~TLUiOverride:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n removeToast: (id: string) => string;\n clearToasts: () => void;\n addDialog: (dialog: " + }, + { + "kind": "Reference", + "text": "Omit", + "canonicalReference": "!Omit:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n clearDialogs: () => void;\n removeDialog: (id: string) => string;\n updateDialog: (id: string, newDialogData: " + }, + { + "kind": "Reference", + "text": "Partial", + "canonicalReference": "!Partial:type" + }, + { + "kind": "Content", + "text": ") => string;\n msg: (id?: string | undefined) => string;\n isMobile: boolean;\n }>;\n toolbar: import(\"./overrides\")." + }, + { + "kind": "Reference", + "text": "TLUiOverride", + "canonicalReference": "tldraw!~TLUiOverride:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n removeToast: (id: string) => string;\n clearToasts: () => void;\n addDialog: (dialog: " + }, + { + "kind": "Reference", + "text": "Omit", + "canonicalReference": "!Omit:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n clearDialogs: () => void;\n removeDialog: (id: string) => string;\n updateDialog: (id: string, newDialogData: " + }, + { + "kind": "Reference", + "text": "Partial", + "canonicalReference": "!Partial:type" + }, + { + "kind": "Content", + "text": ") => string;\n msg: (id?: string | undefined) => string;\n isMobile: boolean;\n }>;\n tools: import(\"./overrides\")." + }, + { + "kind": "Reference", + "text": "TLUiOverride", + "canonicalReference": "tldraw!~TLUiOverride:type" + }, + { + "kind": "Content", + "text": " void;\n } & {\n addToast: (toast: " + }, + { + "kind": "Reference", + "text": "Omit", + "canonicalReference": "!Omit:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n removeToast: (id: string) => string;\n clearToasts: () => void;\n addDialog: (dialog: " + }, + { + "kind": "Reference", + "text": "Omit", + "canonicalReference": "!Omit:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n clearDialogs: () => void;\n removeDialog: (id: string) => string;\n updateDialog: (id: string, newDialogData: " + }, + { + "kind": "Reference", + "text": "Partial", + "canonicalReference": "!Partial:type" + }, + { + "kind": "Content", + "text": ") => string;\n msg: (id?: string | undefined) => string;\n isMobile: boolean;\n }>;\n translations: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "> | undefined;\n }> | " + }, + { + "kind": "Reference", + "text": "Partial", + "canonicalReference": "!Partial:type" + }, + { + "kind": "Content", + "text": "<{\n actions: import(\"./overrides\")." + }, + { + "kind": "Reference", + "text": "TLUiOverride", + "canonicalReference": "tldraw!~TLUiOverride:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n removeToast: (id: string) => string;\n clearToasts: () => void;\n addDialog: (dialog: " + }, + { + "kind": "Reference", + "text": "Omit", + "canonicalReference": "!Omit:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n clearDialogs: () => void;\n removeDialog: (id: string) => string;\n updateDialog: (id: string, newDialogData: " + }, + { + "kind": "Reference", + "text": "Partial", + "canonicalReference": "!Partial:type" + }, + { + "kind": "Content", + "text": ") => string;\n msg: (id?: string | undefined) => string;\n isMobile: boolean;\n }>;\n toolbar: import(\"./overrides\")." + }, + { + "kind": "Reference", + "text": "TLUiOverride", + "canonicalReference": "tldraw!~TLUiOverride:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n removeToast: (id: string) => string;\n clearToasts: () => void;\n addDialog: (dialog: " + }, + { + "kind": "Reference", + "text": "Omit", + "canonicalReference": "!Omit:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n clearDialogs: () => void;\n removeDialog: (id: string) => string;\n updateDialog: (id: string, newDialogData: " + }, + { + "kind": "Reference", + "text": "Partial", + "canonicalReference": "!Partial:type" + }, + { + "kind": "Content", + "text": ") => string;\n msg: (id?: string | undefined) => string;\n isMobile: boolean;\n }>;\n tools: import(\"./overrides\")." + }, + { + "kind": "Reference", + "text": "TLUiOverride", + "canonicalReference": "tldraw!~TLUiOverride:type" + }, + { + "kind": "Content", + "text": " void;\n } & {\n addToast: (toast: " + }, + { + "kind": "Reference", + "text": "Omit", + "canonicalReference": "!Omit:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n removeToast: (id: string) => string;\n clearToasts: () => void;\n addDialog: (dialog: " + }, + { + "kind": "Reference", + "text": "Omit", + "canonicalReference": "!Omit:type" + }, + { + "kind": "Content", + "text": " & {\n id?: string | undefined;\n }) => string;\n clearDialogs: () => void;\n removeDialog: (id: string) => string;\n updateDialog: (id: string, newDialogData: " + }, + { + "kind": "Reference", + "text": "Partial", + "canonicalReference": "!Partial:type" + }, + { + "kind": "Content", + "text": ") => string;\n msg: (id?: string | undefined) => string;\n isMobile: boolean;\n }>;\n translations: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "> | undefined;\n }>[] | undefined;\n onUiEvent?: import(\"./context/events\")." + }, + { + "kind": "Reference", + "text": "TLUiEventHandler", + "canonicalReference": "tldraw!TLUiEventHandler:type" + }, + { + "kind": "Content", + "text": " | undefined;\n forceMobile?: boolean | undefined;\n}>" } ], "fileUrlPath": "packages/tldraw/src/lib/ui/TldrawUi.tsx", @@ -16222,7 +17014,7 @@ "name": "TldrawUi", "variableTypeTokenRange": { "startIndex": 1, - "endIndex": 5 + "endIndex": 181 } }, { @@ -18325,12 +19117,21 @@ { "kind": "TypeAlias", "canonicalReference": "tldraw!TldrawUiProps:type", - "docComment": "/**\n * Props for the {@link tldraw#Tldraw} and {@link TldrawUi} components.\n *\n * @public\n */\n", + "docComment": "/**\n * Props for the {@link @tldraw/tldraw#Tldraw} and {@link TldrawUi} components.\n *\n * @public\n */\n", "excerptTokens": [ { "kind": "Content", "text": "export type TldrawUiProps = " }, + { + "kind": "Reference", + "text": "Expand", + "canonicalReference": "@tldraw/utils!Expand:type" + }, + { + "kind": "Content", + "text": "<" + }, { "kind": "Reference", "text": "TldrawUiBaseProps", @@ -18345,6 +19146,10 @@ "text": "TldrawUiContextProviderProps", "canonicalReference": "tldraw!TldrawUiContextProviderProps:interface" }, + { + "kind": "Content", + "text": ">" + }, { "kind": "Content", "text": ";" @@ -18355,7 +19160,7 @@ "name": "TldrawUiProps", "typeTokenRange": { "startIndex": 1, - "endIndex": 4 + "endIndex": 7 } }, { diff --git a/packages/tldraw/src/lib/ui/TldrawUi.tsx b/packages/tldraw/src/lib/ui/TldrawUi.tsx index 3b5da8011..6797d14d7 100644 --- a/packages/tldraw/src/lib/ui/TldrawUi.tsx +++ b/packages/tldraw/src/lib/ui/TldrawUi.tsx @@ -1,5 +1,5 @@ import { ToastProvider } from '@radix-ui/react-toast' -import { useEditor, useValue } from '@tldraw/editor' +import { Expand, useEditor, useValue } from '@tldraw/editor' import classNames from 'classnames' import React, { ReactNode } from 'react' import { TLUiAssetUrlOverrides } from './assetUrls' @@ -23,13 +23,6 @@ import { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts' import { useReadonly } from './hooks/useReadonly' import { useTranslation } from './hooks/useTranslation/useTranslation' -/** - * Props for the {@link tldraw#Tldraw} and {@link TldrawUi} components. - * - * @public - */ -export type TldrawUiProps = TldrawUiBaseProps & TldrawUiContextProviderProps - /** * Base props for the {@link tldraw#Tldraw} and {@link TldrawUi} components. * @@ -60,6 +53,13 @@ export interface TldrawUiBaseProps { assetUrls?: TLUiAssetUrlOverrides } +/** + * Props for the {@link @tldraw/tldraw#Tldraw} and {@link TldrawUi} components. + * + * @public + */ +export type TldrawUiProps = Expand + /** * @public */ diff --git a/yarn.lock b/yarn.lock index 5ee3d4625..07cf1cd4e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7172,7 +7172,6 @@ __metadata: "@types/sqlite3": "npm:^3.1.9" "@types/ws": "npm:^8.5.9" "@vercel/analytics": "npm:^1.1.1" - broken-link-checker: "npm:^0.7.8" classnames: "npm:^2.3.2" concurrently: "npm:^8.2.2" dotenv: "npm:^16.3.1" @@ -7180,6 +7179,7 @@ __metadata: eslint-config-next: "npm:13.2.4" github-slugger: "npm:^2.0.0" gray-matter: "npm:^4.0.3" + linkinator: "npm:^6.0.4" next: "npm:^14.0.4" next-mdx-remote: "npm:^4.4.1" next-themes: "npm:^0.2.1" @@ -9184,20 +9184,6 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^0.2.0, ansi-regex@npm:^0.2.1": - version: 0.2.1 - resolution: "ansi-regex@npm:0.2.1" - checksum: ce95ac031fc64b9bb5317396d01723e0e07e9fbf1aa481df55c645657a1dbcaf90b6a8e69da6e64ad4543f0bd75691e426b2258a34f3c12999a277c09efd9430 - languageName: node - linkType: hard - -"ansi-regex@npm:^2.0.0": - version: 2.1.1 - resolution: "ansi-regex@npm:2.1.1" - checksum: 190abd03e4ff86794f338a31795d262c1dfe8c91f7e01d04f13f646f1dcb16c5800818f886047876f1272f065570ab86b24b99089f8b68a0e11ff19aed4ca8f1 - languageName: node - linkType: hard - "ansi-regex@npm:^4.1.0": version: 4.1.1 resolution: "ansi-regex@npm:4.1.1" @@ -9219,20 +9205,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^1.1.0": - version: 1.1.0 - resolution: "ansi-styles@npm:1.1.0" - checksum: 4f01de400ef36d4328fc2421d378e5e3f80685e7b79e049fb14d5e75a37c546a7e625b4478e39b7ca6f41421d374e2b0eea52732ed3ed9bde93dc671e72eb79d - languageName: node - linkType: hard - -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: ebc0e00381f2a29000d1dac8466a640ce11943cef3bda3cd0020dc042e31e1058ab59bf6169cd794a54c3a7338a61ebc404b7c91e004092dd20e028c432c9c2c - languageName: node - linkType: hard - "ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -9910,28 +9882,6 @@ __metadata: languageName: node linkType: hard -"bhttp@npm:^1.2.1": - version: 1.2.8 - resolution: "bhttp@npm:1.2.8" - dependencies: - bluebird: "npm:^2.8.2" - concat-stream: "npm:^1.4.7" - debug: "npm:^2.1.1" - dev-null: "npm:^0.1.1" - errors: "npm:^0.2.0" - extend: "npm:^2.0.0" - form-data2: "npm:^1.0.0" - form-fix-array: "npm:^1.0.0" - lodash.clonedeep: "npm:^4.5.0" - lodash.merge: "npm:^4.6.2" - stream-length: "npm:^1.0.2" - through2-sink: "npm:^1.0.0" - through2-spy: "npm:^1.2.0" - tough-cookie: "npm:^2.3.1" - checksum: 1b2e69e791f7447d58b97237c9545108f89c722566f9429ad4f42cad6377779a8a503a4add27aa1eb4b3e78502a8e33472974ff98ab7f692554f0e24dd54006c - languageName: node - linkType: hard - "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" @@ -9973,13 +9923,6 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:^2.3.5, bluebird@npm:^2.6.2, bluebird@npm:^2.8.1, bluebird@npm:^2.8.2": - version: 2.11.0 - resolution: "bluebird@npm:2.11.0" - checksum: f8271257f248f3a95caa3b54a99c96c91132f6d62c2b2aa367bc63bab6e3b9a240ae6a95d893f70715ef52647af9d4e4afe0a04267c31c94cc5873d2add96a3b - languageName: node - linkType: hard - "body-parser@npm:1.20.1": version: 1.20.1 resolution: "body-parser@npm:1.20.1" @@ -10049,39 +9992,6 @@ __metadata: languageName: node linkType: hard -"broken-link-checker@npm:^0.7.8": - version: 0.7.8 - resolution: "broken-link-checker@npm:0.7.8" - dependencies: - bhttp: "npm:^1.2.1" - calmcard: "npm:~0.1.1" - chalk: "npm:^1.1.3" - char-spinner: "npm:^1.0.1" - condense-whitespace: "npm:^1.0.0" - default-user-agent: "npm:^1.0.0" - errno: "npm:~0.1.4" - extend: "npm:^3.0.0" - http-equiv-refresh: "npm:^1.0.0" - humanize-duration: "npm:^3.9.1" - is-stream: "npm:^1.0.1" - is-string: "npm:^1.0.4" - limited-request-queue: "npm:^2.0.0" - link-types: "npm:^1.1.0" - maybe-callback: "npm:^2.1.0" - nopter: "npm:~0.3.0" - parse5: "npm:^3.0.2" - robot-directives: "npm:~0.3.0" - robots-txt-guard: "npm:~0.1.0" - robots-txt-parse: "npm:~0.0.4" - urlcache: "npm:~0.7.0" - urlobj: "npm:0.0.11" - bin: - blc: bin/blc - broken-link-checker: bin/blc - checksum: 1421be72cabb636f38c44170306445f7157621b610a9625620c8ef8b888e51c5d5bd6da0f7d3fe84b5026b038d3167051c26d0f0ad62b421d9cc523cec4cac6f - languageName: node - linkType: hard - "browser-fs-access@npm:^0.33.0": version: 0.33.1 resolution: "browser-fs-access@npm:0.33.1" @@ -10288,22 +10198,6 @@ __metadata: languageName: node linkType: hard -"caller-path@npm:~0.1.0": - version: 0.1.0 - resolution: "caller-path@npm:0.1.0" - dependencies: - callsites: "npm:^0.2.0" - checksum: f4f2216897d2c150e30d06c6a9243115e500184433b42d597f0b8816fda8f6b7f782dba39fc37310dcc67c90e1112729709d3bb9e10983552e76632250b075f3 - languageName: node - linkType: hard - -"callsites@npm:^0.2.0": - version: 0.2.0 - resolution: "callsites@npm:0.2.0" - checksum: a6293327e566388e564fde9cefcb4c0a4b44033b9c6cf42effa9128017da45438027caff1cf758af3f8304b36e05902ba00fd75a286d7748eb57b7f83cdcce30 - languageName: node - linkType: hard - "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -10311,20 +10205,6 @@ __metadata: languageName: node linkType: hard -"calmcard@npm:~0.1.1": - version: 0.1.1 - resolution: "calmcard@npm:0.1.1" - checksum: cdf9b66649d4f4d158c53a7d6dce73821dd5e4fcbc23be32dcf0cb24c2a8e2b13154d6bf475a5226b775ab490072124fd4ba76199cdbc34117c26da5eb1d4354 - languageName: node - linkType: hard - -"camelcase@npm:^1.0.2": - version: 1.2.1 - resolution: "camelcase@npm:1.2.1" - checksum: 3da5ab4bb997f33e57023ddee39887e0d3f34ce5a2d41bcfe84454ee528c4fd769a4f9a428168bf9b24aca9338699885ffb63527acb02834c31b864d4b0d2299 - languageName: node - linkType: hard - "camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -10377,26 +10257,13 @@ __metadata: languageName: node linkType: hard -"chalk@npm:5.3.0": +"chalk@npm:5.3.0, chalk@npm:^5.0.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" checksum: 6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea languageName: node linkType: hard -"chalk@npm:^1.1.3": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: "npm:^2.2.1" - escape-string-regexp: "npm:^1.0.2" - has-ansi: "npm:^2.0.0" - strip-ansi: "npm:^3.0.0" - supports-color: "npm:^2.0.0" - checksum: abcf10da02afde04cc615f06c4bdb3ffc70d2bfbf37e0df03bb88b7459a9411dab4d01210745b773abc936031530a20355f1facc4bee1bbf08613d8fdcfb3aeb - languageName: node - linkType: hard - "chalk@npm:^2.3.2, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -10428,19 +10295,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:~0.5.1": - version: 0.5.1 - resolution: "chalk@npm:0.5.1" - dependencies: - ansi-styles: "npm:^1.1.0" - escape-string-regexp: "npm:^1.0.0" - has-ansi: "npm:^0.1.0" - strip-ansi: "npm:^0.3.0" - supports-color: "npm:^0.2.0" - checksum: 33eb9cf9220b13f1cae0a52e612d60f61fb1c894782b4efa847e40485a66e191d4199793b8087dc15b08e75607254a5980b45046f52350766c40d187505aacd9 - languageName: node - linkType: hard - "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -10448,13 +10302,6 @@ __metadata: languageName: node linkType: hard -"char-spinner@npm:^1.0.1": - version: 1.0.1 - resolution: "char-spinner@npm:1.0.1" - checksum: 3f655b24fa1c9bd59a4ce74b06841a6df25e358aebcf18fe57f52e06255b8b0b240c20f13fcbb005a14ae019d84cf4ff37cf903773a61084274ed51392cb0724 - languageName: node - linkType: hard - "character-entities-html4@npm:^2.0.0": version: 2.1.0 resolution: "character-entities-html4@npm:2.1.0" @@ -10647,15 +10494,6 @@ __metadata: languageName: node linkType: hard -"cli-table@npm:~0.3.1": - version: 0.3.11 - resolution: "cli-table@npm:0.3.11" - dependencies: - colors: "npm:1.0.3" - checksum: 1cf68fcc717cc7fa4a5fdac6722bcd756883201068a65a8a4550b800e9e6ae107c5b350821128d604cb3eb6a977619bc673e616ff402c3ddc179deb4d00626f7 - languageName: node - linkType: hard - "cli-truncate@npm:^4.0.0": version: 4.0.0 resolution: "cli-truncate@npm:4.0.0" @@ -10816,24 +10654,6 @@ __metadata: languageName: node linkType: hard -"colors@npm:1.0.3": - version: 1.0.3 - resolution: "colors@npm:1.0.3" - checksum: 8d81835f217ffca6de6665c8dd9ed132c562d108d4ba842d638c7cb5f8127cff47cb1b54c6bbea49e22eaa7b56caee6b85278dde9c2564f8a0eaef161e028ae0 - languageName: node - linkType: hard - -"combined-stream2@npm:^1.0.2": - version: 1.1.2 - resolution: "combined-stream2@npm:1.1.2" - dependencies: - bluebird: "npm:^2.8.1" - debug: "npm:^2.1.1" - stream-length: "npm:^1.0.1" - checksum: 9158fdedae9662bedfd6e5790d51a13ee44cd14f0c26c37c20eccc9219223b4d8382ed828a468eef75f42a6d680f6edf1eb535dd445b6b83ec5b9011f29a17b0 - languageName: node - linkType: hard - "combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -10932,18 +10752,6 @@ __metadata: languageName: node linkType: hard -"concat-stream@npm:^1.4.7": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.2.2" - typedarray: "npm:^0.0.6" - checksum: 71db903c84fc073ca35a274074e8d26c4330713d299f8623e993c448c1f6bf8b967806dd1d1a7b0f8add6f15ab1af7435df21fe79b4fe7efd78420c89e054e28 - languageName: node - linkType: hard - "concurrently@npm:^8.2.2": version: 8.2.2 resolution: "concurrently@npm:8.2.2" @@ -10964,13 +10772,6 @@ __metadata: languageName: node linkType: hard -"condense-whitespace@npm:^1.0.0": - version: 1.0.0 - resolution: "condense-whitespace@npm:1.0.0" - checksum: 1a3360d7c98d80dbcc4e3a97a56181c09383101e0da5b8ca22ca822436194216a28f79e47a08f233509045a4e4236fe135811d404ad08ab023fe4d72f9e6c8c1 - languageName: node - linkType: hard - "config@workspace:config": version: 0.0.0-use.local resolution: "config@workspace:config" @@ -11343,7 +11144,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.1.1": +"debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -11497,15 +11298,6 @@ __metadata: languageName: node linkType: hard -"default-user-agent@npm:^1.0.0": - version: 1.0.0 - resolution: "default-user-agent@npm:1.0.0" - dependencies: - os-name: "npm:~1.0.3" - checksum: b1ef07c8e7de846a66e1e120d7ba11969faa36c8db4af2317f9b64d30e7507d129e3f721c7cc3f531a1719c1ab463d830bf426fbcda87b11defe23689f4d2b60 - languageName: node - linkType: hard - "defaults@npm:^1.0.3": version: 1.0.4 resolution: "defaults@npm:1.0.4" @@ -11626,13 +11418,6 @@ __metadata: languageName: node linkType: hard -"dev-null@npm:^0.1.1": - version: 0.1.1 - resolution: "dev-null@npm:0.1.1" - checksum: 1a7eb60b22962ef7c3279c54eb183cc76125faaf9ebb3c8aa7be5d2c2b7c20ffba6646a7d4c50e069f28004e88647925dbaa9719b1f65e77569d731dd1b1d4c5 - languageName: node - linkType: hard - "devlop@npm:^1.0.0": version: 1.1.0 resolution: "devlop@npm:1.1.0" @@ -11803,7 +11588,7 @@ __metadata: languageName: node linkType: hard -"domutils@npm:^3.0.1": +"domutils@npm:^3.0.1, domutils@npm:^3.1.0": version: 3.1.0 resolution: "domutils@npm:3.1.0" dependencies: @@ -11877,13 +11662,6 @@ __metadata: languageName: node linkType: hard -"duplexer@npm:~0.1.1": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 - languageName: node - linkType: hard - "duplexify@npm:^3.5.0, duplexify@npm:^3.6.0": version: 3.7.1 resolution: "duplexify@npm:3.7.1" @@ -12069,7 +11847,7 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.2.0, entities@npm:^4.4.0": +"entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: ede2a35c9bce1aeccd055a1b445d41c75a14a2bb1cd22e242f20cf04d236cdcd7f9c859eb83f76885327bfae0c25bf03303665ee1ce3d47c5927b98b0e3e3d48 @@ -12101,13 +11879,6 @@ __metadata: languageName: node linkType: hard -"eol@npm:~0.2.0": - version: 0.2.0 - resolution: "eol@npm:0.2.0" - checksum: 2c80b1f58cfdfec0cf94a24e664e99360d67c1a818190813412b5c14bbcfb1277799ea0930884edf7a7434683def18b5d33d39e9ed0c4dfcf90281a974962caa - languageName: node - linkType: hard - "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -12115,17 +11886,6 @@ __metadata: languageName: node linkType: hard -"errno@npm:~0.1.4": - version: 0.1.8 - resolution: "errno@npm:0.1.8" - dependencies: - prr: "npm:~1.0.1" - bin: - errno: cli.js - checksum: 93076ed11bedb8f0389cbefcbdd3445f66443159439dccbaac89a053428ad92147676736235d275612dc0296d3f9a7e6b7177ed78a566b6cd15dacd4fa0d5888 - languageName: node - linkType: hard - "error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" @@ -12144,13 +11904,6 @@ __metadata: languageName: node linkType: hard -"errors@npm:^0.2.0": - version: 0.2.0 - resolution: "errors@npm:0.2.0" - checksum: bf4b2115095041ad342f5ca04bf13892396f3208eab3815a6c22376541f8deaa3d087262f7b620a47b7dd14464340ac03ff3ed91e6bc7c0cc84e0179d93d2c09 - languageName: node - linkType: hard - "es-abstract@npm:^1.22.1": version: 1.22.3 resolution: "es-abstract@npm:1.22.3" @@ -12920,7 +12673,7 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:~1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 @@ -12934,7 +12687,7 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.0, escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": +"escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 @@ -13621,14 +13374,7 @@ __metadata: languageName: node linkType: hard -"extend@npm:^2.0.0": - version: 2.0.2 - resolution: "extend@npm:2.0.2" - checksum: afbe5e4945a59b004681b504bd1673352a6488754b378d8011732abbbdb1a808f2190c15fc98e917a5649c0b35f0679aaeb672c417f53ae0400efb041079ba51 - languageName: node - linkType: hard - -"extend@npm:^3.0.0, extend@npm:~3.0.2": +"extend@npm:^3.0.0, extend@npm:^3.0.2, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: 59e89e2dc798ec0f54b36d82f32a27d5f6472c53974f61ca098db5d4648430b725387b53449a34df38fd0392045434426b012f302b3cc049a6500ccf82877e4e @@ -13961,19 +13707,6 @@ __metadata: languageName: node linkType: hard -"form-data2@npm:^1.0.0": - version: 1.0.4 - resolution: "form-data2@npm:1.0.4" - dependencies: - bluebird: "npm:^2.8.2" - combined-stream2: "npm:^1.0.2" - debug: "npm:^2.1.1" - mime: "npm:^1.3.4" - uuid: "npm:^2.0.1" - checksum: 91e296b796498af4a7aea007117ff9cfa528ebdc6ec8c8225c879772db4aa8ebf2239bf7dec28d9f9886d3c72dd6b24c4d08109e99905978b175a9e57526854d - languageName: node - linkType: hard - "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -13996,13 +13729,6 @@ __metadata: languageName: node linkType: hard -"form-fix-array@npm:^1.0.0": - version: 1.0.0 - resolution: "form-fix-array@npm:1.0.0" - checksum: da8b0e547f28c4b7c8c3cece1b9cb2bea55cdfcd0172b76530e78885591962f0a9bbfbe8b58c01186a0ede1789b06c09f5e0eefd20eda0538b3fd30a55989426 - languageName: node - linkType: hard - "format@npm:^0.2.0": version: 0.2.2 resolution: "format@npm:0.2.2" @@ -14254,6 +13980,18 @@ __metadata: languageName: node linkType: hard +"gaxios@npm:^6.0.0": + version: 6.3.0 + resolution: "gaxios@npm:6.3.0" + dependencies: + extend: "npm:^3.0.2" + https-proxy-agent: "npm:^7.0.1" + is-stream: "npm:^2.0.0" + node-fetch: "npm:^2.6.9" + checksum: 7b24f6480134e09967ddb5e743b5c549fbeaab8ca6d2b4d939080f9ad9472e963652f3c94d316c129aadff015d0ebb7144e93abc25b8ac54522ac86fdbaa27c4 + languageName: node + linkType: hard + "generic-names@npm:^4.0.0": version: 4.0.0 resolution: "generic-names@npm:4.0.0" @@ -14726,26 +14464,6 @@ __metadata: languageName: node linkType: hard -"has-ansi@npm:^0.1.0": - version: 0.1.0 - resolution: "has-ansi@npm:0.1.0" - dependencies: - ansi-regex: "npm:^0.2.0" - bin: - has-ansi: cli.js - checksum: 8eb68a066bb42460f7065432c14af40050c458eed3ac8329421990dbf5e2dd804a98b2e763013fdbb7f7049105f6c6806e7e90d7ac6caa337c3275574ce42d06 - languageName: node - linkType: hard - -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 1b51daa0214440db171ff359d0a2d17bc20061164c57e76234f614c91dbd2a79ddd68dfc8ee73629366f7be45a6df5f2ea9de83f52e1ca24433f2cc78c35d8ec - languageName: node - linkType: hard - "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" @@ -15112,6 +14830,18 @@ __metadata: languageName: node linkType: hard +"htmlparser2@npm:^9.0.0": + version: 9.1.0 + resolution: "htmlparser2@npm:9.1.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.1.0" + entities: "npm:^4.5.0" + checksum: 6352fa2a5495781fa9a02c9049908334cd068ff36d753870d30cd13b841e99c19646717567a2f9e9c44075bbe43d364e102f9d013a731ce962226d63746b794f + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -15119,13 +14849,6 @@ __metadata: languageName: node linkType: hard -"http-equiv-refresh@npm:^1.0.0": - version: 1.0.0 - resolution: "http-equiv-refresh@npm:1.0.0" - checksum: 4404bbb9eb163382cd4ecfff359bf1eb709e3dc266af725b27ae96d08eb079e86508cfd59cf04eca3fadc2351e0077b0edd7ced01d1f219c20da28997d350ab6 - languageName: node - linkType: hard - "http-errors@npm:2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" @@ -15226,13 +14949,6 @@ __metadata: languageName: node linkType: hard -"humanize-duration@npm:^3.9.1": - version: 3.31.0 - resolution: "humanize-duration@npm:3.31.0" - checksum: 6737c09c9eabd5f0ff91455b5325c41b5a037e8a4b6ad3068c7f27f5bc2d938aa743451d7cd42ee614d10b52518c69bb470caa9aa90ee36d30f16694984d5aad - languageName: node - linkType: hard - "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -15596,13 +15312,6 @@ __metadata: languageName: node linkType: hard -"is-browser@npm:^2.0.1": - version: 2.1.0 - resolution: "is-browser@npm:2.1.0" - checksum: fe8d9a68d028a8b16111b70ff662efc163b4708dc3a26024ff83a3416b6221321289de95b41abcb72cd41884e01a815d587e2086c98df5662137c6fe38bb3d73 - languageName: node - linkType: hard - "is-buffer@npm:^2.0.0": version: 2.0.5 resolution: "is-buffer@npm:2.0.5" @@ -15822,13 +15531,6 @@ __metadata: languageName: node linkType: hard -"is-object@npm:^1.0.1": - version: 1.0.2 - resolution: "is-object@npm:1.0.2" - checksum: db53971751c50277f0ed31d065d93038d23cb9785090ab5c8070a903cf5bab16cdb18f05b8855599ad87ec19eb4c85afa05980bcda77dd4a8482120b6348c73c - languageName: node - linkType: hard - "is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" @@ -15906,13 +15608,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^1.0.1": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 351aa77c543323c4e111204482808cfad68d2e940515949e31ccd0b010fc13d5fba4b9c230e4887fd24284713040f43e542332fbf172f6b9944b7d62e389c0ec - languageName: node - linkType: hard - "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -15927,7 +15622,7 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.4, is-string@npm:^1.0.5, is-string@npm:^1.0.7": +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" dependencies: @@ -16024,13 +15719,6 @@ __metadata: languageName: node linkType: hard -"isbot@npm:^2.0.0": - version: 2.5.7 - resolution: "isbot@npm:2.5.7" - checksum: c1ac411aa03056f4077a9d60bf321c0784a0aa0a4cdd3760746f27df89944dc6923f6aa20bc7cd4b8482bfca153e8c58349abb02839fb16eb5e220ce230e20bd - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -17223,16 +16911,6 @@ __metadata: languageName: node linkType: hard -"limited-request-queue@npm:^2.0.0": - version: 2.0.0 - resolution: "limited-request-queue@npm:2.0.0" - dependencies: - is-browser: "npm:^2.0.1" - parse-domain: "npm:~0.2.0" - checksum: eb44a35beb884d89ef21c58a273c9eddacd1579d8c319593964d215e43eb06541e3cd02767095d6ebdd53ece7a2f8d3c317d3f6fbac622a9860ce8ea49ec64b5 - languageName: node - linkType: hard - "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -17240,13 +16918,6 @@ __metadata: languageName: node linkType: hard -"link-types@npm:^1.1.0": - version: 1.1.0 - resolution: "link-types@npm:1.1.0" - checksum: 76f9fa1d25e6804af6a51ccd86d4a2665e862672bc342948102d93329226395d0f5bd8bd1385d7aa09b041d5e0237554053d980a2d8c15bba86fc1cebf0d3d47 - languageName: node - linkType: hard - "linkify-it@npm:^3.0.1": version: 3.0.3 resolution: "linkify-it@npm:3.0.3" @@ -17256,6 +16927,26 @@ __metadata: languageName: node linkType: hard +"linkinator@npm:^6.0.4": + version: 6.0.4 + resolution: "linkinator@npm:6.0.4" + dependencies: + chalk: "npm:^5.0.0" + escape-html: "npm:^1.0.3" + gaxios: "npm:^6.0.0" + glob: "npm:^10.3.10" + htmlparser2: "npm:^9.0.0" + marked: "npm:^10.0.0" + meow: "npm:^13.0.0" + mime: "npm:^4.0.0" + server-destroy: "npm:^1.0.1" + srcset: "npm:^5.0.0" + bin: + linkinator: build/src/cli.js + checksum: 4f14ac316c83681f2d8463a883cda95543f22f2e08caef50e70a86f91eab283f6e527735520b8793aa68b2de14aa8b84e9fb259ce2c46c84b5f3b6a49fec7782 + languageName: node + linkType: hard + "lint-staged@npm:>=10": version: 15.2.0 resolution: "lint-staged@npm:15.2.0" @@ -17388,13 +17079,6 @@ __metadata: languageName: node linkType: hard -"lodash.clonedeep@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.clonedeep@npm:4.5.0" - checksum: 957ed243f84ba6791d4992d5c222ffffca339a3b79dbe81d2eaf0c90504160b500641c5a0f56e27630030b18b8e971ea10b44f928a977d5ced3c8948841b555f - languageName: node - linkType: hard - "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -17559,16 +17243,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:4.1.x": - version: 4.1.5 - resolution: "lru-cache@npm:4.1.5" - dependencies: - pseudomap: "npm:^1.0.2" - yallist: "npm:^2.1.2" - checksum: 9ec7d73f11a32cba0e80b7a58fdf29970814c0c795acaee1a6451ddfd609bae6ef9df0837f5bbeabb571ecd49c1e2d79e10e9b4ed422cfba17a0cb6145b018a9 - languageName: node - linkType: hard - "lru-cache@npm:^10.0.0, lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.1.0 resolution: "lru-cache@npm:10.1.0" @@ -17718,10 +17392,12 @@ __metadata: languageName: node linkType: hard -"maybe-callback@npm:^2.1.0": - version: 2.1.0 - resolution: "maybe-callback@npm:2.1.0" - checksum: efc9a24538cf151d05d6d72626161d288a0ecc3dbadbe41a873cf9e863b7cd9c3f8dfdf6c8112536860ec0a4e52cd02dcc04f04ac8cb91ab04b44efd953a86c2 +"marked@npm:^10.0.0": + version: 10.0.0 + resolution: "marked@npm:10.0.0" + bin: + marked: bin/marked.js + checksum: f7442f6bd6a678e48eb3ca2f4b15e6d80ce63fa8363d319733ad7d968cfea410eacd01e764dc76c59d7ff77d409007bf5628d215ec84ef4ffa65f44ae08f0255 languageName: node linkType: hard @@ -18062,6 +17738,13 @@ __metadata: languageName: node linkType: hard +"meow@npm:^13.0.0": + version: 13.2.0 + resolution: "meow@npm:13.2.0" + checksum: 4eff5bc921fed0b8a471ad79069d741a0210036d717547d0c7f36fdaf84ef7a3036225f38b6a53830d84dc9cbf8b944b097fde62381b8b5b215119e735ce1063 + languageName: node + linkType: hard + "merge-descriptors@npm:1.0.1": version: 1.0.1 resolution: "merge-descriptors@npm:1.0.1" @@ -18738,6 +18421,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:^4.0.0": + version: 4.0.1 + resolution: "mime@npm:4.0.1" + bin: + mime: bin/cli.js + checksum: 4598030457488c240a4ba30561a619cfb627f96271ecced5d715eb5c44d33105e3f28d28fe46d72eeadb78d7de5aeb1f8e62d448c14b0e518a7ace76d2af5f2d + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -18840,7 +18532,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f @@ -19321,7 +19013,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.0.0, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.0.0, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -19407,17 +19099,6 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^3.0.1": - version: 3.0.6 - resolution: "nopt@npm:3.0.6" - dependencies: - abbrev: "npm:1" - bin: - nopt: ./bin/nopt.js - checksum: 2f582a44f7a4e495f21b6668008eda47f6e9c50c27efc00494aa67360791c9240da537661371786afc5d5712f353d3debb863a7201b536fe35fb393ceadc8a23 - languageName: node - linkType: hard - "nopt@npm:^5.0.0": version: 5.0.0 resolution: "nopt@npm:5.0.0" @@ -19440,22 +19121,6 @@ __metadata: languageName: node linkType: hard -"nopter@npm:~0.3.0": - version: 0.3.0 - resolution: "nopter@npm:0.3.0" - dependencies: - caller-path: "npm:~0.1.0" - camelcase: "npm:^1.0.2" - chalk: "npm:~0.5.1" - cli-table: "npm:~0.3.1" - eol: "npm:~0.2.0" - nopt: "npm:^3.0.1" - object-assign: "npm:^2.0.0" - splitargs: "npm:~0.0.3" - checksum: 8570c97f88fcd42a952effd9fcac8f2f5f38b6ea897dbd31af884cd1531ed8900821eb0dd4fa5289f9c5b222f029336c97965278ab511f562f272a60ac69f7f3 - languageName: node - linkType: hard - "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" @@ -19542,13 +19207,6 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^2.0.0": - version: 2.1.1 - resolution: "object-assign@npm:2.1.1" - checksum: d37a7d7173408e07ee225116437592d92b584b2a5f38cafe608400b43efd9b78878dbd545b524aff5b4118d88e39466b9038b2d3de8885e212adad497d656c46 - languageName: node - linkType: hard - "object-assign@npm:^4, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -19799,18 +19457,6 @@ __metadata: languageName: node linkType: hard -"os-name@npm:~1.0.3": - version: 1.0.3 - resolution: "os-name@npm:1.0.3" - dependencies: - osx-release: "npm:^1.0.0" - win-release: "npm:^1.0.0" - bin: - os-name: cli.js - checksum: 2fc86cc199f8b4992bb00041401c5ab0407e3069e05981f3aa3e5a44cee9b7f22c2b0f5db2c0c1d55656c519884272b5e1e55517358c2e5f728b37dd38f5af78 - languageName: node - linkType: hard - "os-tmpdir@npm:~1.0.2": version: 1.0.2 resolution: "os-tmpdir@npm:1.0.2" @@ -19818,17 +19464,6 @@ __metadata: languageName: node linkType: hard -"osx-release@npm:^1.0.0": - version: 1.1.0 - resolution: "osx-release@npm:1.1.0" - dependencies: - minimist: "npm:^1.1.0" - bin: - osx-release: cli.js - checksum: 48f442f836e514d08ce73ef786db8d7cf0958e8c64a04548767ddf1081454e323fa3b7b83dcf084ecf70fe304f484e6dab0fe33e80459ac0cf7d15c1bbbe9243 - languageName: node - linkType: hard - "outdent@npm:^0.8.0": version: 0.8.0 resolution: "outdent@npm:0.8.0" @@ -19996,13 +19631,6 @@ __metadata: languageName: node linkType: hard -"parse-domain@npm:~0.2.0": - version: 0.2.2 - resolution: "parse-domain@npm:0.2.2" - checksum: e93a36fbb8bab4c3f29c3fd94b2596be66882cc01f9e1771fc49ae351a03b118f49f5dfb1cc0dd8811fd52f9d47b1b0e6c0d02ea82978185f84847d1b4604455 - languageName: node - linkType: hard - "parse-entities@npm:^4.0.0": version: 4.0.1 resolution: "parse-entities@npm:4.0.1" @@ -20742,20 +20370,6 @@ __metadata: languageName: node linkType: hard -"prr@npm:~1.0.1": - version: 1.0.1 - resolution: "prr@npm:1.0.1" - checksum: 3bca2db0479fd38f8c4c9439139b0c42dcaadcc2fbb7bb8e0e6afaa1383457f1d19aea9e5f961d5b080f1cfc05bfa1fe9e45c97a1d3fd6d421950a73d3108381 - languageName: node - linkType: hard - -"pseudomap@npm:^1.0.2": - version: 1.0.2 - resolution: "pseudomap@npm:1.0.2" - checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 - languageName: node - linkType: hard - "psl@npm:^1.1.28, psl@npm:^1.1.33": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -21174,7 +20788,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.0, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.0, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -21200,18 +20814,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:~1.0.17": - version: 1.0.34 - resolution: "readable-stream@npm:1.0.34" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.1" - isarray: "npm:0.0.1" - string_decoder: "npm:~0.10.x" - checksum: 20537fca5a8ffd4af0f483be1cce0e981ed8cbb1087e0c762e2e92ae77f1005627272cebed8422f28047b465056aa1961fefd24baf532ca6a3616afea6811ae0 - languageName: node - linkType: hard - "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -21590,7 +21192,7 @@ __metadata: languageName: node linkType: hard -"request@npm:^2.83.0, request@npm:^2.88.0": +"request@npm:^2.83.0": version: 2.88.2 resolution: "request@npm:2.88.2" dependencies: @@ -21888,35 +21490,6 @@ __metadata: languageName: node linkType: hard -"robot-directives@npm:~0.3.0": - version: 0.3.0 - resolution: "robot-directives@npm:0.3.0" - dependencies: - isbot: "npm:^2.0.0" - useragent: "npm:^2.1.8" - checksum: 990d876309e3ad7202f9cf8977e2405a67f4e335632d5c635e27903daf1931fd4326ce2675a8d2922c8603706356fd3ba5a9d89a12b4e33aa2a4514a3453917c - languageName: node - linkType: hard - -"robots-txt-guard@npm:~0.1.0": - version: 0.1.1 - resolution: "robots-txt-guard@npm:0.1.1" - checksum: 52e4fcac65c16efb94e70771cb3cc85a09d378e90aac375493251e97c769f5680004d44e9a99deb28d768be91769b3bdbbb5c94eeefbef57d89bf70a47ccb920 - languageName: node - linkType: hard - -"robots-txt-parse@npm:~0.0.4": - version: 0.0.4 - resolution: "robots-txt-parse@npm:0.0.4" - dependencies: - bluebird: "npm:^2.3.5" - split: "npm:^0.3.0" - stream-combiner: "npm:^0.2.1" - through: "npm:^2.3.4" - checksum: 0b114b31cd2fe302f94727f090caf969e95ffd195f1b1860bc0b0d3d2423a455aa0e69d7d852859c5f182e0c807fc0a4958af143a9428d7d444cf96a6184f871 - languageName: node - linkType: hard - "rollup-plugin-inject@npm:^3.0.0": version: 3.0.2 resolution: "rollup-plugin-inject@npm:3.0.2" @@ -22148,15 +21721,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:5.5.x": - version: 5.5.1 - resolution: "semver@npm:5.5.1" - bin: - semver: ./bin/semver - checksum: 26cb6bfe46b06a46ad950cd10a8cf00a09063a058dac8ba4ef3e55576b73679ca81ee5167b9d7ef5f5404f0b9e303e912908a426b684a07e4c26e29c5d7f4385 - languageName: node - linkType: hard - "semver@npm:6.1.1": version: 6.1.1 resolution: "semver@npm:6.1.1" @@ -22177,7 +21741,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^5.0.1, semver@npm:^5.1.0": +"semver@npm:^5.1.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -22257,6 +21821,13 @@ __metadata: languageName: node linkType: hard +"server-destroy@npm:^1.0.1": + version: 1.0.1 + resolution: "server-destroy@npm:1.0.1" + checksum: cbc19d4f92d25a0a34430c6a09faccbea77d1a69563560eefe883feb67c14c3fb3a1c5af1affae0e82d537886ea0f91d317e39e46b5d6425de3acf57a3ab13e3 + languageName: node + linkType: hard + "server-only@npm:^0.0.1": version: 0.0.1 resolution: "server-only@npm:0.0.1" @@ -22593,22 +22164,6 @@ __metadata: languageName: node linkType: hard -"split@npm:^0.3.0": - version: 0.3.3 - resolution: "split@npm:0.3.3" - dependencies: - through: "npm:2" - checksum: 41b397e9fedc984ee1b061780bf173ef72a4f99265ca9cbccd9765b8cc0729eeee6cdeaf70664eb3eb0823e8430db033e50a33050498d75569fc743c6964c84e - languageName: node - linkType: hard - -"splitargs@npm:~0.0.3": - version: 0.0.7 - resolution: "splitargs@npm:0.0.7" - checksum: b226eadb7a96a9761ccc5b3e675780b04c998c5aeeb5c640288aa063612fe5f9ea60bea57d518f009f819059b8683f3c6f13aa9689cf5cf72c11482f42f32ad9 - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -22644,6 +22199,13 @@ __metadata: languageName: node linkType: hard +"srcset@npm:^5.0.0": + version: 5.0.1 + resolution: "srcset@npm:5.0.1" + checksum: 858bd5b042106999cca9b70fa2ee5255113ec47b8e77f54d9d11128eafc88f3b8452543962d4d4a474d3a75477ccf80ce29feed81411b83198730bdba556174d + languageName: node + linkType: hard + "sshpk@npm:^1.7.0": version: 1.18.0 resolution: "sshpk@npm:1.18.0" @@ -22791,25 +22353,6 @@ __metadata: languageName: node linkType: hard -"stream-combiner@npm:^0.2.1": - version: 0.2.2 - resolution: "stream-combiner@npm:0.2.2" - dependencies: - duplexer: "npm:~0.1.1" - through: "npm:~2.3.4" - checksum: 5d3f4f6dd3604b3c5acf16150eabbbd131247378b54719c39cac5b5793150a92842306f662b58df65f2bd2e64bf8081f21449489591fed440c2b280021474e7d - languageName: node - linkType: hard - -"stream-length@npm:^1.0.1, stream-length@npm:^1.0.2": - version: 1.0.2 - resolution: "stream-length@npm:1.0.2" - dependencies: - bluebird: "npm:^2.6.2" - checksum: 676c8c4eb86c9a3398096bc9c809cd9a61bb6a10f6d731ded1d350a93c49d2496d9a9b0185308b84accc4d97d4e37cecd0b9bc3b3928fa66310821eec1e2fb65 - languageName: node - linkType: hard - "stream-shift@npm:^1.0.0": version: 1.0.2 resolution: "stream-shift@npm:1.0.2" @@ -22993,26 +22536,6 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^0.3.0": - version: 0.3.0 - resolution: "strip-ansi@npm:0.3.0" - dependencies: - ansi-regex: "npm:^0.2.1" - bin: - strip-ansi: cli.js - checksum: b1d249281ac59c09d7e55d82ae58106835028d8b2b80c7ee1322352d089d63ba68d1e77c486a4607949f17d9c339f3cf3c65f17a931f8ccb04c646a2eac12815 - languageName: node - linkType: hard - -"strip-ansi@npm:^3.0.0": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465 - languageName: node - linkType: hard - "strip-ansi@npm:^5.0.0, strip-ansi@npm:^5.1.0, strip-ansi@npm:^5.2.0": version: 5.2.0 resolution: "strip-ansi@npm:5.2.0" @@ -23137,22 +22660,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^0.2.0": - version: 0.2.0 - resolution: "supports-color@npm:0.2.0" - bin: - supports-color: cli.js - checksum: 32c02a48cd317baf16dfe59919cf8df77ed1a5a2b1804ea38fe5e665f891e9f3f3e0fcab2c6834807e1f8e57986182426e4349f9428d4e67113a1aa1e0110520 - languageName: node - linkType: hard - -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: d2957d19e782a806abc3e8616b6648cc1e70c3ebe94fb1c2d43160686f6d79cd7c9f22c4853bc4a362d89d1c249ab6d429788c5f6c83b3086e6d763024bf4581 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -23344,26 +22851,6 @@ __metadata: languageName: node linkType: hard -"through2-sink@npm:^1.0.0": - version: 1.0.0 - resolution: "through2-sink@npm:1.0.0" - dependencies: - through2: "npm:~0.5.1" - xtend: "npm:~3.0.0" - checksum: d6467d8e3cae65caf236b1fbef3533f5ccb99cb656ee2cb846cdf66f2478c3908afb17154c1b894ce3efd66994b332aa9be66547b88b4730feb40b9ab9580200 - languageName: node - linkType: hard - -"through2-spy@npm:^1.2.0": - version: 1.2.0 - resolution: "through2-spy@npm:1.2.0" - dependencies: - through2: "npm:~0.5.1" - xtend: "npm:~3.0.0" - checksum: addb6fb2622489f8310037af4353a2fa0032f8559a4b3321e4a1961b120264d4f17cbebd730ddcd1cc723999523803a8b0020f0b63dfba984519aad3dba01619 - languageName: node - linkType: hard - "through2@npm:^2.0.3": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -23374,17 +22861,7 @@ __metadata: languageName: node linkType: hard -"through2@npm:~0.5.1": - version: 0.5.1 - resolution: "through2@npm:0.5.1" - dependencies: - readable-stream: "npm:~1.0.17" - xtend: "npm:~3.0.0" - checksum: 59af8f3c1e22b9aa63cf4c781836f70a25abcad024c63dfda9b0f914223647bbef4faf4fd634f28ea01202442b629454f246d0dcefb3563ecb6e46fc1477751d - languageName: node - linkType: hard - -"through@npm:2, through@npm:^2.3.4, through@npm:^2.3.6, through@npm:~2.3.4": +"through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: 5da78346f70139a7d213b65a0106f3c398d6bc5301f9248b5275f420abc2c4b1e77c2abc72d218dedc28c41efb2e7c312cb76a7730d04f9c2d37d247da3f4198 @@ -23473,7 +22950,7 @@ __metadata: languageName: unknown linkType: soft -"tmp@npm:0.0.x, tmp@npm:^0.0.33": +"tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" dependencies: @@ -23543,7 +23020,7 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^2.3.1, tough-cookie@npm:^2.3.3, tough-cookie@npm:~2.5.0": +"tough-cookie@npm:^2.3.3, tough-cookie@npm:~2.5.0": version: 2.5.0 resolution: "tough-cookie@npm:2.5.0" dependencies: @@ -24045,13 +23522,6 @@ __metadata: languageName: node linkType: hard -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 2cc1bcf7d8c1237f6a16c04efc06637b2c5f2d74e58e84665445cf87668b85a21ab18dd751fa49eee6ae024b70326635d7b79ad37b1c370ed2fec6aeeeb52714 - languageName: node - linkType: hard - "typescript-memoize@npm:^1.0.0-alpha.3": version: 1.1.1 resolution: "typescript-memoize@npm:1.1.1" @@ -24503,26 +23973,6 @@ __metadata: languageName: node linkType: hard -"urlcache@npm:~0.7.0": - version: 0.7.0 - resolution: "urlcache@npm:0.7.0" - dependencies: - urlobj: "npm:0.0.11" - checksum: c190d9b756f5714d4534f41e620eb3d6cbbb688b5af28ca722b25345a606223c01fc09ca79dc5a720002c528c68f6c49a488f4a48e09a12c306d9f00ac7c61c4 - languageName: node - linkType: hard - -"urlobj@npm:0.0.11": - version: 0.0.11 - resolution: "urlobj@npm:0.0.11" - dependencies: - is-object: "npm:^1.0.1" - is-string: "npm:^1.0.4" - object-assign: "npm:^4.1.1" - checksum: 0dc44dc41cb8e09b211ed5d640b27cfb0d2421e18dec5ee38508e4bca92d0cdb3f3e5f6c63de515e1187678192677cfadad15e358cf75455eb167f9ad56ef62b - languageName: node - linkType: hard - "use-callback-ref@npm:^1.3.0": version: 1.3.1 resolution: "use-callback-ref@npm:1.3.1" @@ -24572,16 +24022,6 @@ __metadata: languageName: node linkType: hard -"useragent@npm:^2.1.8": - version: 2.3.0 - resolution: "useragent@npm:2.3.0" - dependencies: - lru-cache: "npm:4.1.x" - tmp: "npm:0.0.x" - checksum: ae5a3e9d683647202478a03a7959f07cbd4da358b9030d2730f7c580d3724ba921b044bc8bffcd75f99c8c377ec00040835f65a17a33fa3b73b921699beb359e - languageName: node - linkType: hard - "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -24628,13 +24068,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^2.0.1": - version: 2.0.3 - resolution: "uuid@npm:2.0.3" - checksum: 558fc6932068161449b6cde05bda6b69cd3dd9b5e61b007e643af357b31256570547626ae06ef933ce2491e81afe8f6084847f670fd68f44b123b2a7d0b09245 - languageName: node - linkType: hard - "uuid@npm:^3.3.2": version: 3.4.0 resolution: "uuid@npm:3.4.0" @@ -25312,15 +24745,6 @@ __metadata: languageName: node linkType: hard -"win-release@npm:^1.0.0": - version: 1.1.1 - resolution: "win-release@npm:1.1.1" - dependencies: - semver: "npm:^5.0.1" - checksum: 8943898cc4badaf8598342d63093e49ae9a64c140cf190e81472d3a8890f3387b8408181412e1b58658fe7777ce5d1e3f02eee4beeaee49909d1d17a72d52fc1 - languageName: node - linkType: hard - "word-wrap@npm:~1.2.3": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" @@ -25587,13 +25011,6 @@ __metadata: languageName: node linkType: hard -"xtend@npm:~3.0.0": - version: 3.0.0 - resolution: "xtend@npm:3.0.0" - checksum: ecdc4dd74f26e561dbc13d4148fcc7b8f46f49b9259862fc31e42b7cede9eee62af9d869050a7b8e089475e858744a74ceae3f0da2943755ef712f3277ad2e50 - languageName: node - linkType: hard - "xxhash-wasm@npm:^1.0.1": version: 1.0.2 resolution: "xxhash-wasm@npm:1.0.2" @@ -25615,13 +25032,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^2.1.2": - version: 2.1.2 - resolution: "yallist@npm:2.1.2" - checksum: 75fc7bee4821f52d1c6e6021b91b3e079276f1a9ce0ad58da3c76b79a7e47d6f276d35e206a96ac16c1cf48daee38a8bb3af0b1522a3d11c8ffe18f898828832 - languageName: node - linkType: hard - "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" @@ -25650,13 +25060,6 @@ __metadata: languageName: node linkType: hard -"yamlparser@npm:0.0.x": - version: 0.0.2 - resolution: "yamlparser@npm:0.0.2" - checksum: 3424364fcec3c93b4c77390f68464721d953274d44cb007066634787e77a4e3aefd359d05a8ca146278474c2dad919119582026b4e0d7ea190408eee7ddbb9e2 - languageName: node - linkType: hard - "yargs-parser@npm:20.2.4": version: 20.2.4 resolution: "yargs-parser@npm:20.2.4"