@deneb-ui/ui 2.0.0 → 2.0.3

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/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  > **DENEB UI — Build beautiful interfaces, effortlessly.**
6
6
  > The premier visual-first React component ecosystem.
7
- > Created by **Chamika Gayashan (CEE G)**.
7
+ > Created by **Chamika Gayashan & Induranga Kawishwara**.
8
8
 
9
9
  [![Framework: DENEB UI](https://img.shields.io/badge/Framework-DENEB_UI_v2.0-blue.svg)](https://github.com/chamikathereal)
10
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-orange.svg)](https://opensource.org/licenses/MIT)
@@ -178,5 +178,5 @@ export default function HomePage() {
178
178
 
179
179
  ## Author & Credits
180
180
 
181
- Created and architected by **Chamika Gayashan (CEE G)**.
181
+ Created and architected by **Chamika Gayashan & Induranga Kawishwara**.
182
182
  Built for the global React and storefront developer ecosystem.
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ export interface EditableAnnouncementBarProps {
3
+ fieldPath?: string;
4
+ defaultText?: string;
5
+ defaultBadge?: string;
6
+ defaultLinkText?: string;
7
+ defaultLinkUrl?: string;
8
+ dismissible?: boolean;
9
+ className?: string;
10
+ style?: React.CSSProperties;
11
+ }
12
+ /**
13
+ * DENEB UI — Visual-First Announcement Bar
14
+ *
15
+ * High-converting top promotional ribbon for store announcements,
16
+ * coupon codes, and limited-time offers.
17
+ *
18
+ * Features:
19
+ * - Live bidirectional Fivora editing bindings (`data-preview-field-path`)
20
+ * - Auto-resolves from site-data.json (`site.announcement` or custom path)
21
+ * - Dismissible button with clean client animation
22
+ * - Tailwind CSS + resilient inline styling fallbacks
23
+ *
24
+ * Created by Chamika Gayashan & Induranga Kawishwara
25
+ */
26
+ export declare function EditableAnnouncementBar({ fieldPath, defaultText, defaultBadge, defaultLinkText, defaultLinkUrl, dismissible, className, style, }: EditableAnnouncementBarProps): React.JSX.Element | null;
27
+ export declare const AnnouncementBar: typeof EditableAnnouncementBar;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnnouncementBar = void 0;
4
+ exports.EditableAnnouncementBar = EditableAnnouncementBar;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const SiteDataProvider_1 = require("./SiteDataProvider");
8
+ /**
9
+ * DENEB UI — Visual-First Announcement Bar
10
+ *
11
+ * High-converting top promotional ribbon for store announcements,
12
+ * coupon codes, and limited-time offers.
13
+ *
14
+ * Features:
15
+ * - Live bidirectional Fivora editing bindings (`data-preview-field-path`)
16
+ * - Auto-resolves from site-data.json (`site.announcement` or custom path)
17
+ * - Dismissible button with clean client animation
18
+ * - Tailwind CSS + resilient inline styling fallbacks
19
+ *
20
+ * Created by Chamika Gayashan & Induranga Kawishwara
21
+ */
22
+ function EditableAnnouncementBar({ fieldPath = 'site.announcement', defaultText = 'Free worldwide shipping on all orders over $50 — Use code: DENEB10', defaultBadge = 'PROMO', defaultLinkText, defaultLinkUrl, dismissible = true, className = '', style = {}, }) {
23
+ const { siteData } = (0, SiteDataProvider_1.useSiteData)();
24
+ const [isDismissed, setIsDismissed] = (0, react_1.useState)(false);
25
+ // Resolve dynamic values from siteData if present
26
+ const announcementData = siteData?.site?.announcement;
27
+ const isEnabled = announcementData?.enabled !== false;
28
+ const text = announcementData?.text || defaultText;
29
+ const badge = announcementData?.badge || defaultBadge;
30
+ const linkText = announcementData?.linkText || defaultLinkText;
31
+ const linkUrl = announcementData?.linkUrl || defaultLinkUrl;
32
+ if (isDismissed || !isEnabled) {
33
+ return null;
34
+ }
35
+ const containerStyle = {
36
+ position: 'relative',
37
+ zIndex: 40,
38
+ backgroundColor: 'var(--color-primary, #0f172a)',
39
+ color: '#ffffff',
40
+ fontSize: '0.8125rem',
41
+ lineHeight: '1.25rem',
42
+ fontWeight: 500,
43
+ padding: '0.5rem 1rem',
44
+ display: 'flex',
45
+ alignItems: 'center',
46
+ justifyContent: 'center',
47
+ textAlign: 'center',
48
+ transition: 'all 0.2s ease',
49
+ ...style,
50
+ };
51
+ const badgeStyle = {
52
+ backgroundColor: 'rgba(255, 255, 255, 0.2)',
53
+ color: '#ffffff',
54
+ padding: '0.125rem 0.5rem',
55
+ borderRadius: '9999px',
56
+ fontSize: '0.6875rem',
57
+ fontWeight: 700,
58
+ letterSpacing: '0.05em',
59
+ textTransform: 'uppercase',
60
+ marginRight: '0.5rem',
61
+ display: 'inline-flex',
62
+ alignItems: 'center',
63
+ };
64
+ const linkStyle = {
65
+ marginLeft: '0.5rem',
66
+ textDecoration: 'underline',
67
+ fontWeight: 600,
68
+ color: '#ffffff',
69
+ display: 'inline-flex',
70
+ alignItems: 'center',
71
+ };
72
+ const closeButtonStyle = {
73
+ position: 'absolute',
74
+ right: '0.75rem',
75
+ top: '50%',
76
+ transform: 'translateY(-50%)',
77
+ background: 'none',
78
+ border: 'none',
79
+ color: 'rgba(255, 255, 255, 0.7)',
80
+ cursor: 'pointer',
81
+ padding: '0.25rem',
82
+ display: 'flex',
83
+ alignItems: 'center',
84
+ justifyContent: 'center',
85
+ borderRadius: '0.25rem',
86
+ transition: 'color 0.15s ease',
87
+ };
88
+ const hasDynamicField = Boolean(fieldPath && siteData?.site?.announcement);
89
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `deneb-announcement-bar relative z-40 bg-slate-900 text-white text-xs md:text-sm font-medium px-4 py-2 flex items-center justify-center text-center ${className}`, style: containerStyle, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-center flex-wrap gap-1.5 max-w-7xl mx-auto pr-6", children: [badge && ((0, jsx_runtime_1.jsx)("span", { className: "deneb-announcement-badge bg-white/20 text-white px-2 py-0.5 rounded-full text-[10px] font-bold tracking-wider uppercase inline-flex items-center", style: badgeStyle, ...(hasDynamicField ? { 'data-preview-field-path': `${fieldPath}.badge` } : { 'data-preview-static': 'announcement-badge' }), children: badge })), (0, jsx_runtime_1.jsx)("span", { className: "deneb-announcement-text", ...(hasDynamicField ? { 'data-preview-field-path': `${fieldPath}.text` } : { 'data-preview-static': 'announcement-text' }), children: text }), linkText && linkUrl && ((0, jsx_runtime_1.jsxs)("a", { href: linkUrl, className: "deneb-announcement-link underline font-semibold text-white hover:opacity-90 transition-opacity ml-1 inline-flex items-center gap-1", style: linkStyle, ...(hasDynamicField ? { 'data-preview-field-path': `${fieldPath}.linkText` } : { 'data-preview-static': 'announcement-link' }), children: [linkText, " \u2192"] }))] }), dismissible && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => setIsDismissed(true), style: closeButtonStyle, "aria-label": "Dismiss announcement", className: "hover:text-white transition-colors", "data-preview-static": "announcement-dismiss", children: (0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [(0, jsx_runtime_1.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), (0, jsx_runtime_1.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) }))] }));
90
+ }
91
+ // Canonical alias
92
+ exports.AnnouncementBar = EditableAnnouncementBar;
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ export interface EditableCategoryPillsProps {
3
+ categories?: string[];
4
+ fieldPath?: string;
5
+ selectedCategory?: string;
6
+ onSelectCategory?: (category: string) => void;
7
+ allLabel?: string;
8
+ className?: string;
9
+ style?: React.CSSProperties;
10
+ }
11
+ /**
12
+ * DENEB UI — Category Pills Filter Bar
13
+ *
14
+ * High-converting horizontal filter ribbon for catalog and shop pages.
15
+ * Supports live active tab switching, smooth horizontal scrolling,
16
+ * and visual editing annotations.
17
+ *
18
+ * Created by Chamika Gayashan & Induranga Kawishwara
19
+ */
20
+ export declare function EditableCategoryPills({ categories, fieldPath, selectedCategory: controlledSelected, onSelectCategory, allLabel, className, style, }: EditableCategoryPillsProps): React.JSX.Element;
21
+ export declare const CategoryPills: typeof EditableCategoryPills;
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CategoryPills = void 0;
37
+ exports.EditableCategoryPills = EditableCategoryPills;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ const react_1 = __importStar(require("react"));
40
+ const SiteDataProvider_1 = require("./SiteDataProvider");
41
+ const DEFAULT_CATEGORIES = ['All', 'Featured', 'New Arrivals', 'Best Sellers', 'Sale'];
42
+ /**
43
+ * DENEB UI — Category Pills Filter Bar
44
+ *
45
+ * High-converting horizontal filter ribbon for catalog and shop pages.
46
+ * Supports live active tab switching, smooth horizontal scrolling,
47
+ * and visual editing annotations.
48
+ *
49
+ * Created by Chamika Gayashan & Induranga Kawishwara
50
+ */
51
+ function EditableCategoryPills({ categories, fieldPath = 'categories', selectedCategory: controlledSelected, onSelectCategory, allLabel = 'All', className = '', style = {}, }) {
52
+ const { siteData } = (0, SiteDataProvider_1.useSiteData)();
53
+ const [internalSelected, setInternalSelected] = (0, react_1.useState)(allLabel);
54
+ const activeCategory = controlledSelected !== undefined ? controlledSelected : internalSelected;
55
+ // Resolve list of categories
56
+ const resolvedCategories = react_1.default.useMemo(() => {
57
+ if (categories && categories.length > 0) {
58
+ return categories.includes(allLabel) ? categories : [allLabel, ...categories];
59
+ }
60
+ const rawCategories = siteData?.categories;
61
+ if (Array.isArray(rawCategories) && rawCategories.length > 0) {
62
+ const cats = rawCategories.map((c) => (typeof c === 'string' ? c : c.name || String(c)));
63
+ return cats.includes(allLabel) ? cats : [allLabel, ...cats];
64
+ }
65
+ // Infer categories from products array if present
66
+ const rawProducts = siteData?.products;
67
+ if (Array.isArray(rawProducts) && rawProducts.length > 0) {
68
+ const inferred = Array.from(new Set(rawProducts.map((p) => p.category).filter(Boolean)));
69
+ if (inferred.length > 0) {
70
+ return [allLabel, ...inferred];
71
+ }
72
+ }
73
+ return DEFAULT_CATEGORIES;
74
+ }, [categories, siteData, allLabel]);
75
+ const handleSelect = (category) => {
76
+ if (controlledSelected === undefined) {
77
+ setInternalSelected(category);
78
+ }
79
+ if (onSelectCategory) {
80
+ onSelectCategory(category);
81
+ }
82
+ };
83
+ return ((0, jsx_runtime_1.jsx)("nav", { className: `deneb-category-pills flex items-center gap-2 overflow-x-auto py-2 no-scrollbar ${className}`, style: {
84
+ display: 'flex',
85
+ alignItems: 'center',
86
+ gap: '0.5rem',
87
+ overflowX: 'auto',
88
+ paddingTop: '0.5rem',
89
+ paddingBottom: '0.5rem',
90
+ scrollbarWidth: 'none',
91
+ msOverflowStyle: 'none',
92
+ ...style,
93
+ }, "data-preview-field-path": fieldPath, "aria-label": "Product categories", children: resolvedCategories.map((cat, idx) => {
94
+ const isSelected = activeCategory.toLowerCase() === cat.toLowerCase();
95
+ return ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => handleSelect(cat), className: `deneb-pill px-4 py-2 rounded-full text-xs md:text-sm font-semibold whitespace-nowrap transition-all duration-200 border ${isSelected
96
+ ? 'bg-slate-900 text-white border-slate-900 shadow-sm scale-105'
97
+ : 'bg-white text-slate-600 border-slate-200 hover:border-slate-300 hover:text-slate-900 hover:bg-slate-50'}`, style: {
98
+ padding: '0.5rem 1rem',
99
+ borderRadius: '9999px',
100
+ fontSize: '0.8125rem',
101
+ fontWeight: 600,
102
+ whiteSpace: 'nowrap',
103
+ cursor: 'pointer',
104
+ transition: 'all 0.2s ease',
105
+ border: isSelected ? '1px solid var(--color-primary, #0f172a)' : '1px solid #e2e8f0',
106
+ backgroundColor: isSelected ? 'var(--color-primary, #0f172a)' : '#ffffff',
107
+ color: isSelected ? '#ffffff' : '#475569',
108
+ boxShadow: isSelected ? '0 1px 3px rgba(0,0,0,0.1)' : 'none',
109
+ }, "data-preview-field-path": `${fieldPath}.${idx}`, "aria-pressed": isSelected, children: cat }, `${cat}-${idx}`));
110
+ }) }));
111
+ }
112
+ // Canonical alias
113
+ exports.CategoryPills = EditableCategoryPills;
@@ -25,7 +25,7 @@ export interface EditableFooterProps extends React.HTMLAttributes<HTMLElement> {
25
25
  * - Route Filtering Compliance (`data-target-page` wrappers)
26
26
  * - Tailored Tailwind CSS utility classes + resilient inline CSS fallbacks
27
27
  *
28
- * Created by Chamika Gayashan (CEE G)
28
+ * Created by Chamika Gayashan & Induranga Kawishwara
29
29
  */
30
30
  export declare function EditableFooter({ defaultLinks, links, basePath, showNewsletter, className, style, ...props }: EditableFooterProps): React.JSX.Element;
31
31
  export declare const Footer: typeof EditableFooter;
@@ -27,7 +27,7 @@ const DEFAULT_FOOTER_PAGES = [
27
27
  * - Route Filtering Compliance (`data-target-page` wrappers)
28
28
  * - Tailored Tailwind CSS utility classes + resilient inline CSS fallbacks
29
29
  *
30
- * Created by Chamika Gayashan (CEE G)
30
+ * Created by Chamika Gayashan & Induranga Kawishwara
31
31
  */
32
32
  function EditableFooter({ defaultLinks = DEFAULT_FOOTER_PAGES, links, basePath = '', showNewsletter = true, className = '', style, ...props }) {
33
33
  const siteData = (0, SiteDataProvider_1.useSiteData)();
@@ -21,7 +21,7 @@ export interface EditableNavbarProps extends React.HTMLAttributes<HTMLElement> {
21
21
  * - Responsive mobile toggle and drawer menu
22
22
  * - Tailwind CSS classes + resilient inline CSS fallbacks
23
23
  *
24
- * Created by Chamika Gayashan (CEE G)
24
+ * Created by Chamika Gayashan & Induranga Kawishwara
25
25
  */
26
26
  export declare function EditableNavbar({ defaultLinks, sticky, activeRoute, basePath, className, style, ...props }: EditableNavbarProps): React.JSX.Element;
27
27
  export declare const Navbar: typeof EditableNavbar;
@@ -23,7 +23,7 @@ const DEFAULT_PAGES = [
23
23
  * - Responsive mobile toggle and drawer menu
24
24
  * - Tailwind CSS classes + resilient inline CSS fallbacks
25
25
  *
26
- * Created by Chamika Gayashan (CEE G)
26
+ * Created by Chamika Gayashan & Induranga Kawishwara
27
27
  */
28
28
  function EditableNavbar({ defaultLinks = DEFAULT_PAGES, sticky = true, activeRoute, basePath = '', className = '', style, ...props }) {
29
29
  const siteData = (0, SiteDataProvider_1.useSiteData)();
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ export interface FloatingContactWidgetProps {
3
+ fieldPath?: string;
4
+ defaultPhone?: string;
5
+ defaultWhatsApp?: string;
6
+ defaultEmail?: string;
7
+ defaultMessage?: string;
8
+ position?: 'bottom-right' | 'bottom-left';
9
+ className?: string;
10
+ style?: React.CSSProperties;
11
+ }
12
+ /**
13
+ * DENEB UI — Floating Contact Widget
14
+ *
15
+ * Sticky conversion powerhouse widget for e-commerce and local commerce storefronts.
16
+ * Sits elegantly in the corner of the screen across desktop and mobile, offering
17
+ * instant 1-click WhatsApp chat, phone calls, and email inquiries.
18
+ *
19
+ * Created by Chamika Gayashan & Induranga Kawishwara
20
+ */
21
+ export declare function FloatingContactWidget({ fieldPath, defaultPhone, defaultWhatsApp, defaultEmail, defaultMessage, position, className, style, }: FloatingContactWidgetProps): React.JSX.Element | null;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FloatingContactWidget = FloatingContactWidget;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const SiteDataProvider_1 = require("../SiteDataProvider");
7
+ const urls_1 = require("../utils/urls");
8
+ /**
9
+ * DENEB UI — Floating Contact Widget
10
+ *
11
+ * Sticky conversion powerhouse widget for e-commerce and local commerce storefronts.
12
+ * Sits elegantly in the corner of the screen across desktop and mobile, offering
13
+ * instant 1-click WhatsApp chat, phone calls, and email inquiries.
14
+ *
15
+ * Created by Chamika Gayashan & Induranga Kawishwara
16
+ */
17
+ function FloatingContactWidget({ fieldPath = 'contact', defaultPhone, defaultWhatsApp, defaultEmail, defaultMessage = 'Hello! I have an inquiry about your products.', position = 'bottom-right', className = '', style = {}, }) {
18
+ const { siteData } = (0, SiteDataProvider_1.useSiteData)();
19
+ const [isOpen, setIsOpen] = (0, react_1.useState)(false);
20
+ const contactData = siteData?.contact || {};
21
+ const phone = contactData.phone || defaultPhone || '';
22
+ const whatsapp = contactData.whatsapp || defaultWhatsApp || phone;
23
+ const email = contactData.email || defaultEmail || '';
24
+ const storeName = siteData?.site?.name || 'Support';
25
+ const hasWhatsApp = Boolean(whatsapp && whatsapp.trim().length > 0);
26
+ const hasPhone = Boolean(phone && phone.trim().length > 0);
27
+ const hasEmail = Boolean(email && email.trim().length > 0);
28
+ // If no contact channel exists, hide cleanly
29
+ if (!hasWhatsApp && !hasPhone && !hasEmail) {
30
+ return null;
31
+ }
32
+ const isRight = position === 'bottom-right';
33
+ const containerStyle = {
34
+ position: 'fixed',
35
+ bottom: '1.5rem',
36
+ [isRight ? 'right' : 'left']: '1.5rem',
37
+ zIndex: 50,
38
+ fontFamily: 'inherit',
39
+ ...style,
40
+ };
41
+ const bubbleStyle = {
42
+ backgroundColor: '#25D366', // Official WhatsApp green
43
+ color: '#ffffff',
44
+ width: '3.5rem',
45
+ height: '3.5rem',
46
+ borderRadius: '9999px',
47
+ boxShadow: '0 10px 25px -5px rgba(37, 211, 102, 0.4), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',
48
+ display: 'flex',
49
+ alignItems: 'center',
50
+ justifyContent: 'center',
51
+ cursor: 'pointer',
52
+ border: 'none',
53
+ transition: 'transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s ease',
54
+ };
55
+ const menuStyle = {
56
+ position: 'absolute',
57
+ bottom: '4.25rem',
58
+ [isRight ? 'right' : 'left']: '0',
59
+ width: '18rem',
60
+ backgroundColor: '#ffffff',
61
+ borderRadius: '1rem',
62
+ boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.15), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
63
+ border: '1px solid rgba(226, 232, 240, 0.8)',
64
+ overflow: 'hidden',
65
+ animation: 'deneb-pop 0.2s cubic-bezier(0.16, 1, 0.3, 1)',
66
+ };
67
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `deneb-floating-contact fixed z-50 bottom-6 ${isRight ? 'right-6' : 'left-6'} ${className}`, style: containerStyle, "data-preview-field-path": fieldPath, children: [isOpen && ((0, jsx_runtime_1.jsxs)("div", { className: "deneb-contact-popup absolute bottom-16 bg-white rounded-2xl shadow-2xl border border-slate-200 w-72 overflow-hidden text-slate-800", style: menuStyle, children: [(0, jsx_runtime_1.jsxs)("div", { className: "bg-slate-900 text-white p-4 flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h4", { className: "font-bold text-sm leading-tight text-white", children: storeName }), (0, jsx_runtime_1.jsxs)("p", { className: "text-xs text-emerald-400 font-medium flex items-center gap-1.5 mt-0.5", children: [(0, jsx_runtime_1.jsx)("span", { className: "w-2 h-2 rounded-full bg-emerald-400 animate-pulse" }), "Online & Ready to Help"] })] }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => setIsOpen(false), className: "text-slate-400 hover:text-white p-1 rounded transition-colors", "aria-label": "Close contact drawer", children: (0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: [(0, jsx_runtime_1.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), (0, jsx_runtime_1.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-3 space-y-2 text-sm bg-slate-50", children: [hasWhatsApp && ((0, jsx_runtime_1.jsxs)("a", { href: (0, urls_1.createWhatsAppUrl)(whatsapp, defaultMessage), target: "_blank", rel: "noopener noreferrer", className: "flex items-center gap-3 p-2.5 rounded-xl bg-white border border-slate-200/80 hover:border-emerald-400 hover:shadow-sm transition-all text-slate-800", "data-preview-field-path": `${fieldPath}.whatsapp`, children: [(0, jsx_runtime_1.jsx)("div", { className: "w-9 h-9 rounded-lg bg-emerald-50 text-emerald-600 flex items-center justify-center flex-shrink-0", children: (0, jsx_runtime_1.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { d: "M12.031 6.172c-3.181 0-5.767 2.586-5.768 5.766-.001 1.298.38 2.27 1.019 3.287l-.582 2.128 2.182-.573c.978.58 1.911.928 3.145.929 3.178 0 5.767-2.587 5.768-5.766.001-3.187-2.575-5.77-5.764-5.771zm3.392 8.244c-.144.405-.837.774-1.17.824-.312.045-.694.062-1.116-.073-.266-.086-.61-.225-1.047-.417-1.854-.814-3.056-2.695-3.15-2.819-.092-.124-.755-.999-.755-1.907 0-.909.479-1.353.649-1.536.17-.183.371-.23.495-.23.124 0 .248.002.355.008.113.006.265-.043.414.316.155.372.531 1.296.577 1.39.046.094.077.204.015.328-.061.124-.092.202-.184.31-.092.108-.195.241-.278.324-.093.093-.19.195-.082.381.109.186.483.797 1.037 1.289.713.633 1.314.829 1.501.922.186.093.295.078.404-.047.11-.124.467-.543.591-.729.124-.186.248-.155.418-.093.17.062 1.082.51 1.268.603.186.093.31.14.356.217.046.077.046.449-.098.854z" }) }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 min-w-0", children: [(0, jsx_runtime_1.jsx)("div", { className: "font-semibold text-slate-900 text-xs", children: "Chat on WhatsApp" }), (0, jsx_runtime_1.jsx)("div", { className: "text-[11px] text-slate-500 truncate", children: whatsapp })] })] })), hasPhone && ((0, jsx_runtime_1.jsxs)("a", { href: (0, urls_1.createPhoneUrl)(phone), className: "flex items-center gap-3 p-2.5 rounded-xl bg-white border border-slate-200/80 hover:border-blue-400 hover:shadow-sm transition-all text-slate-800", "data-preview-field-path": `${fieldPath}.phone`, children: [(0, jsx_runtime_1.jsx)("div", { className: "w-9 h-9 rounded-lg bg-blue-50 text-blue-600 flex items-center justify-center flex-shrink-0", children: (0, jsx_runtime_1.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: (0, jsx_runtime_1.jsx)("path", { d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z" }) }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 min-w-0", children: [(0, jsx_runtime_1.jsx)("div", { className: "font-semibold text-slate-900 text-xs", children: "Direct Call" }), (0, jsx_runtime_1.jsx)("div", { className: "text-[11px] text-slate-500 truncate", children: phone })] })] })), hasEmail && ((0, jsx_runtime_1.jsxs)("a", { href: (0, urls_1.createEmailUrl)(email, `Inquiry: ${storeName}`), className: "flex items-center gap-3 p-2.5 rounded-xl bg-white border border-slate-200/80 hover:border-purple-400 hover:shadow-sm transition-all text-slate-800", "data-preview-field-path": `${fieldPath}.email`, children: [(0, jsx_runtime_1.jsx)("div", { className: "w-9 h-9 rounded-lg bg-purple-50 text-purple-600 flex items-center justify-center flex-shrink-0", children: (0, jsx_runtime_1.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [(0, jsx_runtime_1.jsx)("path", { d: "M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z" }), (0, jsx_runtime_1.jsx)("polyline", { points: "22,6 12,13 2,6" })] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 min-w-0", children: [(0, jsx_runtime_1.jsx)("div", { className: "font-semibold text-slate-900 text-xs", children: "Send Email" }), (0, jsx_runtime_1.jsx)("div", { className: "text-[11px] text-slate-500 truncate", children: email })] })] }))] })] })), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => setIsOpen(!isOpen), style: bubbleStyle, className: "deneb-bubble hover:scale-105 active:scale-95 flex items-center justify-center focus:outline-none", "aria-label": "Toggle contact channels", children: isOpen ? ((0, jsx_runtime_1.jsxs)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [(0, jsx_runtime_1.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), (0, jsx_runtime_1.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] })) : ((0, jsx_runtime_1.jsx)("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { d: "M12.031 6.172c-3.181 0-5.767 2.586-5.768 5.766-.001 1.298.38 2.27 1.019 3.287l-.582 2.128 2.182-.573c.978.58 1.911.928 3.145.929 3.178 0 5.767-2.587 5.768-5.766.001-3.187-2.575-5.77-5.764-5.771zm3.392 8.244c-.144.405-.837.774-1.17.824-.312.045-.694.062-1.116-.073-.266-.086-.61-.225-1.047-.417-1.854-.814-3.056-2.695-3.15-2.819-.092-.124-.755-.999-.755-1.907 0-.909.479-1.353.649-1.536.17-.183.371-.23.495-.23.124 0 .248.002.355.008.113.006.265-.043.414.316.155.372.531 1.296.577 1.39.046.094.077.204.015.328-.061.124-.092.202-.184.31-.092.108-.195.241-.278.324-.093.093-.19.195-.082.381.109.186.483.797 1.037 1.289.713.633 1.314.829 1.501.922.186.093.295.078.404-.047.11-.124.467-.543.591-.729.124-.186.248-.155.418-.093.17.062 1.082.51 1.268.603.186.093.31.14.356.217.046.077.046.449-.098.854z" }) })) })] }));
68
+ }
@@ -3,3 +3,4 @@ export * from './WhatsAppButton';
3
3
  export * from './PhoneButton';
4
4
  export * from './EmailButton';
5
5
  export * from './ContactActions';
6
+ export * from './FloatingContactWidget';
@@ -19,3 +19,4 @@ __exportStar(require("./WhatsAppButton"), exports);
19
19
  __exportStar(require("./PhoneButton"), exports);
20
20
  __exportStar(require("./EmailButton"), exports);
21
21
  __exportStar(require("./ContactActions"), exports);
22
+ __exportStar(require("./FloatingContactWidget"), exports);
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DENEB UI — The Visual-First React Framework for High-Converting Storefronts
3
- * Created by Chamika Gayashan (CEE G)
3
+ * Created by Chamika Gayashan & Induranga Kawishwara
4
4
  */
5
5
  export * from './EditableText';
6
6
  export * from './EditableImage';
@@ -19,6 +19,8 @@ export * from './EditableNavbar';
19
19
  export * from './EditableFooter';
20
20
  export * from './EditableHero';
21
21
  export * from './EditableDialog';
22
+ export * from './EditableAnnouncementBar';
23
+ export * from './EditableCategoryPills';
22
24
  export * from './ThemeStyles';
23
25
  export * from './SiteDataProvider';
24
26
  export * from './utils';
@@ -49,13 +51,16 @@ export { EditableContactForm as ContactForm } from './EditableContactForm';
49
51
  export { EditableNavbar as Navbar, EditableNavbar as Header } from './EditableNavbar';
50
52
  export { EditableFooter as Footer } from './EditableFooter';
51
53
  export { EditableHeroCentered as Hero, EditableHeroSplit as HeroSplit } from './EditableHero';
54
+ export { EditableAnnouncementBar as AnnouncementBar } from './EditableAnnouncementBar';
55
+ export { EditableCategoryPills as CategoryPills } from './EditableCategoryPills';
56
+ export { FloatingContactWidget } from './contact/FloatingContactWidget';
52
57
  /**
53
58
  * DENEB UI Framework Metadata
54
- * Developed by Chamika Gayashan (CEE G)
59
+ * Developed by Chamika Gayashan & Induranga Kawishwara
55
60
  */
56
61
  export declare const DENEB_FRAMEWORK_NAME = "DENEB UI";
57
62
  export declare const DENEB_FRAMEWORK_VERSION = "2.0.0";
58
- export declare const DENEB_AUTHOR = "Chamika Gayashan (CEE G)";
63
+ export declare const DENEB_AUTHOR = "Chamika Gayashan & Induranga Kawishwara";
59
64
  export declare const CEEG_FRAMEWORK_NAME = "DENEB UI";
60
65
  export declare const CEEG_FRAMEWORK_VERSION = "2.0.0";
61
- export declare const CEEG_AUTHOR = "Chamika Gayashan (CEE G)";
66
+ export declare const CEEG_AUTHOR = "Chamika Gayashan & Induranga Kawishwara";
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
3
  * DENEB UI — The Visual-First React Framework for High-Converting Storefronts
4
- * Created by Chamika Gayashan (CEE G)
4
+ * Created by Chamika Gayashan & Induranga Kawishwara
5
5
  */
6
6
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
7
  if (k2 === undefined) k2 = k;
@@ -18,7 +18,7 @@ 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.CEEG_AUTHOR = exports.CEEG_FRAMEWORK_VERSION = exports.CEEG_FRAMEWORK_NAME = exports.DENEB_AUTHOR = exports.DENEB_FRAMEWORK_VERSION = exports.DENEB_FRAMEWORK_NAME = exports.HeroSplit = exports.Hero = exports.Footer = exports.Header = exports.Navbar = exports.ContactForm = exports.FAQ = exports.Accordion = exports.TestimonialCard = exports.PricingCard = exports.ServiceCard = 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.CEEG_AUTHOR = exports.CEEG_FRAMEWORK_VERSION = exports.CEEG_FRAMEWORK_NAME = exports.DENEB_AUTHOR = exports.DENEB_FRAMEWORK_VERSION = exports.DENEB_FRAMEWORK_NAME = exports.FloatingContactWidget = 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.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;
22
22
  __exportStar(require("./EditableText"), exports);
23
23
  __exportStar(require("./EditableImage"), exports);
24
24
  __exportStar(require("./EditableList"), exports);
@@ -36,6 +36,8 @@ __exportStar(require("./EditableNavbar"), exports);
36
36
  __exportStar(require("./EditableFooter"), exports);
37
37
  __exportStar(require("./EditableHero"), exports);
38
38
  __exportStar(require("./EditableDialog"), exports);
39
+ __exportStar(require("./EditableAnnouncementBar"), exports);
40
+ __exportStar(require("./EditableCategoryPills"), exports);
39
41
  __exportStar(require("./ThemeStyles"), exports);
40
42
  __exportStar(require("./SiteDataProvider"), exports);
41
43
  // Smart template components & actions
@@ -93,13 +95,19 @@ Object.defineProperty(exports, "Footer", { enumerable: true, get: function () {
93
95
  var EditableHero_1 = require("./EditableHero");
94
96
  Object.defineProperty(exports, "Hero", { enumerable: true, get: function () { return EditableHero_1.EditableHeroCentered; } });
95
97
  Object.defineProperty(exports, "HeroSplit", { enumerable: true, get: function () { return EditableHero_1.EditableHeroSplit; } });
98
+ var EditableAnnouncementBar_1 = require("./EditableAnnouncementBar");
99
+ Object.defineProperty(exports, "AnnouncementBar", { enumerable: true, get: function () { return EditableAnnouncementBar_1.EditableAnnouncementBar; } });
100
+ var EditableCategoryPills_1 = require("./EditableCategoryPills");
101
+ Object.defineProperty(exports, "CategoryPills", { enumerable: true, get: function () { return EditableCategoryPills_1.EditableCategoryPills; } });
102
+ var FloatingContactWidget_1 = require("./contact/FloatingContactWidget");
103
+ Object.defineProperty(exports, "FloatingContactWidget", { enumerable: true, get: function () { return FloatingContactWidget_1.FloatingContactWidget; } });
96
104
  /**
97
105
  * DENEB UI Framework Metadata
98
- * Developed by Chamika Gayashan (CEE G)
106
+ * Developed by Chamika Gayashan & Induranga Kawishwara
99
107
  */
100
108
  exports.DENEB_FRAMEWORK_NAME = 'DENEB UI';
101
109
  exports.DENEB_FRAMEWORK_VERSION = '2.0.0';
102
- exports.DENEB_AUTHOR = 'Chamika Gayashan (CEE G)';
110
+ exports.DENEB_AUTHOR = 'Chamika Gayashan & Induranga Kawishwara';
103
111
  // Backward compatibility alias
104
112
  exports.CEEG_FRAMEWORK_NAME = exports.DENEB_FRAMEWORK_NAME;
105
113
  exports.CEEG_FRAMEWORK_VERSION = exports.DENEB_FRAMEWORK_VERSION;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DENEB UI — URL & Action Helpers
3
- * Created by Chamika Gayashan (CEE G)
3
+ * Created by Chamika Gayashan & Induranga Kawishwara
4
4
  */
5
5
  export interface MapLocationInput {
6
6
  mapUrl?: string | null;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
3
  * DENEB UI — URL & Action Helpers
4
- * Created by Chamika Gayashan (CEE G)
4
+ * Created by Chamika Gayashan & Induranga Kawishwara
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.createWhatsAppUrl = createWhatsAppUrl;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deneb-ui/ui",
3
- "version": "2.0.0",
4
- "description": "DENEB UI - The Visual-First React Framework for High-Converting Fivora Storefronts, created by Chamika Gayashan (CEE G).",
3
+ "version": "2.0.3",
4
+ "description": "DENEB UI - The premier visual-first React component framework for the modern web. Created by Chamika Gayashan & Induranga Kawishwara.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "publishConfig": {
@@ -26,7 +26,7 @@
26
26
  "nextjs",
27
27
  "react"
28
28
  ],
29
- "author": "Chamika Gayashan (CEE G)",
29
+ "author": "Chamika Gayashan & Induranga Kawishwara",
30
30
  "license": "MIT",
31
31
  "dependencies": {},
32
32
  "peerDependencies": {