Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
28cb126
chore(deps): update @cloudflare/kumo to 2.15.0
khoinguyenpham04 Oct 20, 2026
421c5c6
Merge remote-tracking branch 'origin/main' into noah/kumo-version-upd…
khoinguyenpham04 Oct 20, 2026
5655c98
chore(deps): regenerate lockfile from main
khoinguyenpham04 Oct 20, 2026
bff3502
fix(admin): keep dialog min-width overrides and media tab padding ali…
khoinguyenpham04 Oct 20, 2026
6ee7eff
fix(admin): trim media source tab padding only when an icon leads
khoinguyenpham04 Oct 20, 2026
029599f
fix(admin): close table menus instantly under Kumo 2.15's menu transi…
khoinguyenpham04 Oct 20, 2026
d68da7a
test(e2e): use Arabic labels in the RTL table visual steps
khoinguyenpham04 Oct 20, 2026
9562473
test(e2e): wait for the table menu's opening transition to start befo…
khoinguyenpham04 Oct 20, 2026
9de1d2d
fix(admin): keep table menu group labels aligned with the icons
khoinguyenpham04 Oct 20, 2026
914a157
fix(admin): keep menu rows unindented under Kumo 2.15's icon auto-inset
khoinguyenpham04 Oct 21, 2026
73638b5
ci: accept visual baselines (requested by @khoinguyenpham04)
emdashbot[bot] Oct 22, 2026
b7e2cca
Merge remote-tracking branch 'origin/main' into noah/kumo-version-upd…
khoinguyenpham04 Oct 29, 2026
6d63664
fix(admin): keep table row dividers under Kumo 2.15
khoinguyenpham04 Oct 29, 2026
585a309
ci: accept visual baselines (requested by @khoinguyenpham04)
emdashbot[bot] Oct 29, 2026
92b7888
Merge remote-tracking branch 'origin/main' into noah/kumo-version-upd…
khoinguyenpham04 Oct 29, 2026
c7b42a6
fix(admin): drop content list menu icon margins and include AI Search…
khoinguyenpham04 Oct 29, 2026
9a39c03
docs(changeset): tell sites to update emdash and the Kumo plugins tog…
khoinguyenpham04 Oct 29, 2026
975e103
Merge remote-tracking branch 'origin/main' into noah/kumo-version-upd…
khoinguyenpham04 Oct 31, 2026
60be2cb
Merge remote-tracking branch 'origin/main' into noah/kumo-version-upd…
khoinguyenpham04 Oct 31, 2026
1730fa2
fix(admin): drop icon margins from the new row action menus
khoinguyenpham04 Oct 31, 2026
2c3b33d
Merge branch 'noah/kumo-version-update-12d776' of https://github.com/…
khoinguyenpham04 Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .changeset/kumo-2-15.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"@emdash-cms/admin": patch
"@emdash-cms/blocks": patch
"@emdash-cms/cloudflare": patch
"@emdash-cms/plugin-forms": patch
"@emdash-cms/plugin-field-kit": patch
"@emdash-cms/plugin-ai-moderation": patch
"@emdash-cms/plugin-ai-search": patch
---

Updates `@cloudflare/kumo` to 2.15.0. These packages now require exactly `@cloudflare/kumo@2.15.0`, so sites and plugins that install Kumo themselves should upgrade to that version to match the admin's prebuilt styles. Update `emdash` and the Forms, Field Kit, AI Moderation and AI Search plugins together: their earlier releases require Kumo 2.6.0, and these plugin releases need an `emdash` release with this change. Updating only one side leaves Kumo 2.15 next to an admin built for 2.6.

In the admin, Select menus now open below their field instead of over it, and text sized `text-base` or `text-lg` has a taller line (1.5), so labels and headings take slightly more height. Kumo's `DropdownMenu` now spaces item icons itself, so plugin admin pages should remove any margin classes such as `me-2` from the elements they pass as an item's `icon`.
5 changes: 5 additions & 0 deletions e2e/tests/portable-text-table.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,10 @@ test.describe("Portable Text tables", () => {
await more.click();
const menu = page.locator('[role="menu"]:visible');
await expect(menu).toBeVisible();
await expect(menu).not.toHaveAttribute("data-starting-style");
await menu.evaluate((element) =>
Promise.all(element.getAnimations().map((animation) => animation.finished)),
);
for (const index of [0, 1, 0, 1]) {
const toggle = menu.getByRole("menuitemcheckbox").nth(index);
await toggle.scrollIntoViewIfNeeded();
Expand Down Expand Up @@ -549,6 +553,7 @@ test.describe("Portable Text table responsive accessibility", () => {
{ width: 1440, height: 900 },
]) {
await page.setViewportSize(viewport);
await expect(page.locator("[data-ending-style]")).toHaveCount(0);
const geometry = await wrapper.evaluate((element) => ({
page: document.documentElement.scrollWidth - document.documentElement.clientWidth,
scroll: element.scrollWidth,
Expand Down
8 changes: 4 additions & 4 deletions e2e/tests/visual-regression.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -355,9 +355,9 @@ test.describe("visual regression", () => {
tableShot,
);
await page.keyboard.press("Escape");
await visualAction(admin, "Select table");
await visualAction(admin, "تحديد الجدول");
await page.locator("#field-body [data-emdash-table-trigger]").click();
await expect(page.getByRole("menuitem", { name: /Delete.*rows/ })).toBeDisabled();
await expect(page.getByRole("menuitem", { name: "حذف الصفوف", exact: true })).toBeDisabled();
await expect(page.locator('[role="menu"]:visible')).toHaveScreenshot(
"table-d-delete-disabled.png",
tableShot,
Expand Down Expand Up @@ -407,11 +407,11 @@ test.describe("visual regression", () => {
await page.setViewportSize({ width: 375, height: 812 });
view = await openTableVisual(admin, 3, 3, false, LOCALES[1], "dark");
await visualAction(admin, "تبديل صف الرأس");
await visualAction(admin, "Toggle header column");
await visualAction(admin, "تبديل عمود الرأس");
await settleTableGeometry(admin);
await expect(view.table).toHaveScreenshot("table-h-header-row-column.png", tableShot);
await visualAction(admin, "تبديل صف الرأس");
await visualAction(admin, "Toggle header column");
await visualAction(admin, "تبديل عمود الرأس");
await settleTableGeometry(admin);
await expect(view.table).toHaveScreenshot("table-h-body-only.png", tableShot);

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions packages/admin/src/components/BylineCreditsEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -721,15 +721,15 @@ function SortableBylineRow({
<DropdownMenu.Content className="origin-[var(--transform-origin)] p-1 transition-[transform,scale,opacity] duration-150 data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[instant]:duration-0 data-[starting-style]:scale-90 data-[starting-style]:opacity-0 motion-reduce:transition-none">
<DropdownMenu.Item
className="py-1 data-highlighted:bg-kumo-fill"
icon={<Tag className="me-1.5 size-3.5" aria-hidden="true" />}
icon={<Tag className="size-3.5" aria-hidden="true" />}
onClick={onOpenRole}
>
{credit.roleLabel ? t`Edit role` : t`Set role`}
</DropdownMenu.Item>
{onEdit ? (
<DropdownMenu.Item
className="py-1 data-highlighted:bg-kumo-fill"
icon={<PencilSimple className="me-1.5 size-3.5" aria-hidden="true" />}
icon={<PencilSimple className="size-3.5" aria-hidden="true" />}
onClick={onEdit}
>
{t`Edit byline`}
Expand All @@ -738,7 +738,7 @@ function SortableBylineRow({
<DropdownMenu.Separator className="my-0.5" />
<DropdownMenu.Item
className="py-1"
icon={<UserMinus className="me-1.5 size-3.5" aria-hidden="true" />}
icon={<UserMinus className="size-3.5" aria-hidden="true" />}
variant="danger"
onClick={onRemove}
>
Expand Down
12 changes: 6 additions & 6 deletions packages/admin/src/components/ContentList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1566,7 +1566,7 @@ function ContentListItem({
<RowActionsMenu label={t`Actions for ${title}`}>
<DropdownMenu.LinkItem
closeOnClick
icon={<Pencil className="me-2 size-4" aria-hidden="true" />}
icon={<Pencil className="size-4" aria-hidden="true" />}
render={
<Link
to="/content/$collection/$id"
Expand All @@ -1580,7 +1580,7 @@ function ContentListItem({
{item.status === "published" && item.slug && (
<DropdownMenu.LinkItem
closeOnClick
icon={<ArrowSquareOut className="me-2 size-4" aria-hidden="true" />}
icon={<ArrowSquareOut className="size-4" aria-hidden="true" />}
href={contentUrl(collection, item.slug, urlPattern, {
locale: item.locale,
i18n,
Expand All @@ -1595,7 +1595,7 @@ function ContentListItem({
)}
{onDuplicate && (
<DropdownMenu.Item
icon={<Copy className="me-2 size-4" aria-hidden="true" />}
icon={<Copy className="size-4" aria-hidden="true" />}
onClick={() => onDuplicate(item.id)}
>
{t`Duplicate`}
Expand All @@ -1604,7 +1604,7 @@ function ContentListItem({
<DropdownMenu.Separator />
<DropdownMenu.Item
variant="danger"
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
onClick={() => setTrashOpen(true)}
>
{t`Move to trash`}
Expand Down Expand Up @@ -1771,15 +1771,15 @@ function TrashedListItem({
<td className="text-end">
<RowActionsMenu label={t`Actions for ${title}`}>
<DropdownMenu.Item
icon={<ArrowCounterClockwise className="me-2 size-4" aria-hidden="true" />}
icon={<ArrowCounterClockwise className="size-4" aria-hidden="true" />}
onClick={() => onRestore?.(item.id)}
>
{t`Restore`}
</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item
variant="danger"
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
onClick={() => setDeleteOpen(true)}
>
{t`Delete permanently`}
Expand Down
4 changes: 2 additions & 2 deletions packages/admin/src/components/ContentTypeList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ function ContentTypeRow({ collection, canReorder, onRequestDelete }: ContentType
<RowActionsMenu label={t`Actions for ${collection.label}`}>
<DropdownMenu.LinkItem
closeOnClick
icon={<Pencil className="me-2 size-4" aria-hidden="true" />}
icon={<Pencil className="size-4" aria-hidden="true" />}
aria-label={t`Edit ${collection.label}`}
render={<Link to="/content-types/$slug" params={{ slug: collection.slug }} />}
>
Expand All @@ -380,7 +380,7 @@ function ContentTypeRow({ collection, canReorder, onRequestDelete }: ContentType
<DropdownMenu.Separator />
<DropdownMenu.Item
variant="danger"
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
aria-label={t`Delete ${collection.label}`}
onClick={() => onRequestDelete?.(collection)}
>
Expand Down
3 changes: 2 additions & 1 deletion packages/admin/src/components/DataTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ export function DataTable({ className, children, ...props }: React.ComponentProp
// th's own alignment class, such as text-end.
"[:where(&)_th]:text-start",
"[&_th]:border-b-0 [&_th]:bg-transparent [&_th]:px-4 [&_th]:py-3.5 [&_th]:font-normal [&_th]:whitespace-nowrap [&_th]:text-kumo-subtle",
"[&_td]:border-kumo-line [&_td]:bg-kumo-base [&_td]:px-4 [&_td]:py-3.5",
"[&_td]:border-b [&_td]:border-kumo-line [&_td]:bg-kumo-base [&_td]:px-4 [&_td]:py-3.5",
"[&_tbody_tr:last-child_td]:border-b-0",
"[&_tr[data-selected]_td]:bg-kumo-tint",
"[&_tbody_tr:first-child_td]:border-t",
"[&_tbody_tr:first-child_td:first-child]:rounded-ss-xl [&_tbody_tr:first-child_td:last-child]:rounded-se-xl",
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/components/ImageFieldRenderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -362,14 +362,14 @@ export function ImageFieldRenderer({
/>
<DropdownMenu.Content align="end" className="min-w-40">
<DropdownMenu.Item
icon={<ImageSquare className="me-1.5 size-4" aria-hidden="true" />}
icon={<ImageSquare className="size-4" aria-hidden="true" />}
onClick={() => openPicker("image")}
>
{t`Replace`}
</DropdownMenu.Item>
{canEditPrimaryAsset && (
<DropdownMenu.Item
icon={<PencilSimple className="me-1.5 size-4" aria-hidden="true" />}
icon={<PencilSimple className="size-4" aria-hidden="true" />}
onClick={() => {
setPickerTarget("image");
void assetEditor.openAssetEditor(objectValue!.id, mobileImageActionsRef.current);
Expand All @@ -381,7 +381,7 @@ export function ImageFieldRenderer({
<DropdownMenu.Separator />
<DropdownMenu.Item
variant="danger"
icon={<X className="me-1.5 size-4" aria-hidden="true" />}
icon={<X className="size-4" aria-hidden="true" />}
onClick={handleRemove}
>
{t`Remove`}
Expand Down
2 changes: 1 addition & 1 deletion packages/admin/src/components/MediaPickerModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1092,7 +1092,7 @@ export function MediaPickerModal({
onValueChange={changeSource}
tabs={sourceTabs.map((source) => ({
value: source.id,
className: "my-px h-[34px] rounded-[7px] px-3",
className: `my-px h-[34px] rounded-[7px] ${source.id === "local" || source.id === URL_SOURCE || source.icon ? "ps-2.5 pe-3" : "px-3"}`,
render: (props) => <button {...props} disabled={uploadQueue.hasUnfinished} />,
label: (
<span className="flex items-center gap-2">
Expand Down
2 changes: 1 addition & 1 deletion packages/admin/src/components/MenuList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export function MenuList() {
)}
/>
<Dialog
className="flex max-h-[calc(100dvh-2rem)] min-w-0 w-[calc(100vw-2rem)] flex-col overflow-hidden p-0 sm:w-[32rem]"
className="flex max-h-[calc(100dvh-2rem)] min-w-0 w-[calc(100vw-2rem)] flex-col overflow-hidden p-0 sm:w-lg"
size="lg"
>
<form onSubmit={handleCreate} className="flex min-h-0 flex-1 flex-col">
Expand Down
4 changes: 2 additions & 2 deletions packages/admin/src/components/RelationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -235,15 +235,15 @@ function RelationRow({
<td className="text-end">
<RowActionsMenu label={t`Actions for ${relation.slug}`}>
<DropdownMenu.Item
icon={<Pencil className="me-2 size-4" aria-hidden="true" />}
icon={<Pencil className="size-4" aria-hidden="true" />}
onClick={onEdit}
>
{t`Edit`}
</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item
variant="danger"
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
aria-label={t`Delete ${relation.slug}`}
onClick={onDelete}
>
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/components/Sections.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ export function Sections() {
)}
/>
<Dialog
className="flex max-h-[calc(100dvh-2rem)] w-[calc(100vw-2rem)] flex-col overflow-hidden p-0 sm:w-[32rem]"
className="flex max-h-[calc(100dvh-2rem)] w-[calc(100vw-2rem)] flex-col overflow-hidden p-0 sm:w-lg"
size="lg"
>
<form onSubmit={handleCreate} className="flex min-h-0 flex-1 flex-col">
Expand Down Expand Up @@ -453,15 +453,15 @@ function SectionCard({
/>
<DropdownMenu.Content align="end">
<DropdownMenu.Item
icon={<Copy className="me-2 size-4" aria-hidden="true" />}
icon={<Copy className="size-4" aria-hidden="true" />}
onClick={onCopySlug}
>
{t`Copy slug`}
</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item
variant="danger"
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
aria-label={section.source === "theme" ? undefined : t`Delete ${section.title}`}
disabled={section.source === "theme"}
onClick={onDelete}
Expand Down
16 changes: 8 additions & 8 deletions packages/admin/src/components/TaxonomyManager.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ function TermRow({
<td className="text-end">
<RowActionsMenu label={t`Actions for ${term.label}`}>
<DropdownMenu.Item
icon={<Pencil className="me-2 size-4" aria-hidden="true" />}
icon={<Pencil className="size-4" aria-hidden="true" />}
onClick={() => onEdit(term)}
>
{t`Edit`}
Expand All @@ -325,21 +325,21 @@ function TermRow({
{stranded && (
<DropdownMenu.Label
id={strandedReasonId}
className="max-w-60 text-sm font-normal text-pretty text-kumo-subtle"
className="max-w-60 px-2! text-sm font-normal text-pretty text-kumo-subtle"
>
{t`${term.label} can't be moved here — its parent has no translation in this locale, so this list isn't the group it belongs to.`}
</DropdownMenu.Label>
)}
<DropdownMenu.Item
icon={<ArrowUp className="me-2 size-4" aria-hidden="true" />}
icon={<ArrowUp className="size-4" aria-hidden="true" />}
aria-describedby={stranded ? strandedReasonId : undefined}
disabled={stranded || place <= 0}
onClick={() => onMove(parentId, siblings, movable, term, -1)}
>
{t`Move up`}
</DropdownMenu.Item>
<DropdownMenu.Item
icon={<ArrowDown className="me-2 size-4" aria-hidden="true" />}
icon={<ArrowDown className="size-4" aria-hidden="true" />}
aria-describedby={stranded ? strandedReasonId : undefined}
disabled={stranded || place >= movable.length - 1}
onClick={() => onMove(parentId, siblings, movable, term, 1)}
Expand All @@ -350,7 +350,7 @@ function TermRow({
)}
{canTranslate && onTranslate && (
<DropdownMenu.Item
icon={<Translate className="me-2 size-4" aria-hidden="true" />}
icon={<Translate className="size-4" aria-hidden="true" />}
onClick={() => onTranslate(term)}
>
{t`Translate`}
Expand All @@ -359,7 +359,7 @@ function TermRow({
<DropdownMenu.Separator />
<DropdownMenu.Item
variant="danger"
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
aria-label={t`Delete ${term.label}`}
onClick={() => onDelete(term)}
>
Expand Down Expand Up @@ -1230,7 +1230,7 @@ export function TaxonomyManager({ taxonomyName, onDeleted }: TaxonomyManagerProp
{taxonomyName === "tag" && (
<>
<DropdownMenu.Item
icon={<StackSimple className="me-2 size-4" aria-hidden="true" />}
icon={<StackSimple className="size-4" aria-hidden="true" />}
onClick={() => setCreateTaxonomyOpen(true)}
>
{t`New taxonomy`}
Expand All @@ -1240,7 +1240,7 @@ export function TaxonomyManager({ taxonomyName, onDeleted }: TaxonomyManagerProp
)}
<DropdownMenu.Item
variant="danger"
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
onClick={() => setDeleteTaxonomyOpen(true)}
>
{t`Delete taxonomy`}
Expand Down
5 changes: 2 additions & 3 deletions packages/admin/src/components/calendar/CalendarFilters.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -139,14 +139,13 @@ export function CalendarFilters({
/>
<DropdownMenu.Content
align="end"
// Kumo's menu animates on Radix's data-state, which Base UI never sets, so this uses its popover transition.
className="max-h-[min(32rem,var(--available-height))] w-[max(15rem,var(--anchor-width))] origin-(--transform-origin) overflow-y-auto transition-[transform,scale,opacity] duration-150 data-ending-style:scale-90 data-ending-style:opacity-0 data-instant:duration-0 data-starting-style:scale-90 data-starting-style:opacity-0 motion-reduce:transition-none"
>
{groups.map((group, index) => {
const selected: readonly string[] = value[group.key];
return (
<DropdownMenu.Group key={group.key} className={index > 0 ? "mt-1" : undefined}>
<DropdownMenu.Label className="pt-2 pb-1 text-xs text-kumo-subtle">
<DropdownMenu.Label className="px-2! pt-2 pb-1 text-xs text-kumo-subtle">
{group.label}
</DropdownMenu.Label>
{group.options.map((option) => (
Expand All @@ -155,7 +154,7 @@ export function CalendarFilters({
checked={selected.includes(option.value)}
closeOnClick={false}
// Kumo's own check mark is hidden in favor of the drawn checkbox.
className="group gap-2.5 px-2 [&>[data-checked]]:hidden"
className="group gap-2.5 px-2! [&>[data-checked]]:hidden"
onCheckedChange={(checked) => {
const next = checked
? [...selected, option.value]
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/components/comments/CommentInbox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -585,7 +585,7 @@ function CommentRow({
<RowActionsMenu label={t`Actions for comment by ${author}`}>
{comment.status !== "spam" && (
<DropdownMenu.Item
icon={<Warning className="me-2 size-4" aria-hidden="true" />}
icon={<Warning className="size-4" aria-hidden="true" />}
disabled={isStatusPending}
onClick={() => onStatusChange(comment.id, "spam")}
>
Expand All @@ -594,7 +594,7 @@ function CommentRow({
)}
{comment.status !== "trash" && (
<DropdownMenu.Item
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
disabled={isStatusPending}
onClick={() => onStatusChange(comment.id, "trash")}
>
Expand All @@ -606,7 +606,7 @@ function CommentRow({
<DropdownMenu.Separator />
<DropdownMenu.Item
variant="danger"
icon={<Trash className="me-2 size-4" aria-hidden="true" />}
icon={<Trash className="size-4" aria-hidden="true" />}
disabled={isStatusPending}
onClick={() => onDelete(comment.id)}
>
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/components/editor/CodeBlockNode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ import {
} from "./codeBlockLanguages";
import { useAttachedKey } from "./useAttachedKey.js";

// Each `rounded-none`/`border-0` makes tailwind-merge drop Kumo's physical class. Keep it
// before its logical replacement, or tailwind-merge drops the replacement too.
// Kumo's Toolbar sets physical corner and divider classes on its children from the root's
// child selectors, which outrank a child's own classes. Important logical classes win in RTL.
const TOOLBAR_BUTTON_LOGICAL_EDGES =
"first:rounded-none first:rounded-s-lg last:rounded-none last:rounded-e-lg not-first:border-0 not-first:border-s";
"first:rounded-s-lg! first:rounded-e-none! last:rounded-s-none! last:rounded-e-lg! not-first:border-s! not-first:border-e-0!";

const ADMIN_CODE_BLOCK_LOWLIGHT_KEY = Symbol.for("emdash:admin-code-block-lowlight");
const globalStore = globalThis as Record<symbol, unknown>;
Expand Down
Loading
Loading