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.
Files changed (324) hide show
  1. package/build/api/builder/builder.js +1 -1
  2. package/build/api/builder/builder.js.map +1 -1
  3. package/build/api/config/load.js +1 -1
  4. package/build/api/config/load.js.map +1 -1
  5. package/build/api/vite/plugins/build.js +1 -1
  6. package/build/api/vite/plugins/build.js.map +1 -1
  7. package/build/api/vite/plugins/core.d.ts.map +1 -1
  8. package/build/api/vite/plugins/core.js +0 -2
  9. package/build/api/vite/plugins/core.js.map +1 -1
  10. package/build/api/vite/plugins/pages.js +1 -1
  11. package/build/api/vite/plugins/pages.js.map +1 -1
  12. package/build/exports/components.d.ts +4 -1
  13. package/build/exports/components.d.ts.map +1 -1
  14. package/build/exports/components.js +4 -1
  15. package/build/exports/components.js.map +1 -1
  16. package/build/lib/demos/config-schema.d.ts +6 -6
  17. package/build/lib/github-actions/runner.js +2 -2
  18. package/build/lib/github-actions/runner.js.map +1 -1
  19. package/build/lib/graphql-document/$$.d.ts +5 -0
  20. package/build/lib/graphql-document/$$.d.ts.map +1 -0
  21. package/build/lib/graphql-document/$$.js +5 -0
  22. package/build/lib/graphql-document/$$.js.map +1 -0
  23. package/build/lib/graphql-document/$.d.ts +2 -0
  24. package/build/lib/graphql-document/$.d.ts.map +1 -0
  25. package/build/lib/graphql-document/$.js +2 -0
  26. package/build/lib/graphql-document/$.js.map +1 -0
  27. package/build/lib/graphql-document/analysis.d.ts +44 -0
  28. package/build/lib/graphql-document/analysis.d.ts.map +1 -0
  29. package/build/lib/graphql-document/analysis.js +361 -0
  30. package/build/lib/graphql-document/analysis.js.map +1 -0
  31. package/build/lib/graphql-document/components/GraphQLDocument.d.ts +42 -0
  32. package/build/lib/graphql-document/components/GraphQLDocument.d.ts.map +1 -0
  33. package/build/lib/graphql-document/components/GraphQLDocument.js +173 -0
  34. package/build/lib/graphql-document/components/GraphQLDocument.js.map +1 -0
  35. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts +7 -0
  36. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts.map +1 -0
  37. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js +45 -0
  38. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js.map +1 -0
  39. package/build/lib/graphql-document/components/HoverTooltip.d.ts +35 -0
  40. package/build/lib/graphql-document/components/HoverTooltip.d.ts.map +1 -0
  41. package/build/lib/graphql-document/components/HoverTooltip.js +132 -0
  42. package/build/lib/graphql-document/components/HoverTooltip.js.map +1 -0
  43. package/build/lib/graphql-document/components/IdentifierLink.d.ts +37 -0
  44. package/build/lib/graphql-document/components/IdentifierLink.d.ts.map +1 -0
  45. package/build/lib/graphql-document/components/IdentifierLink.js +141 -0
  46. package/build/lib/graphql-document/components/IdentifierLink.js.map +1 -0
  47. package/build/lib/graphql-document/components/index.d.ts +5 -0
  48. package/build/lib/graphql-document/components/index.d.ts.map +1 -0
  49. package/build/lib/graphql-document/components/index.js +5 -0
  50. package/build/lib/graphql-document/components/index.js.map +1 -0
  51. package/build/lib/graphql-document/example.d.ts +25 -0
  52. package/build/lib/graphql-document/example.d.ts.map +1 -0
  53. package/build/lib/graphql-document/example.js +140 -0
  54. package/build/lib/graphql-document/example.js.map +1 -0
  55. package/build/lib/graphql-document/graphql-document.d.ts +35 -0
  56. package/build/lib/graphql-document/graphql-document.d.ts.map +1 -0
  57. package/build/lib/graphql-document/graphql-document.js +36 -0
  58. package/build/lib/graphql-document/graphql-document.js.map +1 -0
  59. package/build/lib/graphql-document/positioning-simple.d.ts +68 -0
  60. package/build/lib/graphql-document/positioning-simple.d.ts.map +1 -0
  61. package/build/lib/graphql-document/positioning-simple.js +197 -0
  62. package/build/lib/graphql-document/positioning-simple.js.map +1 -0
  63. package/build/lib/graphql-document/schema-context.d.ts +8 -0
  64. package/build/lib/graphql-document/schema-context.d.ts.map +1 -0
  65. package/build/lib/graphql-document/schema-context.js +11 -0
  66. package/build/lib/graphql-document/schema-context.js.map +1 -0
  67. package/build/lib/graphql-document/schema-integration-example.d.ts +27 -0
  68. package/build/lib/graphql-document/schema-integration-example.d.ts.map +1 -0
  69. package/build/lib/graphql-document/schema-integration-example.js +297 -0
  70. package/build/lib/graphql-document/schema-integration-example.js.map +1 -0
  71. package/build/lib/graphql-document/schema-integration.d.ts +135 -0
  72. package/build/lib/graphql-document/schema-integration.d.ts.map +1 -0
  73. package/build/lib/graphql-document/schema-integration.js +328 -0
  74. package/build/lib/graphql-document/schema-integration.js.map +1 -0
  75. package/build/lib/graphql-document/types.d.ts +117 -0
  76. package/build/lib/graphql-document/types.d.ts.map +1 -0
  77. package/build/lib/graphql-document/types.js +2 -0
  78. package/build/lib/graphql-document/types.js.map +1 -0
  79. package/build/template/components/ArgumentAnnotation.js +10 -0
  80. package/build/template/components/ArgumentAnnotation.js.map +1 -0
  81. package/build/template/components/ArgumentList.js +9 -0
  82. package/build/template/components/ArgumentList.js.map +1 -0
  83. package/build/template/components/ArgumentListAnnotation.js +15 -0
  84. package/build/template/components/ArgumentListAnnotation.js.map +1 -0
  85. package/build/template/components/Changelog.js +44 -0
  86. package/build/template/components/Changelog.js.map +1 -0
  87. package/build/template/components/{CodeBlock.jsx → CodeBlock.js} +4 -5
  88. package/build/template/components/{CodeBlock.jsx.map → CodeBlock.js.map} +1 -1
  89. package/build/template/components/{CodeBlockEnhancer.jsx → CodeBlockEnhancer.js} +4 -4
  90. package/build/template/components/CodeBlockEnhancer.js.map +1 -0
  91. package/build/template/components/DeprecationReason.js +9 -0
  92. package/build/template/components/DeprecationReason.js.map +1 -0
  93. package/build/template/components/Description.js +9 -0
  94. package/build/template/components/Description.js.map +1 -0
  95. package/build/template/components/Field.js +14 -0
  96. package/build/template/components/Field.js.map +1 -0
  97. package/build/template/components/{FieldList.jsx → FieldList.js} +4 -5
  98. package/build/template/components/FieldList.js.map +1 -0
  99. package/build/template/components/{FieldListSection.jsx → FieldListSection.js} +4 -6
  100. package/build/template/components/FieldListSection.js.map +1 -0
  101. package/build/template/components/HamburgerMenu.js +30 -0
  102. package/build/template/components/HamburgerMenu.js.map +1 -0
  103. package/build/template/components/Link.d.ts +1 -1
  104. package/build/template/components/{Link.jsx → Link.js} +4 -5
  105. package/build/template/components/Link.js.map +1 -0
  106. package/build/template/components/Logo.js +20 -0
  107. package/build/template/components/Logo.js.map +1 -0
  108. package/build/template/components/MDXComponents.d.ts +11 -0
  109. package/build/template/components/MDXComponents.d.ts.map +1 -0
  110. package/build/template/components/MDXComponents.js +70 -0
  111. package/build/template/components/MDXComponents.js.map +1 -0
  112. package/build/template/components/{Markdown.jsx → Markdown.js} +3 -2
  113. package/build/template/components/Markdown.js.map +1 -0
  114. package/build/template/components/MissingSchema.d.ts +1 -1
  115. package/build/template/components/MissingSchema.d.ts.map +1 -1
  116. package/build/template/components/MissingSchema.js +5 -0
  117. package/build/template/components/MissingSchema.js.map +1 -0
  118. package/build/template/components/NamedType.js +12 -0
  119. package/build/template/components/NamedType.js.map +1 -0
  120. package/build/template/components/NotFound.js +7 -0
  121. package/build/template/components/NotFound.js.map +1 -0
  122. package/build/template/components/{RadixLink.jsx → RadixLink.js} +1 -1
  123. package/build/template/components/RadixLink.js.map +1 -0
  124. package/build/template/components/TestComponent.d.ts +5 -0
  125. package/build/template/components/TestComponent.d.ts.map +1 -0
  126. package/build/template/components/TestComponent.js +7 -0
  127. package/build/template/components/TestComponent.js.map +1 -0
  128. package/build/template/components/Texts/{MinorHeading.jsx → MinorHeading.js} +4 -3
  129. package/build/template/components/Texts/MinorHeading.js.map +1 -0
  130. package/build/template/components/Texts/texts.js +1 -1
  131. package/build/template/components/Texts/texts.js.map +1 -1
  132. package/build/template/components/ThemeToggle.js +9 -0
  133. package/build/template/components/ThemeToggle.js.map +1 -0
  134. package/build/template/components/{TypeAnnotation.jsx → TypeAnnotation.js} +8 -18
  135. package/build/template/components/TypeAnnotation.js.map +1 -0
  136. package/build/template/components/TypeFieldsLinkList.js +9 -0
  137. package/build/template/components/TypeFieldsLinkList.js.map +1 -0
  138. package/build/template/components/TypeIndex.js +17 -0
  139. package/build/template/components/TypeIndex.js.map +1 -0
  140. package/build/template/components/content/$$.d.ts +1 -0
  141. package/build/template/components/content/$$.d.ts.map +1 -1
  142. package/build/template/components/content/$$.js +1 -0
  143. package/build/template/components/content/$$.js.map +1 -1
  144. package/build/template/components/content/GraphQLDocumentWithSchema.d.ts +8 -0
  145. package/build/template/components/content/GraphQLDocumentWithSchema.d.ts.map +1 -0
  146. package/build/template/components/content/GraphQLDocumentWithSchema.js +16 -0
  147. package/build/template/components/content/GraphQLDocumentWithSchema.js.map +1 -0
  148. package/build/template/components/content/GraphQLDocumentWrapper.d.ts +7 -0
  149. package/build/template/components/content/GraphQLDocumentWrapper.d.ts.map +1 -0
  150. package/build/template/components/content/GraphQLDocumentWrapper.js +62 -0
  151. package/build/template/components/content/GraphQLDocumentWrapper.js.map +1 -0
  152. package/build/template/components/graphql/graphql.d.ts +2 -2
  153. package/build/template/components/graphql/graphql.js +3 -0
  154. package/build/template/components/graphql/graphql.js.map +1 -0
  155. package/build/template/components/graphql/index.d.ts +1 -1
  156. package/build/template/components/graphql/index.js +1 -1
  157. package/build/template/components/graphql/index.js.map +1 -1
  158. package/build/template/components/graphql/{type-kind-icon.jsx → type-kind-icon.js} +3 -2
  159. package/build/template/components/graphql/type-kind-icon.js.map +1 -0
  160. package/build/template/components/graphql/type-link.js +11 -0
  161. package/build/template/components/graphql/type-link.js.map +1 -0
  162. package/build/template/components/sidebar/Sidebar.d.ts +1 -1
  163. package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
  164. package/build/template/components/sidebar/Sidebar.js +11 -0
  165. package/build/template/components/sidebar/Sidebar.js.map +1 -0
  166. package/build/template/components/sidebar/{SidebarItem.jsx → SidebarItem.js} +15 -32
  167. package/build/template/components/sidebar/SidebarItem.js.map +1 -0
  168. package/build/template/components/sidebar/ToggleButton.d.ts +1 -1
  169. package/build/template/components/sidebar/ToggleButton.d.ts.map +1 -1
  170. package/build/template/components/sidebar/ToggleButton.js +5 -0
  171. package/build/template/components/sidebar/ToggleButton.js.map +1 -0
  172. package/build/template/contexts/{ThemeContext.jsx → ThemeContext.js} +3 -4
  173. package/build/template/contexts/{ThemeContext.jsx.map → ThemeContext.js.map} +1 -1
  174. package/build/template/entry.client.d.ts +1 -0
  175. package/build/template/entry.client.d.ts.map +1 -1
  176. package/build/template/{entry.client.jsx → entry.client.js} +5 -6
  177. package/build/template/entry.client.js.map +1 -0
  178. package/build/template/routes/changelog.d.ts +1 -1
  179. package/build/template/routes/{changelog.jsx → changelog.js} +5 -4
  180. package/build/template/routes/changelog.js.map +1 -0
  181. package/build/template/routes/{index.jsx → index.js} +3 -2
  182. package/build/template/routes/index.js.map +1 -0
  183. package/build/template/routes/reference.$type.$field.d.ts +1 -1
  184. package/build/template/routes/{reference.$type.$field.jsx → reference.$type.$field.js} +6 -5
  185. package/build/template/routes/reference.$type.$field.js.map +1 -0
  186. package/build/template/routes/reference.$type.d.ts +1 -1
  187. package/build/template/routes/{reference.$type.jsx → reference.$type.js} +6 -5
  188. package/build/template/routes/reference.$type.js.map +1 -0
  189. package/build/template/routes/reference.d.ts +2 -2
  190. package/build/template/routes/{reference.jsx → reference.js} +6 -7
  191. package/build/template/routes/reference.js.map +1 -0
  192. package/build/template/routes/root.d.ts +2 -2
  193. package/build/template/routes/root.d.ts.map +1 -1
  194. package/build/template/routes/{root.jsx → root.js} +46 -88
  195. package/build/template/routes/root.js.map +1 -0
  196. package/build/template/routes.js +5 -0
  197. package/build/template/routes.js.map +1 -0
  198. package/build/template/server/app.js +1 -1
  199. package/build/template/server/app.js.map +1 -1
  200. package/build/template/server/{render-page.jsx → render-page.js} +3 -4
  201. package/build/template/server/render-page.js.map +1 -0
  202. package/build/template/server/ssg/generate.js +1 -1
  203. package/build/template/server/ssg/generate.js.map +1 -1
  204. package/build/template/server/ssg/get-route-paths.js +1 -1
  205. package/build/template/server/ssg/get-route-paths.js.map +1 -1
  206. package/build/template/server/view.js +1 -1
  207. package/build/template/server/view.js.map +1 -1
  208. package/package.json +56 -8
  209. package/src/api/vite/plugins/core.ts +0 -3
  210. package/src/api/vite/plugins/pages.ts +1 -1
  211. package/src/exports/components.ts +4 -1
  212. package/src/lib/graphql-document/$$.ts +4 -0
  213. package/src/lib/graphql-document/$.test.ts +132 -0
  214. package/src/lib/graphql-document/$.ts +1 -0
  215. package/src/lib/graphql-document/README.md +102 -0
  216. package/src/lib/graphql-document/analysis.ts +415 -0
  217. package/src/lib/graphql-document/components/GraphQLDocument.tsx +284 -0
  218. package/src/lib/graphql-document/components/GraphQLDocument.unit.test.ts +188 -0
  219. package/src/lib/graphql-document/components/GraphQLDocumentWithSchema.tsx +70 -0
  220. package/src/lib/graphql-document/components/HoverTooltip.tsx +282 -0
  221. package/src/lib/graphql-document/components/IdentifierLink.tsx +221 -0
  222. package/src/lib/graphql-document/components/index.ts +4 -0
  223. package/src/lib/graphql-document/demo.md +155 -0
  224. package/src/lib/graphql-document/example.ts +163 -0
  225. package/src/lib/graphql-document/graphql-document.ts +37 -0
  226. package/src/lib/graphql-document/positioning-simple.test.ts +252 -0
  227. package/src/lib/graphql-document/positioning-simple.ts +271 -0
  228. package/src/lib/graphql-document/schema-context.tsx +20 -0
  229. package/src/lib/graphql-document/schema-integration-example.ts +341 -0
  230. package/src/lib/graphql-document/schema-integration.test.ts +365 -0
  231. package/src/lib/graphql-document/schema-integration.ts +497 -0
  232. package/src/lib/graphql-document/types.ts +129 -0
  233. package/src/template/components/ArgumentAnnotation.tsx +1 -1
  234. package/src/template/components/ArgumentList.tsx +1 -1
  235. package/src/template/components/ArgumentListAnnotation.tsx +2 -2
  236. package/src/template/components/CodeBlockEnhancer.tsx +21 -21
  237. package/src/template/components/DeprecationReason.tsx +1 -1
  238. package/src/template/components/Description.tsx +1 -1
  239. package/src/template/components/Field.tsx +4 -4
  240. package/src/template/components/FieldList.tsx +1 -1
  241. package/src/template/components/FieldListSection.tsx +1 -1
  242. package/src/template/components/Link.tsx +2 -2
  243. package/src/template/components/MDXComponents.tsx +101 -0
  244. package/src/template/components/NamedType.tsx +2 -2
  245. package/src/template/components/TestComponent.tsx +6 -0
  246. package/src/template/components/TypeAnnotation.tsx +1 -1
  247. package/src/template/components/TypeFieldsLinkList.tsx +1 -1
  248. package/src/template/components/TypeIndex.tsx +1 -1
  249. package/src/template/components/content/$$.ts +1 -0
  250. package/src/template/components/content/GraphQLDocumentWithSchema.tsx +18 -0
  251. package/src/template/components/content/GraphQLDocumentWrapper.tsx +82 -0
  252. package/src/template/components/graphql/graphql.tsx +2 -2
  253. package/src/template/components/graphql/index.ts +1 -1
  254. package/src/template/components/graphql/type-link.tsx +2 -2
  255. package/src/template/entry.client.tsx +2 -2
  256. package/src/template/routes/changelog.tsx +1 -1
  257. package/src/template/routes/reference.$type.$field.tsx +3 -3
  258. package/src/template/routes/reference.$type.tsx +3 -3
  259. package/src/template/routes/reference.tsx +3 -3
  260. package/src/template/routes/root.tsx +36 -25
  261. package/src/template/routes.tsx +1 -1
  262. package/src/template/server/app.ts +1 -1
  263. package/src/template/server/ssg/generate.ts +1 -1
  264. package/src/template/server/ssg/get-route-paths.ts +1 -1
  265. package/src/template/server/view.ts +1 -1
  266. package/src/template/styles/code-block.css +32 -0
  267. package/build/template/components/ArgumentAnnotation.jsx +0 -16
  268. package/build/template/components/ArgumentAnnotation.jsx.map +0 -1
  269. package/build/template/components/ArgumentList.jsx +0 -16
  270. package/build/template/components/ArgumentList.jsx.map +0 -1
  271. package/build/template/components/ArgumentListAnnotation.jsx +0 -23
  272. package/build/template/components/ArgumentListAnnotation.jsx.map +0 -1
  273. package/build/template/components/Changelog.jsx +0 -68
  274. package/build/template/components/Changelog.jsx.map +0 -1
  275. package/build/template/components/CodeBlockEnhancer.jsx.map +0 -1
  276. package/build/template/components/DeprecationReason.jsx +0 -10
  277. package/build/template/components/DeprecationReason.jsx.map +0 -1
  278. package/build/template/components/Description.jsx +0 -10
  279. package/build/template/components/Description.jsx.map +0 -1
  280. package/build/template/components/Field.jsx +0 -22
  281. package/build/template/components/Field.jsx.map +0 -1
  282. package/build/template/components/FieldList.jsx.map +0 -1
  283. package/build/template/components/FieldListSection.jsx.map +0 -1
  284. package/build/template/components/HamburgerMenu.jsx +0 -53
  285. package/build/template/components/HamburgerMenu.jsx.map +0 -1
  286. package/build/template/components/Link.jsx.map +0 -1
  287. package/build/template/components/Logo.jsx +0 -29
  288. package/build/template/components/Logo.jsx.map +0 -1
  289. package/build/template/components/Markdown.jsx.map +0 -1
  290. package/build/template/components/MissingSchema.jsx +0 -4
  291. package/build/template/components/MissingSchema.jsx.map +0 -1
  292. package/build/template/components/NamedType.jsx +0 -17
  293. package/build/template/components/NamedType.jsx.map +0 -1
  294. package/build/template/components/NotFound.jsx +0 -26
  295. package/build/template/components/NotFound.jsx.map +0 -1
  296. package/build/template/components/RadixLink.jsx.map +0 -1
  297. package/build/template/components/Texts/MinorHeading.jsx.map +0 -1
  298. package/build/template/components/ThemeToggle.jsx +0 -10
  299. package/build/template/components/ThemeToggle.jsx.map +0 -1
  300. package/build/template/components/TypeAnnotation.jsx.map +0 -1
  301. package/build/template/components/TypeFieldsLinkList.jsx +0 -17
  302. package/build/template/components/TypeFieldsLinkList.jsx.map +0 -1
  303. package/build/template/components/TypeIndex.jsx +0 -27
  304. package/build/template/components/TypeIndex.jsx.map +0 -1
  305. package/build/template/components/graphql/graphql.jsx +0 -3
  306. package/build/template/components/graphql/graphql.jsx.map +0 -1
  307. package/build/template/components/graphql/type-kind-icon.jsx.map +0 -1
  308. package/build/template/components/graphql/type-link.jsx +0 -16
  309. package/build/template/components/graphql/type-link.jsx.map +0 -1
  310. package/build/template/components/sidebar/Sidebar.jsx +0 -15
  311. package/build/template/components/sidebar/Sidebar.jsx.map +0 -1
  312. package/build/template/components/sidebar/SidebarItem.jsx.map +0 -1
  313. package/build/template/components/sidebar/ToggleButton.jsx +0 -6
  314. package/build/template/components/sidebar/ToggleButton.jsx.map +0 -1
  315. package/build/template/entry.client.jsx.map +0 -1
  316. package/build/template/routes/changelog.jsx.map +0 -1
  317. package/build/template/routes/index.jsx.map +0 -1
  318. package/build/template/routes/reference.$type.$field.jsx.map +0 -1
  319. package/build/template/routes/reference.$type.jsx.map +0 -1
  320. package/build/template/routes/reference.jsx.map +0 -1
  321. package/build/template/routes/root.jsx.map +0 -1
  322. package/build/template/routes.jsx +0 -5
  323. package/build/template/routes.jsx.map +0 -1
  324. 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,4 @@
1
+ export * from './GraphQLDocument.tsx'
2
+ export * from './GraphQLDocumentWithSchema.tsx'
3
+ export * from './HoverTooltip.tsx'
4
+ export * from './IdentifierLink.tsx'
@@ -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