@asteby/metacore-ui 2.0.1 → 2.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.
- package/dist/layout/addon-nav.d.ts +64 -0
- package/dist/layout/addon-nav.d.ts.map +1 -0
- package/dist/layout/addon-nav.js +95 -0
- package/dist/layout/addon-nav.js.map +1 -0
- package/dist/layout/index.d.ts +1 -0
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +1 -0
- package/dist/layout/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type LucideIcon } from 'lucide-react';
|
|
2
|
+
import type { NavCollapsibleItem } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Generic, host-agnostic helpers that make ANY installed addon render as a
|
|
5
|
+
* first-class, polished sidebar module — with zero effort from the addon
|
|
6
|
+
* author. The whole metacore ecosystem inherits these defaults:
|
|
7
|
+
*
|
|
8
|
+
* - icons resolve against the full Lucide set (no hand-maintained allowlist),
|
|
9
|
+
* falling back to a neutral glyph so a nav entry is NEVER icon-less;
|
|
10
|
+
* - untranslated namespaced i18n keys (`customers.nav.invoices`) degrade to a
|
|
11
|
+
* humanized label ("Invoices") instead of leaking the raw key;
|
|
12
|
+
* - an addon nav group becomes a single collapsible parent item (icon +
|
|
13
|
+
* chevron, children indented) — the shape `<NavGroup>` renders as a
|
|
14
|
+
* dropdown — so installed addons look like native modules.
|
|
15
|
+
*/
|
|
16
|
+
/** Neutral fallback icon for a group/module header that declares none. */
|
|
17
|
+
export declare const FALLBACK_GROUP_ICON: LucideIcon;
|
|
18
|
+
/** Neutral fallback icon for a child nav item that declares none. */
|
|
19
|
+
export declare const FALLBACK_ITEM_ICON: LucideIcon;
|
|
20
|
+
/**
|
|
21
|
+
* Resolve any icon name against the full Lucide icon set. Names match
|
|
22
|
+
* case-insensitively after normalising separators, so manifests may use
|
|
23
|
+
* `shopping-cart`, `shopping_cart`, or `ShoppingCart` interchangeably.
|
|
24
|
+
* Returns `fallback` for missing/unknown names so something always renders.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveIconName(name?: string, fallback?: LucideIcon): LucideIcon;
|
|
27
|
+
/**
|
|
28
|
+
* Humanize the last segment of a (possibly namespaced) i18n key:
|
|
29
|
+
* `customers.nav.invoices` → "Invoices"
|
|
30
|
+
* `sales_orders` → "Sales Orders"
|
|
31
|
+
*/
|
|
32
|
+
export declare function humanizeNavKey(key: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Translate a nav title with a generic safety net: run it through `t()`, and
|
|
35
|
+
* if the result is unchanged (key not found — common for a third-party addon
|
|
36
|
+
* whose i18n bundle hasn't loaded) AND it looks namespaced, fall back to the
|
|
37
|
+
* humanized last segment so the UI never shows a raw `a.b.c` key.
|
|
38
|
+
*/
|
|
39
|
+
export declare function translateNavTitle(title: string, t: (key: string) => string): string;
|
|
40
|
+
/** Minimal shape of an addon-declared nav item (subset of the manifest type). */
|
|
41
|
+
export interface AddonNavItemLike {
|
|
42
|
+
title: string;
|
|
43
|
+
icon?: string;
|
|
44
|
+
url?: string;
|
|
45
|
+
items?: AddonNavItemLike[];
|
|
46
|
+
}
|
|
47
|
+
/** Minimal shape of an addon-declared nav group (subset of the manifest type). */
|
|
48
|
+
export interface AddonNavGroupLike {
|
|
49
|
+
title: string;
|
|
50
|
+
icon?: string;
|
|
51
|
+
items: AddonNavItemLike[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Convert an addon nav group into a single collapsible parent item — the shape
|
|
55
|
+
* `<NavGroup>` renders as a dropdown (icon + chevron, indented children).
|
|
56
|
+
*
|
|
57
|
+
* `resolveUrl` maps an addon item to a host-routable URL (the host owns route
|
|
58
|
+
* layout / model→table resolution). Icons fall back to neutral defaults on both
|
|
59
|
+
* the parent and every child, so a bare third-party addon still looks polished.
|
|
60
|
+
* The parent's `url` points at its first child for active-state matching and
|
|
61
|
+
* for the collapsed (icon-only) dropdown trigger.
|
|
62
|
+
*/
|
|
63
|
+
export declare function addonGroupToCollapsibleItem(group: AddonNavGroupLike, resolveUrl: (item: AddonNavItemLike) => string): NavCollapsibleItem;
|
|
64
|
+
//# sourceMappingURL=addon-nav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addon-nav.d.ts","sourceRoot":"","sources":["../../src/layout/addon-nav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AACjF,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,SAAS,CAAA;AAE9D;;;;;;;;;;;;GAYG;AAEH,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,EAAE,UAAgB,CAAA;AAClD,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,EAAE,UAAmB,CAAA;AAIpD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,GAAE,UAA+B,GACxC,UAAU,CAYZ;AAKD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASlD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GACzB,MAAM,CAKR;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,GAC7C,kBAAkB,CAYpB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Box, Circle, icons as lucideIcons } from 'lucide-react';
|
|
2
|
+
/**
|
|
3
|
+
* Generic, host-agnostic helpers that make ANY installed addon render as a
|
|
4
|
+
* first-class, polished sidebar module — with zero effort from the addon
|
|
5
|
+
* author. The whole metacore ecosystem inherits these defaults:
|
|
6
|
+
*
|
|
7
|
+
* - icons resolve against the full Lucide set (no hand-maintained allowlist),
|
|
8
|
+
* falling back to a neutral glyph so a nav entry is NEVER icon-less;
|
|
9
|
+
* - untranslated namespaced i18n keys (`customers.nav.invoices`) degrade to a
|
|
10
|
+
* humanized label ("Invoices") instead of leaking the raw key;
|
|
11
|
+
* - an addon nav group becomes a single collapsible parent item (icon +
|
|
12
|
+
* chevron, children indented) — the shape `<NavGroup>` renders as a
|
|
13
|
+
* dropdown — so installed addons look like native modules.
|
|
14
|
+
*/
|
|
15
|
+
/** Neutral fallback icon for a group/module header that declares none. */
|
|
16
|
+
export const FALLBACK_GROUP_ICON = Box;
|
|
17
|
+
/** Neutral fallback icon for a child nav item that declares none. */
|
|
18
|
+
export const FALLBACK_ITEM_ICON = Circle;
|
|
19
|
+
const ICONS = lucideIcons;
|
|
20
|
+
/**
|
|
21
|
+
* Resolve any icon name against the full Lucide icon set. Names match
|
|
22
|
+
* case-insensitively after normalising separators, so manifests may use
|
|
23
|
+
* `shopping-cart`, `shopping_cart`, or `ShoppingCart` interchangeably.
|
|
24
|
+
* Returns `fallback` for missing/unknown names so something always renders.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveIconName(name, fallback = FALLBACK_ITEM_ICON) {
|
|
27
|
+
if (!name)
|
|
28
|
+
return fallback;
|
|
29
|
+
const direct = ICONS[name];
|
|
30
|
+
if (direct)
|
|
31
|
+
return direct;
|
|
32
|
+
const pascal = name
|
|
33
|
+
.replace(/[\s_-]+/g, ' ')
|
|
34
|
+
.trim()
|
|
35
|
+
.split(' ')
|
|
36
|
+
.filter(Boolean)
|
|
37
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
38
|
+
.join('');
|
|
39
|
+
return ICONS[pascal] ?? fallback;
|
|
40
|
+
}
|
|
41
|
+
/** Matches a namespaced i18n key like `customers.nav.invoices` (≥1 dot). */
|
|
42
|
+
const NAMESPACED_KEY_RE = /^[a-z0-9_]+(\.[a-z0-9_]+)+$/i;
|
|
43
|
+
/**
|
|
44
|
+
* Humanize the last segment of a (possibly namespaced) i18n key:
|
|
45
|
+
* `customers.nav.invoices` → "Invoices"
|
|
46
|
+
* `sales_orders` → "Sales Orders"
|
|
47
|
+
*/
|
|
48
|
+
export function humanizeNavKey(key) {
|
|
49
|
+
const last = key.split('.').pop() ?? key;
|
|
50
|
+
return last
|
|
51
|
+
.replace(/[_-]+/g, ' ')
|
|
52
|
+
.trim()
|
|
53
|
+
.split(/\s+/)
|
|
54
|
+
.filter(Boolean)
|
|
55
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
56
|
+
.join(' ');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Translate a nav title with a generic safety net: run it through `t()`, and
|
|
60
|
+
* if the result is unchanged (key not found — common for a third-party addon
|
|
61
|
+
* whose i18n bundle hasn't loaded) AND it looks namespaced, fall back to the
|
|
62
|
+
* humanized last segment so the UI never shows a raw `a.b.c` key.
|
|
63
|
+
*/
|
|
64
|
+
export function translateNavTitle(title, t) {
|
|
65
|
+
const translated = t(title);
|
|
66
|
+
if (translated !== title)
|
|
67
|
+
return translated;
|
|
68
|
+
if (NAMESPACED_KEY_RE.test(title))
|
|
69
|
+
return humanizeNavKey(title);
|
|
70
|
+
return title;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Convert an addon nav group into a single collapsible parent item — the shape
|
|
74
|
+
* `<NavGroup>` renders as a dropdown (icon + chevron, indented children).
|
|
75
|
+
*
|
|
76
|
+
* `resolveUrl` maps an addon item to a host-routable URL (the host owns route
|
|
77
|
+
* layout / model→table resolution). Icons fall back to neutral defaults on both
|
|
78
|
+
* the parent and every child, so a bare third-party addon still looks polished.
|
|
79
|
+
* The parent's `url` points at its first child for active-state matching and
|
|
80
|
+
* for the collapsed (icon-only) dropdown trigger.
|
|
81
|
+
*/
|
|
82
|
+
export function addonGroupToCollapsibleItem(group, resolveUrl) {
|
|
83
|
+
const items = group.items.map((item) => ({
|
|
84
|
+
title: item.title,
|
|
85
|
+
url: resolveUrl(item),
|
|
86
|
+
icon: resolveIconName(item.icon, FALLBACK_ITEM_ICON),
|
|
87
|
+
}));
|
|
88
|
+
return {
|
|
89
|
+
title: group.title,
|
|
90
|
+
url: items[0]?.url ?? '#',
|
|
91
|
+
icon: resolveIconName(group.icon, FALLBACK_GROUP_ICON),
|
|
92
|
+
items,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=addon-nav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addon-nav.js","sourceRoot":"","sources":["../../src/layout/addon-nav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,WAAW,EAAmB,MAAM,cAAc,CAAA;AAGjF;;;;;;;;;;;;GAYG;AAEH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAe,GAAG,CAAA;AAClD,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAe,MAAM,CAAA;AAEpD,MAAM,KAAK,GAAG,WAAyC,CAAA;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAa,EACb,WAAuB,kBAAkB;IAEzC,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAA;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,MAAM,MAAM,GAAG,IAAI;SAChB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,IAAI,EAAE;SACN,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,EAAE,CAAC,CAAA;IACX,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAA;AAClC,CAAC;AAED,4EAA4E;AAC5E,MAAM,iBAAiB,GAAG,8BAA8B,CAAA;AAExD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAA;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,CAA0B;IAE1B,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;IAC3B,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,UAAU,CAAA;IAC3C,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;IAC/D,OAAO,KAAK,CAAA;AACd,CAAC;AAiBD;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAwB,EACxB,UAA8C;IAE9C,MAAM,KAAK,GAAkB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC;QACrB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC;KACrD,CAAC,CAAC,CAAA;IACH,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG;QACzB,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC;QACtD,KAAK;KACN,CAAA;AACH,CAAC"}
|
package/dist/layout/index.d.ts
CHANGED
|
@@ -5,5 +5,6 @@ export { NavUser } from './nav-user';
|
|
|
5
5
|
export { NavGroup, type NavLinkComponent, type NavGroupProps } from './nav-group';
|
|
6
6
|
export { TeamSwitcher } from './team-switcher';
|
|
7
7
|
export { ProfileDropdown } from './profile-dropdown';
|
|
8
|
+
export { resolveIconName, humanizeNavKey, translateNavTitle, addonGroupToCollapsibleItem, FALLBACK_GROUP_ICON, FALLBACK_ITEM_ICON, type AddonNavItemLike, type AddonNavGroupLike, } from './addon-nav';
|
|
8
9
|
export type { NavItem, NavLinkItem, NavCollapsibleItem, NavGroupData, LayoutUser, } from './types';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,YAAY,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAA"}
|
package/dist/layout/index.js
CHANGED
|
@@ -5,4 +5,5 @@ export { NavUser } from './nav-user';
|
|
|
5
5
|
export { NavGroup } from './nav-group';
|
|
6
6
|
export { TeamSwitcher } from './team-switcher';
|
|
7
7
|
export { ProfileDropdown } from './profile-dropdown';
|
|
8
|
+
export { resolveIconName, humanizeNavKey, translateNavTitle, addonGroupToCollapsibleItem, FALLBACK_GROUP_ICON, FALLBACK_ITEM_ICON, } from './addon-nav';
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
package/dist/layout/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAA6C,MAAM,aAAa,CAAA;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAA6C,MAAM,aAAa,CAAA;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,GAGnB,MAAM,aAAa,CAAA"}
|
package/package.json
CHANGED