@superbright/indexeddb-orm 1.0.58 → 1.0.60

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.
@@ -348,7 +348,7 @@ export interface paths {
348
348
  };
349
349
  /**
350
350
  * Get property details
351
- * @description Returns property details
351
+ * @description Returns property details for the Embed app. The response includes a `theme` field (`EmbedTheme`): the currently-published theme config + fonts. When the property has never been published, `theme.config` is the system default and `theme.fonts` is empty — the Embed app should fall back to its built-in font stack in that case. Fonts are served as public CDN URLs (`media.url`); preload them with `<link rel="preload" as="font" crossorigin>` for best paint.
352
352
  */
353
353
  get: operations["getPropertyDetails"];
354
354
  put?: never;
@@ -539,6 +539,74 @@ export interface paths {
539
539
  patch?: never;
540
540
  trace?: never;
541
541
  };
542
+ "/fonts": {
543
+ parameters: {
544
+ query?: never;
545
+ header?: never;
546
+ path?: never;
547
+ cookie?: never;
548
+ };
549
+ /**
550
+ * List the authed user's fonts
551
+ * @description Returns the user's font library. Up to 5 non-archived fonts per user. Use include_archived=true to also return archived fonts.
552
+ */
553
+ get: operations["listUserFonts"];
554
+ put?: never;
555
+ /**
556
+ * Register a font that was just uploaded to S3
557
+ * @description Creates a UserFont row pointing at an asset_key the client just uploaded via the URL from /fonts/upload-url. The asset_key must live under the authed user's font path (assets/fonts/{user_id}/...).
558
+ */
559
+ post: operations["createUserFont"];
560
+ delete?: never;
561
+ options?: never;
562
+ head?: never;
563
+ patch?: never;
564
+ trace?: never;
565
+ };
566
+ "/fonts/upload-url": {
567
+ parameters: {
568
+ query?: never;
569
+ header?: never;
570
+ path?: never;
571
+ cookie?: never;
572
+ };
573
+ /**
574
+ * Get a pre-signed S3 URL for uploading a font file
575
+ * @description Returns a pre-signed PUT URL the client uses to upload the font file directly to S3 under assets/fonts/. The client should then call POST /fonts with the returned asset_key plus font metadata. The client is responsible for setting the correct Content-Type header (e.g. font/woff2) on the PUT request.
576
+ */
577
+ get: operations["getFontUploadUrl"];
578
+ put?: never;
579
+ post?: never;
580
+ delete?: never;
581
+ options?: never;
582
+ head?: never;
583
+ patch?: never;
584
+ trace?: never;
585
+ };
586
+ "/fonts/{id}": {
587
+ parameters: {
588
+ query?: never;
589
+ header?: never;
590
+ path?: never;
591
+ cookie?: never;
592
+ };
593
+ get?: never;
594
+ /**
595
+ * Update a font (family rename / archive toggle)
596
+ * @description Only family and is_archived are mutable. To "delete" a font without removing it, set is_archived=true; archived fonts are hidden from the CMS picker but their S3 file and DB row are preserved.
597
+ */
598
+ put: operations["updateUserFont"];
599
+ post?: never;
600
+ /**
601
+ * Delete a font from the library
602
+ * @description Removes the font, its Media row, and all draft/non-published-version references to it (those role slots fall back to the embed default). Refuses with HTTP 409 if the font is referenced by any currently-published theme version — the user must first publish a new version of the affected theme(s) without this font.
603
+ */
604
+ delete: operations["deleteUserFont"];
605
+ options?: never;
606
+ head?: never;
607
+ patch?: never;
608
+ trace?: never;
609
+ };
542
610
  "/floorPlans": {
543
611
  parameters: {
544
612
  query?: never;
@@ -1652,7 +1720,7 @@ export interface paths {
1652
1720
  patch?: never;
1653
1721
  trace?: never;
1654
1722
  };
1655
- "/queue/jobs/{id}/uploadUrl": {
1723
+ "/queue/jobs/{id}/upload_url": {
1656
1724
  parameters: {
1657
1725
  query?: never;
1658
1726
  header?: never;
@@ -1771,7 +1839,7 @@ export interface paths {
1771
1839
  patch?: never;
1772
1840
  trace?: never;
1773
1841
  };
1774
- "/renders/jobs/{id}/uploadUrl": {
1842
+ "/renders/jobs/{id}/upload_url": {
1775
1843
  parameters: {
1776
1844
  query?: never;
1777
1845
  header?: never;
@@ -2074,6 +2142,140 @@ export interface paths {
2074
2142
  patch?: never;
2075
2143
  trace?: never;
2076
2144
  };
2145
+ "/properties/{id}/theme": {
2146
+ parameters: {
2147
+ query?: never;
2148
+ header?: never;
2149
+ path?: never;
2150
+ cookie?: never;
2151
+ };
2152
+ /**
2153
+ * Get the property's theme state
2154
+ * @description Returns `{ current, live, versions }`. `current` is the row the CMS is editing — the draft if one exists, else the live row. `live` is the currently-live row (or null if never published). `versions` is every published + archived row, newest-first.
2155
+ *
2156
+ * The Publish button is enabled iff `current.status === "draft"`.
2157
+ */
2158
+ get: operations["getPropertyTheme"];
2159
+ put?: never;
2160
+ post?: never;
2161
+ delete?: never;
2162
+ options?: never;
2163
+ head?: never;
2164
+ patch?: never;
2165
+ trace?: never;
2166
+ };
2167
+ "/properties/{id}/theme/draft": {
2168
+ parameters: {
2169
+ query?: never;
2170
+ header?: never;
2171
+ path?: never;
2172
+ cookie?: never;
2173
+ };
2174
+ get?: never;
2175
+ /**
2176
+ * Save the theme draft (creates one if needed)
2177
+ * @description Replace-style upsert of the draft. If no draft row exists, the API creates one by forking from the live row (parent_id = live.id). If a draft already exists, it is updated in place. The provided `fonts` array becomes the new draft font set (the old set is dropped).
2178
+ */
2179
+ put: operations["updatePropertyThemeDraft"];
2180
+ post?: never;
2181
+ /**
2182
+ * Discard the in-progress draft
2183
+ * @description Deletes the draft row. After this call the CMS shows the live row as `current` (read-only baseline) and the Publish button becomes disabled. Idempotent — succeeds even if no draft exists.
2184
+ */
2185
+ delete: operations["discardPropertyThemeDraft"];
2186
+ options?: never;
2187
+ head?: never;
2188
+ patch?: never;
2189
+ trace?: never;
2190
+ };
2191
+ "/properties/{id}/theme/publish": {
2192
+ parameters: {
2193
+ query?: never;
2194
+ header?: never;
2195
+ path?: never;
2196
+ cookie?: never;
2197
+ };
2198
+ get?: never;
2199
+ put?: never;
2200
+ /**
2201
+ * Publish the current draft
2202
+ * @description The draft row graduates to `status='published'` with `version = max(version) + 1` and an optional `message`. The previously-live row, if any, is demoted to `status='archived'`. If the property now has more than 5 published+archived rows, the oldest archived row is hard-deleted. Returns the updated `{ current, live, versions }`.
2203
+ *
2204
+ * 422 if there is no draft to publish.
2205
+ */
2206
+ post: operations["publishPropertyTheme"];
2207
+ delete?: never;
2208
+ options?: never;
2209
+ head?: never;
2210
+ patch?: never;
2211
+ trace?: never;
2212
+ };
2213
+ "/properties/{id}/theme/versions": {
2214
+ parameters: {
2215
+ query?: never;
2216
+ header?: never;
2217
+ path?: never;
2218
+ cookie?: never;
2219
+ };
2220
+ /**
2221
+ * List published + archived versions of the theme
2222
+ * @description Newest-first list of every row with `status` in {`published`, `archived`}. The live one has `is_published: true`. Up to 5 rows are kept; the oldest archived row is pruned on publish when the cap is exceeded. The in-progress draft (if any) does NOT appear here — it's surfaced as `state.current` from GET /theme.
2223
+ */
2224
+ get: operations["listPropertyThemeVersions"];
2225
+ put?: never;
2226
+ post?: never;
2227
+ delete?: never;
2228
+ options?: never;
2229
+ head?: never;
2230
+ patch?: never;
2231
+ trace?: never;
2232
+ };
2233
+ "/properties/{id}/theme/versions/{version_id}": {
2234
+ parameters: {
2235
+ query?: never;
2236
+ header?: never;
2237
+ path?: never;
2238
+ cookie?: never;
2239
+ };
2240
+ /**
2241
+ * Get a single published/archived version with full config + fonts
2242
+ * @description Used by the CMS to render a past version in the styler in read-only mode. To make it live, call POST /properties/{id}/theme/versions/{version_id}/publish.
2243
+ */
2244
+ get: operations["getPropertyThemeVersion"];
2245
+ put?: never;
2246
+ post?: never;
2247
+ delete?: never;
2248
+ options?: never;
2249
+ head?: never;
2250
+ patch?: never;
2251
+ trace?: never;
2252
+ };
2253
+ "/properties/{id}/theme/versions/{version_id}/publish": {
2254
+ parameters: {
2255
+ query?: never;
2256
+ header?: never;
2257
+ path?: never;
2258
+ cookie?: never;
2259
+ };
2260
+ get?: never;
2261
+ put?: never;
2262
+ /**
2263
+ * Publish a past version (rollback)
2264
+ * @description Make this past version the live one in a single shot.
2265
+ *
2266
+ * - Every row with `version > target.version` is hard-deleted (the previously-live row and any newer archived rows).
2267
+ * - Any in-progress draft is also deleted. The FE must warn the user about unsaved changes BEFORE calling this endpoint.
2268
+ * - The target row's `status` is flipped from `archived` to `published`. Its `version`, `message`, `published_at`, and `published_by_user_id` are preserved (this is a re-promotion, not a new commit).
2269
+ *
2270
+ * Idempotent: if the target is already live (status='published'), returns the current state without changes.
2271
+ */
2272
+ post: operations["publishPropertyThemeVersion"];
2273
+ delete?: never;
2274
+ options?: never;
2275
+ head?: never;
2276
+ patch?: never;
2277
+ trace?: never;
2278
+ };
2077
2279
  "/units": {
2078
2280
  parameters: {
2079
2281
  query?: never;
@@ -2529,7 +2731,7 @@ export interface components {
2529
2731
  * @description Render status for this style on the floor plan
2530
2732
  * @enum {string}
2531
2733
  */
2532
- status?: "UN_RENDERED" | "RENDERING" | "RENDERED" | "FAILED";
2734
+ status?: "UN_RENDERED" | "IN_QUEUE" | "RENDERING" | "RENDERED" | "FAILED";
2533
2735
  };
2534
2736
  /** @description Floor plan with associated rooms and styles */
2535
2737
  FloorPlan: {
@@ -2673,23 +2875,23 @@ export interface components {
2673
2875
  /** @description Furniture category */
2674
2876
  category?: string;
2675
2877
  /** @description Width dimension */
2676
- width?: string;
2878
+ width?: number | null;
2677
2879
  /** @description Depth dimension */
2678
- depth?: string;
2880
+ depth?: number | null;
2679
2881
  /** @description Height dimension */
2680
- height?: string;
2882
+ height?: number | null;
2681
2883
  /**
2682
2884
  * @description Stock availability status
2683
2885
  * @enum {string}
2684
2886
  */
2685
- availability?: "IN_STOCK" | "OUT_OF_STOCK";
2887
+ availability?: "IN_STOCK" | "OUT_OF_STOCK" | "SOLD_OUT" | "WAIT_LIST";
2686
2888
  /** @description Price as formatted string */
2687
2889
  price?: string;
2688
2890
  /**
2689
2891
  * @description Price currency
2690
2892
  * @enum {string}
2691
2893
  */
2692
- currency?: "USD" | "EUR";
2894
+ currency?: "USD" | "EUR" | "GBP";
2693
2895
  /** @description Brand name */
2694
2896
  brand_name?: string;
2695
2897
  /** @description Retailer name */
@@ -2895,6 +3097,92 @@ export interface components {
2895
3097
  /** @description Service-specific additional data (e.g. Hyly URL, Bozzuto siteId) */
2896
3098
  additional_data?: Record<string, never>;
2897
3099
  };
3100
+ /** @description Design-token JSON shared by CMS styler and Embed app. Stored in every row of property_themes. */
3101
+ ThemeConfig: {
3102
+ /** @description H1 / hero heading size in px */
3103
+ heading_size: number;
3104
+ /** @description H2 / subheading size in px */
3105
+ subheading_size: number;
3106
+ /** @description Body text size in px */
3107
+ body_size: number;
3108
+ /** @description Captions / small text size in px */
3109
+ small_body_size: number;
3110
+ /** @description Page background color */
3111
+ color_bg: string;
3112
+ /** @description Primary text color */
3113
+ color_text: string;
3114
+ /** @description Secondary / muted text color */
3115
+ color_text_muted: string;
3116
+ /** @description Primary button background */
3117
+ color_primary_btn_bg: string;
3118
+ /** @description Primary button label color */
3119
+ color_primary_btn_text: string;
3120
+ /** @description Default border color */
3121
+ color_secondary_border: string;
3122
+ /** @description Anchor / link color */
3123
+ color_link: string;
3124
+ /** @description Text color used on darker card surfaces */
3125
+ color_card_text: string;
3126
+ /** @description Button corner radius in px */
3127
+ radius_button: number;
3128
+ /** @description Card corner radius in px */
3129
+ radius_card: number;
3130
+ };
3131
+ /**
3132
+ * @description Which slot the font fills
3133
+ * @enum {string}
3134
+ */
3135
+ ThemeFontRole: "BODY" | "HEADING";
3136
+ /**
3137
+ * @description Font style
3138
+ * @enum {string}
3139
+ */
3140
+ FontStyle: "NORMAL" | "ITALIC";
3141
+ /**
3142
+ * @description Supported font file formats
3143
+ * @enum {string}
3144
+ */
3145
+ FontFormat: "WOFF2" | "WOFF" | "TTF" | "OTF";
3146
+ /** @description An entry in a user's font library */
3147
+ UserFont: {
3148
+ /** @description Font ID */
3149
+ id: number;
3150
+ /** @description Display name shown in the CMS picker */
3151
+ family: string;
3152
+ /** @description Font weight, e.g. 400, 700 */
3153
+ weight: number;
3154
+ style: components["schemas"]["FontStyle"];
3155
+ format: components["schemas"]["FontFormat"];
3156
+ /** @description Hidden from picker but kept around; does not count toward the 5-font limit */
3157
+ is_archived: boolean;
3158
+ /** @description S3 object key under assets/fonts/ */
3159
+ asset_key: string;
3160
+ /** @description Public CDN URL the browser fetches the font from */
3161
+ url: string;
3162
+ /**
3163
+ * Format: date-time
3164
+ * @description Creation timestamp
3165
+ */
3166
+ created_at: string;
3167
+ /**
3168
+ * Format: date-time
3169
+ * @description Last update timestamp
3170
+ */
3171
+ updated_at: string;
3172
+ };
3173
+ /** @description Theme font assignment with the UserFont expanded */
3174
+ ThemeFontRef: {
3175
+ font_id: number;
3176
+ role: components["schemas"]["ThemeFontRole"];
3177
+ font: components["schemas"]["UserFont"];
3178
+ };
3179
+ /** @description The currently-live theme as served to the Embed app. When the property has no published row yet, `config` is the system default and `fonts` is empty (Embed should fall back to its built-in stack). */
3180
+ EmbedTheme: {
3181
+ config: components["schemas"]["ThemeConfig"];
3182
+ fonts: components["schemas"]["ThemeFontRef"][];
3183
+ /** @description Published version number, or null when the property has never published */
3184
+ version: number | null;
3185
+ };
2898
3186
  /** @description Full property data returned by the embed API */
2899
3187
  PropertyResponseData: {
2900
3188
  /** @description Property ID */
@@ -2951,6 +3239,7 @@ export interface components {
2951
3239
  lead_video?: components["schemas"]["Media"];
2952
3240
  /** @description Active external service integrations */
2953
3241
  external_services?: components["schemas"]["ExternalServiceConfig"][];
3242
+ theme?: components["schemas"]["EmbedTheme"];
2954
3243
  };
2955
3244
  /** @description Embed property details response */
2956
3245
  PropertyResponse: {
@@ -3245,6 +3534,117 @@ export interface components {
3245
3534
  filter_id: number;
3246
3535
  };
3247
3536
  };
3537
+ /** @description List of the user's fonts */
3538
+ UserFontsListResponse: {
3539
+ /** @description The user's fonts */
3540
+ data: components["schemas"]["UserFont"][];
3541
+ };
3542
+ /** @description Single font response */
3543
+ UserFontResponse: {
3544
+ data: components["schemas"]["UserFont"];
3545
+ };
3546
+ /** @description Pre-signed URL for direct-to-S3 font upload */
3547
+ FontUploadUrlResponse: {
3548
+ /** @description Upload target */
3549
+ data: {
3550
+ /** @description Pre-signed S3 PUT URL */
3551
+ upload_url: string;
3552
+ /** @description S3 object key the client should later submit to POST /fonts */
3553
+ asset_key: string;
3554
+ };
3555
+ };
3556
+ /** @description A single reference to the font from a currently-published theme version */
3557
+ FontUsageItem: {
3558
+ property_id: number;
3559
+ property_name: string;
3560
+ theme_id: number;
3561
+ /** @description Published version number that references this font */
3562
+ version: number;
3563
+ /** @enum {string} */
3564
+ role: "BODY" | "HEADING";
3565
+ };
3566
+ /** @description Returned with HTTP 409 when attempting to delete a font that is referenced by a currently-published theme version */
3567
+ FontInUseConflictResponse: {
3568
+ /** @description Conflict detail */
3569
+ error: {
3570
+ /** @enum {string} */
3571
+ message: "FONT_USED_IN_PUBLISHED_VERSION";
3572
+ /** @description Where the font is currently referenced */
3573
+ details: {
3574
+ usages: components["schemas"]["FontUsageItem"][];
3575
+ };
3576
+ };
3577
+ };
3578
+ /**
3579
+ * @description Lifecycle state of a theme row. At most one row per property may be in draft or published at a time; archived rows are historical published rows kept for rollback.
3580
+ * @enum {string}
3581
+ */
3582
+ ThemeStatus: "draft" | "published" | "archived";
3583
+ /** @description A (font, role) pair sent by the CMS in draft updates */
3584
+ ThemeFontAssignment: {
3585
+ /** @description UserFont ID */
3586
+ font_id: number;
3587
+ role: components["schemas"]["ThemeFontRole"];
3588
+ };
3589
+ /** @description One row from property_themes */
3590
+ ThemeRow: {
3591
+ /** @description Row id (also the version id for published+archived rows) */
3592
+ id: number;
3593
+ property_id: number;
3594
+ /** @description id of the row this was forked from (null for the very first row) */
3595
+ parent_id: number | null;
3596
+ /** @description Monotonic version number per property. null while status=draft. */
3597
+ version: number | null;
3598
+ status: components["schemas"]["ThemeStatus"];
3599
+ config: components["schemas"]["ThemeConfig"];
3600
+ fonts: components["schemas"]["ThemeFontRef"][];
3601
+ message: string | null;
3602
+ /** Format: date-time */
3603
+ published_at: string | null;
3604
+ /** Format: date-time */
3605
+ created_at: string;
3606
+ /** Format: date-time */
3607
+ updated_at: string;
3608
+ };
3609
+ /** @description Lightweight version row used in the versions list */
3610
+ ThemeVersionSummary: {
3611
+ id: number;
3612
+ /** @description Monotonic per-property version number */
3613
+ version: number;
3614
+ /** @enum {string} */
3615
+ status: "published" | "archived";
3616
+ /** @description Convenience: status === "published" */
3617
+ is_published: boolean;
3618
+ message: string | null;
3619
+ /** Format: date-time */
3620
+ published_at: string | null;
3621
+ /** Format: date-time */
3622
+ created_at: string;
3623
+ };
3624
+ /** @description Full theme state returned by GET /properties/{id}/theme */
3625
+ ThemeState: {
3626
+ current: components["schemas"]["ThemeRow"];
3627
+ live?: components["schemas"]["ThemeRow"];
3628
+ versions: components["schemas"]["ThemeVersionSummary"][];
3629
+ };
3630
+ ThemeStateResponse: {
3631
+ data: components["schemas"]["ThemeState"];
3632
+ };
3633
+ ThemeRowResponse: {
3634
+ data: components["schemas"]["ThemeRow"];
3635
+ };
3636
+ ThemeVersionsListResponse: {
3637
+ data: components["schemas"]["ThemeVersionSummary"][];
3638
+ };
3639
+ /** @description Replace-style update. The provided fonts become the new draft font set; the prior set (if any) is dropped. */
3640
+ UpdateThemeDraftPayload: {
3641
+ config: components["schemas"]["ThemeConfig"];
3642
+ fonts: components["schemas"]["ThemeFontAssignment"][];
3643
+ };
3644
+ PublishThemePayload: {
3645
+ /** @description Optional commit-style note shown in the version list */
3646
+ message?: string;
3647
+ };
3248
3648
  };
3249
3649
  responses: never;
3250
3650
  parameters: never;
@@ -4401,13 +4801,10 @@ export interface operations {
4401
4801
  };
4402
4802
  };
4403
4803
  };
4404
- listFloorPlans: {
4804
+ listUserFonts: {
4405
4805
  parameters: {
4406
4806
  query?: {
4407
- page?: number;
4408
- limit?: number;
4409
- search?: string;
4410
- sort_order?: "asc" | "desc";
4807
+ include_archived?: "true" | "false";
4411
4808
  };
4412
4809
  header?: never;
4413
4810
  path?: never;
@@ -4421,12 +4818,26 @@ export interface operations {
4421
4818
  [name: string]: unknown;
4422
4819
  };
4423
4820
  content: {
4424
- "application/json": components["schemas"]["FloorPlan"][];
4821
+ "application/json": components["schemas"]["UserFontsListResponse"];
4822
+ };
4823
+ };
4824
+ /** @description Unauthorized */
4825
+ 401: {
4826
+ headers: {
4827
+ [name: string]: unknown;
4828
+ };
4829
+ content?: never;
4830
+ };
4831
+ /** @description Internal Server Error */
4832
+ 500: {
4833
+ headers: {
4834
+ [name: string]: unknown;
4425
4835
  };
4836
+ content?: never;
4426
4837
  };
4427
4838
  };
4428
4839
  };
4429
- createFloorPlan: {
4840
+ createUserFont: {
4430
4841
  parameters: {
4431
4842
  query?: never;
4432
4843
  header?: never;
@@ -4436,38 +4847,281 @@ export interface operations {
4436
4847
  requestBody: {
4437
4848
  content: {
4438
4849
  "application/json": {
4439
- name: string;
4440
- description?: string;
4441
- customer_id: number;
4442
- render_version?: number;
4443
- property_ids: number[];
4850
+ /** @description S3 key returned by /fonts/upload-url */
4851
+ asset_key: string;
4852
+ /** @description Display name shown in the CMS picker */
4853
+ family: string;
4854
+ /** @description Default 400 */
4855
+ weight?: number;
4856
+ style?: components["schemas"]["FontStyle"];
4857
+ format: components["schemas"]["FontFormat"];
4444
4858
  };
4445
4859
  };
4446
4860
  };
4447
4861
  responses: {
4448
- /** @description Created */
4449
- 201: {
4862
+ /** @description OK */
4863
+ 200: {
4450
4864
  headers: {
4451
4865
  [name: string]: unknown;
4452
4866
  };
4453
4867
  content: {
4454
- "application/json": components["schemas"]["FloorPlan"];
4868
+ "application/json": components["schemas"]["UserFontResponse"];
4455
4869
  };
4456
4870
  };
4457
- /** @description Unprocessable Entity */
4871
+ /** @description Unauthorized */
4872
+ 401: {
4873
+ headers: {
4874
+ [name: string]: unknown;
4875
+ };
4876
+ content?: never;
4877
+ };
4878
+ /** @description Font library is full (max 5 non-archived fonts) */
4879
+ 409: {
4880
+ headers: {
4881
+ [name: string]: unknown;
4882
+ };
4883
+ content?: never;
4884
+ };
4885
+ /** @description Validation error (e.g. asset_key not in user namespace) */
4458
4886
  422: {
4459
4887
  headers: {
4460
4888
  [name: string]: unknown;
4461
4889
  };
4462
4890
  content?: never;
4463
4891
  };
4892
+ /** @description Internal Server Error */
4893
+ 500: {
4894
+ headers: {
4895
+ [name: string]: unknown;
4896
+ };
4897
+ content?: never;
4898
+ };
4464
4899
  };
4465
4900
  };
4466
- getFloorPlan: {
4901
+ getFontUploadUrl: {
4467
4902
  parameters: {
4468
- query?: never;
4903
+ query: {
4904
+ /** @description File format; determines the S3 key extension */
4905
+ format: components["schemas"]["FontFormat"];
4906
+ };
4469
4907
  header?: never;
4470
- path: {
4908
+ path?: never;
4909
+ cookie?: never;
4910
+ };
4911
+ requestBody?: never;
4912
+ responses: {
4913
+ /** @description OK */
4914
+ 200: {
4915
+ headers: {
4916
+ [name: string]: unknown;
4917
+ };
4918
+ content: {
4919
+ "application/json": components["schemas"]["FontUploadUrlResponse"];
4920
+ };
4921
+ };
4922
+ /** @description Unauthorized */
4923
+ 401: {
4924
+ headers: {
4925
+ [name: string]: unknown;
4926
+ };
4927
+ content?: never;
4928
+ };
4929
+ /** @description Font library is full (max 5 non-archived fonts) */
4930
+ 409: {
4931
+ headers: {
4932
+ [name: string]: unknown;
4933
+ };
4934
+ content?: never;
4935
+ };
4936
+ /** @description Internal Server Error */
4937
+ 500: {
4938
+ headers: {
4939
+ [name: string]: unknown;
4940
+ };
4941
+ content?: never;
4942
+ };
4943
+ };
4944
+ };
4945
+ updateUserFont: {
4946
+ parameters: {
4947
+ query?: never;
4948
+ header?: never;
4949
+ path: {
4950
+ id: number;
4951
+ };
4952
+ cookie?: never;
4953
+ };
4954
+ requestBody: {
4955
+ content: {
4956
+ "application/json": {
4957
+ family?: string;
4958
+ is_archived?: boolean;
4959
+ };
4960
+ };
4961
+ };
4962
+ responses: {
4963
+ /** @description OK */
4964
+ 200: {
4965
+ headers: {
4966
+ [name: string]: unknown;
4967
+ };
4968
+ content: {
4969
+ "application/json": components["schemas"]["UserFontResponse"];
4970
+ };
4971
+ };
4972
+ /** @description Unauthorized */
4973
+ 401: {
4974
+ headers: {
4975
+ [name: string]: unknown;
4976
+ };
4977
+ content?: never;
4978
+ };
4979
+ /** @description Font not found */
4980
+ 404: {
4981
+ headers: {
4982
+ [name: string]: unknown;
4983
+ };
4984
+ content?: never;
4985
+ };
4986
+ /** @description Validation error */
4987
+ 422: {
4988
+ headers: {
4989
+ [name: string]: unknown;
4990
+ };
4991
+ content?: never;
4992
+ };
4993
+ /** @description Internal Server Error */
4994
+ 500: {
4995
+ headers: {
4996
+ [name: string]: unknown;
4997
+ };
4998
+ content?: never;
4999
+ };
5000
+ };
5001
+ };
5002
+ deleteUserFont: {
5003
+ parameters: {
5004
+ query?: never;
5005
+ header?: never;
5006
+ path: {
5007
+ id: number;
5008
+ };
5009
+ cookie?: never;
5010
+ };
5011
+ requestBody?: never;
5012
+ responses: {
5013
+ /** @description OK */
5014
+ 200: {
5015
+ headers: {
5016
+ [name: string]: unknown;
5017
+ };
5018
+ content: {
5019
+ "application/json": {
5020
+ data: {
5021
+ id: number;
5022
+ };
5023
+ };
5024
+ };
5025
+ };
5026
+ /** @description Unauthorized */
5027
+ 401: {
5028
+ headers: {
5029
+ [name: string]: unknown;
5030
+ };
5031
+ content?: never;
5032
+ };
5033
+ /** @description Font not found */
5034
+ 404: {
5035
+ headers: {
5036
+ [name: string]: unknown;
5037
+ };
5038
+ content?: never;
5039
+ };
5040
+ /** @description Font is in use by a currently-published theme version. The response body lists the affected properties / themes / roles. */
5041
+ 409: {
5042
+ headers: {
5043
+ [name: string]: unknown;
5044
+ };
5045
+ content: {
5046
+ "application/json": components["schemas"]["FontInUseConflictResponse"];
5047
+ };
5048
+ };
5049
+ /** @description Internal Server Error */
5050
+ 500: {
5051
+ headers: {
5052
+ [name: string]: unknown;
5053
+ };
5054
+ content?: never;
5055
+ };
5056
+ };
5057
+ };
5058
+ listFloorPlans: {
5059
+ parameters: {
5060
+ query?: {
5061
+ page?: number;
5062
+ limit?: number;
5063
+ search?: string;
5064
+ sort_order?: "asc" | "desc";
5065
+ };
5066
+ header?: never;
5067
+ path?: never;
5068
+ cookie?: never;
5069
+ };
5070
+ requestBody?: never;
5071
+ responses: {
5072
+ /** @description OK */
5073
+ 200: {
5074
+ headers: {
5075
+ [name: string]: unknown;
5076
+ };
5077
+ content: {
5078
+ "application/json": components["schemas"]["FloorPlan"][];
5079
+ };
5080
+ };
5081
+ };
5082
+ };
5083
+ createFloorPlan: {
5084
+ parameters: {
5085
+ query?: never;
5086
+ header?: never;
5087
+ path?: never;
5088
+ cookie?: never;
5089
+ };
5090
+ requestBody: {
5091
+ content: {
5092
+ "application/json": {
5093
+ name: string;
5094
+ description?: string;
5095
+ customer_id: number;
5096
+ render_version?: number;
5097
+ property_ids: number[];
5098
+ };
5099
+ };
5100
+ };
5101
+ responses: {
5102
+ /** @description Created */
5103
+ 201: {
5104
+ headers: {
5105
+ [name: string]: unknown;
5106
+ };
5107
+ content: {
5108
+ "application/json": components["schemas"]["FloorPlan"];
5109
+ };
5110
+ };
5111
+ /** @description Unprocessable Entity */
5112
+ 422: {
5113
+ headers: {
5114
+ [name: string]: unknown;
5115
+ };
5116
+ content?: never;
5117
+ };
5118
+ };
5119
+ };
5120
+ getFloorPlan: {
5121
+ parameters: {
5122
+ query?: never;
5123
+ header?: never;
5124
+ path: {
4471
5125
  id: number;
4472
5126
  };
4473
5127
  cookie?: never;
@@ -6872,8 +7526,8 @@ export interface operations {
6872
7526
  page?: number;
6873
7527
  limit?: number;
6874
7528
  search?: string;
6875
- sortBy?: "createdAt" | "status";
6876
- sortDirection?: "asc" | "desc";
7529
+ sort_by?: "created_at" | "status";
7530
+ sort_direction?: "asc" | "desc";
6877
7531
  };
6878
7532
  header?: never;
6879
7533
  path?: never;
@@ -7690,6 +8344,331 @@ export interface operations {
7690
8344
  };
7691
8345
  };
7692
8346
  };
8347
+ getPropertyTheme: {
8348
+ parameters: {
8349
+ query?: never;
8350
+ header?: never;
8351
+ path: {
8352
+ id: number;
8353
+ };
8354
+ cookie?: never;
8355
+ };
8356
+ requestBody?: never;
8357
+ responses: {
8358
+ /** @description OK */
8359
+ 200: {
8360
+ headers: {
8361
+ [name: string]: unknown;
8362
+ };
8363
+ content: {
8364
+ "application/json": components["schemas"]["ThemeStateResponse"];
8365
+ };
8366
+ };
8367
+ /** @description Unauthorized */
8368
+ 401: {
8369
+ headers: {
8370
+ [name: string]: unknown;
8371
+ };
8372
+ content?: never;
8373
+ };
8374
+ /** @description Property or theme not found */
8375
+ 404: {
8376
+ headers: {
8377
+ [name: string]: unknown;
8378
+ };
8379
+ content?: never;
8380
+ };
8381
+ /** @description Internal Server Error */
8382
+ 500: {
8383
+ headers: {
8384
+ [name: string]: unknown;
8385
+ };
8386
+ content?: never;
8387
+ };
8388
+ };
8389
+ };
8390
+ updatePropertyThemeDraft: {
8391
+ parameters: {
8392
+ query?: never;
8393
+ header?: never;
8394
+ path: {
8395
+ id: number;
8396
+ };
8397
+ cookie?: never;
8398
+ };
8399
+ requestBody: {
8400
+ content: {
8401
+ "application/json": components["schemas"]["UpdateThemeDraftPayload"];
8402
+ };
8403
+ };
8404
+ responses: {
8405
+ /** @description OK */
8406
+ 200: {
8407
+ headers: {
8408
+ [name: string]: unknown;
8409
+ };
8410
+ content: {
8411
+ "application/json": components["schemas"]["ThemeStateResponse"];
8412
+ };
8413
+ };
8414
+ /** @description Unauthorized */
8415
+ 401: {
8416
+ headers: {
8417
+ [name: string]: unknown;
8418
+ };
8419
+ content?: never;
8420
+ };
8421
+ /** @description Property or theme not found */
8422
+ 404: {
8423
+ headers: {
8424
+ [name: string]: unknown;
8425
+ };
8426
+ content?: never;
8427
+ };
8428
+ /** @description Validation error (invalid config shape, duplicate role in fonts, or font_id not owned by user / archived) */
8429
+ 422: {
8430
+ headers: {
8431
+ [name: string]: unknown;
8432
+ };
8433
+ content?: never;
8434
+ };
8435
+ /** @description Internal Server Error */
8436
+ 500: {
8437
+ headers: {
8438
+ [name: string]: unknown;
8439
+ };
8440
+ content?: never;
8441
+ };
8442
+ };
8443
+ };
8444
+ discardPropertyThemeDraft: {
8445
+ parameters: {
8446
+ query?: never;
8447
+ header?: never;
8448
+ path: {
8449
+ id: number;
8450
+ };
8451
+ cookie?: never;
8452
+ };
8453
+ requestBody?: never;
8454
+ responses: {
8455
+ /** @description OK */
8456
+ 200: {
8457
+ headers: {
8458
+ [name: string]: unknown;
8459
+ };
8460
+ content: {
8461
+ "application/json": components["schemas"]["ThemeStateResponse"];
8462
+ };
8463
+ };
8464
+ /** @description Unauthorized */
8465
+ 401: {
8466
+ headers: {
8467
+ [name: string]: unknown;
8468
+ };
8469
+ content?: never;
8470
+ };
8471
+ /** @description Property or theme not found */
8472
+ 404: {
8473
+ headers: {
8474
+ [name: string]: unknown;
8475
+ };
8476
+ content?: never;
8477
+ };
8478
+ /** @description Internal Server Error */
8479
+ 500: {
8480
+ headers: {
8481
+ [name: string]: unknown;
8482
+ };
8483
+ content?: never;
8484
+ };
8485
+ };
8486
+ };
8487
+ publishPropertyTheme: {
8488
+ parameters: {
8489
+ query?: never;
8490
+ header?: never;
8491
+ path: {
8492
+ id: number;
8493
+ };
8494
+ cookie?: never;
8495
+ };
8496
+ requestBody?: {
8497
+ content: {
8498
+ "application/json": components["schemas"]["PublishThemePayload"];
8499
+ };
8500
+ };
8501
+ responses: {
8502
+ /** @description OK */
8503
+ 200: {
8504
+ headers: {
8505
+ [name: string]: unknown;
8506
+ };
8507
+ content: {
8508
+ "application/json": components["schemas"]["ThemeStateResponse"];
8509
+ };
8510
+ };
8511
+ /** @description Unauthorized */
8512
+ 401: {
8513
+ headers: {
8514
+ [name: string]: unknown;
8515
+ };
8516
+ content?: never;
8517
+ };
8518
+ /** @description Property or theme not found */
8519
+ 404: {
8520
+ headers: {
8521
+ [name: string]: unknown;
8522
+ };
8523
+ content?: never;
8524
+ };
8525
+ /** @description No in-progress draft to publish */
8526
+ 422: {
8527
+ headers: {
8528
+ [name: string]: unknown;
8529
+ };
8530
+ content?: never;
8531
+ };
8532
+ /** @description Internal Server Error */
8533
+ 500: {
8534
+ headers: {
8535
+ [name: string]: unknown;
8536
+ };
8537
+ content?: never;
8538
+ };
8539
+ };
8540
+ };
8541
+ listPropertyThemeVersions: {
8542
+ parameters: {
8543
+ query?: never;
8544
+ header?: never;
8545
+ path: {
8546
+ id: number;
8547
+ };
8548
+ cookie?: never;
8549
+ };
8550
+ requestBody?: never;
8551
+ responses: {
8552
+ /** @description OK */
8553
+ 200: {
8554
+ headers: {
8555
+ [name: string]: unknown;
8556
+ };
8557
+ content: {
8558
+ "application/json": components["schemas"]["ThemeVersionsListResponse"];
8559
+ };
8560
+ };
8561
+ /** @description Unauthorized */
8562
+ 401: {
8563
+ headers: {
8564
+ [name: string]: unknown;
8565
+ };
8566
+ content?: never;
8567
+ };
8568
+ /** @description Property or theme not found */
8569
+ 404: {
8570
+ headers: {
8571
+ [name: string]: unknown;
8572
+ };
8573
+ content?: never;
8574
+ };
8575
+ /** @description Internal Server Error */
8576
+ 500: {
8577
+ headers: {
8578
+ [name: string]: unknown;
8579
+ };
8580
+ content?: never;
8581
+ };
8582
+ };
8583
+ };
8584
+ getPropertyThemeVersion: {
8585
+ parameters: {
8586
+ query?: never;
8587
+ header?: never;
8588
+ path: {
8589
+ id: number;
8590
+ version_id: number;
8591
+ };
8592
+ cookie?: never;
8593
+ };
8594
+ requestBody?: never;
8595
+ responses: {
8596
+ /** @description OK */
8597
+ 200: {
8598
+ headers: {
8599
+ [name: string]: unknown;
8600
+ };
8601
+ content: {
8602
+ "application/json": components["schemas"]["ThemeRowResponse"];
8603
+ };
8604
+ };
8605
+ /** @description Unauthorized */
8606
+ 401: {
8607
+ headers: {
8608
+ [name: string]: unknown;
8609
+ };
8610
+ content?: never;
8611
+ };
8612
+ /** @description Version not found */
8613
+ 404: {
8614
+ headers: {
8615
+ [name: string]: unknown;
8616
+ };
8617
+ content?: never;
8618
+ };
8619
+ /** @description Internal Server Error */
8620
+ 500: {
8621
+ headers: {
8622
+ [name: string]: unknown;
8623
+ };
8624
+ content?: never;
8625
+ };
8626
+ };
8627
+ };
8628
+ publishPropertyThemeVersion: {
8629
+ parameters: {
8630
+ query?: never;
8631
+ header?: never;
8632
+ path: {
8633
+ id: number;
8634
+ version_id: number;
8635
+ };
8636
+ cookie?: never;
8637
+ };
8638
+ requestBody?: never;
8639
+ responses: {
8640
+ /** @description OK */
8641
+ 200: {
8642
+ headers: {
8643
+ [name: string]: unknown;
8644
+ };
8645
+ content: {
8646
+ "application/json": components["schemas"]["ThemeStateResponse"];
8647
+ };
8648
+ };
8649
+ /** @description Unauthorized */
8650
+ 401: {
8651
+ headers: {
8652
+ [name: string]: unknown;
8653
+ };
8654
+ content?: never;
8655
+ };
8656
+ /** @description Version not found */
8657
+ 404: {
8658
+ headers: {
8659
+ [name: string]: unknown;
8660
+ };
8661
+ content?: never;
8662
+ };
8663
+ /** @description Internal Server Error */
8664
+ 500: {
8665
+ headers: {
8666
+ [name: string]: unknown;
8667
+ };
8668
+ content?: never;
8669
+ };
8670
+ };
8671
+ };
7693
8672
  listUnits: {
7694
8673
  parameters: {
7695
8674
  query?: {