@rovela-ai/sdk 0.1.19 → 0.1.21

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 (82) hide show
  1. package/dist/admin/components/AdminNav.d.ts +10 -3
  2. package/dist/admin/components/AdminNav.d.ts.map +1 -1
  3. package/dist/admin/components/AdminNav.js +80 -28
  4. package/dist/admin/components/AdminNav.js.map +1 -1
  5. package/dist/admin/components/CategoryForm.d.ts +30 -0
  6. package/dist/admin/components/CategoryForm.d.ts.map +1 -0
  7. package/dist/admin/components/CategoryForm.js +153 -0
  8. package/dist/admin/components/CategoryForm.js.map +1 -0
  9. package/dist/admin/components/CategorySelect.d.ts +32 -0
  10. package/dist/admin/components/CategorySelect.d.ts.map +1 -0
  11. package/dist/admin/components/CategorySelect.js +148 -0
  12. package/dist/admin/components/CategorySelect.js.map +1 -0
  13. package/dist/admin/components/LowStockAlert.d.ts +2 -2
  14. package/dist/admin/components/LowStockAlert.d.ts.map +1 -1
  15. package/dist/admin/components/LowStockAlert.js +16 -9
  16. package/dist/admin/components/LowStockAlert.js.map +1 -1
  17. package/dist/admin/components/OrderStatusChart.d.ts +21 -0
  18. package/dist/admin/components/OrderStatusChart.d.ts.map +1 -0
  19. package/dist/admin/components/OrderStatusChart.js +54 -0
  20. package/dist/admin/components/OrderStatusChart.js.map +1 -0
  21. package/dist/admin/components/ProductForm.d.ts +2 -2
  22. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  23. package/dist/admin/components/ProductForm.js +125 -9
  24. package/dist/admin/components/ProductForm.js.map +1 -1
  25. package/dist/admin/components/RecentOrders.d.ts +1 -1
  26. package/dist/admin/components/RecentOrders.d.ts.map +1 -1
  27. package/dist/admin/components/RecentOrders.js +11 -10
  28. package/dist/admin/components/RecentOrders.js.map +1 -1
  29. package/dist/admin/components/RevenueChart.d.ts +23 -0
  30. package/dist/admin/components/RevenueChart.d.ts.map +1 -0
  31. package/dist/admin/components/RevenueChart.js +70 -0
  32. package/dist/admin/components/RevenueChart.js.map +1 -0
  33. package/dist/admin/components/SEOPreview.d.ts +32 -0
  34. package/dist/admin/components/SEOPreview.d.ts.map +1 -0
  35. package/dist/admin/components/SEOPreview.js +30 -0
  36. package/dist/admin/components/SEOPreview.js.map +1 -0
  37. package/dist/admin/components/StatsCards.d.ts +2 -2
  38. package/dist/admin/components/StatsCards.d.ts.map +1 -1
  39. package/dist/admin/components/StatsCards.js +18 -20
  40. package/dist/admin/components/StatsCards.js.map +1 -1
  41. package/dist/admin/components/TagInput.d.ts +29 -0
  42. package/dist/admin/components/TagInput.d.ts.map +1 -0
  43. package/dist/admin/components/TagInput.js +73 -0
  44. package/dist/admin/components/TagInput.js.map +1 -0
  45. package/dist/admin/components/VariantManager.d.ts +42 -0
  46. package/dist/admin/components/VariantManager.d.ts.map +1 -0
  47. package/dist/admin/components/VariantManager.js +175 -0
  48. package/dist/admin/components/VariantManager.js.map +1 -0
  49. package/dist/admin/components/index.d.ts +9 -0
  50. package/dist/admin/components/index.d.ts.map +1 -1
  51. package/dist/admin/components/index.js +13 -0
  52. package/dist/admin/components/index.js.map +1 -1
  53. package/dist/admin/hooks/index.d.ts +2 -0
  54. package/dist/admin/hooks/index.d.ts.map +1 -1
  55. package/dist/admin/hooks/index.js +1 -0
  56. package/dist/admin/hooks/index.js.map +1 -1
  57. package/dist/admin/hooks/useAdminCategories.d.ts +36 -0
  58. package/dist/admin/hooks/useAdminCategories.d.ts.map +1 -0
  59. package/dist/admin/hooks/useAdminCategories.js +217 -0
  60. package/dist/admin/hooks/useAdminCategories.js.map +1 -0
  61. package/dist/admin/index.d.ts +4 -3
  62. package/dist/admin/index.d.ts.map +1 -1
  63. package/dist/admin/index.js +6 -2
  64. package/dist/admin/index.js.map +1 -1
  65. package/dist/core/StoreSettingsProvider.d.ts +104 -0
  66. package/dist/core/StoreSettingsProvider.d.ts.map +1 -0
  67. package/dist/core/StoreSettingsProvider.js +195 -0
  68. package/dist/core/StoreSettingsProvider.js.map +1 -0
  69. package/dist/core/api/index.d.ts +7 -0
  70. package/dist/core/api/index.d.ts.map +1 -0
  71. package/dist/core/api/index.js +7 -0
  72. package/dist/core/api/index.js.map +1 -0
  73. package/dist/core/api/settings.d.ts +42 -0
  74. package/dist/core/api/settings.d.ts.map +1 -0
  75. package/dist/core/api/settings.js +74 -0
  76. package/dist/core/api/settings.js.map +1 -0
  77. package/dist/core/db/queries.d.ts +6 -6
  78. package/dist/core/index.d.ts +2 -0
  79. package/dist/core/index.d.ts.map +1 -1
  80. package/dist/core/index.js +2 -0
  81. package/dist/core/index.js.map +1 -1
  82. package/package.json +6 -1
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * @rovela/sdk/admin/components/AdminNav
3
3
  *
4
- * Admin sidebar navigation component.
4
+ * Admin sidebar navigation component with grouped navigation,
5
+ * elegant styling, and Rovela branding.
5
6
  */
6
7
  import { type ReactNode } from 'react';
7
8
  export interface NavItem {
@@ -10,6 +11,10 @@ export interface NavItem {
10
11
  href: string;
11
12
  icon?: ReactNode;
12
13
  }
14
+ export interface NavGroup {
15
+ label: string;
16
+ items: NavItem[];
17
+ }
13
18
  export interface AdminNavProps {
14
19
  /** Currently active nav item ID */
15
20
  activeNav?: string;
@@ -19,16 +24,18 @@ export interface AdminNavProps {
19
24
  storeName?: string;
20
25
  /** Logo element */
21
26
  logo?: ReactNode;
27
+ /** Store URL for "View Store" link */
28
+ storeUrl?: string;
22
29
  /** Custom className */
23
30
  className?: string;
24
31
  }
25
32
  /**
26
- * Admin sidebar navigation.
33
+ * Admin sidebar navigation with grouped sections and elegant styling.
27
34
  *
28
35
  * @example
29
36
  * ```tsx
30
37
  * <AdminNav activeNav="dashboard" storeName="My Store" />
31
38
  * ```
32
39
  */
33
- export declare function AdminNav({ activeNav, items, storeName, logo, className, }: AdminNavProps): import("react/jsx-runtime").JSX.Element;
40
+ export declare function AdminNav({ activeNav, items, storeName, logo, storeUrl, className, }: AdminNavProps): import("react/jsx-runtime").JSX.Element;
34
41
  //# sourceMappingURL=AdminNav.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAM7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAuED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAuB,EACvB,SAAmB,EACnB,IAAI,EACJ,SAAc,GACf,EAAE,aAAa,2CA4Cf"}
1
+ {"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAM7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA0KD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAK,EACL,SAAmB,EACnB,IAAI,EACJ,QAAc,EACd,SAAc,GACf,EAAE,aAAa,2CAgGf"}
@@ -1,58 +1,110 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  // =============================================================================
4
- // Default Navigation Items
4
+ // Default Navigation Groups
5
5
  // =============================================================================
6
- const defaultNavItems = [
7
- { id: 'dashboard', label: 'Dashboard', href: '/admin' },
8
- { id: 'products', label: 'Products', href: '/admin/products' },
9
- { id: 'orders', label: 'Orders', href: '/admin/orders' },
10
- { id: 'customers', label: 'Customers', href: '/admin/customers' },
11
- { id: 'settings', label: 'Settings', href: '/admin/settings' },
6
+ const defaultNavGroups = [
7
+ {
8
+ label: 'Main',
9
+ items: [
10
+ { id: 'dashboard', label: 'Dashboard', href: '/admin' },
11
+ ],
12
+ },
13
+ {
14
+ label: 'Catalog',
15
+ items: [
16
+ { id: 'products', label: 'Products', href: '/admin/products' },
17
+ { id: 'categories', label: 'Categories', href: '/admin/categories' },
18
+ ],
19
+ },
20
+ {
21
+ label: 'Sales',
22
+ items: [
23
+ { id: 'orders', label: 'Orders', href: '/admin/orders' },
24
+ { id: 'customers', label: 'Customers', href: '/admin/customers' },
25
+ ],
26
+ },
12
27
  ];
28
+ const settingsItem = { id: 'settings', label: 'Settings', href: '/admin/settings' };
13
29
  // =============================================================================
14
- // Icons (inline SVG to avoid dependencies)
30
+ // Icons (refined SVG icons)
15
31
  // =============================================================================
16
- function DashboardIcon() {
17
- return (_jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z" }) }));
32
+ function DashboardIcon({ className = 'h-5 w-5' }) {
33
+ return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z" }) }));
18
34
  }
19
- function ProductsIcon() {
20
- return (_jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" }) }));
35
+ function ProductsIcon({ className = 'h-5 w-5' }) {
36
+ return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z" }) }));
21
37
  }
22
- function OrdersIcon() {
23
- return (_jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01" }) }));
38
+ function CategoriesIcon({ className = 'h-5 w-5' }) {
39
+ return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" }) }));
24
40
  }
25
- function CustomersIcon() {
26
- return (_jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z" }) }));
41
+ function OrdersIcon({ className = 'h-5 w-5' }) {
42
+ return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25zM6.75 12h.008v.008H6.75V12zm0 3h.008v.008H6.75V15zm0 3h.008v.008H6.75V18z" }) }));
27
43
  }
28
- function SettingsIcon() {
29
- return (_jsxs("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: [_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }), _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" })] }));
44
+ function CustomersIcon({ className = 'h-5 w-5' }) {
45
+ return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z" }) }));
46
+ }
47
+ function SettingsIcon({ className = 'h-5 w-5' }) {
48
+ return (_jsxs("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: [_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z" }), _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" })] }));
49
+ }
50
+ function ExternalLinkIcon({ className = 'h-4 w-4' }) {
51
+ return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25" }) }));
52
+ }
53
+ // Rovela Logo Image
54
+ function RovelaLogo({ className = 'h-4 w-4' }) {
55
+ return (
56
+ // eslint-disable-next-line @next/next/no-img-element
57
+ _jsx("img", { src: "/rovela-logo.png", alt: "Rovela", className: className }));
30
58
  }
31
59
  const iconMap = {
32
60
  dashboard: DashboardIcon,
33
61
  products: ProductsIcon,
62
+ categories: CategoriesIcon,
34
63
  orders: OrdersIcon,
35
64
  customers: CustomersIcon,
36
65
  settings: SettingsIcon,
37
66
  };
38
67
  // =============================================================================
68
+ // Nav Item Component
69
+ // =============================================================================
70
+ function NavItemButton({ item, isActive, }) {
71
+ const Icon = item.icon || iconMap[item.id];
72
+ return (_jsxs("a", { href: item.href, className: `
73
+ group flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-medium
74
+ transition-all duration-200 ease-out
75
+ ${isActive
76
+ ? 'bg-primary/10 text-primary'
77
+ : 'text-muted-foreground hover:bg-accent hover:text-foreground'}
78
+ `, children: [_jsx("span", { className: `
79
+ absolute left-0 h-8 w-1 rounded-r-full bg-primary
80
+ transition-all duration-200
81
+ ${isActive ? 'opacity-100' : 'opacity-0'}
82
+ ` }), _jsx("span", { className: `
83
+ transition-transform duration-200
84
+ ${!isActive ? 'group-hover:translate-x-0.5' : ''}
85
+ `, children: typeof Icon === 'function' ? _jsx(Icon, { className: "h-5 w-5" }) : Icon }), _jsx("span", { className: `
86
+ transition-transform duration-200
87
+ ${!isActive ? 'group-hover:translate-x-0.5' : ''}
88
+ `, children: item.label })] }));
89
+ }
90
+ // =============================================================================
39
91
  // Component
40
92
  // =============================================================================
41
93
  /**
42
- * Admin sidebar navigation.
94
+ * Admin sidebar navigation with grouped sections and elegant styling.
43
95
  *
44
96
  * @example
45
97
  * ```tsx
46
98
  * <AdminNav activeNav="dashboard" storeName="My Store" />
47
99
  * ```
48
100
  */
49
- export function AdminNav({ activeNav, items = defaultNavItems, storeName = 'Admin', logo, className = '', }) {
50
- return (_jsxs("nav", { className: `flex h-full w-64 flex-col border-r border-border bg-card ${className}`, children: [_jsx("div", { className: "flex h-16 items-center border-b border-border px-6", children: logo || (_jsx("span", { className: "text-lg font-semibold text-foreground", children: storeName })) }), _jsx("div", { className: "flex-1 overflow-y-auto py-4", children: _jsx("ul", { className: "space-y-1 px-3", children: items.map((item) => {
51
- const isActive = activeNav === item.id;
52
- const Icon = item.icon || iconMap[item.id];
53
- return (_jsx("li", { children: _jsxs("a", { href: item.href, className: `flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors ${isActive
54
- ? 'bg-primary text-primary-foreground'
55
- : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground'}`, children: [typeof Icon === 'function' ? _jsx(Icon, {}) : Icon, item.label] }) }, item.id));
56
- }) }) }), _jsx("div", { className: "border-t border-border p-4", children: _jsx("p", { className: "text-xs text-muted-foreground", children: "Powered by Rovela" }) })] }));
101
+ export function AdminNav({ activeNav, items, storeName = 'Admin', logo, storeUrl = '/', className = '', }) {
102
+ // If custom items provided, use flat list; otherwise use groups
103
+ const useGroups = !items;
104
+ return (_jsxs("nav", { className: `flex h-full w-64 flex-col bg-card ${className}`, children: [_jsx("div", { className: "flex h-16 items-center gap-3 border-b border-border px-5", children: logo || (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10 text-primary font-semibold", children: storeName.charAt(0).toUpperCase() }), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-sm font-semibold text-foreground leading-tight", children: storeName }), _jsx("span", { className: "text-xs text-muted-foreground", children: "Admin Panel" })] })] })) }), _jsx("div", { className: "flex-1 overflow-y-auto px-3 py-4", children: useGroups ? (
105
+ // Grouped navigation
106
+ _jsx("div", { className: "space-y-6", children: defaultNavGroups.map((group) => (_jsxs("div", { children: [_jsx("p", { className: "mb-2 px-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground/70", children: group.label }), _jsx("ul", { className: "space-y-1", children: group.items.map((item) => (_jsx("li", { className: "relative", children: _jsx(NavItemButton, { item: item, isActive: activeNav === item.id }) }, item.id))) })] }, group.label))) })) : (
107
+ // Flat navigation (custom items)
108
+ _jsx("ul", { className: "space-y-1", children: items?.map((item) => (_jsx("li", { className: "relative", children: _jsx(NavItemButton, { item: item, isActive: activeNav === item.id }) }, item.id))) })) }), _jsx("div", { className: "border-t border-border px-3 py-3", children: _jsx("div", { className: "relative", children: _jsx(NavItemButton, { item: settingsItem, isActive: activeNav === 'settings' }) }) }), _jsxs("div", { className: "border-t border-border px-4 py-4 space-y-3", children: [_jsxs("a", { href: storeUrl, target: "_blank", rel: "noopener noreferrer", className: "flex items-center justify-center gap-2 rounded-lg border border-border px-3 py-2 text-sm font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground", children: [_jsx(ExternalLinkIcon, { className: "h-4 w-4" }), "View Store"] }), _jsxs("div", { className: "flex items-center justify-center gap-1.5 text-xs text-muted-foreground/60", children: [_jsx("span", { children: "Powered by" }), _jsx(RovelaLogo, { className: "h-4 w-4" }), _jsx("span", { className: "font-medium", children: "Rovela" })] })] })] }));
57
109
  }
58
110
  //# sourceMappingURL=AdminNav.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { CategoryFormData } from '../types';
2
+ export interface CategoryFormProps {
3
+ /** Category ID for edit mode */
4
+ categoryId?: string;
5
+ /** Initial data (optional, for optimistic UI) */
6
+ initialData?: Partial<CategoryFormData>;
7
+ /** Callback when save succeeds */
8
+ onSuccess?: (categoryId: string) => void;
9
+ /** Callback when cancel is clicked */
10
+ onCancel?: () => void;
11
+ /** Additional CSS classes */
12
+ className?: string;
13
+ }
14
+ /**
15
+ * Category form for create and edit.
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * // Create mode
20
+ * <CategoryForm onSuccess={() => router.push('/admin/categories')} />
21
+ *
22
+ * // Edit mode
23
+ * <CategoryForm
24
+ * categoryId="123"
25
+ * onSuccess={() => router.push('/admin/categories')}
26
+ * />
27
+ * ```
28
+ */
29
+ export declare function CategoryForm({ categoryId, initialData, onSuccess, onCancel, className, }: CategoryFormProps): import("react/jsx-runtime").JSX.Element;
30
+ //# sourceMappingURL=CategoryForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategoryForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/CategoryForm.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,UAAU,CAAA;AAMvE,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACvC,kCAAkC;IAClC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAc,GACf,EAAE,iBAAiB,2CAyUnB"}
@@ -0,0 +1,153 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela/sdk/admin/components/CategoryForm
5
+ *
6
+ * Category create/edit form component.
7
+ */
8
+ import { useState, useCallback, useEffect, useMemo } from 'react';
9
+ import { ImagePlus, Trash2 } from 'lucide-react';
10
+ // =============================================================================
11
+ // Component
12
+ // =============================================================================
13
+ /**
14
+ * Category form for create and edit.
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * // Create mode
19
+ * <CategoryForm onSuccess={() => router.push('/admin/categories')} />
20
+ *
21
+ * // Edit mode
22
+ * <CategoryForm
23
+ * categoryId="123"
24
+ * onSuccess={() => router.push('/admin/categories')}
25
+ * />
26
+ * ```
27
+ */
28
+ export function CategoryForm({ categoryId, initialData, onSuccess, onCancel, className = '', }) {
29
+ const isEditMode = !!categoryId;
30
+ // Form state
31
+ const [formData, setFormData] = useState({
32
+ name: initialData?.name || '',
33
+ slug: initialData?.slug || '',
34
+ description: initialData?.description || '',
35
+ image: initialData?.image || '',
36
+ parentId: initialData?.parentId || '',
37
+ order: initialData?.order || 0,
38
+ });
39
+ // Categories for parent selector
40
+ const [categories, setCategories] = useState([]);
41
+ // UI state
42
+ const [isLoading, setIsLoading] = useState(false);
43
+ const [isFetching, setIsFetching] = useState(false);
44
+ const [error, setError] = useState(null);
45
+ // Auto-generate slug from name
46
+ const autoSlug = useMemo(() => {
47
+ return formData.name
48
+ .toLowerCase()
49
+ .replace(/[^a-z0-9]+/g, '-')
50
+ .replace(/^-|-$/g, '');
51
+ }, [formData.name]);
52
+ // Fetch categories for parent selector
53
+ useEffect(() => {
54
+ const fetchCategories = async () => {
55
+ try {
56
+ const response = await fetch('/api/admin/categories?flat=true');
57
+ if (response.ok) {
58
+ const data = await response.json();
59
+ setCategories(data.data || []);
60
+ }
61
+ }
62
+ catch (err) {
63
+ console.error('[CategoryForm] Failed to fetch categories:', err);
64
+ }
65
+ };
66
+ fetchCategories();
67
+ }, []);
68
+ // Load category data in edit mode
69
+ useEffect(() => {
70
+ if (categoryId && !initialData) {
71
+ setIsFetching(true);
72
+ fetch(`/api/admin/categories/${categoryId}`)
73
+ .then((res) => res.json())
74
+ .then((data) => {
75
+ if (data.data) {
76
+ const cat = data.data;
77
+ setFormData({
78
+ name: cat.name,
79
+ slug: cat.slug,
80
+ description: cat.description || '',
81
+ image: cat.image || '',
82
+ parentId: cat.parentId || '',
83
+ order: cat.order,
84
+ });
85
+ }
86
+ setIsFetching(false);
87
+ })
88
+ .catch((err) => {
89
+ console.error('[CategoryForm] Failed to fetch category:', err);
90
+ setError('Failed to load category');
91
+ setIsFetching(false);
92
+ });
93
+ }
94
+ }, [categoryId, initialData]);
95
+ // Filter out self and descendants from parent options
96
+ const parentOptions = useMemo(() => {
97
+ if (!isEditMode)
98
+ return categories;
99
+ // Simple filter: just exclude self (circular reference check is on backend)
100
+ return categories.filter((cat) => cat.id !== categoryId);
101
+ }, [categories, categoryId, isEditMode]);
102
+ // Handle field changes
103
+ const handleChange = useCallback((e) => {
104
+ const { name, value, type } = e.target;
105
+ setFormData((prev) => ({
106
+ ...prev,
107
+ [name]: type === 'number' ? (value ? parseInt(value, 10) : 0) : value,
108
+ }));
109
+ }, []);
110
+ // Handle submit
111
+ const handleSubmit = useCallback(async (e) => {
112
+ e.preventDefault();
113
+ setError(null);
114
+ setIsLoading(true);
115
+ try {
116
+ const data = {
117
+ name: formData.name,
118
+ slug: formData.slug || autoSlug,
119
+ description: formData.description || undefined,
120
+ image: formData.image || undefined,
121
+ parentId: formData.parentId || undefined,
122
+ order: formData.order,
123
+ };
124
+ const url = isEditMode
125
+ ? `/api/admin/categories/${categoryId}`
126
+ : '/api/admin/categories';
127
+ const response = await fetch(url, {
128
+ method: isEditMode ? 'PUT' : 'POST',
129
+ headers: { 'Content-Type': 'application/json' },
130
+ body: JSON.stringify(data),
131
+ });
132
+ const result = await response.json();
133
+ if (!response.ok) {
134
+ setError(result.error || 'Failed to save category');
135
+ return;
136
+ }
137
+ const savedCategory = result.data;
138
+ onSuccess?.(savedCategory.id);
139
+ }
140
+ catch {
141
+ setError('An unexpected error occurred');
142
+ }
143
+ finally {
144
+ setIsLoading(false);
145
+ }
146
+ }, [isEditMode, categoryId, formData, autoSlug, onSuccess]);
147
+ // Loading state
148
+ if (isFetching) {
149
+ return (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent" }) }));
150
+ }
151
+ return (_jsxs("form", { onSubmit: handleSubmit, className: `space-y-6 ${className}`, children: [error && (_jsx("div", { className: "rounded-md bg-destructive/10 px-4 py-3 text-sm text-destructive", children: error })), _jsxs("div", { className: "rounded-lg border border-border bg-card p-6", children: [_jsx("h3", { className: "mb-4 text-lg font-medium text-foreground", children: "Basic Information" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsxs("label", { htmlFor: "name", className: "block text-sm font-medium text-foreground", children: ["Category Name ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx("input", { id: "name", name: "name", type: "text", value: formData.name, onChange: handleChange, required: true, placeholder: "e.g., Electronics, Clothing", className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "slug", className: "block text-sm font-medium text-foreground", children: "URL Handle" }), _jsxs("div", { className: "mt-1 flex rounded-md border border-input focus-within:border-primary focus-within:ring-1 focus-within:ring-primary", children: [_jsx("span", { className: "inline-flex items-center rounded-l-md border-r border-input bg-muted px-3 text-sm text-muted-foreground", children: "/categories/" }), _jsx("input", { id: "slug", name: "slug", type: "text", value: formData.slug, onChange: handleChange, placeholder: autoSlug || 'auto-generated', className: "flex-1 rounded-r-md border-0 bg-background px-3 py-2 text-sm focus:outline-none" })] }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Leave blank to auto-generate from category name" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "description", className: "block text-sm font-medium text-foreground", children: "Description" }), _jsx("textarea", { id: "description", name: "description", value: formData.description, onChange: handleChange, rows: 3, placeholder: "Brief description of this category...", className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] })] })] }), _jsxs("div", { className: "rounded-lg border border-border bg-card p-6", children: [_jsx("h3", { className: "mb-4 text-lg font-medium text-foreground", children: "Image" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "image", className: "block text-sm font-medium text-foreground", children: "Image URL" }), _jsx("input", { id: "image", name: "image", type: "url", value: formData.image, onChange: handleChange, placeholder: "https://example.com/category-image.jpg", className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] }), formData.image && (_jsxs("div", { className: "relative inline-block", children: [_jsx("img", { src: formData.image, alt: "Category preview", className: "h-32 w-32 rounded-lg object-cover border border-border" }), _jsx("button", { type: "button", onClick: () => setFormData((prev) => ({ ...prev, image: '' })), className: "absolute -right-2 -top-2 rounded-full bg-destructive p-1 text-destructive-foreground hover:bg-destructive/90", children: _jsx(Trash2, { className: "h-4 w-4" }) })] })), !formData.image && (_jsxs("div", { className: "rounded-lg border-2 border-dashed border-border p-8 text-center", children: [_jsx(ImagePlus, { className: "mx-auto h-10 w-10 text-muted-foreground" }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "Add an image URL above" })] }))] })] }), _jsxs("div", { className: "rounded-lg border border-border bg-card p-6", children: [_jsx("h3", { className: "mb-4 text-lg font-medium text-foreground", children: "Organization" }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "parentId", className: "block text-sm font-medium text-foreground", children: "Parent Category" }), _jsxs("select", { id: "parentId", name: "parentId", value: formData.parentId, onChange: handleChange, className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary", children: [_jsx("option", { value: "", children: "None (Top Level)" }), parentOptions.map((cat) => (_jsx("option", { value: cat.id, children: cat.name }, cat.id)))] }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Make this a subcategory of another category" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "order", className: "block text-sm font-medium text-foreground", children: "Display Order" }), _jsx("input", { id: "order", name: "order", type: "number", min: "0", value: formData.order, onChange: handleChange, className: "mt-1 block w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Lower numbers appear first" })] })] })] }), _jsxs("div", { className: "flex justify-end gap-4", children: [onCancel && (_jsx("button", { type: "button", onClick: onCancel, className: "rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent", children: "Cancel" })), _jsx("button", { type: "submit", disabled: isLoading, className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50", children: isLoading ? 'Saving...' : isEditMode ? 'Save Changes' : 'Create Category' })] })] }));
152
+ }
153
+ //# sourceMappingURL=CategoryForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategoryForm.js","sourceRoot":"","sources":["../../../src/admin/components/CategoryForm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface CategorySelectProps {
2
+ /** Currently selected category ID */
3
+ value?: string | null;
4
+ /** Callback when category is selected */
5
+ onChange: (categoryId: string | null) => void;
6
+ /** Placeholder text */
7
+ placeholder?: string;
8
+ /** Show "Add new category" option */
9
+ showAddNew?: boolean;
10
+ /** Callback when "Add new" is clicked */
11
+ onAddNew?: () => void;
12
+ /** Disabled state */
13
+ disabled?: boolean;
14
+ /** Additional CSS classes */
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Category selector with hierarchical dropdown.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <CategorySelect
23
+ * value={categoryId}
24
+ * onChange={setCategoryId}
25
+ * placeholder="Select a category"
26
+ * showAddNew
27
+ * onAddNew={() => setShowCategoryModal(true)}
28
+ * />
29
+ * ```
30
+ */
31
+ export declare function CategorySelect({ value, onChange, placeholder, showAddNew, onAddNew, disabled, className, }: CategorySelectProps): import("react/jsx-runtime").JSX.Element;
32
+ //# sourceMappingURL=CategorySelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategorySelect.d.ts","sourceRoot":"","sources":["../../../src/admin/components/CategorySelect.tsx"],"names":[],"mappings":"AAgBA,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,yCAAyC;IACzC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC7C,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAA+B,EAC/B,UAAkB,EAClB,QAAQ,EACR,QAAgB,EAChB,SAAc,GACf,EAAE,mBAAmB,2CAkOrB"}