@expofp/schema 0.0.0-experimental.cf063fc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/index.d.ts +24 -0
  2. package/dist/index.js +23 -0
  3. package/dist/lib/booth.d.ts +74 -0
  4. package/dist/lib/booth.js +35 -0
  5. package/dist/lib/branding.d.ts +21 -0
  6. package/dist/lib/branding.js +20 -0
  7. package/dist/lib/camera.d.ts +24 -0
  8. package/dist/lib/camera.js +36 -0
  9. package/dist/lib/categories.d.ts +9 -0
  10. package/dist/lib/categories.js +7 -0
  11. package/dist/lib/config-defaults.d.ts +147 -0
  12. package/dist/lib/config-defaults.js +164 -0
  13. package/dist/lib/config.d.ts +2146 -0
  14. package/dist/lib/config.js +438 -0
  15. package/dist/lib/exhibitor.d.ts +66 -0
  16. package/dist/lib/exhibitor.js +69 -0
  17. package/dist/lib/filters.d.ts +23 -0
  18. package/dist/lib/filters.js +24 -0
  19. package/dist/lib/flags.d.ts +17 -0
  20. package/dist/lib/flags.js +63 -0
  21. package/dist/lib/fp-geo.d.ts +105 -0
  22. package/dist/lib/fp-geo.js +55 -0
  23. package/dist/lib/fp-svg.d.ts +399 -0
  24. package/dist/lib/fp-svg.js +196 -0
  25. package/dist/lib/heatmap.d.ts +23 -0
  26. package/dist/lib/heatmap.js +24 -0
  27. package/dist/lib/intents.d.ts +173 -0
  28. package/dist/lib/intents.js +153 -0
  29. package/dist/lib/journey.d.ts +27 -0
  30. package/dist/lib/journey.js +26 -0
  31. package/dist/lib/kiosk.d.ts +39 -0
  32. package/dist/lib/kiosk.js +65 -0
  33. package/dist/lib/maplibre.d.ts +43 -0
  34. package/dist/lib/maplibre.js +51 -0
  35. package/dist/lib/maps.d.ts +22 -0
  36. package/dist/lib/maps.js +19 -0
  37. package/dist/lib/poi-types.d.ts +13 -0
  38. package/dist/lib/poi-types.js +17 -0
  39. package/dist/lib/schedule.d.ts +25 -0
  40. package/dist/lib/schedule.js +20 -0
  41. package/dist/lib/search.d.ts +51 -0
  42. package/dist/lib/search.js +36 -0
  43. package/dist/lib/venues.d.ts +222 -0
  44. package/dist/lib/venues.js +150 -0
  45. package/dist/lib/visibility.d.ts +17 -0
  46. package/dist/lib/visibility.js +23 -0
  47. package/dist/lib/wayfinding.d.ts +104 -0
  48. package/dist/lib/wayfinding.js +52 -0
  49. package/package.json +35 -0
@@ -0,0 +1,65 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * The kiosk anchor — the `config.kiosk` node: where the physical kiosk device
4
+ * stands and how its camera is framed. Applied at boot when the device has no
5
+ * locally-saved kiosk (the on-device SetKiosk flow persists to localStorage
6
+ * and wins over the config; the `localStorage['kiosk']='0'` device switch
7
+ * disables both). `?kiosk=1/0` keeps toggling kiosk MODE — the mode and the
8
+ * anchor are independent inputs.
9
+ *
10
+ * The legacy `kiosk_x/y/z` params are a narrower, per-navigation channel for
11
+ * one purpose: a kiosk's route QR code hands the scanning phone the anchor
12
+ * POSITION so the route's missing starting point resolves there. The framing
13
+ * fields below travel only in this node, never through those params, and the
14
+ * params put the scanning device in no kiosk mode of its own.
15
+ */
16
+ export const KioskSchema = z.object({
17
+ /** Anchor x in plan coordinates. */
18
+ x: z.number().optional(),
19
+ /** Anchor y in plan coordinates. */
20
+ y: z.number().optional(),
21
+ /**
22
+ * Floor: the level name (a numeric index is accepted and stringified).
23
+ * Nullable — the on-device SetKiosk flow writes `null` for a plan with no
24
+ * layers, and that record round-trips through localStorage.
25
+ */
26
+ z: z.union([z.string(), z.number()]).nullish(),
27
+ /** Device heading in degrees — rotates the you-are-here marker. */
28
+ heading: z.number().optional(),
29
+ /** GPS latitude (with `lng`, an alternative fix to `x`/`y`). */
30
+ lat: z.number().optional(),
31
+ /** GPS longitude. */
32
+ lng: z.number().optional(),
33
+ /** You-are-here icon size, in percent. */
34
+ iconSizePercent: z.number().optional(),
35
+ /** Per-device UI scale preference (the applied range is 0.8–1.4). */
36
+ uiScale: z.number().optional(),
37
+ // the saved camera framing on the plan renderer — SetKiosk captures the
38
+ // renderer's camera state
39
+ /** Map roll at the kiosk's home framing, degrees. */
40
+ mapRollDegrees: z.number().optional(),
41
+ /** The pt-scale captured when the kiosk was set up (zoom reference). */
42
+ mapInitialPtScale: z.number().optional(),
43
+ /** The pt-scale of the saved framing. */
44
+ mapPtScale: z.number().optional(),
45
+ /** Home framing center x. */
46
+ mapCenterX: z.number().optional(),
47
+ /** Home framing center y. */
48
+ mapCenterY: z.number().optional(),
49
+ /** Map pitch at the home framing, degrees. */
50
+ mapPitch: z.number().optional(),
51
+ // the map-mode framing — with the MapLibre basemap the plan renderer's camera
52
+ // is inert, so the home view is captured as the map's own camera instead. The
53
+ // two sets are fully independent, pitch included: a kiosk carries whichever
54
+ // set its mode captured, and capturing in one mode never writes the other's.
55
+ /** Home framing center longitude (map mode). */
56
+ mapCenterLng: z.number().optional(),
57
+ /** Home framing center latitude (map mode). */
58
+ mapCenterLat: z.number().optional(),
59
+ /** Map zoom level at the home framing (map mode). */
60
+ mapZoom: z.number().optional(),
61
+ /** Map bearing at the home framing, degrees (map mode). */
62
+ mapBearingDegrees: z.number().optional(),
63
+ /** Map pitch at the home framing, degrees (map mode). */
64
+ mapPitchDegrees: z.number().optional(),
65
+ });
@@ -0,0 +1,43 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * MapLibre GL JS integration settings — the config's `maplibre` field.
4
+ *
5
+ * The style document is MapLibre's, not ours. Offline archives store the
6
+ * style URL and the style's internal URLs (sprite, glyphs, tile sources)
7
+ * relative to their containing documents, so the archive stays relocatable;
8
+ * see the offline package's `generateOfflineMapData`.
9
+ *
10
+ * MapLibre itself, though, requires those internal URLs to be *fully absolute*
11
+ * (scheme + host) and rejects rooted/relative ones — and only the runtime
12
+ * knows the serving origin. So the SDK absolutizes string-URL styles' internal
13
+ * resources against the style's own URL through MapLibre's `transformStyle`
14
+ * hook at load time (`createStyleTransform` in the floorplan's Maplibre
15
+ * wrapper).
16
+ */
17
+ export declare const MapLibreConfigSchema: z.ZodObject<{
18
+ styleUrl: z.ZodOptional<z.ZodString>;
19
+ style: z.ZodOptional<z.ZodAny>;
20
+ offline: z.ZodOptional<z.ZodBoolean>;
21
+ }, z.core.$loose>;
22
+ /** MapLibre options — the inferred type of {@link MapLibreConfigSchema}. */
23
+ export type MaplibreOptions = z.infer<typeof MapLibreConfigSchema>;
24
+ /**
25
+ * Which basemap palette the map view uses.
26
+ *
27
+ * The drawing decides, not the visitor and not the host: the Designer writes
28
+ * the palette it was authored for into `__fpGeo.properties.config.style`
29
+ * ({@link FpGeoConfigSchema}), and when that is unset the SDK falls back to the
30
+ * lightness of the drawing's `__fpSettings.backgroundColor`. Those two are the
31
+ * only sources — the palette is not a config field.
32
+ *
33
+ * Resolved once when the map mounts. Only the basemap responds to it today, and
34
+ * an explicit `maplibre.style` / `maplibre.styleUrl` is a complete style
35
+ * document that wins over the theme entirely.
36
+ */
37
+ export declare const MapThemeSchema: z.ZodEnum<{
38
+ dark: "dark";
39
+ light: "light";
40
+ }>;
41
+ /** Basemap palette — the inferred type of {@link MapThemeSchema}. */
42
+ export type MapTheme = z.infer<typeof MapThemeSchema>;
43
+ //# sourceMappingURL=maplibre.d.ts.map
@@ -0,0 +1,51 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * MapLibre GL JS integration settings — the config's `maplibre` field.
4
+ *
5
+ * The style document is MapLibre's, not ours. Offline archives store the
6
+ * style URL and the style's internal URLs (sprite, glyphs, tile sources)
7
+ * relative to their containing documents, so the archive stays relocatable;
8
+ * see the offline package's `generateOfflineMapData`.
9
+ *
10
+ * MapLibre itself, though, requires those internal URLs to be *fully absolute*
11
+ * (scheme + host) and rejects rooted/relative ones — and only the runtime
12
+ * knows the serving origin. So the SDK absolutizes string-URL styles' internal
13
+ * resources against the style's own URL through MapLibre's `transformStyle`
14
+ * hook at load time (`createStyleTransform` in the floorplan's Maplibre
15
+ * wrapper).
16
+ */
17
+ export const MapLibreConfigSchema = z
18
+ .looseObject({
19
+ /**
20
+ * Full, rooted, or relative URL of a MapLibre style document, fetched by
21
+ * MapLibre GL itself. Its internal resources are resolved by the SDK before
22
+ * MapLibre consumes the loaded style.
23
+ */
24
+ styleUrl: z.string(),
25
+ /**
26
+ * Inline style object (takes precedence over `styleUrl`). With no style
27
+ * URL to resolve against, every URL inside it must already be full.
28
+ */
29
+ style: z.any(),
30
+ /**
31
+ * The style and everything it references (tiles, sprites, glyphs) are
32
+ * reachable without network — lets the map stay enabled while
33
+ * `navigator.onLine` is false.
34
+ */
35
+ offline: z.boolean(),
36
+ })
37
+ .partial();
38
+ /**
39
+ * Which basemap palette the map view uses.
40
+ *
41
+ * The drawing decides, not the visitor and not the host: the Designer writes
42
+ * the palette it was authored for into `__fpGeo.properties.config.style`
43
+ * ({@link FpGeoConfigSchema}), and when that is unset the SDK falls back to the
44
+ * lightness of the drawing's `__fpSettings.backgroundColor`. Those two are the
45
+ * only sources — the palette is not a config field.
46
+ *
47
+ * Resolved once when the map mounts. Only the basemap responds to it today, and
48
+ * an explicit `maplibre.style` / `maplibre.styleUrl` is a complete style
49
+ * document that wins over the theme entirely.
50
+ */
51
+ export const MapThemeSchema = z.enum(['light', 'dark']);
@@ -0,0 +1,22 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * The external maps provider a cross-venue journey's external handoff opens.
4
+ *
5
+ * Only the two whose universal URL forms the SDK builds: any other value is a
6
+ * dead link, so the enum is closed rather than an open string.
7
+ */
8
+ export declare const MapsProviderSchema: z.ZodEnum<{
9
+ apple: "apple";
10
+ google: "google";
11
+ }>;
12
+ export type MapsProvider = z.infer<typeof MapsProviderSchema>;
13
+ /**
14
+ * Whether a value is a provider the handoff can actually open.
15
+ *
16
+ * The effective config merges producer-authored layers tolerantly (a manifest
17
+ * or `data.js` is only parsed strictly under `?validateSchema`), so a typed
18
+ * `mapsProvider` can still carry an unmodeled string at runtime — consumers
19
+ * check before honoring the override.
20
+ */
21
+ export declare function isMapsProvider(value: unknown): value is MapsProvider;
22
+ //# sourceMappingURL=maps.d.ts.map
@@ -0,0 +1,19 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * The external maps provider a cross-venue journey's external handoff opens.
4
+ *
5
+ * Only the two whose universal URL forms the SDK builds: any other value is a
6
+ * dead link, so the enum is closed rather than an open string.
7
+ */
8
+ export const MapsProviderSchema = z.enum(['apple', 'google']);
9
+ /**
10
+ * Whether a value is a provider the handoff can actually open.
11
+ *
12
+ * The effective config merges producer-authored layers tolerantly (a manifest
13
+ * or `data.js` is only parsed strictly under `?validateSchema`), so a typed
14
+ * `mapsProvider` can still carry an unmodeled string at runtime — consumers
15
+ * check before honoring the override.
16
+ */
17
+ export function isMapsProvider(value) {
18
+ return MapsProviderSchema.safeParse(value).success;
19
+ }
@@ -0,0 +1,13 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * A point-of-interest type — an entry in the config's `poiTypes` list.
4
+ * `parentId` nests them into a shallow tree.
5
+ */
6
+ export declare const RawPoiTypeSchema: z.ZodObject<{
7
+ id: z.ZodNumber;
8
+ name: z.ZodString;
9
+ parentId: z.ZodOptional<z.ZodNumber>;
10
+ iconUrl: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$loose>;
12
+ export type RawPoiType = z.infer<typeof RawPoiTypeSchema>;
13
+ //# sourceMappingURL=poi-types.d.ts.map
@@ -0,0 +1,17 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * A point-of-interest type — an entry in the config's `poiTypes` list.
4
+ * `parentId` nests them into a shallow tree.
5
+ */
6
+ export const RawPoiTypeSchema = z.looseObject({
7
+ id: z.number(),
8
+ name: z.string(),
9
+ parentId: z.number().optional(),
10
+ /**
11
+ * Icon shown for this type; overrides the built-in glyph. A resource like
12
+ * the event logo, and optional like it too: serialization (offline copies,
13
+ * normalized folders) copies the file best-effort and drops the field when
14
+ * it is missing — the built-in glyph is the fallback either way.
15
+ */
16
+ iconUrl: z.string().optional().meta({ asset: true, optionalAsset: true }),
17
+ });
@@ -0,0 +1,25 @@
1
+ import * as z from 'zod';
2
+ /** A session speaker — an entry in a {@link ScheduleItemSchema}'s `speakers`. */
3
+ export declare const SpeakerSchema: z.ZodObject<{
4
+ photoFile: z.ZodOptional<z.ZodString>;
5
+ }, z.core.$loose>;
6
+ /** One agenda/session entry — an entry in the config's `events` list. */
7
+ export declare const ScheduleItemSchema: z.ZodObject<{
8
+ id: z.ZodNumber;
9
+ name: z.ZodString;
10
+ externalId: z.ZodOptional<z.ZodString>;
11
+ description: z.ZodOptional<z.ZodString>;
12
+ exhibitorId: z.ZodOptional<z.ZodNumber>;
13
+ boothId: z.ZodOptional<z.ZodNumber>;
14
+ startDate: z.ZodOptional<z.ZodString>;
15
+ endDate: z.ZodOptional<z.ZodString>;
16
+ link: z.ZodOptional<z.ZodString>;
17
+ logoFile: z.ZodOptional<z.ZodString>;
18
+ speakers: z.ZodOptional<z.ZodArray<z.ZodObject<{
19
+ photoFile: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$loose>>>;
21
+ tracks: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
22
+ }, z.core.$loose>;
23
+ export type Speaker = z.infer<typeof SpeakerSchema>;
24
+ export type ScheduleItem = z.infer<typeof ScheduleItemSchema>;
25
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1,20 @@
1
+ import * as z from 'zod';
2
+ /** A session speaker — an entry in a {@link ScheduleItemSchema}'s `speakers`. */
3
+ export const SpeakerSchema = z.looseObject({
4
+ photoFile: z.string().optional().meta({ asset: true }),
5
+ });
6
+ /** One agenda/session entry — an entry in the config's `events` list. */
7
+ export const ScheduleItemSchema = z.looseObject({
8
+ id: z.number(),
9
+ name: z.string(),
10
+ externalId: z.string().optional(),
11
+ description: z.string().optional(),
12
+ exhibitorId: z.number().optional(),
13
+ boothId: z.number().optional(),
14
+ startDate: z.string().optional(),
15
+ endDate: z.string().optional(),
16
+ link: z.string().optional(),
17
+ logoFile: z.string().optional().meta({ asset: true }),
18
+ speakers: z.array(SpeakerSchema).optional(),
19
+ tracks: z.array(z.unknown()).optional(),
20
+ });
@@ -0,0 +1,51 @@
1
+ import * as z from 'zod';
2
+ export declare const SearchButtonChildSchema: z.ZodObject<{
3
+ id: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
4
+ type: z.ZodString;
5
+ name: z.ZodOptional<z.ZodString>;
6
+ visible: z.ZodOptional<z.ZodBoolean>;
7
+ count: z.ZodOptional<z.ZodNumber>;
8
+ linkUrl: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$loose>;
10
+ /** One search/filter button — an entry in `filterButtonsConfig.searchButtons`. */
11
+ export declare const SearchButtonSchema: z.ZodObject<{
12
+ id: z.ZodOptional<z.ZodString>;
13
+ type: z.ZodString;
14
+ name: z.ZodString;
15
+ visible: z.ZodOptional<z.ZodBoolean>;
16
+ builtIn: z.ZodOptional<z.ZodBoolean>;
17
+ order: z.ZodOptional<z.ZodNumber>;
18
+ children: z.ZodOptional<z.ZodArray<z.ZodObject<{
19
+ id: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
20
+ type: z.ZodString;
21
+ name: z.ZodOptional<z.ZodString>;
22
+ visible: z.ZodOptional<z.ZodBoolean>;
23
+ count: z.ZodOptional<z.ZodNumber>;
24
+ linkUrl: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$loose>>>;
26
+ }, z.core.$loose>;
27
+ /** The config's `filterButtonsConfig`: the search/filter button set and its sort. */
28
+ export declare const FilterButtonsConfigSchema: z.ZodObject<{
29
+ isExplicit: z.ZodOptional<z.ZodBoolean>;
30
+ sortType: z.ZodOptional<z.ZodEnum<{
31
+ alphabetical: "alphabetical";
32
+ custom: "custom";
33
+ }>>;
34
+ searchButtons: z.ZodOptional<z.ZodArray<z.ZodObject<{
35
+ id: z.ZodOptional<z.ZodString>;
36
+ type: z.ZodString;
37
+ name: z.ZodString;
38
+ visible: z.ZodOptional<z.ZodBoolean>;
39
+ builtIn: z.ZodOptional<z.ZodBoolean>;
40
+ order: z.ZodOptional<z.ZodNumber>;
41
+ children: z.ZodOptional<z.ZodArray<z.ZodObject<{
42
+ id: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
43
+ type: z.ZodString;
44
+ name: z.ZodOptional<z.ZodString>;
45
+ visible: z.ZodOptional<z.ZodBoolean>;
46
+ count: z.ZodOptional<z.ZodNumber>;
47
+ linkUrl: z.ZodOptional<z.ZodString>;
48
+ }, z.core.$loose>>>;
49
+ }, z.core.$loose>>>;
50
+ }, z.core.$loose>;
51
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1,36 @@
1
+ import * as z from 'zod';
2
+ // Kept as plain strings: the platform emits more types over time (known set:
3
+ // bookmarks, visited, sessions, guided_tours, categories, poi_type, poi_types,
4
+ // link, exhibitors — see floorplan's SearchButtonType), and the runtime ignores
5
+ // the ones it does not recognize; an enum here would fail the whole config load.
6
+ export const SearchButtonChildSchema = z.looseObject({
7
+ id: z.union([z.number(), z.string()]).optional(),
8
+ type: z.string(),
9
+ name: z.string().optional(),
10
+ // Optional: the platform omits `visible` on buttons that are shown (an
11
+ // omitted flag means visible; only `false` hides). Requiring it would throw
12
+ // the whole data.js parse — see the note on SearchButtonSchema.visible.
13
+ visible: z.boolean().optional(),
14
+ count: z.number().optional(),
15
+ linkUrl: z.string().optional(),
16
+ });
17
+ /** One search/filter button — an entry in `filterButtonsConfig.searchButtons`. */
18
+ export const SearchButtonSchema = z.looseObject({
19
+ id: z.string().optional(),
20
+ type: z.string(),
21
+ name: z.string(),
22
+ // Optional: real published data omits `visible` on shown buttons — e.g. the
23
+ // built-in Exhibitors button carries no `visible` — so an absent flag means
24
+ // visible and only `visible: false` hides. `z.boolean()` here made a routine
25
+ // config throw `invalid_type` and abort the whole data.js parse.
26
+ visible: z.boolean().optional(),
27
+ builtIn: z.boolean().optional(),
28
+ order: z.number().optional(),
29
+ children: z.array(SearchButtonChildSchema).optional(),
30
+ });
31
+ /** The config's `filterButtonsConfig`: the search/filter button set and its sort. */
32
+ export const FilterButtonsConfigSchema = z.looseObject({
33
+ isExplicit: z.boolean().optional(),
34
+ sortType: z.enum(['custom', 'alphabetical']).optional(),
35
+ searchButtons: z.array(SearchButtonSchema).optional(),
36
+ });
@@ -0,0 +1,222 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * The multi-venue contract (docs/specs/multi-venue-data-contract.md, currently
4
+ * Revision 4).
5
+ *
6
+ * `VenueSchema` is deliberately the PERMISSIVE shape the config parses with —
7
+ * a malformed venue must not fail the plan. Venues arrive inside `data.js`
8
+ * alongside everything else, so a strict `ConfigSchema.parse` would throw on
9
+ * one bad `order` and take the whole floor plan down with it. The loose shape
10
+ * here lets the payload through; per-venue enforcement of the published
11
+ * contract (every documented constraint, plus diagnostics) lives in the
12
+ * imperative parser at `packages/floorplan/src/data/venues.ts`, which is the
13
+ * contract's one source of truth — not a zod schema.
14
+ *
15
+ * **Hand-sync is the accepted permanent cost, not a pending TODO.** Three
16
+ * copies encode the contract's rules and each must be updated together:
17
+ *
18
+ * 1. `packages/floorplan/src/data/venues.ts` — runtime parsing + diagnostics
19
+ * 2. `docs/specs/validate-venues.mjs` — the export gate (Guard 2, §12)
20
+ * 3. `docs/specs/multi-venue-data-contract.schema.json` — structural schema
21
+ *
22
+ * An earlier TODO here proposed generating 2 and 3 from a strict zod schema in
23
+ * this module. That schema was deleted as dead code (it had zero consumers and
24
+ * had already drifted from the parser), so the TODO went with it: the parser
25
+ * enforces referential and geometric rules that no JSON Schema can express,
26
+ * which is why it — not zod — is the source of truth.
27
+ *
28
+ * What keeps the copies honest is
29
+ * `packages/floorplan/src/data/validate-venues.test.ts`, which runs all three
30
+ * implementations over shared fixtures and asserts they agree on the `code`,
31
+ * `effect` and `path` of every diagnostic. `message` and `consequence` are
32
+ * deliberately excluded, so either implementation may reword its prose freely.
33
+ * Add a parity case there whenever you add a rule.
34
+ */
35
+ /** A point in floor-plan projected coordinates. */
36
+ export declare const VenuePointSchema: z.ZodObject<{
37
+ x: z.ZodNumber;
38
+ y: z.ZodNumber;
39
+ }, z.core.$strip>;
40
+ /** How an auxiliary venue layer is drawn. */
41
+ export declare const VenueRenderModeSchema: z.ZodEnum<{
42
+ marker: "marker";
43
+ scene: "scene";
44
+ }>;
45
+ /**
46
+ * Upper size bound for an aux layer: a pixel size, or `'detail'` to track the
47
+ * venue's own detail cutoff instead of a fixed number.
48
+ */
49
+ export declare const VenueSizeBoundSchema: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"detail">]>;
50
+ /** One level of a venue, bound to a plan layer. */
51
+ export declare const VenueLevelSchema: z.ZodObject<{
52
+ layer: z.ZodString;
53
+ ordinal: z.ZodInt;
54
+ name: z.ZodOptional<z.ZodString>;
55
+ initial: z.ZodOptional<z.ZodBoolean>;
56
+ }, z.core.$loose>;
57
+ /** A non-level layer a venue draws — a replacing scene or a marker. */
58
+ export declare const VenueAuxLayerSchema: z.ZodObject<{
59
+ layer: z.ZodString;
60
+ render: z.ZodEnum<{
61
+ marker: "marker";
62
+ scene: "scene";
63
+ }>;
64
+ replacesDefault: z.ZodOptional<z.ZodBoolean>;
65
+ suppressesLabel: z.ZodOptional<z.ZodBoolean>;
66
+ minSizePx: z.ZodOptional<z.ZodNumber>;
67
+ maxSizePx: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"detail">]>>;
68
+ }, z.core.$loose>;
69
+ /**
70
+ * A venue entrance: the authored point where a venue meets the outside world.
71
+ *
72
+ * Plan-local on one of the venue's own levels, and therefore geo-projectable
73
+ * through the plan's GPS anchors — which is what lets a cross-venue journey
74
+ * hand a maps app a door rather than the middle of a building footprint. The
75
+ * wayfinding engine never learns the concept: an entrance reaches it as an
76
+ * ordinary route endpoint, exactly as a kiosk anchor does.
77
+ *
78
+ * A venue may author several; the SDK chooses between them by cost and never
79
+ * asks the visitor to pick. Authoring none is permanent, supported behavior —
80
+ * such a venue keeps marker-point targeting forever.
81
+ */
82
+ export declare const VenueEntranceSchema: z.ZodObject<{
83
+ layer: z.ZodString;
84
+ point: z.ZodObject<{
85
+ x: z.ZodNumber;
86
+ y: z.ZodNumber;
87
+ }, z.core.$strip>;
88
+ name: z.ZodOptional<z.ZodString>;
89
+ }, z.core.$loose>;
90
+ /**
91
+ * The plan's whole-campus frame (Revision 9): an axis-aligned rectangle in
92
+ * plan-local coordinates, with no angle. Plan-wide although a venue carries it
93
+ * — the first carrier by `order` wins. A usable one has finite members and a
94
+ * positive `width` and `height`; that, like every venue constraint, is the
95
+ * parser's to enforce (`campus-viewbox-invalid`), not this schema's.
96
+ */
97
+ export declare const VenueCampusViewboxSchema: z.ZodObject<{
98
+ x: z.ZodNumber;
99
+ y: z.ZodNumber;
100
+ width: z.ZodNumber;
101
+ height: z.ZodNumber;
102
+ }, z.core.$loose>;
103
+ /**
104
+ * The shape the config parses with: same fields, no constraints. Anything
105
+ * structurally venue-like survives into the payload so the quarantine — not the
106
+ * parser — decides what to drop.
107
+ */
108
+ export declare const VenueSchema: z.ZodObject<{
109
+ id: z.ZodString;
110
+ name: z.ZodString;
111
+ order: z.ZodOptional<z.ZodNumber>;
112
+ levels: z.ZodOptional<z.ZodArray<z.ZodObject<{
113
+ layer: z.ZodOptional<z.ZodString>;
114
+ ordinal: z.ZodOptional<z.ZodInt>;
115
+ name: z.ZodOptional<z.ZodOptional<z.ZodString>>;
116
+ initial: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
117
+ }, z.core.$loose>>>;
118
+ contour: z.ZodOptional<z.ZodArray<z.ZodObject<{
119
+ x: z.ZodNumber;
120
+ y: z.ZodNumber;
121
+ }, z.core.$strip>>>;
122
+ markerPoint: z.ZodOptional<z.ZodObject<{
123
+ x: z.ZodNumber;
124
+ y: z.ZodNumber;
125
+ }, z.core.$strip>>;
126
+ detailMinSizePx: z.ZodOptional<z.ZodNumber>;
127
+ markerMaxSizePx: z.ZodOptional<z.ZodNumber>;
128
+ layers: z.ZodOptional<z.ZodArray<z.ZodObject<{
129
+ layer: z.ZodOptional<z.ZodString>;
130
+ render: z.ZodOptional<z.ZodEnum<{
131
+ marker: "marker";
132
+ scene: "scene";
133
+ }>>;
134
+ replacesDefault: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
135
+ suppressesLabel: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
136
+ minSizePx: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
137
+ maxSizePx: z.ZodOptional<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"detail">]>>>;
138
+ }, z.core.$loose>>>;
139
+ entrances: z.ZodOptional<z.ZodArray<z.ZodObject<{
140
+ layer: z.ZodOptional<z.ZodString>;
141
+ point: z.ZodOptional<z.ZodObject<{
142
+ x: z.ZodNumber;
143
+ y: z.ZodNumber;
144
+ }, z.core.$strip>>;
145
+ name: z.ZodOptional<z.ZodOptional<z.ZodString>>;
146
+ }, z.core.$loose>>>;
147
+ campusViewbox: z.ZodOptional<z.ZodObject<{
148
+ x: z.ZodOptional<z.ZodNumber>;
149
+ y: z.ZodOptional<z.ZodNumber>;
150
+ width: z.ZodOptional<z.ZodNumber>;
151
+ height: z.ZodOptional<z.ZodNumber>;
152
+ }, z.core.$loose>>;
153
+ }, z.core.$loose>;
154
+ /** Wire version of the multi-venue payload. Revision 2 defines version 1. */
155
+ export declare const VenuesVersionSchema: z.ZodLiteral<1>;
156
+ /**
157
+ * The venue-bearing slice of the `data.js` payload, as the parser receives it.
158
+ *
159
+ * Both fields are optional and the object is loose: callers hand the whole data
160
+ * module over, and a plan with no venues omits them entirely. A payload that
161
+ * carries `venues` under a version the runtime does not know is the parser's
162
+ * problem to report, not a reason to reject the shape here.
163
+ */
164
+ export declare const VenuePayloadSchema: z.ZodObject<{
165
+ venuesVersion: z.ZodOptional<z.ZodLiteral<1>>;
166
+ venues: z.ZodOptional<z.ZodArray<z.ZodObject<{
167
+ id: z.ZodString;
168
+ name: z.ZodString;
169
+ order: z.ZodOptional<z.ZodNumber>;
170
+ levels: z.ZodOptional<z.ZodArray<z.ZodObject<{
171
+ layer: z.ZodOptional<z.ZodString>;
172
+ ordinal: z.ZodOptional<z.ZodInt>;
173
+ name: z.ZodOptional<z.ZodOptional<z.ZodString>>;
174
+ initial: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
175
+ }, z.core.$loose>>>;
176
+ contour: z.ZodOptional<z.ZodArray<z.ZodObject<{
177
+ x: z.ZodNumber;
178
+ y: z.ZodNumber;
179
+ }, z.core.$strip>>>;
180
+ markerPoint: z.ZodOptional<z.ZodObject<{
181
+ x: z.ZodNumber;
182
+ y: z.ZodNumber;
183
+ }, z.core.$strip>>;
184
+ detailMinSizePx: z.ZodOptional<z.ZodNumber>;
185
+ markerMaxSizePx: z.ZodOptional<z.ZodNumber>;
186
+ layers: z.ZodOptional<z.ZodArray<z.ZodObject<{
187
+ layer: z.ZodOptional<z.ZodString>;
188
+ render: z.ZodOptional<z.ZodEnum<{
189
+ marker: "marker";
190
+ scene: "scene";
191
+ }>>;
192
+ replacesDefault: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
193
+ suppressesLabel: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
194
+ minSizePx: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
195
+ maxSizePx: z.ZodOptional<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"detail">]>>>;
196
+ }, z.core.$loose>>>;
197
+ entrances: z.ZodOptional<z.ZodArray<z.ZodObject<{
198
+ layer: z.ZodOptional<z.ZodString>;
199
+ point: z.ZodOptional<z.ZodObject<{
200
+ x: z.ZodNumber;
201
+ y: z.ZodNumber;
202
+ }, z.core.$strip>>;
203
+ name: z.ZodOptional<z.ZodOptional<z.ZodString>>;
204
+ }, z.core.$loose>>>;
205
+ campusViewbox: z.ZodOptional<z.ZodObject<{
206
+ x: z.ZodOptional<z.ZodNumber>;
207
+ y: z.ZodOptional<z.ZodNumber>;
208
+ width: z.ZodOptional<z.ZodNumber>;
209
+ height: z.ZodOptional<z.ZodNumber>;
210
+ }, z.core.$loose>>;
211
+ }, z.core.$loose>>>;
212
+ }, z.core.$loose>;
213
+ export type VenuePoint = z.infer<typeof VenuePointSchema>;
214
+ export type VenueRenderMode = z.infer<typeof VenueRenderModeSchema>;
215
+ export type VenueSizeBound = z.infer<typeof VenueSizeBoundSchema>;
216
+ export type RawVenueLevel = z.infer<typeof VenueLevelSchema>;
217
+ export type RawVenueAuxLayer = z.infer<typeof VenueAuxLayerSchema>;
218
+ export type RawVenueEntrance = z.infer<typeof VenueEntranceSchema>;
219
+ export type VenueCampusViewbox = z.infer<typeof VenueCampusViewboxSchema>;
220
+ export type RawVenue = z.infer<typeof VenueSchema>;
221
+ export type VenuePayload = z.infer<typeof VenuePayloadSchema>;
222
+ //# sourceMappingURL=venues.d.ts.map