@deneb-ui/ui 2.0.22 → 2.0.24

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.
Files changed (38) hide show
  1. package/README.md +77 -155
  2. package/dist/DenebComponentStyles.d.ts +6 -0
  3. package/dist/DenebComponentStyles.js +84 -0
  4. package/dist/EditableCard.js +5 -1
  5. package/dist/EditableContactForm.js +1 -1
  6. package/dist/EditableFilterSidebar.js +12 -11
  7. package/dist/EditableFooter.js +1 -1
  8. package/dist/EditableGrid.js +15 -12
  9. package/dist/EditableNavbar.js +32 -19
  10. package/dist/EditablePricingCard.js +1 -1
  11. package/dist/EditableProductCard.js +4 -4
  12. package/dist/EditableProductDetail.js +2 -2
  13. package/dist/EditableProductGrid.js +1 -1
  14. package/dist/EditableSection.js +7 -10
  15. package/dist/EditableText.d.ts +1 -1
  16. package/dist/EditableText.js +8 -33
  17. package/dist/ResponsiveBaseStyles.d.ts +7 -0
  18. package/dist/ResponsiveBaseStyles.js +136 -0
  19. package/dist/SiteDataProvider.d.ts +2 -0
  20. package/dist/SiteDataProvider.js +22 -4
  21. package/dist/StickyMobileBar.js +1 -1
  22. package/dist/ThemeStyles.js +2 -1
  23. package/dist/TrustBadges.js +1 -1
  24. package/dist/contact/FloatingContactWidget.js +3 -2
  25. package/dist/fonts/FontLoader.d.ts +13 -0
  26. package/dist/fonts/FontLoader.js +43 -0
  27. package/dist/fonts/useDenebFonts.d.ts +6 -0
  28. package/dist/fonts/useDenebFonts.js +29 -0
  29. package/dist/hooks/useComponentStyle.d.ts +8 -0
  30. package/dist/hooks/useComponentStyle.js +46 -0
  31. package/dist/index.d.ts +8 -0
  32. package/dist/index.js +33 -1
  33. package/dist/utils/index.d.ts +1 -0
  34. package/dist/utils/index.js +1 -0
  35. package/dist/utils/responsive.d.ts +33 -0
  36. package/dist/utils/responsive.js +100 -0
  37. package/package.json +21 -8
  38. package/scripts/setup-fonts.cjs +26 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useDenebFonts = useDenebFonts;
5
+ const react_1 = require("react");
6
+ const core_1 = require("@deneb-ui/core");
7
+ const SiteDataProvider_1 = require("../SiteDataProvider");
8
+ function useDenebFonts(extraFontIds = []) {
9
+ const siteData = (0, SiteDataProvider_1.useSiteData)();
10
+ const fontIds = (0, react_1.useMemo)(() => {
11
+ const fromSite = (0, core_1.collectFontIdsFromSiteData)(siteData);
12
+ const merged = new Set([...fromSite, ...extraFontIds.filter(Boolean)]);
13
+ return Array.from(merged);
14
+ }, [siteData, extraFontIds]);
15
+ const googleStylesheetUrl = (0, react_1.useMemo)(() => (0, core_1.buildGoogleFontsStylesheetUrl)(fontIds), [fontIds]);
16
+ const cssVariables = (0, react_1.useMemo)(() => {
17
+ const theme = siteData?.theme ??
18
+ siteData
19
+ ?.template?.structure?.theme;
20
+ const heading = (0, core_1.resolveFontFamily)(typeof theme?.headingFont === 'string' ? theme.headingFont : undefined);
21
+ const body = (0, core_1.resolveFontFamily)(typeof theme?.bodyFont === 'string' ? theme.bodyFont : undefined);
22
+ return {
23
+ ...(heading ? { '--heading-font': heading } : {}),
24
+ ...(body ? { '--body-font': body } : {}),
25
+ };
26
+ }, [siteData]);
27
+ const catalog = (0, react_1.useMemo)(() => fontIds.map((id) => (0, core_1.lookupFontDefinition)(id)).filter(Boolean), [fontIds]);
28
+ return { fontIds, googleStylesheetUrl, cssVariables, catalog };
29
+ }
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { type StyleKind } from '@deneb-ui/core';
3
+ import { type GenericRecord } from '../SiteDataProvider';
4
+ export declare function resolveComponentStyle(siteData: GenericRecord, stylePath: string, defaults?: GenericRecord): GenericRecord;
5
+ export declare function useComponentStyle<T extends GenericRecord = GenericRecord>(stylePath: string | undefined, styleKind: StyleKind, defaults?: Partial<T>): {
6
+ style: T;
7
+ cssVars: React.CSSProperties;
8
+ };
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.resolveComponentStyle = resolveComponentStyle;
5
+ exports.useComponentStyle = useComponentStyle;
6
+ const react_1 = require("react");
7
+ const core_1 = require("@deneb-ui/core");
8
+ const SiteDataProvider_1 = require("../SiteDataProvider");
9
+ function getNestedValue(root, dottedPath) {
10
+ if (!root || !dottedPath)
11
+ return undefined;
12
+ const parts = (0, SiteDataProvider_1.parseFieldPath)(dottedPath);
13
+ let current = root;
14
+ for (const part of parts) {
15
+ if (typeof part === 'number') {
16
+ if (!Array.isArray(current))
17
+ return undefined;
18
+ current = current[part];
19
+ }
20
+ else {
21
+ if (!(0, SiteDataProvider_1.isRecord)(current))
22
+ return undefined;
23
+ current = current[part];
24
+ }
25
+ }
26
+ return current;
27
+ }
28
+ function resolveComponentStyle(siteData, stylePath, defaults) {
29
+ const stylesTree = (0, SiteDataProvider_1.isRecord)(siteData.styles) ? siteData.styles : {};
30
+ const fromStylesTree = stylesTree[stylePath];
31
+ const fromContentSuffix = (0, SiteDataProvider_1.getFieldStyle)(siteData.content, stylePath);
32
+ const raw = (0, SiteDataProvider_1.isRecord)(fromStylesTree)
33
+ ? fromStylesTree
34
+ : fromContentSuffix ?? {};
35
+ return { ...(defaults ?? {}), ...raw };
36
+ }
37
+ function useComponentStyle(stylePath, styleKind, defaults) {
38
+ const siteData = (0, SiteDataProvider_1.useSiteData)();
39
+ const merged = (0, react_1.useMemo)(() => {
40
+ if (!stylePath)
41
+ return (defaults ?? {});
42
+ return resolveComponentStyle(siteData, stylePath, defaults);
43
+ }, [siteData, stylePath, defaults]);
44
+ const cssVars = (0, react_1.useMemo)(() => (0, core_1.styleToCssVariables)(styleKind, merged), [styleKind, merged]);
45
+ return { style: merged, cssVars };
46
+ }
package/dist/index.d.ts CHANGED
@@ -32,6 +32,14 @@ export * from './cart/useCart';
32
32
  export * from './EditableCartDrawer';
33
33
  export * from './EditableFilterSidebar';
34
34
  export * from './SiteDataProvider';
35
+ export * from './ThemeStyles';
36
+ export { ResponsiveBaseStyles } from './ResponsiveBaseStyles';
37
+ export { DenebComponentStyles } from './DenebComponentStyles';
38
+ export { FontLoader, DENEB_FONTS_LINK_ID } from './fonts/FontLoader';
39
+ export { useDenebFonts } from './fonts/useDenebFonts';
40
+ export * from './hooks/useComponentStyle';
41
+ export { DENEB_FONT_REGISTRY, DENEB_GOOGLE_FONT_COUNT, buildGoogleFontsStylesheetUrl, collectFontIdsFromSiteData, listFontsByCategory, lookupFontDefinition, normalizeFontId, resolveInstallableFont, formatResponsiveFontSize, } from '@deneb-ui/core';
42
+ export { STYLE_PATCH_MESSAGE, DENEB_STYLE_PATCH_MESSAGE, STYLE_TARGET_ATTRIBUTE, STYLE_TYPE_ATTRIBUTE, patchElementStyle, patchStyleByPath, styleToCssVariables, validateStyleTree, collectStyleTargetsFromHtml, } from '@deneb-ui/core';
35
43
  export * from './utils';
36
44
  export * from './core';
37
45
  export * from './contact';
package/dist/index.js CHANGED
@@ -18,7 +18,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.DENEB_AUTHOR = exports.DENEB_FRAMEWORK_VERSION = exports.DENEB_FRAMEWORK_NAME = exports.FilterSidebar = exports.CartDrawer = exports.FloatingContactWidget = exports.CookieConsentBanner = exports.ProductQuickView = exports.TrustBadges = exports.StickyMobileBar = exports.CategoryPills = exports.AnnouncementBar = exports.HeroSplit = exports.Hero = exports.Footer = exports.Header = exports.Navbar = exports.ContactForm = exports.FAQ = exports.Accordion = exports.TestimonialCard = exports.PricingCard = exports.ServiceCard = exports.CustomerReviews = exports.ProductDetail = exports.ProductGrid = exports.ProductCard = exports.List = exports.Box = exports.Section = exports.Grid = exports.Image = exports.Quote = exports.Badge = exports.Paragraph = exports.Heading = exports.Text = exports.Dialog = exports.Card = exports.Button = void 0;
21
+ exports.Hero = exports.Footer = exports.Header = exports.Navbar = exports.ContactForm = exports.FAQ = exports.Accordion = exports.TestimonialCard = exports.PricingCard = exports.ServiceCard = exports.CustomerReviews = exports.ProductDetail = exports.ProductGrid = exports.ProductCard = exports.List = exports.Box = exports.Section = exports.Grid = exports.Image = exports.Quote = exports.Badge = exports.Paragraph = exports.Heading = exports.Text = exports.Dialog = exports.Card = exports.Button = exports.collectStyleTargetsFromHtml = exports.validateStyleTree = exports.styleToCssVariables = exports.patchStyleByPath = exports.patchElementStyle = exports.STYLE_TYPE_ATTRIBUTE = exports.STYLE_TARGET_ATTRIBUTE = exports.DENEB_STYLE_PATCH_MESSAGE = exports.STYLE_PATCH_MESSAGE = exports.formatResponsiveFontSize = exports.resolveInstallableFont = exports.normalizeFontId = exports.lookupFontDefinition = exports.listFontsByCategory = exports.collectFontIdsFromSiteData = exports.buildGoogleFontsStylesheetUrl = exports.DENEB_GOOGLE_FONT_COUNT = exports.DENEB_FONT_REGISTRY = exports.useDenebFonts = exports.DENEB_FONTS_LINK_ID = exports.FontLoader = exports.DenebComponentStyles = exports.ResponsiveBaseStyles = void 0;
22
+ exports.DENEB_AUTHOR = exports.DENEB_FRAMEWORK_VERSION = exports.DENEB_FRAMEWORK_NAME = exports.FilterSidebar = exports.CartDrawer = exports.FloatingContactWidget = exports.CookieConsentBanner = exports.ProductQuickView = exports.TrustBadges = exports.StickyMobileBar = exports.CategoryPills = exports.AnnouncementBar = exports.HeroSplit = void 0;
22
23
  __exportStar(require("./EditableText"), exports);
23
24
  __exportStar(require("./EditableImage"), exports);
24
25
  __exportStar(require("./EditableList"), exports);
@@ -49,6 +50,37 @@ __exportStar(require("./cart/useCart"), exports);
49
50
  __exportStar(require("./EditableCartDrawer"), exports);
50
51
  __exportStar(require("./EditableFilterSidebar"), exports);
51
52
  __exportStar(require("./SiteDataProvider"), exports);
53
+ __exportStar(require("./ThemeStyles"), exports);
54
+ var ResponsiveBaseStyles_1 = require("./ResponsiveBaseStyles");
55
+ Object.defineProperty(exports, "ResponsiveBaseStyles", { enumerable: true, get: function () { return ResponsiveBaseStyles_1.ResponsiveBaseStyles; } });
56
+ var DenebComponentStyles_1 = require("./DenebComponentStyles");
57
+ Object.defineProperty(exports, "DenebComponentStyles", { enumerable: true, get: function () { return DenebComponentStyles_1.DenebComponentStyles; } });
58
+ var FontLoader_1 = require("./fonts/FontLoader");
59
+ Object.defineProperty(exports, "FontLoader", { enumerable: true, get: function () { return FontLoader_1.FontLoader; } });
60
+ Object.defineProperty(exports, "DENEB_FONTS_LINK_ID", { enumerable: true, get: function () { return FontLoader_1.DENEB_FONTS_LINK_ID; } });
61
+ var useDenebFonts_1 = require("./fonts/useDenebFonts");
62
+ Object.defineProperty(exports, "useDenebFonts", { enumerable: true, get: function () { return useDenebFonts_1.useDenebFonts; } });
63
+ __exportStar(require("./hooks/useComponentStyle"), exports);
64
+ var core_1 = require("@deneb-ui/core");
65
+ Object.defineProperty(exports, "DENEB_FONT_REGISTRY", { enumerable: true, get: function () { return core_1.DENEB_FONT_REGISTRY; } });
66
+ Object.defineProperty(exports, "DENEB_GOOGLE_FONT_COUNT", { enumerable: true, get: function () { return core_1.DENEB_GOOGLE_FONT_COUNT; } });
67
+ Object.defineProperty(exports, "buildGoogleFontsStylesheetUrl", { enumerable: true, get: function () { return core_1.buildGoogleFontsStylesheetUrl; } });
68
+ Object.defineProperty(exports, "collectFontIdsFromSiteData", { enumerable: true, get: function () { return core_1.collectFontIdsFromSiteData; } });
69
+ Object.defineProperty(exports, "listFontsByCategory", { enumerable: true, get: function () { return core_1.listFontsByCategory; } });
70
+ Object.defineProperty(exports, "lookupFontDefinition", { enumerable: true, get: function () { return core_1.lookupFontDefinition; } });
71
+ Object.defineProperty(exports, "normalizeFontId", { enumerable: true, get: function () { return core_1.normalizeFontId; } });
72
+ Object.defineProperty(exports, "resolveInstallableFont", { enumerable: true, get: function () { return core_1.resolveInstallableFont; } });
73
+ Object.defineProperty(exports, "formatResponsiveFontSize", { enumerable: true, get: function () { return core_1.formatResponsiveFontSize; } });
74
+ var core_2 = require("@deneb-ui/core");
75
+ Object.defineProperty(exports, "STYLE_PATCH_MESSAGE", { enumerable: true, get: function () { return core_2.STYLE_PATCH_MESSAGE; } });
76
+ Object.defineProperty(exports, "DENEB_STYLE_PATCH_MESSAGE", { enumerable: true, get: function () { return core_2.DENEB_STYLE_PATCH_MESSAGE; } });
77
+ Object.defineProperty(exports, "STYLE_TARGET_ATTRIBUTE", { enumerable: true, get: function () { return core_2.STYLE_TARGET_ATTRIBUTE; } });
78
+ Object.defineProperty(exports, "STYLE_TYPE_ATTRIBUTE", { enumerable: true, get: function () { return core_2.STYLE_TYPE_ATTRIBUTE; } });
79
+ Object.defineProperty(exports, "patchElementStyle", { enumerable: true, get: function () { return core_2.patchElementStyle; } });
80
+ Object.defineProperty(exports, "patchStyleByPath", { enumerable: true, get: function () { return core_2.patchStyleByPath; } });
81
+ Object.defineProperty(exports, "styleToCssVariables", { enumerable: true, get: function () { return core_2.styleToCssVariables; } });
82
+ Object.defineProperty(exports, "validateStyleTree", { enumerable: true, get: function () { return core_2.validateStyleTree; } });
83
+ Object.defineProperty(exports, "collectStyleTargetsFromHtml", { enumerable: true, get: function () { return core_2.collectStyleTargetsFromHtml; } });
52
84
  // Smart template components & actions
53
85
  __exportStar(require("./utils"), exports);
54
86
  __exportStar(require("./core"), exports);
@@ -1 +1,2 @@
1
1
  export * from './urls';
2
+ export * from './responsive';
@@ -15,3 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./urls"), exports);
18
+ __exportStar(require("./responsive"), exports);
@@ -0,0 +1,33 @@
1
+ /** Standard DENEB UI breakpoints (mobile-first). */
2
+ export declare const BREAKPOINTS: {
3
+ readonly xs: 480;
4
+ readonly sm: 640;
5
+ readonly md: 768;
6
+ readonly lg: 1024;
7
+ readonly xl: 1280;
8
+ };
9
+ export type BreakpointKey = keyof typeof BREAKPOINTS;
10
+ export type DeviceTier = 'mobile' | 'tablet' | 'desktop';
11
+ export declare function getDeviceTier(width: number): DeviceTier;
12
+ export declare function mediaQueryUp(breakpoint: BreakpointKey): string;
13
+ export declare function mediaQueryDown(breakpoint: BreakpointKey): string;
14
+ /**
15
+ * Subscribe to a min-width media query. SSR-safe (defaults to false until mounted).
16
+ */
17
+ export declare function useMediaQuery(query: string, defaultValue?: boolean): boolean;
18
+ /** Current viewport tier: mobile (<768), tablet (768–1023), desktop (≥1024). */
19
+ export declare function useDeviceTier(): DeviceTier;
20
+ export declare function useIsMobile(): boolean;
21
+ export declare function useIsTablet(): boolean;
22
+ export declare function useIsDesktop(): boolean;
23
+ /** Map section padding tokens to fluid clamp values that scale across devices. */
24
+ export declare const RESPONSIVE_SECTION_PADDING: Record<string, string>;
25
+ export interface ResponsiveColumnsConfig {
26
+ mobile?: number;
27
+ tablet?: number;
28
+ desktop?: number;
29
+ }
30
+ export declare function resolveResponsiveColumns(columns: number | ResponsiveColumnsConfig | undefined, minCardWidth?: string): {
31
+ template: string;
32
+ dataAttrs?: Record<string, string>;
33
+ };
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.RESPONSIVE_SECTION_PADDING = exports.BREAKPOINTS = void 0;
5
+ exports.getDeviceTier = getDeviceTier;
6
+ exports.mediaQueryUp = mediaQueryUp;
7
+ exports.mediaQueryDown = mediaQueryDown;
8
+ exports.useMediaQuery = useMediaQuery;
9
+ exports.useDeviceTier = useDeviceTier;
10
+ exports.useIsMobile = useIsMobile;
11
+ exports.useIsTablet = useIsTablet;
12
+ exports.useIsDesktop = useIsDesktop;
13
+ exports.resolveResponsiveColumns = resolveResponsiveColumns;
14
+ const react_1 = require("react");
15
+ /** Standard DENEB UI breakpoints (mobile-first). */
16
+ exports.BREAKPOINTS = {
17
+ xs: 480,
18
+ sm: 640,
19
+ md: 768,
20
+ lg: 1024,
21
+ xl: 1280,
22
+ };
23
+ function getDeviceTier(width) {
24
+ if (width < exports.BREAKPOINTS.md)
25
+ return 'mobile';
26
+ if (width < exports.BREAKPOINTS.lg)
27
+ return 'tablet';
28
+ return 'desktop';
29
+ }
30
+ function mediaQueryUp(breakpoint) {
31
+ return `(min-width: ${exports.BREAKPOINTS[breakpoint]}px)`;
32
+ }
33
+ function mediaQueryDown(breakpoint) {
34
+ return `(max-width: ${exports.BREAKPOINTS[breakpoint] - 0.02}px)`;
35
+ }
36
+ /**
37
+ * Subscribe to a min-width media query. SSR-safe (defaults to false until mounted).
38
+ */
39
+ function useMediaQuery(query, defaultValue = false) {
40
+ const [matches, setMatches] = (0, react_1.useState)(defaultValue);
41
+ (0, react_1.useEffect)(() => {
42
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function')
43
+ return;
44
+ const mql = window.matchMedia(query);
45
+ const onChange = () => setMatches(mql.matches);
46
+ onChange();
47
+ mql.addEventListener('change', onChange);
48
+ return () => mql.removeEventListener('change', onChange);
49
+ }, [query]);
50
+ return matches;
51
+ }
52
+ /** Current viewport tier: mobile (<768), tablet (768–1023), desktop (≥1024). */
53
+ function useDeviceTier() {
54
+ const isDesktop = useMediaQuery(mediaQueryUp('lg'));
55
+ const isTablet = useMediaQuery(mediaQueryUp('md'));
56
+ if (isDesktop)
57
+ return 'desktop';
58
+ if (isTablet)
59
+ return 'tablet';
60
+ return 'mobile';
61
+ }
62
+ function useIsMobile() {
63
+ return useDeviceTier() === 'mobile';
64
+ }
65
+ function useIsTablet() {
66
+ return useDeviceTier() === 'tablet';
67
+ }
68
+ function useIsDesktop() {
69
+ return useDeviceTier() === 'desktop';
70
+ }
71
+ /** Map section padding tokens to fluid clamp values that scale across devices. */
72
+ exports.RESPONSIVE_SECTION_PADDING = {
73
+ none: '0',
74
+ xs: 'clamp(1rem, 3vw, 1.5rem) 0',
75
+ sm: 'clamp(1.5rem, 4vw, 2.5rem) 0',
76
+ md: 'clamp(2rem, 5vw, 4rem) 0',
77
+ lg: 'clamp(2.5rem, 6vw, 6rem) 0',
78
+ xl: 'clamp(3rem, 7vw, 8rem) 0',
79
+ '2xl': 'clamp(3.5rem, 8vw, 10rem) 0',
80
+ };
81
+ function resolveResponsiveColumns(columns, minCardWidth = '280px') {
82
+ if (typeof columns === 'number') {
83
+ return { template: `repeat(${columns}, minmax(0, 1fr))` };
84
+ }
85
+ if (columns && typeof columns === 'object') {
86
+ const mobile = columns.mobile ?? 1;
87
+ const tablet = columns.tablet ?? columns.mobile ?? 2;
88
+ const desktop = columns.desktop ?? columns.tablet ?? 3;
89
+ return {
90
+ template: `repeat(${mobile}, minmax(0, 1fr))`,
91
+ dataAttrs: {
92
+ 'data-deneb-responsive-cols': 'true',
93
+ 'data-cols-mobile': String(mobile),
94
+ 'data-cols-tablet': String(tablet),
95
+ 'data-cols-desktop': String(desktop),
96
+ },
97
+ };
98
+ }
99
+ return { template: `repeat(auto-fit, minmax(${minCardWidth}, 1fr))` };
100
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deneb-ui/ui",
3
- "version": "2.0.22",
4
- "description": "DENEB UI - The premier visual-first React component framework for the modern web. Created by Chamika Gayashan & Induranga Kawishwara.",
3
+ "version": "2.0.24",
4
+ "description": "Visual-first React component library for editable commerce storefronts. Built for Next.js and Fivora.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "publishConfig": {
@@ -12,32 +12,45 @@
12
12
  "url": "git+https://github.com/deneb-ui/core.git",
13
13
  "directory": "packages/deneb-ui"
14
14
  },
15
- "homepage": "https://github.com/deneb-ui/core#readme",
15
+ "homepage": "https://deneb.fivora.site",
16
16
  "bugs": {
17
17
  "url": "https://github.com/deneb-ui/core/issues"
18
18
  },
19
19
  "files": [
20
20
  "dist",
21
+ "scripts",
21
22
  "README.md"
22
23
  ],
23
24
  "scripts": {
24
25
  "build": "tsc",
26
+ "postinstall": "node ./scripts/setup-fonts.cjs",
25
27
  "prepublishOnly": "npm run build"
26
28
  },
27
29
  "keywords": [
28
30
  "deneb",
29
31
  "deneb-ui",
30
32
  "fivora",
33
+ "react",
34
+ "nextjs",
35
+ "components",
36
+ "ui",
31
37
  "ecommerce",
32
- "shadcn",
33
- "heroui",
38
+ "storefront",
34
39
  "visual-editing",
35
- "nextjs",
36
- "react"
40
+ "responsive",
41
+ "typescript",
42
+ "shadcn",
43
+ "tailwind"
37
44
  ],
38
45
  "author": "Chamika Gayashan & Induranga Kawishwara",
46
+ "contributors": [
47
+ "Chamika Gayashan <https://github.com/chamikathereal>",
48
+ "Induranga Kawishwara <https://github.com/Induranga-kawishwara>"
49
+ ],
39
50
  "license": "MIT",
40
- "dependencies": {},
51
+ "dependencies": {
52
+ "@deneb-ui/core": "^2.0.24"
53
+ },
41
54
  "peerDependencies": {
42
55
  "react": "^18.0.0 || ^19.0.0",
43
56
  "react-dom": "^18.0.0 || ^19.0.0"
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Runs after `npm install @deneb-ui/ui`.
5
+ * Walks up to the host Next/React app and self-hosts project fonts.
6
+ * Skip with DENEB_SKIP_FONTS=1.
7
+ */
8
+ if (process.env.DENEB_SKIP_FONTS === '1') {
9
+ process.exit(0);
10
+ }
11
+
12
+ try {
13
+ const { installFontsForHostOf } = require('@deneb-ui/core/install-fonts');
14
+ const result = installFontsForHostOf(__dirname);
15
+ if (result.skipped) {
16
+ process.exit(0);
17
+ }
18
+ if (result.ok && result.installed.length > 0) {
19
+ console.log(
20
+ `[@deneb-ui/ui] Configured ${result.installed.length} font(s): ${result.installed.join(', ')}`,
21
+ );
22
+ }
23
+ } catch {
24
+ // Never fail the host npm install because fonts could not be configured.
25
+ process.exit(0);
26
+ }