polen 0.10.0-next.11 → 0.10.0-next.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/builder/builder.js +1 -1
- package/build/api/builder/builder.js.map +1 -1
- package/build/api/config/load.js +1 -1
- package/build/api/config/load.js.map +1 -1
- package/build/api/vite/plugins/build.js +1 -1
- package/build/api/vite/plugins/build.js.map +1 -1
- package/build/api/vite/plugins/core.d.ts.map +1 -1
- package/build/api/vite/plugins/core.js +0 -2
- package/build/api/vite/plugins/core.js.map +1 -1
- package/build/api/vite/plugins/pages.js +1 -1
- package/build/api/vite/plugins/pages.js.map +1 -1
- package/build/exports/components.d.ts +4 -1
- package/build/exports/components.d.ts.map +1 -1
- package/build/exports/components.js +4 -1
- package/build/exports/components.js.map +1 -1
- package/build/lib/demos/config-schema.d.ts +6 -6
- package/build/lib/github-actions/runner.js +2 -2
- package/build/lib/github-actions/runner.js.map +1 -1
- package/build/lib/graphql-document/$$.d.ts +5 -0
- package/build/lib/graphql-document/$$.d.ts.map +1 -0
- package/build/lib/graphql-document/$$.js +5 -0
- package/build/lib/graphql-document/$$.js.map +1 -0
- package/build/lib/graphql-document/$.d.ts +2 -0
- package/build/lib/graphql-document/$.d.ts.map +1 -0
- package/build/lib/graphql-document/$.js +2 -0
- package/build/lib/graphql-document/$.js.map +1 -0
- package/build/lib/graphql-document/analysis.d.ts +44 -0
- package/build/lib/graphql-document/analysis.d.ts.map +1 -0
- package/build/lib/graphql-document/analysis.js +361 -0
- package/build/lib/graphql-document/analysis.js.map +1 -0
- package/build/lib/graphql-document/components/GraphQLDocument.d.ts +42 -0
- package/build/lib/graphql-document/components/GraphQLDocument.d.ts.map +1 -0
- package/build/lib/graphql-document/components/GraphQLDocument.js +173 -0
- package/build/lib/graphql-document/components/GraphQLDocument.js.map +1 -0
- package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts +7 -0
- package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts.map +1 -0
- package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js +45 -0
- package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js.map +1 -0
- package/build/lib/graphql-document/components/HoverTooltip.d.ts +35 -0
- package/build/lib/graphql-document/components/HoverTooltip.d.ts.map +1 -0
- package/build/lib/graphql-document/components/HoverTooltip.js +132 -0
- package/build/lib/graphql-document/components/HoverTooltip.js.map +1 -0
- package/build/lib/graphql-document/components/IdentifierLink.d.ts +37 -0
- package/build/lib/graphql-document/components/IdentifierLink.d.ts.map +1 -0
- package/build/lib/graphql-document/components/IdentifierLink.js +141 -0
- package/build/lib/graphql-document/components/IdentifierLink.js.map +1 -0
- package/build/lib/graphql-document/components/index.d.ts +5 -0
- package/build/lib/graphql-document/components/index.d.ts.map +1 -0
- package/build/lib/graphql-document/components/index.js +5 -0
- package/build/lib/graphql-document/components/index.js.map +1 -0
- package/build/lib/graphql-document/example.d.ts +25 -0
- package/build/lib/graphql-document/example.d.ts.map +1 -0
- package/build/lib/graphql-document/example.js +140 -0
- package/build/lib/graphql-document/example.js.map +1 -0
- package/build/lib/graphql-document/graphql-document.d.ts +35 -0
- package/build/lib/graphql-document/graphql-document.d.ts.map +1 -0
- package/build/lib/graphql-document/graphql-document.js +36 -0
- package/build/lib/graphql-document/graphql-document.js.map +1 -0
- package/build/lib/graphql-document/positioning-simple.d.ts +68 -0
- package/build/lib/graphql-document/positioning-simple.d.ts.map +1 -0
- package/build/lib/graphql-document/positioning-simple.js +197 -0
- package/build/lib/graphql-document/positioning-simple.js.map +1 -0
- package/build/lib/graphql-document/schema-context.d.ts +8 -0
- package/build/lib/graphql-document/schema-context.d.ts.map +1 -0
- package/build/lib/graphql-document/schema-context.js +11 -0
- package/build/lib/graphql-document/schema-context.js.map +1 -0
- package/build/lib/graphql-document/schema-integration-example.d.ts +27 -0
- package/build/lib/graphql-document/schema-integration-example.d.ts.map +1 -0
- package/build/lib/graphql-document/schema-integration-example.js +297 -0
- package/build/lib/graphql-document/schema-integration-example.js.map +1 -0
- package/build/lib/graphql-document/schema-integration.d.ts +135 -0
- package/build/lib/graphql-document/schema-integration.d.ts.map +1 -0
- package/build/lib/graphql-document/schema-integration.js +328 -0
- package/build/lib/graphql-document/schema-integration.js.map +1 -0
- package/build/lib/graphql-document/types.d.ts +117 -0
- package/build/lib/graphql-document/types.d.ts.map +1 -0
- package/build/lib/graphql-document/types.js +2 -0
- package/build/lib/graphql-document/types.js.map +1 -0
- package/build/template/components/ArgumentAnnotation.js +10 -0
- package/build/template/components/ArgumentAnnotation.js.map +1 -0
- package/build/template/components/ArgumentList.js +9 -0
- package/build/template/components/ArgumentList.js.map +1 -0
- package/build/template/components/ArgumentListAnnotation.js +15 -0
- package/build/template/components/ArgumentListAnnotation.js.map +1 -0
- package/build/template/components/Changelog.js +44 -0
- package/build/template/components/Changelog.js.map +1 -0
- package/build/template/components/{CodeBlock.jsx → CodeBlock.js} +4 -5
- package/build/template/components/{CodeBlock.jsx.map → CodeBlock.js.map} +1 -1
- package/build/template/components/{CodeBlockEnhancer.jsx → CodeBlockEnhancer.js} +4 -4
- package/build/template/components/CodeBlockEnhancer.js.map +1 -0
- package/build/template/components/DeprecationReason.js +9 -0
- package/build/template/components/DeprecationReason.js.map +1 -0
- package/build/template/components/Description.js +9 -0
- package/build/template/components/Description.js.map +1 -0
- package/build/template/components/Field.js +14 -0
- package/build/template/components/Field.js.map +1 -0
- package/build/template/components/{FieldList.jsx → FieldList.js} +4 -5
- package/build/template/components/FieldList.js.map +1 -0
- package/build/template/components/{FieldListSection.jsx → FieldListSection.js} +4 -6
- package/build/template/components/FieldListSection.js.map +1 -0
- package/build/template/components/HamburgerMenu.js +30 -0
- package/build/template/components/HamburgerMenu.js.map +1 -0
- package/build/template/components/Link.d.ts +1 -1
- package/build/template/components/{Link.jsx → Link.js} +4 -5
- package/build/template/components/Link.js.map +1 -0
- package/build/template/components/Logo.js +20 -0
- package/build/template/components/Logo.js.map +1 -0
- package/build/template/components/MDXComponents.d.ts +11 -0
- package/build/template/components/MDXComponents.d.ts.map +1 -0
- package/build/template/components/MDXComponents.js +70 -0
- package/build/template/components/MDXComponents.js.map +1 -0
- package/build/template/components/{Markdown.jsx → Markdown.js} +3 -2
- package/build/template/components/Markdown.js.map +1 -0
- package/build/template/components/MissingSchema.d.ts +1 -1
- package/build/template/components/MissingSchema.d.ts.map +1 -1
- package/build/template/components/MissingSchema.js +5 -0
- package/build/template/components/MissingSchema.js.map +1 -0
- package/build/template/components/NamedType.js +12 -0
- package/build/template/components/NamedType.js.map +1 -0
- package/build/template/components/NotFound.js +7 -0
- package/build/template/components/NotFound.js.map +1 -0
- package/build/template/components/{RadixLink.jsx → RadixLink.js} +1 -1
- package/build/template/components/RadixLink.js.map +1 -0
- package/build/template/components/TestComponent.d.ts +5 -0
- package/build/template/components/TestComponent.d.ts.map +1 -0
- package/build/template/components/TestComponent.js +7 -0
- package/build/template/components/TestComponent.js.map +1 -0
- package/build/template/components/Texts/{MinorHeading.jsx → MinorHeading.js} +4 -3
- package/build/template/components/Texts/MinorHeading.js.map +1 -0
- package/build/template/components/Texts/texts.js +1 -1
- package/build/template/components/Texts/texts.js.map +1 -1
- package/build/template/components/ThemeToggle.js +9 -0
- package/build/template/components/ThemeToggle.js.map +1 -0
- package/build/template/components/{TypeAnnotation.jsx → TypeAnnotation.js} +8 -18
- package/build/template/components/TypeAnnotation.js.map +1 -0
- package/build/template/components/TypeFieldsLinkList.js +9 -0
- package/build/template/components/TypeFieldsLinkList.js.map +1 -0
- package/build/template/components/TypeIndex.js +17 -0
- package/build/template/components/TypeIndex.js.map +1 -0
- package/build/template/components/content/$$.d.ts +1 -0
- package/build/template/components/content/$$.d.ts.map +1 -1
- package/build/template/components/content/$$.js +1 -0
- package/build/template/components/content/$$.js.map +1 -1
- package/build/template/components/content/GraphQLDocumentWithSchema.d.ts +8 -0
- package/build/template/components/content/GraphQLDocumentWithSchema.d.ts.map +1 -0
- package/build/template/components/content/GraphQLDocumentWithSchema.js +16 -0
- package/build/template/components/content/GraphQLDocumentWithSchema.js.map +1 -0
- package/build/template/components/content/GraphQLDocumentWrapper.d.ts +7 -0
- package/build/template/components/content/GraphQLDocumentWrapper.d.ts.map +1 -0
- package/build/template/components/content/GraphQLDocumentWrapper.js +62 -0
- package/build/template/components/content/GraphQLDocumentWrapper.js.map +1 -0
- package/build/template/components/graphql/graphql.d.ts +2 -2
- package/build/template/components/graphql/graphql.js +3 -0
- package/build/template/components/graphql/graphql.js.map +1 -0
- package/build/template/components/graphql/index.d.ts +1 -1
- package/build/template/components/graphql/index.js +1 -1
- package/build/template/components/graphql/index.js.map +1 -1
- package/build/template/components/graphql/{type-kind-icon.jsx → type-kind-icon.js} +3 -2
- package/build/template/components/graphql/type-kind-icon.js.map +1 -0
- package/build/template/components/graphql/type-link.js +11 -0
- package/build/template/components/graphql/type-link.js.map +1 -0
- package/build/template/components/sidebar/Sidebar.d.ts +1 -1
- package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
- package/build/template/components/sidebar/Sidebar.js +11 -0
- package/build/template/components/sidebar/Sidebar.js.map +1 -0
- package/build/template/components/sidebar/{SidebarItem.jsx → SidebarItem.js} +15 -32
- package/build/template/components/sidebar/SidebarItem.js.map +1 -0
- package/build/template/components/sidebar/ToggleButton.d.ts +1 -1
- package/build/template/components/sidebar/ToggleButton.d.ts.map +1 -1
- package/build/template/components/sidebar/ToggleButton.js +5 -0
- package/build/template/components/sidebar/ToggleButton.js.map +1 -0
- package/build/template/contexts/{ThemeContext.jsx → ThemeContext.js} +3 -4
- package/build/template/contexts/{ThemeContext.jsx.map → ThemeContext.js.map} +1 -1
- package/build/template/entry.client.d.ts +1 -0
- package/build/template/entry.client.d.ts.map +1 -1
- package/build/template/{entry.client.jsx → entry.client.js} +5 -6
- package/build/template/entry.client.js.map +1 -0
- package/build/template/routes/changelog.d.ts +1 -1
- package/build/template/routes/{changelog.jsx → changelog.js} +5 -4
- package/build/template/routes/changelog.js.map +1 -0
- package/build/template/routes/{index.jsx → index.js} +3 -2
- package/build/template/routes/index.js.map +1 -0
- package/build/template/routes/reference.$type.$field.d.ts +1 -1
- package/build/template/routes/{reference.$type.$field.jsx → reference.$type.$field.js} +6 -5
- package/build/template/routes/reference.$type.$field.js.map +1 -0
- package/build/template/routes/reference.$type.d.ts +1 -1
- package/build/template/routes/{reference.$type.jsx → reference.$type.js} +6 -5
- package/build/template/routes/reference.$type.js.map +1 -0
- package/build/template/routes/reference.d.ts +2 -2
- package/build/template/routes/{reference.jsx → reference.js} +6 -7
- package/build/template/routes/reference.js.map +1 -0
- package/build/template/routes/root.d.ts +2 -2
- package/build/template/routes/root.d.ts.map +1 -1
- package/build/template/routes/{root.jsx → root.js} +46 -88
- package/build/template/routes/root.js.map +1 -0
- package/build/template/routes.js +5 -0
- package/build/template/routes.js.map +1 -0
- package/build/template/server/app.js +1 -1
- package/build/template/server/app.js.map +1 -1
- package/build/template/server/{render-page.jsx → render-page.js} +3 -4
- package/build/template/server/render-page.js.map +1 -0
- package/build/template/server/ssg/generate.js +1 -1
- package/build/template/server/ssg/generate.js.map +1 -1
- package/build/template/server/ssg/get-route-paths.js +1 -1
- package/build/template/server/ssg/get-route-paths.js.map +1 -1
- package/build/template/server/view.js +1 -1
- package/build/template/server/view.js.map +1 -1
- package/package.json +56 -8
- package/src/api/vite/plugins/core.ts +0 -3
- package/src/api/vite/plugins/pages.ts +1 -1
- package/src/exports/components.ts +4 -1
- package/src/lib/graphql-document/$$.ts +4 -0
- package/src/lib/graphql-document/$.test.ts +132 -0
- package/src/lib/graphql-document/$.ts +1 -0
- package/src/lib/graphql-document/README.md +102 -0
- package/src/lib/graphql-document/analysis.ts +415 -0
- package/src/lib/graphql-document/components/GraphQLDocument.tsx +284 -0
- package/src/lib/graphql-document/components/GraphQLDocument.unit.test.ts +188 -0
- package/src/lib/graphql-document/components/GraphQLDocumentWithSchema.tsx +70 -0
- package/src/lib/graphql-document/components/HoverTooltip.tsx +282 -0
- package/src/lib/graphql-document/components/IdentifierLink.tsx +221 -0
- package/src/lib/graphql-document/components/index.ts +4 -0
- package/src/lib/graphql-document/demo.md +155 -0
- package/src/lib/graphql-document/example.ts +163 -0
- package/src/lib/graphql-document/graphql-document.ts +37 -0
- package/src/lib/graphql-document/positioning-simple.test.ts +252 -0
- package/src/lib/graphql-document/positioning-simple.ts +271 -0
- package/src/lib/graphql-document/schema-context.tsx +20 -0
- package/src/lib/graphql-document/schema-integration-example.ts +341 -0
- package/src/lib/graphql-document/schema-integration.test.ts +365 -0
- package/src/lib/graphql-document/schema-integration.ts +497 -0
- package/src/lib/graphql-document/types.ts +129 -0
- package/src/template/components/ArgumentAnnotation.tsx +1 -1
- package/src/template/components/ArgumentList.tsx +1 -1
- package/src/template/components/ArgumentListAnnotation.tsx +2 -2
- package/src/template/components/CodeBlockEnhancer.tsx +21 -21
- package/src/template/components/DeprecationReason.tsx +1 -1
- package/src/template/components/Description.tsx +1 -1
- package/src/template/components/Field.tsx +4 -4
- package/src/template/components/FieldList.tsx +1 -1
- package/src/template/components/FieldListSection.tsx +1 -1
- package/src/template/components/Link.tsx +2 -2
- package/src/template/components/MDXComponents.tsx +101 -0
- package/src/template/components/NamedType.tsx +2 -2
- package/src/template/components/TestComponent.tsx +6 -0
- package/src/template/components/TypeAnnotation.tsx +1 -1
- package/src/template/components/TypeFieldsLinkList.tsx +1 -1
- package/src/template/components/TypeIndex.tsx +1 -1
- package/src/template/components/content/$$.ts +1 -0
- package/src/template/components/content/GraphQLDocumentWithSchema.tsx +18 -0
- package/src/template/components/content/GraphQLDocumentWrapper.tsx +82 -0
- package/src/template/components/graphql/graphql.tsx +2 -2
- package/src/template/components/graphql/index.ts +1 -1
- package/src/template/components/graphql/type-link.tsx +2 -2
- package/src/template/entry.client.tsx +2 -2
- package/src/template/routes/changelog.tsx +1 -1
- package/src/template/routes/reference.$type.$field.tsx +3 -3
- package/src/template/routes/reference.$type.tsx +3 -3
- package/src/template/routes/reference.tsx +3 -3
- package/src/template/routes/root.tsx +36 -25
- package/src/template/routes.tsx +1 -1
- package/src/template/server/app.ts +1 -1
- package/src/template/server/ssg/generate.ts +1 -1
- package/src/template/server/ssg/get-route-paths.ts +1 -1
- package/src/template/server/view.ts +1 -1
- package/src/template/styles/code-block.css +32 -0
- package/build/template/components/ArgumentAnnotation.jsx +0 -16
- package/build/template/components/ArgumentAnnotation.jsx.map +0 -1
- package/build/template/components/ArgumentList.jsx +0 -16
- package/build/template/components/ArgumentList.jsx.map +0 -1
- package/build/template/components/ArgumentListAnnotation.jsx +0 -23
- package/build/template/components/ArgumentListAnnotation.jsx.map +0 -1
- package/build/template/components/Changelog.jsx +0 -68
- package/build/template/components/Changelog.jsx.map +0 -1
- package/build/template/components/CodeBlockEnhancer.jsx.map +0 -1
- package/build/template/components/DeprecationReason.jsx +0 -10
- package/build/template/components/DeprecationReason.jsx.map +0 -1
- package/build/template/components/Description.jsx +0 -10
- package/build/template/components/Description.jsx.map +0 -1
- package/build/template/components/Field.jsx +0 -22
- package/build/template/components/Field.jsx.map +0 -1
- package/build/template/components/FieldList.jsx.map +0 -1
- package/build/template/components/FieldListSection.jsx.map +0 -1
- package/build/template/components/HamburgerMenu.jsx +0 -53
- package/build/template/components/HamburgerMenu.jsx.map +0 -1
- package/build/template/components/Link.jsx.map +0 -1
- package/build/template/components/Logo.jsx +0 -29
- package/build/template/components/Logo.jsx.map +0 -1
- package/build/template/components/Markdown.jsx.map +0 -1
- package/build/template/components/MissingSchema.jsx +0 -4
- package/build/template/components/MissingSchema.jsx.map +0 -1
- package/build/template/components/NamedType.jsx +0 -17
- package/build/template/components/NamedType.jsx.map +0 -1
- package/build/template/components/NotFound.jsx +0 -26
- package/build/template/components/NotFound.jsx.map +0 -1
- package/build/template/components/RadixLink.jsx.map +0 -1
- package/build/template/components/Texts/MinorHeading.jsx.map +0 -1
- package/build/template/components/ThemeToggle.jsx +0 -10
- package/build/template/components/ThemeToggle.jsx.map +0 -1
- package/build/template/components/TypeAnnotation.jsx.map +0 -1
- package/build/template/components/TypeFieldsLinkList.jsx +0 -17
- package/build/template/components/TypeFieldsLinkList.jsx.map +0 -1
- package/build/template/components/TypeIndex.jsx +0 -27
- package/build/template/components/TypeIndex.jsx.map +0 -1
- package/build/template/components/graphql/graphql.jsx +0 -3
- package/build/template/components/graphql/graphql.jsx.map +0 -1
- package/build/template/components/graphql/type-kind-icon.jsx.map +0 -1
- package/build/template/components/graphql/type-link.jsx +0 -16
- package/build/template/components/graphql/type-link.jsx.map +0 -1
- package/build/template/components/sidebar/Sidebar.jsx +0 -15
- package/build/template/components/sidebar/Sidebar.jsx.map +0 -1
- package/build/template/components/sidebar/SidebarItem.jsx.map +0 -1
- package/build/template/components/sidebar/ToggleButton.jsx +0 -6
- package/build/template/components/sidebar/ToggleButton.jsx.map +0 -1
- package/build/template/entry.client.jsx.map +0 -1
- package/build/template/routes/changelog.jsx.map +0 -1
- package/build/template/routes/index.jsx.map +0 -1
- package/build/template/routes/reference.$type.$field.jsx.map +0 -1
- package/build/template/routes/reference.$type.jsx.map +0 -1
- package/build/template/routes/reference.jsx.map +0 -1
- package/build/template/routes/root.jsx.map +0 -1
- package/build/template/routes.jsx +0 -5
- package/build/template/routes.jsx.map +0 -1
- package/build/template/server/render-page.jsx.map +0 -1
@@ -0,0 +1,282 @@
|
|
1
|
+
import type { React } from '#dep/react/index'
|
2
|
+
import { Badge, Box, Card, Flex, Text } from '@radix-ui/themes'
|
3
|
+
import { useEffect, useRef, useState } from 'react'
|
4
|
+
import type { DOMPosition } from '../positioning-simple.ts'
|
5
|
+
import type { Documentation } from '../schema-integration.ts'
|
6
|
+
import type { Identifier } from '../types.ts'
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Props for the HoverTooltip component
|
10
|
+
*/
|
11
|
+
export interface HoverTooltipProps {
|
12
|
+
/** The identifier being hovered */
|
13
|
+
identifier: Identifier
|
14
|
+
/** Documentation from schema */
|
15
|
+
documentation: Documentation
|
16
|
+
/** Position of the identifier */
|
17
|
+
position: DOMPosition
|
18
|
+
/** Whether this identifier has an error */
|
19
|
+
hasError?: boolean
|
20
|
+
/** Reference URL for "View docs" link */
|
21
|
+
referenceUrl: string
|
22
|
+
/** Callback to close the tooltip */
|
23
|
+
onClose?: () => void
|
24
|
+
/** Callback to navigate to docs */
|
25
|
+
onNavigate?: () => void
|
26
|
+
}
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Tooltip shown on hover over GraphQL identifiers
|
30
|
+
*
|
31
|
+
* Displays type information, descriptions, deprecation warnings,
|
32
|
+
* and links to full documentation.
|
33
|
+
*/
|
34
|
+
export const HoverTooltip: React.FC<HoverTooltipProps> = ({
|
35
|
+
identifier,
|
36
|
+
documentation,
|
37
|
+
position,
|
38
|
+
hasError = false,
|
39
|
+
referenceUrl,
|
40
|
+
onClose,
|
41
|
+
onNavigate,
|
42
|
+
}) => {
|
43
|
+
const tooltipRef = useRef<HTMLDivElement>(null)
|
44
|
+
const [tooltipPosition, setTooltipPosition] = useState({ top: 0, left: 0 })
|
45
|
+
|
46
|
+
// Calculate tooltip position to avoid viewport edges
|
47
|
+
useEffect(() => {
|
48
|
+
if (!tooltipRef.current) return
|
49
|
+
|
50
|
+
const tooltip = tooltipRef.current
|
51
|
+
const rect = tooltip.getBoundingClientRect()
|
52
|
+
const viewportWidth = window.innerWidth
|
53
|
+
const viewportHeight = window.innerHeight
|
54
|
+
|
55
|
+
// Default position: above the identifier
|
56
|
+
let top = position.top - rect.height - 8
|
57
|
+
let left = position.left
|
58
|
+
|
59
|
+
// Adjust if tooltip would go off screen
|
60
|
+
if (top < 0) {
|
61
|
+
// Show below if not enough space above
|
62
|
+
top = position.top + position.height + 8
|
63
|
+
}
|
64
|
+
|
65
|
+
if (left + rect.width > viewportWidth) {
|
66
|
+
// Align right edge with identifier if too wide
|
67
|
+
left = position.left + position.width - rect.width
|
68
|
+
}
|
69
|
+
|
70
|
+
if (left < 0) {
|
71
|
+
// Keep on screen
|
72
|
+
left = 8
|
73
|
+
}
|
74
|
+
|
75
|
+
setTooltipPosition({ top, left })
|
76
|
+
}, [position])
|
77
|
+
|
78
|
+
// Determine badge color based on identifier kind
|
79
|
+
const getBadgeColor = () => {
|
80
|
+
switch (identifier.kind) {
|
81
|
+
case 'Type':
|
82
|
+
return 'blue'
|
83
|
+
case 'Field':
|
84
|
+
return 'green'
|
85
|
+
case 'Argument':
|
86
|
+
return 'orange'
|
87
|
+
case 'Variable':
|
88
|
+
return 'purple'
|
89
|
+
case 'Directive':
|
90
|
+
return 'amber'
|
91
|
+
case 'Fragment':
|
92
|
+
return 'cyan'
|
93
|
+
default:
|
94
|
+
return 'gray'
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
return (
|
99
|
+
<div
|
100
|
+
ref={tooltipRef}
|
101
|
+
className='graphql-hover-tooltip'
|
102
|
+
style={{
|
103
|
+
position: 'absolute',
|
104
|
+
top: tooltipPosition.top,
|
105
|
+
left: tooltipPosition.left,
|
106
|
+
zIndex: 100,
|
107
|
+
maxWidth: '400px',
|
108
|
+
pointerEvents: 'auto', // Make tooltip interactive
|
109
|
+
}}
|
110
|
+
>
|
111
|
+
<Card size='2' variant='surface'>
|
112
|
+
<Flex direction='column' gap='2'>
|
113
|
+
{/* Header with name, kind, and close button */}
|
114
|
+
<Flex justify='between' align='center'>
|
115
|
+
<Flex align='center' gap='2'>
|
116
|
+
<Text size='2' weight='bold'>
|
117
|
+
{identifier.name}
|
118
|
+
</Text>
|
119
|
+
<Badge color={getBadgeColor()} size='1'>
|
120
|
+
{identifier.kind}
|
121
|
+
</Badge>
|
122
|
+
</Flex>
|
123
|
+
{onClose && (
|
124
|
+
<button
|
125
|
+
onClick={onClose}
|
126
|
+
style={{
|
127
|
+
background: 'none',
|
128
|
+
border: 'none',
|
129
|
+
cursor: 'pointer',
|
130
|
+
padding: '4px',
|
131
|
+
color: 'var(--gray-11)',
|
132
|
+
fontSize: '18px',
|
133
|
+
lineHeight: '1',
|
134
|
+
fontWeight: 'bold',
|
135
|
+
borderRadius: '4px',
|
136
|
+
transition: 'background-color 0.2s',
|
137
|
+
}}
|
138
|
+
onMouseEnter={(e) => {
|
139
|
+
e.currentTarget.style.backgroundColor = 'var(--gray-a3)'
|
140
|
+
}}
|
141
|
+
onMouseLeave={(e) => {
|
142
|
+
e.currentTarget.style.backgroundColor = 'transparent'
|
143
|
+
}}
|
144
|
+
aria-label='Close tooltip'
|
145
|
+
>
|
146
|
+
×
|
147
|
+
</button>
|
148
|
+
)}
|
149
|
+
</Flex>
|
150
|
+
|
151
|
+
{/* Type signature */}
|
152
|
+
<Box>
|
153
|
+
<Text size='1' color='gray'>
|
154
|
+
Type: <Text as='span' size='1' style={{ fontFamily: 'monospace' }}>{documentation.typeInfo}</Text>
|
155
|
+
</Text>
|
156
|
+
</Box>
|
157
|
+
|
158
|
+
{/* Description */}
|
159
|
+
{documentation.description && (
|
160
|
+
<Box>
|
161
|
+
<Text size='1'>
|
162
|
+
{documentation.description}
|
163
|
+
</Text>
|
164
|
+
</Box>
|
165
|
+
)}
|
166
|
+
|
167
|
+
{/* Default value for arguments */}
|
168
|
+
{documentation.defaultValue && (
|
169
|
+
<Box>
|
170
|
+
<Text size='1' color='gray'>
|
171
|
+
Default:{' '}
|
172
|
+
<Text as='span' size='1' style={{ fontFamily: 'monospace' }}>{documentation.defaultValue}</Text>
|
173
|
+
</Text>
|
174
|
+
</Box>
|
175
|
+
)}
|
176
|
+
|
177
|
+
{/* Deprecation warning */}
|
178
|
+
{documentation.deprecated && (
|
179
|
+
<Box
|
180
|
+
style={{
|
181
|
+
padding: '8px',
|
182
|
+
backgroundColor: 'var(--amber-2)',
|
183
|
+
borderRadius: '4px',
|
184
|
+
border: '1px solid var(--amber-6)',
|
185
|
+
}}
|
186
|
+
>
|
187
|
+
<Text size='1' color='amber'>
|
188
|
+
⚠️ Deprecated: {documentation.deprecated.reason}
|
189
|
+
</Text>
|
190
|
+
{documentation.deprecated.replacement && (
|
191
|
+
<Text size='1' color='amber'>
|
192
|
+
Use {documentation.deprecated.replacement} instead.
|
193
|
+
</Text>
|
194
|
+
)}
|
195
|
+
</Box>
|
196
|
+
)}
|
197
|
+
|
198
|
+
{/* Error message */}
|
199
|
+
{hasError && (
|
200
|
+
<Box
|
201
|
+
style={{
|
202
|
+
padding: '8px',
|
203
|
+
backgroundColor: 'var(--red-2)',
|
204
|
+
borderRadius: '4px',
|
205
|
+
border: '1px solid var(--red-6)',
|
206
|
+
}}
|
207
|
+
>
|
208
|
+
<Text size='1' color='red'>
|
209
|
+
❌ {identifier.kind} not found in schema
|
210
|
+
</Text>
|
211
|
+
</Box>
|
212
|
+
)}
|
213
|
+
|
214
|
+
{/* Schema path */}
|
215
|
+
<Box>
|
216
|
+
<Text size='1' color='gray'>
|
217
|
+
Path: {identifier.schemaPath.join(' → ')}
|
218
|
+
</Text>
|
219
|
+
</Box>
|
220
|
+
|
221
|
+
{/* View docs link */}
|
222
|
+
{onNavigate && (
|
223
|
+
<Box>
|
224
|
+
<Text size='1'>
|
225
|
+
<a
|
226
|
+
href={referenceUrl}
|
227
|
+
onClick={(e) => {
|
228
|
+
e.preventDefault()
|
229
|
+
onNavigate()
|
230
|
+
onClose?.()
|
231
|
+
}}
|
232
|
+
style={{
|
233
|
+
color: 'var(--accent-9)',
|
234
|
+
textDecoration: 'none',
|
235
|
+
borderBottom: '1px solid transparent',
|
236
|
+
transition: 'border-color 0.2s',
|
237
|
+
cursor: 'pointer',
|
238
|
+
}}
|
239
|
+
onMouseEnter={(e) => {
|
240
|
+
e.currentTarget.style.borderBottomColor = 'var(--accent-9)'
|
241
|
+
}}
|
242
|
+
onMouseLeave={(e) => {
|
243
|
+
e.currentTarget.style.borderBottomColor = 'transparent'
|
244
|
+
}}
|
245
|
+
>
|
246
|
+
View full documentation →
|
247
|
+
</a>
|
248
|
+
</Text>
|
249
|
+
</Box>
|
250
|
+
)}
|
251
|
+
</Flex>
|
252
|
+
</Card>
|
253
|
+
</div>
|
254
|
+
)
|
255
|
+
}
|
256
|
+
|
257
|
+
/**
|
258
|
+
* Default styles for hover tooltips
|
259
|
+
*/
|
260
|
+
export const hoverTooltipStyles = `
|
261
|
+
.graphql-hover-tooltip {
|
262
|
+
/* Tooltip animation */
|
263
|
+
animation: graphql-tooltip-fade-in 0.2s ease-out;
|
264
|
+
}
|
265
|
+
|
266
|
+
@keyframes graphql-tooltip-fade-in {
|
267
|
+
from {
|
268
|
+
opacity: 0;
|
269
|
+
transform: translateY(4px);
|
270
|
+
}
|
271
|
+
to {
|
272
|
+
opacity: 1;
|
273
|
+
transform: translateY(0);
|
274
|
+
}
|
275
|
+
}
|
276
|
+
|
277
|
+
/* Ensure tooltips appear above other content */
|
278
|
+
.graphql-hover-tooltip .rt-Card {
|
279
|
+
box-shadow: 0 10px 38px -10px rgba(22, 23, 24, 0.35),
|
280
|
+
0 10px 20px -15px rgba(22, 23, 24, 0.2);
|
281
|
+
}
|
282
|
+
`
|
@@ -0,0 +1,221 @@
|
|
1
|
+
import type { React } from '#dep/react/index'
|
2
|
+
import { useState } from 'react'
|
3
|
+
import type { DOMPosition } from '../positioning-simple.ts'
|
4
|
+
import type { SchemaResolution } from '../schema-integration.ts'
|
5
|
+
import type { Identifier } from '../types.ts'
|
6
|
+
import { HoverTooltip } from './HoverTooltip.tsx'
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Props for the IdentifierLink component
|
10
|
+
*/
|
11
|
+
export interface IdentifierLinkProps {
|
12
|
+
/** The GraphQL identifier */
|
13
|
+
identifier: Identifier
|
14
|
+
/** Schema resolution information */
|
15
|
+
resolution: SchemaResolution
|
16
|
+
/** DOM position for overlay placement */
|
17
|
+
position: DOMPosition
|
18
|
+
/** Navigation handler */
|
19
|
+
onNavigate: (url: string) => void
|
20
|
+
/** Whether to show debug visuals */
|
21
|
+
debug?: boolean
|
22
|
+
/** Whether this tooltip is open */
|
23
|
+
isOpen?: boolean
|
24
|
+
/** Toggle tooltip open state */
|
25
|
+
onToggle?: (open: boolean) => void
|
26
|
+
}
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Interactive overlay for a GraphQL identifier
|
30
|
+
*
|
31
|
+
* Renders an invisible clickable area over the identifier text
|
32
|
+
* with hover tooltips and navigation to schema reference pages.
|
33
|
+
*/
|
34
|
+
export const IdentifierLink: React.FC<IdentifierLinkProps> = ({
|
35
|
+
identifier,
|
36
|
+
resolution,
|
37
|
+
position,
|
38
|
+
onNavigate,
|
39
|
+
debug = false,
|
40
|
+
isOpen = false,
|
41
|
+
onToggle,
|
42
|
+
}) => {
|
43
|
+
const [isHovered, setIsHovered] = useState(false)
|
44
|
+
|
45
|
+
// Use external state if provided, otherwise manage locally
|
46
|
+
const showTooltip = isOpen
|
47
|
+
const setShowTooltip = (show: boolean) => {
|
48
|
+
onToggle?.(show)
|
49
|
+
}
|
50
|
+
|
51
|
+
// Determine visual state
|
52
|
+
const isClickable = resolution.exists
|
53
|
+
const hasError = !resolution.exists && (identifier.kind === 'Type' || identifier.kind === 'Field')
|
54
|
+
const isDeprecated = !!resolution.deprecated
|
55
|
+
|
56
|
+
// Build class names
|
57
|
+
const classNames = [
|
58
|
+
'graphql-identifier-overlay',
|
59
|
+
`graphql-${identifier.kind.toLowerCase()}`,
|
60
|
+
isClickable && 'graphql-clickable',
|
61
|
+
hasError && 'graphql-error',
|
62
|
+
isDeprecated && 'graphql-deprecated',
|
63
|
+
isHovered && 'graphql-hovered',
|
64
|
+
showTooltip && 'graphql-tooltip-open',
|
65
|
+
debug && 'graphql-debug',
|
66
|
+
].filter(Boolean).join(' ')
|
67
|
+
|
68
|
+
const handleClick = (e: React.MouseEvent) => {
|
69
|
+
e.preventDefault()
|
70
|
+
e.stopPropagation()
|
71
|
+
|
72
|
+
// Toggle tooltip on click
|
73
|
+
setShowTooltip(!showTooltip)
|
74
|
+
}
|
75
|
+
|
76
|
+
const handleNavigate = (e: React.MouseEvent) => {
|
77
|
+
e.preventDefault()
|
78
|
+
e.stopPropagation()
|
79
|
+
if (isClickable) {
|
80
|
+
onNavigate(resolution.referenceUrl)
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
return (
|
85
|
+
<>
|
86
|
+
{isClickable
|
87
|
+
? (
|
88
|
+
<a
|
89
|
+
href={resolution.referenceUrl}
|
90
|
+
className={classNames + ' graphql-identifier-link'}
|
91
|
+
style={{
|
92
|
+
position: 'absolute',
|
93
|
+
top: position.top,
|
94
|
+
left: position.left,
|
95
|
+
width: position.width,
|
96
|
+
height: position.height,
|
97
|
+
cursor: 'pointer',
|
98
|
+
zIndex: 10,
|
99
|
+
pointerEvents: 'auto',
|
100
|
+
display: 'block',
|
101
|
+
textDecoration: 'none',
|
102
|
+
// Debug mode visual
|
103
|
+
...(debug && {
|
104
|
+
backgroundColor: hasError ? 'rgba(239, 68, 68, 0.1)' : 'rgba(59, 130, 246, 0.1)',
|
105
|
+
border: `1px solid ${hasError ? 'rgba(239, 68, 68, 0.3)' : 'rgba(59, 130, 246, 0.3)'}`,
|
106
|
+
}),
|
107
|
+
}}
|
108
|
+
onClick={handleClick}
|
109
|
+
onMouseEnter={() => setIsHovered(true)}
|
110
|
+
onMouseLeave={() => setIsHovered(false)}
|
111
|
+
aria-label={`${identifier.kind} ${identifier.name} - Click to view documentation`}
|
112
|
+
data-graphql-identifier={identifier.name}
|
113
|
+
data-graphql-kind={identifier.kind}
|
114
|
+
/>
|
115
|
+
)
|
116
|
+
: (
|
117
|
+
<div
|
118
|
+
className={classNames}
|
119
|
+
style={{
|
120
|
+
position: 'absolute',
|
121
|
+
top: position.top,
|
122
|
+
left: position.left,
|
123
|
+
width: position.width,
|
124
|
+
height: position.height,
|
125
|
+
cursor: 'pointer', // Make it clickable even for errors
|
126
|
+
zIndex: 10,
|
127
|
+
pointerEvents: 'auto',
|
128
|
+
// Debug mode visual
|
129
|
+
...(debug && {
|
130
|
+
backgroundColor: 'rgba(239, 68, 68, 0.1)',
|
131
|
+
border: `1px solid rgba(239, 68, 68, 0.3)`,
|
132
|
+
}),
|
133
|
+
}}
|
134
|
+
onClick={handleClick} // Add click handler for errors too
|
135
|
+
onMouseEnter={() => setIsHovered(true)}
|
136
|
+
onMouseLeave={() => setIsHovered(false)}
|
137
|
+
role='button'
|
138
|
+
aria-label={`${identifier.kind} ${identifier.name} - Click to view information`}
|
139
|
+
data-graphql-identifier={identifier.name}
|
140
|
+
data-graphql-kind={identifier.kind}
|
141
|
+
/>
|
142
|
+
)}
|
143
|
+
|
144
|
+
{/* Tooltip - show on click, not hover */}
|
145
|
+
{showTooltip && (
|
146
|
+
<HoverTooltip
|
147
|
+
identifier={identifier}
|
148
|
+
documentation={resolution.documentation || {
|
149
|
+
description: hasError
|
150
|
+
? `${identifier.kind} "${identifier.name}" not found in schema. This ${identifier.kind.toLowerCase()} does not exist in the current GraphQL schema.`
|
151
|
+
: `${identifier.kind}: ${identifier.name}`,
|
152
|
+
typeInfo: identifier.kind,
|
153
|
+
}}
|
154
|
+
position={position}
|
155
|
+
hasError={hasError}
|
156
|
+
referenceUrl={resolution.referenceUrl}
|
157
|
+
onClose={() => setShowTooltip(false)}
|
158
|
+
onNavigate={isClickable ? () => onNavigate(resolution.referenceUrl) : undefined}
|
159
|
+
/>
|
160
|
+
)}
|
161
|
+
</>
|
162
|
+
)
|
163
|
+
}
|
164
|
+
|
165
|
+
/**
|
166
|
+
* Default styles for identifier overlays
|
167
|
+
*
|
168
|
+
* These can be included in the document or overridden by custom styles.
|
169
|
+
*/
|
170
|
+
export const identifierLinkStyles = `
|
171
|
+
.graphql-identifier-overlay {
|
172
|
+
/* Base styles for all overlays */
|
173
|
+
transition: background-color 0.2s ease;
|
174
|
+
}
|
175
|
+
|
176
|
+
.graphql-identifier-overlay.graphql-clickable:hover {
|
177
|
+
/* Subtle highlight on hover for clickable identifiers */
|
178
|
+
background-color: rgba(59, 130, 246, 0.05);
|
179
|
+
}
|
180
|
+
|
181
|
+
.graphql-identifier-overlay.graphql-error {
|
182
|
+
/* Error indicator */
|
183
|
+
border-bottom: 2px wavy red;
|
184
|
+
}
|
185
|
+
|
186
|
+
.graphql-identifier-overlay.graphql-deprecated {
|
187
|
+
/* Deprecated indicator */
|
188
|
+
text-decoration: line-through;
|
189
|
+
opacity: 0.7;
|
190
|
+
}
|
191
|
+
|
192
|
+
.graphql-identifier-overlay.graphql-debug {
|
193
|
+
/* Debug mode makes overlays visible */
|
194
|
+
background-color: rgba(59, 130, 246, 0.1) !important;
|
195
|
+
border: 1px solid rgba(59, 130, 246, 0.3) !important;
|
196
|
+
}
|
197
|
+
|
198
|
+
/* Kind-specific styles */
|
199
|
+
.graphql-identifier-overlay.graphql-type {
|
200
|
+
/* Type identifiers */
|
201
|
+
}
|
202
|
+
|
203
|
+
.graphql-identifier-overlay.graphql-field {
|
204
|
+
/* Field identifiers */
|
205
|
+
}
|
206
|
+
|
207
|
+
.graphql-identifier-overlay.graphql-argument {
|
208
|
+
/* Argument identifiers */
|
209
|
+
font-style: italic;
|
210
|
+
}
|
211
|
+
|
212
|
+
.graphql-identifier-overlay.graphql-variable {
|
213
|
+
/* Variable identifiers */
|
214
|
+
color: var(--purple-11);
|
215
|
+
}
|
216
|
+
|
217
|
+
.graphql-identifier-overlay.graphql-directive {
|
218
|
+
/* Directive identifiers */
|
219
|
+
color: var(--amber-11);
|
220
|
+
}
|
221
|
+
`
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# GraphQL Document Component Demo
|
2
|
+
|
3
|
+
This page demonstrates the interactive GraphQL Document component that transforms static code blocks into rich, interactive documentation.
|
4
|
+
|
5
|
+
## Basic Query Example
|
6
|
+
|
7
|
+
Hover over the identifiers below to see type information and documentation. Click on types and fields to navigate to their reference pages.
|
8
|
+
|
9
|
+
```graphql
|
10
|
+
query GetUser($id: ID!) {
|
11
|
+
user(id: $id) {
|
12
|
+
id
|
13
|
+
name
|
14
|
+
email
|
15
|
+
posts(first: 10) {
|
16
|
+
id
|
17
|
+
title
|
18
|
+
content
|
19
|
+
author {
|
20
|
+
name
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
```
|
26
|
+
|
27
|
+
## Mutation Example
|
28
|
+
|
29
|
+
This mutation creates a new post. Notice how the component provides information about input types and return values.
|
30
|
+
|
31
|
+
```graphql
|
32
|
+
mutation CreatePost($input: CreatePostInput!) {
|
33
|
+
createPost(input: $input) {
|
34
|
+
id
|
35
|
+
title
|
36
|
+
content
|
37
|
+
createdAt
|
38
|
+
author {
|
39
|
+
id
|
40
|
+
name
|
41
|
+
}
|
42
|
+
}
|
43
|
+
}
|
44
|
+
```
|
45
|
+
|
46
|
+
## Subscription Example
|
47
|
+
|
48
|
+
Subscriptions work the same way - all GraphQL operations are fully interactive.
|
49
|
+
|
50
|
+
```graphql
|
51
|
+
subscription OnCommentAdded($postId: ID!) {
|
52
|
+
commentAdded(postId: $postId) {
|
53
|
+
id
|
54
|
+
content
|
55
|
+
author {
|
56
|
+
name
|
57
|
+
avatar
|
58
|
+
}
|
59
|
+
createdAt
|
60
|
+
}
|
61
|
+
}
|
62
|
+
```
|
63
|
+
|
64
|
+
## Fragment Example
|
65
|
+
|
66
|
+
Fragments are also supported with full type information and navigation.
|
67
|
+
|
68
|
+
```graphql
|
69
|
+
fragment UserInfo on User {
|
70
|
+
id
|
71
|
+
name
|
72
|
+
email
|
73
|
+
profile {
|
74
|
+
bio
|
75
|
+
avatar
|
76
|
+
website
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
query GetUserWithFragment($id: ID!) {
|
81
|
+
user(id: $id) {
|
82
|
+
...UserInfo
|
83
|
+
posts {
|
84
|
+
id
|
85
|
+
title
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
```
|
90
|
+
|
91
|
+
## Error Handling
|
92
|
+
|
93
|
+
The component validates GraphQL against the schema and highlights errors. Try hovering over the invalid field below:
|
94
|
+
|
95
|
+
```graphql
|
96
|
+
query InvalidQuery {
|
97
|
+
user {
|
98
|
+
nonExistentField
|
99
|
+
name
|
100
|
+
}
|
101
|
+
}
|
102
|
+
```
|
103
|
+
|
104
|
+
## Plain Mode
|
105
|
+
|
106
|
+
Sometimes you want to show GraphQL without interactivity. Use the `plain` option:
|
107
|
+
|
108
|
+
```graphql plain
|
109
|
+
query SimpleQuery {
|
110
|
+
users {
|
111
|
+
name
|
112
|
+
}
|
113
|
+
}
|
114
|
+
```
|
115
|
+
|
116
|
+
## Debug Mode
|
117
|
+
|
118
|
+
Enable debug mode to see the overlay boundaries:
|
119
|
+
|
120
|
+
```graphql debug
|
121
|
+
query DebugExample {
|
122
|
+
user {
|
123
|
+
id
|
124
|
+
name
|
125
|
+
}
|
126
|
+
}
|
127
|
+
```
|
128
|
+
|
129
|
+
## Features
|
130
|
+
|
131
|
+
The GraphQL Document component provides:
|
132
|
+
|
133
|
+
- **Interactive Navigation**: Click on any type or field to navigate to its reference documentation
|
134
|
+
- **Hover Tooltips**: See type information, descriptions, and deprecation warnings
|
135
|
+
- **Schema Validation**: Invalid queries are highlighted with error messages
|
136
|
+
- **Syntax Highlighting**: Beautiful syntax highlighting with Shiki
|
137
|
+
- **Smart Positioning**: Tooltips automatically position themselves to stay within the viewport
|
138
|
+
- **Accessibility**: Full keyboard navigation and screen reader support
|
139
|
+
|
140
|
+
## Configuration Options
|
141
|
+
|
142
|
+
```graphql validate=false
|
143
|
+
# This query won't be validated at build time
|
144
|
+
query {
|
145
|
+
anything {
|
146
|
+
goes
|
147
|
+
}
|
148
|
+
}
|
149
|
+
```
|
150
|
+
|
151
|
+
Available options:
|
152
|
+
|
153
|
+
- `plain` - Disable all interactive features
|
154
|
+
- `debug` - Show overlay boundaries for debugging
|
155
|
+
- `validate=false` - Skip validation for this block
|