@asteby/metacore-ui 2.0.1 → 2.1.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.
@@ -15,7 +15,7 @@ export function DataTableToolbar({ table, searchPlaceholder = 'Filter...', searc
15
15
  const isFiltered = table.getState().columnFilters.length > 0 ||
16
16
  table.getState().globalFilter ||
17
17
  hasActiveColumnFilters;
18
- return (_jsxs("div", { className: 'flex items-center justify-between', children: [_jsxs("div", { className: 'flex flex-1 flex-col-reverse items-start gap-y-2 sm:flex-row sm:items-center sm:space-x-2', children: [children, searchKey ? (_jsx(Input, { placeholder: searchPlaceholder, value: table.getColumn(searchKey)?.getFilterValue() ?? '', onChange: (event) => table.getColumn(searchKey)?.setFilterValue(event.target.value), className: 'h-8 w-[150px] lg:w-[250px]' })) : (_jsx(Input, { placeholder: searchPlaceholder, value: table.getState().globalFilter ?? '', onChange: (event) => table.setGlobalFilter(event.target.value), className: 'h-8 w-[150px] lg:w-[250px]' })), _jsx("div", { className: 'flex gap-x-2 flex-wrap', children: filters.map((filter) => {
18
+ return (_jsxs("div", { className: 'flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between', children: [_jsxs("div", { className: 'flex w-full flex-1 flex-col-reverse items-stretch gap-y-2 sm:w-auto sm:flex-row sm:items-center sm:space-x-2', children: [children, searchKey ? (_jsx(Input, { placeholder: searchPlaceholder, value: table.getColumn(searchKey)?.getFilterValue() ?? '', onChange: (event) => table.getColumn(searchKey)?.setFilterValue(event.target.value), className: 'h-8 w-full sm:w-[150px] lg:w-[250px]' })) : (_jsx(Input, { placeholder: searchPlaceholder, value: table.getState().globalFilter ?? '', onChange: (event) => table.setGlobalFilter(event.target.value), className: 'h-8 w-full sm:w-[150px] lg:w-[250px]' })), _jsx("div", { className: 'flex gap-x-2 flex-wrap', children: filters.map((filter) => {
19
19
  const column = table.getColumn(filter.columnId);
20
20
  if (!column)
21
21
  return null;
@@ -26,6 +26,6 @@ export function DataTableToolbar({ table, searchPlaceholder = 'Filter...', searc
26
26
  if (onDynamicFilterChange) {
27
27
  Object.keys(activeFilters).forEach((key) => onDynamicFilterChange(key, []));
28
28
  }
29
- }, className: 'h-8 px-2 lg:px-3 text-muted-foreground hover:text-foreground', children: ["Limpiar filtros", activeFilterCount > 0 && (_jsx("span", { className: 'ml-1.5 flex h-5 min-w-5 items-center justify-center rounded-full bg-muted text-[11px] font-semibold px-1', children: activeFilterCount })), _jsx(Cross2Icon, { className: 'ms-1 h-3.5 w-3.5' })] }))] }), _jsxs("div", { className: 'flex items-center gap-2', children: [extraActions, onRefresh && (_jsxs(Button, { variant: 'outline', size: 'sm', onClick: onRefresh, className: 'h-8 px-2 lg:px-3', disabled: isLoading, children: [_jsx(RefreshCw, { className: cn('h-4 w-4', isLoading && 'animate-spin') }), _jsx("span", { className: 'sr-only', children: "Recargar" })] })), _jsx(DataTableViewOptions, { table: table })] })] }));
29
+ }, className: 'h-8 px-2 lg:px-3 text-muted-foreground hover:text-foreground', children: ["Limpiar filtros", activeFilterCount > 0 && (_jsx("span", { className: 'ml-1.5 flex h-5 min-w-5 items-center justify-center rounded-full bg-muted text-[11px] font-semibold px-1', children: activeFilterCount })), _jsx(Cross2Icon, { className: 'ms-1 h-3.5 w-3.5' })] }))] }), _jsxs("div", { className: 'flex flex-wrap items-center gap-2', children: [extraActions, onRefresh && (_jsxs(Button, { variant: 'outline', size: 'sm', onClick: onRefresh, className: 'h-8 px-2 lg:px-3', disabled: isLoading, children: [_jsx(RefreshCw, { className: cn('h-4 w-4', isLoading && 'animate-spin') }), _jsx("span", { className: 'sr-only', children: "Recargar" })] })), _jsx(DataTableViewOptions, { table: table })] })] }));
30
30
  }
31
31
  //# sourceMappingURL=toolbar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../../src/data-table/toolbar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../../src/data-table/toolbar.tsx"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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"}
@@ -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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asteby/metacore-ui",
3
- "version": "2.0.1",
3
+ "version": "2.1.1",
4
4
  "description": "Metacore UI kit — data-table, layout shell, command-menu, hooks y primitives shadcn reutilizables",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {