@eventcatalog/core 3.0.0-beta.9 → 3.1.0

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 (197) hide show
  1. package/README.md +41 -98
  2. package/dist/__mocks__/astro-content.cjs +32 -0
  3. package/dist/__mocks__/astro-content.d.cts +13 -0
  4. package/dist/__mocks__/astro-content.d.ts +13 -0
  5. package/dist/__mocks__/astro-content.js +7 -0
  6. package/dist/analytics/analytics.cjs +1 -1
  7. package/dist/analytics/analytics.js +2 -2
  8. package/dist/analytics/log-build.cjs +1 -1
  9. package/dist/analytics/log-build.js +3 -3
  10. package/dist/catalog-to-astro-content-directory.cjs +2 -19
  11. package/dist/catalog-to-astro-content-directory.d.cts +1 -2
  12. package/dist/catalog-to-astro-content-directory.d.ts +1 -2
  13. package/dist/catalog-to-astro-content-directory.js +3 -5
  14. package/dist/{chunk-RAJ7TGWN.js → chunk-2WGZFERB.js} +1 -1
  15. package/dist/{chunk-R2BJ7MJG.js → chunk-6Z6ARMQS.js} +1 -17
  16. package/dist/{chunk-TC3R47V6.js → chunk-ESUL7UE6.js} +1 -1
  17. package/dist/{chunk-2VPX4WIJ.js → chunk-I3CW5KQI.js} +1 -1
  18. package/dist/{chunk-TT4LZO2Q.js → chunk-KBO4IL2D.js} +1 -1
  19. package/dist/{chunk-A4MGWK5T.js → chunk-URR33SNK.js} +1 -1
  20. package/dist/constants.cjs +1 -1
  21. package/dist/constants.js +1 -1
  22. package/dist/eventcatalog.cjs +20 -64
  23. package/dist/eventcatalog.config.d.cts +11 -0
  24. package/dist/eventcatalog.config.d.ts +11 -0
  25. package/dist/eventcatalog.js +26 -52
  26. package/dist/generate.cjs +1 -1
  27. package/dist/generate.js +3 -3
  28. package/dist/utils/cli-logger.cjs +1 -1
  29. package/dist/utils/cli-logger.js +2 -2
  30. package/eventcatalog/astro.config.mjs +4 -1
  31. package/eventcatalog/integrations/eventcatalog-features.ts +69 -0
  32. package/eventcatalog/public/icons/asyncapi-black.svg +2 -0
  33. package/eventcatalog/public/icons/graphql-black.svg +1 -0
  34. package/eventcatalog/public/icons/openapi-black.svg +1 -0
  35. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +1010 -0
  36. package/eventcatalog/src/components/ChatPanel/ChatPanelButton.tsx +24 -0
  37. package/eventcatalog/src/components/Checkbox.astro +7 -4
  38. package/eventcatalog/src/components/CopyAsMarkdown.tsx +15 -15
  39. package/eventcatalog/src/components/EnvironmentDropdown.tsx +15 -7
  40. package/eventcatalog/src/components/FavoriteButton.tsx +1 -1
  41. package/eventcatalog/src/components/Grids/DomainGrid.tsx +322 -173
  42. package/eventcatalog/src/components/Grids/MessageGrid.tsx +317 -178
  43. package/eventcatalog/src/components/Grids/specification-utils.ts +106 -0
  44. package/eventcatalog/src/components/Header.astro +40 -15
  45. package/eventcatalog/src/components/Lists/OwnersList.tsx +17 -10
  46. package/eventcatalog/src/components/Lists/PillListFlat.styles.css +12 -0
  47. package/eventcatalog/src/components/Lists/PillListFlat.tsx +15 -15
  48. package/eventcatalog/src/components/Lists/VersionList.astro +15 -5
  49. package/eventcatalog/src/components/MDX/Accordion/Accordion.tsx +3 -3
  50. package/eventcatalog/src/components/MDX/Admonition.tsx +49 -9
  51. package/eventcatalog/src/components/MDX/Attachments.astro +15 -11
  52. package/eventcatalog/src/components/MDX/ChannelInformation/ChannelInformation.tsx +29 -15
  53. package/eventcatalog/src/components/MDX/EntityPropertiesTable/EntityPropertiesTable.astro +20 -13
  54. package/eventcatalog/src/components/MDX/Link/Link.astro +1 -1
  55. package/eventcatalog/src/components/MDX/MessageTable/MessageTable.client.tsx +50 -29
  56. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.tsx +28 -15
  57. package/eventcatalog/src/components/MDX/NodeGraph/StepWalkthrough.tsx +4 -4
  58. package/eventcatalog/src/components/MDX/NodeGraph/StudioModal.tsx +4 -4
  59. package/eventcatalog/src/components/MDX/NodeGraph/VisualiserSearch.tsx +2 -2
  60. package/eventcatalog/src/components/MDX/ResourceGroupTable/ResourceGroupTable.client.tsx +54 -33
  61. package/eventcatalog/src/components/MDX/ResourceLink/ResourceLink.astro +1 -1
  62. package/eventcatalog/src/components/MDX/Steps/Step.astro +2 -2
  63. package/eventcatalog/src/components/MDX/Steps/Steps.astro +3 -3
  64. package/eventcatalog/src/components/MDX/Tabs/Tabs.astro +13 -9
  65. package/eventcatalog/src/components/MDX/Tiles/Tile.astro +25 -13
  66. package/eventcatalog/src/components/MDX/Tiles/Tiles.astro +1 -1
  67. package/eventcatalog/src/components/SchemaExplorer/ApiAccessSection.tsx +95 -90
  68. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +144 -0
  69. package/eventcatalog/src/components/SchemaExplorer/AvroSchemaViewer.tsx +29 -25
  70. package/eventcatalog/src/components/SchemaExplorer/DiffViewer.tsx +3 -3
  71. package/eventcatalog/src/components/SchemaExplorer/JSONSchemaViewer.tsx +61 -42
  72. package/eventcatalog/src/components/SchemaExplorer/OwnersSection.tsx +13 -9
  73. package/eventcatalog/src/components/SchemaExplorer/Pagination.tsx +36 -8
  74. package/eventcatalog/src/components/SchemaExplorer/ProducersConsumersSection.tsx +17 -13
  75. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +37 -10
  76. package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsHeader.tsx +152 -109
  77. package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +6 -15
  78. package/eventcatalog/src/components/SchemaExplorer/SchemaExplorer.tsx +257 -61
  79. package/eventcatalog/src/components/SchemaExplorer/SchemaFilters.tsx +64 -126
  80. package/eventcatalog/src/components/SchemaExplorer/SchemaListItem.tsx +53 -43
  81. package/eventcatalog/src/components/SchemaExplorer/SchemaViewerModal.tsx +8 -8
  82. package/eventcatalog/src/components/Search/Search.astro +5 -5
  83. package/eventcatalog/src/components/Search/SearchDataLoader.astro +25 -0
  84. package/eventcatalog/src/components/Search/SearchModal.tsx +65 -36
  85. package/eventcatalog/src/components/SideNav/NestedSideBar/SearchBar.tsx +37 -24
  86. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +117 -56
  87. package/eventcatalog/src/components/SideNav/SideNav.astro +0 -15
  88. package/eventcatalog/src/components/Tables/Table.tsx +97 -77
  89. package/eventcatalog/src/components/Tables/columns/ContainersTableColumns.tsx +114 -74
  90. package/eventcatalog/src/components/Tables/columns/DomainTableColumns.tsx +77 -55
  91. package/eventcatalog/src/components/Tables/columns/FlowTableColumns.tsx +36 -36
  92. package/eventcatalog/src/components/Tables/columns/MessageTableColumns.tsx +116 -77
  93. package/eventcatalog/src/components/Tables/columns/ServiceTableColumns.tsx +111 -94
  94. package/eventcatalog/src/components/Tables/columns/SharedColumns.tsx +31 -26
  95. package/eventcatalog/src/components/Tables/columns/TeamsTableColumns.tsx +123 -215
  96. package/eventcatalog/src/components/Tables/columns/UserTableColumns.tsx +156 -243
  97. package/eventcatalog/src/components/ThemeToggle.tsx +18 -0
  98. package/eventcatalog/src/content.config.ts +1 -13
  99. package/eventcatalog/src/enterprise/ai/chat-api.ts +360 -0
  100. package/eventcatalog/src/enterprise/auth/[...auth].ts +3 -0
  101. package/eventcatalog/src/enterprise/auth/login.astro +420 -0
  102. package/eventcatalog/src/enterprise/collections/index.ts +0 -1
  103. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/components/NestedItem.tsx +15 -7
  104. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/components/NoResultsFound.tsx +2 -2
  105. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/index.tsx +19 -15
  106. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/index.astro +50 -17
  107. package/eventcatalog/src/layouts/DirectoryLayout.astro +11 -6
  108. package/eventcatalog/src/layouts/DiscoverLayout.astro +13 -8
  109. package/eventcatalog/src/layouts/Footer.astro +14 -11
  110. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +187 -123
  111. package/eventcatalog/src/pages/_index.astro +213 -573
  112. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.ts +8 -2
  113. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +9 -5
  114. package/eventcatalog/src/pages/directory/[type]/index.astro +6 -0
  115. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +19 -3
  116. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/index.astro +7 -7
  117. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +5 -5
  118. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +81 -64
  119. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +23 -24
  120. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +214 -125
  121. package/eventcatalog/src/pages/docs/custom/index.astro +2 -2
  122. package/eventcatalog/src/pages/docs/teams/[id]/index.astro +98 -70
  123. package/eventcatalog/src/pages/docs/teams/[id].mdx.ts +36 -0
  124. package/eventcatalog/src/pages/docs/users/[id]/index.astro +60 -45
  125. package/eventcatalog/src/pages/docs/users/[id].mdx.ts +36 -0
  126. package/eventcatalog/src/pages/schemas/explorer/_index.data.ts +178 -0
  127. package/eventcatalog/src/pages/schemas/explorer/index.astro +7 -157
  128. package/eventcatalog/src/pages/studio.astro +155 -75
  129. package/eventcatalog/src/remark-plugins/directives.ts +36 -15
  130. package/eventcatalog/src/remark-plugins/mermaid.ts +2 -2
  131. package/eventcatalog/src/{components/SideNav/NestedSideBar → stores/sidebar-store}/builders/container.ts +10 -1
  132. package/eventcatalog/src/{components/SideNav/NestedSideBar → stores/sidebar-store}/builders/domain.ts +17 -7
  133. package/eventcatalog/src/{components/SideNav/NestedSideBar → stores/sidebar-store}/builders/message.ts +10 -1
  134. package/eventcatalog/src/{components/SideNav/NestedSideBar → stores/sidebar-store}/builders/service.ts +11 -4
  135. package/eventcatalog/src/{components/SideNav/NestedSideBar → stores/sidebar-store}/builders/shared.ts +14 -0
  136. package/eventcatalog/src/stores/{sidebar-store.ts → sidebar-store/index.ts} +1 -1
  137. package/eventcatalog/src/stores/theme-store.ts +93 -0
  138. package/eventcatalog/src/styles/theme.css +255 -0
  139. package/eventcatalog/src/styles/themes/forest.css +230 -0
  140. package/eventcatalog/src/styles/themes/ocean.css +235 -0
  141. package/eventcatalog/src/styles/themes/sapphire.css +230 -0
  142. package/eventcatalog/src/styles/themes/sunset.css +230 -0
  143. package/eventcatalog/src/utils/collections/channels.ts +0 -2
  144. package/eventcatalog/src/utils/collections/commands.ts +0 -2
  145. package/eventcatalog/src/utils/collections/containers.ts +0 -2
  146. package/eventcatalog/src/utils/collections/domains.ts +0 -2
  147. package/eventcatalog/src/utils/collections/entities.ts +0 -2
  148. package/eventcatalog/src/utils/collections/events.ts +0 -2
  149. package/eventcatalog/src/utils/collections/flows.ts +0 -2
  150. package/eventcatalog/src/utils/collections/queries.ts +0 -2
  151. package/eventcatalog/src/utils/collections/schemas.ts +45 -7
  152. package/eventcatalog/src/utils/collections/services.ts +0 -2
  153. package/eventcatalog/src/utils/feature.ts +13 -5
  154. package/eventcatalog/src/utils/node-graphs/services-node-graph.ts +1 -1
  155. package/eventcatalog/src/utils/resource-files.ts +86 -0
  156. package/eventcatalog/tailwind.config.mjs +6 -3
  157. package/package.json +12 -15
  158. package/default-files-for-collections/changelogs.md +0 -5
  159. package/default-files-for-collections/channels.md +0 -8
  160. package/default-files-for-collections/commands.md +0 -8
  161. package/default-files-for-collections/domains.md +0 -8
  162. package/default-files-for-collections/events.md +0 -8
  163. package/default-files-for-collections/flows.md +0 -11
  164. package/default-files-for-collections/queries.md +0 -8
  165. package/default-files-for-collections/services.md +0 -8
  166. package/default-files-for-collections/ubiquitousLanguages.md +0 -7
  167. package/eventcatalog/src/enterprise/collections/chat-prompts.ts +0 -32
  168. package/eventcatalog/src/enterprise/eventcatalog-chat/components/Chat.tsx +0 -60
  169. package/eventcatalog/src/enterprise/eventcatalog-chat/components/ChatMessage.tsx +0 -414
  170. package/eventcatalog/src/enterprise/eventcatalog-chat/components/ChatSidebar.tsx +0 -169
  171. package/eventcatalog/src/enterprise/eventcatalog-chat/components/InputModal.tsx +0 -244
  172. package/eventcatalog/src/enterprise/eventcatalog-chat/components/MentionInput.tsx +0 -211
  173. package/eventcatalog/src/enterprise/eventcatalog-chat/components/WelcomePromptArea.tsx +0 -176
  174. package/eventcatalog/src/enterprise/eventcatalog-chat/components/default-prompts.ts +0 -93
  175. package/eventcatalog/src/enterprise/eventcatalog-chat/components/hooks/ChatProvider.tsx +0 -143
  176. package/eventcatalog/src/enterprise/eventcatalog-chat/components/windows/ChatWindow.server.tsx +0 -387
  177. package/eventcatalog/src/enterprise/eventcatalog-chat/pages/api/chat.ts +0 -59
  178. package/eventcatalog/src/enterprise/eventcatalog-chat/pages/chat/index.astro +0 -104
  179. package/eventcatalog/src/enterprise/eventcatalog-chat/providers/ai-provider.ts +0 -140
  180. package/eventcatalog/src/enterprise/eventcatalog-chat/providers/anthropic.ts +0 -28
  181. package/eventcatalog/src/enterprise/eventcatalog-chat/providers/google.ts +0 -41
  182. package/eventcatalog/src/enterprise/eventcatalog-chat/providers/index.ts +0 -26
  183. package/eventcatalog/src/enterprise/eventcatalog-chat/providers/openai.ts +0 -61
  184. package/eventcatalog/src/enterprise/eventcatalog-chat/utils/chat-prompts.ts +0 -50
  185. package/eventcatalog/src/pages/auth/login.astro +0 -280
  186. package/eventcatalog/src/pages/chat/feature.astro +0 -179
  187. package/eventcatalog/src/pages/chat/index.astro +0 -10
  188. package/eventcatalog/src/pages/docs/_default-docs.mdx +0 -25
  189. package/eventcatalog/src/pages/docs/index.astro +0 -33
  190. package/eventcatalog/src/pages/nav-index.json.ts +0 -30
  191. /package/eventcatalog/src/{pages → enterprise}/auth/error.astro +0 -0
  192. /package/eventcatalog/src/{middleware-auth.ts → enterprise/auth/middleware/middleware-auth.ts} +0 -0
  193. /package/eventcatalog/src/{middleware.ts → enterprise/auth/middleware/middleware.ts} +0 -0
  194. /package/eventcatalog/src/{pages/unauthorized/index.astro → enterprise/auth/unauthorized.astro} +0 -0
  195. /package/eventcatalog/src/{pages → enterprise}/plans/index.astro +0 -0
  196. /package/eventcatalog/src/{components/SideNav/NestedSideBar → stores/sidebar-store}/builders/flow.ts +0 -0
  197. /package/eventcatalog/src/{components/SideNav/NestedSideBar/sidebar-builder.ts → stores/sidebar-store/state.ts} +0 -0
@@ -37,35 +37,35 @@ const ResourceRow = memo(
37
37
  const owners = resource.owners || [];
38
38
 
39
39
  return (
40
- <tr className="group hover:bg-gray-100">
41
- <td className="whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6 relative">
40
+ <tr className="group hover:bg-[rgb(var(--ec-content-hover))]">
41
+ <td className="whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-[rgb(var(--ec-page-text))] sm:pl-6 relative">
42
42
  <a href={url} className="absolute inset-0 z-10" aria-label={`View details for ${resource.name}`} />
43
43
  <div className="flex items-center gap-2 relative">
44
44
  <Icon className={`h-5 w-5 text-${color}-500`} />
45
- <span className="group-hover:text-blue-600 break-all">{resource.name}</span>
45
+ <span className="group-hover:text-[rgb(var(--ec-accent))] break-all">{resource.name}</span>
46
46
  </div>
47
47
  </td>
48
- <td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500 relative">
48
+ <td className="whitespace-nowrap px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
49
49
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
50
50
  <span>v{resource.version}</span>
51
51
  </td>
52
- <td className="whitespace-nowrap px-3 py-4 text-sm text-gray-500 relative">
52
+ <td className="whitespace-nowrap px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
53
53
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
54
54
  <span>{type}</span>
55
55
  </td>
56
- <td className="px-3 py-4 text-sm text-gray-500 relative">
56
+ <td className="px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
57
57
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
58
58
  <span className="line-clamp-2 break-words">{resource.summary || resource.description || '-'}</span>
59
59
  </td>
60
60
  {showTags && (
61
- <td className="px-3 py-4 text-sm text-gray-500 relative">
61
+ <td className="px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
62
62
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
63
63
  <div className="flex flex-wrap gap-1">
64
64
  {tags.length > 0
65
65
  ? tags.map((tag, index) => (
66
66
  <span
67
67
  key={`${tag}-${index}`}
68
- className="inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10"
68
+ className="inline-flex items-center rounded-md bg-[rgb(var(--ec-content-hover))] px-2 py-1 text-xs font-medium text-[rgb(var(--ec-page-text-muted))] ring-1 ring-inset ring-[rgb(var(--ec-page-border))]"
69
69
  >
70
70
  {tag}
71
71
  </span>
@@ -75,14 +75,14 @@ const ResourceRow = memo(
75
75
  </td>
76
76
  )}
77
77
  {showOwners && (
78
- <td className="px-3 py-4 text-sm text-gray-500 relative">
78
+ <td className="px-3 py-4 text-sm text-[rgb(var(--ec-page-text-muted))] relative">
79
79
  <a href={url} className="absolute inset-0 z-10" aria-hidden="true" />
80
80
  <div className="flex flex-wrap gap-1">
81
81
  {owners.length > 0
82
82
  ? owners.map((owner, index) => (
83
83
  <span
84
84
  key={`${owner.id || owner.name}-${index}`}
85
- className="inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10"
85
+ className="inline-flex items-center rounded-md bg-[rgb(var(--ec-content-hover))] px-2 py-1 text-xs font-medium text-[rgb(var(--ec-page-text-muted))] ring-1 ring-inset ring-[rgb(var(--ec-page-border))]"
86
86
  >
87
87
  {owner.name || owner.id}
88
88
  </span>
@@ -119,8 +119,8 @@ const FilterButton = memo(
119
119
  }}
120
120
  className={`px-3 py-1 rounded-md text-sm font-medium ${
121
121
  typeFilter === type
122
- ? 'bg-black text-white border border-gray-200 hover:bg-gray-900'
123
- : 'bg-white text-black border border-gray-200 hover:bg-gray-100'
122
+ ? 'bg-[rgb(var(--ec-button-bg))] text-[rgb(var(--ec-button-text))] border border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-button-bg-hover))]'
123
+ : 'bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] text-[rgb(var(--ec-page-text))] border border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-content-hover))]'
124
124
  }`}
125
125
  >
126
126
  {label} ({count})
@@ -217,13 +217,13 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
217
217
 
218
218
  return (
219
219
  <div className="mx-auto not-prose py-4 space-y-4 my-4">
220
- {title && <h2 className="text-2xl font-semibold">{title}</h2>}
221
- <div className="flow-root bg-white border-gray-200 border p-4 pb-2 rounded-lg text-gray-900">
220
+ {title && <h2 className="text-2xl font-semibold text-[rgb(var(--ec-page-text))]">{title}</h2>}
221
+ <div className="flow-root bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border-[rgb(var(--ec-page-border))] border p-4 pb-2 rounded-lg text-[rgb(var(--ec-page-text))]">
222
222
  <div className="space-y-4">
223
223
  <h2 className="text-xl font-semibold">
224
224
  {subtitle} ({searchTerm || typeFilter ? `${filteredResources.length}/${resources.length}` : resources.length})
225
225
  </h2>
226
- <span className="text-sm text-gray-700">{description}</span>
226
+ <span className="text-sm text-[rgb(var(--ec-page-text-muted))]">{description}</span>
227
227
 
228
228
  {/* Type filter buttons - only shown if there are filter options */}
229
229
  {filterButtons.length > 0 && (
@@ -244,7 +244,12 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
244
244
 
245
245
  <div className="relative">
246
246
  <div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3">
247
- <svg className="h-5 w-5 text-gray-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
247
+ <svg
248
+ className="h-5 w-5 text-[rgb(var(--ec-icon-color))]"
249
+ viewBox="0 0 20 20"
250
+ fill="currentColor"
251
+ aria-hidden="true"
252
+ >
248
253
  <path
249
254
  fillRule="evenodd"
250
255
  d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
@@ -260,7 +265,7 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
260
265
  setCurrentPage(1); // Reset to first page when searching
261
266
  }}
262
267
  placeholder="Search by name, type, description, or tags..."
263
- className="block w-full rounded-md border-0 py-1.5 pl-10 pr-10 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-blue-600 sm:text-sm sm:leading-6"
268
+ className="block w-full rounded-md border-0 py-1.5 pl-10 pr-10 bg-[rgb(var(--ec-input-bg))] text-[rgb(var(--ec-input-text))] ring-1 ring-inset ring-[rgb(var(--ec-input-border))] placeholder:text-[rgb(var(--ec-input-placeholder))] focus:ring-2 focus:ring-inset focus:ring-[rgb(var(--ec-accent))] sm:text-sm sm:leading-6"
264
269
  />
265
270
  {searchTerm && (
266
271
  <button
@@ -271,7 +276,11 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
271
276
  className="absolute inset-y-0 right-0 flex items-center pr-3"
272
277
  aria-label="Clear search"
273
278
  >
274
- <svg className="h-5 w-5 text-gray-400 hover:text-gray-500" viewBox="0 0 20 20" fill="currentColor">
279
+ <svg
280
+ className="h-5 w-5 text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-icon-hover))]"
281
+ viewBox="0 0 20 20"
282
+ fill="currentColor"
283
+ >
275
284
  <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" />
276
285
  </svg>
277
286
  </button>
@@ -281,40 +290,52 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
281
290
  <div className="overflow-x-auto">
282
291
  <div className="inline-block min-w-full py-2 align-middle">
283
292
  <div className="max-w-full overflow-hidden">
284
- <table className="min-w-full table-fixed divide-y divide-gray-300 rounded-sm bg-white">
293
+ <table className="min-w-full table-fixed divide-y divide-[rgb(var(--ec-page-border))] rounded-sm bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))]">
285
294
  <thead>
286
295
  <tr>
287
296
  <th
288
297
  scope="col"
289
- className={`${showTags || showOwners ? 'w-1/5' : 'w-1/4'} py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6`}
298
+ className={`${showTags || showOwners ? 'w-1/5' : 'w-1/4'} py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))] sm:pl-6`}
290
299
  >
291
300
  Name
292
301
  </th>
293
- <th scope="col" className="w-[100px] px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
302
+ <th
303
+ scope="col"
304
+ className="w-[100px] px-3 py-3.5 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]"
305
+ >
294
306
  Version
295
307
  </th>
296
- <th scope="col" className="w-[100px] py-3.5 pl-3.5 pr-3 text-left text-sm font-semibold text-gray-900">
308
+ <th
309
+ scope="col"
310
+ className="w-[100px] py-3.5 pl-3.5 pr-3 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]"
311
+ >
297
312
  Type
298
313
  </th>
299
314
  <th
300
315
  scope="col"
301
- className={`${showTags && showOwners ? 'w-1/4' : showTags || showOwners ? 'w-1/3' : 'w-1/2'} px-3 py-3.5 text-left text-sm font-semibold text-gray-900`}
316
+ className={`${showTags && showOwners ? 'w-1/4' : showTags || showOwners ? 'w-1/3' : 'w-1/2'} px-3 py-3.5 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]`}
302
317
  >
303
318
  Description
304
319
  </th>
305
320
  {showTags && (
306
- <th scope="col" className="w-1/6 px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
321
+ <th
322
+ scope="col"
323
+ className="w-1/6 px-3 py-3.5 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]"
324
+ >
307
325
  Tags
308
326
  </th>
309
327
  )}
310
328
  {showOwners && (
311
- <th scope="col" className="w-1/6 px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
329
+ <th
330
+ scope="col"
331
+ className="w-1/6 px-3 py-3.5 text-left text-sm font-semibold text-[rgb(var(--ec-page-text))]"
332
+ >
312
333
  Owners
313
334
  </th>
314
335
  )}
315
336
  </tr>
316
337
  </thead>
317
- <tbody className="divide-y divide-gray-200">
338
+ <tbody className="divide-y divide-[rgb(var(--ec-page-border))]">
318
339
  {paginatedResources.length > 0 ? (
319
340
  paginatedResources.map((resource) => (
320
341
  <ResourceRow
@@ -328,7 +349,7 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
328
349
  <tr>
329
350
  <td
330
351
  colSpan={showTags && showOwners ? 6 : showTags || showOwners ? 5 : 4}
331
- className="text-center py-4 text-sm text-gray-500"
352
+ className="text-center py-4 text-sm text-[rgb(var(--ec-page-text-muted))]"
332
353
  >
333
354
  No resources found
334
355
  </td>
@@ -340,26 +361,26 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
340
361
  </div>
341
362
  </div>
342
363
  {totalPages > 1 && (
343
- <div className="flex items-center justify-between border-t border-gray-200 bg-white px-4 py-3 sm:px-6 -mt-2">
364
+ <div className="flex items-center justify-between border-t border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] px-4 py-3 sm:px-6 -mt-2">
344
365
  <div className="flex flex-1 justify-between sm:hidden">
345
366
  <button
346
367
  onClick={() => setCurrentPage(currentPage - 1)}
347
368
  disabled={currentPage === 1}
348
- className={`relative inline-flex items-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium ${currentPage === 1 ? 'text-gray-300' : 'text-gray-700 hover:bg-gray-50'}`}
369
+ className={`relative inline-flex items-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] px-4 py-2 text-sm font-medium ${currentPage === 1 ? 'text-[rgb(var(--ec-icon-color))]' : 'text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-content-hover))]'}`}
349
370
  >
350
371
  Previous
351
372
  </button>
352
373
  <button
353
374
  onClick={() => setCurrentPage(currentPage + 1)}
354
375
  disabled={currentPage === totalPages}
355
- className={`relative ml-3 inline-flex items-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium ${currentPage === totalPages ? 'text-gray-300' : 'text-gray-700 hover:bg-gray-50'}`}
376
+ className={`relative ml-3 inline-flex items-center rounded-md border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] px-4 py-2 text-sm font-medium ${currentPage === totalPages ? 'text-[rgb(var(--ec-icon-color))]' : 'text-[rgb(var(--ec-page-text))] hover:bg-[rgb(var(--ec-content-hover))]'}`}
356
377
  >
357
378
  Next
358
379
  </button>
359
380
  </div>
360
381
  <div className="hidden sm:flex sm:flex-1 sm:items-center sm:justify-between">
361
382
  <div>
362
- <p className="text-sm text-gray-700">
383
+ <p className="text-sm text-[rgb(var(--ec-page-text-muted))]">
363
384
  Showing <span className="font-medium">{startIndex + 1}</span> to{' '}
364
385
  <span className="font-medium">{Math.min(startIndex + itemsPerPage, filteredResources.length)}</span> of{' '}
365
386
  <span className="font-medium">{filteredResources.length}</span> results
@@ -370,7 +391,7 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
370
391
  <button
371
392
  onClick={() => setCurrentPage(currentPage - 1)}
372
393
  disabled={currentPage === 1}
373
- className={`relative inline-flex items-center rounded-l-md px-2 py-2 ${currentPage === 1 ? 'text-gray-300' : 'text-gray-400 hover:bg-gray-50'} ring-1 ring-inset ring-gray-300`}
394
+ className={`relative inline-flex items-center rounded-l-md px-2 py-2 ${currentPage === 1 ? 'text-[rgb(var(--ec-icon-color))]' : 'text-[rgb(var(--ec-page-text-muted))] hover:bg-[rgb(var(--ec-content-hover))]'} ring-1 ring-inset ring-[rgb(var(--ec-page-border))]`}
374
395
  >
375
396
  <span className="sr-only">Previous</span>
376
397
  <svg className="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
@@ -384,7 +405,7 @@ const ResourceGroupTable = (props: ResourceGroupTableProps) => {
384
405
  <button
385
406
  onClick={() => setCurrentPage(currentPage + 1)}
386
407
  disabled={currentPage === totalPages}
387
- className={`relative inline-flex items-center rounded-r-md px-2 py-2 ${currentPage === totalPages ? 'text-gray-300' : 'text-gray-400 hover:bg-gray-50'} ring-1 ring-inset ring-gray-300`}
408
+ className={`relative inline-flex items-center rounded-r-md px-2 py-2 ${currentPage === totalPages ? 'text-[rgb(var(--ec-icon-color))]' : 'text-[rgb(var(--ec-page-text-muted))] hover:bg-[rgb(var(--ec-content-hover))]'} ring-1 ring-inset ring-[rgb(var(--ec-page-border))]`}
388
409
  >
389
410
  <span className="sr-only">Next</span>
390
411
  <svg className="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
@@ -43,7 +43,7 @@ try {
43
43
 
44
44
  {
45
45
  !linkHasError && (
46
- <a href={href} class="text-purple-500 hover:text-purple-700">
46
+ <a href={href} class="text-[rgb(var(--ec-accent))] hover:text-[rgb(var(--ec-accent-hover))]">
47
47
  {slotHTML}
48
48
  </a>
49
49
  )
@@ -9,7 +9,7 @@ const { title } = Astro.props;
9
9
  </span>
10
10
  <h3 class="font-semibold text-lg ml-0">{title}</h3>
11
11
  </div>
12
- <p class="text-gray-500 text-sm ml-4"><slot /></p>
12
+ <p class="text-[rgb(var(--ec-page-text-muted))] text-sm ml-4"><slot /></p>
13
13
  </li>
14
14
 
15
15
  <script>
@@ -26,7 +26,7 @@ const { title } = Astro.props;
26
26
 
27
27
  <style is:global>
28
28
  .step a {
29
- color: #4b5563;
29
+ color: rgb(var(--ec-page-text-muted));
30
30
  text-decoration: underline;
31
31
  &:hover {
32
32
  color: #b977f9;
@@ -19,9 +19,9 @@ function splitByLi(html: string) {
19
19
  const data = splitByLi(html);
20
20
  ---
21
21
 
22
- <div class="bg-white text-gray-800 py-10 pb-0 font-sans not-prose">
23
- {title && <h2 class="text-2xl font-bold text-gray-800 mb-6">{title}</h2>}
24
- <ol class="relative border-l border-gray-200 ml-3">
22
+ <div class="bg-[rgb(var(--ec-page-bg))] text-[rgb(var(--ec-page-text))] py-10 pb-0 font-sans not-prose">
23
+ {title && <h2 class="text-2xl font-bold text-[rgb(var(--ec-page-text))] mb-6">{title}</h2>}
24
+ <ol class="relative border-l border-[rgb(var(--ec-page-border))] ml-3">
25
25
  {data.map((item: any) => <Fragment set:html={item} />)}
26
26
  </ol>
27
27
  </div>
@@ -32,8 +32,8 @@ const tabItems: TabItem[] = await Promise.all(
32
32
  const tabsId = Math.random().toString(36).substring(2, 9);
33
33
  ---
34
34
 
35
- <div class="bg-white text-gray-800 pb-10 not-prose" data-tabs-container={tabsId}>
36
- {title && <h2 class="text-2xl font-bold text-gray-800 mb-6">{title}</h2>}
35
+ <div class="bg-[rgb(var(--ec-page-bg))] text-[rgb(var(--ec-page-text))] pb-10 not-prose" data-tabs-container={tabsId}>
36
+ {title && <h2 class="text-2xl font-bold text-[rgb(var(--ec-page-text))] mb-6">{title}</h2>}
37
37
 
38
38
  {/* Tab List */}
39
39
  <div class="">
@@ -41,7 +41,7 @@ const tabsId = Math.random().toString(36).substring(2, 9);
41
41
  {
42
42
  tabItems.map((item) => (
43
43
  <button
44
- class="whitespace-nowrap py-4 px-1 border-b-2 px-6 font-bold text-sm border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 hover:bg-gray-100 focus:outline-none"
44
+ class="whitespace-nowrap py-4 px-1 border-b-2 px-6 font-bold text-sm border-transparent text-[rgb(var(--ec-page-text-muted))] hover:text-[rgb(var(--ec-page-text))] hover:border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-content-hover))] focus:outline-none tab-button"
45
45
  data-tab={item.id}
46
46
  aria-selected="false"
47
47
  >
@@ -70,22 +70,19 @@ const tabsId = Math.random().toString(36).substring(2, 9);
70
70
  const panels: NodeListOf<HTMLElement> = container.querySelectorAll('[data-tab-content]');
71
71
 
72
72
  // Show first tab by default
73
- tabs[0]?.classList.add('text-purple-600', 'border-purple-600');
74
- tabs[0]?.classList.remove('text-gray-500', 'border-transparent');
73
+ tabs[0]?.classList.add('tab-active');
75
74
  panels[0]?.classList.remove('hidden');
76
75
 
77
76
  tabs.forEach((tab: HTMLButtonElement) => {
78
77
  tab.addEventListener('click', () => {
79
78
  // Remove active states
80
79
  tabs.forEach((t: HTMLButtonElement) => {
81
- t.classList.remove('text-purple-600', 'border-purple-600');
82
- t.classList.add('text-gray-500', 'border-transparent');
80
+ t.classList.remove('tab-active');
83
81
  });
84
82
  panels.forEach((p: HTMLElement) => p.classList.add('hidden'));
85
83
 
86
84
  // Set active states
87
- tab.classList.remove('text-gray-500', 'border-transparent');
88
- tab.classList.add('text-purple-600', 'border-purple-600');
85
+ tab.classList.add('tab-active');
89
86
 
90
87
  // Show corresponding panel
91
88
  const tabId = tab.getAttribute('data-tab');
@@ -103,3 +100,10 @@ const tabsId = Math.random().toString(36).substring(2, 9);
103
100
  });
104
101
  });
105
102
  </script>
103
+
104
+ <style is:global>
105
+ .tab-button.tab-active {
106
+ color: rgb(var(--ec-accent));
107
+ border-color: rgb(var(--ec-accent));
108
+ }
109
+ </style>
@@ -28,31 +28,43 @@ function startsWithProtocol(str: string) {
28
28
  <a
29
29
  href={startsWithProtocol(href) ? href : buildUrl(href)}
30
30
  target={openWindow ? '_blank' : '_self'}
31
- class="block relative bg-white border border-gray-200 rounded-xl p-8 h-48 transition-all duration-300 ease-out hover:border-purple-300 hover:shadow-lg hover:shadow-purple-500/10 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 overflow-hidden"
31
+ class="tile-card block relative bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] border border-[rgb(var(--ec-page-border))] rounded-xl p-8 h-48 transition-all duration-300 ease-out hover:border-[rgb(var(--ec-accent)/0.5)] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 overflow-hidden"
32
32
  >
33
33
  <!-- Icon centered in card with grid background -->
34
34
  <div class="relative h-full flex items-center justify-center">
35
35
  <!-- Squared paper grid behind icon -->
36
- <div
37
- class="absolute inset-0 opacity-15"
38
- style="background-image:
39
- linear-gradient(rgba(147, 51, 234, 0.2) 1px, transparent 1px),
40
- linear-gradient(90deg, rgba(147, 51, 234, 0.2) 1px, transparent 1px);
41
- background-size: 16px 16px;"
42
- >
43
- </div>
44
-
45
- {IconComponent && <IconComponent className="relative w-16 h-16 text-purple-600 stroke-1" />}
36
+ <div class="tile-grid absolute inset-0 opacity-15"></div>
37
+
38
+ {IconComponent && <IconComponent className="tile-icon relative w-16 h-16 stroke-1" />}
46
39
  </div>
47
40
  </a>
48
41
 
49
42
  <!-- Title and description outside card -->
50
43
  <div class="mt-4 space-y-0">
51
- <h2 class="text-gray-900 text-lg font-semibold">
44
+ <h2 class="text-[rgb(var(--ec-page-text))] text-lg font-semibold">
52
45
  {title}
53
46
  </h2>
54
- <p class="text-gray-600 text-sm leading-relaxed">
47
+ <p class="text-[rgb(var(--ec-page-text-muted))] text-sm leading-relaxed">
55
48
  {description}
56
49
  </p>
57
50
  </div>
58
51
  </div>
52
+
53
+ <style>
54
+ .tile-card:hover {
55
+ box-shadow:
56
+ 0 10px 15px -3px rgb(var(--ec-accent) / 0.1),
57
+ 0 4px 6px -4px rgb(var(--ec-accent) / 0.1);
58
+ }
59
+
60
+ .tile-grid {
61
+ background-image:
62
+ linear-gradient(rgb(var(--ec-accent) / 0.2) 1px, transparent 1px),
63
+ linear-gradient(90deg, rgb(var(--ec-accent) / 0.2) 1px, transparent 1px);
64
+ background-size: 16px 16px;
65
+ }
66
+
67
+ .tile-icon {
68
+ color: rgb(var(--ec-accent));
69
+ }
70
+ </style>
@@ -3,7 +3,7 @@ const { title, columns = 2 } = Astro.props;
3
3
  ---
4
4
 
5
5
  <section class="not-prose my-8">
6
- {title && <h2 class="text-2xl font-bold text-gray-800 mb-6">{title}</h2>}
6
+ {title && <h2 class="text-2xl font-bold text-[rgb(var(--ec-page-text))] mb-6">{title}</h2>}
7
7
  <div class={`grid grid-cols-1 md:grid-cols-${columns} gap-6 w-full not-prose`}>
8
8
  <slot />
9
9
  </div>
@@ -1,4 +1,5 @@
1
- import { ChevronUpIcon, ChevronDownIcon, ClipboardDocumentIcon } from '@heroicons/react/24/outline';
1
+ import { ChevronUpIcon, ChevronDownIcon, ClipboardDocumentIcon, CheckIcon } from '@heroicons/react/24/outline';
2
+ import { CommandLineIcon, LockClosedIcon } from '@heroicons/react/24/solid';
2
3
  import type { SchemaItem } from './types';
3
4
 
4
5
  interface ApiAccessSectionProps {
@@ -27,109 +28,113 @@ export default function ApiAccessSection({
27
28
  apiPath = `/api/schemas/${message.collection}/${message.data.id}/${message.data.version}`;
28
29
  }
29
30
 
30
- const curlCommand = typeof window !== 'undefined' ? `curl -X GET "${window.location.origin}${apiPath}"` : '';
31
+ const fullUrl = typeof window !== 'undefined' ? `${window.location.origin}${apiPath}` : apiPath;
32
+ const curlCommand = `curl ${fullUrl}`;
33
+ const isCopied = copiedId === `${message.data.id}-api`;
31
34
 
32
35
  return (
33
- <div className="flex-shrink-0 border-b border-gray-200">
36
+ <div className="flex-shrink-0 border-b border-gray-100">
34
37
  <button
35
38
  onClick={onToggle}
36
- className="w-full flex items-center justify-between px-4 py-1.5 text-left hover:bg-gray-50 transition-colors"
39
+ className="w-full flex items-center justify-between px-4 py-2 text-left hover:bg-gray-50/50 transition-colors"
37
40
  >
38
41
  <div className="flex items-center gap-2">
39
- <svg
40
- xmlns="http://www.w3.org/2000/svg"
41
- className="h-4 w-4 text-gray-600"
42
- fill="none"
43
- viewBox="0 0 24 24"
44
- stroke="currentColor"
45
- >
46
- <path
47
- strokeLinecap="round"
48
- strokeLinejoin="round"
49
- strokeWidth={2}
50
- d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
51
- />
52
- </svg>
53
- <span className="text-xs font-semibold text-gray-900">API Access</span>
54
- <span className="inline-flex items-center rounded-full bg-purple-100 px-2 py-0.5 text-xs font-medium text-purple-800">
55
- Scale
56
- </span>
42
+ <CommandLineIcon className="h-3.5 w-3.5 text-gray-700" />
43
+ <span className="text-xs font-medium text-gray-700">API</span>
44
+ {!apiAccessEnabled && (
45
+ <span className="inline-flex items-center gap-1 rounded bg-[rgb(var(--ec-accent-subtle))] px-1.5 py-0.5 text-[10px] font-medium text-[rgb(var(--ec-accent-text))] border border-[rgb(var(--ec-accent)/0.2)]">
46
+ <LockClosedIcon className="h-2.5 w-2.5" />
47
+ Scale
48
+ </span>
49
+ )}
57
50
  </div>
58
- {isExpanded ? <ChevronUpIcon className="h-4 w-4 text-gray-600" /> : <ChevronDownIcon className="h-4 w-4 text-gray-600" />}
51
+ {isExpanded ? (
52
+ <ChevronUpIcon className="h-3.5 w-3.5 text-gray-400" />
53
+ ) : (
54
+ <ChevronDownIcon className="h-3.5 w-3.5 text-gray-400" />
55
+ )}
59
56
  </button>
60
57
 
61
58
  {isExpanded && (
62
- <div className="px-4 pb-2 bg-gray-50">
59
+ <div className="px-4 pb-3">
63
60
  {apiAccessEnabled ? (
64
- <>
65
- <p className="text-xs text-gray-600 mb-2">Access this schema programmatically via API</p>
66
- <div className="bg-gray-900 rounded-md p-3">
67
- <div className="flex items-start justify-between mb-2">
68
- <span className="text-xs text-gray-400 font-mono">GET</span>
69
- <button
70
- onClick={() => onCopy(curlCommand, `${message.data.id}-api`)}
71
- className="inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-gray-300 hover:text-white transition-colors"
72
- title="Copy curl command"
73
- >
74
- <ClipboardDocumentIcon className="h-3.5 w-3.5" />
75
- {copiedId === `${message.data.id}-api` ? 'Copied!' : 'Copy'}
76
- </button>
77
- </div>
78
- <code className="block text-xs text-green-400 font-mono break-all">{apiPath}</code>
79
- <div className="mt-3 pt-3 border-t border-gray-700">
80
- <p className="text-xs text-gray-400 mb-2">Example:</p>
81
- <code className="block text-xs text-gray-300 font-mono whitespace-pre-wrap break-all">{curlCommand}</code>
82
- </div>
61
+ <div className="space-y-2">
62
+ {/* Endpoint */}
63
+ <div className="flex items-center gap-2 bg-gray-900 rounded-md px-3 py-2">
64
+ <span className="text-[10px] font-semibold text-emerald-400 uppercase tracking-wide">GET</span>
65
+ <code className="flex-1 text-[11px] text-gray-300 font-mono truncate">{apiPath}</code>
66
+ <button
67
+ onClick={() => onCopy(fullUrl, `${message.data.id}-api`)}
68
+ className={`flex-shrink-0 p-1 rounded transition-colors ${
69
+ isCopied ? 'text-emerald-400' : 'text-gray-500 hover:text-gray-300'
70
+ }`}
71
+ title="Copy URL"
72
+ >
73
+ {isCopied ? <CheckIcon className="h-3.5 w-3.5" /> : <ClipboardDocumentIcon className="h-3.5 w-3.5" />}
74
+ </button>
75
+ </div>
76
+
77
+ {/* Quick copy buttons */}
78
+ <div className="flex items-center gap-2">
79
+ <button
80
+ onClick={() => onCopy(curlCommand, `${message.data.id}-curl`)}
81
+ className={`inline-flex items-center gap-1.5 px-2 py-1 text-[10px] font-medium rounded border transition-colors ${
82
+ copiedId === `${message.data.id}-curl`
83
+ ? 'bg-emerald-50 text-emerald-600 border-emerald-200'
84
+ : 'text-gray-500 border-gray-200 hover:bg-gray-50 hover:text-gray-700'
85
+ }`}
86
+ >
87
+ {copiedId === `${message.data.id}-curl` ? (
88
+ <>
89
+ <CheckIcon className="h-3 w-3" />
90
+ Copied
91
+ </>
92
+ ) : (
93
+ <>
94
+ <ClipboardDocumentIcon className="h-3 w-3" />
95
+ Copy cURL
96
+ </>
97
+ )}
98
+ </button>
99
+ <button
100
+ onClick={() => onCopy(fullUrl, `${message.data.id}-url`)}
101
+ className={`inline-flex items-center gap-1.5 px-2 py-1 text-[10px] font-medium rounded border transition-colors ${
102
+ copiedId === `${message.data.id}-url`
103
+ ? 'bg-emerald-50 text-emerald-600 border-emerald-200'
104
+ : 'text-gray-500 border-gray-200 hover:bg-gray-50 hover:text-gray-700'
105
+ }`}
106
+ >
107
+ {copiedId === `${message.data.id}-url` ? (
108
+ <>
109
+ <CheckIcon className="h-3 w-3" />
110
+ Copied
111
+ </>
112
+ ) : (
113
+ <>
114
+ <ClipboardDocumentIcon className="h-3 w-3" />
115
+ Copy URL
116
+ </>
117
+ )}
118
+ </button>
83
119
  </div>
84
- </>
120
+ </div>
85
121
  ) : (
86
- <div className="bg-white border border-purple-200 rounded-md p-4">
87
- <div className="flex items-start gap-3">
88
- <div className="flex-shrink-0">
89
- <svg
90
- xmlns="http://www.w3.org/2000/svg"
91
- className="h-5 w-5 text-purple-600"
92
- fill="none"
93
- viewBox="0 0 24 24"
94
- stroke="currentColor"
95
- >
96
- <path
97
- strokeLinecap="round"
98
- strokeLinejoin="round"
99
- strokeWidth={2}
100
- d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
101
- />
102
- </svg>
103
- </div>
104
- <div className="flex-1">
105
- <h4 className="text-sm font-semibold text-gray-900 mb-1">Upgrade to Scale</h4>
106
- <p className="text-xs text-gray-600 mb-3">
107
- Access your schemas programmatically via API. Perfect for CI/CD pipelines, automation, and integrations.
108
- </p>
109
- <a
110
- href="https://eventcatalog.cloud"
111
- target="_blank"
112
- rel="noopener noreferrer"
113
- className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-white bg-purple-600 rounded-md hover:bg-purple-700 transition-colors"
114
- >
115
- Start 14-day free trial
116
- <svg
117
- xmlns="http://www.w3.org/2000/svg"
118
- className="h-3.5 w-3.5"
119
- fill="none"
120
- viewBox="0 0 24 24"
121
- stroke="currentColor"
122
- >
123
- <path
124
- strokeLinecap="round"
125
- strokeLinejoin="round"
126
- strokeWidth={2}
127
- d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
128
- />
129
- </svg>
130
- </a>
131
- </div>
122
+ <div className="flex items-center justify-between gap-3 bg-[rgb(var(--ec-accent-subtle))] border border-[rgb(var(--ec-accent)/0.2)] rounded-md px-3 py-2.5">
123
+ <div className="flex-1 min-w-0">
124
+ <p className="text-xs font-medium text-gray-700">Access schemas via API</p>
125
+ <p className="text-[10px] text-gray-500 mt-0.5">CI/CD, automation & integrations</p>
132
126
  </div>
127
+ <a
128
+ href="https://eventcatalog.cloud"
129
+ target="_blank"
130
+ rel="noopener noreferrer"
131
+ className="flex-shrink-0 inline-flex items-center gap-1 px-2.5 py-1.5 text-[11px] font-medium text-white bg-[rgb(var(--ec-accent))] rounded-md hover:bg-[rgb(var(--ec-accent-hover))] transition-colors"
132
+ >
133
+ Try Scale
134
+ <svg xmlns="http://www.w3.org/2000/svg" className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
135
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
136
+ </svg>
137
+ </a>
133
138
  </div>
134
139
  )}
135
140
  </div>