@deneb-ui/cli 2.0.73 → 2.0.74
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/bin/index.js +134 -32
- package/package.json +2 -2
package/bin/index.js
CHANGED
|
@@ -572,7 +572,7 @@ function getComponentRegistry(importPkg) {
|
|
|
572
572
|
'product-card': {
|
|
573
573
|
file: 'ProductCard.tsx',
|
|
574
574
|
component: 'EditableProductCard',
|
|
575
|
-
code: `'use client';\n\nimport { EditableProductCard, type EditableProductCardProps } from '${importPkg}';\n\nexport
|
|
575
|
+
code: `'use client';\n\nimport { EditableProductCard, ProductCard, type EditableProductCardProps, type ProductItem } from '${importPkg}';\n\nexport { EditableProductCard, ProductCard, type EditableProductCardProps, type ProductItem };\n`,
|
|
576
576
|
},
|
|
577
577
|
'product-grid': {
|
|
578
578
|
file: 'ProductGrid.tsx',
|
|
@@ -586,14 +586,48 @@ function getComponentRegistry(importPkg) {
|
|
|
586
586
|
},
|
|
587
587
|
'product-detail': {
|
|
588
588
|
file: 'ProductDetail.tsx',
|
|
589
|
-
component: '
|
|
590
|
-
code: `'use client';\n\nimport {
|
|
589
|
+
component: 'PlatformProductDetail',
|
|
590
|
+
code: `'use client';\n\nimport { PlatformProductDetail, usePlatformProductDetail, platformProductDetailHref, type PlatformProductDetailProps } from '${importPkg}';\n\nexport function ProductDetail(props: PlatformProductDetailProps) {
|
|
591
|
+
return <PlatformProductDetail {...props} />;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
export { PlatformProductDetail, usePlatformProductDetail, platformProductDetailHref, type PlatformProductDetailProps };\n`,
|
|
595
|
+
},
|
|
596
|
+
'platform-product-detail': {
|
|
597
|
+
file: 'PlatformProductDetail.tsx',
|
|
598
|
+
component: 'PlatformProductDetail',
|
|
599
|
+
code: `'use client';\n\nimport { PlatformProductDetail, usePlatformProductDetail, platformProductDetailHref, type PlatformProductDetailProps } from '${importPkg}';\n\nexport { PlatformProductDetail, usePlatformProductDetail, platformProductDetailHref, type PlatformProductDetailProps };\n`,
|
|
591
600
|
},
|
|
592
601
|
'customer-reviews': {
|
|
593
602
|
file: 'CustomerReviews.tsx',
|
|
594
603
|
component: 'EditableCustomerReviews',
|
|
595
604
|
code: `'use client';\n\nimport { EditableCustomerReviews, CustomerReviews, type EditableCustomerReviewsProps, type CustomerReviewItem } from '${importPkg}';\n\nexport { EditableCustomerReviews, CustomerReviews, type EditableCustomerReviewsProps, type CustomerReviewItem };\n`,
|
|
596
605
|
},
|
|
606
|
+
'reviews': {
|
|
607
|
+
file: 'CustomerReviews.tsx',
|
|
608
|
+
component: 'CustomerReviews',
|
|
609
|
+
code: `'use client';\n\nimport { EditableCustomerReviews, CustomerReviews, type EditableCustomerReviewsProps, type CustomerReviewItem } from '${importPkg}';\n\nexport { EditableCustomerReviews, CustomerReviews, type EditableCustomerReviewsProps, type CustomerReviewItem };\n`,
|
|
610
|
+
},
|
|
611
|
+
'google-feedback': {
|
|
612
|
+
file: 'GoogleFeedback.tsx',
|
|
613
|
+
component: 'GoogleFeedback',
|
|
614
|
+
code: `'use client';\n\nimport { EditableGoogleFeedback, GoogleFeedback, type EditableGoogleFeedbackProps, type FeedbackItem } from '${importPkg}';\n\nexport { EditableGoogleFeedback, GoogleFeedback, type EditableGoogleFeedbackProps, type FeedbackItem };\n`,
|
|
615
|
+
},
|
|
616
|
+
'feedback': {
|
|
617
|
+
file: 'GoogleFeedback.tsx',
|
|
618
|
+
component: 'GoogleFeedback',
|
|
619
|
+
code: `'use client';\n\nimport { EditableGoogleFeedback, GoogleFeedback, type EditableGoogleFeedbackProps, type FeedbackItem } from '${importPkg}';\n\nexport { EditableGoogleFeedback, GoogleFeedback, type EditableGoogleFeedbackProps, type FeedbackItem };\n`,
|
|
620
|
+
},
|
|
621
|
+
'testimonial-section': {
|
|
622
|
+
file: 'TestimonialSection.tsx',
|
|
623
|
+
component: 'TestimonialSection',
|
|
624
|
+
code: `'use client';\n\nimport { EditableTestimonialSection, TestimonialSection, type EditableTestimonialSectionProps, type TestimonialSectionItem } from '${importPkg}';\n\nexport { EditableTestimonialSection, TestimonialSection, type EditableTestimonialSectionProps, type TestimonialSectionItem };\n`,
|
|
625
|
+
},
|
|
626
|
+
'testimonials': {
|
|
627
|
+
file: 'TestimonialSection.tsx',
|
|
628
|
+
component: 'TestimonialSection',
|
|
629
|
+
code: `'use client';\n\nimport { EditableTestimonialSection, TestimonialSection, type EditableTestimonialSectionProps, type TestimonialSectionItem } from '${importPkg}';\n\nexport { EditableTestimonialSection, TestimonialSection, type EditableTestimonialSectionProps, type TestimonialSectionItem };\n`,
|
|
630
|
+
},
|
|
597
631
|
'cart-drawer': {
|
|
598
632
|
file: 'CartDrawer.tsx',
|
|
599
633
|
component: 'EditableCartDrawer',
|
|
@@ -607,68 +641,117 @@ function getComponentRegistry(importPkg) {
|
|
|
607
641
|
'pricing-card': {
|
|
608
642
|
file: 'PricingCard.tsx',
|
|
609
643
|
component: 'EditablePricingCard',
|
|
610
|
-
code: `'use client';\n\nimport { EditablePricingCard, type EditablePricingCardProps } from '${importPkg}';\n\nexport function PricingCard(props: EditablePricingCardProps) {
|
|
644
|
+
code: `'use client';\n\nimport { EditablePricingCard, type EditablePricingCardProps } from '${importPkg}';\n\nexport function PricingCard(props: EditablePricingCardProps) {
|
|
645
|
+
return <EditablePricingCard {...props} />;
|
|
646
|
+
}
|
|
647
|
+
`,
|
|
611
648
|
},
|
|
612
649
|
'testimonial-card': {
|
|
613
650
|
file: 'TestimonialCard.tsx',
|
|
614
651
|
component: 'EditableTestimonialCard',
|
|
615
|
-
code: `'use client';\n\nimport { EditableTestimonialCard, type EditableTestimonialCardProps } from '${importPkg}';\n\nexport function TestimonialCard(props: EditableTestimonialCardProps) {
|
|
652
|
+
code: `'use client';\n\nimport { EditableTestimonialCard, type EditableTestimonialCardProps } from '${importPkg}';\n\nexport function TestimonialCard(props: EditableTestimonialCardProps) {
|
|
653
|
+
return <EditableTestimonialCard {...props} />;
|
|
654
|
+
}
|
|
655
|
+
`,
|
|
616
656
|
},
|
|
617
657
|
'contact-form': {
|
|
618
658
|
file: 'ContactForm.tsx',
|
|
619
659
|
component: 'EditableContactForm',
|
|
620
|
-
code: `'use client';\n\nimport { EditableContactForm, type EditableContactFormProps } from '${importPkg}';\n\nexport function ContactForm(props: EditableContactFormProps) {
|
|
660
|
+
code: `'use client';\n\nimport { EditableContactForm, type EditableContactFormProps } from '${importPkg}';\n\nexport function ContactForm(props: EditableContactFormProps) {
|
|
661
|
+
return <EditableContactForm {...props} />;
|
|
662
|
+
}
|
|
663
|
+
`,
|
|
621
664
|
},
|
|
622
665
|
'faq': {
|
|
623
666
|
file: 'FAQAccordion.tsx',
|
|
624
667
|
component: 'EditableFAQAccordion',
|
|
625
|
-
code: `'use client';\n\nimport { EditableFAQAccordion, EditableFAQItem, type EditableFAQAccordionProps } from '${importPkg}';\n\nexport function FAQAccordion(props: EditableFAQAccordionProps) {
|
|
668
|
+
code: `'use client';\n\nimport { EditableFAQAccordion, EditableFAQItem, type EditableFAQAccordionProps } from '${importPkg}';\n\nexport function FAQAccordion(props: EditableFAQAccordionProps) {
|
|
669
|
+
return <EditableFAQAccordion {...props} />;
|
|
670
|
+
}
|
|
671
|
+
\nexport { EditableFAQItem };\n`,
|
|
626
672
|
},
|
|
627
673
|
'navbar': {
|
|
628
674
|
file: 'Navbar.tsx',
|
|
629
675
|
component: 'EditableNavbar',
|
|
630
|
-
code: `'use client';\n\nimport { EditableNavbar, type EditableNavbarProps } from '${importPkg}';\n\nexport function Navbar(props: EditableNavbarProps) {
|
|
676
|
+
code: `'use client';\n\nimport { EditableNavbar, type EditableNavbarProps } from '${importPkg}';\n\nexport function Navbar(props: EditableNavbarProps) {
|
|
677
|
+
return <EditableNavbar {...props} />;
|
|
678
|
+
}
|
|
679
|
+
`,
|
|
631
680
|
},
|
|
632
681
|
'footer': {
|
|
633
682
|
file: 'Footer.tsx',
|
|
634
683
|
component: 'EditableFooter',
|
|
635
|
-
code: `'use client';\n\nimport { EditableFooter, type EditableFooterProps } from '${importPkg}';\n\nexport function Footer(props: EditableFooterProps) {
|
|
684
|
+
code: `'use client';\n\nimport { EditableFooter, type EditableFooterProps } from '${importPkg}';\n\nexport function Footer(props: EditableFooterProps) {
|
|
685
|
+
return <EditableFooter {...props} />;
|
|
686
|
+
}
|
|
687
|
+
`,
|
|
636
688
|
},
|
|
637
689
|
'hero': {
|
|
638
690
|
file: 'Hero.tsx',
|
|
639
691
|
component: 'EditableHeroCentered',
|
|
640
|
-
code: `'use client';\n\nimport { EditableHeroCentered, EditableHeroSplit, type EditableHeroCenteredProps, type EditableHeroSplitProps } from '${importPkg}';\n\nexport function HeroCentered(props: EditableHeroCenteredProps) {
|
|
692
|
+
code: `'use client';\n\nimport { EditableHeroCentered, EditableHeroSplit, type EditableHeroCenteredProps, type EditableHeroSplitProps } from '${importPkg}';\n\nexport function HeroCentered(props: EditableHeroCenteredProps) {
|
|
693
|
+
return <EditableHeroCentered {...props} />;
|
|
694
|
+
}
|
|
695
|
+
\nexport function HeroSplit(props: EditableHeroSplitProps) {
|
|
696
|
+
return <EditableHeroSplit {...props} />;
|
|
697
|
+
}
|
|
698
|
+
`,
|
|
641
699
|
},
|
|
642
700
|
'whatsapp-button': {
|
|
643
701
|
file: 'WhatsAppButton.tsx',
|
|
644
702
|
component: 'WhatsAppButton',
|
|
645
703
|
code: `'use client';\n\nimport { WhatsAppButton, type WhatsAppButtonProps } from '${importPkg}';\n\nexport { WhatsAppButton, type WhatsAppButtonProps };\n`,
|
|
646
704
|
},
|
|
705
|
+
'whatsapp': {
|
|
706
|
+
file: 'WhatsAppButton.tsx',
|
|
707
|
+
component: 'WhatsAppButton',
|
|
708
|
+
code: `'use client';\n\nimport { WhatsAppButton, type WhatsAppButtonProps } from '${importPkg}';\n\nexport { WhatsAppButton, type WhatsAppButtonProps };\n`,
|
|
709
|
+
},
|
|
647
710
|
'whatsapp-order-button': {
|
|
648
711
|
file: 'WhatsAppOrderButton.tsx',
|
|
649
712
|
component: 'WhatsAppOrderButton',
|
|
650
|
-
code: `'use client';\n\nimport React from 'react';\nimport { useSiteData } from '${importPkg}';\nimport { MessageCircle } from 'lucide-react';\n\nexport interface WhatsAppOrderButtonProps {\n product: { name: string; price?: string | number; brand?: string; condition?: string; [key: string]: any };\n selectedColor?: string;\n selectedStorage?: string;\n className?: string;\n showText?: boolean;\n}\n\nexport function WhatsAppOrderButton({\n product,\n selectedColor,\n selectedStorage,\n className = '',\n showText = true,\n}: WhatsAppOrderButtonProps) {\n const siteData = useSiteData();\n const rawTarget =\n siteData?.content?.home?.whatsappOrderUrl ||\n siteData?.content?.home?.whatsappNumber ||\n siteData?.content?.common?.business?.whatsapp ||\n 'https://wa.me/15550192834';\n const orderLabel = siteData?.content?.home?.whatsappOrderLabel ?? 'Order via WhatsApp';\n\n const handleWhatsAppClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n const color = selectedColor || product.colors?.[0]?.name || 'Default';\n const storage = selectedStorage || product.storageOptions?.[0] || 'Default';\n const message = \`Hi, I would like to order the following product:\\n\\n*\${product.name}*\\nBrand: \${product.brand || 'Store'}\\nCondition: \${product.condition || 'New'}\\nColor: \${color}\\nStorage: \${storage}\\nPrice: Rs \${product.price}\\n\\nIs it available?\`;\n\n let targetUrl = (rawTarget || '').trim();\n if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {\n const cleanNum = targetUrl.replace(/[^0-9]/g, '');\n targetUrl = \`https://wa.me/\${cleanNum || '15550192834'}\`;\n }\n const sep = targetUrl.includes('?') ? '&' : '?';\n const url = \`\${targetUrl}\${sep}text=\${encodeURIComponent(message)}\`;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n return (\n <button type
|
|
713
|
+
code: `'use client';\n\nimport React from 'react';\nimport { useSiteData } from '${importPkg}';\nimport { MessageCircle } from 'lucide-react';\n\nexport interface WhatsAppOrderButtonProps {\n product: { name: string; price?: string | number; brand?: string; condition?: string; [key: string]: any };\n selectedColor?: string;\n selectedStorage?: string;\n className?: string;\n showText?: boolean;\n}\n\nexport function WhatsAppOrderButton({\n product,\n selectedColor,\n selectedStorage,\n className = '',\n showText = true,\n}: WhatsAppOrderButtonProps) {\n const siteData = useSiteData();\n const rawTarget =\n siteData?.content?.home?.whatsappOrderUrl ||\n siteData?.content?.home?.whatsappNumber ||\n siteData?.content?.common?.business?.whatsapp ||\n 'https://wa.me/15550192834';\n const orderLabel = siteData?.content?.home?.whatsappOrderLabel ?? 'Order via WhatsApp';\n\n const handleWhatsAppClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n const color = selectedColor || product.colors?.[0]?.name || 'Default';\n const storage = selectedStorage || product.storageOptions?.[0] || 'Default';\n const message = \`Hi, I would like to order the following product:\\n\\n*\${product.name}*\\nBrand: \${product.brand || 'Store'}\\nCondition: \${product.condition || 'New'}\\nColor: \${color}\\nStorage: \${storage}\\nPrice: Rs \${product.price}\\n\\nIs it available?\`;\n\n let targetUrl = (rawTarget || '').trim();\n if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {\n const cleanNum = targetUrl.replace(/[^0-9]/g, '');\n targetUrl = \`https://wa.me/\${cleanNum || '15550192834'}\`;\n }\n const sep = targetUrl.includes('?') ? '&' : '?';\n const url = \`\${targetUrl}\${sep}text=\${encodeURIComponent(message)}\`;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n return (\n <button type="button" onClick={handleWhatsAppClick} className={className}>\n <MessageCircle className="h-4 w-4" />\n {showText && (\n <span data-preview-field-path="home.whatsappOrderLabel" data-preview-style-target="home.whatsappOrderLabel" data-preview-style-type="text">\n {orderLabel}\n </span>\n )}\n </button>\n );\n}\n`,
|
|
651
714
|
},
|
|
652
715
|
'phone-button': {
|
|
653
716
|
file: 'PhoneButton.tsx',
|
|
654
717
|
component: 'PhoneButton',
|
|
655
718
|
code: `'use client';\n\nimport { PhoneButton, type PhoneButtonProps } from '${importPkg}';\n\nexport { PhoneButton, type PhoneButtonProps };\n`,
|
|
656
719
|
},
|
|
720
|
+
'phone': {
|
|
721
|
+
file: 'PhoneButton.tsx',
|
|
722
|
+
component: 'PhoneButton',
|
|
723
|
+
code: `'use client';\n\nimport { PhoneButton, type PhoneButtonProps } from '${importPkg}';\n\nexport { PhoneButton, type PhoneButtonProps };\n`,
|
|
724
|
+
},
|
|
657
725
|
'email-button': {
|
|
658
726
|
file: 'EmailButton.tsx',
|
|
659
727
|
component: 'EmailButton',
|
|
660
728
|
code: `'use client';\n\nimport { EmailButton, type EmailButtonProps } from '${importPkg}';\n\nexport { EmailButton, type EmailButtonProps };\n`,
|
|
661
729
|
},
|
|
730
|
+
'email': {
|
|
731
|
+
file: 'EmailButton.tsx',
|
|
732
|
+
component: 'EmailButton',
|
|
733
|
+
code: `'use client';\n\nimport { EmailButton, type EmailButtonProps } from '${importPkg}';\n\nexport { EmailButton, type EmailButtonProps };\n`,
|
|
734
|
+
},
|
|
662
735
|
'contact-actions': {
|
|
663
736
|
file: 'ContactActions.tsx',
|
|
664
737
|
component: 'ContactActions',
|
|
665
738
|
code: `'use client';\n\nimport { ContactActions, type ContactActionsProps } from '${importPkg}';\n\nexport { ContactActions, type ContactActionsProps };\n`,
|
|
666
739
|
},
|
|
740
|
+
'contact': {
|
|
741
|
+
file: 'ContactActions.tsx',
|
|
742
|
+
component: 'ContactActions',
|
|
743
|
+
code: `'use client';\n\nimport { ContactActions, type ContactActionsProps } from '${importPkg}';\n\nexport { ContactActions, type ContactActionsProps };\n`,
|
|
744
|
+
},
|
|
667
745
|
'location-card': {
|
|
668
746
|
file: 'LocationCard.tsx',
|
|
669
747
|
component: 'LocationCard',
|
|
670
748
|
code: `'use client';\n\nimport { LocationCard, type LocationCardProps } from '${importPkg}';\n\nexport { LocationCard, type LocationCardProps };\n`,
|
|
671
749
|
},
|
|
750
|
+
'location': {
|
|
751
|
+
file: 'LocationCard.tsx',
|
|
752
|
+
component: 'LocationCard',
|
|
753
|
+
code: `'use client';\n\nimport { LocationCard, type LocationCardProps } from '${importPkg}';\n\nexport { LocationCard, type LocationCardProps };\n`,
|
|
754
|
+
},
|
|
672
755
|
'location-link': {
|
|
673
756
|
file: 'LocationLink.tsx',
|
|
674
757
|
component: 'LocationLink',
|
|
@@ -692,7 +775,12 @@ function getComponentRegistry(importPkg) {
|
|
|
692
775
|
'business-hours': {
|
|
693
776
|
file: 'BusinessHours.tsx',
|
|
694
777
|
component: 'BusinessHours',
|
|
695
|
-
code: `'use client';\n\nimport { BusinessHours, type BusinessHoursProps } from '${importPkg}';\n\nexport { BusinessHours, type BusinessHoursProps };\n`,
|
|
778
|
+
code: `'use client';\n\nimport { BusinessHours, type BusinessHoursProps, type WeeklyHours, type DaySchedule } from '${importPkg}';\n\nexport { BusinessHours, type BusinessHoursProps, type WeeklyHours, type DaySchedule };\n`,
|
|
779
|
+
},
|
|
780
|
+
'hours': {
|
|
781
|
+
file: 'BusinessHours.tsx',
|
|
782
|
+
component: 'BusinessHours',
|
|
783
|
+
code: `'use client';\n\nimport { BusinessHours, type BusinessHoursProps, type WeeklyHours, type DaySchedule } from '${importPkg}';\n\nexport { BusinessHours, type BusinessHoursProps, type WeeklyHours, type DaySchedule };\n`,
|
|
696
784
|
},
|
|
697
785
|
'announcement-bar': {
|
|
698
786
|
file: 'AnnouncementBar.tsx',
|
|
@@ -734,26 +822,6 @@ function getComponentRegistry(importPkg) {
|
|
|
734
822
|
component: 'DenebAction',
|
|
735
823
|
code: `'use client';\n\nimport { DenebAction, type DenebActionProps } from '${importPkg}';\n\nexport { DenebAction, type DenebActionProps };\n`,
|
|
736
824
|
},
|
|
737
|
-
'product-card': {
|
|
738
|
-
file: 'ProductCard.tsx',
|
|
739
|
-
component: 'EditableProductCard',
|
|
740
|
-
code: `'use client';\n\nimport { EditableProductCard, type EditableProductCardProps, type ProductItem } from '${importPkg}';\n\nexport function ProductCard(props: EditableProductCardProps) {\n return <EditableProductCard {...props} />;\n}\n\nexport { EditableProductCard, type EditableProductCardProps, type ProductItem };\n`,
|
|
741
|
-
},
|
|
742
|
-
'product-grid': {
|
|
743
|
-
file: 'ProductGrid.tsx',
|
|
744
|
-
component: 'EditableProductGrid',
|
|
745
|
-
code: `'use client';\n\nimport { EditableProductGrid, ProductGrid, type EditableProductGridProps } from '${importPkg}';\n\nexport { EditableProductGrid, ProductGrid, type EditableProductGridProps };\n`,
|
|
746
|
-
},
|
|
747
|
-
'product-detail': {
|
|
748
|
-
file: 'ProductDetail.tsx',
|
|
749
|
-
component: 'PlatformProductDetail',
|
|
750
|
-
code: `'use client';\n\nimport { PlatformProductDetail, usePlatformProductDetail, platformProductDetailHref, type PlatformProductDetailProps } from '${importPkg}';\n\nexport function ProductDetail(props: PlatformProductDetailProps) {\n return <PlatformProductDetail {...props} />;\n}\n\nexport { PlatformProductDetail, usePlatformProductDetail, platformProductDetailHref, type PlatformProductDetailProps };\n`,
|
|
751
|
-
},
|
|
752
|
-
'platform-product-detail': {
|
|
753
|
-
file: 'PlatformProductDetail.tsx',
|
|
754
|
-
component: 'PlatformProductDetail',
|
|
755
|
-
code: `'use client';\n\nimport { PlatformProductDetail, usePlatformProductDetail, platformProductDetailHref, type PlatformProductDetailProps } from '${importPkg}';\n\nexport { PlatformProductDetail, usePlatformProductDetail, platformProductDetailHref, type PlatformProductDetailProps };\n`,
|
|
756
|
-
},
|
|
757
825
|
};
|
|
758
826
|
}
|
|
759
827
|
|
|
@@ -991,6 +1059,40 @@ async function initProject(targetInput, options = {}) {
|
|
|
991
1059
|
}
|
|
992
1060
|
}
|
|
993
1061
|
|
|
1062
|
+
|
|
1063
|
+
// 4.7. Auto-scaffold core ready-to-use DENEB UI components in src/components/ui/
|
|
1064
|
+
const uiDir = path.join(targetDir, 'src', 'components', 'ui');
|
|
1065
|
+
if (!fs.existsSync(uiDir)) {
|
|
1066
|
+
fs.mkdirSync(uiDir, { recursive: true });
|
|
1067
|
+
}
|
|
1068
|
+
const compRegistry = getComponentRegistry(importPkg);
|
|
1069
|
+
const coreToScaffold = [
|
|
1070
|
+
'product-grid',
|
|
1071
|
+
'product-card',
|
|
1072
|
+
'customer-reviews',
|
|
1073
|
+
'google-feedback',
|
|
1074
|
+
'location-card',
|
|
1075
|
+
'location-link',
|
|
1076
|
+
'whatsapp-button',
|
|
1077
|
+
'contact-actions',
|
|
1078
|
+
'business-hours',
|
|
1079
|
+
'map-embed',
|
|
1080
|
+
];
|
|
1081
|
+
let scaffoldedCount = 0;
|
|
1082
|
+
for (const key of coreToScaffold) {
|
|
1083
|
+
const item = compRegistry[key];
|
|
1084
|
+
if (item) {
|
|
1085
|
+
const targetFile = path.join(uiDir, item.file);
|
|
1086
|
+
if (!fs.existsSync(targetFile)) {
|
|
1087
|
+
fs.writeFileSync(targetFile, item.code, 'utf8');
|
|
1088
|
+
scaffoldedCount++;
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
if (scaffoldedCount > 0) {
|
|
1093
|
+
console.log(`\x1b[32m✔ Auto-installed\x1b[0m ${scaffoldedCount} essential DENEB UI components in src/components/ui/ (ProductGrid, CustomerReviews, GoogleFeedback, LocationCard, WhatsAppButton, BusinessHours, etc.)`);
|
|
1094
|
+
}
|
|
1095
|
+
|
|
994
1096
|
// 4. Update package.json scripts
|
|
995
1097
|
pkg.scripts = pkg.scripts || {};
|
|
996
1098
|
const scriptsToAdd = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deneb-ui/cli",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.74",
|
|
4
4
|
"description": "Official DENEB CLI — scaffold, convert, validate, and package Fivora-ready storefront templates.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"deneb": "bin/index.js",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"license": "MIT",
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@babel/parser": "^7.28.0",
|
|
52
|
-
"@deneb-ui/core": "^2.0.
|
|
52
|
+
"@deneb-ui/core": "^2.0.74",
|
|
53
53
|
"@octokit/rest": "^22.0.1",
|
|
54
54
|
"adm-zip": "^0.6.0",
|
|
55
55
|
"dotenv": "^17.4.2",
|