Skip to content

Commit 9e9ac04

Browse files
committed
feat: office utilization
1 parent 3c48b3f commit 9e9ac04

File tree

14 files changed

+1097
-24
lines changed

14 files changed

+1097
-24
lines changed

package-lock.json

Lines changed: 78 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,13 @@
5858
"change-case": "^5.4.4",
5959
"cloudinary": "^2.7.0",
6060
"clsx": "^2.1.1",
61+
"csv": "^6.4.1",
6162
"datauri": "^4.1.0",
6263
"date-fns": "^4.1.0",
6364
"date-fns-tz": "^3.2.0",
6465
"deepmerge": "^4.3.1",
6566
"discord.js": "^14.18.0",
67+
"fast-shuffle": "^6.1.1",
6668
"html-to-image": "^1.11.13",
6769
"modern-screenshot": "^4.6.7",
6870
"multer": "^1.4.5-lts.1",
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
city,country,region,attendance_low_percentage,attendance_high_percentage,util_peak_low_percentage,util_peak_high_percentage,hybrid_work_trend_2025,prime_rent_usd_sqft,est_savings_usd_per_emp
2+
New York,US,AMER,52,58,70,75,worksCouncilsProtectRemoteRights,95,4275
3+
San Francisco,US,AMER,42,48,55,60,mandatesTighteningFourDays,75,3375
4+
London,GB,EMEA,48,55,70,78,techSectorStabilisingGradualEnforcementOfThreeDayMandatesHighSubleaseAvailability,145,6525
5+
Singapore,SG,APAC,80,85,88,92,tuesdayWednesdayThursdayPatternsDominantCityDistrictPushingFourDays,110,4950
6+
Tokyo,JP,APAC,75,80,85,90,highPresenteeismOfficeIsPrimaryHybridIsFlexibleHoursNotRemoteDays,125,5625
7+
Hong Kong,CN,APAC,65,70,72,78,culturalNormOfDailyPresenceLimitedRemoteWorkAdoptionOutsideForeignMNCs,130,5850
8+
Sydney,AU,APAC,60,65,78,85,highVacancyEmpowersTenantsFlexibilityUsedAsRetentionToolDespiteTraditionalCulture,90,4050
9+
Paris,FR,EMEA,60,65,75,82,strongRTOSixFourDaysFlightToQualityPremiumAssetsEarnTheCommuteFocus,105,4725
10+
Berlin,DE,EMEA,50,55,60,70,steadyThreeFourDayCultureSmallerHomeSizesDriveOfficeUsage,55,2475
11+
Dubai,AE,EMEA,85,90,90,95,worksCouncilsProtectRemoteRightsTwoThreeDaysRemoteStandard,70,3150
12+
Toronto,CA,AMER,40,45,55,65,officeCentricHubResidencyVisaRulesDrivePresenceMinimalRemoteWork,45,2025
13+
Austin,US,AMER,55,60,65,75,commuteFrictionKeepsAttendanceLowHeavyHybridAdoption,65,2925
14+
Mumbai,IN,APAC,80,85,88,95,techRTOMandatesIncreasingFlightToNewDevelopmentsInCBAndDomain,60,2700
15+
Shanghai,CN,APAC,85,90,90,95,trafficDictatesTimingsButCultureIsOfficeFirstRapidDemandForGradeASpace,50,2250
16+
Chicago,US,AMER,50,55,60,70,nearlyFullReturnRemoteWorkRareOversupplyInMarketLoweringRents,40,1800
17+
Los Angeles,US,AMER,45,50,58,65,midWeekPeaksStrongFridaysDeadTenantMarketAllowingUpgrades,55,2475
18+
Frankfurt,DE,EMEA,55,60,65,72,creativeEntertainmentIndustriesResistingStrictMandatesHighHybridFlexibility,60,2700
19+
Melbourne,AU,APAC,55,60,70,80,bankingSectorDrivingHigherAttendanceFlightToSustainableEsgBuildings,65,2925
20+
Seoul,KR,APAC,80,85,88,95,laggingSydneyInRTOStrongResistanceToFiveDayMandates,95,4275
21+
Dublin,IE,EMEA,55,60,68,75,topDownHierarchyDrivesAttendanceFocusOnSmartOfficesAndTechIntegration,70,3150
22+
Zurich,CH,EMEA,60,65,70,80,techHeavyThreeDaysInOfficeNormStrongDemandForSustainableCityCentreSpace,100,4500
23+
Boston,US,AMER,50,55,60,70,highQualityOfLifeCommuteSupportsRTOSThreeFourDaysStandard,70,3150
24+
Seattle,US,AMER,40,45,50,60,bioTechLabRolesDriveAveragesUpRapidUnassignedSeatingAdoption,55,2475
25+
Washington DC,US,AMER,45,50,55,65,techGiantsEnforcingRTOStrictIn2025StillLaggingNationalAverage,60,2700
26+
Miami,US,AMER,60,65,70,80,federalMandatesPushingNumbersUpSlowRecoveryInDowntownCore,85,3825
27+
Houston,US,AMER,60,65,70,80,lifestyleFinanceMigrationHubHighInPersonCultureTightOfficeSupply,40,1800
28+
Dallas,US,AMER,55,60,65,75,energySectorDrivesHighAttendanceFourDaysCommonCarCentricCommuteAccepted,45,2025
29+
Vancouver,CA,AMER,45,50,55,65,returnToOfficeLargelyNormalizedSuburbanCampusesSeeingHighUsage,50,2250
30+
Calgary,CA,AMER,55,60,65,75,highCostOfLivingPushesHybridUsageStrongDemandForTransitLinkedOffices,35,1575
31+
Montreal,CA,AMER,40,45,50,60,energySectorDominanceHigherAttendanceThanOtherCanadianCities,35,1575
32+
Mexico City,MX,AMER,65,70,75,85,strongCulturalResistanceToMandatesTwoDaysInOfficeCommon,35,1575
33+
Sao Paulo,BR,AMER,60,65,70,80,strongInPersonCultureHybridLimitedToMNCsAndTechStartups,40,1800
34+
Madrid,ES,EMEA,65,70,75,82,trafficIssuesDriveSomeHybridUseButFaceTimeCultureRemainsDominant,45,2025
35+
Barcelona,ES,EMEA,60,65,70,78,socialOfficeCultureHighAttendanceSiestaScheduleLargelyReplaced,40,1800
36+
Milan,IT,EMEA,60,65,70,80,techDigitalHubMoreFlexibleThanMadridCoWorkingVeryPopular,65,2925
37+
Rome,IT,EMEA,65,70,75,82,strongRTOfinanceFashionThreeFourDaysStandardFlightToPortaNuovaDistrict,50,2250
38+
Amsterdam,NL,EMEA,50,55,60,70,publicSectorDominanceMaintainsHighInPersonPresenceLowRemoteAdoption,90,4050
39+
Brussels,BE,EMEA,55,60,65,75,culturalEmphasisOnWorkLifeBalanceTwoThreeDaysRemoteIsNormalAndAccepted,55,2475
40+
Munich,DE,EMEA,55,60,65,75,euInstitutionsDrivingPresenceThreeDaysInOfficeIsTheLegislativeNorm,65,2925
41+
Hamburg,DE,EMEA,55,60,65,75,techAutoHubExpensiveRealEstateDrivingEfficiencyDeskSharing,50,2250
42+
Stockholm,SE,EMEA,50,55,60,70,tradingShippingFocusModerateHybridAdoptionStableAttendance,75,3375
43+
Oslo,NO,EMEA,55,60,65,75,highTrustCultureVoluntaryHybridWorksWellTwoThreeDaysRemoteCommon,65,2925
44+
Copenhagen,DK,EMEA,55,60,65,75,similarToSwedenBalancedHybridEmphasisOnOfficeAsSocialHub,60,2700
45+
Warsaw,PL,EMEA,50,55,60,70,flatHierarchiesThreeDaysInOfficeBikingCultureSupportsEasyCommute,30,1350
46+
Prague,CZ,EMEA,55,60,65,75,bpoSsChubHybridUsedAsKeyRecruitingToolModernStockAbundant,30,1350
47+
Riyadh,SA,EMEA,85,90,92,98,costEffectiveHubModerateRTOMandatesThreeDaysCommon,65,2925
48+
Tel Aviv,IL,EMEA,65,70,75,85,governmentMandatesVision2030DrivingFullOccupancyMinimalRemoteWork,80,3600
49+
Johannesburg,ZA,EMEA,60,65,70,80,techHeavyHybridStandardButInPersonCollaborationHighlyValued,25,1125
50+
Beijing,CN,APAC,85,90,90,95,safetyInfrastructureIssuesDriveOfficeUsageGeneratorsInternet,65,2925
51+
Shenzhen,CN,APAC,80,85,88,95,soEDominanceStrictAttendanceHybridVirtuallyNonExistent,60,2700
52+
Bangalore,IN,APAC,60,65,75,85,techHubBut996CulturePervadesHighPhysicalPresenceExpectations,50,2250
53+
Delhi NCR,IN,APAC,70,75,80,90,trafficCreatesHybridDemandTwoThreeDaysLargeCampusesConsolidating,45,2025
54+
Manila,PH,APAC,75,80,80,90,higherAttendanceThanBangaloreOperationalRolesDominate,30,1350
55+
Kuala Lumpur,MY,APAC,70,75,75,85,bpoSectorMovingBackToOfficeForDataSecurityRegulatoryMandates,30,1350
56+
Jakarta,ID,APAC,75,80,80,90,flightToQualityInKLCCHybridFlexibilityLowComparedToNeighbors,30,1350
57+
Bangkok,TH,APAC,70,75,75,85,trafficIsMajorFactorButTraditionalManagementPrefersVisibility,35,1575
58+
Ho Chi Minh City,VN,APAC,80,85,88,95,conglomerateCultureOfficePresenceSignalsCommitmentHybridRare,40,1800
59+
Taipei,TW,APAC,80,85,88,95,rapidGrowthPhaseIntenseWorkCultureOfficeIsStatusSymbol,55,2475
60+
Brisbane,AU,APAC,60,65,70,80,hardwareTechCultureRequiresPresenceLowRemotePenetration,55,2475
61+
Perth,AU,APAC,70,75,80,90,lifestyleCitySlightlyHigherAttendanceThanMelbourneThreeFourDays,65,2925
62+
Atlanta,US,AMER,50,55,60,70,miningDrivenIsolatedGeographyHighInPersonCulture,45,2025
63+
Denver,US,AMER,50,55,60,70,corporateHqsesEnforcingThreeFourDaysSuburbanCommuteImpactsConsistency,40,1800
64+
Philadelphia,US,AMER,48,53,60,68,lifestyleFocusFridaysVeryLowOccupancyTuesdayWednesdayPeak,40,1800
65+
Phoenix,US,AMER,55,60,65,75,slowCbdRecoveryRelyingOnEduMedsSectorForFootTraffic,40,1800
66+
San Diego,US,AMER,50,55,60,70,sprawlEncouragesDrivingGrowingTechPresenceBoostingOfficeUse,55,2475
67+
Rio de Janeiro,BR,AMER,60,65,70,80,biotechDefenseRequiresPresenceTechWorkersPreferRemote,35,1575
68+
Buenos Aires,AR,AMER,55,60,65,75,energyGovSectorsDriveAttendanceInformalFlexibleFridays,30,1350
69+
Santiago,CL,AMER,65,70,75,85,economicVolatilityDrivesCostSavingHybridModels,40,1800
70+
Bogota,CO,AMER,60,65,70,80,traditionalBusinessCultureHighOfficeOccupancy,30,1350
71+
Lima,PE,AMER,70,75,80,90,trafficPicoYPlacaInfluencesHybridSchedulesHeavily,30,1350
72+
Vienna,AT,EMEA,55,60,65,75,highQualityOfLifeTraditionalBankingInsuranceCultureLimitsRemote,55,2475
73+
Lisbon,PT,EMEA,60,65,70,80,digitalNomadHubButLocalsOftenWorkInOfficeGrowingTechScene,40,1800
74+
Helsinki,FI,EMEA,50,55,60,70,highDigitalLiteracyFlexibleWorkLegallySupported,60,2700
75+
Budapest,HU,EMEA,50,55,65,75,sscCapitalHybridUsedToAttractYoungTalent,25,1125
76+
Geneva,CH,EMEA,60,65,70,80,ngoFinanceHeavySteadyAttendanceHighCostOfRealEstate,110,4950
77+
Cairo,EG,EMEA,80,85,85,95,traditionalManagementStyleLowInternetReliabilityAtHomeLimitsRemote,30,1350
78+
Lagos,NG,EMEA,75,80,85,95,powerInfrastructureAtHomeUnreliableOfficeIsNecessary,40,1800
79+
Nairobi,KE,EMEA,70,75,80,90,growingTechHubHybridEmergingButOfficeRemainsPrimary,30,1350
80+
Abu Dhabi,AE,EMEA,80,85,85,95,govOilSectorDominanceStrictAttendancePolicies,60,2700
81+
Doha,QA,EMEA,80,85,85,95,similarToUAEHighOfficeAttendanceDrivenByEx PatsAndPolicy,60,2700
82+
Auckland,NZ,APAC,60,65,70,80,3DayOfficeWeekStandardFocusOnWorkspaceQuality,55,2475
83+
Osaka,JP,APAC,70,75,80,90,merchantCultureHighlyTraditionalRHigherThanTokyo,90,4050
84+
Guangzhou,CN,APAC,80,85,85,95,tradingHubFaceToFaceNegotiationEssential,55,2475
85+
Hyderabad,IN,APAC,60,65,75,85,pharmaTechMixLargeCampusesModerateHybridAdoption,45,2025
86+
Chennai,IN,APAC,70,75,80,90,manufacturingAutoSaaSMoreTraditionalConservativeWorkCulture,40,1800
87+
Cape Town,ZA,EMEA,55,60,65,75,techCreativeHubMoreFlexibleThanJohannesburg,30,1350
88+
Lyon,FR,EMEA,55,60,65,75,industrialBioTechFocusAttendanceStable,40,1800
89+
Manchester,GB,EMEA,50,55,65,75,mediaTechPresenceTuesdayThursdayCrowdVeryVisible,45,2025
90+
Edinburgh,GB,EMEA,50,55,60,70,financeSectorRTOStrongPublicSectorLagging,50,2250

src/chakra-starter/marketing-ui/BlogArticles/BlogArticles.tsx

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { Container, Heading, Separator, Text } from "@chakra-ui/react";
1+
import { Container, Heading, Text } from "@chakra-ui/react";
22
import React from "react";
33

44
import { BlogArticlesFeatured } from "./BlogArticlesFeatured";
55
import { BlogArticlesFooter } from "./BlogArticlesFooter";
66
import { BlogArticlesList } from "./BlogArticlesList";
77
import { BlogArticlesListItem } from "./BlogArticlesListItem";
8+
import { BlogArticlesMainSection } from "./BlogArticlesMainSection";
9+
import { BlogArticlesMainSectionHeading } from "./BlogArticlesMainSectionHeading";
810
import { blogArticles as defaultBlogArticles } from "./data";
911

1012
const featuredBlogArticleData = defaultBlogArticles.find(
@@ -22,33 +24,39 @@ export const BlogArticles = (props: BlogArticlesProps) => {
2224
const { heading, featuredBlogArticle, blogArticlesList, blogArticlesFooter } =
2325
props;
2426

27+
const sortedBlogArticles = defaultBlogArticles.sort(
28+
(a, b) => b.datePublished.getTime() - a.datePublished.getTime(),
29+
);
30+
2531
return (
2632
<Container maxW={"6xl"} padding={{ base: "0", md: "2" }}>
2733
<Heading as="h1">{heading || "Stories by Chakra Templates"}</Heading>
2834
{featuredBlogArticle || (
2935
<BlogArticlesFeatured featuredBlogArticle={featuredBlogArticleData} />
3036
)}
3137

32-
<Heading as="h2" marginTop="5" fontSize={"2xl"}>
33-
Latest articles
34-
</Heading>
35-
<Separator marginTop="5" />
36-
{blogArticlesList || (
37-
<BlogArticlesList>
38-
{defaultBlogArticles
39-
.sort(
40-
(a, b) => b.datePublished.getTime() - a.datePublished.getTime(),
41-
)
42-
.map((blogArticle) => {
43-
return (
44-
<BlogArticlesListItem
45-
key={blogArticle.uuid}
46-
blogArticle={blogArticle}
47-
/>
48-
);
49-
})}
50-
</BlogArticlesList>
51-
)}
38+
<BlogArticlesMainSection
39+
heading={
40+
<BlogArticlesMainSectionHeading>
41+
Latest articles
42+
</BlogArticlesMainSectionHeading>
43+
}
44+
blogArticlesList={
45+
blogArticlesList || (
46+
<BlogArticlesList>
47+
{sortedBlogArticles.map((blogArticle) => {
48+
return (
49+
<BlogArticlesListItem
50+
key={blogArticle.uuid}
51+
blogArticle={blogArticle}
52+
/>
53+
);
54+
})}
55+
</BlogArticlesList>
56+
)
57+
}
58+
/>
59+
5260
{blogArticlesFooter || (
5361
<BlogArticlesFooter
5462
heading={"What we write about"}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Separator } from "@chakra-ui/react";
2+
3+
type BlogArticlesMainSectionProps = {
4+
heading?: React.ReactNode;
5+
blogArticlesList?: React.ReactNode;
6+
};
7+
8+
export const BlogArticlesMainSection = (
9+
props: BlogArticlesMainSectionProps,
10+
) => {
11+
const { heading, blogArticlesList } = props;
12+
return (
13+
<>
14+
{heading}
15+
<Separator marginTop="5" />
16+
{blogArticlesList}
17+
</>
18+
);
19+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Heading } from "@chakra-ui/react";
2+
3+
type BlogArticlesMainSectionHeadingProps = {
4+
children: React.ReactNode;
5+
};
6+
7+
export const BlogArticlesMainSectionHeading = (
8+
props: BlogArticlesMainSectionHeadingProps,
9+
) => {
10+
const { children } = props;
11+
return (
12+
<Heading as="h2" marginTop="5" fontSize={"2xl"}>
13+
{children}
14+
</Heading>
15+
);
16+
};
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useTheme } from "next-themes";
22

33
export const useBlogArticlesTheme = () => {
4-
const { theme, forcedTheme } = useTheme();
5-
return { theme: forcedTheme || theme };
4+
const { theme, forcedTheme, resolvedTheme } = useTheme();
5+
return { theme: forcedTheme || resolvedTheme || theme };
66
};

src/chakra-starter/marketing-ui/footer/index.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,14 @@ export const Footer = () => {
103103
>
104104
GitHub
105105
</Link>
106+
107+
<Link
108+
href={"https://www.linkedin.com/company/workplacify"}
109+
target="_blank"
110+
rel="noopener noreferrer nofollow"
111+
>
112+
LinkedIn
113+
</Link>
106114
</Stack>
107115
{/* <Stack align={"flex-start"}>
108116
<ListHeader>Follow Us</ListHeader>

0 commit comments

Comments
 (0)