Skip to content

9.0.0-beta.5

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Jun 07:08
· 70 commits to main since this release
9e1dd95

@comet/admin@9.0.0-beta.5

Patch Changes

  • fdabaf1: Fix MainContent with fullHeight growing past the viewport after returning from a scrolled detail page

    useTopOffset used getBoundingClientRect().top, which is viewport-relative. When navigating back from a scrolled page, the browser could restore the previous scroll position before the offset was measured, producing a too-small offset and a calc(100vh - topOffset) larger than the viewport. The offset is now measured relative to the document by adding window.scrollY.

@comet/cms-admin@9.0.0-beta.5

Minor Changes

  • c0cee12: Add placeholders option to createTipTapRichTextBlock that allows inserting pre-defined placeholder tokens into the rich text editor. Placeholders are rendered as non-editable chips and can only be removed as a whole unit.
  • 8cb0844: Export isLinkTarget and validateLinkTarget
  • 8ad9dd8: Add support for deleting multiple redirects in the grid

Patch Changes

  • 3cbf0ff: Show ArchivedTag next to the title on the DAM file detail page

    Previously the archived state was only visible in the DAM file list, which could be confusing when opening an archived file's detail page via link.

  • 5d006c1: Fix 1-NaN of NaN pagination footer and rowCount warning in DAM FolderDataGrid

    The grid now routes totalCount through useBufferedRowCount, so rowCount stays a number across refetches instead of becoming undefined while data is loading.

@comet/agent-features@9.0.0-beta.5

Minor Changes

  • ca5b0fa: Add @comet/agent-features package containing skills and rules for AI coding agents

@comet/cms-api@9.0.0-beta.5

Minor Changes

  • c0cee12: Add placeholders option to createTipTapRichTextBlock that allows inserting pre-defined placeholder tokens into the rich text editor. Placeholders are rendered as non-editable chips and can only be removed as a whole unit.
  • 9d5f045: Add a urlTemplate field resolver to FileImagesResolver
  • b0ceb9c: Export IsLinkTarget validator
  • 8ad9dd8: Add support for deleting multiple redirects in the grid

Patch Changes

  • 6b7adc7: Fix damFilesList returning no files in subfolders when filtering by ids

    damFilesList implicitly constrains to the scope root when no folderId is passed. The constraint already had an escape hatch for filter.searchText; the same now applies to filter.ids. Resolving a selection via filter: { ids: ... } returns all matching files regardless of which folder they live in, which unblocks the admin FileField multi-select for files in subfolders.

  • a2c2eb5: Log the reason when a permission check denies access

    AbstractAccessControlService.isEqualOrMorePermissions now emits a NestJS Logger.debug line identifying the missing permission or content scope whenever it returns false. The impersonationAllowed resolver field additionally logs when a user attempts to impersonate themselves.

@comet/cli@9.0.0-beta.5

Minor Changes

  • 644b4ee: Add node_modules skills and rules discovery to install-agent-features command

    The command now scans direct dependencies in node_modules (including @scoped packages) for skills/ and rules/ directories and creates symlinks to agent-specific directories. This is compatible with the npm-based Agent Skills convention and extends it to also support rules.

@comet/eslint-config@9.0.0-beta.5

Major Changes

  • f51972c: Enable @graphql-eslint/naming-convention in react.js and nextjs.js

    GraphQL code generation appends the operation kind (Fragment, Query, Mutation, Subscription) to the generated TypeScript type name. Naming an operation FooFragment / FooQuery therefore produces duplicated types like GQLFooFragmentFragment / GQLFooQueryQuery. The @graphql-eslint/naming-convention rule from @graphql-eslint/eslint-plugin reports such names inside gql/graphql-tagged template literals.

@comet/mail-react@9.0.0-beta.5

Major Changes

  • 568ee9a: MjmlImage is now responsive by default

    The inner <img> height scales to auto below the default breakpoint instead of staying at its declared pixel value, so the image keeps its aspect ratio as its width shrinks on narrow viewports.

  • f503e9e: MjmlDivider now supports variant, height, backgroundColor, and backgroundImage props, configured through theme.divider

    • theme.divider defines the default height and backgroundColor

    • theme.divider.variants overrides those values for named variants, optionally with per-breakpoint responsive values

    • theme.divider.backgroundImage (typically a gradient) overlays the bar while backgroundColor stays as the solid fallback for clients that don't render gradients

    • Per-instance height, backgroundColor, and backgroundImage props override the resolved theme/variant values

      Example theme

      import { createTheme } from "@comet/mail-react";
      
      const theme = createTheme({
          divider: {
              defaultVariant: "thin",
              variants: {
                  thin: { height: "1px", backgroundColor: "#999999" },
                  thick: { height: { default: "12px", mobile: "8px" }, backgroundColor: "#222222" },
                  gradient: {
                      backgroundColor: "#5B4FC7",
                      backgroundImage: "linear-gradient(to right, #5B4FC7, #FF6B6B, #FFD166)",
                  },
              },
          },
      });
      
      declare module "@comet/mail-react" {
          interface DividerVariants {
              thin: true;
              thick: true;
              gradient: true;
          }
      }

      Usage:

      import { MjmlDivider, MjmlMailRoot } from "@comet/mail-react";
      
      <MjmlMailRoot theme={theme}>
          <MjmlSection>
              <MjmlColumn>
                  <MjmlDivider />
                  <MjmlDivider variant="thick" />
                  <MjmlDivider variant="gradient" />
                  <MjmlDivider height="2px" backgroundColor="#FF0000" />
              </MjmlColumn>
          </MjmlSection>
      </MjmlMailRoot>;

      Breaking changes

    • The MjmlDivider prop surface no longer accepts borderWidth, borderColor, borderStyle, padding and its variants, width, containerBackgroundColor, align, or cssClass. Migrate borderWidth to height and borderColor to backgroundColor, either per-call or on theme.divider.

    • MjmlDivider no longer applies any default padding around the divider. Add spacing through the surrounding section or column (for example with MjmlSpacer).

    • <MjmlAttributes><MjmlDivider … /></MjmlAttributes> no longer sets defaults for MjmlDivider. Configure defaults through theme.divider instead.

Minor Changes

  • f503e9e: Add HtmlDivider component for rendering a themed divider inside MJML ending tags or outside the MJML context

    HtmlDivider reads height, backgroundColor, and backgroundImage from theme.divider, and supports named variants with per-breakpoint responsive overrides — the same shape as theme.text. Per-instance height, backgroundColor, and backgroundImage props override the resolved theme/variant values. A backgroundImage (typically a gradient) overlays the bar while backgroundColor stays as the solid fallback for clients that don't render gradients.

    import { HtmlDivider } from "@comet/mail-react";
    
    <MjmlRaw>
        <HtmlDivider />
        <HtmlDivider variant="thick" />
        <HtmlDivider height="2px" backgroundColor="#FF0000" />
        <HtmlDivider backgroundImage="linear-gradient(to right, red, blue)" />
    </MjmlRaw>;

    Example theme

    import { createTheme } from "@comet/mail-react";
    
    const theme = createTheme({
        divider: {
            defaultVariant: "thin",
            variants: {
                thin: { height: "1px", backgroundColor: "#999999" },
                thick: { height: { default: "12px", mobile: "8px" }, backgroundColor: "#222222" },
                gradient: {
                    backgroundColor: "#5B4FC7",
                    backgroundImage: "linear-gradient(to right, #5B4FC7, #FF6B6B, #FFD166)",
                },
            },
        },
    });
    
    declare module "@comet/mail-react" {
        interface DividerVariants {
            thin: true;
            thick: true;
            gradient: true;
        }
    }
  • 568ee9a: Add HtmlImage component

    Renders an <img> tag that adapts to its container width below the default breakpoint. Use within raw HTML context — HTML-only emails or MJML ending tags like MjmlRaw.

    import { HtmlImage } from "@comet/mail-react";
    
    <HtmlImage src="https://example.com/banner.png" width="600" height="300" alt="Banner" />;

@comet/site-react@9.0.0-beta.5

Patch Changes

  • cfa70a2: Fix preview-image to playback transition in video blocks

    • DamVideoBlock: clicking the preview image's play button now starts video playback. Previously, the click dismissed the preview but the browser's autoplay policy blocked playback of videos with sound because the gesture happened on the preview image rather than the <video> element. Playback is now triggered explicitly inside the ref callback to stay within the user gesture window.
    • YouTubeVideoBlock / VimeoVideoBlock: when the preview image is dismissed, isPlaying is now set to true so PlayPauseButton shows the correct icon, and the playback is flagged as manually handled so the viewport handler does not immediately pause the video.
  • 4f018d5: Fix VimeoVideoBlock not autoplaying on initial page load when autoplay is enabled and no previewImage is set

    Without a previewImage, the iframe URL was missing autoplay=1 and playback relied on a postMessage("play") fired from the IntersectionObserver callback. That message raced against the Vimeo player's initialization inside the iframe — when it arrived first the message was dropped and the video stayed paused, while the PlayPauseButton optimistically showed the "Pause" state, requiring two clicks to recover. autoplay=1 is now appended whenever autoplay is enabled so Vimeo handles autoplay natively. The existing muted=1 param satisfies the browser autoplay policy.

    The iframe is also marked with loading="lazy" so blocks far below the fold don't request the Vimeo player upfront.