@homefile/components-v2 2.25.4 → 2.25.5

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.
@@ -414,7 +414,7 @@
414
414
  }
415
415
  },
416
416
  "details": "Provide details about your home’s",
417
- "homeMonitor": "Homie",
417
+ "homeMonitor": "Homie - Your Home Assistant",
418
418
  "HomieMessages": "Homie Messages ({{ count }})",
419
419
  "homeMonitoring": "I’m learning about your home…",
420
420
  "homeMonitoringAlerts": "I have {{ count }} new messages for you.",
@@ -1,24 +1,23 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
2
+ import { useState } from 'react';
3
3
  import { Box, GridItem, Image } from '@chakra-ui/react';
4
4
  import { ContainerHeader, TileTooltip, moveRightToLeftWithFade, moveRightToLeft, moveLeftToRightAirplane, WeatherTrees, } from '..';
5
5
  import { Airplane, Cloud1, Cloud2, Cloud3, IA } from '../../assets/images';
6
- import { getTimeOfDay, getTimeOfDaySeason, } from '../../utils';
7
6
  import { colors } from '../../theme/colors';
8
7
  export const HomeAssistantWrapper = ({ children, showAirplane, title, zIndex, }) => {
9
- const [timeOfDay, setTimeOfDay] = useState(getTimeOfDay());
10
- const timeOfDaySeason = getTimeOfDaySeason();
8
+ const [timeOfDay, setTimeOfDay] = useState('day');
9
+ const timeOfDaySeason = 'day-summer';
11
10
  const gradients = {
12
11
  day: colors.dayGradient,
13
12
  evening: colors.eveningGradient,
14
13
  morning: colors.morningGradient,
15
14
  night: colors.nightGradient,
16
15
  };
17
- useEffect(() => {
18
- const interval = setInterval(() => {
19
- setTimeOfDay(getTimeOfDay());
20
- }, 60000);
21
- return () => clearInterval(interval);
22
- }, []);
16
+ // useEffect(() => {
17
+ // const interval = setInterval(() => {
18
+ // setTimeOfDay(getTimeOfDay())
19
+ // }, 60000)
20
+ // return () => clearInterval(interval)
21
+ // }, [])
23
22
  return (_jsx(GridItem, { colSpan: [1, 2], zIndex: zIndex, children: _jsx(TileTooltip, { label: "homeAssistant", children: _jsxs(Box, { bgGradient: gradients[timeOfDay], boxShadow: "base", h: "full", position: "relative", overflow: "hidden", transition: "background 1s ease-in-out", children: [_jsx(ContainerHeader, { title: title, titleIcon: IA }), _jsx(_Fragment, { children: children }), _jsx(Image, { src: Cloud1, position: "absolute", w: "auto", h: "80px", top: "80px", animation: `${moveRightToLeftWithFade} 400s linear infinite` }), _jsx(Image, { src: Cloud2, position: "absolute", w: "auto", h: "112px", top: "150px", animation: `${moveRightToLeft} 200s linear infinite` }), _jsx(Image, { src: Cloud3, position: "absolute", w: "auto", h: "160px", top: "200px", animation: `${moveRightToLeft} 130s linear infinite` }), showAirplane && (_jsx(Image, { src: Airplane, position: "absolute", w: "auto", h: "40px", top: "85px", animation: `${moveLeftToRightAirplane} 500s cubic-bezier(1, 1, 1, 500) infinite` })), _jsx(WeatherTrees, { timeOfDaySeason: timeOfDaySeason, position: "absolute", bottom: "0", right: "2", w: "auto", h: "100px" })] }) }) }));
24
23
  };
@@ -7,7 +7,7 @@ export const HomeMonitorButton = ({ alertCount = 0, currentStep, onStepClick, st
7
7
  const iconAltText = getIconAltText(step.icon);
8
8
  const alert = status === 'alert';
9
9
  const ok = status === 'ok';
10
- return (_jsx(Box, Object.assign({ position: "relative", id: buttonId, zIndex: "2", boxShadow: "lg" }, setStyles(status), { children: _jsxs(Box, { position: "relative", bg: "neutral.white", borderRadius: "lg", zIndex: "2", children: [_jsx(Box, { bg: alert ? 'error.2' : 'green.1', boxSize: "10px", borderRadius: "full", position: "absolute", top: "6px", left: "6px", zIndex: "8" }), _jsxs(Stack, { position: "relative", zIndex: "2", as: "button", spacing: "2", border: "1px solid transparent", align: "center", h: "96px", w: "100%", p: "base", onClick: () => onStepClick(currentStep), filter: ok ? 'grayscale(1) opacity(0.6)' : '', children: [_jsxs(Center, { h: "60%", marginTop: "2", children: [!alert && (_jsx(Image, { src: step.icon, alt: iconAltText, w: "auto", h: "28px" })), alert && (_jsx(Center, { boxSize: "32px", bg: "error.2", borderRadius: "full", color: "neutral.white", lineHeight: "1", fontWeight: "bold", children: alertCount }))] }), _jsx(Center, { h: "40%", children: _jsx(Text, { fontSize: "xs", textTransform: "uppercase", textAlign: "center", lineHeight: "14px", children: step.title }) })] })] }) })));
10
+ return (_jsx(Box, Object.assign({ position: "relative", id: buttonId, zIndex: "2", boxShadow: "lg" }, setStyles(status), { children: _jsxs(Box, { position: "relative", bg: "neutral.white", borderRadius: "lg", zIndex: "2", children: [_jsx(Box, { bg: alert ? 'error.2' : 'green.1', boxSize: "10px", borderRadius: "full", position: "absolute", top: "10px", left: "8px", zIndex: "8" }), _jsxs(Stack, { position: "relative", zIndex: "2", as: "button", spacing: "7px", border: "1px solid transparent", align: "center", justify: "center", w: "100%", p: "base", pt: "20px", onClick: () => onStepClick(currentStep), filter: ok ? 'grayscale(1) opacity(0.6)' : '', children: [!alert && (_jsx(Box, { boxSize: "36px", children: _jsx(Image, { src: step.icon, alt: iconAltText, w: "100%", h: "100%", fit: "contain" }) })), alert && (_jsx(Center, { boxSize: "32px", bg: "error.2", borderRadius: "full", color: "neutral.white", lineHeight: "1", fontWeight: "bold", children: alertCount })), _jsx(Center, { h: "28px", children: _jsx(Text, { fontSize: "14px", textTransform: "uppercase", textAlign: "center", lineHeight: "14px", fontFamily: "secondary", children: step.title }) })] })] }) })));
11
11
  };
12
12
  const alertGradient = keyframes `
13
13
  0% {
@@ -10,7 +10,7 @@ export const HomeMonitorSteps = ({ alerts = [], menuItems = [], onStepClick, })
10
10
  const handleStepClick = (step) => onStepClick(step);
11
11
  return (_jsx(Flex, { gap: "base", justify: "center", children: homeAssistantSteps.map((step, index) => {
12
12
  var _a;
13
- return (_jsx(Box, { position: "relative", flex: "1", children: _jsxs(Fragment, { children: [_jsx(HomeMonitorButton, { alertCount: (_a = alerts.find((alert) => alert.step === index + 1)) === null || _a === void 0 ? void 0 : _a.count, currentStep: index + 1, onStepClick: handleStepClick, status: getStatus(index + 1, alerts), step: step }), _jsx(Box, { position: "absolute", top: "-2px", right: "4px", zIndex: "1400", children: _jsx(IconMenu, { zIndex: "2", icon: _jsx(MoreHorizontal, { size: 26 }), itemForm: index + 1, menuItems: menuItems, disabled: isDisabled, onClick: () => setSelectedId(`homeMonitorButton-${index + 1}`) }) })] }) }, step === null || step === void 0 ? void 0 : step.title));
13
+ return (_jsx(Box, { position: "relative", flex: "1", children: _jsxs(Fragment, { children: [_jsx(HomeMonitorButton, { alertCount: (_a = alerts.find((alert) => alert.step === index + 1)) === null || _a === void 0 ? void 0 : _a.count, currentStep: index + 1, onStepClick: handleStepClick, status: getStatus(index + 1, alerts), step: step }), _jsx(Box, { position: "absolute", top: "2px", right: "6px", zIndex: "1400", children: _jsx(IconMenu, { zIndex: "2", icon: _jsx(MoreHorizontal, { size: 26 }), itemForm: index + 1, menuItems: menuItems, disabled: isDisabled, onClick: () => setSelectedId(`homeMonitorButton-${index + 1}`) }) })] }) }, step === null || step === void 0 ? void 0 : step.title));
14
14
  }) }));
15
15
  };
16
16
  const getStatus = (index, alerts) => {
@@ -14,13 +14,14 @@ const weatherIconMap = {
14
14
  tsra: LuCloudLightning,
15
15
  snow: LuSnowflake,
16
16
  };
17
+ const BORDER_COLOR = '#BCD1D8';
17
18
  export const WeatherWidget = ({ current, details, forecast, header, loading = false, }) => {
18
19
  if (loading) {
19
- return (_jsxs(Stack, { spacing: "base", p: "4", zIndex: "2", children: [_jsxs(Flex, { justify: "space-between", align: "center", children: [_jsx(SkeletonBox, { height: "12px", borderRadius: "md", width: "30%" }), _jsx(SkeletonBox, { height: "12px", borderRadius: "md", width: "30%" })] }), _jsxs(Stack, { align: "end", children: [_jsxs(Flex, { justify: "end", align: "start", gap: "base", mt: "4", children: [_jsx(SkeletonBox, { height: "50px", borderRadius: "md", width: "50px" }), _jsx(SkeletonBox, { height: "30px", width: "30px", borderRadius: "full" })] }), _jsx(SkeletonBox, { height: "12px", borderRadius: "md", width: "20%" })] }), _jsx(Divider, { borderColor: "gray.2", borderStyle: "dashed" }), _jsxs(Flex, { justify: "space-between", mt: "4", children: [_jsxs(Stack, { children: [_jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70px" }), _jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70px" })] }), _jsxs(Stack, { align: "end", children: [_jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70px" }), _jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70px" })] })] }), _jsx(Flex, { justify: "space-between", mt: "4", gap: "1", children: Array(5)
20
+ return (_jsxs(Stack, { spacing: "base", zIndex: "2", children: [_jsxs(Flex, { justify: "space-between", align: "center", children: [_jsx(SkeletonBox, { height: "12px", borderRadius: "md", width: "30%" }), _jsx(SkeletonBox, { height: "12px", borderRadius: "md", width: "30%" })] }), _jsxs(Stack, { align: "end", children: [_jsxs(Flex, { justify: "end", align: "start", gap: "base", mt: "4", children: [_jsx(SkeletonBox, { height: "50px", borderRadius: "md", width: "50px" }), _jsx(SkeletonBox, { height: "30px", width: "30px", borderRadius: "full" })] }), _jsx(SkeletonBox, { height: "12px", borderRadius: "md", width: "20%" })] }), _jsx(Divider, { borderColor: "gray.2", borderStyle: "dashed" }), _jsxs(Flex, { justify: "space-between", mt: "4", children: [_jsxs(Stack, { children: [_jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70px" }), _jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70px" })] }), _jsxs(Stack, { align: "end", children: [_jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70px" }), _jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70px" })] })] }), _jsx(Flex, { justify: "space-between", mt: "4", gap: "1", children: Array(5)
20
21
  .fill(0)
21
22
  .map((_, idx) => (_jsxs(VStack, { gap: "1", width: "46px", border: "1px solid", borderColor: "gray.2", py: "2", px: "1", children: [_jsx(SkeletonBox, { height: "6px", borderRadius: "md", width: "60%" }), _jsx(Divider, { borderColor: "gray.2", borderStyle: "solid", my: "0.5" }), _jsx(SkeletonBox, { height: "18px", width: "18px", borderRadius: "full" }), _jsx(SkeletonBox, { height: "8px", borderRadius: "md", width: "70%" }), _jsx(SkeletonBox, { height: "6px", borderRadius: "md", width: "70%" })] }, idx))) })] }));
22
23
  }
23
- return (_jsxs(Stack, { spacing: "base", p: "4", zIndex: "2", children: [header && (_jsxs(Flex, { justify: "space-between", align: "center", children: [header.date && (_jsx(Text, { fontSize: "sm", fontFamily: "secondary", textTransform: "uppercase", children: header.date })), header.location && (_jsx(Text, { fontSize: "sm", fontFamily: "secondary", textTransform: "uppercase", children: header.location }))] })), current && (_jsxs(Stack, { spacing: "0", align: "end", children: [_jsxs(HStack, { align: "start", spacing: "2", children: [current.temp != null && (_jsxs(Text, { fontSize: "6xl", fontWeight: "medium", lineHeight: 1, color: "gray.4", children: [current.temp, "\u00B0"] })), getWeatherIcon(current.icon, 50)] }), _jsxs(Text, { fontSize: "md", children: [_jsxs(Box, { as: "span", color: "gray.2", children: ["H", ' '] }), current.high, "\u00B0", ' ', _jsxs(Box, { as: "span", color: "gray.2", children: ["L", ' '] }), current.low, "\u00B0"] })] })), _jsx(Divider, { borderColor: "gray.2", borderStyle: "dashed" }), details && (_jsxs(Flex, { justify: "space-between", children: [_jsxs(VStack, { spacing: "0", align: "start", children: [_jsx(WeatherDetailText, { children: "Precipitation" }), details.humidity != null && (_jsx(WeatherDetailText, { children: "Humidity" })), _jsx(WeatherDetailText, { children: "Wind" })] }), _jsxs(VStack, { spacing: "0", align: "start", children: [details.precipitation != null && (_jsxs(WeatherDetailText, { children: [details.precipitation, "%"] })), details.humidity != null && (_jsxs(WeatherDetailText, { children: [details.humidity, "%"] })), details.wind && (_jsx(WeatherDetailText, { children: details.wind }))] })] })), forecast && (_jsx(Flex, { justify: "space-between", gap: "1", children: forecast.map((f) => (_jsxs(VStack, { spacing: "0", border: "1px solid", borderColor: "gray.2", borderRadius: "sm", children: [_jsx(Text, { fontFamily: "secondary", textTransform: "uppercase", fontSize: "xxs", color: "gray.2", children: f.day }), _jsx(Divider, { borderColor: "gray.2" }), _jsxs(Stack, { spacing: "0", py: "1", px: "2", align: "center", children: [getWeatherIcon(f.icon, 16, colors.gray[3]), _jsxs(Text, { fontSize: "sm", fontWeight: "medium", mb: "-1", children: [f.high, "\u00B0"] }), _jsxs(WeatherDetailText, { children: ["L ", f.low, "\u00B0"] })] })] }, f.day))) }))] }));
24
+ return (_jsxs(Stack, { spacing: "base", zIndex: "2", children: [header && (_jsxs(Flex, { justify: "space-between", align: "center", children: [header.date && (_jsx(Text, { fontSize: "sm", fontFamily: "secondary", textTransform: "uppercase", children: header.date })), header.location && (_jsx(Text, { fontSize: "sm", fontFamily: "secondary", textTransform: "uppercase", children: header.location }))] })), current && (_jsxs(Stack, { spacing: "0", align: "end", children: [_jsxs(HStack, { align: "start", spacing: "2", children: [current.temp != null && (_jsxs(Text, { fontSize: "6xl", lineHeight: 1, color: "gray.4", children: [current.temp, "\u00B0"] })), getWeatherIcon(current.icon, 42)] }), _jsxs(Text, { fontSize: "md", children: [_jsxs(Box, { as: "span", color: "gray.2", children: ["H", ' '] }), current.high, "\u00B0", ' ', _jsxs(Box, { as: "span", color: "gray.2", children: ["L", ' '] }), current.low, "\u00B0"] })] })), _jsx(Divider, { borderColor: BORDER_COLOR, borderStyle: "dashed" }), details && (_jsxs(Flex, { justify: "space-between", children: [_jsxs(VStack, { spacing: "0", align: "start", children: [_jsx(WeatherDetailText, { children: "Precipitation" }), details.humidity != null && (_jsx(WeatherDetailText, { children: "Humidity" })), _jsx(WeatherDetailText, { children: "Wind" })] }), _jsxs(VStack, { spacing: "0", align: "start", children: [details.precipitation != null && (_jsxs(WeatherDetailText, { children: [details.precipitation, "%"] })), details.humidity != null && (_jsxs(WeatherDetailText, { children: [details.humidity, "%"] })), details.wind && (_jsx(WeatherDetailText, { children: details.wind }))] })] })), forecast && (_jsx(Flex, { justify: "space-between", gap: "1", children: forecast.map((f) => (_jsxs(VStack, { spacing: "0", border: "1px solid", borderColor: BORDER_COLOR, borderRadius: "sm", children: [_jsx(Text, { fontFamily: "secondary", textTransform: "uppercase", fontSize: "xxs", color: "gray.2", alignSelf: "start", ml: "0.5", children: f.day }), _jsx(Divider, { borderColor: BORDER_COLOR }), _jsxs(Stack, { spacing: "0", py: "1", px: "2", align: "center", children: [getWeatherIcon(f.icon, 16, colors.gray[3]), _jsxs(Text, { fontSize: "sm", mb: "-1", children: [f.high, "\u00B0"] }), _jsxs(WeatherDetailText, { children: ["L ", f.low, "\u00B0"] })] })] }, f.day))) }))] }));
24
25
  };
25
26
  const WeatherDetailText = ({ children }) => (_jsx(Text, { fontFamily: "secondary", textTransform: "uppercase", fontSize: "xs", lineHeight: "1.2", children: children }));
26
27
  const getWeatherIcon = (iconUrl, size = 48, color = colors.gray[4]) => {
@@ -5,9 +5,7 @@ export function mapForecastToWidget(periods, location) {
5
5
  return {};
6
6
  // --- HEADER DATE ---
7
7
  const todayDate = parseISO(periods[0].startTime);
8
- const headerDate = format(todayDate, 'EEEE, MMMM do')
9
- .toUpperCase()
10
- .replace(',', '');
8
+ const headerDate = format(todayDate, 'EEE MMMM do');
11
9
  // --- CURRENT CONDITIONS ---
12
10
  const day0 = (_a = periods.find((p) => p.isDaytime)) !== null && _a !== void 0 ? _a : periods[0];
13
11
  const night0 = (_c = (_b = periods.find((p) => !p.isDaytime &&
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homefile/components-v2",
3
- "version": "2.25.4",
3
+ "version": "2.25.5",
4
4
  "author": "Homefile",
5
5
  "license": "UNLICENSED",
6
6
  "typings": "dist/index.d.ts",
@@ -414,7 +414,7 @@
414
414
  }
415
415
  },
416
416
  "details": "Provide details about your home’s",
417
- "homeMonitor": "Homie",
417
+ "homeMonitor": "Homie - Your Home Assistant",
418
418
  "HomieMessages": "Homie Messages ({{ count }})",
419
419
  "homeMonitoring": "I’m learning about your home…",
420
420
  "homeMonitoringAlerts": "I have {{ count }} new messages for you.",
@@ -27,8 +27,8 @@ export const HomeAssistantWrapper = ({
27
27
  title: string
28
28
  zIndex?: string
29
29
  }>) => {
30
- const [timeOfDay, setTimeOfDay] = useState<TimeOfDay>(getTimeOfDay())
31
- const timeOfDaySeason = getTimeOfDaySeason()
30
+ const [timeOfDay, setTimeOfDay] = useState<TimeOfDay>('day')
31
+ const timeOfDaySeason = 'day-summer'
32
32
  const gradients: Record<TimeOfDay, string> = {
33
33
  day: colors.dayGradient,
34
34
  evening: colors.eveningGradient,
@@ -36,13 +36,13 @@ export const HomeAssistantWrapper = ({
36
36
  night: colors.nightGradient,
37
37
  }
38
38
 
39
- useEffect(() => {
40
- const interval = setInterval(() => {
41
- setTimeOfDay(getTimeOfDay())
42
- }, 60000)
39
+ // useEffect(() => {
40
+ // const interval = setInterval(() => {
41
+ // setTimeOfDay(getTimeOfDay())
42
+ // }, 60000)
43
43
 
44
- return () => clearInterval(interval)
45
- }, [])
44
+ // return () => clearInterval(interval)
45
+ // }, [])
46
46
 
47
47
  return (
48
48
  <GridItem colSpan={[1, 2]} zIndex={zIndex}>
@@ -29,8 +29,8 @@ export const HomeMonitorButton = ({
29
29
  boxSize="10px"
30
30
  borderRadius="full"
31
31
  position="absolute"
32
- top="6px"
33
- left="6px"
32
+ top="10px"
33
+ left="8px"
34
34
  zIndex="8"
35
35
  />
36
36
 
@@ -38,38 +38,47 @@ export const HomeMonitorButton = ({
38
38
  position="relative"
39
39
  zIndex="2"
40
40
  as="button"
41
- spacing="2"
41
+ spacing="7px"
42
42
  border="1px solid transparent"
43
43
  align="center"
44
- h="96px"
44
+ justify="center"
45
45
  w="100%"
46
46
  p="base"
47
+ pt="20px"
47
48
  onClick={() => onStepClick(currentStep)}
48
49
  filter={ok ? 'grayscale(1) opacity(0.6)' : ''}
49
50
  >
50
- <Center h="60%" marginTop="2">
51
- {!alert && (
52
- <Image src={step.icon} alt={iconAltText} w="auto" h="28px" />
53
- )}
54
- {alert && (
55
- <Center
56
- boxSize="32px"
57
- bg="error.2"
58
- borderRadius="full"
59
- color="neutral.white"
60
- lineHeight="1"
61
- fontWeight="bold"
62
- >
63
- {alertCount}
64
- </Center>
65
- )}
66
- </Center>
67
- <Center h="40%">
51
+ {!alert && (
52
+ <Box boxSize="36px">
53
+ <Image
54
+ src={step.icon}
55
+ alt={iconAltText}
56
+ w="100%"
57
+ h="100%"
58
+ fit="contain"
59
+ />
60
+ </Box>
61
+ )}
62
+ {alert && (
63
+ <Center
64
+ boxSize="32px"
65
+ bg="error.2"
66
+ borderRadius="full"
67
+ color="neutral.white"
68
+ lineHeight="1"
69
+ fontWeight="bold"
70
+ >
71
+ {alertCount}
72
+ </Center>
73
+ )}
74
+
75
+ <Center h="28px">
68
76
  <Text
69
- fontSize="xs"
77
+ fontSize="14px"
70
78
  textTransform="uppercase"
71
79
  textAlign="center"
72
80
  lineHeight="14px"
81
+ fontFamily="secondary"
73
82
  >
74
83
  {step.title}
75
84
  </Text>
@@ -29,7 +29,7 @@ export const HomeMonitorSteps = ({
29
29
  status={getStatus(index + 1, alerts)}
30
30
  step={step}
31
31
  />
32
- <Box position="absolute" top="-2px" right="4px" zIndex="1400">
32
+ <Box position="absolute" top="2px" right="6px" zIndex="1400">
33
33
  <IconMenu
34
34
  zIndex="2"
35
35
  icon={<MoreHorizontal size={26} />}
@@ -36,6 +36,8 @@ const weatherIconMap: Record<
36
36
  snow: LuSnowflake,
37
37
  }
38
38
 
39
+ const BORDER_COLOR = '#BCD1D8'
40
+
39
41
  export const WeatherWidget = ({
40
42
  current,
41
43
  details,
@@ -45,7 +47,7 @@ export const WeatherWidget = ({
45
47
  }: WeatherWidgetI & { loading?: boolean }) => {
46
48
  if (loading) {
47
49
  return (
48
- <Stack spacing="base" p="4" zIndex="2">
50
+ <Stack spacing="base" zIndex="2">
49
51
  {/* Header skeleton */}
50
52
  <Flex justify="space-between" align="center">
51
53
  <SkeletonBox height="12px" borderRadius="md" width="30%" />
@@ -99,7 +101,7 @@ export const WeatherWidget = ({
99
101
  }
100
102
 
101
103
  return (
102
- <Stack spacing="base" p="4" zIndex="2">
104
+ <Stack spacing="base" zIndex="2">
103
105
  {/* Header */}
104
106
  {header && (
105
107
  <Flex justify="space-between" align="center">
@@ -129,16 +131,11 @@ export const WeatherWidget = ({
129
131
  <Stack spacing="0" align="end">
130
132
  <HStack align="start" spacing="2">
131
133
  {current.temp != null && (
132
- <Text
133
- fontSize="6xl"
134
- fontWeight="medium"
135
- lineHeight={1}
136
- color="gray.4"
137
- >
134
+ <Text fontSize="6xl" lineHeight={1} color="gray.4">
138
135
  {current.temp}°
139
136
  </Text>
140
137
  )}
141
- {getWeatherIcon(current.icon, 50)}
138
+ {getWeatherIcon(current.icon, 42)}
142
139
  </HStack>
143
140
  <Text fontSize="md">
144
141
  <Box as="span" color="gray.2">
@@ -153,7 +150,7 @@ export const WeatherWidget = ({
153
150
  </Stack>
154
151
  )}
155
152
 
156
- <Divider borderColor="gray.2" borderStyle="dashed" />
153
+ <Divider borderColor={BORDER_COLOR} borderStyle="dashed" />
157
154
 
158
155
  {/* Details */}
159
156
  {details && (
@@ -187,7 +184,7 @@ export const WeatherWidget = ({
187
184
  key={f.day}
188
185
  spacing="0"
189
186
  border="1px solid"
190
- borderColor="gray.2"
187
+ borderColor={BORDER_COLOR}
191
188
  borderRadius="sm"
192
189
  >
193
190
  <Text
@@ -195,13 +192,15 @@ export const WeatherWidget = ({
195
192
  textTransform="uppercase"
196
193
  fontSize="xxs"
197
194
  color="gray.2"
195
+ alignSelf="start"
196
+ ml="0.5"
198
197
  >
199
198
  {f.day}
200
199
  </Text>
201
- <Divider borderColor="gray.2" />
200
+ <Divider borderColor={BORDER_COLOR} />
202
201
  <Stack spacing="0" py="1" px="2" align="center">
203
202
  {getWeatherIcon(f.icon, 16, colors.gray[3])}
204
- <Text fontSize="sm" fontWeight="medium" mb="-1">
203
+ <Text fontSize="sm" mb="-1">
205
204
  {f.high}°
206
205
  </Text>
207
206
  <WeatherDetailText>L {f.low}°</WeatherDetailText>
@@ -9,9 +9,7 @@ export function mapForecastToWidget(
9
9
 
10
10
  // --- HEADER DATE ---
11
11
  const todayDate = parseISO(periods[0].startTime)
12
- const headerDate = format(todayDate, 'EEEE, MMMM do')
13
- .toUpperCase()
14
- .replace(',', '')
12
+ const headerDate = format(todayDate, 'EEE MMMM do')
15
13
 
16
14
  // --- CURRENT CONDITIONS ---
17
15
  const day0 = periods.find((p) => p.isDaytime) ?? periods[0]