@eventcatalog/core 3.30.0 → 3.31.1

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 (69) hide show
  1. package/dist/analytics/analytics.cjs +1 -1
  2. package/dist/analytics/analytics.js +2 -2
  3. package/dist/analytics/log-build.cjs +1 -1
  4. package/dist/analytics/log-build.js +3 -3
  5. package/dist/{chunk-6UG4JMUV.js → chunk-7IGMIOQF.js} +1 -1
  6. package/dist/{chunk-Z26P4PCB.js → chunk-HVOLSUC2.js} +1 -1
  7. package/dist/{chunk-RRBDF4MM.js → chunk-LWVHWR77.js} +1 -1
  8. package/dist/{chunk-MVZKHUX2.js → chunk-QIJOBQZ7.js} +1 -1
  9. package/dist/{chunk-ATRBVTJ6.js → chunk-UY5QDWK7.js} +1 -1
  10. package/dist/constants.cjs +1 -1
  11. package/dist/constants.js +1 -1
  12. package/dist/eventcatalog.cjs +1 -1
  13. package/dist/eventcatalog.js +5 -5
  14. package/dist/generate.cjs +1 -1
  15. package/dist/generate.js +3 -3
  16. package/dist/utils/cli-logger.cjs +1 -1
  17. package/dist/utils/cli-logger.js +2 -2
  18. package/eventcatalog/astro.config.mjs +10 -6
  19. package/eventcatalog/public/logo.png +0 -0
  20. package/eventcatalog/src/components/CopyAsMarkdown.tsx +29 -24
  21. package/eventcatalog/src/components/MDX/Design/Design.astro +1 -1
  22. package/eventcatalog/src/components/MDX/Tiles/Tile.astro +11 -8
  23. package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +218 -0
  24. package/eventcatalog/src/components/Settings/BillingSettingsForm.tsx +265 -0
  25. package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +371 -0
  26. package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +183 -0
  27. package/eventcatalog/src/components/Settings/LogoUpload.tsx +137 -0
  28. package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +91 -0
  29. package/eventcatalog/src/components/Settings/ReadOnlyBanner.tsx +18 -0
  30. package/eventcatalog/src/components/Settings/Row.tsx +59 -0
  31. package/eventcatalog/src/components/Settings/SettingsShared.tsx +176 -0
  32. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +17 -18
  33. package/eventcatalog/src/components/Tables/Discover/DiscoverTable.tsx +45 -16
  34. package/eventcatalog/src/components/Tables/Discover/FilterComponents.tsx +2 -2
  35. package/eventcatalog/src/content.config.ts +1 -1
  36. package/eventcatalog/src/enterprise/auth/middleware/middleware-auth.ts +11 -7
  37. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/index.tsx +4 -4
  38. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/index.astro +70 -57
  39. package/eventcatalog/src/enterprise/feature.ts +2 -1
  40. package/eventcatalog/src/layouts/SettingsLayout.astro +116 -0
  41. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +62 -23
  42. package/eventcatalog/src/pages/_index.astro +250 -255
  43. package/eventcatalog/src/pages/api/settings/ai.ts +57 -0
  44. package/eventcatalog/src/pages/api/settings/general.ts +71 -0
  45. package/eventcatalog/src/pages/api/settings/logo.ts +113 -0
  46. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -1
  47. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +26 -32
  48. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +1 -1
  49. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +40 -31
  50. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +1 -1
  51. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +2 -26
  52. package/eventcatalog/src/pages/docs/llm/llms.txt.ts +5 -1
  53. package/eventcatalog/src/pages/docs/users/[id]/index.astro +1 -1
  54. package/eventcatalog/src/pages/settings/assistant.astro +37 -0
  55. package/eventcatalog/src/pages/settings/billing.astro +17 -0
  56. package/eventcatalog/src/pages/settings/general.astro +32 -0
  57. package/eventcatalog/src/pages/settings/index.astro +21 -0
  58. package/eventcatalog/src/pages/settings/llm-access.astro +34 -0
  59. package/eventcatalog/src/pages/settings/mcp.astro +14 -0
  60. package/eventcatalog/src/styles/theme.css +38 -29
  61. package/eventcatalog/src/styles/themes/forest.css +17 -9
  62. package/eventcatalog/src/styles/themes/ocean.css +10 -2
  63. package/eventcatalog/src/styles/themes/sapphire.css +10 -2
  64. package/eventcatalog/src/styles/themes/sunset.css +25 -17
  65. package/eventcatalog/src/utils/eventcatalog-config/config-schema.ts +49 -0
  66. package/eventcatalog/src/utils/eventcatalog-config/config-writer.ts +149 -0
  67. package/eventcatalog/src/utils/url-builder.ts +4 -2
  68. package/package.json +7 -5
  69. package/eventcatalog/src/pages/docs/llm/llms-services.txt.ts +0 -81
@@ -37,7 +37,7 @@ var import_axios = __toESM(require("axios"), 1);
37
37
  var import_os = __toESM(require("os"), 1);
38
38
 
39
39
  // package.json
40
- var version = "3.30.0";
40
+ var version = "3.31.1";
41
41
 
42
42
  // src/constants.ts
43
43
  var VERSION = version;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  raiseEvent
3
- } from "../chunk-MVZKHUX2.js";
4
- import "../chunk-ATRBVTJ6.js";
3
+ } from "../chunk-QIJOBQZ7.js";
4
+ import "../chunk-UY5QDWK7.js";
5
5
  export {
6
6
  raiseEvent
7
7
  };
@@ -111,7 +111,7 @@ var import_axios = __toESM(require("axios"), 1);
111
111
  var import_os = __toESM(require("os"), 1);
112
112
 
113
113
  // package.json
114
- var version = "3.30.0";
114
+ var version = "3.31.1";
115
115
 
116
116
  // src/constants.ts
117
117
  var VERSION = version;
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  log_build_default
3
- } from "../chunk-6UG4JMUV.js";
4
- import "../chunk-MVZKHUX2.js";
3
+ } from "../chunk-7IGMIOQF.js";
4
+ import "../chunk-QIJOBQZ7.js";
5
5
  import "../chunk-4UVFXLPI.js";
6
- import "../chunk-ATRBVTJ6.js";
6
+ import "../chunk-UY5QDWK7.js";
7
7
  import "../chunk-5T63CXKU.js";
8
8
  export {
9
9
  log_build_default as default
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  raiseEvent
3
- } from "./chunk-MVZKHUX2.js";
3
+ } from "./chunk-QIJOBQZ7.js";
4
4
  import {
5
5
  countResources,
6
6
  serializeCounts
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-ATRBVTJ6.js";
3
+ } from "./chunk-UY5QDWK7.js";
4
4
 
5
5
  // src/utils/cli-logger.ts
6
6
  import pc from "picocolors";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  logger
3
- } from "./chunk-Z26P4PCB.js";
3
+ } from "./chunk-HVOLSUC2.js";
4
4
  import {
5
5
  cleanup,
6
6
  getEventCatalogConfigFile
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-ATRBVTJ6.js";
3
+ } from "./chunk-UY5QDWK7.js";
4
4
 
5
5
  // src/analytics/analytics.js
6
6
  import axios from "axios";
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "3.30.0";
2
+ var version = "3.31.1";
3
3
 
4
4
  // src/constants.ts
5
5
  var VERSION = version;
@@ -25,7 +25,7 @@ __export(constants_exports, {
25
25
  module.exports = __toCommonJS(constants_exports);
26
26
 
27
27
  // package.json
28
- var version = "3.30.0";
28
+ var version = "3.31.1";
29
29
 
30
30
  // src/constants.ts
31
31
  var VERSION = version;
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-ATRBVTJ6.js";
3
+ } from "./chunk-UY5QDWK7.js";
4
4
  export {
5
5
  VERSION
6
6
  };
@@ -114,7 +114,7 @@ var verifyRequiredFieldsAreInCatalogConfigFile = async (projectDirectory) => {
114
114
  var import_picocolors = __toESM(require("picocolors"), 1);
115
115
 
116
116
  // package.json
117
- var version = "3.30.0";
117
+ var version = "3.31.1";
118
118
 
119
119
  // src/constants.ts
120
120
  var VERSION = version;
@@ -6,8 +6,8 @@ import {
6
6
  } from "./chunk-K3ZVEX2Y.js";
7
7
  import {
8
8
  log_build_default
9
- } from "./chunk-6UG4JMUV.js";
10
- import "./chunk-MVZKHUX2.js";
9
+ } from "./chunk-7IGMIOQF.js";
10
+ import "./chunk-QIJOBQZ7.js";
11
11
  import "./chunk-4UVFXLPI.js";
12
12
  import {
13
13
  runMigrations
@@ -22,13 +22,13 @@ import {
22
22
  } from "./chunk-3KXCGYET.js";
23
23
  import {
24
24
  generate
25
- } from "./chunk-RRBDF4MM.js";
25
+ } from "./chunk-LWVHWR77.js";
26
26
  import {
27
27
  logger
28
- } from "./chunk-Z26P4PCB.js";
28
+ } from "./chunk-HVOLSUC2.js";
29
29
  import {
30
30
  VERSION
31
- } from "./chunk-ATRBVTJ6.js";
31
+ } from "./chunk-UY5QDWK7.js";
32
32
  import {
33
33
  getEventCatalogConfigFile,
34
34
  verifyRequiredFieldsAreInCatalogConfigFile
package/dist/generate.cjs CHANGED
@@ -78,7 +78,7 @@ var getEventCatalogConfigFile = async (projectDirectory) => {
78
78
  var import_picocolors = __toESM(require("picocolors"), 1);
79
79
 
80
80
  // package.json
81
- var version = "3.30.0";
81
+ var version = "3.31.1";
82
82
 
83
83
  // src/constants.ts
84
84
  var VERSION = version;
package/dist/generate.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  generate
3
- } from "./chunk-RRBDF4MM.js";
4
- import "./chunk-Z26P4PCB.js";
5
- import "./chunk-ATRBVTJ6.js";
3
+ } from "./chunk-LWVHWR77.js";
4
+ import "./chunk-HVOLSUC2.js";
5
+ import "./chunk-UY5QDWK7.js";
6
6
  import "./chunk-5T63CXKU.js";
7
7
  export {
8
8
  generate
@@ -36,7 +36,7 @@ module.exports = __toCommonJS(cli_logger_exports);
36
36
  var import_picocolors = __toESM(require("picocolors"), 1);
37
37
 
38
38
  // package.json
39
- var version = "3.30.0";
39
+ var version = "3.31.1";
40
40
 
41
41
  // src/constants.ts
42
42
  var VERSION = version;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  logger
3
- } from "../chunk-Z26P4PCB.js";
4
- import "../chunk-ATRBVTJ6.js";
3
+ } from "../chunk-HVOLSUC2.js";
4
+ import "../chunk-UY5QDWK7.js";
5
5
  export {
6
6
  logger
7
7
  };
@@ -27,6 +27,8 @@ const projectDirectory = process.env.PROJECT_DIR || process.cwd();
27
27
  const base = config.base || '/';
28
28
  const host = config.host || false;
29
29
  const compress = config.compress ?? false;
30
+ const isDevMode = process.env.EVENTCATALOG_DEV_MODE === 'true';
31
+ const effectiveOutput = isDevMode ? 'server' : (config.output || 'static');
30
32
 
31
33
 
32
34
  const expressiveCodeConfig = {
@@ -41,11 +43,13 @@ export default defineConfig({
41
43
  base,
42
44
  server: { port: config.port || 3000, host: host },
43
45
 
44
- output: config.output || 'static',
46
+ // In dev mode (EVENTCATALOG_DEV_MODE=true) we need 'server' output so that
47
+ // routes which opt into SSR via `export const prerender = false` (e.g. the
48
+ // /api/settings/* editing endpoints) are actually invoked instead of being
49
+ // statically prerendered. Production builds keep the user's configured output.
50
+ output: effectiveOutput,
45
51
 
46
- adapter: config.output === 'server' ? node({
47
- mode: 'standalone'
48
- }) : undefined,
52
+ adapter: effectiveOutput === 'server' ? node({ mode: 'standalone' }) : undefined,
49
53
 
50
54
  outDir: config.outDir ? join(projectDirectory, config.outDir) : join(projectDirectory, 'dist'),
51
55
 
@@ -83,7 +87,7 @@ export default defineConfig({
83
87
  ],
84
88
  gfm: true,
85
89
  }),
86
- config.output !== 'server' && compress && (await import("astro-compress")).default({
90
+ effectiveOutput !== 'server' && compress && (await import("astro-compress")).default({
87
91
  Logger: 0,
88
92
  CSS: false,
89
93
  }),
@@ -99,7 +103,7 @@ export default defineConfig({
99
103
  * the eventcatalog.config, as the config use packages that only run in node environments,
100
104
  * such as `node:path`.
101
105
  */
102
- '__EC_TRAILING_SLASH__': config.trailingSlash || false,
106
+ '__EC_TRAILING_SLASH__': JSON.stringify(config.trailingSlash === true),
103
107
  '__EC_BASE__': JSON.stringify(base),
104
108
  },
105
109
  server: {
Binary file
@@ -36,17 +36,21 @@ const MenuItemContent = ({
36
36
  } else {
37
37
  // It must be an ElementType (component constructor like Lucide icon)
38
38
  const IconComponent = iconProp as React.ElementType;
39
- iconElement = <IconComponent className="w-5 h-5 text-[rgb(var(--ec-icon-color))]" />;
39
+ iconElement = <IconComponent className="w-4 h-4 text-[rgb(var(--ec-icon-color))]" />;
40
40
  }
41
41
 
42
42
  return (
43
- <div className="flex items-center gap-3 px-3 py-2 text-sm">
44
- <div className="p-1 border border-[rgb(var(--ec-dropdown-border))] rounded">{iconElement}</div>
45
- <div className="flex-1">
46
- <div className="font-medium text-[rgb(var(--ec-dropdown-text))]">{title}</div>
47
- <div className="text-xs text-[rgb(var(--ec-content-text-muted))]">{description}</div>
43
+ <div className="flex items-center gap-2.5 rounded-lg px-2 py-1.5 text-sm">
44
+ <div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-[rgb(var(--ec-dropdown-border)/0.8)] bg-[rgb(var(--ec-page-bg))]">
45
+ {iconElement}
46
+ </div>
47
+ <div className="flex-1 min-w-0">
48
+ <div className="flex items-center gap-1.5 text-sm font-medium leading-5 text-[rgb(var(--ec-dropdown-text))]">
49
+ <span>{title}</span>
50
+ {external && <ExternalLink className="h-3.5 w-3.5 shrink-0 text-[rgb(var(--ec-icon-color))]" />}
51
+ </div>
52
+ <div className="text-xs leading-4 text-[rgb(var(--ec-content-text-muted))]">{description}</div>
48
53
  </div>
49
- {external && <ExternalLink className="w-4 h-4 text-[rgb(var(--ec-icon-color))]" />}
50
54
  </div>
51
55
  );
52
56
  };
@@ -158,6 +162,7 @@ export function CopyPageMenu({
158
162
  };
159
163
 
160
164
  const defaultAction = getDefaultAction();
165
+ const [open, setOpen] = useState(false);
161
166
  const [buttonText, setButtonText] = useState(defaultAction?.text || 'Action');
162
167
 
163
168
  // Fetch the markdown from the url + .mdx
@@ -232,40 +237,40 @@ export function CopyPageMenu({
232
237
  }
233
238
 
234
239
  return (
235
- <DropdownMenu.Root>
240
+ <DropdownMenu.Root open={open} onOpenChange={setOpen}>
236
241
  {/* Container for the split button */}
237
- <div className="inline-flex rounded-md shadow-xs border border-[rgb(var(--ec-dropdown-border))]">
242
+ <div className="inline-flex h-8 items-stretch overflow-hidden rounded-md border border-[rgb(var(--ec-dropdown-border)/0.75)] bg-[rgb(var(--ec-page-bg))]">
238
243
  {/* Left Button: Default Action */}
239
244
  <button
240
245
  type="button"
241
246
  onClick={handleDefaultAction}
242
- className="inline-flex items-center justify-center gap-2 whitespace-nowrap px-4 py-1.5 text-sm font-medium text-[rgb(var(--ec-dropdown-text))] bg-[rgb(var(--ec-page-bg))] rounded-l-md hover:bg-[rgb(var(--ec-dropdown-hover))] focus:z-10 focus:outline-hidden focus:ring-1 focus:ring-[rgb(var(--ec-accent))]"
247
+ className="inline-flex h-full items-center justify-center gap-2 whitespace-nowrap bg-transparent pl-4 pr-3 text-sm font-medium text-[rgb(var(--ec-dropdown-text))] transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover)/0.75)] focus:z-10 focus:outline-hidden focus:ring-1 focus:ring-[rgb(var(--ec-accent))]"
243
248
  >
244
- <defaultAction.icon className="w-4 h-4" />
249
+ <defaultAction.icon className="h-4 w-4" />
245
250
  {buttonText}
246
251
  </button>
247
252
  {/* Right Button: Dropdown Trigger */}
248
253
  <DropdownMenu.Trigger asChild>
249
254
  <button
250
255
  type="button"
251
- className="inline-flex items-center justify-center px-2.5 py-1.5 text-sm font-medium text-[rgb(var(--ec-icon-color))] bg-[rgb(var(--ec-page-bg))] rounded-r-md border-l border-[rgb(var(--ec-dropdown-border))] hover:bg-[rgb(var(--ec-dropdown-hover))] focus:z-10 focus:outline-hidden focus:ring-1 focus:ring-[rgb(var(--ec-accent))]"
256
+ className="inline-flex h-full w-8 items-center justify-center border-l border-[rgb(var(--ec-dropdown-border)/0.75)] bg-transparent text-sm font-medium text-[rgb(var(--ec-icon-color))] transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover)/0.75)] focus:z-10 focus:outline-hidden focus:ring-1 focus:ring-[rgb(var(--ec-accent))]"
252
257
  aria-label="More options"
253
258
  >
254
- <ChevronDownIcon className="w-4 h-4" />
259
+ <ChevronDownIcon className={`h-4 w-4 transition-transform duration-200 ${open ? 'rotate-180' : ''}`} />
255
260
  </button>
256
261
  </DropdownMenu.Trigger>
257
262
  </div>
258
263
 
259
264
  {/* Adjust styling for the content dropdown */}
260
265
  <DropdownMenu.Content
261
- className="w-72 bg-[rgb(var(--ec-dropdown-bg))] rounded-lg shadow-lg border border-[rgb(var(--ec-dropdown-border))] mt-1 py-1"
262
- sideOffset={5}
266
+ className="z-50 w-72 max-w-[calc(100vw-1.5rem)] rounded-2xl border border-[rgb(var(--ec-dropdown-border)/0.8)] bg-[rgb(var(--ec-page-bg))] px-1.5 py-1.5 shadow-[0_24px_64px_rgb(0_0_0/0.35)]"
267
+ sideOffset={10}
263
268
  align="end"
264
269
  >
265
270
  {availableActions.chat && (
266
271
  <>
267
272
  <DropdownMenu.Item
268
- className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-hidden focus:bg-[rgb(var(--ec-dropdown-hover))]"
273
+ className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
269
274
  onSelect={() => window.dispatchEvent(new CustomEvent('eventcatalog:open-chat'))}
270
275
  >
271
276
  <MenuItemContent
@@ -274,13 +279,13 @@ export function CopyPageMenu({
274
279
  description="Ask questions about this page"
275
280
  />
276
281
  </DropdownMenu.Item>
277
- <DropdownMenu.Separator className="h-px my-1 bg-[rgb(var(--ec-dropdown-border))]" />
282
+ <DropdownMenu.Separator className="mx-3 my-3 h-px bg-[rgb(var(--ec-dropdown-border)/0.8)]" />
278
283
  </>
279
284
  )}
280
285
 
281
286
  {availableActions.copyMarkdown && (
282
287
  <DropdownMenu.Item
283
- className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-hidden focus:bg-[rgb(var(--ec-dropdown-hover))]"
288
+ className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
284
289
  onSelect={() => copyMarkdownToClipboard()}
285
290
  >
286
291
  <MenuItemContent icon={Copy} title="Copy page" description="Copy page as Markdown for LLMs" />
@@ -312,7 +317,7 @@ export function CopyPageMenu({
312
317
  return (
313
318
  <DropdownMenu.Item
314
319
  key={schema.url}
315
- className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-hidden focus:bg-[rgb(var(--ec-dropdown-hover))]"
320
+ className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
316
321
  onSelect={() => copySchemaToClipboard(schema)}
317
322
  >
318
323
  <MenuItemContent icon={Icon} title={title} description={`Copy ${type} to clipboard`} />
@@ -322,7 +327,7 @@ export function CopyPageMenu({
322
327
 
323
328
  {availableActions.viewMarkdown && (
324
329
  <DropdownMenu.Item
325
- className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-hidden focus:bg-[rgb(var(--ec-dropdown-hover))]"
330
+ className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
326
331
  onSelect={() => window.open(markdownUrl, '_blank')}
327
332
  >
328
333
  <MenuItemContent
@@ -336,7 +341,7 @@ export function CopyPageMenu({
336
341
 
337
342
  {availableActions.rssFeed && (
338
343
  <DropdownMenu.Item
339
- className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-hidden focus:bg-[rgb(var(--ec-dropdown-hover))]"
344
+ className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
340
345
  onSelect={() => window.open(buildUrl(`/rss/all/rss.xml`), '_blank')}
341
346
  >
342
347
  <MenuItemContent icon={RssIcon} title="RSS Feed" description="View this page as RSS feed" external={true} />
@@ -345,7 +350,7 @@ export function CopyPageMenu({
345
350
 
346
351
  {availableActions.exportPDF && (
347
352
  <DropdownMenu.Item
348
- className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-hidden focus:bg-[rgb(var(--ec-dropdown-hover))]"
353
+ className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
349
354
  onSelect={() => window.open(printUrl, '_blank')}
350
355
  >
351
356
  <MenuItemContent icon={PrinterIcon} title="Export to PDF" description="Open print-friendly version" external={true} />
@@ -354,9 +359,9 @@ export function CopyPageMenu({
354
359
 
355
360
  {availableActions.editPage && (
356
361
  <>
357
- <DropdownMenu.Separator className="h-px my-1 bg-[rgb(var(--ec-dropdown-border))]" />
362
+ <DropdownMenu.Separator className="mx-3 my-3 h-px bg-[rgb(var(--ec-dropdown-border)/0.8)]" />
358
363
  <DropdownMenu.Item
359
- className="cursor-pointer hover:bg-[rgb(var(--ec-dropdown-hover))] focus:outline-hidden focus:bg-[rgb(var(--ec-dropdown-hover))]"
364
+ className="cursor-pointer rounded-2xl outline-hidden transition-colors duration-150 hover:bg-[rgb(var(--ec-dropdown-hover))] data-[highlighted]:bg-[rgb(var(--ec-dropdown-hover))]"
360
365
  onSelect={() => window.open(editUrl, '_blank')}
361
366
  >
362
367
  <MenuItemContent
@@ -46,7 +46,7 @@ const nodesWithLayout = design ? applyLayoutToNodes(design.nodes || [], savedLay
46
46
  design && (
47
47
  <div>
48
48
  <div
49
- class="h-[30em] my-6 mb-12 w-full relative border border-gray-200 rounded-md"
49
+ class="h-[30em] my-6 mb-12 w-full relative border border-[rgb(var(--ec-page-border))] rounded-md"
50
50
  id={`${id}-portal`}
51
51
  style={{
52
52
  maxHeight: maxHeight ? `${maxHeight}em` : `30em`,
@@ -28,13 +28,13 @@ function startsWithProtocol(str: string) {
28
28
  <a
29
29
  href={startsWithProtocol(href) ? href : buildUrl(href)}
30
30
  target={openWindow ? '_blank' : '_self'}
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-hidden focus:ring-2 focus:ring-[rgb(var(--ec-accent))] 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 h-48 transition-all duration-300 ease-out hover:border-[rgb(var(--ec-accent)/0.5)] focus:outline-hidden focus:ring-2 focus:ring-[rgb(var(--ec-accent))] focus:ring-offset-2 overflow-hidden"
32
32
  >
33
- <!-- Icon centered in card with grid background -->
34
- <div class="relative h-full flex items-center justify-center">
35
- <!-- Squared paper grid behind icon -->
36
- <div class="tile-grid absolute inset-0 opacity-15"></div>
33
+ <!-- Squared paper grid spans the full card -->
34
+ <div class="tile-grid absolute inset-0"></div>
37
35
 
36
+ <!-- Icon centered in card -->
37
+ <div class="relative h-full flex items-center justify-center p-8">
38
38
  {IconComponent && <IconComponent className="tile-icon relative w-16 h-16 stroke-1" />}
39
39
  </div>
40
40
  </a>
@@ -59,9 +59,12 @@ function startsWithProtocol(str: string) {
59
59
 
60
60
  .tile-grid {
61
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;
62
+ linear-gradient(rgb(var(--ec-accent) / 0.1) 1px, transparent 1px),
63
+ linear-gradient(90deg, rgb(var(--ec-accent) / 0.1) 1px, transparent 1px);
64
+ background-size: 28px 28px;
65
+ /* Soft edge fade — full-width grid that softens just at the borders */
66
+ -webkit-mask-image: radial-gradient(ellipse at center, black 60%, transparent 100%);
67
+ mask-image: radial-gradient(ellipse at center, black 60%, transparent 100%);
65
68
  }
66
69
 
67
70
  .tile-icon {