@uhero/feasim 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,507 @@
1
+ declare function zoneName(zone_class: string): string;
2
+ declare function permitsGroundFloorRetail(zone_class: string): boolean;
3
+ declare function commercialFracByZone(zone_class: string): number;
4
+ declare const DEFAULT_TARGET_RETURN = 0.115;
5
+ declare const GRANT: {
6
+ pre_construct: number;
7
+ post_construct: number;
8
+ };
9
+ declare const PARKING: {
10
+ stalls_per_unit: number;
11
+ stall_sqft: number;
12
+ monthly_rent_per_stall: number;
13
+ cost_per_sqft: number;
14
+ surface_stall_sqft: number;
15
+ surface_cost_per_sqft: number;
16
+ };
17
+ declare const DEFAULT_RETAIL_SHARE = 0.1;
18
+ declare const PARKING_MINIMUM: {
19
+ residential_sqft_per_stall: number;
20
+ retail_sqft_per_stall: number;
21
+ joint_use: number;
22
+ };
23
+ declare const LOADING: {
24
+ min_lot_sqft: number;
25
+ small_sqft: number;
26
+ large_sqft: number;
27
+ };
28
+ declare function roundHalfUp(x: number): number;
29
+ /** legal minimum stalls per unit: 1 per 1,000 sqft of private dwelling area;
30
+ * exempt parcels (§ 21-6.20(a)) pass `parking_exempt` instead */
31
+ declare function legalParkingRatio(unit_type: string): number;
32
+ /** Table 21-6.5: loading spaces for multifamily (by units) and retail (by
33
+ * floor area), with the joint-use rate when both need one */
34
+ declare function loadingSpaces(units: number, retail_sqft: number, joint_use?: number): number;
35
+ /** § 21-6.130(a): ground area the loading spaces take, sqft */
36
+ declare function loadingSqft(spaces: number): number;
37
+ /** Article 6 inputs to podiumEnvelope for a pathway that must provide
38
+ * parking: retail stalls, the joint-use rate and loading. An exempt lot
39
+ * (§ 21-6.20(a)) needs no stalls but still needs loading (§ 21-6.110). */
40
+ declare function article6Parking(lot_sqft: number, parking_exempt?: boolean): {
41
+ retail_stalls_per_sqft: number;
42
+ joint_use: number;
43
+ loading: boolean;
44
+ bicycle: boolean;
45
+ };
46
+ declare const BICYCLE_PARKING: {
47
+ short_term: {
48
+ units_per_space: number;
49
+ retail_sqft_per_space: number;
50
+ stalls_per_space: number;
51
+ cost_per_space: number;
52
+ };
53
+ long_term: {
54
+ units_per_space: number;
55
+ retail_sqft_per_space: number;
56
+ stalls_per_space: number;
57
+ cost_per_space: number;
58
+ };
59
+ sqft_per_space: number;
60
+ };
61
+ /** § 21-6.40(a): the districts that require bicycle parking (apartment,
62
+ * AMX, business, BMX, resort and Waikiki; not industrial) */
63
+ declare function bicycleRequired(zone_class: string): boolean;
64
+ /** Table 21-6.3: short- and long-term spaces for the housing and the retail,
65
+ * with a fraction of 0.5 or more rounded up (§ 21-6.40(b)) */
66
+ declare function bicycleSpaces(units: number, retail_sqft: number, retail_stalls: number): {
67
+ short_term: number;
68
+ long_term: number;
69
+ };
70
+ declare const WSFC_PER_FU: {
71
+ readonly multi_low_rise: 271.27;
72
+ readonly multi_high_rise: 204.12;
73
+ };
74
+ declare const WSFC_MIN_FU = 20;
75
+ declare const WSFC_WAIVER_UNIT_CAP = 500;
76
+ declare const FU_PER_UNIT: {
77
+ readonly bath_1: 7.5;
78
+ readonly bath_1_5: 9.8;
79
+ readonly bath_2: 11.4;
80
+ };
81
+ declare const BATHS_BY_UNIT_TYPE: Record<string, keyof typeof FU_PER_UNIT>;
82
+ declare const COMMON_AREA_FU = 0;
83
+ declare const FIRE_METER_CHARGE: Record<string, number>;
84
+ declare function wsfcCategory(living_stories: number): "multi_low_rise" | "multi_high_rise";
85
+ declare function mixFixtureUnits(mix_key: string): number;
86
+ declare function fireMeterSize(living_stories: number): string;
87
+ declare function livingStories(gross_residential_sqft: number, coverage_cap: number, setback_cap: number, floors: number): number;
88
+ declare function calcWaterFees(i: {
89
+ max_units: number;
90
+ water_chargeable_units: number;
91
+ living_stories: number;
92
+ fu_per_unit: number;
93
+ }): {
94
+ wsfc: number;
95
+ water_meter: number;
96
+ total_fu: number;
97
+ };
98
+ type ProgramId = "bill7" | "standard" | "tod" | "h201" | "bill6";
99
+ interface SliderInputs {
100
+ program: ProgramId;
101
+ lot_sqft?: number;
102
+ height_limit?: number;
103
+ floor_height?: number;
104
+ zone_class?: string;
105
+ rental_split?: number;
106
+ sale_split?: number;
107
+ market_price?: number;
108
+ target_return?: number;
109
+ profit_margin?: number;
110
+ affordable_ami?: string;
111
+ /** § 21-3.120-2(b) open-space FAR bonus on offer, in FAR, included in
112
+ * max_far. It costs lot_sqft/5 of ground per 1.0 FAR, so it is both an
113
+ * uplift and a land cost; calcSingle takes it only if it raises the
114
+ * residual land value. */
115
+ open_space_bonus?: number;
116
+ /** FAR without the open-space bonus, for that comparison. Defaults to
117
+ * max_far - open_space_bonus. */
118
+ far_without_bonus?: number;
119
+ market_ami?: string;
120
+ construction_rate?: number;
121
+ equity?: number;
122
+ grant_type?: "none" | "pre_construct" | "post_construct";
123
+ grant_amount?: number;
124
+ land_cost?: number;
125
+ permanent_rate?: number;
126
+ hold_years?: number;
127
+ amort_years?: number;
128
+ leaseup_months?: number;
129
+ min_dscr?: number;
130
+ include_retail?: boolean;
131
+ retail_rent?: number;
132
+ retail_share?: number;
133
+ parking_ratio?: number;
134
+ parking_exempt?: boolean;
135
+ front_no_parking_ft?: number;
136
+ max_units?: number;
137
+ stepback_trigger_ft?: number;
138
+ stepback_above_ft?: number;
139
+ stepback_ft_per_10ft?: number;
140
+ mortgage?: number;
141
+ park?: "exempt" | "in_lieu";
142
+ permitting_months?: number;
143
+ const_months?: number;
144
+ unit_type?: string;
145
+ impact_fee?: number;
146
+ affordability?: number;
147
+ cap_rate?: number;
148
+ target_spread?: number;
149
+ setback?: number;
150
+ coverage?: number;
151
+ opex_ratio?: number;
152
+ hard_cost_per_sqft?: number;
153
+ building_area_per_unit?: number;
154
+ max_far?: number;
155
+ waivable_fee_basis?: FeeBasis;
156
+ }
157
+ interface ParcelOutput {
158
+ tmk: string;
159
+ zone_class: string;
160
+ lot_sqft: number;
161
+ height_limit: number;
162
+ open_space_bonus?: number;
163
+ buildable_sqft: number;
164
+ net_residential_sqft: number;
165
+ net_commercial_sqft: number;
166
+ max_units: number;
167
+ parking_stalls: number;
168
+ loading_spaces?: number;
169
+ bicycle_spaces?: number;
170
+ bicycle_short_term?: number;
171
+ bicycle_long_term?: number;
172
+ surface_stalls?: number;
173
+ ground_floor_stalls?: number;
174
+ podium_stalls?: number;
175
+ podium_levels: number;
176
+ parking_sqft: number;
177
+ parking_share: number;
178
+ affordable_units: number;
179
+ afd_rent_units: number;
180
+ mkt_rent_units: number;
181
+ afd_sale_units: number;
182
+ mkt_sale_units: number;
183
+ hard_cost: number;
184
+ soft_cost: number;
185
+ soft_cost_breakdown?: SoftCostBreakdown;
186
+ dev_cost: number;
187
+ total_financing_cost: number;
188
+ rlv_financing_cost: number;
189
+ pre_construction_subsidy: number;
190
+ equity_amount: number;
191
+ loan_balance_at_stab: number;
192
+ permitting_months: number;
193
+ const_months: number;
194
+ leaseup_months: number;
195
+ sales_months: number;
196
+ total_carry_months: number;
197
+ total_months: number;
198
+ project_years: number;
199
+ pri: number;
200
+ pgi: number;
201
+ residential_egi: number;
202
+ retail_pgi: number;
203
+ retail_egi: number;
204
+ egi: number;
205
+ gross_sales: number;
206
+ afd_sales: number;
207
+ mkt_sales: number;
208
+ residential_opex: number;
209
+ retail_opex: number;
210
+ operating_expenses: number;
211
+ property_tax: number;
212
+ noi: number;
213
+ cap_rate: number;
214
+ gdv: number;
215
+ dev_strategy: "dev_flip" | "hold";
216
+ dev_hold_years: number;
217
+ dev_post_grant: number;
218
+ dev_land_cost: number;
219
+ dev_total_dev_cost: number;
220
+ dev_capital_subsidy: number;
221
+ dev_net_dev_cost: number;
222
+ dev_levered_irr: number;
223
+ dev_equity_multiple: number;
224
+ dev_profit: number;
225
+ dev_roc: number;
226
+ dev_equity_invested: number;
227
+ dev_equity_out: number;
228
+ dev_gdv: number;
229
+ dev_selling_costs: number;
230
+ dev_loan_payoff: number;
231
+ dev_perm_principal: number | null;
232
+ dev_perm_rate: number | null;
233
+ dev_annual_debt_svc: number | null;
234
+ dev_dscr: number | null;
235
+ dev_equity_pct_realized: number;
236
+ dev_dscr_binds: boolean;
237
+ dev_is_bankable: boolean | null;
238
+ dev_cash_on_cash: number | null;
239
+ dev_entry_cap: number | null;
240
+ dev_exit_cap: number | null;
241
+ dev_yr1_prop_tax: number | null;
242
+ dev_investment_spread: number;
243
+ dev_target_roc: number;
244
+ dev_is_feasible: boolean;
245
+ total_predev_cost: number;
246
+ construction_equity: number;
247
+ rlv_selling_costs: number;
248
+ rlv_post_grant: number;
249
+ rlv_profit: number;
250
+ rlv_project_cost: number;
251
+ rlv: number;
252
+ rlv_sqft: number;
253
+ dev_roi: number;
254
+ }
255
+ type FeeBasis = "all_units" | "market_units" | "none";
256
+ type SoftCostBreakdown = {
257
+ environmental: number;
258
+ building_permit: number;
259
+ plan_review: number;
260
+ wastewater: number;
261
+ wsfc: number;
262
+ water_meter: number;
263
+ temp_occupancy: number;
264
+ park_dedication: number;
265
+ escp: number;
266
+ utilities: number;
267
+ grubbing: number;
268
+ stockpiling: number;
269
+ grading: number;
270
+ impact: number;
271
+ construction_mgmt: number;
272
+ zoning_application: number;
273
+ special_district: number;
274
+ total: number;
275
+ };
276
+ declare function calcFAR(zone_class: string, lot_sqft: number): number;
277
+ declare const TOD_ELIGIBLE_DISTRICTS: string[];
278
+ declare const TOD_MIN_LOT_SQFT = 20000;
279
+ declare const TOD_MAX_FAR = 7.5;
280
+ declare const TOD_MAX_HEIGHT_FT = 450;
281
+ /** whether the IPD-T bonuses are available at all */
282
+ declare function todEligible(zone_class: string, lot_sqft: number): boolean;
283
+ declare function todUseZone(zone_class: string): string;
284
+ declare const OPEN_SPACE_FAR_CEILING: Record<string, number>;
285
+ /**
286
+ * Base FAR by district family: Table 21-3.3 for the apartment districts,
287
+ * calcFAR (Table 21-3.4 and the others) for the rest.
288
+ */
289
+ declare function baseFar(zone_class: string, lot_sqft?: number): number;
290
+ /** largest open-space bonus the district allows, in FAR */
291
+ declare function openSpaceBonus(zone_class: string): number;
292
+ /** open-space bonus on top of a pathway's own FAR, up to the district ceiling */
293
+ declare function openSpaceBonusOver(zone_class: string, far: number): number;
294
+ /** lot left for the building once the bonus's public open space (5:1) is set aside */
295
+ declare function lotAfterOpenSpace(lot_sqft: number, bonus?: number): number;
296
+ declare function calcFarTod(zone_class: string, lot_sqft: number, density_bonus?: number, plan_far?: number): number;
297
+ type TodPermitRoute = "base" | "minor_sd" | "major_sd" | "pdt";
298
+ declare function calcFarPdt(zone_class: string, lot_sqft: number, route?: TodPermitRoute): number;
299
+ declare function todHeightPdt(base_height: number, route?: TodPermitRoute, map_bonus_height?: number): number;
300
+ declare const IMX1_PDT_MAX_UNITS = 10;
301
+ type ResidentialUse = "permitted" | "discretionary" | "not_permitted";
302
+ declare function residentialUse(zone_class: string, regime: "pdt" | "ipdt"): ResidentialUse;
303
+ interface TodPlanStandards {
304
+ /** core TOD Precinct, <= 1/4 mile */
305
+ core_max_far: number | null;
306
+ core_max_height: number | null;
307
+ /** TIZ Precinct, 1/4 to 1/2 mile */
308
+ tiz_max_far: number | null;
309
+ tiz_max_height: number | null;
310
+ /** figures came from the quarter-mile proxy, not the plan's own polygons */
311
+ approximate?: boolean;
312
+ source: string;
313
+ }
314
+ declare const TOD_PLAN_STANDARDS: Record<string, TodPlanStandards>;
315
+ /** nulls where the plan is silent or untranscribed */
316
+ declare function todPlanCeiling(station_area: string | null, precinct: "core" | "tiz"): {
317
+ far: number | null;
318
+ height: number | null;
319
+ approximate: boolean;
320
+ };
321
+ declare function todHeightLimit(zone_class: string, lot_sqft: number, base_height: number, plan_height?: number): number;
322
+ declare function calcFarBill6(zone_class: string): number;
323
+ declare function yardFootprint(lot_sqft: number, front: number, rear: number, side: number, ratio?: number): number;
324
+ declare const PDT_FRONT_NO_PARKING_FT = 40;
325
+ declare function frontStripSqft(lot_sqft: number, setback: number, depth: number, ratio?: number): number;
326
+ type StepBack = {
327
+ trigger_ft: number;
328
+ above_ft: number;
329
+ ft_per_10ft: number;
330
+ front?: boolean;
331
+ };
332
+ declare function zoneStepBack(zone_class: string): StepBack | undefined;
333
+ declare function stepBackOf(s: SliderInputs, zone_default?: StepBack): StepBack | undefined;
334
+ declare function floorPlates(i: {
335
+ floors: number;
336
+ floor_height: number;
337
+ height_limit: number;
338
+ lot_sqft: number;
339
+ coverage_plate: number;
340
+ setback: number;
341
+ stepback?: StepBack;
342
+ }): number[];
343
+ declare function podiumEnvelope(i: {
344
+ plates: number[];
345
+ far_cap: number;
346
+ retail_cap: number;
347
+ retail_share: number;
348
+ unit_size: number;
349
+ parking_ratio: number;
350
+ retail_stalls_per_sqft?: number;
351
+ joint_use?: number;
352
+ loading?: boolean;
353
+ bicycle?: boolean;
354
+ front_strip_sqft?: number;
355
+ max_units?: number;
356
+ unit_cap?: number;
357
+ }): {
358
+ residential_sqft: number;
359
+ retail_sqft: number;
360
+ lobby_sqft: number;
361
+ units: number;
362
+ stalls: number;
363
+ surface_stalls: number;
364
+ ground_floor_stalls: number;
365
+ podium_stalls: number;
366
+ loading_spaces: number;
367
+ bicycle_short_term: number;
368
+ bicycle_long_term: number;
369
+ podium_levels: number;
370
+ parking_sqft: number;
371
+ parking_cost: number;
372
+ parking_share: number;
373
+ living_stories: number;
374
+ };
375
+ declare function calcParkingIncome(stalls: number): number;
376
+ declare function calcBicycleParkingCost(short_term: number, long_term: number): number;
377
+ declare function getAffordablePrice(unit_type: string, ami: number, rate: number): number;
378
+
379
+ declare const BILL6_DEFAULT_EQUITY = 0.3;
380
+ declare const BILL6_DEFAULT_HEIGHT_LIMIT = 30;
381
+ declare const BILL6_DEFAULT_FLOOR_HEIGHT = 10;
382
+ declare const BILL6_DEFAULT_LAND_COST = 130;
383
+ declare const BILL6_DEFAULT_PERMANENT_RATE = 0.0675;
384
+ declare const BILL6_DEFAULT_HOLD_YEARS = 10;
385
+
386
+ declare const DEFAULT_RETAIL_RENT = 3;
387
+ declare const DEFAULT_HEIGHT_LIMIT = 30;
388
+ declare const DEFAULT_PERMANENT_RATE = 0.07;
389
+ declare const DEFAULT_HOLD_YEARS = 10;
390
+ declare const DEFAULT_LAND_COST = 130;
391
+ declare const DEFAULT_GRANT_TYPE: "none" | "pre_construct" | "post_construct";
392
+ declare const DEFAULT_INCLUDE_RETAIL = false;
393
+ declare const DEFAULT_AFFORDABLE_AMI = "ami_80";
394
+ declare const DEFAULT_MARKET_AMI = "ami_100";
395
+
396
+ declare const H201_DEFAULT_HEIGHT_LIMIT = 30;
397
+ declare const H201_DEFAULT_SALE_SPLIT = 0.4;
398
+ declare const H201_DEFAULT_AFFORDABILITY = 0.51;
399
+ declare const H201_DEFAULT_EQUITY = 0.3;
400
+ declare const H201_DEFAULT_LAND_COST = 130;
401
+ declare const H201_DEFAULT_PERMITTING_MO = 18;
402
+ declare const H201_DEFAULT_PERMANENT_RATE = 0.0675;
403
+ declare const H201_DEFAULT_HOLD_YEARS = 10;
404
+
405
+ declare const STD_DEFAULT_EQUITY = 0.3;
406
+ declare const STD_DEFAULT_HEIGHT_LIMIT = 30;
407
+ declare const STD_DEFAULT_FLOOR_HEIGHT = 10;
408
+ declare const STD_DEFAULT_LAND_COST = 130;
409
+ declare const STD_DEFAULT_PERMANENT_RATE = 0.0675;
410
+ declare const STD_DEFAULT_HOLD_YEARS = 10;
411
+
412
+ declare const TOD_DEFAULT_HEIGHT_LIMIT = 60;
413
+ declare const TOD_DEFAULT_ZONE_CLASS = "AMX-1";
414
+ declare const TOD_DEFAULT_EQUITY = 0.3;
415
+ declare const TOD_DEFAULT_LAND_COST = 130;
416
+ declare const TOD_DEFAULT_PERMANENT_RATE = 0.0675;
417
+ declare const TOD_DEFAULT_HOLD_YEARS = 10;
418
+
419
+ declare function calcSingle(sliders: SliderInputs): ParcelOutput;
420
+
421
+ /** Bill 7's height cap, ft, and statutory FAR. */
422
+ declare const BILL7_MAX_HEIGHT = 60;
423
+ declare const BILL7_FAR = 4;
424
+ /** A real parcel's physical envelope. */
425
+ interface Parcel {
426
+ tmk?: string;
427
+ lot_sqft: number;
428
+ zone_class: string;
429
+ /** ft; 0 = unknown (pathway default, or not modeled under TOD) */
430
+ height: number;
431
+ /** PD-T in an adopted special district, IPD-T elsewhere; absent = no permit */
432
+ tod_regime?: "pdt" | "ipdt";
433
+ /** entirely in the state land use urban district, § 21-9.100-5(b)(4) */
434
+ slu_urban?: boolean;
435
+ /** PD-T: parenthetical height on the TOD zoning map, ft */
436
+ tod_map_bonus_height?: number;
437
+ /** a key into TOD_PLAN_STANDARDS */
438
+ station_area?: string;
439
+ /** "core" <= 1/4 mi, "tiz" 1/4 to 1/2 mi */
440
+ tod_precinct?: "core" | "tiz";
441
+ /** § 21-6.20(a): no off-street parking required */
442
+ parking_exempt?: boolean;
443
+ }
444
+ /** A pathway's own height limit and FAR for a parcel. */
445
+ interface Envelope {
446
+ height_limit: number;
447
+ max_far: number;
448
+ /** TOD: where the FAR and height came from */
449
+ far_source?: "base" | "ipdt_formula" | "plan_ceiling" | "pdt_ladder";
450
+ height_source?: "base" | "ipdt_doubling" | "plan_cap" | "pdt_minor_sd" | "pdt_major_sd" | "pdt_map_bonus";
451
+ /** TOD; leave "not_modeled" and "not_applicable" out of totals */
452
+ status?: "eligible" | "ineligible" | "not_modeled" | "not_applicable";
453
+ status_reason?: string;
454
+ /** TOD: IMX-1 unit cap under PD-T */
455
+ max_units?: number;
456
+ /** FAR earned by public open space, its ground given up at 5:1 */
457
+ open_space_bonus?: number;
458
+ /** FAR without that bonus, where it isn't max_far - open_space_bonus */
459
+ far_without_bonus?: number;
460
+ /** PD-T: no ground-floor parking within this distance of the front, ft */
461
+ front_no_parking_ft?: number;
462
+ }
463
+ /** Permit tiers, least to most. Minor and major permits are PD-T only (IPD-T
464
+ * treats them as base); "with_benefits" is PD-T or IPD-T approval. */
465
+ type TodTier = "base" | "minor_sd" | "major_sd" | "with_benefits";
466
+ interface TodEnvelopeOpts {
467
+ tier?: TodTier;
468
+ /** § 21-3.120-2(b) bonus, in FAR. IPD-T only. */
469
+ density_bonus?: number;
470
+ /** TOD zoning map parenthetical, PD-T only */
471
+ map_bonus_height?: number;
472
+ /** PD-T approval without a parenthetical: major permit height, not zoned */
473
+ generous_height?: boolean;
474
+ }
475
+ /** null when the parcel clears every § 21-9.100-5(b) gate */
476
+ declare function todIneligibleReason(parcel: Parcel): string | null;
477
+ /** null unless housing is not permitted in the zone at this tier */
478
+ declare function todNotApplicableReason(parcel: Parcel, tier: TodTier): string | null;
479
+ /** A pathway's height limit and FAR for a parcel. `opts` is TOD only. */
480
+ declare function pathwayEnvelope(program: ProgramId, parcel: Parcel, opts?: TodEnvelopeOpts): Envelope;
481
+ /** Ground the TOD open-space bonus uses, sqft. A number = IPD-T density bonus. */
482
+ declare function todOpenSpaceCostSqft(parcel: Parcel, opts?: TodEnvelopeOpts | number): number;
483
+ /** Each pathway's default assumptions, all but the parcel's envelope. With no
484
+ * `cap_rate` the model uses its flat 5.1%. */
485
+ declare const DEFAULT_INPUTS: Record<ProgramId, SliderInputs>;
486
+ /**
487
+ * Model inputs for a parcel: pathway defaults, then `levers` (undefined = not
488
+ * set), then the parcel's envelope. `levers.height_limit` / `max_far` override
489
+ * the envelope; Bill 7's 60 ft cap still applies. `opts` is TOD only.
490
+ */
491
+ declare function parcelInputs(program: ProgramId, parcel: Parcel, levers?: Partial<SliderInputs>, opts?: TodEnvelopeOpts): SliderInputs;
492
+ /** `calcSingle(parcelInputs(...))`, with the parcel's TMK on the output. */
493
+ declare function calcParcel(program: ProgramId, parcel: Parcel, levers?: Partial<SliderInputs>, opts?: TodEnvelopeOpts): ParcelOutput;
494
+
495
+ type Level = "poor" | "marginal" | "strong";
496
+ declare function getLevel(value: number, lo: number, hi: number): Level;
497
+ declare function landPricePerSqft(r: ParcelOutput): number;
498
+ declare function rlvRatio(r: ParcelOutput): number | null;
499
+ declare function rocLevel(r: ParcelOutput): Level | null;
500
+ declare function rlvLevel(r: ParcelOutput): Level | null;
501
+ declare function equityMultipleLevel(r: ParcelOutput): Level | null;
502
+ declare function irrLevel(r: ParcelOutput): Level | null;
503
+ declare function scoredLevels(r: ParcelOutput): Level[];
504
+ declare function overallLevel(r: ParcelOutput): Level;
505
+ declare const LEVEL_COLOR: Record<Level, string>;
506
+
507
+ export { BATHS_BY_UNIT_TYPE, BICYCLE_PARKING, BILL6_DEFAULT_EQUITY, BILL6_DEFAULT_FLOOR_HEIGHT, BILL6_DEFAULT_HEIGHT_LIMIT, BILL6_DEFAULT_HOLD_YEARS, BILL6_DEFAULT_LAND_COST, BILL6_DEFAULT_PERMANENT_RATE, BILL7_FAR, BILL7_MAX_HEIGHT, COMMON_AREA_FU, DEFAULT_AFFORDABLE_AMI, DEFAULT_GRANT_TYPE, DEFAULT_HEIGHT_LIMIT, DEFAULT_HOLD_YEARS, DEFAULT_INCLUDE_RETAIL, DEFAULT_INPUTS, DEFAULT_LAND_COST, DEFAULT_MARKET_AMI, DEFAULT_PERMANENT_RATE, DEFAULT_RETAIL_RENT, DEFAULT_RETAIL_SHARE, DEFAULT_TARGET_RETURN, type Envelope, FIRE_METER_CHARGE, FU_PER_UNIT, type FeeBasis, GRANT, H201_DEFAULT_AFFORDABILITY, H201_DEFAULT_EQUITY, H201_DEFAULT_HEIGHT_LIMIT, H201_DEFAULT_HOLD_YEARS, H201_DEFAULT_LAND_COST, H201_DEFAULT_PERMANENT_RATE, H201_DEFAULT_PERMITTING_MO, H201_DEFAULT_SALE_SPLIT, IMX1_PDT_MAX_UNITS, LEVEL_COLOR, LOADING, type Level, OPEN_SPACE_FAR_CEILING, PARKING, PARKING_MINIMUM, PDT_FRONT_NO_PARKING_FT, type Parcel, type ParcelOutput, type ProgramId, type ResidentialUse, STD_DEFAULT_EQUITY, STD_DEFAULT_FLOOR_HEIGHT, STD_DEFAULT_HEIGHT_LIMIT, STD_DEFAULT_HOLD_YEARS, STD_DEFAULT_LAND_COST, STD_DEFAULT_PERMANENT_RATE, type SliderInputs, type SoftCostBreakdown, type StepBack, TOD_DEFAULT_EQUITY, TOD_DEFAULT_HEIGHT_LIMIT, TOD_DEFAULT_HOLD_YEARS, TOD_DEFAULT_LAND_COST, TOD_DEFAULT_PERMANENT_RATE, TOD_DEFAULT_ZONE_CLASS, TOD_ELIGIBLE_DISTRICTS, TOD_MAX_FAR, TOD_MAX_HEIGHT_FT, TOD_MIN_LOT_SQFT, TOD_PLAN_STANDARDS, type TodEnvelopeOpts, type TodPermitRoute, type TodPlanStandards, type TodTier, WSFC_MIN_FU, WSFC_PER_FU, WSFC_WAIVER_UNIT_CAP, article6Parking, baseFar, bicycleRequired, bicycleSpaces, calcBicycleParkingCost, calcFAR, calcFarBill6, calcFarPdt, calcFarTod, calcParcel, calcParkingIncome, calcSingle, calcWaterFees, commercialFracByZone, equityMultipleLevel, fireMeterSize, floorPlates, frontStripSqft, getAffordablePrice, getLevel, irrLevel, landPricePerSqft, legalParkingRatio, livingStories, loadingSpaces, loadingSqft, lotAfterOpenSpace, mixFixtureUnits, openSpaceBonus, openSpaceBonusOver, overallLevel, parcelInputs, pathwayEnvelope, permitsGroundFloorRetail, podiumEnvelope, residentialUse, rlvLevel, rlvRatio, rocLevel, roundHalfUp, scoredLevels, stepBackOf, todEligible, todHeightLimit, todHeightPdt, todIneligibleReason, todNotApplicableReason, todOpenSpaceCostSqft, todPlanCeiling, todUseZone, wsfcCategory, yardFootprint, zoneName, zoneStepBack };