@schandlergarcia/sf-web-components 2.3.17 → 2.5.0

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 (94) hide show
  1. package/.a4drules/skills/command-center-builder/SKILL.md +3 -2
  2. package/.a4drules/skills/component-library/SKILL.md +50 -4
  3. package/.a4drules/skills/component-library/card-components.md +88 -0
  4. package/.a4drules/skills/component-library/when-to-use.md +1 -0
  5. package/CHANGELOG.md +40 -0
  6. package/CLAUDE.md +12 -13
  7. package/README.md +0 -15
  8. package/dist/components/library/cards/KanbanBoard.js +313 -0
  9. package/dist/components/library/cards/KanbanBoard.js.map +1 -0
  10. package/dist/components/library/index.js +60 -57
  11. package/dist/components/library/index.js.map +1 -1
  12. package/dist/components/workspace/ComponentRegistry.js +5 -2
  13. package/dist/components/workspace/ComponentRegistry.js.map +1 -1
  14. package/dist/index.js +84 -82
  15. package/dist/index.js.map +1 -1
  16. package/dist/styles/global.css +44 -57
  17. package/package.json +7 -2
  18. package/scripts/apply-brand.mjs +47 -30
  19. package/scripts/postinstall.mjs +1 -11
  20. package/src/components/library/cards/KanbanBoard.jsx +507 -0
  21. package/src/components/library/index.jsx +1 -0
  22. package/src/styles/global.css +44 -57
  23. package/brands/engine/PARTNER_HUB_PRD.md +0 -584
  24. package/brands/engine/agentApiConfig.ts +0 -36
  25. package/brands/engine/app/api/graphql-operations-types.ts +0 -11260
  26. package/brands/engine/app/api/graphqlClient.ts +0 -25
  27. package/brands/engine/app/api/partnerQueries.ts +0 -212
  28. package/brands/engine/app/appLayout.tsx +0 -5
  29. package/brands/engine/app/components/AgentPanel.tsx +0 -541
  30. package/brands/engine/app/components/AgentforceConversationClient.tsx +0 -201
  31. package/brands/engine/app/components/Data360Widget.tsx +0 -301
  32. package/brands/engine/app/components/__inherit_AgentforceConversationClient.tsx +0 -3
  33. package/brands/engine/app/components/alerts/status-alert.tsx +0 -49
  34. package/brands/engine/app/components/layouts/card-layout.tsx +0 -29
  35. package/brands/engine/app/components/workspace/CommandCenter.tsx +0 -16
  36. package/brands/engine/app/config/agentApi.ts +0 -36
  37. package/brands/engine/app/data/partner-hub-sample-data.js +0 -297
  38. package/brands/engine/app/features/object-search/__examples__/api/accountSearchService.ts +0 -46
  39. package/brands/engine/app/features/object-search/__examples__/api/query/distinctAccountIndustries.graphql +0 -19
  40. package/brands/engine/app/features/object-search/__examples__/api/query/distinctAccountTypes.graphql +0 -19
  41. package/brands/engine/app/features/object-search/__examples__/api/query/getAccountDetail.graphql +0 -121
  42. package/brands/engine/app/features/object-search/__examples__/api/query/searchAccounts.graphql +0 -51
  43. package/brands/engine/app/features/object-search/__examples__/pages/AccountObjectDetailPage.tsx +0 -357
  44. package/brands/engine/app/features/object-search/__examples__/pages/AccountSearch.tsx +0 -312
  45. package/brands/engine/app/features/object-search/__examples__/pages/Home.tsx +0 -34
  46. package/brands/engine/app/features/object-search/api/objectSearchService.ts +0 -84
  47. package/brands/engine/app/features/object-search/components/ActiveFilters.tsx +0 -89
  48. package/brands/engine/app/features/object-search/components/FilterContext.tsx +0 -83
  49. package/brands/engine/app/features/object-search/components/ObjectBreadcrumb.tsx +0 -66
  50. package/brands/engine/app/features/object-search/components/PaginationControls.tsx +0 -109
  51. package/brands/engine/app/features/object-search/components/SearchBar.tsx +0 -41
  52. package/brands/engine/app/features/object-search/components/SortControl.tsx +0 -143
  53. package/brands/engine/app/features/object-search/components/filters/BooleanFilter.tsx +0 -78
  54. package/brands/engine/app/features/object-search/components/filters/DateFilter.tsx +0 -128
  55. package/brands/engine/app/features/object-search/components/filters/DateRangeFilter.tsx +0 -70
  56. package/brands/engine/app/features/object-search/components/filters/FilterFieldWrapper.tsx +0 -33
  57. package/brands/engine/app/features/object-search/components/filters/MultiSelectFilter.tsx +0 -97
  58. package/brands/engine/app/features/object-search/components/filters/NumericRangeFilter.tsx +0 -163
  59. package/brands/engine/app/features/object-search/components/filters/SearchFilter.tsx +0 -50
  60. package/brands/engine/app/features/object-search/components/filters/SelectFilter.tsx +0 -97
  61. package/brands/engine/app/features/object-search/components/filters/TextFilter.tsx +0 -91
  62. package/brands/engine/app/features/object-search/hooks/useAsyncData.ts +0 -54
  63. package/brands/engine/app/features/object-search/hooks/useCachedAsyncData.ts +0 -184
  64. package/brands/engine/app/features/object-search/hooks/useDebouncedCallback.ts +0 -34
  65. package/brands/engine/app/features/object-search/hooks/useObjectSearchParams.ts +0 -252
  66. package/brands/engine/app/features/object-search/utils/debounce.ts +0 -25
  67. package/brands/engine/app/features/object-search/utils/fieldUtils.ts +0 -29
  68. package/brands/engine/app/features/object-search/utils/filterUtils.ts +0 -404
  69. package/brands/engine/app/features/object-search/utils/sortUtils.ts +0 -38
  70. package/brands/engine/app/hooks/useEngineLiveData.ts +0 -49
  71. package/brands/engine/app/hooks/useEvaAgent.ts +0 -288
  72. package/brands/engine/app/hooks/usePartnerDashboardData.ts +0 -141
  73. package/brands/engine/app/navigationMenu.tsx +0 -80
  74. package/brands/engine/app/pages/AccountObjectDetailPage.tsx +0 -361
  75. package/brands/engine/app/pages/AccountSearch.tsx +0 -305
  76. package/brands/engine/app/pages/BlankDashboard.tsx +0 -15
  77. package/brands/engine/app/pages/DataTest.tsx +0 -78
  78. package/brands/engine/app/pages/Home.tsx +0 -5
  79. package/brands/engine/app/pages/NotFound.tsx +0 -19
  80. package/brands/engine/app/pages/PartnerHubDashboard.tsx +0 -2760
  81. package/brands/engine/app/pages/Search.tsx +0 -13
  82. package/brands/engine/app/router-utils.tsx +0 -35
  83. package/brands/engine/app/routes.tsx +0 -39
  84. package/brands/engine/app/styles/global.css +0 -269
  85. package/brands/engine/brand.css +0 -40
  86. package/brands/engine/engine-command-center-prd.md +0 -575
  87. package/brands/engine/engine-live-data.js +0 -135
  88. package/brands/engine/engine-sample-data.js +0 -378
  89. package/brands/engine/engine_logo.png +0 -0
  90. package/brands/engine/global.css +0 -269
  91. package/brands/engine/partner-hub-sample-data.js +0 -281
  92. package/brands/engine/schema.graphql +0 -292
  93. package/brands/engine/useEngineLiveData.ts +0 -49
  94. package/brands/engine/useEvaAgent.ts +0 -288
package/dist/index.js CHANGED
@@ -59,35 +59,36 @@ import { default as oo } from "./components/library/heroui/Tabs.js";
59
59
  import { default as to } from "./components/library/heroui/Toast.js";
60
60
  import { default as fo } from "./components/library/heroui/Toggle.js";
61
61
  import { default as po } from "./components/library/heroui/Tooltip.js";
62
- import { default as mo } from "./components/library/ui/Label.js";
63
- import { default as xo } from "./components/library/cards/ListCard.js";
64
- import { default as go } from "./components/library/cards/MetricCard.js";
65
- import { default as co } from "./components/library/cards/MetricsStrip.js";
66
- import { default as Uo } from "./components/library/layout/PageContainer.js";
67
- import { default as Po } from "./components/library/filters/SearchFilter.js";
68
- import { default as So } from "./components/library/cards/SectionCard.js";
69
- import { default as Bo } from "./components/library/filters/SelectFilter.js";
70
- import { default as ho } from "./components/library/ui/Spinner.js";
71
- import { default as Mo } from "./components/library/cards/StatusCard.js";
72
- import { default as Ao } from "./components/library/cards/TableCard.js";
73
- import { default as vo } from "./components/library/filters/ToggleFilter.js";
74
- import { default as wo } from "./components/library/ui/UIButton.js";
75
- import { Card as Ko, CardContent as Ro, CardDescription as Go, CardFooter as Vo, CardHeader as Wo, CardTitle as No, default as Oo } from "./components/library/ui/Card.js";
76
- import { default as qo } from "./components/library/ui/Chip.js";
77
- import { default as Jo } from "./components/library/ui/Container.js";
78
- import { default as Xo } from "./components/library/ui/UIInput.js";
79
- import { default as Zo } from "./components/library/ui/Text.js";
80
- import { default as $o } from "./components/library/ui/Toggle.js";
81
- import { default as ra } from "./components/library/cards/WidgetCard.js";
82
- import { default as aa } from "./components/library/chat/useChatState.js";
83
- import { default as la } from "./components/library/data/useDataSource.js";
84
- import { default as da } from "./components/library/forms/useFormState.js";
85
- import { default as pa } from "./components/library/data/usePageFilters.js";
86
- import { Accordion as ma, Badge as ia, Breadcrumbs as xa, Drawer as na, Dropdown as ga, Kbd as Ca, Meter as ca, Modal as Ia, Pagination as Ua, ProgressBar as Da, ProgressCircle as Pa, ScrollShadow as Ha, Separator as Sa, Skeleton as Ta, Tabs as Ba, Toast as ba, Tooltip as ha, toast as Fa } from "@heroui/react";
87
- import { D3ChartTemplates as ka } from "./components/library/charts/D3ChartTemplates.js";
88
- import { applyFilters as ya, filterByDateRange as va, filterBySearch as La, filterByToggle as wa, filterByValue as Ea, sortByKey as Ka } from "./components/library/data/filterUtils.js";
62
+ import { default as mo } from "./components/library/cards/KanbanBoard.js";
63
+ import { default as xo } from "./components/library/ui/Label.js";
64
+ import { default as go } from "./components/library/cards/ListCard.js";
65
+ import { default as co } from "./components/library/cards/MetricCard.js";
66
+ import { default as Uo } from "./components/library/cards/MetricsStrip.js";
67
+ import { default as Po } from "./components/library/layout/PageContainer.js";
68
+ import { default as So } from "./components/library/filters/SearchFilter.js";
69
+ import { default as Bo } from "./components/library/cards/SectionCard.js";
70
+ import { default as ho } from "./components/library/filters/SelectFilter.js";
71
+ import { default as Mo } from "./components/library/ui/Spinner.js";
72
+ import { default as Ao } from "./components/library/cards/StatusCard.js";
73
+ import { default as vo } from "./components/library/cards/TableCard.js";
74
+ import { default as wo } from "./components/library/filters/ToggleFilter.js";
75
+ import { default as Ko } from "./components/library/ui/UIButton.js";
76
+ import { Card as Go, CardContent as Vo, CardDescription as Wo, CardFooter as No, CardHeader as Oo, CardTitle as jo, default as qo } from "./components/library/ui/Card.js";
77
+ import { default as Jo } from "./components/library/ui/Chip.js";
78
+ import { default as Xo } from "./components/library/ui/Container.js";
79
+ import { default as Zo } from "./components/library/ui/UIInput.js";
80
+ import { default as $o } from "./components/library/ui/Text.js";
81
+ import { default as ra } from "./components/library/ui/Toggle.js";
82
+ import { default as aa } from "./components/library/cards/WidgetCard.js";
83
+ import { default as la } from "./components/library/chat/useChatState.js";
84
+ import { default as da } from "./components/library/data/useDataSource.js";
85
+ import { default as pa } from "./components/library/forms/useFormState.js";
86
+ import { default as ma } from "./components/library/data/usePageFilters.js";
87
+ import { Accordion as xa, Badge as na, Breadcrumbs as ga, Drawer as Ca, Dropdown as ca, Kbd as Ia, Meter as Ua, Modal as Da, Pagination as Pa, ProgressBar as Ha, ProgressCircle as Sa, ScrollShadow as Ta, Separator as Ba, Skeleton as ba, Tabs as ha, Toast as Fa, Tooltip as Ma, toast as ka } from "@heroui/react";
88
+ import { D3ChartTemplates as ya } from "./components/library/charts/D3ChartTemplates.js";
89
+ import { applyFilters as La, filterByDateRange as wa, filterBySearch as Ea, filterByToggle as Ka, filterByValue as Ra, sortByKey as Ga } from "./components/library/data/filterUtils.js";
89
90
  export {
90
- ma as Accordion,
91
+ xa as Accordion,
91
92
  H as ActionList,
92
93
  T as ActivityCard,
93
94
  b as Alert,
@@ -96,7 +97,7 @@ export {
96
97
  M as AlertTitle,
97
98
  A as AppThemeProvider,
98
99
  L as Avatar,
99
- ia as Badge,
100
+ na as Badge,
100
101
  E as BaseCard,
101
102
  t as Breadcrumb,
102
103
  l as BreadcrumbEllipsis,
@@ -105,16 +106,16 @@ export {
105
106
  s as BreadcrumbList,
106
107
  p as BreadcrumbPage,
107
108
  u as BreadcrumbSeparator,
108
- xa as Breadcrumbs,
109
+ ga as Breadcrumbs,
109
110
  Oe as Button,
110
111
  R as CalloutCard,
111
- Ko as Card,
112
- Ro as CardContent,
113
- Go as CardDescription,
114
- Vo as CardFooter,
115
- Wo as CardHeader,
112
+ Go as Card,
113
+ Vo as CardContent,
114
+ Wo as CardDescription,
115
+ No as CardFooter,
116
+ Oo as CardHeader,
116
117
  V as CardSkeleton,
117
- No as CardTitle,
118
+ jo as CardTitle,
118
119
  N as ChartCard,
119
120
  j as ChatBar,
120
121
  z as ChatInput,
@@ -130,7 +131,7 @@ export {
130
131
  Xe as CollapsibleContent,
131
132
  Ye as CollapsibleTrigger,
132
133
  ue as D3Chart,
133
- ka as D3ChartTemplates,
134
+ ya as D3ChartTemplates,
134
135
  ie as DataModeProvider,
135
136
  ge as DataModeToggle,
136
137
  $e as DatePicker,
@@ -148,8 +149,8 @@ export {
148
149
  xr as DialogPortal,
149
150
  nr as DialogTitle,
150
151
  gr as DialogTrigger,
151
- na as Drawer,
152
- ga as Dropdown,
152
+ Ca as Drawer,
153
+ ca as Dropdown,
153
154
  ce as EmptyState,
154
155
  Ue as FeedPanel,
155
156
  Hr as Field,
@@ -191,15 +192,16 @@ export {
191
192
  to as HeroUIToast,
192
193
  fo as HeroUIToggle,
193
194
  po as HeroUITooltip,
194
- Ca as Kbd,
195
- mo as Label,
196
- xo as ListCard,
197
- ca as Meter,
198
- go as MetricCard,
199
- co as MetricsStrip,
200
- Ia as Modal,
201
- Uo as PageContainer,
202
- Ua as Pagination,
195
+ mo as KanbanBoard,
196
+ Ia as Kbd,
197
+ xo as Label,
198
+ go as ListCard,
199
+ Ua as Meter,
200
+ co as MetricCard,
201
+ Uo as MetricsStrip,
202
+ Da as Modal,
203
+ Po as PageContainer,
204
+ Pa as Pagination,
203
205
  m as PaginationContent,
204
206
  i as PaginationEllipsis,
205
207
  x as PaginationItem,
@@ -209,47 +211,47 @@ export {
209
211
  Gr as Popover,
210
212
  Vr as PopoverContent,
211
213
  Wr as PopoverTrigger,
212
- Da as ProgressBar,
213
- Pa as ProgressCircle,
214
- Ha as ScrollShadow,
215
- Po as SearchFilter,
216
- So as SectionCard,
214
+ Ha as ProgressBar,
215
+ Sa as ProgressCircle,
216
+ Ta as ScrollShadow,
217
+ So as SearchFilter,
218
+ Bo as SectionCard,
217
219
  Yr as Select,
218
220
  c as SelectContent,
219
- Bo as SelectFilter,
221
+ ho as SelectFilter,
220
222
  I as SelectItem,
221
223
  U as SelectTrigger,
222
224
  D as SelectValue,
223
- Sa as Separator,
224
- Ta as Skeleton,
225
- ho as Spinner,
226
- Mo as StatusCard,
227
- Ao as TableCard,
228
- Ba as Tabs,
229
- ba as Toast,
230
- vo as ToggleFilter,
231
- ha as Tooltip,
232
- wo as UIButton,
233
- Oo as UICard,
234
- qo as UIChip,
235
- Jo as UIContainer,
236
- Xo as UIInput,
237
- Zo as UIText,
238
- $o as UIToggle,
239
- ra as WidgetCard,
240
- ya as applyFilters,
225
+ Ba as Separator,
226
+ ba as Skeleton,
227
+ Mo as Spinner,
228
+ Ao as StatusCard,
229
+ vo as TableCard,
230
+ ha as Tabs,
231
+ Fa as Toast,
232
+ wo as ToggleFilter,
233
+ Ma as Tooltip,
234
+ Ko as UIButton,
235
+ qo as UICard,
236
+ Jo as UIChip,
237
+ Xo as UIContainer,
238
+ Zo as UIInput,
239
+ $o as UIText,
240
+ ra as UIToggle,
241
+ aa as WidgetCard,
242
+ La as applyFilters,
241
243
  o as cn,
242
- va as filterByDateRange,
243
- La as filterBySearch,
244
- wa as filterByToggle,
245
- Ea as filterByValue,
246
- Ka as sortByKey,
247
- Fa as toast,
248
- aa as useChatState,
244
+ wa as filterByDateRange,
245
+ Ea as filterBySearch,
246
+ Ka as filterByToggle,
247
+ Ra as filterByValue,
248
+ Ga as sortByKey,
249
+ ka as toast,
250
+ la as useChatState,
249
251
  xe as useDataMode,
250
- la as useDataSource,
251
- da as useFormState,
252
- pa as usePageFilters,
252
+ da as useDataSource,
253
+ pa as useFormState,
254
+ ma as usePageFilters,
253
255
  y as useThemeMode
254
256
  };
255
257
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -58,31 +58,18 @@
58
58
  --color-sidebar-border: var(--sidebar-border);
59
59
  --color-sidebar-ring: var(--sidebar-ring);
60
60
 
61
- /* Engine brand paletteofficial guidelines */
62
- --color-engine-black: #0D1117;
63
- --color-engine-cyan: #7DCBD9;
64
- --color-engine-green: #1E9D6D;
65
- --color-engine-blue: #157DE5;
66
- --color-engine-orange: #FD4B23;
67
- --color-engine-amber: #FFB200;
68
- --color-engine-bg: #F3F3F4;
69
- --color-engine-border: #B0B1B3;
70
- --color-engine-text: #0D1117;
71
- --color-engine-muted: #616368;
72
- --color-engine-label: #B0B1B3;
73
-
74
- /* Engine Cyan brand ramp */
75
- --color-brand-50: #F0FAFB;
76
- --color-brand-100: #D9F2F5;
77
- --color-brand-200: #B3E5EB;
78
- --color-brand-300: #7DCBD9;
79
- --color-brand-400: #5BB8CA;
80
- --color-brand-500: #3AA0B5;
81
- --color-brand-600: #2D849A;
82
- --color-brand-700: #266B7E;
83
- --color-brand-800: #235768;
84
- --color-brand-900: #1F4858;
85
- --color-brand-950: #112E3A;
61
+ /* Neutral brand rampoverride per-app to apply your brand colors */
62
+ --color-brand-50: #f8fafc;
63
+ --color-brand-100: #f1f5f9;
64
+ --color-brand-200: #e2e8f0;
65
+ --color-brand-300: #cbd5e1;
66
+ --color-brand-400: #94a3b8;
67
+ --color-brand-500: #64748b;
68
+ --color-brand-600: #475569;
69
+ --color-brand-700: #334155;
70
+ --color-brand-800: #1e293b;
71
+ --color-brand-900: #0f172a;
72
+ --color-brand-950: #020617;
86
73
 
87
74
  --font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif;
88
75
  --font-mono: 'JetBrains Mono', ui-monospace, monospace;
@@ -92,22 +79,22 @@
92
79
  }
93
80
 
94
81
  :root {
95
- --dash-text: #0D1117;
96
- --dash-muted: #3d4047;
97
- --dash-label: #8b8d91;
98
- --dash-surface: #fef9ef;
99
- --dash-border: #e2c97a;
100
- --dash-accent: #FFB200;
82
+ --dash-text: #0f172a;
83
+ --dash-muted: #475569;
84
+ --dash-label: #94a3b8;
85
+ --dash-surface: #ffffff;
86
+ --dash-border: #e2e8f0;
87
+ --dash-accent: #64748b;
101
88
  --dash-success: #34d399;
102
89
  --dash-info: #67e8f9;
103
- --dash-warning: #FD4B23;
90
+ --dash-warning: #f59e0b;
104
91
  --dash-danger: #dc2626;
105
- --dash-dark: #0D1117;
106
- --dash-darker: #06090d;
107
- --dash-chart-1: #FFB200;
108
- --dash-chart-2: #1E9D6D;
109
- --dash-chart-3: #7DCBD9;
110
- --dash-chart-4: #FD4B23;
92
+ --dash-dark: #0f172a;
93
+ --dash-darker: #020617;
94
+ --dash-chart-1: #64748b;
95
+ --dash-chart-2: #34d399;
96
+ --dash-chart-3: #67e8f9;
97
+ --dash-chart-4: #f59e0b;
111
98
  --dash-metric-size: 2.5rem;
112
99
  --dash-metric-sub: 2.25rem;
113
100
  --color-dash-text: var(--dash-text);
@@ -206,37 +193,37 @@
206
193
 
207
194
  /*
208
195
  * Restore HeroUI theme variables inside the Command Center scope.
209
- * Uses Engine brand colors: Cyan #7DCBD9 as secondary, Orange-Red #FD4B23 as danger.
196
+ * Neutral defaults override per-app to apply your brand colors.
210
197
  */
211
198
  .heroui-scope {
212
- --primary: #0D1117;
199
+ --primary: oklch(0.205 0 0);
213
200
  --primary-foreground: oklch(0.9911 0 0);
214
- --secondary: #7DCBD9;
215
- --secondary-foreground: #0D1117;
216
- --success: #1E9D6D;
201
+ --secondary: oklch(0.55 0.02 240);
202
+ --secondary-foreground: oklch(0.9911 0 0);
203
+ --success: #16a34a;
217
204
  --success-foreground: oklch(0.9911 0 0);
218
- --warning: #FFB200;
219
- --warning-foreground: #0D1117;
220
- --danger: #FD4B23;
205
+ --warning: #f59e0b;
206
+ --warning-foreground: oklch(0.205 0 0);
207
+ --danger: #dc2626;
221
208
  --danger-foreground: oklch(0.9911 0 0);
222
209
 
223
210
  --muted: oklch(0.5517 0.0138 285.94);
224
211
  --accent: oklch(0.6204 0.195 253.83);
225
212
  --accent-foreground: oklch(0.9911 0 0);
226
- --background: #F3F3F4;
227
- --foreground: #0D1117;
213
+ --background: oklch(0.985 0 0);
214
+ --foreground: oklch(0.145 0 0);
228
215
  --default: oklch(94% 0.001 286.375);
229
- --default-foreground: #0D1117;
230
- --border: #B0B1B3;
216
+ --default-foreground: oklch(0.145 0 0);
217
+ --border: oklch(0.85 0.005 286);
231
218
  --separator: oklch(92% 0.004 286.32);
232
219
  --segment: oklch(100% 0 0);
233
- --segment-foreground: #0D1117;
220
+ --segment-foreground: oklch(0.145 0 0);
234
221
  --surface: oklch(100% 0 0);
235
- --surface-foreground: #0D1117;
222
+ --surface-foreground: oklch(0.145 0 0);
236
223
  --overlay: oklch(100% 0 0);
237
- --overlay-foreground: #0D1117;
238
- --focus: #157DE5;
239
- --link: #0D1117;
224
+ --overlay-foreground: oklch(0.145 0 0);
225
+ --focus: oklch(0.6 0.18 250);
226
+ --link: oklch(0.205 0 0);
240
227
  }
241
228
 
242
229
  /* ChatBar expanded overlay — horizontal padding so it doesn't hit window edges */
@@ -261,9 +248,9 @@ body > .fixed.inset-x-0.rounded-2xl {
261
248
  --overlay: oklch(0.2103 0.0059 285.89);
262
249
  --overlay-foreground: oklch(0.9911 0 0);
263
250
  --warning: oklch(0.8203 0.1388 76.34);
264
- --warning-foreground: #0D1117;
251
+ --warning-foreground: oklch(0.145 0 0);
265
252
  --danger: oklch(0.594 0.1967 24.63);
266
253
  --danger-foreground: oklch(0.9911 0 0);
267
- --focus: #157DE5;
254
+ --focus: oklch(0.6 0.18 250);
268
255
  --link: oklch(0.9911 0 0);
269
256
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schandlergarcia/sf-web-components",
3
- "version": "2.3.17",
3
+ "version": "2.5.0",
4
4
  "description": "Reusable Salesforce web components library with Tailwind CSS v4 and shadcn/ui",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -52,11 +52,13 @@
52
52
  "reset:command-center": "bash scripts/reset-command-center.sh",
53
53
  "validate:dashboard": "bash scripts/validate-dashboard.sh",
54
54
  "graphql:schema": "node scripts/get-graphql-schema.mjs",
55
- "brand:engine": "node node_modules/@schandlergarcia/sf-web-components/scripts/apply-brand.mjs engine",
56
55
  "brand:reset": "node node_modules/@schandlergarcia/sf-web-components/scripts/apply-brand.mjs --reset",
57
56
  "brand:list": "node node_modules/@schandlergarcia/sf-web-components/scripts/apply-brand.mjs --list"
58
57
  },
59
58
  "peerDependencies": {
59
+ "@dnd-kit/core": "^6.0.0",
60
+ "@dnd-kit/sortable": "^8.0.0 || ^9.0.0 || ^10.0.0",
61
+ "@dnd-kit/utilities": "^3.0.0",
60
62
  "@heroicons/react": "^2.0.0",
61
63
  "@heroui/react": "^3.0.0",
62
64
  "@heroui/styles": "^3.0.0",
@@ -85,6 +87,9 @@
85
87
  "tailwind-merge": "^3.5.0"
86
88
  },
87
89
  "devDependencies": {
90
+ "@dnd-kit/core": "^6.3.1",
91
+ "@dnd-kit/sortable": "^10.0.0",
92
+ "@dnd-kit/utilities": "^3.2.2",
88
93
  "@heroicons/react": "^2.2.0",
89
94
  "@heroui/react": "^3.0.1",
90
95
  "@heroui/styles": "^3.0.1",
@@ -4,14 +4,19 @@
4
4
  * apply-brand.mjs — Apply a brand theme or install a full demo app.
5
5
  *
6
6
  * Usage:
7
- * node scripts/apply-brand.mjs engine # Apply Engine brand colors only
8
- * node scripts/apply-brand.mjs --demo engine # Install full Engine demo app (neutral theme)
9
- * node scripts/apply-brand.mjs --list # List available brands
10
- * node scripts/apply-brand.mjs --reset # Remove brand, restore neutral theme
7
+ * node scripts/apply-brand.mjs <brand> # Apply brand colors only
8
+ * node scripts/apply-brand.mjs --demo <brand> # Install full demo app for a brand
9
+ * node scripts/apply-brand.mjs --list # List available brands
10
+ * node scripts/apply-brand.mjs --reset # Remove brand, restore neutral theme
11
11
  *
12
- * The demo command installs the full app (dashboard, routes, hooks, queries,
13
- * features) but keeps the neutral color palette. Run brand:engine afterwards
14
- * to switch to Engine colors.
12
+ * Brands live in brands/<name>/ at the package root. Each brand may provide:
13
+ * - global.css (theme overrides applied to src/styles/global.css)
14
+ * - app/ (full demo app: pages, hooks, api, features, etc.)
15
+ * - schema.graphql (data schema)
16
+ * - *.png (brand logo assets)
17
+ * - *_PRD.md / *-prd.md (product requirements docs)
18
+ *
19
+ * No brands ship with the package by default. Add your own under brands/.
15
20
  */
16
21
 
17
22
  import fs from 'fs';
@@ -184,17 +189,21 @@ if (isDemo) {
184
189
  }
185
190
  }
186
191
 
187
- // Copy sample data files
188
- const dataFiles = ['engine-sample-data.js', 'engine-live-data.js', 'partner-hub-sample-data.js'];
192
+ // Copy any *.js / *.ts data files at the brand root into src/data/
193
+ const dataFiles = fs.readdirSync(brandDir).filter(f => {
194
+ if (!fs.statSync(path.join(brandDir, f)).isFile()) return false;
195
+ return f.endsWith('-sample-data.js')
196
+ || f.endsWith('-live-data.js')
197
+ || f.endsWith('-data.ts')
198
+ || f.endsWith('-data.js');
199
+ });
189
200
  for (const file of dataFiles) {
190
201
  const src = path.join(brandDir, file);
191
202
  const dst = path.join(cwd, 'src/data', file);
192
- if (fs.existsSync(src)) {
193
- fs.mkdirSync(path.dirname(dst), { recursive: true });
194
- fs.copyFileSync(src, dst);
195
- console.log(` ✓ Installed src/data/${file}`);
196
- installed++;
197
- }
203
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
204
+ fs.copyFileSync(src, dst);
205
+ console.log(` ✓ Installed src/data/${file}`);
206
+ installed++;
198
207
  }
199
208
 
200
209
  // Copy PRDs to project root
@@ -213,13 +222,16 @@ if (isDemo) {
213
222
  installed++;
214
223
  }
215
224
 
216
- // Copy logo
217
- const logo = path.join(brandDir, 'engine_logo.png');
218
- if (fs.existsSync(logo)) {
219
- const logoTarget = path.join(cwd, 'src/assets/images/engine_logo.png');
220
- fs.mkdirSync(path.dirname(logoTarget), { recursive: true });
221
- fs.copyFileSync(logo, logoTarget);
222
- console.log(' Installed engine_logo.png');
225
+ // Copy any logo/image assets at the brand root into src/assets/images/
226
+ const imageFiles = fs.readdirSync(brandDir).filter(f =>
227
+ /\.(png|jpe?g|svg|webp|gif)$/i.test(f)
228
+ );
229
+ for (const file of imageFiles) {
230
+ const src = path.join(brandDir, file);
231
+ const dst = path.join(cwd, 'src/assets/images', file);
232
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
233
+ fs.copyFileSync(src, dst);
234
+ console.log(` ✓ Installed src/assets/images/${file}`);
223
235
  installed++;
224
236
  }
225
237
 
@@ -259,14 +271,19 @@ if (fs.existsSync(brandCSS)) {
259
271
  installed++;
260
272
  }
261
273
 
262
- // 2. Logo → src/assets/images/
263
- const logo = path.join(brandDir, 'engine_logo.png');
264
- if (fs.existsSync(logo)) {
265
- const logoTarget = path.join(cwd, 'src/assets/images/engine_logo.png');
266
- fs.mkdirSync(path.dirname(logoTarget), { recursive: true });
267
- fs.copyFileSync(logo, logoTarget);
268
- console.log(' ✓ Installed engine_logo.png');
269
- installed++;
274
+ // 2. Any logo/image assets → src/assets/images/
275
+ if (fs.existsSync(brandDir)) {
276
+ const imageFiles = fs.readdirSync(brandDir).filter(f =>
277
+ /\.(png|jpe?g|svg|webp|gif)$/i.test(f)
278
+ );
279
+ for (const file of imageFiles) {
280
+ const src = path.join(brandDir, file);
281
+ const dst = path.join(cwd, 'src/assets/images', file);
282
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
283
+ fs.copyFileSync(src, dst);
284
+ console.log(` ✓ Installed src/assets/images/${file}`);
285
+ installed++;
286
+ }
270
287
  }
271
288
 
272
289
  // 3. Write .brand marker
@@ -341,11 +341,7 @@ if (fs.existsSync(packageJsonPath)) {
341
341
  scriptsAdded.push('sfwc:setup');
342
342
  }
343
343
 
344
- // Add brand scripts
345
- if (!packageJson.scripts['brand:engine']) {
346
- packageJson.scripts['brand:engine'] = 'node node_modules/@schandlergarcia/sf-web-components/scripts/apply-brand.mjs engine';
347
- scriptsAdded.push('brand:engine');
348
- }
344
+ // Add brand scripts (no brands ship by default — add your own under brands/)
349
345
  if (!packageJson.scripts['brand:reset']) {
350
346
  packageJson.scripts['brand:reset'] = 'node node_modules/@schandlergarcia/sf-web-components/scripts/apply-brand.mjs --reset';
351
347
  scriptsAdded.push('brand:reset');
@@ -355,12 +351,6 @@ if (fs.existsSync(packageJsonPath)) {
355
351
  scriptsAdded.push('brand:list');
356
352
  }
357
353
 
358
- // Add demo scripts
359
- if (!packageJson.scripts['demo:engine']) {
360
- packageJson.scripts['demo:engine'] = 'node node_modules/@schandlergarcia/sf-web-components/scripts/apply-brand.mjs --demo engine';
361
- scriptsAdded.push('demo:engine');
362
- }
363
-
364
354
  if (scriptsAdded.length > 0) {
365
355
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8');
366
356
  scriptsAdded.forEach(script => {