@orthacms/media-admin 0.12.0 → 0.13.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.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The images behind "Images missing alt text", the oldest upload first, with
3
+ * who uploaded each — and the way to the library, where alt text is written.
4
+ *
5
+ * The library has no "missing alt text" filter of its own to land on, so the
6
+ * button opens the library as it is rather than claiming a filtered view.
7
+ */
8
+ export declare function MediaAltDrill(): import("react").JSX.Element;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/MediaAltDrill/index.tsx"],"names":[],"mappings":"AAyCA;;;;;;GAMG;AACH,wBAAgB,aAAa,gCAiD5B"}
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link } from 'react-router-dom';
3
+ import { defineMessages, useIntl } from 'react-intl';
4
+ import { ArrowRight } from 'lucide-react';
5
+ import { Button } from '@orthacms/design-system';
6
+ import { DrillRecordRow, SignalDrill } from '@orthacms/insights-admin';
7
+ import { useMediaAltMissing } from '../../hooks/useMediaInsights';
8
+ /** Intl descriptors for the alt-text panel, co-located here. */
9
+ const messages = defineMessages({
10
+ title: {
11
+ id: 'media.insights.drill.alt.title',
12
+ defaultMessage: 'Images missing alt text'
13
+ },
14
+ description: {
15
+ id: 'media.insights.drill.alt.description',
16
+ defaultMessage: 'Images in the library with no alt text, the oldest upload first.'
17
+ },
18
+ heading: {
19
+ id: 'media.insights.drill.alt.heading',
20
+ defaultMessage: 'Images missing alt text · {count, number} {count, plural, one {image} other {images}}'
21
+ },
22
+ meta: {
23
+ id: 'media.insights.drill.alt.meta',
24
+ defaultMessage: 'Uploaded {date}'
25
+ },
26
+ uploadedBy: {
27
+ id: 'media.insights.drill.alt.uploadedBy',
28
+ defaultMessage: 'Uploaded by {name}'
29
+ },
30
+ open: {
31
+ id: 'media.insights.drill.alt.open',
32
+ defaultMessage: 'Open Media Library'
33
+ },
34
+ empty: {
35
+ id: 'media.insights.drill.alt.empty',
36
+ defaultMessage: 'Every image has alt text.'
37
+ }
38
+ });
39
+ /**
40
+ * The images behind "Images missing alt text", the oldest upload first, with
41
+ * who uploaded each — and the way to the library, where alt text is written.
42
+ *
43
+ * The library has no "missing alt text" filter of its own to land on, so the
44
+ * button opens the library as it is rather than claiming a filtered view.
45
+ */
46
+ export function MediaAltDrill() {
47
+ const intl = useIntl();
48
+ const { data, isPending, isError } = useMediaAltMissing();
49
+ return (_jsx(SignalDrill, { title: intl.formatMessage(messages.title), count: data?.total, heading: data
50
+ ? intl.formatMessage(messages.heading, {
51
+ count: data.total
52
+ })
53
+ : undefined, shown: data?.assets.length, description: intl.formatMessage(messages.description), isPending: isPending, isError: isError, isEmpty: !!data && data.total === 0, emptyMessage: intl.formatMessage(messages.empty), actions: _jsx(Button, { asChild: true, variant: "outline", size: "sm", children: _jsxs(Link, { to: "../media", children: [_jsx(ArrowRight, { "aria-hidden": "true" }), intl.formatMessage(messages.open)] }) }), children: data?.assets.map((asset) => (_jsx(DrillRecordRow, { title: asset.name, meta: intl.formatMessage(messages.meta, {
54
+ date: intl.formatDate(asset.createdAt, {
55
+ day: 'numeric',
56
+ month: 'short',
57
+ year: 'numeric'
58
+ })
59
+ }), personId: asset.uploadedBy, personLabel: (name) => intl.formatMessage(messages.uploadedBy, { name }) }, asset.id))) }));
60
+ }
@@ -0,0 +1,8 @@
1
+ import { type InsightsSignalRowProps } from '@orthacms/insights-admin';
2
+ /**
3
+ * Images with no alt text — accessibility debt somebody can pick up, as a
4
+ * count, with the share of the library it is. The headline is the missing
5
+ * count rather than a coverage score: "23 images need alt text" is a job.
6
+ */
7
+ export declare function MediaAltSignal({ onOpen, isOpen }: InsightsSignalRowProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/MediaAltSignal/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,sBAAsB,EAC9B,MAAM,0BAA0B,CAAC;AAmBlC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,sBAAsB,+BAyBxE"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { defineMessages, useIntl } from 'react-intl';
3
+ import { Eye } from 'lucide-react';
4
+ import { SignalRow } from '@orthacms/insights-admin';
5
+ import { useMediaAltCoverage } from '../../hooks/useMediaInsights';
6
+ /** Intl descriptors for the alt-text line, co-located here. */
7
+ const messages = defineMessages({
8
+ title: {
9
+ id: 'media.insights.signal.alt.title',
10
+ defaultMessage: 'Images missing alt text'
11
+ },
12
+ hint: {
13
+ id: 'media.insights.signal.alt.hint',
14
+ defaultMessage: 'In Media Library · {percent}% of {images, number} images'
15
+ },
16
+ noImages: {
17
+ id: 'media.insights.signal.alt.noImages',
18
+ defaultMessage: 'No images in Media Library yet'
19
+ }
20
+ });
21
+ /**
22
+ * Images with no alt text — accessibility debt somebody can pick up, as a
23
+ * count, with the share of the library it is. The headline is the missing
24
+ * count rather than a coverage score: "23 images need alt text" is a job.
25
+ */
26
+ export function MediaAltSignal({ onOpen, isOpen }) {
27
+ const intl = useIntl();
28
+ const { data, isPending, isError } = useMediaAltCoverage();
29
+ const images = data?.images ?? 0;
30
+ const missing = data?.missing ?? 0;
31
+ const percent = images > 0 ? Math.round((missing / images) * 100) : 0;
32
+ return (_jsx(SignalRow, { icon: Eye, tone: "warn", count: missing, title: intl.formatMessage(messages.title), hint: images > 0
33
+ ? intl.formatMessage(messages.hint, { percent, images })
34
+ : intl.formatMessage(messages.noImages), isPending: isPending, isError: isError, onOpen: onOpen, isOpen: isOpen }));
35
+ }
@@ -7,11 +7,11 @@ import { formatBytes } from '../../utils/formatBytes';
7
7
  const messages = defineMessages({
8
8
  title: {
9
9
  id: 'media.insights.storageBreakdown.title',
10
- defaultMessage: "What's using the storage"
10
+ defaultMessage: 'Storage'
11
11
  },
12
12
  description: {
13
13
  id: 'media.insights.storageBreakdown.description',
14
- defaultMessage: '{bytes} across {count, number} assets'
14
+ defaultMessage: '{bytes} · {count, number} assets'
15
15
  },
16
16
  tip: {
17
17
  id: 'media.insights.storageBreakdown.tip',
@@ -11,6 +11,7 @@ export declare const mediaInsightsKeys: {
11
11
  storage: (workspaceId: string) => readonly ["media-insights", string, "storage"];
12
12
  uploads: (workspaceId: string, days: number) => readonly ["media-insights", string, "uploads", number];
13
13
  alt: (workspaceId: string) => readonly ["media-insights", string, "alt"];
14
+ altMissing: (workspaceId: string) => readonly ["media-insights", string, "alt-missing"];
14
15
  };
15
16
  /**
16
17
  * Loads assets and bytes per media kind.
@@ -29,4 +30,11 @@ export declare function useMediaUploads(): import("@tanstack/react-query").UseQu
29
30
  * whenever someone narrowed the range.
30
31
  */
31
32
  export declare function useMediaAltCoverage(): import("@tanstack/react-query").UseQueryResult<NoInfer<import("../../infrastructure/mediaInsightsGateway").MediaAltCoverage>, Error>;
33
+ /** How many images the alt-text drill-down lists. */
34
+ export declare const ALT_DRILL_LIMIT = 20;
35
+ /**
36
+ * Loads the images missing alt text, oldest upload first — the drill-down
37
+ * behind the Needs-attention line. Mounted only while its panel is open.
38
+ */
39
+ export declare function useMediaAltMissing(): import("@tanstack/react-query").UseQueryResult<NoInfer<import("../../infrastructure/mediaInsightsGateway").MediaAltMissing>, Error>;
32
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/hooks/useMediaInsights/index.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;uBACP,MAAM;2BACF,MAAM;2BAEN,MAAM,QAAQ,MAAM;uBAExB,MAAM;CAE5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,qIAgB9B;AAED,uEAAuE;AACvE,wBAAgB,eAAe,qIAiB9B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,yIAgBlC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/hooks/useMediaInsights/index.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;uBACP,MAAM;2BACF,MAAM;2BAEN,MAAM,QAAQ,MAAM;uBAExB,MAAM;8BAEC,MAAM;CAEnC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,qIAgB9B;AAED,uEAAuE;AACvE,wBAAgB,eAAe,qIAiB9B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,yIAgBlC;AAED,qDAAqD;AACrD,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC;;;GAGG;AACH,wBAAgB,kBAAkB,wIAYjC"}
@@ -18,7 +18,8 @@ export const mediaInsightsKeys = {
18
18
  all: (workspaceId) => ['media-insights', workspaceId],
19
19
  storage: (workspaceId) => ['media-insights', workspaceId, 'storage'],
20
20
  uploads: (workspaceId, days) => ['media-insights', workspaceId, 'uploads', days],
21
- alt: (workspaceId) => ['media-insights', workspaceId, 'alt']
21
+ alt: (workspaceId) => ['media-insights', workspaceId, 'alt'],
22
+ altMissing: (workspaceId) => ['media-insights', workspaceId, 'alt-missing']
22
23
  };
23
24
  /**
24
25
  * Loads assets and bytes per media kind.
@@ -83,3 +84,21 @@ export function useMediaAltCoverage() {
83
84
  enabled: canRead
84
85
  });
85
86
  }
87
+ /** How many images the alt-text drill-down lists. */
88
+ export const ALT_DRILL_LIMIT = 20;
89
+ /**
90
+ * Loads the images missing alt text, oldest upload first — the drill-down
91
+ * behind the Needs-attention line. Mounted only while its panel is open.
92
+ */
93
+ export function useMediaAltMissing() {
94
+ const workspace = useCurrentWorkspace();
95
+ const canRead = useHasPermission(MEDIA_READ);
96
+ return useQuery({
97
+ queryKey: mediaInsightsKeys.altMissing(workspace.id),
98
+ queryFn: () => httpMediaInsightsGateway.altMissing(ALT_DRILL_LIMIT),
99
+ staleTime: STALE_TIME.Standard,
100
+ // One retry, as every Insights read (`[insights:I-16]`).
101
+ retry: 1,
102
+ enabled: canRead
103
+ });
104
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/httpMediaInsightsGateway/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAER,oBAAoB,EAGvB,MAAM,yBAAyB,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,oBAkCtC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/httpMediaInsightsGateway/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGR,oBAAoB,EAGvB,MAAM,yBAAyB,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,oBA8CtC,CAAC"}
@@ -31,5 +31,14 @@ export const httpMediaInsightsGateway = {
31
31
  catch (error) {
32
32
  throw toApiError(error);
33
33
  }
34
+ },
35
+ async altMissing(limit) {
36
+ try {
37
+ const { data } = await apiClient.get('/insights/media/alt/missing', { params: { limit } });
38
+ return data;
39
+ }
40
+ catch (error) {
41
+ throw toApiError(error);
42
+ }
34
43
  }
35
44
  };
@@ -35,6 +35,21 @@ export type MediaAltCoverage = {
35
35
  * The port over the media Insights endpoints — one method per widget, mirroring
36
36
  * one route per widget. {@link httpMediaInsightsGateway} is the implementation.
37
37
  */
38
+ /** One image with no alt text. */
39
+ export type MediaAltMissingAsset = {
40
+ id: string;
41
+ name: string;
42
+ folderId: string | null;
43
+ /** Who uploaded it — resolved against the workspace roster. */
44
+ uploadedBy: string;
45
+ /** ISO upload timestamp. */
46
+ createdAt: string;
47
+ };
48
+ /** The images behind the "missing alt text" figure, oldest upload first. */
49
+ export type MediaAltMissing = {
50
+ total: number;
51
+ assets: MediaAltMissingAsset[];
52
+ };
38
53
  export type MediaInsightsGateway = {
39
54
  /** `GET /insights/media/storage` — assets and bytes per kind. */
40
55
  storage(): Promise<MediaStorage>;
@@ -42,5 +57,7 @@ export type MediaInsightsGateway = {
42
57
  uploads(days: number): Promise<MediaUploads>;
43
58
  /** `GET /insights/media/alt` — alt-text coverage across images. */
44
59
  altCoverage(): Promise<MediaAltCoverage>;
60
+ /** `GET /insights/media/alt/missing` — the images, oldest upload first. */
61
+ altMissing(limit: number): Promise<MediaAltMissing>;
45
62
  };
46
63
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/mediaInsightsGateway/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG;IACzB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG;IACvB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,iEAAiE;IACjE,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACjC,+DAA+D;IAC/D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,mEAAmE;IACnE,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC5C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/mediaInsightsGateway/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG;IACzB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG;IACvB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,kCAAkC;AAClC,MAAM,MAAM,oBAAoB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,iEAAiE;IACjE,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACjC,+DAA+D;IAC/D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,mEAAmE;IACnE,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,2EAA2E;IAC3E,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACvD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/mediaPlugin/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAyC7D;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,gBAAgB,CAiJ9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/mediaPlugin/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AA2C7D;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,gBAAgB,CAuJ9C"}
@@ -4,12 +4,13 @@ import { lazyPage } from '@orthacms/utils-admin';
4
4
  import { WORKSPACE_ROUTE_SLOT, WORKSPACE_NAV_SLOT } from '@orthacms/workspaces-admin';
5
5
  import { CONTENT_FIELD_TYPE, ENTRY_FIELD_CONTROL_SLOT, ENTRY_PRESAVE_SLOT } from '@orthacms/content-admin';
6
6
  import { WYSIWYG_MEDIA_SLOT } from '@orthacms/wysiwyg-admin';
7
- import { INSIGHTS_SECTION_IDS, INSIGHTS_WIDGET_SLOT } from '@orthacms/insights-admin';
7
+ import { INSIGHTS_SECTION_IDS, INSIGHTS_SIGNAL_SLOT, INSIGHTS_WIDGET_SLOT } from '@orthacms/insights-admin';
8
8
  import { Image, Upload } from 'lucide-react';
9
9
  import { MediaStorageStat } from '../../components/MediaStorageStat';
10
10
  import { MediaStorageWidget } from '../../components/MediaStorageWidget';
11
11
  import { MediaUploadsWidget } from '../../components/MediaUploadsWidget';
12
- import { MediaAltTextWidget } from '../../components/MediaAltTextWidget';
12
+ import { MediaAltSignal } from '../../components/MediaAltSignal';
13
+ import { MediaAltDrill } from '../../components/MediaAltDrill';
13
14
  import { MediaFieldInput } from '../../components/MediaFieldInput';
14
15
  import { MediaLibraryPageSkeleton } from '../../components/MediaLibrarySkeleton';
15
16
  import { WysiwygLibrarySource } from '../../components/WysiwygLibrarySource';
@@ -52,31 +53,37 @@ export function MediaPlugin() {
52
53
  id: 'insights.media.storageBreakdown',
53
54
  section: INSIGHTS_SECTION_IDS.Reach,
54
55
  order: 10,
55
- size: 'sm',
56
+ size: 'md',
56
57
  permission: MEDIA_READ,
57
58
  titleId: 'media.insights.storageBreakdown.title',
58
- defaultTitle: "What's using the storage",
59
+ defaultTitle: 'Storage',
59
60
  Component: MediaStorageWidget
60
61
  },
61
62
  {
62
63
  id: 'insights.media.uploads',
63
64
  section: INSIGHTS_SECTION_IDS.Reach,
64
65
  order: 20,
65
- size: 'sm',
66
+ size: 'md',
66
67
  permission: MEDIA_READ,
67
68
  titleId: 'media.insights.uploads.title',
68
69
  defaultTitle: 'Uploads',
69
70
  Component: MediaUploadsWidget
70
- },
71
+ }
72
+ ]
73
+ },
74
+ {
75
+ // The alt-text debt is a Needs-attention line now, opening the
76
+ // images behind it, rather than a card of its own.
77
+ slot: INSIGHTS_SIGNAL_SLOT,
78
+ items: [
71
79
  {
72
- id: 'insights.media.alt',
73
- section: INSIGHTS_SECTION_IDS.Reach,
74
- order: 30,
75
- size: 'sm',
80
+ id: 'media.alt',
81
+ order: 40,
76
82
  permission: MEDIA_READ,
77
- titleId: 'media.insights.alt.title',
83
+ titleId: 'media.insights.signal.alt.title',
78
84
  defaultTitle: 'Images missing alt text',
79
- Component: MediaAltTextWidget
85
+ Component: MediaAltSignal,
86
+ Drill: MediaAltDrill
80
87
  }
81
88
  ]
82
89
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orthacms/media-admin",
3
- "version": "0.12.0",
3
+ "version": "0.13.1",
4
4
  "description": "@orthacms/media-admin — part of Ortha CMS.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orthacms.com",
@@ -25,15 +25,15 @@
25
25
  "dist"
26
26
  ],
27
27
  "dependencies": {
28
- "@orthacms/bootstrap-admin": "^0.12.0",
29
- "@orthacms/content-admin": "^0.12.0",
30
- "@orthacms/content-domain": "^0.12.0",
31
- "@orthacms/design-system": "^0.12.0",
32
- "@orthacms/identity-admin": "^0.12.0",
33
- "@orthacms/insights-admin": "^0.12.0",
34
- "@orthacms/utils-admin": "^0.12.0",
35
- "@orthacms/workspaces-admin": "^0.12.0",
36
- "@orthacms/wysiwyg-admin": "^0.12.0",
28
+ "@orthacms/bootstrap-admin": "^0.13.1",
29
+ "@orthacms/content-admin": "^0.13.1",
30
+ "@orthacms/content-domain": "^0.13.1",
31
+ "@orthacms/design-system": "^0.13.1",
32
+ "@orthacms/identity-admin": "^0.13.1",
33
+ "@orthacms/insights-admin": "^0.13.1",
34
+ "@orthacms/utils-admin": "^0.13.1",
35
+ "@orthacms/workspaces-admin": "^0.13.1",
36
+ "@orthacms/wysiwyg-admin": "^0.13.1",
37
37
  "@tanstack/react-query": "^5.0.0",
38
38
  "lucide-react": "^1.17.0",
39
39
  "react-intl": "^7.0.0",