@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.
Files changed (171) hide show
  1. package/dist/assets/locales/en/index.json +5 -2
  2. package/dist/components/folderPanel/displayFiles/GridFile.js +9 -1
  3. package/dist/components/folderPanel/displayFiles/ListFile.js +9 -1
  4. package/dist/components/forms/dynamicForm/DynamicForm.js +1 -1
  5. package/dist/components/forms/dynamicForm/HiddenField.js +2 -2
  6. package/dist/components/forms/dynamicForm/fields/HomeInitialSetup.js +3 -1
  7. package/dist/components/forms/readOnly/ReadOnlyDynamicForm.js +10 -2
  8. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyAppliances.js +21 -22
  9. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyGuidelines.js +6 -3
  10. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyHistory.d.ts +2 -0
  11. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyHistory.js +35 -0
  12. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyItemRelated.js +8 -3
  13. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyOverview.d.ts +2 -0
  14. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyOverview.js +16 -0
  15. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyPurchaseDetails.d.ts +2 -0
  16. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyPurchaseDetails.js +30 -0
  17. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyWarrantyBanner.d.ts +2 -0
  18. package/dist/components/forms/readOnly/fields/homeItem/ReadOnlyWarrantyBanner.js +42 -0
  19. package/dist/components/forms/readOnly/fields/homeItem/index.d.ts +4 -0
  20. package/dist/components/forms/readOnly/fields/homeItem/index.js +4 -0
  21. package/dist/components/headers/TabsHeader.js +1 -1
  22. package/dist/components/history/AddDocuments.d.ts +7 -0
  23. package/dist/components/history/AddDocuments.js +8 -0
  24. package/dist/components/history/DatePennant.d.ts +7 -0
  25. package/dist/components/history/DatePennant.js +6 -0
  26. package/dist/components/history/HistoryCard.d.ts +19 -0
  27. package/dist/components/history/HistoryCard.js +13 -0
  28. package/dist/components/history/index.d.ts +3 -0
  29. package/dist/components/history/index.js +3 -0
  30. package/dist/components/homeBoard/AddToHomefile.js +1 -1
  31. package/dist/components/homeBoard/HomeCard.js +1 -1
  32. package/dist/components/homeItems/ViewingHomeItemBody.d.ts +2 -0
  33. package/dist/components/homeItems/ViewingHomeItemBody.js +41 -0
  34. package/dist/components/homeItems/ViewingHomeItemPanel.js +17 -19
  35. package/dist/components/homeItems/index.d.ts +1 -0
  36. package/dist/components/homeItems/index.js +1 -0
  37. package/dist/components/homi/HomiPresence.d.ts +2 -0
  38. package/dist/components/homi/HomiPresence.js +31 -0
  39. package/dist/components/homi/HomiVoice.d.ts +2 -0
  40. package/dist/components/homi/HomiVoice.js +6 -0
  41. package/dist/components/homi/ProgressBar.d.ts +2 -0
  42. package/dist/components/homi/ProgressBar.js +9 -0
  43. package/dist/components/homi/RevealValueCard.d.ts +2 -0
  44. package/dist/components/homi/RevealValueCard.js +23 -0
  45. package/dist/components/homi/StaggerReveal.d.ts +2 -0
  46. package/dist/components/homi/StaggerReveal.js +29 -0
  47. package/dist/components/homi/index.d.ts +5 -0
  48. package/dist/components/homi/index.js +5 -0
  49. package/dist/components/inboxTile/InboxForwardBanner.js +1 -1
  50. package/dist/components/index.d.ts +2 -0
  51. package/dist/components/index.js +2 -0
  52. package/dist/components/inputs/InlineEditField.d.ts +2 -0
  53. package/dist/components/inputs/InlineEditField.js +15 -0
  54. package/dist/components/inputs/RadioCard.d.ts +3 -1
  55. package/dist/components/inputs/RadioCard.js +3 -3
  56. package/dist/components/inputs/TextInput.d.ts +1 -1
  57. package/dist/components/inputs/TextInput.js +11 -4
  58. package/dist/components/inputs/index.d.ts +1 -0
  59. package/dist/components/inputs/index.js +1 -0
  60. package/dist/components/myHomes/HomeDetailsContent.js +1 -1
  61. package/dist/components/myHomes/IncludePublicRecords.d.ts +13 -1
  62. package/dist/components/myHomes/IncludePublicRecords.js +16 -6
  63. package/dist/components/myHomes/edithome/EditHomeDetails.js +12 -3
  64. package/dist/components/myHomes/steps/NewHomeDetails.d.ts +1 -1
  65. package/dist/components/myHomes/steps/NewHomeDetails.js +3 -3
  66. package/dist/components/myProfile/MyProfileBody.d.ts +1 -1
  67. package/dist/components/myProfile/MyProfileBody.js +2 -2
  68. package/dist/components/myProfile/details/HomiSms.d.ts +1 -1
  69. package/dist/components/myProfile/details/HomiSms.js +53 -23
  70. package/dist/components/myProfile/details/TwoFactorSetting.js +2 -1
  71. package/dist/components/propertyTiles/propertyTaxes/PropertyTaxes.js +1 -1
  72. package/dist/components/propertyTiles/trendingValue/TrendingValue.js +1 -1
  73. package/dist/components/rooms/RoomHeader.d.ts +1 -1
  74. package/dist/components/rooms/RoomHeader.js +3 -3
  75. package/dist/components/wizard/ControlledWizard.d.ts +1 -1
  76. package/dist/components/wizard/ControlledWizard.js +42 -3
  77. package/dist/components/wizard/WizardInitialOptions.js +3 -3
  78. package/dist/components/wizard/WizardSelectCard.d.ts +14 -0
  79. package/dist/components/wizard/WizardSelectCard.js +32 -0
  80. package/dist/components/wizard/WizardStepPrompt.d.ts +11 -0
  81. package/dist/components/wizard/WizardStepPrompt.js +20 -0
  82. package/dist/components/wizard/WizardSuccessHeader.d.ts +1 -1
  83. package/dist/components/wizard/WizardSuccessHeader.js +2 -2
  84. package/dist/components/wizard/index.d.ts +2 -0
  85. package/dist/components/wizard/index.js +2 -0
  86. package/dist/helpers/forms/dynamicForm.helper.js +4 -0
  87. package/dist/hooks/folderPanel/useDisplayFiles.js +11 -2
  88. package/dist/hooks/forms/useAddressStored.js +8 -2
  89. package/dist/hooks/index.d.ts +2 -0
  90. package/dist/hooks/index.js +2 -0
  91. package/dist/hooks/motion/index.d.ts +2 -0
  92. package/dist/hooks/motion/index.js +2 -0
  93. package/dist/hooks/motion/useCountUp.d.ts +10 -0
  94. package/dist/hooks/motion/useCountUp.js +39 -0
  95. package/dist/hooks/motion/usePrefersReducedMotion.d.ts +14 -0
  96. package/dist/hooks/motion/usePrefersReducedMotion.js +15 -0
  97. package/dist/hooks/rooms/useRoomHeader.d.ts +4 -1
  98. package/dist/hooks/rooms/useRoomHeader.js +9 -1
  99. package/dist/hooks/useDirtySave.d.ts +14 -0
  100. package/dist/hooks/useDirtySave.js +33 -0
  101. package/dist/index.d.ts +3 -3
  102. package/dist/index.js +3 -3
  103. package/dist/interfaces/forms/dynamicForm/DynamicForm.interface.d.ts +7 -3
  104. package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyOverview.interface.d.ts +2 -0
  105. package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyOverview.interface.js +1 -0
  106. package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyPurchaseDetails.interface.d.ts +5 -0
  107. package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyPurchaseDetails.interface.js +1 -0
  108. package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyWarrantyBanner.interface.d.ts +27 -0
  109. package/dist/interfaces/forms/readOnly/homeItem/ReadOnlyWarrantyBanner.interface.js +1 -0
  110. package/dist/interfaces/forms/readOnly/homeItem/index.d.ts +3 -0
  111. package/dist/interfaces/forms/readOnly/homeItem/index.js +3 -0
  112. package/dist/interfaces/homeItems/ViewingHomeItemPanel.interface.d.ts +1 -0
  113. package/dist/interfaces/homi/HomiPresence.interface.d.ts +9 -0
  114. package/dist/interfaces/homi/HomiPresence.interface.js +1 -0
  115. package/dist/interfaces/homi/ProgressBar.interface.d.ts +8 -0
  116. package/dist/interfaces/homi/ProgressBar.interface.js +1 -0
  117. package/dist/interfaces/homi/RevealValueCard.interface.d.ts +16 -0
  118. package/dist/interfaces/homi/RevealValueCard.interface.js +1 -0
  119. package/dist/interfaces/homi/StaggerReveal.interface.d.ts +9 -0
  120. package/dist/interfaces/homi/StaggerReveal.interface.js +1 -0
  121. package/dist/interfaces/homi/index.d.ts +4 -0
  122. package/dist/interfaces/homi/index.js +4 -0
  123. package/dist/interfaces/index.d.ts +1 -0
  124. package/dist/interfaces/index.js +1 -0
  125. package/dist/interfaces/inputs/InlineEditField.interface.d.ts +7 -0
  126. package/dist/interfaces/inputs/InlineEditField.interface.js +1 -0
  127. package/dist/interfaces/inputs/Input.interface.d.ts +6 -1
  128. package/dist/interfaces/inputs/index.d.ts +1 -0
  129. package/dist/interfaces/inputs/index.js +1 -0
  130. package/dist/interfaces/myHomes/AddHomeContent.interface.d.ts +3 -0
  131. package/dist/interfaces/myProfile/MyProfileBody.interface.d.ts +1 -0
  132. package/dist/interfaces/myProfile/details/HomiSms.interface.d.ts +11 -2
  133. package/dist/interfaces/rooms/RoomHeader.interface.d.ts +5 -0
  134. package/dist/interfaces/wizard/ControlledWizard.interface.d.ts +6 -0
  135. package/dist/interfaces/wizard/WizardStepPrompt.interface.d.ts +9 -0
  136. package/dist/interfaces/wizard/WizardStepPrompt.interface.js +1 -0
  137. package/dist/interfaces/wizard/index.d.ts +1 -0
  138. package/dist/interfaces/wizard/index.js +1 -0
  139. package/dist/stories/forms/readOnly/ReadOnlyAppliances.stories.d.ts +4 -0
  140. package/dist/stories/forms/readOnly/ReadOnlyAppliances.stories.js +33 -0
  141. package/dist/stories/forms/readOnly/ReadOnlyWarrantyBanner.stories.d.ts +4 -0
  142. package/dist/stories/forms/readOnly/ReadOnlyWarrantyBanner.stories.js +10 -0
  143. package/dist/stories/homeItems/ReadOnlyHistory.stories.d.ts +4 -0
  144. package/dist/stories/homeItems/ReadOnlyHistory.stories.js +46 -0
  145. package/dist/stories/homeItems/ReadOnlyOverview.stories.d.ts +5 -0
  146. package/dist/stories/homeItems/ReadOnlyOverview.stories.js +69 -0
  147. package/dist/stories/homeItems/ViewingHomeItemPanel.stories.d.ts +4 -0
  148. package/dist/stories/homeItems/ViewingHomeItemPanel.stories.js +204 -0
  149. package/dist/stories/homi/HomiPresence.stories.d.ts +18 -0
  150. package/dist/stories/homi/HomiPresence.stories.js +11 -0
  151. package/dist/stories/homi/HomiVoice.stories.d.ts +4 -0
  152. package/dist/stories/homi/HomiVoice.stories.js +8 -0
  153. package/dist/stories/homi/ProgressBar.stories.d.ts +10 -0
  154. package/dist/stories/homi/ProgressBar.stories.js +9 -0
  155. package/dist/stories/homi/RevealValueCard.stories.d.ts +19 -0
  156. package/dist/stories/homi/RevealValueCard.stories.js +22 -0
  157. package/dist/stories/homi/StaggerReveal.stories.d.ts +5 -0
  158. package/dist/stories/homi/StaggerReveal.stories.js +8 -0
  159. package/dist/stories/inputs/InlineEditField.stories.d.ts +10 -0
  160. package/dist/stories/inputs/InlineEditField.stories.js +11 -0
  161. package/dist/stories/myProfile/MyProfilePanel.stories.js +1 -1
  162. package/dist/stories/myProfile/details/HomiSms.stories.d.ts +3 -2
  163. package/dist/stories/myProfile/details/HomiSms.stories.js +3 -2
  164. package/dist/stories/wizard/ControlledWizard.stories.d.ts +9 -0
  165. package/dist/stories/wizard/ControlledWizard.stories.js +41 -60
  166. package/dist/theme/index.d.ts +3 -0
  167. package/dist/theme/index.js +7 -4
  168. package/dist/utils/Formaters.utils.d.ts +2 -0
  169. package/dist/utils/Formaters.utils.js +14 -0
  170. package/dist/utils/Weather.utils.js +11 -4
  171. 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 { Box, Divider, DrawerContent, DrawerHeader } from '@chakra-ui/react';
4
- import { PanelHeader, ReadOnlyDynamicForm, TabsHeader } from '../../components';
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
- const tabs = [
8
- {
9
- label: t('contacts.details'),
10
- component: _jsx("div", {}),
11
- },
12
- {
13
- label: t('contacts.permissions'),
14
- component: _jsx("div", {}),
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
  };
@@ -2,4 +2,5 @@ export * from './HomeItemList';
2
2
  export * from './HomeItemListHeader';
3
3
  export * from './HomeItemManualInfo';
4
4
  export * from './ProductRadioCardContent';
5
+ export * from './ViewingHomeItemBody';
5
6
  export * from './ViewingHomeItemPanel';
@@ -2,4 +2,5 @@ export * from './HomeItemList';
2
2
  export * from './HomeItemListHeader';
3
3
  export * from './HomeItemManualInfo';
4
4
  export * from './ProductRadioCardContent';
5
+ export * from './ViewingHomeItemBody';
5
6
  export * from './ViewingHomeItemPanel';
@@ -0,0 +1,2 @@
1
+ import { HomiPresenceI } from '../../interfaces';
2
+ export declare const HomiPresence: ({ state, label, }: HomiPresenceI) => import("react/jsx-runtime").JSX.Element;
@@ -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,2 @@
1
+ import { TextProps } from '@chakra-ui/react';
2
+ export declare const HomiVoice: (props: TextProps) => import("react/jsx-runtime").JSX.Element;
@@ -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,2 @@
1
+ import { ProgressBarI } from '../../interfaces';
2
+ export declare const ProgressBar: ({ value, color, trackColor, }: ProgressBarI) => import("react/jsx-runtime").JSX.Element;
@@ -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,2 @@
1
+ import { RevealValueCardI } from '../../interfaces';
2
+ export declare const RevealValueCard: ({ value, valuePrefix, facts, subvals, thumbs, }: RevealValueCardI) => import("react/jsx-runtime").JSX.Element;
@@ -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,2 @@
1
+ import { StaggerRevealI } from '../../interfaces';
2
+ export declare const StaggerReveal: ({ children, stagger, delay, spacing, }: StaggerRevealI) => import("react/jsx-runtime").JSX.Element;
@@ -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
+ };
@@ -0,0 +1,5 @@
1
+ export * from './HomiPresence';
2
+ export * from './HomiVoice';
3
+ export * from './ProgressBar';
4
+ export * from './RevealValueCard';
5
+ export * from './StaggerReveal';
@@ -0,0 +1,5 @@
1
+ export * from './HomiPresence';
2
+ export * from './HomiVoice';
3
+ export * from './ProgressBar';
4
+ export * from './RevealValueCard';
5
+ export * from './StaggerReveal';
@@ -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.span, { fontFamily: "secondary", fontSize: "sm", lineHeight: "1", color: "neutral.black", fontWeight: "bold", display: "inline", children: "fileit@homefile.com." })] })] }));
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';
@@ -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,2 @@
1
+ import { InlineEditFieldI } from '../../interfaces';
2
+ export declare const InlineEditField: ({ value: initial, onSave, placeholder, }: InlineEditFieldI) => import("react/jsx-runtime").JSX.Element;
@@ -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
- 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 })) }), error && (_jsx(Text, { variant: "error", my: "1", children: errorMessage })), hint && !error && (_jsx(Text, { variant: "hint", my: "1", children: hint }))] }));
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
  };
@@ -1,4 +1,5 @@
1
1
  export * from './ControlledInput';
2
+ export * from './InlineEditField';
2
3
  export * from './DatePicker';
3
4
  export * from './DateRangePicker';
4
5
  export * from './EditFileUploader';
@@ -1,4 +1,5 @@
1
1
  export * from './ControlledInput';
2
+ export * from './InlineEditField';
2
3
  export * from './DatePicker';
3
4
  export * from './DateRangePicker';
4
5
  export * from './EditFileUploader';
@@ -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
- export declare const IncludePublicRecords: ({ isChecked, onSelectRecords, }: IncludePublicRecordsI) => import("react/jsx-runtime").JSX.Element;
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, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { t } from 'i18next';
3
- import { Box, Checkbox, Flex, Stack, Text } from '@chakra-ui/react';
4
- export const IncludePublicRecords = ({ isChecked, onSelectRecords, }) => {
5
- return (_jsx(Box, { borderRadius: "md", bg: "lightViolet.1", p: "base", children: _jsxs(Flex, { gap: "base", align: "start", children: [_jsx(Checkbox, { isChecked: isChecked, onChange: onSelectRecords }), _jsxs(Stack, { children: [_jsx(Text, { fontFamily: "secondary", children: t('myHomes.select.include') }), _jsx(Text, { variant: "home", color: "gray.2", children: t('myHomes.select.description') })] })] }) }));
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 { AddressStored, TextInput } from '../../../components';
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
- 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.projectName'), 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, {}), _jsx(AddressStored, { setIsDirty: setIsDirty })] }));
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, sms, loading, onChange, onSave, }: HomiSmsI) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const HomiSms: ({ mode, enabled, phone, consentUrl, loading, onChange, onSave, }: HomiSmsI) => import("react/jsx-runtime").JSX.Element;