@schandlergarcia/sf-web-components 1.2.6 → 1.2.7
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/package.json +2 -1
- package/scripts/postinstall.mjs +69 -93
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Account.cls +196 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/AccountHistory.cls +25 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Asset.cls +138 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Attachment.cls +35 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Case.cls +111 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Contact.cls +167 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Contract.cls +96 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Domain.cls +29 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Lead.cls +128 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Note.cls +32 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Opportunity.cls +113 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Order.cls +127 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Pricebook2.cls +47 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/PricebookEntry.cls +47 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Product2.cls +91 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/RecordType.cls +35 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Report.cls +47 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/Task.cls +79 -0
- package/src/components/library/.sfdx/tools/sobjects/standardObjects/User.cls +2318 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Account.json +2952 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/AccountHistory.json +875 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Asset.json +1699 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Attachment.json +362 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Case.json +1371 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Contact.json +2309 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Contract.json +1304 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Domain.json +293 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Lead.json +1977 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Note.json +303 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Opportunity.json +1470 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Order.json +1646 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Pricebook2.json +482 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/PricebookEntry.json +433 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Product2.json +1039 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/RecordType.json +2576 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Report.json +486 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/Task.json +4296 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/standardObjects/User.json +30415 -0
- package/src/components/library/.sfdx/tools/soqlMetadata/typeNames.json +78 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Account.d.ts +264 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/AccountHistory.d.ts +44 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Asset.d.ts +240 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Attachment.d.ts +76 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Case.d.ts +172 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Contact.d.ts +264 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Contract.d.ts +188 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Domain.d.ts +52 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Lead.d.ts +252 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Note.d.ts +64 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Opportunity.d.ts +200 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Order.d.ts +260 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Pricebook2.d.ts +64 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/PricebookEntry.d.ts +76 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Product2.d.ts +96 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/RecordType.d.ts +64 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Report.d.ts +80 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/Task.d.ts +184 -0
- package/src/components/library/.sfdx/typings/lwc/sobjects/User.d.ts +752 -0
- package/src/components/library/cards/ActionList.jsx +38 -0
- package/src/components/library/cards/ActivityCard.jsx +56 -0
- package/src/components/library/cards/BaseCard.jsx +109 -0
- package/src/components/library/cards/CalloutCard.jsx +37 -0
- package/src/components/library/cards/ChartCard.jsx +105 -0
- package/src/components/library/cards/FeedPanel.jsx +39 -0
- package/src/components/library/cards/ListCard.jsx +193 -0
- package/src/components/library/cards/MetricCard.jsx +109 -0
- package/src/components/library/cards/MetricsStrip.jsx +78 -0
- package/src/components/library/cards/SectionCard.jsx +83 -0
- package/src/components/library/cards/SemanticMetricCard.jsx +52 -0
- package/src/components/library/cards/SemanticMetricCardWithLoading.jsx +23 -0
- package/src/components/library/cards/SemanticTableCard.jsx +48 -0
- package/src/components/library/cards/SemanticTableCardWithLoading.jsx +22 -0
- package/src/components/library/cards/StatusCard.jsx +220 -0
- package/src/components/library/cards/TableCard.jsx +337 -0
- package/src/components/library/cards/WidgetCard.jsx +90 -0
- package/src/components/library/charts/D3Chart.jsx +109 -0
- package/src/components/library/charts/D3ChartTemplates.jsx +126 -0
- package/src/components/library/charts/GeoMap.jsx +293 -0
- package/src/components/library/chat/ChatBar.jsx +256 -0
- package/src/components/library/chat/ChatInput.jsx +89 -0
- package/src/components/library/chat/ChatMessage.jsx +178 -0
- package/src/components/library/chat/ChatMessageList.jsx +73 -0
- package/src/components/library/chat/ChatPanel.jsx +97 -0
- package/src/components/library/chat/ChatSuggestions.jsx +28 -0
- package/src/components/library/chat/ChatToolCall.jsx +100 -0
- package/src/components/library/chat/ChatTypingIndicator.jsx +23 -0
- package/src/components/library/chat/ChatWelcome.jsx +43 -0
- package/src/components/library/chat/index.jsx +10 -0
- package/src/components/library/chat/useChatState.jsx +130 -0
- package/src/components/library/data/DataModeProvider.jsx +67 -0
- package/src/components/library/data/DataModeToggle.jsx +36 -0
- package/src/components/library/data/chartDataProvider.jsx +61 -0
- package/src/components/library/data/filterUtils.jsx +141 -0
- package/src/components/library/data/useDataSource.jsx +33 -0
- package/src/components/library/data/usePageFilters.jsx +99 -0
- package/src/components/library/filters/FilterBar.jsx +95 -0
- package/src/components/library/filters/SearchFilter.jsx +36 -0
- package/src/components/library/filters/SelectFilter.jsx +55 -0
- package/src/components/library/filters/ToggleFilter.jsx +52 -0
- package/src/components/library/filters/index.jsx +4 -0
- package/src/components/library/forms/FormField.jsx +291 -0
- package/src/components/library/forms/FormModal.jsx +201 -0
- package/src/components/library/forms/FormRenderer.jsx +46 -0
- package/src/components/library/forms/FormSection.jsx +69 -0
- package/src/components/library/forms/index.jsx +5 -0
- package/src/components/library/forms/useFormState.jsx +165 -0
- package/src/components/library/heroui/Accordion.jsx +26 -0
- package/src/components/library/heroui/Alert.jsx +8 -0
- package/src/components/library/heroui/Badge.jsx +8 -0
- package/src/components/library/heroui/Breadcrumbs.jsx +22 -0
- package/src/components/library/heroui/Button.jsx +58 -0
- package/src/components/library/heroui/Card.jsx +8 -0
- package/src/components/library/heroui/Collapsible.jsx +42 -0
- package/src/components/library/heroui/DatePicker.jsx +34 -0
- package/src/components/library/heroui/Dialog.jsx +37 -0
- package/src/components/library/heroui/Drawer.jsx +32 -0
- package/src/components/library/heroui/Dropdown.jsx +28 -0
- package/src/components/library/heroui/Field.jsx +51 -0
- package/src/components/library/heroui/Input.jsx +6 -0
- package/src/components/library/heroui/Kbd.jsx +8 -0
- package/src/components/library/heroui/Meter.jsx +8 -0
- package/src/components/library/heroui/Modal.jsx +32 -0
- package/src/components/library/heroui/Pagination.jsx +8 -0
- package/src/components/library/heroui/Popover.jsx +64 -0
- package/src/components/library/heroui/ProgressBar.jsx +8 -0
- package/src/components/library/heroui/ProgressCircle.jsx +8 -0
- package/src/components/library/heroui/ScrollShadow.jsx +8 -0
- package/src/components/library/heroui/Select.jsx +37 -0
- package/src/components/library/heroui/Separator.jsx +8 -0
- package/src/components/library/heroui/Skeleton.jsx +8 -0
- package/src/components/library/heroui/Tabs.jsx +26 -0
- package/src/components/library/heroui/Toast.jsx +25 -0
- package/src/components/library/heroui/Toggle.jsx +14 -0
- package/src/components/library/heroui/Tooltip.jsx +21 -0
- package/src/components/library/index.jsx +149 -0
- package/src/components/library/layout/PageContainer.jsx +11 -0
- package/src/components/library/skeletons/CardSkeleton.jsx +30 -0
- package/src/components/library/theme/AppThemeProvider.jsx +67 -0
- package/src/components/library/theme/tokens.jsx +72 -0
- package/src/components/library/ui/Alert.jsx +80 -0
- package/src/components/library/ui/Avatar.jsx +44 -0
- package/src/components/library/ui/BreadcrumbExtras.tsx +119 -0
- package/src/components/library/ui/Card.jsx +117 -0
- package/src/components/library/ui/Checkbox.jsx +17 -0
- package/src/components/library/ui/Chip.jsx +38 -0
- package/src/components/library/ui/Collapsible.tsx +31 -0
- package/src/components/library/ui/Container.jsx +56 -0
- package/src/components/library/ui/DatePicker.tsx +34 -0
- package/src/components/library/ui/Dialog.tsx +141 -0
- package/src/components/library/ui/EmptyState.jsx +46 -0
- package/src/components/library/ui/Field.tsx +82 -0
- package/src/components/library/ui/FieldGroup.jsx +17 -0
- package/src/components/library/ui/Label.jsx +22 -0
- package/src/components/library/ui/PaginationExtras.tsx +143 -0
- package/src/components/library/ui/Popover.tsx +39 -0
- package/src/components/library/ui/Select.tsx +113 -0
- package/src/components/library/ui/Spinner.jsx +64 -0
- package/src/components/library/ui/Text.jsx +46 -0
- package/src/components/library/ui/UIButton.jsx +61 -0
- package/src/components/library/ui/UIInput.jsx +21 -0
- package/src/components/workspace/ComponentRegistry.jsx +297 -0
- package/src/templates/pages/Home.tsx.template +5 -5
- package/src/templates/pages/NotFound.tsx.template +2 -2
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Select as HeroSelect } from "@heroui/react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* HeroUI v3 Select wrapper with shadcn compatibility.
|
|
6
|
+
*
|
|
7
|
+
* Translates shadcn API to HeroUI:
|
|
8
|
+
* - onValueChange -> onSelectionChange
|
|
9
|
+
* - value -> selectedKeys
|
|
10
|
+
*/
|
|
11
|
+
export default function HeroUISelect({ value, onValueChange, children, ...props }) {
|
|
12
|
+
// Translate shadcn API to HeroUI API
|
|
13
|
+
const selectedKeys = value ? [value] : [];
|
|
14
|
+
const handleSelectionChange = (keys) => {
|
|
15
|
+
const selected = Array.from(keys)[0];
|
|
16
|
+
onValueChange?.(selected || "");
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<HeroSelect
|
|
21
|
+
selectedKeys={selectedKeys}
|
|
22
|
+
onSelectionChange={handleSelectionChange}
|
|
23
|
+
{...props}
|
|
24
|
+
>
|
|
25
|
+
{children}
|
|
26
|
+
</HeroSelect>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// For direct HeroUI usage
|
|
31
|
+
export const Select = HeroUISelect;
|
|
32
|
+
|
|
33
|
+
// Shadcn-compatible subcomponents that just pass through children
|
|
34
|
+
export const SelectTrigger = ({ children, size, ...props }) => <>{children}</>;
|
|
35
|
+
export const SelectValue = ({ placeholder, ...props }) => <span {...props}>{placeholder}</span>;
|
|
36
|
+
export const SelectContent = ({ children, ...props }) => <>{children}</>;
|
|
37
|
+
export const SelectItem = ({ value, children, ...props }) => <HeroSelect.Item key={value} {...props}>{children}</HeroSelect.Item>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Tabs } from "@heroui/react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* HeroUI v3 Tabs — compound component.
|
|
6
|
+
*
|
|
7
|
+
* Sub-components via dot notation on the named `Tabs` export:
|
|
8
|
+
* Tabs.List, Tabs.ListContainer, Tabs.Tab, Tabs.Panel,
|
|
9
|
+
* Tabs.Separator, Tabs.Indicator
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { Tabs } from "@/components/library";
|
|
13
|
+
* <Tabs>
|
|
14
|
+
* <Tabs.List aria-label="Options">
|
|
15
|
+
* <Tabs.Tab id="overview">Overview</Tabs.Tab>
|
|
16
|
+
* <Tabs.Tab id="analytics">Analytics</Tabs.Tab>
|
|
17
|
+
* </Tabs.List>
|
|
18
|
+
* <Tabs.Panel id="overview">…</Tabs.Panel>
|
|
19
|
+
* <Tabs.Panel id="analytics">…</Tabs.Panel>
|
|
20
|
+
* </Tabs>
|
|
21
|
+
*/
|
|
22
|
+
export default function HeroUITabs({ variant = "primary", ...props }) {
|
|
23
|
+
return <Tabs variant={variant} {...props} />;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { Tabs };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Toast, toast } from "@heroui/react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* HeroUI v3 Toast — notification system.
|
|
6
|
+
*
|
|
7
|
+
* SETUP: Add <Toast.Provider /> to your app root (_app.js).
|
|
8
|
+
*
|
|
9
|
+
* Then call the `toast` function from anywhere:
|
|
10
|
+
* toast("Event created");
|
|
11
|
+
* toast.success("Saved!");
|
|
12
|
+
* toast.warning("Check settings");
|
|
13
|
+
* toast.danger("Something failed");
|
|
14
|
+
* toast.promise(asyncFn(), { loading: "…", success: "Done", error: "Failed" });
|
|
15
|
+
*
|
|
16
|
+
* Sub-components via dot notation on the named `Toast` export:
|
|
17
|
+
* Toast.Provider, Toast.Indicator, Toast.Content,
|
|
18
|
+
* Toast.Title, Toast.Description, Toast.ActionButton,
|
|
19
|
+
* Toast.CloseButton
|
|
20
|
+
*/
|
|
21
|
+
export default function HeroUIToast(props) {
|
|
22
|
+
return <Toast {...props} />;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { Toast, toast };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Switch } from "@heroui/react";
|
|
3
|
+
import { useThemeMode } from "../theme/AppThemeProvider";
|
|
4
|
+
|
|
5
|
+
export default function HeroUIToggle({ label = "Dark mode", ...props }) {
|
|
6
|
+
const { mode, toggle } = useThemeMode();
|
|
7
|
+
const isSelected = mode === "dark";
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<Switch isSelected={isSelected} onChange={toggle} {...props}>
|
|
11
|
+
<Switch.Content>{label}</Switch.Content>
|
|
12
|
+
</Switch>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Tooltip } from "@heroui/react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* HeroUI v3 Tooltip — compound component.
|
|
6
|
+
*
|
|
7
|
+
* Sub-components via dot notation on the named `Tooltip` export:
|
|
8
|
+
* Tooltip.Trigger, Tooltip.Content, Tooltip.Arrow
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { Tooltip } from "@/components/library";
|
|
12
|
+
* <Tooltip>
|
|
13
|
+
* <Tooltip.Trigger><Button>Hover me</Button></Tooltip.Trigger>
|
|
14
|
+
* <Tooltip.Content>Helpful info</Tooltip.Content>
|
|
15
|
+
* </Tooltip>
|
|
16
|
+
*/
|
|
17
|
+
export default function HeroUITooltip(props) {
|
|
18
|
+
return <Tooltip {...props} />;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { Tooltip };
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
export { default as AppThemeProvider, useThemeMode } from "./theme/AppThemeProvider";
|
|
4
|
+
|
|
5
|
+
// UI primitives
|
|
6
|
+
export { default as UIButton } from "./ui/UIButton";
|
|
7
|
+
export { default as UIInput } from "./ui/UIInput";
|
|
8
|
+
export { default as UIText } from "./ui/Text";
|
|
9
|
+
export { default as UIContainer } from "./ui/Container";
|
|
10
|
+
export { default as UIChip } from "./ui/Chip";
|
|
11
|
+
export { default as Avatar } from "./ui/Avatar";
|
|
12
|
+
export { default as EmptyState } from "./ui/EmptyState";
|
|
13
|
+
export { default as Spinner } from "./ui/Spinner";
|
|
14
|
+
export { default as Label } from "./ui/Label";
|
|
15
|
+
export { default as Checkbox } from "./ui/Checkbox";
|
|
16
|
+
export { default as FieldGroup } from "./ui/FieldGroup";
|
|
17
|
+
|
|
18
|
+
// shadcn-compatible Card with subcomponents
|
|
19
|
+
export { default as UICard, Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "./ui/Card";
|
|
20
|
+
|
|
21
|
+
// shadcn-compatible Alert with subcomponents
|
|
22
|
+
export { default as Alert, AlertTitle, AlertDescription, AlertAction } from "./ui/Alert";
|
|
23
|
+
|
|
24
|
+
// shadcn-compatible components from heroui/ (HeroUI-based)
|
|
25
|
+
export { default as HeroUIDialog, Dialog, DialogTrigger, DialogPortal, DialogClose, DialogOverlay, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription } from "./heroui/Dialog";
|
|
26
|
+
export { default as HeroUIField, Field, FieldLabel, FieldDescription, FieldError } from "./heroui/Field";
|
|
27
|
+
export { default as HeroUICollapsible, Collapsible, CollapsibleTrigger, CollapsibleContent } from "./heroui/Collapsible";
|
|
28
|
+
export { default as HeroUIPopover, Popover, PopoverTrigger, PopoverContent } from "./heroui/Popover";
|
|
29
|
+
export { default as HeroUIDatePicker, DatePicker, DatePickerTrigger, DatePickerContent, DatePickerCalendar, DatePickerRangeTrigger } from "./heroui/DatePicker";
|
|
30
|
+
|
|
31
|
+
// Cards
|
|
32
|
+
export { default as BaseCard } from "./cards/BaseCard";
|
|
33
|
+
export { default as ChartCard } from "./cards/ChartCard";
|
|
34
|
+
export { default as ListCard } from "./cards/ListCard";
|
|
35
|
+
export { default as MetricCard } from "./cards/MetricCard";
|
|
36
|
+
export { default as SectionCard } from "./cards/SectionCard";
|
|
37
|
+
export { default as StatusCard } from "./cards/StatusCard";
|
|
38
|
+
export { default as TableCard } from "./cards/TableCard";
|
|
39
|
+
export { default as WidgetCard } from "./cards/WidgetCard";
|
|
40
|
+
export { default as FeedPanel } from "./cards/FeedPanel";
|
|
41
|
+
export { default as ActivityCard } from "./cards/ActivityCard";
|
|
42
|
+
export { default as MetricsStrip } from "./cards/MetricsStrip";
|
|
43
|
+
export { default as CalloutCard } from "./cards/CalloutCard";
|
|
44
|
+
export { default as ActionList } from "./cards/ActionList";
|
|
45
|
+
|
|
46
|
+
// Charts
|
|
47
|
+
export { default as D3Chart } from "./charts/D3Chart";
|
|
48
|
+
export { D3ChartTemplates } from "./charts/D3ChartTemplates";
|
|
49
|
+
export { default as GeoMap } from "./charts/GeoMap";
|
|
50
|
+
|
|
51
|
+
// Layout
|
|
52
|
+
export { default as PageContainer } from "./layout/PageContainer";
|
|
53
|
+
|
|
54
|
+
// Skeletons
|
|
55
|
+
export { default as CardSkeleton } from "./skeletons/CardSkeleton";
|
|
56
|
+
|
|
57
|
+
// Forms
|
|
58
|
+
export { FormModal, FormRenderer, FormSection, FormField, useFormState } from "./forms";
|
|
59
|
+
|
|
60
|
+
// Filters
|
|
61
|
+
export { FilterBar, SearchFilter, SelectFilter, ToggleFilter } from "./filters";
|
|
62
|
+
|
|
63
|
+
// Data mode
|
|
64
|
+
export { default as DataModeProvider, useDataMode } from "./data/DataModeProvider";
|
|
65
|
+
export { default as DataModeToggle } from "./data/DataModeToggle";
|
|
66
|
+
export { default as useDataSource } from "./data/useDataSource";
|
|
67
|
+
|
|
68
|
+
// Data utilities
|
|
69
|
+
export { default as usePageFilters } from "./data/usePageFilters";
|
|
70
|
+
export {
|
|
71
|
+
filterBySearch,
|
|
72
|
+
filterByValue,
|
|
73
|
+
filterByToggle,
|
|
74
|
+
filterByDateRange,
|
|
75
|
+
sortByKey,
|
|
76
|
+
applyFilters,
|
|
77
|
+
} from "./data/filterUtils";
|
|
78
|
+
|
|
79
|
+
// Chat / AI agent
|
|
80
|
+
export {
|
|
81
|
+
ChatPanel,
|
|
82
|
+
ChatBar,
|
|
83
|
+
ChatMessageList,
|
|
84
|
+
ChatMessage,
|
|
85
|
+
ChatInput,
|
|
86
|
+
ChatTypingIndicator,
|
|
87
|
+
ChatSuggestions,
|
|
88
|
+
ChatToolCall,
|
|
89
|
+
ChatWelcome,
|
|
90
|
+
useChatState,
|
|
91
|
+
} from "./chat";
|
|
92
|
+
|
|
93
|
+
// HeroUI wrappers — existing
|
|
94
|
+
export { default as HeroUIButton, Button } from "./heroui/Button";
|
|
95
|
+
export { default as HeroUIInput } from "./heroui/Input";
|
|
96
|
+
export { default as HeroUICard } from "./heroui/Card";
|
|
97
|
+
export { default as HeroUIToggle } from "./heroui/Toggle";
|
|
98
|
+
|
|
99
|
+
// HeroUI wrappers — navigation & layout
|
|
100
|
+
export { default as HeroUITabs } from "./heroui/Tabs";
|
|
101
|
+
export { default as HeroUIAccordion } from "./heroui/Accordion";
|
|
102
|
+
export { default as HeroUIBreadcrumbs, Breadcrumbs } from "./heroui/Breadcrumbs";
|
|
103
|
+
export { default as HeroUISeparator, Separator } from "./heroui/Separator";
|
|
104
|
+
export { default as HeroUIPagination, Pagination } from "./heroui/Pagination";
|
|
105
|
+
|
|
106
|
+
// Breadcrumb subcomponents for shadcn compatibility
|
|
107
|
+
export const Breadcrumb = ({ children, ...props }) => React.createElement('nav', { 'aria-label': 'breadcrumb', ...props }, children);
|
|
108
|
+
export const BreadcrumbList = ({ children, ...props }) => React.createElement('ol', { className: 'flex flex-wrap items-center gap-1.5 break-words text-sm text-slate-500 dark:text-slate-400', ...props }, children);
|
|
109
|
+
export const BreadcrumbItem = ({ children, ...props }) => React.createElement('li', { className: 'inline-flex items-center gap-1.5', ...props }, children);
|
|
110
|
+
export const BreadcrumbLink = ({ href, children, asChild, ...props }) => asChild ? React.createElement('span', props, children) : React.createElement('a', { href, className: 'transition-colors hover:text-slate-900 dark:hover:text-slate-50', ...props }, children);
|
|
111
|
+
export const BreadcrumbPage = ({ children, ...props }) => React.createElement('span', { role: 'link', 'aria-disabled': 'true', 'aria-current': 'page', className: 'font-normal text-slate-900 dark:text-slate-50', ...props }, children);
|
|
112
|
+
export const BreadcrumbSeparator = ({ children, ...props }) => React.createElement('li', { role: 'presentation', 'aria-hidden': 'true', ...props }, children ?? '/');
|
|
113
|
+
export const BreadcrumbEllipsis = (props) => React.createElement('span', { role: 'presentation', 'aria-hidden': 'true', ...props }, '...');
|
|
114
|
+
|
|
115
|
+
// Pagination subcomponents for shadcn compatibility
|
|
116
|
+
export const PaginationContent = ({ children, ...props }) => React.createElement('ul', { className: 'flex flex-row items-center gap-1', ...props }, children);
|
|
117
|
+
export const PaginationItem = ({ children, ...props }) => React.createElement('li', props, children);
|
|
118
|
+
export const PaginationLink = ({ href, isActive, children, ...props }) => React.createElement('a', { href, 'aria-current': isActive ? 'page' : undefined, className: `inline-flex items-center justify-center rounded-md text-sm font-medium h-9 min-w-9 px-4 py-2 ${isActive ? 'bg-slate-900 text-white dark:bg-slate-50 dark:text-slate-900' : 'hover:bg-slate-100 dark:hover:bg-slate-800'}`, ...props }, children);
|
|
119
|
+
export const PaginationPrevious = ({ href, ...props }) => React.createElement(PaginationLink, { href, ...props }, 'Previous');
|
|
120
|
+
export const PaginationNext = ({ href, ...props }) => React.createElement(PaginationLink, { href, ...props }, 'Next');
|
|
121
|
+
export const PaginationEllipsis = (props) => React.createElement('span', { 'aria-hidden': true, ...props }, '...');
|
|
122
|
+
|
|
123
|
+
// HeroUI wrappers — overlays
|
|
124
|
+
export { default as HeroUIDrawer } from "./heroui/Drawer";
|
|
125
|
+
export { default as HeroUIModal } from "./heroui/Modal";
|
|
126
|
+
export { default as HeroUIDropdown } from "./heroui/Dropdown";
|
|
127
|
+
export { default as HeroUITooltip } from "./heroui/Tooltip";
|
|
128
|
+
export { default as HeroUIToast } from "./heroui/Toast";
|
|
129
|
+
|
|
130
|
+
// HeroUI wrappers — feedback
|
|
131
|
+
export { default as HeroUIAlert } from "./heroui/Alert";
|
|
132
|
+
export { default as HeroUIBadge } from "./heroui/Badge";
|
|
133
|
+
export { default as HeroUIProgressBar } from "./heroui/ProgressBar";
|
|
134
|
+
export { default as HeroUIProgressCircle } from "./heroui/ProgressCircle";
|
|
135
|
+
export { default as HeroUIMeter } from "./heroui/Meter";
|
|
136
|
+
export { default as HeroUISkeleton, Skeleton } from "./heroui/Skeleton";
|
|
137
|
+
|
|
138
|
+
// HeroUI wrappers — pickers & forms
|
|
139
|
+
export { default as HeroUISelect, Select } from "./heroui/Select";
|
|
140
|
+
|
|
141
|
+
// Re-export Select subcomponents for shadcn compatibility
|
|
142
|
+
export const SelectTrigger = ({ children, size, ...props }) => React.createElement('button', props, children);
|
|
143
|
+
export const SelectValue = ({ placeholder, ...props }) => React.createElement('span', props, placeholder);
|
|
144
|
+
export const SelectContent = ({ children, ...props }) => React.createElement('div', props, children);
|
|
145
|
+
export const SelectItem = ({ children, ...props }) => React.createElement('div', props, children);
|
|
146
|
+
|
|
147
|
+
// HeroUI wrappers — utilities
|
|
148
|
+
export { default as HeroUIKbd, Kbd } from "./heroui/Kbd";
|
|
149
|
+
export { default as HeroUIScrollShadow, ScrollShadow } from "./heroui/ScrollShadow";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
export default function CardSkeleton({ lines = 3, className = "" }) {
|
|
4
|
+
return (
|
|
5
|
+
<div
|
|
6
|
+
className={[
|
|
7
|
+
"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-slate-800 dark:bg-slate-900",
|
|
8
|
+
className
|
|
9
|
+
]
|
|
10
|
+
.filter(Boolean)
|
|
11
|
+
.join(" ")}
|
|
12
|
+
aria-busy="true"
|
|
13
|
+
aria-label="Loading"
|
|
14
|
+
>
|
|
15
|
+
<div className="space-y-3">
|
|
16
|
+
{Array.from({ length: lines }).map((_, i) => (
|
|
17
|
+
<div
|
|
18
|
+
key={i}
|
|
19
|
+
className={[
|
|
20
|
+
"h-4 animate-pulse rounded bg-slate-200 dark:bg-slate-800",
|
|
21
|
+
i === 0 ? "w-1/3" : i === 1 ? "w-2/3" : "w-1/2"
|
|
22
|
+
].join(" ")}
|
|
23
|
+
/>
|
|
24
|
+
))}
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { tokens, getTokenCSSProperties } from "./tokens";
|
|
3
|
+
|
|
4
|
+
const ThemeModeContext = React.createContext({
|
|
5
|
+
mode: "light",
|
|
6
|
+
theme: tokens,
|
|
7
|
+
toggle: () => {}
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
const STORAGE_KEY = "app-color-mode";
|
|
11
|
+
|
|
12
|
+
function applyHtmlDarkClass(mode) {
|
|
13
|
+
if (typeof document === "undefined") return;
|
|
14
|
+
const root = document.documentElement;
|
|
15
|
+
if (mode === "dark") root.classList.add("dark");
|
|
16
|
+
else root.classList.remove("dark");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function applyTokenCSSProperties() {
|
|
20
|
+
if (typeof document === "undefined") return;
|
|
21
|
+
const root = document.documentElement;
|
|
22
|
+
const props = getTokenCSSProperties();
|
|
23
|
+
for (const [key, value] of Object.entries(props)) {
|
|
24
|
+
root.style.setProperty(key, value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function useThemeMode() {
|
|
29
|
+
return React.useContext(ThemeModeContext);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default function AppThemeProvider({ initialMode = "light", children }) {
|
|
33
|
+
const [mode, setMode] = React.useState(initialMode);
|
|
34
|
+
|
|
35
|
+
React.useEffect(() => {
|
|
36
|
+
applyTokenCSSProperties();
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
React.useEffect(() => {
|
|
40
|
+
try {
|
|
41
|
+
const stored = window.localStorage.getItem(STORAGE_KEY);
|
|
42
|
+
if (stored === "light" || stored === "dark") setMode(stored);
|
|
43
|
+
} catch {
|
|
44
|
+
// ignore
|
|
45
|
+
}
|
|
46
|
+
}, []);
|
|
47
|
+
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
applyHtmlDarkClass(mode);
|
|
50
|
+
try {
|
|
51
|
+
window.localStorage.setItem(STORAGE_KEY, mode);
|
|
52
|
+
} catch {
|
|
53
|
+
// ignore
|
|
54
|
+
}
|
|
55
|
+
}, [mode]);
|
|
56
|
+
|
|
57
|
+
const value = React.useMemo(
|
|
58
|
+
() => ({
|
|
59
|
+
mode,
|
|
60
|
+
theme: tokens,
|
|
61
|
+
toggle: () => setMode((m) => (m === "dark" ? "light" : "dark"))
|
|
62
|
+
}),
|
|
63
|
+
[mode]
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return <ThemeModeContext.Provider value={value}>{children}</ThemeModeContext.Provider>;
|
|
67
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design tokens — single source of truth for branding.
|
|
3
|
+
*
|
|
4
|
+
* To rebrand a command center:
|
|
5
|
+
* 1. Swap the `brand` palette (use any Tailwind-style color scale)
|
|
6
|
+
* 2. Swap the `accent` palette
|
|
7
|
+
* 3. Change `fonts.sans` in _app.js (next/font import)
|
|
8
|
+
*
|
|
9
|
+
* AppThemeProvider injects these as CSS custom properties on :root,
|
|
10
|
+
* and tailwind.config.js references them via var(--color-brand-*).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export const tokens = {
|
|
14
|
+
colors: {
|
|
15
|
+
brand: {
|
|
16
|
+
50: "#EEF2FF",
|
|
17
|
+
100: "#E0E7FF",
|
|
18
|
+
200: "#C7D2FE",
|
|
19
|
+
300: "#A5B4FC",
|
|
20
|
+
400: "#818CF8",
|
|
21
|
+
500: "#6366F1",
|
|
22
|
+
600: "#4F46E5",
|
|
23
|
+
700: "#4338CA",
|
|
24
|
+
800: "#3730A3",
|
|
25
|
+
900: "#312E81",
|
|
26
|
+
950: "#1E1B4E",
|
|
27
|
+
},
|
|
28
|
+
accent: {
|
|
29
|
+
50: "#ECFEFF",
|
|
30
|
+
100: "#CFFAFE",
|
|
31
|
+
200: "#A5F3FC",
|
|
32
|
+
300: "#67E8F9",
|
|
33
|
+
400: "#22D3EE",
|
|
34
|
+
500: "#06B6D4",
|
|
35
|
+
600: "#0891B2",
|
|
36
|
+
700: "#0E7490",
|
|
37
|
+
800: "#155E75",
|
|
38
|
+
900: "#164E63",
|
|
39
|
+
950: "#083344",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
fonts: {
|
|
44
|
+
sans: "Inter",
|
|
45
|
+
mono: "JetBrains Mono",
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
radius: {
|
|
49
|
+
sm: "0.5rem",
|
|
50
|
+
md: "0.75rem",
|
|
51
|
+
lg: "1rem",
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
spacing: {
|
|
55
|
+
pageX: "1.25rem",
|
|
56
|
+
pageY: "1.25rem",
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Generates CSS custom property assignments from the token palettes.
|
|
62
|
+
* Used by AppThemeProvider to inject on :root at runtime.
|
|
63
|
+
*/
|
|
64
|
+
export function getTokenCSSProperties() {
|
|
65
|
+
const props = {};
|
|
66
|
+
for (const [palette, shades] of Object.entries(tokens.colors)) {
|
|
67
|
+
for (const [shade, value] of Object.entries(shades)) {
|
|
68
|
+
props[`--color-${palette}-${shade}`] = value;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return props;
|
|
72
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
const VARIANT_CLASSES = {
|
|
4
|
+
default: "bg-slate-50 border-slate-200 text-slate-900 dark:bg-slate-900 dark:border-slate-800 dark:text-slate-50",
|
|
5
|
+
info: "bg-blue-50 border-blue-200 text-blue-900 dark:bg-blue-950 dark:border-blue-800 dark:text-blue-50",
|
|
6
|
+
success: "bg-green-50 border-green-200 text-green-900 dark:bg-green-950 dark:border-green-800 dark:text-green-50",
|
|
7
|
+
warning: "bg-yellow-50 border-yellow-200 text-yellow-900 dark:bg-yellow-950 dark:border-yellow-800 dark:text-yellow-50",
|
|
8
|
+
error: "bg-red-50 border-red-200 text-red-900 dark:bg-red-950 dark:border-red-800 dark:text-red-50",
|
|
9
|
+
destructive: "bg-red-50 border-red-200 text-red-900 dark:bg-red-950 dark:border-red-800 dark:text-red-50"
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function Alert({ variant = "default", className = "", children, ...rest }) {
|
|
13
|
+
const variantClasses = VARIANT_CLASSES[variant] || VARIANT_CLASSES.default;
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<div
|
|
17
|
+
role="alert"
|
|
18
|
+
className={[
|
|
19
|
+
"rounded-lg border p-4",
|
|
20
|
+
variantClasses,
|
|
21
|
+
className
|
|
22
|
+
]
|
|
23
|
+
.filter(Boolean)
|
|
24
|
+
.join(" ")}
|
|
25
|
+
{...rest}
|
|
26
|
+
>
|
|
27
|
+
{children}
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function AlertTitle({ className = "", children, ...rest }) {
|
|
33
|
+
return (
|
|
34
|
+
<h5
|
|
35
|
+
className={[
|
|
36
|
+
"mb-1 font-medium leading-none tracking-tight",
|
|
37
|
+
className
|
|
38
|
+
]
|
|
39
|
+
.filter(Boolean)
|
|
40
|
+
.join(" ")}
|
|
41
|
+
{...rest}
|
|
42
|
+
>
|
|
43
|
+
{children}
|
|
44
|
+
</h5>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function AlertDescription({ className = "", children, ...rest }) {
|
|
49
|
+
return (
|
|
50
|
+
<div
|
|
51
|
+
className={[
|
|
52
|
+
"text-sm opacity-90",
|
|
53
|
+
className
|
|
54
|
+
]
|
|
55
|
+
.filter(Boolean)
|
|
56
|
+
.join(" ")}
|
|
57
|
+
{...rest}
|
|
58
|
+
>
|
|
59
|
+
{children}
|
|
60
|
+
</div>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function AlertAction({ className = "", children, ...rest }) {
|
|
65
|
+
return (
|
|
66
|
+
<div
|
|
67
|
+
className={[
|
|
68
|
+
"mt-3",
|
|
69
|
+
className
|
|
70
|
+
]
|
|
71
|
+
.filter(Boolean)
|
|
72
|
+
.join(" ")}
|
|
73
|
+
{...rest}
|
|
74
|
+
>
|
|
75
|
+
{children}
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { Alert };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
const SIZE_MAP = {
|
|
4
|
+
xs: "h-6 w-6 text-[9px]",
|
|
5
|
+
sm: "h-8 w-8 text-[10px]",
|
|
6
|
+
md: "h-9 w-9 text-xs",
|
|
7
|
+
lg: "h-11 w-11 text-sm",
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const TONE_MAP = {
|
|
11
|
+
slate: "bg-slate-800 text-white",
|
|
12
|
+
brand: "bg-brand-500 text-white",
|
|
13
|
+
neutral: "bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-200",
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default function Avatar({ src, name, initials, icon, size = "sm", tone = "slate", className = "", ...rest }) {
|
|
17
|
+
const sizeClass = SIZE_MAP[size] ?? SIZE_MAP.sm;
|
|
18
|
+
|
|
19
|
+
if (src) {
|
|
20
|
+
return (
|
|
21
|
+
<img
|
|
22
|
+
src={src}
|
|
23
|
+
alt={name ?? ""}
|
|
24
|
+
className={`${sizeClass} shrink-0 rounded-full border border-slate-200 object-cover dark:border-slate-800 ${className}`}
|
|
25
|
+
{...rest}
|
|
26
|
+
/>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (React.isValidElement(icon)) {
|
|
31
|
+
return (
|
|
32
|
+
<div className={`${sizeClass} ${TONE_MAP[tone] ?? TONE_MAP.slate} flex shrink-0 items-center justify-center rounded-full ${className}`} {...rest}>
|
|
33
|
+
{icon}
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const label = initials ?? (name ? name.split(" ").map(w => w[0]).join("").slice(0, 2).toUpperCase() : "?");
|
|
39
|
+
return (
|
|
40
|
+
<div className={`${sizeClass} ${TONE_MAP[tone] ?? TONE_MAP.slate} flex shrink-0 items-center justify-center rounded-full font-bold ${className}`} {...rest}>
|
|
41
|
+
{label}
|
|
42
|
+
</div>
|
|
43
|
+
);
|
|
44
|
+
}
|