@homefile/components-v2 2.59.1 → 2.60.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.
- package/dist/assets/locales/en/index.json +5 -2
- package/dist/components/folderPanel/displayFiles/GridFile.js +9 -1
- package/dist/components/folderPanel/displayFiles/ListFile.js +9 -1
- package/dist/components/forms/dynamicForm/DynamicForm.js +1 -1
- package/dist/components/forms/dynamicForm/HiddenField.js +2 -2
- package/dist/components/forms/dynamicForm/fields/HomeInitialSetup.js +3 -1
- package/dist/components/forms/readOnly/ReadOnlyDynamicForm.js +10 -2
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyAppliances.js +21 -22
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyGuidelines.js +6 -3
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyHistory.d.ts +2 -0
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyHistory.js +35 -0
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyItemRelated.js +8 -3
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyOverview.d.ts +2 -0
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyOverview.js +16 -0
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyPurchaseDetails.d.ts +2 -0
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyPurchaseDetails.js +30 -0
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyWarrantyBanner.d.ts +2 -0
- package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyWarrantyBanner.js +42 -0
- package/dist/components/forms/readOnly/fields/homeItem/index.d.ts +4 -0
- package/dist/components/forms/readOnly/fields/homeItem/index.js +4 -0
- package/dist/components/headers/TabsHeader.js +1 -1
- package/dist/components/history/AddDocuments.d.ts +7 -0
- package/dist/components/history/AddDocuments.js +8 -0
- package/dist/components/history/DatePennant.d.ts +7 -0
- package/dist/components/history/DatePennant.js +6 -0
- package/dist/components/history/HistoryCard.d.ts +19 -0
- package/dist/components/history/HistoryCard.js +13 -0
- package/dist/components/history/index.d.ts +3 -0
- package/dist/components/history/index.js +3 -0
- package/dist/components/homeBoard/AddToHomefile.js +1 -1
- package/dist/components/homeBoard/HomeCard.js +1 -1
- package/dist/components/homeItems/ViewingHomeItemBody.d.ts +2 -0
- package/dist/components/homeItems/ViewingHomeItemBody.js +41 -0
- package/dist/components/homeItems/ViewingHomeItemPanel.js +17 -19
- package/dist/components/homeItems/index.d.ts +1 -0
- package/dist/components/homeItems/index.js +1 -0
- package/dist/components/homi/HomiPresence.d.ts +2 -0
- package/dist/components/homi/HomiPresence.js +31 -0
- package/dist/components/homi/HomiVoice.d.ts +2 -0
- package/dist/components/homi/HomiVoice.js +6 -0
- package/dist/components/homi/ProgressBar.d.ts +2 -0
- package/dist/components/homi/ProgressBar.js +9 -0
- package/dist/components/homi/RevealValueCard.d.ts +2 -0
- package/dist/components/homi/RevealValueCard.js +23 -0
- package/dist/components/homi/StaggerReveal.d.ts +2 -0
- package/dist/components/homi/StaggerReveal.js +29 -0
- package/dist/components/homi/index.d.ts +5 -0
- package/dist/components/homi/index.js +5 -0
- package/dist/components/inboxTile/InboxForwardBanner.js +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +2 -0
- package/dist/components/inputs/InlineEditField.d.ts +2 -0
- package/dist/components/inputs/InlineEditField.js +15 -0
- package/dist/components/inputs/RadioCard.d.ts +3 -1
- package/dist/components/inputs/RadioCard.js +3 -3
- package/dist/components/inputs/TextInput.d.ts +1 -1
- package/dist/components/inputs/TextInput.js +11 -4
- package/dist/components/inputs/index.d.ts +1 -0
- package/dist/components/inputs/index.js +1 -0
- package/dist/components/myHomes/HomeDetailsContent.js +1 -1
- package/dist/components/myHomes/IncludePublicRecords.d.ts +13 -1
- package/dist/components/myHomes/IncludePublicRecords.js +16 -6
- package/dist/components/myHomes/edithome/EditHomeDetails.js +12 -3
- package/dist/components/myHomes/steps/NewHomeDetails.d.ts +1 -1
- package/dist/components/myHomes/steps/NewHomeDetails.js +3 -3
- package/dist/components/myProfile/MyProfileBody.d.ts +1 -1
- package/dist/components/myProfile/MyProfileBody.js +2 -2
- package/dist/components/myProfile/details/HomiSms.d.ts +1 -1
- package/dist/components/myProfile/details/HomiSms.js +53 -23
- package/dist/components/myProfile/details/TwoFactorSetting.js +2 -1
- package/dist/components/propertyTiles/propertyTaxes/PropertyTaxes.js +1 -1
- package/dist/components/propertyTiles/trendingValue/TrendingValue.js +1 -1
- package/dist/components/rooms/RoomHeader.d.ts +1 -1
- package/dist/components/rooms/RoomHeader.js +3 -3
- package/dist/components/wizard/ControlledWizard.d.ts +1 -1
- package/dist/components/wizard/ControlledWizard.js +42 -3
- package/dist/components/wizard/WizardInitialOptions.js +3 -3
- package/dist/components/wizard/WizardSelectCard.d.ts +14 -0
- package/dist/components/wizard/WizardSelectCard.js +32 -0
- package/dist/components/wizard/WizardStepPrompt.d.ts +11 -0
- package/dist/components/wizard/WizardStepPrompt.js +20 -0
- package/dist/components/wizard/WizardSuccessHeader.d.ts +1 -1
- package/dist/components/wizard/WizardSuccessHeader.js +2 -2
- package/dist/components/wizard/index.d.ts +2 -0
- package/dist/components/wizard/index.js +2 -0
- package/dist/helpers/forms/dynamicForm.helper.js +4 -0
- package/dist/hooks/folderPanel/useDisplayFiles.js +11 -2
- package/dist/hooks/forms/useAddressStored.js +8 -2
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/motion/index.d.ts +2 -0
- package/dist/hooks/motion/index.js +2 -0
- package/dist/hooks/motion/useCountUp.d.ts +10 -0
- package/dist/hooks/motion/useCountUp.js +39 -0
- package/dist/hooks/motion/usePrefersReducedMotion.d.ts +14 -0
- package/dist/hooks/motion/usePrefersReducedMotion.js +15 -0
- package/dist/hooks/rooms/useRoomHeader.d.ts +4 -1
- package/dist/hooks/rooms/useRoomHeader.js +9 -1
- package/dist/hooks/useDirtySave.d.ts +14 -0
- package/dist/hooks/useDirtySave.js +33 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/interfaces/forms/dynamicForm/DynamicForm.interface.d.ts +7 -3
- package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyOverview.interface.d.ts +2 -0
- package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyOverview.interface.js +1 -0
- package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyPurchaseDetails.interface.d.ts +5 -0
- package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyPurchaseDetails.interface.js +1 -0
- package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyWarrantyBanner.interface.d.ts +27 -0
- package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyWarrantyBanner.interface.js +1 -0
- package/dist/interfaces/forms/readOnly/homeItem/index.d.ts +3 -0
- package/dist/interfaces/forms/readOnly/homeItem/index.js +3 -0
- package/dist/interfaces/homeItems/ViewingHomeItemPanel.interface.d.ts +1 -0
- package/dist/interfaces/homi/HomiPresence.interface.d.ts +9 -0
- package/dist/interfaces/homi/HomiPresence.interface.js +1 -0
- package/dist/interfaces/homi/ProgressBar.interface.d.ts +8 -0
- package/dist/interfaces/homi/ProgressBar.interface.js +1 -0
- package/dist/interfaces/homi/RevealValueCard.interface.d.ts +16 -0
- package/dist/interfaces/homi/RevealValueCard.interface.js +1 -0
- package/dist/interfaces/homi/StaggerReveal.interface.d.ts +9 -0
- package/dist/interfaces/homi/StaggerReveal.interface.js +1 -0
- package/dist/interfaces/homi/index.d.ts +4 -0
- package/dist/interfaces/homi/index.js +4 -0
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.js +1 -0
- package/dist/interfaces/inputs/InlineEditField.interface.d.ts +7 -0
- package/dist/interfaces/inputs/InlineEditField.interface.js +1 -0
- package/dist/interfaces/inputs/Input.interface.d.ts +6 -1
- package/dist/interfaces/inputs/index.d.ts +1 -0
- package/dist/interfaces/inputs/index.js +1 -0
- package/dist/interfaces/myHomes/AddHomeContent.interface.d.ts +3 -0
- package/dist/interfaces/myProfile/MyProfileBody.interface.d.ts +1 -0
- package/dist/interfaces/myProfile/details/HomiSms.interface.d.ts +11 -2
- package/dist/interfaces/rooms/RoomHeader.interface.d.ts +5 -0
- package/dist/interfaces/wizard/ControlledWizard.interface.d.ts +6 -0
- package/dist/interfaces/wizard/WizardStepPrompt.interface.d.ts +9 -0
- package/dist/interfaces/wizard/WizardStepPrompt.interface.js +1 -0
- package/dist/interfaces/wizard/index.d.ts +1 -0
- package/dist/interfaces/wizard/index.js +1 -0
- package/dist/stories/forms/readOnly/ReadOnlyAppliances.stories.d.ts +4 -0
- package/dist/stories/forms/readOnly/ReadOnlyAppliances.stories.js +33 -0
- package/dist/stories/forms/readOnly/ReadOnlyWarrantyBanner.stories.d.ts +4 -0
- package/dist/stories/forms/readOnly/ReadOnlyWarrantyBanner.stories.js +10 -0
- package/dist/stories/homeItems/ReadOnlyHistory.stories.d.ts +4 -0
- package/dist/stories/homeItems/ReadOnlyHistory.stories.js +46 -0
- package/dist/stories/homeItems/ReadOnlyOverview.stories.d.ts +5 -0
- package/dist/stories/homeItems/ReadOnlyOverview.stories.js +69 -0
- package/dist/stories/homeItems/ViewingHomeItemPanel.stories.d.ts +4 -0
- package/dist/stories/homeItems/ViewingHomeItemPanel.stories.js +204 -0
- package/dist/stories/homi/HomiPresence.stories.d.ts +18 -0
- package/dist/stories/homi/HomiPresence.stories.js +11 -0
- package/dist/stories/homi/HomiVoice.stories.d.ts +4 -0
- package/dist/stories/homi/HomiVoice.stories.js +8 -0
- package/dist/stories/homi/ProgressBar.stories.d.ts +10 -0
- package/dist/stories/homi/ProgressBar.stories.js +9 -0
- package/dist/stories/homi/RevealValueCard.stories.d.ts +19 -0
- package/dist/stories/homi/RevealValueCard.stories.js +22 -0
- package/dist/stories/homi/StaggerReveal.stories.d.ts +5 -0
- package/dist/stories/homi/StaggerReveal.stories.js +8 -0
- package/dist/stories/inputs/InlineEditField.stories.d.ts +10 -0
- package/dist/stories/inputs/InlineEditField.stories.js +11 -0
- package/dist/stories/myProfile/MyProfilePanel.stories.js +1 -1
- package/dist/stories/myProfile/details/HomiSms.stories.d.ts +3 -2
- package/dist/stories/myProfile/details/HomiSms.stories.js +3 -2
- package/dist/stories/wizard/ControlledWizard.stories.d.ts +9 -0
- package/dist/stories/wizard/ControlledWizard.stories.js +41 -60
- package/dist/theme/index.d.ts +3 -0
- package/dist/theme/index.js +7 -4
- package/dist/utils/Formaters.utils.d.ts +2 -0
- package/dist/utils/Formaters.utils.js +14 -0
- package/dist/utils/Weather.utils.js +11 -4
- package/package.json +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Flex, Stack } from '@chakra-ui/react';
|
|
3
|
+
import { AddDocuments, ReadOnlyDynamicForm, ReadOnlyHistory, ReadOnlyOverview, TabsHeader, } from '../../components';
|
|
4
|
+
// History dates are display strings like "01 23 2017" → millis for sorting.
|
|
5
|
+
const toTime = (s) => {
|
|
6
|
+
if (!s)
|
|
7
|
+
return 0;
|
|
8
|
+
const [m, d, y] = s.trim().split(/\s+/).map(Number);
|
|
9
|
+
return new Date(y || 0, (m || 1) - 1, d || 1).getTime();
|
|
10
|
+
};
|
|
11
|
+
// The tabbed body of the read-only item view — Details / Specs / History off
|
|
12
|
+
// ONE report[] (each field's `tab` says where it renders; absent = 'details').
|
|
13
|
+
// Rendered without any drawer chrome so it can be hosted either by
|
|
14
|
+
// ViewingHomeItemPanel (its own Drawer) or dropped into the app's existing
|
|
15
|
+
// read-only slot in the RoomItem panel. The pencil (onEdit) flows through to
|
|
16
|
+
// the Details tab's item card, which toggles to the existing edit form.
|
|
17
|
+
export const ViewingHomeItemBody = ({ form, onClick, onEdit, }) => {
|
|
18
|
+
const byTab = (tab) => { var _a; return (_a = form === null || form === void 0 ? void 0 : form.filter((field) => { var _a; return ((_a = field.tab) !== null && _a !== void 0 ? _a : 'details') === tab; })) !== null && _a !== void 0 ? _a : []; };
|
|
19
|
+
const renderTab = (tab) => (_jsx(ReadOnlyDynamicForm, { form: byTab(tab), onClick: onClick, onEdit: onEdit }));
|
|
20
|
+
// Specs / History are hidden-until-data: a tab appears only when the item
|
|
21
|
+
// actually has fields for it. A real item today has only Details (backend
|
|
22
|
+
// report[] is flat); the richer tabs light up as their feeders land. We
|
|
23
|
+
// never show a visibly empty tab (honesty — no fabricated blocks).
|
|
24
|
+
const specsFields = byTab('specs');
|
|
25
|
+
// History: an Add-documents zone on top, then the events newest-first on a
|
|
26
|
+
// timeline. The rail is a darker left band (#E9EDEF) over the lighter content
|
|
27
|
+
// (lightBlue.1); the node circles sit on the band's right edge. Rendered
|
|
28
|
+
// directly (not via ReadOnlyDynamicForm, whose opaque bg would hide the band).
|
|
29
|
+
const historyEvents = [...byTab('history')].sort((a, b) => toTime(b.label) - toTime(a.label));
|
|
30
|
+
const history = (_jsxs(Flex, { direction: "column", bg: "lightBlue.1", minH: "100%", children: [_jsx(AddDocuments, {}), _jsxs(Box, { position: "relative", flex: "1", children: [_jsx(Box, { position: "absolute", left: "0", top: "0", bottom: "0", w: "131px", bg: "#E9EDEF" }), _jsx(Box, { position: "relative", children: historyEvents.map((event) => (_jsx(ReadOnlyHistory, Object.assign({}, event), event.id))) })] })] }));
|
|
31
|
+
// Specs: collapsible section cards inset 13px, 13px apart (XD).
|
|
32
|
+
const specs = (_jsx(Stack, { px: "base", pt: "base", pb: "base", spacing: "base", align: "stretch", children: specsFields.map((section) => (_jsx(ReadOnlyOverview, Object.assign({}, section), section.id))) }));
|
|
33
|
+
// Details is always present (the item card); History / Specs join only when
|
|
34
|
+
// they carry real data. History sits next to Details (people check it often);
|
|
35
|
+
// Specs is the occasional reference, so it moves to the right.
|
|
36
|
+
const tabs = [{ label: 'Details', component: renderTab('details') }];
|
|
37
|
+
if (historyEvents.length > 0)
|
|
38
|
+
tabs.push({ label: 'History', component: history });
|
|
39
|
+
const rightTabs = specsFields.length > 0 ? [{ label: 'Specs', component: specs }] : [];
|
|
40
|
+
return _jsx(TabsHeader, { tabList: tabs, rightTabList: rightTabs });
|
|
41
|
+
};
|
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { t } from 'i18next';
|
|
3
|
-
import {
|
|
4
|
-
import { PanelHeader,
|
|
3
|
+
import { Divider, DrawerBody, DrawerContent, DrawerHeader } from '@chakra-ui/react';
|
|
4
|
+
import { PanelHeader, ViewingHomeItemBody } from '../../components';
|
|
5
5
|
import { Painting } from '../../assets/images';
|
|
6
|
+
import { fieldIcons } from '../../helpers';
|
|
7
|
+
// Read-only item view as a standalone Drawer: the panel SHELL (own width,
|
|
8
|
+
// programmatic header, close button) wrapping the tabbed body. The same body
|
|
9
|
+
// is also dropped into the app's existing read-only slot (RoomItem panel),
|
|
10
|
+
// where that panel supplies the chrome instead — so the tabbed content lives
|
|
11
|
+
// in ViewingHomeItemBody and this file is only the Drawer wrapper.
|
|
6
12
|
export const ViewingHomeItemPanel = ({ form, onClick, onClose, onEdit, }) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
];
|
|
17
|
-
const rightTabs = [
|
|
18
|
-
{
|
|
19
|
-
label: 'History',
|
|
20
|
-
component: _jsx("div", {}),
|
|
21
|
-
},
|
|
22
|
-
];
|
|
23
|
-
return (_jsxs(DrawerContent, { bg: "lightBlue.1", children: [_jsxs(DrawerHeader, { p: "0", children: [_jsx(PanelHeader, { handleCloseButton: onClose, title: t('homeItems.title'), icon: Painting }), _jsx(Divider, {}), _jsx(Box, { pt: "1", bg: "neutral.white", children: _jsx(TabsHeader, { tabList: tabs, rightTabList: rightTabs }) })] }), _jsx(ReadOnlyDynamicForm, { form: form, onClick: onClick, onEdit: onEdit })] }));
|
|
13
|
+
// Header reflects the item being viewed: its name + appliance icon (e.g.
|
|
14
|
+
// "Viewing Refrigerator" with the fridge icon), from the primary item field.
|
|
15
|
+
const primaryItem = form === null || form === void 0 ? void 0 : form.find((field) => field.type === 'appliances' || field.name === 'Appliances');
|
|
16
|
+
const itemName = (primaryItem === null || primaryItem === void 0 ? void 0 : primaryItem.value) ? String(primaryItem.value) : 'Home Item';
|
|
17
|
+
const itemIcon = (primaryItem === null || primaryItem === void 0 ? void 0 : primaryItem.icon) ? fieldIcons[primaryItem.icon] : Painting;
|
|
18
|
+
return (
|
|
19
|
+
// Panel owns its width: full on mobile, 600px on desktop (XD design is
|
|
20
|
+
// 500px; widened for breathing room). Overrides the Drawer `size`.
|
|
21
|
+
_jsxs(DrawerContent, { bg: "lightBlue.1", w: { base: '100%', md: '600px' }, maxW: { base: '100%', md: '600px' }, children: [_jsxs(DrawerHeader, { p: "0", children: [_jsx(PanelHeader, { handleCloseButton: onClose, title: `${t('homeItems.viewing', 'Viewing')} ${itemName}`, icon: itemIcon }), _jsx(Divider, {})] }), _jsx(DrawerBody, { p: "0", children: _jsx(ViewingHomeItemBody, { form: form, onClick: onClick, onEdit: onEdit }) })] }));
|
|
24
22
|
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Flex, Text, chakra } from '@chakra-ui/react';
|
|
3
|
+
import { motion } from 'framer-motion';
|
|
4
|
+
import { usePrefersReducedMotion } from '../../hooks';
|
|
5
|
+
// Chakra-styled motion element (the idiomatic Chakra + framer-motion pattern):
|
|
6
|
+
// takes Chakra style props AND framer-motion's animate/transition.
|
|
7
|
+
const MotionBox = chakra(motion.div);
|
|
8
|
+
// Reusable "Homi is here" presence chip (presentation-only — no authority or
|
|
9
|
+
// meaning; per Kai it is NOT onboarding-scoped). POC `.homichip`: a 15×15
|
|
10
|
+
// brand-blue dot with a white inset ring + a 6×6 green status corner dot, and
|
|
11
|
+
// the label beside it. The green dot "breathes" — a subtle opacity-only idle
|
|
12
|
+
// pulse (~2.6s), reduced-motion gated via the house hook; ONLY the green dot
|
|
13
|
+
// pulses ("a breath, not a blink").
|
|
14
|
+
//
|
|
15
|
+
// NOTE: `state` (guiding|working) is a v1 semantic prop; the chip + pulse render
|
|
16
|
+
// the same for both today (Eli's spec details no per-state visual). Any
|
|
17
|
+
// per-state visual differentiation is a POC/Kai/Gabi verification item — flagged,
|
|
18
|
+
// not fabricated. Exact green token is likewise a Gabi fidelity check.
|
|
19
|
+
export const HomiPresence = ({ state = 'guiding', label = 'Homi', }) => {
|
|
20
|
+
const prefersReducedMotion = usePrefersReducedMotion();
|
|
21
|
+
return (_jsxs(Flex, { align: "center", gap: "2", "data-homi-state": state, children: [_jsxs(Box, { position: "relative", w: "15px", h: "15px", flexShrink: 0, children: [_jsx(Box, { w: "15px", h: "15px", borderRadius: "full", bg: "blue.2", boxShadow: "inset 0 0 0 2px #fff" }), _jsx(MotionBox, Object.assign({ position: "absolute", bottom: "-1px", right: "-1px", w: "6px", h: "6px", borderRadius: "full", bg: "#34C759", boxShadow: "0 0 0 1.5px #fff" }, (prefersReducedMotion
|
|
22
|
+
? {}
|
|
23
|
+
: {
|
|
24
|
+
animate: { opacity: [1, 0.4, 1] },
|
|
25
|
+
transition: {
|
|
26
|
+
duration: 2.6,
|
|
27
|
+
repeat: Infinity,
|
|
28
|
+
ease: 'easeInOut',
|
|
29
|
+
},
|
|
30
|
+
})))] }), _jsx(Text, { fontSize: "sm", fontFamily: "secondary", color: "gray.3", children: label })] }));
|
|
31
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from '@chakra-ui/react';
|
|
3
|
+
// Deliberately trivial marker: wraps text Homi "speaks" with a data attribute.
|
|
4
|
+
// Presentation/marker ONLY — no logic (a future live-indicator seam, NOT the
|
|
5
|
+
// seam itself). Resist scope growth (Eli).
|
|
6
|
+
export const HomiVoice = (props) => (_jsx(Text, Object.assign({ as: "span", "data-homi-voice": true }, props)));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box } from '@chakra-ui/react';
|
|
3
|
+
// Thin (4px) progress track + fill; the fill width eases (0.55s, POC easing).
|
|
4
|
+
// A plain full-width bar — the consumer positions it (e.g. the wizard shell
|
|
5
|
+
// pins it to the bottom). Direct port of the POC progress atom.
|
|
6
|
+
export const ProgressBar = ({ value, color = 'blue.2', trackColor = 'lightBlue.3', }) => {
|
|
7
|
+
const pct = Math.min(Math.max(value, 0), 1) * 100;
|
|
8
|
+
return (_jsx(Box, { w: "full", h: "4px", bg: trackColor, overflow: "hidden", children: _jsx(Box, { h: "full", bg: color, w: `${pct}%`, transition: "width 0.55s cubic-bezier(0.5, 0, 0.15, 1)" }) }));
|
|
9
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Flex, Grid, Image, Text, chakra } from '@chakra-ui/react';
|
|
3
|
+
import { motion } from 'framer-motion';
|
|
4
|
+
import { useCountUp, usePrefersReducedMotion } from '../../hooks';
|
|
5
|
+
const MotionBox = chakra(motion.div);
|
|
6
|
+
// The reveal payoff — "here's what I already know about your home." Composes raw
|
|
7
|
+
// Box/Text tokens per Eli's spec: green card, a pop-in on reveal
|
|
8
|
+
// (scale .92→1.02→1, 0.55s @0.3s delay), a 34px Poppins-700 tabular-nums hero
|
|
9
|
+
// value that counts up (useCountUp), a 2-col facts grid, an optional subvals
|
|
10
|
+
// row, and 30×30 thumbnails. A-PATH ONLY — never rendered on the not-on-list
|
|
11
|
+
// (B) path (nothing was found; showing a value there would fabricate).
|
|
12
|
+
// NOTE exact green + border tokens are a Gabi POC-fidelity check.
|
|
13
|
+
export const RevealValueCard = ({ value, valuePrefix = '$', facts = [], subvals = [], thumbs = [], }) => {
|
|
14
|
+
const prefersReducedMotion = usePrefersReducedMotion();
|
|
15
|
+
const counted = useCountUp(value);
|
|
16
|
+
return (_jsxs(MotionBox, Object.assign({ bg: "#EAF7EF", borderRadius: "12px", p: "base", w: "full", maxW: "440px" }, (prefersReducedMotion
|
|
17
|
+
? {}
|
|
18
|
+
: {
|
|
19
|
+
initial: { scale: 0.92 },
|
|
20
|
+
animate: { scale: [0.92, 1.02, 1] },
|
|
21
|
+
transition: { duration: 0.55, delay: 0.3, ease: 'easeOut' },
|
|
22
|
+
}), { children: [_jsxs(Text, { fontFamily: "primary", fontWeight: "700", fontSize: "34px", lineHeight: "1.1", color: "gray.4", sx: { fontVariantNumeric: 'tabular-nums' }, children: [valuePrefix, counted] }), facts.length > 0 && (_jsx(Grid, { templateColumns: "1fr 1fr", gap: "7px 26px", mt: "3", pt: "3", borderTop: "1px solid", borderColor: "rgba(0,0,0,0.08)", children: facts.map((fact) => (_jsxs(Flex, { justify: "space-between", gap: "2", children: [_jsx(Text, { fontFamily: "secondary", fontSize: "14px", color: "gray.3", children: fact.label }), _jsx(Text, { fontFamily: "secondary", fontSize: "14px", fontWeight: "600", color: "gray.4", children: fact.value })] }, fact.label))) })), subvals.length > 0 && (_jsx(Flex, { mt: "3", gap: "6", wrap: "wrap", children: subvals.map((sub) => (_jsxs(Box, { children: [_jsx(Text, { fontFamily: "secondary", fontSize: "12px", color: "gray.3", children: sub.label }), _jsx(Text, { fontFamily: "secondary", fontSize: "14px", fontWeight: "600", color: "gray.4", children: sub.value })] }, sub.label))) })), thumbs.length > 0 && (_jsx(Flex, { mt: "3", gap: "2", children: thumbs.map((thumb) => (_jsx(Image, { src: thumb, alt: "", boxSize: "30px", borderRadius: "7px", objectFit: "cover", transition: "transform 0.15s", _hover: { transform: 'scale(1.1)' } }, thumb))) }))] })));
|
|
23
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Children, isValidElement } from 'react';
|
|
3
|
+
import { Box, chakra } from '@chakra-ui/react';
|
|
4
|
+
import { motion } from 'framer-motion';
|
|
5
|
+
import { usePrefersReducedMotion } from '../../hooks';
|
|
6
|
+
const MotionDiv = chakra(motion.div);
|
|
7
|
+
// Staggers its children's entrance — each rises + fades in, one after another
|
|
8
|
+
// (POC: rise 0.5s, ~0.07 between children). Reduced-motion renders them plainly.
|
|
9
|
+
// A narrow motion wrapper over static children — not an animation engine.
|
|
10
|
+
// `spacing` lays the children out as a column with a gap (like a Stack), so it
|
|
11
|
+
// can replace a Stack while adding the per-item build.
|
|
12
|
+
export const StaggerReveal = ({ children, stagger = 0.07, delay = 0.05, spacing, }) => {
|
|
13
|
+
const prefersReducedMotion = usePrefersReducedMotion();
|
|
14
|
+
if (prefersReducedMotion)
|
|
15
|
+
return (_jsx(Box, { display: "flex", flexDirection: "column", gap: spacing, children: children }));
|
|
16
|
+
const container = {
|
|
17
|
+
hidden: {},
|
|
18
|
+
show: { transition: { staggerChildren: stagger, delayChildren: delay } },
|
|
19
|
+
};
|
|
20
|
+
const item = {
|
|
21
|
+
hidden: { opacity: 0, y: 16 },
|
|
22
|
+
show: { opacity: 1, y: 0, transition: { duration: 0.5, ease: 'easeOut' } },
|
|
23
|
+
};
|
|
24
|
+
return (_jsx(MotionDiv, Object.assign({ display: "flex", flexDirection: "column", gap: spacing }, {
|
|
25
|
+
variants: container,
|
|
26
|
+
initial: 'hidden',
|
|
27
|
+
animate: 'show',
|
|
28
|
+
}, { children: Children.map(children, (child) => isValidElement(child) ? (_jsx(MotionDiv, Object.assign({}, { variants: item }, { children: child }))) : (child)) })));
|
|
29
|
+
};
|
|
@@ -3,5 +3,5 @@ import { t } from 'i18next';
|
|
|
3
3
|
import { AspectRatio, Flex, Text, Image, chakra } from '@chakra-ui/react';
|
|
4
4
|
import { FileIt } from '../../assets/images';
|
|
5
5
|
export const InboxForwardBanner = () => {
|
|
6
|
-
return (_jsxs(Flex, { p: "base", gap: "base", align: "center", bg: "#FAE6AF", id: "forwardReceipts", children: [_jsx(AspectRatio, { ratio: 1, minW: "35px", h: "auto", children: _jsx(Image, { src: FileIt, alt: "IA" }) }), _jsxs(Text, { variant: "home", lineHeight: "1.2", children: [t('inbox.forwardTo'), _jsx(chakra.
|
|
6
|
+
return (_jsxs(Flex, { p: "base", gap: "base", align: "center", bg: "#FAE6AF", id: "forwardReceipts", children: [_jsx(AspectRatio, { ratio: 1, minW: "35px", h: "auto", children: _jsx(Image, { src: FileIt, alt: "IA" }) }), _jsxs(Text, { variant: "home", lineHeight: "1.2", children: [t('inbox.forwardTo'), _jsx(chakra.a, { href: "mailto:fileit@homefile.com", fontFamily: "secondary", fontSize: "sm", lineHeight: "1", color: "neutral.black", fontWeight: "600", display: "inline", cursor: "pointer", _hover: { textDecoration: 'underline' }, children: "fileit@homefile.com" }), '.'] })] }));
|
|
7
7
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './addItemWizard';
|
|
2
2
|
export * from './animations';
|
|
3
|
+
export * from './homi';
|
|
3
4
|
export * from './appliances';
|
|
4
5
|
export * from './appBar';
|
|
5
6
|
export * from './badge';
|
|
@@ -17,6 +18,7 @@ export * from './footers';
|
|
|
17
18
|
export * from './forms';
|
|
18
19
|
export * from './headers';
|
|
19
20
|
export * from './help';
|
|
21
|
+
export * from './history';
|
|
20
22
|
export * from './homeAssistant';
|
|
21
23
|
export * from './homeBoard';
|
|
22
24
|
export * from './homeItems';
|
package/dist/components/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './addItemWizard';
|
|
2
2
|
export * from './animations';
|
|
3
|
+
export * from './homi';
|
|
3
4
|
export * from './appliances';
|
|
4
5
|
export * from './appBar';
|
|
5
6
|
export * from './badge';
|
|
@@ -17,6 +18,7 @@ export * from './footers';
|
|
|
17
18
|
export * from './forms';
|
|
18
19
|
export * from './headers';
|
|
19
20
|
export * from './help';
|
|
21
|
+
export * from './history';
|
|
20
22
|
export * from './homeAssistant';
|
|
21
23
|
export * from './homeBoard';
|
|
22
24
|
export * from './homeItems';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Button, Flex, Input, Text } from '@chakra-ui/react';
|
|
3
|
+
import { t } from 'i18next';
|
|
4
|
+
import { useDirtySave } from '../../hooks';
|
|
5
|
+
// Prepopulated, edit-in-place field whose Save appears ONLY when the value
|
|
6
|
+
// changes (the proven TwoFactorSetting dirty-gate, via useDirtySave), with a
|
|
7
|
+
// transient "Saved ✓" flash after saving. POC styling (living spec): a bordered
|
|
8
|
+
// rounded box — NOT a bare underline — Poppins 600 19px, focus-within blue ring.
|
|
9
|
+
export const InlineEditField = ({ value: initial, onSave, placeholder, }) => {
|
|
10
|
+
const { value, setValue, isDirty, justSaved, save } = useDirtySave(initial, onSave);
|
|
11
|
+
return (_jsxs(Flex, { align: "center", gap: "2", children: [_jsx(Box, { flex: "1", border: "1px solid", borderColor: "lightGray.2", borderRadius: "8px", px: "3", transition: "box-shadow 0.15s, border-color 0.15s", _focusWithin: {
|
|
12
|
+
borderColor: 'blue.2',
|
|
13
|
+
boxShadow: '0 0 0 3px rgba(36,136,198,0.18)',
|
|
14
|
+
}, children: _jsx(Input, { variant: "unstyled", value: value, onChange: (e) => setValue(e.target.value), placeholder: placeholder, fontFamily: "primary", fontWeight: "600", fontSize: "19px", color: "gray.4", h: "44px" }) }), isDirty && (_jsx(Button, { variant: "secondaryFooter", bg: "neutral.white", fontWeight: "medium", onClick: save, children: t('buttons.save').toUpperCase() })), justSaved && !isDirty && (_jsx(Text, { fontFamily: "secondary", fontSize: "sm", color: "#34C759", children: "Saved \u2713" }))] }));
|
|
15
|
+
};
|
|
@@ -3,6 +3,8 @@ import { UseRadioProps } from '@chakra-ui/react';
|
|
|
3
3
|
type RadioCardVariant = 'default' | 'bg-violet';
|
|
4
4
|
interface RadioCardProps extends UseRadioProps {
|
|
5
5
|
variant?: RadioCardVariant;
|
|
6
|
+
/** Optional lettered key badge (the "press A/B" cue); inverts on checked. */
|
|
7
|
+
keyBadge?: string;
|
|
6
8
|
}
|
|
7
|
-
export declare const RadioCard: ({ variant, children, ...radioProps }: PropsWithChildren<RadioCardProps>) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const RadioCard: ({ variant, keyBadge, children, ...radioProps }: PropsWithChildren<RadioCardProps>) => import("react/jsx-runtime").JSX.Element;
|
|
8
10
|
export {};
|
|
@@ -13,8 +13,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
13
13
|
import { Box, Flex, useRadio } from '@chakra-ui/react';
|
|
14
14
|
import { isSafari } from '../../utils';
|
|
15
15
|
export const RadioCard = (_a) => {
|
|
16
|
-
var { variant = 'default', children } = _a, radioProps = __rest(_a, ["variant", "children"]);
|
|
17
|
-
const { getInputProps, getRadioProps } = useRadio(radioProps);
|
|
16
|
+
var { variant = 'default', keyBadge, children } = _a, radioProps = __rest(_a, ["variant", "keyBadge", "children"]);
|
|
17
|
+
const { getInputProps, getRadioProps, state } = useRadio(radioProps);
|
|
18
18
|
const input = getInputProps();
|
|
19
19
|
const checkbox = getRadioProps();
|
|
20
20
|
const stylesByVariant = {
|
|
@@ -73,5 +73,5 @@ export const RadioCard = (_a) => {
|
|
|
73
73
|
};
|
|
74
74
|
const containerStyles = stylesByVariant[variant].container;
|
|
75
75
|
const indicatorStyles = stylesByVariant[variant].indicator;
|
|
76
|
-
return (_jsxs(Box, { as: "label", children: [_jsx("input", Object.assign({}, input)), _jsx(Box, Object.assign({}, checkbox, { cursor: "pointer" }, containerStyles, { children: _jsxs(Flex, { align: "center", gap: "base", minH: "40px", children: [_jsx(Box, Object.assign({}, checkbox, indicatorStyles)), children] }) }))] }));
|
|
76
|
+
return (_jsxs(Box, { as: "label", children: [_jsx("input", Object.assign({}, input)), _jsx(Box, Object.assign({}, checkbox, { cursor: "pointer" }, containerStyles, { children: _jsxs(Flex, { align: "center", gap: "base", minH: "40px", children: [_jsx(Box, Object.assign({}, checkbox, indicatorStyles)), children, keyBadge && (_jsx(Flex, { align: "center", justify: "center", ml: "auto", boxSize: "24px", flexShrink: 0, borderRadius: "5px", border: "1px solid", borderColor: state.isChecked ? 'blue.2' : 'lightBlue.5', bg: state.isChecked ? 'blue.2' : 'transparent', color: state.isChecked ? 'neutral.white' : 'gray.3', fontFamily: "primary", fontWeight: "600", fontSize: "12px", children: keyBadge }))] }) }))] }));
|
|
77
77
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { InputI } from '../../interfaces';
|
|
2
|
-
export declare const TextInput: ({ autoCapitalize, autoCorrect, errorMessage, handleChange, hasError, id, isDisabled, label, placeholder, value, type, showLabel, hint, ...props }: InputI) => import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare const TextInput: ({ autoCapitalize, autoCorrect, errorMessage, handleChange, hasError, id, isDisabled, label, placeholder, value, type, showLabel, hint, variant, ...props }: InputI) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -9,14 +9,21 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
9
9
|
}
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
12
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
13
|
import { FormControl, Text, Input } from '@chakra-ui/react';
|
|
14
14
|
import { LabeledField } from '../../components';
|
|
15
15
|
export const TextInput = (_a) => {
|
|
16
|
-
var _b;
|
|
17
|
-
var { autoCapitalize = 'on', autoCorrect = 'on', errorMessage, handleChange, hasError, id, isDisabled, label, placeholder, value = '', type = 'text', showLabel = true, hint } = _a, props = __rest(_a, ["autoCapitalize", "autoCorrect", "errorMessage", "handleChange", "hasError", "id", "isDisabled", "label", "placeholder", "value", "type", "showLabel", "hint"]);
|
|
16
|
+
var _b, _c;
|
|
17
|
+
var { autoCapitalize = 'on', autoCorrect = 'on', errorMessage, handleChange, hasError, id, isDisabled, label, placeholder, value = '', type = 'text', showLabel = true, hint, variant = 'default' } = _a, props = __rest(_a, ["autoCapitalize", "autoCorrect", "errorMessage", "handleChange", "hasError", "id", "isDisabled", "label", "placeholder", "value", "type", "showLabel", "hint", "variant"]);
|
|
18
18
|
const error = hasError && !isDisabled;
|
|
19
19
|
const isFilled = String(value).trim().length > 0 && showLabel;
|
|
20
20
|
const placeholderToUse = isFilled ? '' : ((_b = placeholder !== null && placeholder !== void 0 ? placeholder : label) !== null && _b !== void 0 ? _b : '');
|
|
21
|
-
|
|
21
|
+
const messages = (_jsxs(_Fragment, { children: [error && (_jsx(Text, { variant: "error", my: "1", children: errorMessage })), hint && !error && (_jsx(Text, { variant: "hint", my: "1", children: hint }))] }));
|
|
22
|
+
// Conversational (Typeform-style): a bare bottom-border input — no floating
|
|
23
|
+
// LabeledField wrapper — larger type, a 44pt tap target via padding, blue
|
|
24
|
+
// focus underline.
|
|
25
|
+
if (variant === 'conversational') {
|
|
26
|
+
return (_jsxs(FormControl, { isInvalid: error, children: [_jsx(Input, Object.assign({}, props, { autoCapitalize: autoCapitalize, autoCorrect: autoCorrect, id: id, placeholder: (_c = placeholder !== null && placeholder !== void 0 ? placeholder : label) !== null && _c !== void 0 ? _c : '', value: value, type: type, onChange: handleChange, isInvalid: error, isDisabled: isDisabled, variant: "unstyled", fontFamily: "primary", fontSize: "18px", h: "auto", py: "2.5", borderRadius: "0", borderBottom: "2px solid", borderColor: error ? 'red.500' : 'lightGray.2', _focus: { borderColor: 'blue.2' }, _placeholder: { color: 'gray.2' } })), messages] }));
|
|
27
|
+
}
|
|
28
|
+
return (_jsxs(FormControl, { isInvalid: error, children: [_jsx(LabeledField, { label: showLabel ? (label !== null && label !== void 0 ? label : placeholder) : undefined, isFilled: isFilled, children: _jsx(Input, Object.assign({}, props, { autoCapitalize: autoCapitalize, autoCorrect: autoCorrect, id: id, placeholder: placeholderToUse, value: value, type: type, onChange: handleChange, isInvalid: error, isDisabled: isDisabled })) }), messages] }));
|
|
22
29
|
};
|
|
@@ -17,5 +17,5 @@ import { House } from '../../assets/images';
|
|
|
17
17
|
export const HomeDetailsContent = (_a) => {
|
|
18
18
|
var props = __rest(_a, []);
|
|
19
19
|
const { handleClose, isLoading, children, showFooter, footerButtons } = props;
|
|
20
|
-
return (_jsxs(DrawerContent, { children: [_jsx(DrawerHeader, { p: "0", children: _jsx(PanelHeader, { icon: House, handleCloseButton: handleClose, title: t("myHomes.details.header") }) }), _jsx(DrawerBody, { padding: "0 0 6rem 0", bg: "bg.surface", children: _jsx(Box, { children: isLoading ? (_jsx(Loading, {})) : (_jsxs(_Fragment, { children: [_jsx(HomeCard, Object.assign({}, props)), children] })) }) }), _jsx(DrawerFooter, { children: _jsx(FooterDrawer, { isOpen: showFooter, children: footerButtons }) })] }));
|
|
20
|
+
return (_jsxs(DrawerContent, { bg: "bg.surface", children: [_jsx(DrawerHeader, { p: "0", children: _jsx(PanelHeader, { icon: House, handleCloseButton: handleClose, title: t("myHomes.details.header") }) }), _jsx(DrawerBody, { padding: "0 0 6rem 0", bg: "bg.surface", children: _jsx(Box, { children: isLoading ? (_jsx(Loading, {})) : (_jsxs(_Fragment, { children: [_jsx(HomeCard, Object.assign({}, props)), children] })) }) }), _jsx(DrawerFooter, { bg: "bg.surface", p: "0", children: _jsx(FooterDrawer, { isOpen: showFooter, children: footerButtons }) })] }));
|
|
21
21
|
};
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { ChangeEvent } from 'react';
|
|
2
2
|
export interface IncludePublicRecordsI {
|
|
3
|
+
/** Retained for compat; the light disclosure variant has no consent gate. */
|
|
3
4
|
isChecked?: boolean;
|
|
4
5
|
onSelectRecords?: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
5
6
|
}
|
|
6
|
-
|
|
7
|
+
/**
|
|
8
|
+
* IncludePublicRecords — a single-line, always-visible public-records
|
|
9
|
+
* DISCLOSURE. No checkbox, no consent gate, no expander: Homi is INFORMING the
|
|
10
|
+
* user what he'll pull, not asking permission. One plain, casual sentence in
|
|
11
|
+
* his voice.
|
|
12
|
+
*
|
|
13
|
+
* Accuracy (Dana-cleared, informational-not-consent): taxes + lot size are
|
|
14
|
+
* public records; the value is an ESTIMATE (AVM), so it's sourced from "public
|
|
15
|
+
* records and public data" and is never called a public record on its own.
|
|
16
|
+
* The only guardrail here is factual accuracy of the sourcing claim.
|
|
17
|
+
*/
|
|
18
|
+
export declare const IncludePublicRecords: (_props: IncludePublicRecordsI) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
import { jsx as _jsx
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from '@chakra-ui/react';
|
|
3
|
+
/**
|
|
4
|
+
* IncludePublicRecords — a single-line, always-visible public-records
|
|
5
|
+
* DISCLOSURE. No checkbox, no consent gate, no expander: Homi is INFORMING the
|
|
6
|
+
* user what he'll pull, not asking permission. One plain, casual sentence in
|
|
7
|
+
* his voice.
|
|
8
|
+
*
|
|
9
|
+
* Accuracy (Dana-cleared, informational-not-consent): taxes + lot size are
|
|
10
|
+
* public records; the value is an ESTIMATE (AVM), so it's sourced from "public
|
|
11
|
+
* records and public data" and is never called a public record on its own.
|
|
12
|
+
* The only guardrail here is factual accuracy of the sourcing claim.
|
|
13
|
+
*/
|
|
14
|
+
export const IncludePublicRecords = (_props) => (_jsx(Text, { fontFamily: "secondary", fontSize: "sm", color: "gray.3",
|
|
15
|
+
// text-wrap: pretty keeps the sentence free of widows without hand-tuning.
|
|
16
|
+
sx: { textWrap: 'pretty' }, children: "I\u2019ll pull the basics on your home \u2014 its taxes, lot size, and an estimate of its value \u2014 from public records and public data, so you don\u2019t have to enter them by hand." }));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { t } from 'i18next';
|
|
3
|
-
import { Stack, Divider } from '@chakra-ui/react';
|
|
4
|
-
import {
|
|
3
|
+
import { Box, Stack, Divider, Text } from '@chakra-ui/react';
|
|
4
|
+
import { TextInput } from '../../../components';
|
|
5
5
|
import { useEditHomeDetails } from '../../../hooks';
|
|
6
6
|
import { useSnapshot } from 'valtio';
|
|
7
7
|
import { addressProxy, homeCardProxy, homeDetailsProxy } from '../../../proxies';
|
|
@@ -15,7 +15,16 @@ export const EditHomeDetails = ({ address, externalLink, name, setIsDirty, }) =>
|
|
|
15
15
|
const { fields, validations } = useSnapshot(homeDetailsProxy, { sync: true });
|
|
16
16
|
const { fields: addressFields } = useSnapshot(addressProxy, { sync: true });
|
|
17
17
|
const homeCard = homeCardProxy;
|
|
18
|
+
// Keep the (seeded) address flowing into the save proxy even though it is not
|
|
19
|
+
// editable here — otherwise saving a name change would blank the address.
|
|
18
20
|
const allFields = Object.assign(Object.assign({}, fields), addressFields);
|
|
19
21
|
homeCard.setFields(allFields);
|
|
20
|
-
|
|
22
|
+
const streetLine = [address.number, address.street].filter(Boolean).join(' ');
|
|
23
|
+
const cityLine = [
|
|
24
|
+
[address.city, address.state].filter(Boolean).join(', '),
|
|
25
|
+
address.zip,
|
|
26
|
+
]
|
|
27
|
+
.filter(Boolean)
|
|
28
|
+
.join(' ');
|
|
29
|
+
return (_jsxs(Stack, { spacing: "base", p: "base", bg: "neutral.white", children: [_jsx(TextInput, { errorMessage: `${t('myHomes.form.name')} ${t('forms.required')}`, hasError: !validations.isNameValid, id: "projectName", placeholder: t('myHomes.form.editHomeName'), handleChange: (event) => handleChange(event, 'name'), value: fields.name, onBlurCapture: handleNameValidation }), externalLink && (_jsx(TextInput, { id: "externalLink", placeholder: t('myHomes.form.externalLink'), handleChange: (event) => handleChange(event, 'externalLink'), value: String(fields.externalLink) })), _jsx(Divider, {}), _jsxs(Box, { children: [_jsx(Text, { fontFamily: "secondary", fontSize: "xs", color: "gray.3", textTransform: "uppercase", mb: "1", children: t('myHomes.section1') }), address.apartmentNumber && (_jsx(Text, { fontFamily: "secondary", fontSize: "md", color: "gray.4", children: address.apartmentNumber })), _jsx(Text, { fontFamily: "secondary", fontSize: "md", color: "gray.4", children: streetLine }), _jsx(Text, { fontFamily: "secondary", fontSize: "md", color: "gray.4", children: cityLine })] })] }));
|
|
21
30
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { AddHomeContentI } from '../../../interfaces';
|
|
2
|
-
export declare const NewHomeDetails: ({ values, isLoading }: AddHomeContentI) => import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare const NewHomeDetails: ({ values, isLoading, showName, }: AddHomeContentI) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useSnapshot } from 'valtio';
|
|
3
3
|
import { t } from 'i18next';
|
|
4
4
|
import { Stack, Center, Divider } from '@chakra-ui/react';
|
|
@@ -7,10 +7,10 @@ import { firstHomeProxy } from '../../../proxies';
|
|
|
7
7
|
import { useAddHouseContent } from '../../../hooks';
|
|
8
8
|
import { BeatLoader } from 'react-spinners';
|
|
9
9
|
import { up } from './MyHomeDetails';
|
|
10
|
-
export const NewHomeDetails = ({ values, isLoading }) => {
|
|
10
|
+
export const NewHomeDetails = ({ values, isLoading, showName = true, }) => {
|
|
11
11
|
const { handleErrorMessage, handleNameChange, handleNameValidation, handleSelectRecords, } = useAddHouseContent(values);
|
|
12
12
|
const { name, isNameValid, searchRecords } = useSnapshot(firstHomeProxy, {
|
|
13
13
|
sync: true,
|
|
14
14
|
});
|
|
15
|
-
return (_jsxs(Stack, { spacing: "base", children: [isLoading && (_jsx(Center, { h: "4rem", children: _jsx(BeatLoader, { color: "gray", size: 8 }) })), !isLoading && (_jsxs(Stack, { spacing: "base", children: [_jsx(TextInput, { errorMessage: handleErrorMessage(), hasError: !isNameValid, id: "homeName", placeholder: t('myHomes.form.homeName'), handleChange: handleNameChange, onBlurCapture: handleNameValidation, value: name }), _jsx(Divider, { borderStyle: "dashed", borderColor: "lightBlue.6" }), _jsx(AddressStored, {})] })), _jsx(WrapperWithShadow, { animation: up, fadeDelay: 0.2, isWizard: true, padding: "0", pb: "0", children: _jsx(IncludePublicRecords, { isChecked: searchRecords, onSelectRecords: handleSelectRecords }) })] }));
|
|
15
|
+
return (_jsxs(Stack, { spacing: "base", children: [isLoading && (_jsx(Center, { h: "4rem", children: _jsx(BeatLoader, { color: "gray", size: 8 }) })), !isLoading && (_jsxs(Stack, { spacing: "base", children: [showName && (_jsxs(_Fragment, { children: [_jsx(TextInput, { errorMessage: handleErrorMessage(), hasError: !isNameValid, id: "homeName", placeholder: t('myHomes.form.homeName'), handleChange: handleNameChange, onBlurCapture: handleNameValidation, value: name }), _jsx(Divider, { borderStyle: "dashed", borderColor: "lightBlue.6" })] })), _jsx(AddressStored, {})] })), _jsx(WrapperWithShadow, { animation: up, fadeDelay: 0.2, isWizard: true, padding: "0", pb: "0", children: _jsx(IncludePublicRecords, { isChecked: searchRecords, onSelectRecords: handleSelectRecords }) })] }));
|
|
16
16
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { MyProfileBodyI } from '../../interfaces';
|
|
2
|
-
export declare const MyProfileBody: ({ account, details, email, isLoading, payment, rolePermissions, }: MyProfileBodyI) => import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare const MyProfileBody: ({ account, details, defaultIndex, email, isLoading, payment, rolePermissions, }: MyProfileBodyI) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,7 +3,7 @@ import { t } from 'i18next';
|
|
|
3
3
|
import { Center, DrawerBody } from '@chakra-ui/react';
|
|
4
4
|
import { BeatLoader } from 'react-spinners';
|
|
5
5
|
import { TabsHeader } from '../headers';
|
|
6
|
-
export const MyProfileBody = ({ account, details, email, isLoading, payment, rolePermissions, }) => {
|
|
6
|
+
export const MyProfileBody = ({ account, details, defaultIndex, email, isLoading, payment, rolePermissions, }) => {
|
|
7
7
|
const tabs = [
|
|
8
8
|
{
|
|
9
9
|
label: t('myProfile.tabs.tab1'),
|
|
@@ -26,5 +26,5 @@ export const MyProfileBody = ({ account, details, email, isLoading, payment, rol
|
|
|
26
26
|
component: rolePermissions,
|
|
27
27
|
},
|
|
28
28
|
].filter((tab) => tab.component);
|
|
29
|
-
return (_jsx(DrawerBody, { p: "0", children: isLoading ? (_jsx(Center, { h: "4rem", bg: "neutral.white", children: _jsx(BeatLoader, { color: "gray", size: 8 }) })) : (_jsx(TabsHeader, { tabList: tabs })) }));
|
|
29
|
+
return (_jsx(DrawerBody, { p: "0", children: isLoading ? (_jsx(Center, { h: "4rem", bg: "neutral.white", children: _jsx(BeatLoader, { color: "gray", size: 8 }) })) : (_jsx(TabsHeader, { tabList: tabs, defaultIndex: defaultIndex })) }));
|
|
30
30
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { HomiSmsI } from '../../../interfaces';
|
|
2
|
-
export declare const HomiSms: ({ mode,
|
|
2
|
+
export declare const HomiSms: ({ mode, enabled, phone, consentUrl, loading, onChange, onSave, }: HomiSmsI) => import("react/jsx-runtime").JSX.Element;
|