@phila/layerboard 3.0.0-beta.20 → 3.0.0-beta.21

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,340 @@
1
+ import { Ref } from 'vue';
2
+ /**
3
+ * Bounding box for spatial queries
4
+ */
5
+ export interface Bounds {
6
+ north: number;
7
+ south: number;
8
+ east: number;
9
+ west: number;
10
+ }
11
+ /**
12
+ * Configuration for a data source
13
+ */
14
+ export interface DataSourceConfig {
15
+ /** ArcGIS FeatureServer URL */
16
+ url: string;
17
+ /** Optional where clause for filtering features */
18
+ where?: string;
19
+ /** Maximum features per request (default: 2000) */
20
+ pageSize?: number;
21
+ /** Whether to clip geometries to viewport bounds */
22
+ clipToViewport?: boolean;
23
+ }
24
+ /**
25
+ * Options for fetch operations
26
+ */
27
+ export interface FetchOptions {
28
+ /** Spatial bounds for the query */
29
+ bounds?: Bounds;
30
+ /** Override where clause */
31
+ where?: string;
32
+ /** Output spatial reference (default: 4326) */
33
+ outSR?: number;
34
+ }
35
+ /**
36
+ * Composable for fetching data from ArcGIS Feature Services.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const { data, isLoading, error, fetch } = useDataSource({
41
+ * url: 'https://services.arcgis.com/.../FeatureServer/0',
42
+ * where: "STATUS = 'Active'"
43
+ * })
44
+ *
45
+ * // Fetch with spatial bounds
46
+ * await fetch({ bounds: { north: 40, south: 39, east: -75, west: -76 } })
47
+ * ```
48
+ */
49
+ export declare function useDataSource(config: DataSourceConfig): {
50
+ data: Readonly<Ref<{
51
+ readonly type: "FeatureCollection";
52
+ readonly features: readonly {
53
+ readonly type: "Feature";
54
+ readonly geometry: {
55
+ readonly type: "Point";
56
+ readonly coordinates: readonly number[];
57
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
58
+ } | {
59
+ readonly type: "MultiPoint";
60
+ readonly coordinates: readonly (readonly number[])[];
61
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
62
+ } | {
63
+ readonly type: "LineString";
64
+ readonly coordinates: readonly (readonly number[])[];
65
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
66
+ } | {
67
+ readonly type: "MultiLineString";
68
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
69
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
70
+ } | {
71
+ readonly type: "Polygon";
72
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
73
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
74
+ } | {
75
+ readonly type: "MultiPolygon";
76
+ readonly coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
77
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
78
+ } | {
79
+ readonly type: "GeometryCollection";
80
+ readonly geometries: readonly ({
81
+ readonly type: "Point";
82
+ readonly coordinates: readonly number[];
83
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
84
+ } | {
85
+ readonly type: "MultiPoint";
86
+ readonly coordinates: readonly (readonly number[])[];
87
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
88
+ } | {
89
+ readonly type: "LineString";
90
+ readonly coordinates: readonly (readonly number[])[];
91
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
92
+ } | {
93
+ readonly type: "MultiLineString";
94
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
95
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
96
+ } | {
97
+ readonly type: "Polygon";
98
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
99
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
100
+ } | {
101
+ readonly type: "MultiPolygon";
102
+ readonly coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
103
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
104
+ } | /*elided*/ any)[];
105
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
106
+ };
107
+ readonly id?: string | number | undefined | undefined;
108
+ readonly properties: {
109
+ readonly [x: string]: any;
110
+ } | null;
111
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
112
+ }[];
113
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
114
+ } | null, {
115
+ readonly type: "FeatureCollection";
116
+ readonly features: readonly {
117
+ readonly type: "Feature";
118
+ readonly geometry: {
119
+ readonly type: "Point";
120
+ readonly coordinates: readonly number[];
121
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
122
+ } | {
123
+ readonly type: "MultiPoint";
124
+ readonly coordinates: readonly (readonly number[])[];
125
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
126
+ } | {
127
+ readonly type: "LineString";
128
+ readonly coordinates: readonly (readonly number[])[];
129
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
130
+ } | {
131
+ readonly type: "MultiLineString";
132
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
133
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
134
+ } | {
135
+ readonly type: "Polygon";
136
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
137
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
138
+ } | {
139
+ readonly type: "MultiPolygon";
140
+ readonly coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
141
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
142
+ } | {
143
+ readonly type: "GeometryCollection";
144
+ readonly geometries: readonly ({
145
+ readonly type: "Point";
146
+ readonly coordinates: readonly number[];
147
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
148
+ } | {
149
+ readonly type: "MultiPoint";
150
+ readonly coordinates: readonly (readonly number[])[];
151
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
152
+ } | {
153
+ readonly type: "LineString";
154
+ readonly coordinates: readonly (readonly number[])[];
155
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
156
+ } | {
157
+ readonly type: "MultiLineString";
158
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
159
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
160
+ } | {
161
+ readonly type: "Polygon";
162
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
163
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
164
+ } | {
165
+ readonly type: "MultiPolygon";
166
+ readonly coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
167
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
168
+ } | /*elided*/ any)[];
169
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
170
+ };
171
+ readonly id?: string | number | undefined | undefined;
172
+ readonly properties: {
173
+ readonly [x: string]: any;
174
+ } | null;
175
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
176
+ }[];
177
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
178
+ } | null>>;
179
+ isLoading: Readonly<Ref<boolean, boolean>>;
180
+ error: Readonly<Ref<Error | null, Error | null>>;
181
+ totalFeatures: Readonly<Ref<number, number>>;
182
+ config: DataSourceConfig;
183
+ fetch: (options?: FetchOptions) => Promise<GeoJSON.FeatureCollection>;
184
+ refetch: (options?: FetchOptions) => Promise<GeoJSON.FeatureCollection>;
185
+ clear: () => void;
186
+ };
187
+ /**
188
+ * Create a reactive data source that refetches when a trigger changes.
189
+ *
190
+ * @example
191
+ * ```typescript
192
+ * const address = ref({ lat: 39.9526, lng: -75.1652 })
193
+ * const { data, isLoading } = useReactiveDataSource(
194
+ * { url: 'https://services.arcgis.com/.../FeatureServer/0' },
195
+ * address,
196
+ * (addr) => ({ bounds: boundsFromAddress(addr) })
197
+ * )
198
+ * // Data refetches automatically when address changes
199
+ * ```
200
+ */
201
+ export declare function useReactiveDataSource<T>(config: DataSourceConfig, trigger: Ref<T>, optionsFn: (value: T) => FetchOptions): {
202
+ data: Readonly<Ref<{
203
+ readonly type: "FeatureCollection";
204
+ readonly features: readonly {
205
+ readonly type: "Feature";
206
+ readonly geometry: {
207
+ readonly type: "Point";
208
+ readonly coordinates: readonly number[];
209
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
210
+ } | {
211
+ readonly type: "MultiPoint";
212
+ readonly coordinates: readonly (readonly number[])[];
213
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
214
+ } | {
215
+ readonly type: "LineString";
216
+ readonly coordinates: readonly (readonly number[])[];
217
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
218
+ } | {
219
+ readonly type: "MultiLineString";
220
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
221
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
222
+ } | {
223
+ readonly type: "Polygon";
224
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
225
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
226
+ } | {
227
+ readonly type: "MultiPolygon";
228
+ readonly coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
229
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
230
+ } | {
231
+ readonly type: "GeometryCollection";
232
+ readonly geometries: readonly ({
233
+ readonly type: "Point";
234
+ readonly coordinates: readonly number[];
235
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
236
+ } | {
237
+ readonly type: "MultiPoint";
238
+ readonly coordinates: readonly (readonly number[])[];
239
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
240
+ } | {
241
+ readonly type: "LineString";
242
+ readonly coordinates: readonly (readonly number[])[];
243
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
244
+ } | {
245
+ readonly type: "MultiLineString";
246
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
247
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
248
+ } | {
249
+ readonly type: "Polygon";
250
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
251
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
252
+ } | {
253
+ readonly type: "MultiPolygon";
254
+ readonly coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
255
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
256
+ } | /*elided*/ any)[];
257
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
258
+ };
259
+ readonly id?: string | number | undefined | undefined;
260
+ readonly properties: {
261
+ readonly [x: string]: any;
262
+ } | null;
263
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
264
+ }[];
265
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
266
+ } | null, {
267
+ readonly type: "FeatureCollection";
268
+ readonly features: readonly {
269
+ readonly type: "Feature";
270
+ readonly geometry: {
271
+ readonly type: "Point";
272
+ readonly coordinates: readonly number[];
273
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
274
+ } | {
275
+ readonly type: "MultiPoint";
276
+ readonly coordinates: readonly (readonly number[])[];
277
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
278
+ } | {
279
+ readonly type: "LineString";
280
+ readonly coordinates: readonly (readonly number[])[];
281
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
282
+ } | {
283
+ readonly type: "MultiLineString";
284
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
285
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
286
+ } | {
287
+ readonly type: "Polygon";
288
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
289
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
290
+ } | {
291
+ readonly type: "MultiPolygon";
292
+ readonly coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
293
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
294
+ } | {
295
+ readonly type: "GeometryCollection";
296
+ readonly geometries: readonly ({
297
+ readonly type: "Point";
298
+ readonly coordinates: readonly number[];
299
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
300
+ } | {
301
+ readonly type: "MultiPoint";
302
+ readonly coordinates: readonly (readonly number[])[];
303
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
304
+ } | {
305
+ readonly type: "LineString";
306
+ readonly coordinates: readonly (readonly number[])[];
307
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
308
+ } | {
309
+ readonly type: "MultiLineString";
310
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
311
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
312
+ } | {
313
+ readonly type: "Polygon";
314
+ readonly coordinates: readonly (readonly (readonly number[])[])[];
315
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
316
+ } | {
317
+ readonly type: "MultiPolygon";
318
+ readonly coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
319
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
320
+ } | /*elided*/ any)[];
321
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
322
+ };
323
+ readonly id?: string | number | undefined | undefined;
324
+ readonly properties: {
325
+ readonly [x: string]: any;
326
+ } | null;
327
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
328
+ }[];
329
+ readonly bbox?: readonly [number, number, number, number] | readonly [number, number, number, number, number, number] | undefined;
330
+ } | null>>;
331
+ isLoading: Readonly<Ref<boolean, boolean>>;
332
+ error: Readonly<Ref<Error | null, Error | null>>;
333
+ totalFeatures: Readonly<Ref<number, number>>;
334
+ config: DataSourceConfig;
335
+ fetch: (options?: FetchOptions) => Promise<GeoJSON.FeatureCollection>;
336
+ refetch: (options?: FetchOptions) => Promise<GeoJSON.FeatureCollection>;
337
+ clear: () => void;
338
+ };
339
+ /** Type for the return value of useDataSource */
340
+ export type UseDataSourceReturn = ReturnType<typeof useDataSource>;
@@ -0,0 +1,45 @@
1
+ import { LayerConfig } from '../types';
2
+ export declare function useLayerConfig(): {
3
+ layers: import('vue').ComputedRef<{
4
+ id: string;
5
+ title: string;
6
+ type: "fill" | "line" | "circle";
7
+ url: string;
8
+ where?: string | undefined;
9
+ minZoom?: number | undefined;
10
+ maxZoom?: number | undefined;
11
+ opacity: number;
12
+ paint?: Record<string, unknown> | undefined;
13
+ outlinePaint?: Record<string, unknown> | undefined;
14
+ legend: {
15
+ type: "fill" | "line" | "circle";
16
+ color: string;
17
+ label: string;
18
+ width?: number | undefined;
19
+ radius?: number | undefined;
20
+ }[];
21
+ popup: {
22
+ title: string;
23
+ fields: {
24
+ field: string;
25
+ label: string;
26
+ format?: {
27
+ dateFormat?: string | undefined;
28
+ digitSeparator?: boolean | undefined;
29
+ places?: number | undefined;
30
+ } | undefined;
31
+ }[];
32
+ showTime?: boolean | undefined;
33
+ } | null;
34
+ displayOptions?: {
35
+ shouldShowCheckbox?: boolean | undefined;
36
+ shouldShowSlider?: boolean | undefined;
37
+ shouldShowLegendBox?: boolean | undefined;
38
+ layerNameChange?: string | undefined;
39
+ } | undefined;
40
+ }[]>;
41
+ visibleLayerIds: import('vue').ComputedRef<Set<string> & Omit<Set<string>, keyof Set<any>>>;
42
+ loadingLayerIds: import('vue').ComputedRef<Set<string> & Omit<Set<string>, keyof Set<any>>>;
43
+ toggleLayer: (layerId: string) => void;
44
+ setLayers: (newLayers: LayerConfig[]) => void;
45
+ };
@@ -0,0 +1,211 @@
1
+ import { LayerboardConfig } from '../types/config';
2
+ /**
3
+ * Main composable for initializing and managing the layerboard framework.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * const {
8
+ * layerConfigs,
9
+ * visibleLayers,
10
+ * isLoading,
11
+ * error,
12
+ * toggleLayer,
13
+ * setLayerOpacity,
14
+ * filterLayers
15
+ * } = useLayerboard({
16
+ * webMapId: '1596df70df0349e293ceec46a06ccc50',
17
+ * mode: 'dynamic',
18
+ * panelMode: 'flat'
19
+ * })
20
+ * ```
21
+ */
22
+ export declare function useLayerboard(config: LayerboardConfig): {
23
+ layerConfigs: Readonly<import('vue').Ref<readonly {
24
+ readonly id: string;
25
+ readonly title: string;
26
+ readonly type: "fill" | "line" | "circle";
27
+ readonly url: string;
28
+ readonly where?: string | undefined;
29
+ readonly minZoom?: number | undefined;
30
+ readonly maxZoom?: number | undefined;
31
+ readonly opacity: number;
32
+ readonly paint?: {
33
+ readonly [x: string]: Readonly<unknown>;
34
+ } | undefined;
35
+ readonly outlinePaint?: {
36
+ readonly [x: string]: Readonly<unknown>;
37
+ } | undefined;
38
+ readonly legend: readonly {
39
+ readonly type: "fill" | "line" | "circle";
40
+ readonly color: string;
41
+ readonly label: string;
42
+ readonly width?: number | undefined;
43
+ readonly radius?: number | undefined;
44
+ }[];
45
+ readonly popup: {
46
+ readonly title: string;
47
+ readonly fields: readonly {
48
+ readonly field: string;
49
+ readonly label: string;
50
+ readonly format?: {
51
+ readonly dateFormat?: string | undefined;
52
+ readonly digitSeparator?: boolean | undefined;
53
+ readonly places?: number | undefined;
54
+ } | undefined;
55
+ }[];
56
+ readonly showTime?: boolean | undefined;
57
+ } | null;
58
+ readonly displayOptions?: {
59
+ readonly shouldShowCheckbox?: boolean | undefined;
60
+ readonly shouldShowSlider?: boolean | undefined;
61
+ readonly shouldShowLegendBox?: boolean | undefined;
62
+ readonly layerNameChange?: string | undefined;
63
+ } | undefined;
64
+ }[], readonly {
65
+ readonly id: string;
66
+ readonly title: string;
67
+ readonly type: "fill" | "line" | "circle";
68
+ readonly url: string;
69
+ readonly where?: string | undefined;
70
+ readonly minZoom?: number | undefined;
71
+ readonly maxZoom?: number | undefined;
72
+ readonly opacity: number;
73
+ readonly paint?: {
74
+ readonly [x: string]: Readonly<unknown>;
75
+ } | undefined;
76
+ readonly outlinePaint?: {
77
+ readonly [x: string]: Readonly<unknown>;
78
+ } | undefined;
79
+ readonly legend: readonly {
80
+ readonly type: "fill" | "line" | "circle";
81
+ readonly color: string;
82
+ readonly label: string;
83
+ readonly width?: number | undefined;
84
+ readonly radius?: number | undefined;
85
+ }[];
86
+ readonly popup: {
87
+ readonly title: string;
88
+ readonly fields: readonly {
89
+ readonly field: string;
90
+ readonly label: string;
91
+ readonly format?: {
92
+ readonly dateFormat?: string | undefined;
93
+ readonly digitSeparator?: boolean | undefined;
94
+ readonly places?: number | undefined;
95
+ } | undefined;
96
+ }[];
97
+ readonly showTime?: boolean | undefined;
98
+ } | null;
99
+ readonly displayOptions?: {
100
+ readonly shouldShowCheckbox?: boolean | undefined;
101
+ readonly shouldShowSlider?: boolean | undefined;
102
+ readonly shouldShowLegendBox?: boolean | undefined;
103
+ readonly layerNameChange?: string | undefined;
104
+ } | undefined;
105
+ }[]>>;
106
+ visibleLayers: Readonly<import('vue').Ref<ReadonlySet<string>, ReadonlySet<string>>>;
107
+ layerOpacities: Readonly<import('vue').Ref<{
108
+ readonly [x: string]: number;
109
+ }, {
110
+ readonly [x: string]: number;
111
+ }>>;
112
+ loadingLayers: Readonly<import('vue').Ref<ReadonlySet<string>, ReadonlySet<string>>>;
113
+ layerErrors: Readonly<import('vue').Ref<{
114
+ readonly [x: string]: string;
115
+ }, {
116
+ readonly [x: string]: string;
117
+ }>>;
118
+ searchQuery: Readonly<import('vue').Ref<string, string>>;
119
+ isLoading: Readonly<import('vue').Ref<boolean, boolean>>;
120
+ isInitialized: Readonly<import('vue').Ref<boolean, boolean>>;
121
+ error: Readonly<import('vue').Ref<Error | null, Error | null>>;
122
+ filteredLayerConfigs: import('vue').ComputedRef<{
123
+ id: string;
124
+ title: string;
125
+ type: "fill" | "line" | "circle";
126
+ url: string;
127
+ where?: string | undefined;
128
+ minZoom?: number | undefined;
129
+ maxZoom?: number | undefined;
130
+ opacity: number;
131
+ paint?: Record<string, unknown> | undefined;
132
+ outlinePaint?: Record<string, unknown> | undefined;
133
+ legend: {
134
+ type: "fill" | "line" | "circle";
135
+ color: string;
136
+ label: string;
137
+ width?: number | undefined;
138
+ radius?: number | undefined;
139
+ }[];
140
+ popup: {
141
+ title: string;
142
+ fields: {
143
+ field: string;
144
+ label: string;
145
+ format?: {
146
+ dateFormat?: string | undefined;
147
+ digitSeparator?: boolean | undefined;
148
+ places?: number | undefined;
149
+ } | undefined;
150
+ }[];
151
+ showTime?: boolean | undefined;
152
+ } | null;
153
+ displayOptions?: {
154
+ shouldShowCheckbox?: boolean | undefined;
155
+ shouldShowSlider?: boolean | undefined;
156
+ shouldShowLegendBox?: boolean | undefined;
157
+ layerNameChange?: string | undefined;
158
+ } | undefined;
159
+ }[]>;
160
+ layerList: import('vue').ComputedRef<{
161
+ config: {
162
+ id: string;
163
+ title: string;
164
+ type: "fill" | "line" | "circle";
165
+ url: string;
166
+ where?: string | undefined;
167
+ minZoom?: number | undefined;
168
+ maxZoom?: number | undefined;
169
+ opacity: number;
170
+ paint?: Record<string, unknown> | undefined;
171
+ outlinePaint?: Record<string, unknown> | undefined;
172
+ legend: {
173
+ type: "fill" | "line" | "circle";
174
+ color: string;
175
+ label: string;
176
+ width?: number | undefined;
177
+ radius?: number | undefined;
178
+ }[];
179
+ popup: {
180
+ title: string;
181
+ fields: {
182
+ field: string;
183
+ label: string;
184
+ format?: {
185
+ dateFormat?: string | undefined;
186
+ digitSeparator?: boolean | undefined;
187
+ places?: number | undefined;
188
+ } | undefined;
189
+ }[];
190
+ showTime?: boolean | undefined;
191
+ } | null;
192
+ displayOptions?: {
193
+ shouldShowCheckbox?: boolean | undefined;
194
+ shouldShowSlider?: boolean | undefined;
195
+ shouldShowLegendBox?: boolean | undefined;
196
+ layerNameChange?: string | undefined;
197
+ } | undefined;
198
+ };
199
+ component: "fill" | "line" | "circle";
200
+ }[]>;
201
+ config: LayerboardConfig;
202
+ initialize: () => Promise<void>;
203
+ toggleLayer: (layerId: string) => void;
204
+ setLayerOpacity: (layerId: string, opacity: number) => void;
205
+ filterLayers: (query: string) => void;
206
+ setLayerLoading: (layerId: string, loading: boolean) => void;
207
+ setLayerError: (layerId: string, errorMessage: string | null) => void;
208
+ reset: () => void;
209
+ };
210
+ /** Type for the return value of useLayerboard */
211
+ export type UseLayerboardReturn = ReturnType<typeof useLayerboard>;
@@ -0,0 +1,6 @@
1
+ export * from './components';
2
+ export * from './composables';
3
+ export * from './services';
4
+ export * from './utils';
5
+ export * from './types';
6
+ export type { CyclomediaConfig, PictometryCredentials, AisGeocodeResult } from '@phila/phila-ui-map-core';
@@ -0,0 +1 @@
1
+ export { getLayerConfigs, clearCache, buildWebMapUrl, getWebMapUrl, WEBMAP_ID } from './layerConfigService';
@@ -0,0 +1,40 @@
1
+ import { LayerConfig } from '../types/layer';
2
+ /**
3
+ * The default Esri WebMap ID (OpenMaps)
4
+ * This can be overridden by passing a webMapId to getLayerConfigs()
5
+ */
6
+ export declare const DEFAULT_WEBMAP_ID = "376af635c84643cd816a8c5d017a53aa";
7
+ /**
8
+ * @deprecated Use DEFAULT_WEBMAP_ID instead
9
+ */
10
+ export declare const WEBMAP_ID = "376af635c84643cd816a8c5d017a53aa";
11
+ /**
12
+ * Builds the fetch URL for the Esri WebMap JSON
13
+ * @param webMapId The Esri WebMap ID
14
+ * @param token Optional ArcGIS token for accessing protected WebMaps
15
+ * @returns The full URL to fetch the WebMap data
16
+ */
17
+ export declare function buildWebMapUrl(webMapId: string, token?: string): string;
18
+ /**
19
+ * Gets the WebMap fetch URL using the default WEBMAP_ID
20
+ */
21
+ export declare function getWebMapUrl(): string;
22
+ /**
23
+ * Clear the cached layer configs
24
+ * @param webMapId Optional - if provided, only clears cache for that webMapId
25
+ * If not provided, clears all cached configs
26
+ */
27
+ export declare function clearCache(webMapId?: string): void;
28
+ /**
29
+ * Gets layer configurations by fetching from ArcGIS Online WebMap
30
+ *
31
+ * This function:
32
+ * - Fetches WebMap JSON and transforms it at runtime
33
+ * - Caches results in memory to avoid redundant fetches/transforms
34
+ * - Prevents concurrent loads with a loading promise guard
35
+ *
36
+ * @param webMapId Optional - the WebMap ID to fetch. Defaults to DEFAULT_WEBMAP_ID
37
+ * @returns Promise resolving to an array of LayerConfig objects
38
+ * @throws Error if fetch or transform fails
39
+ */
40
+ export declare function getLayerConfigs(webMapId?: string): Promise<LayerConfig[]>;