@humanforest/ui 0.1.0

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 (235) hide show
  1. package/LICENSE +67 -0
  2. package/icons/forest/bike-asterisk.svg +21 -0
  3. package/icons/forest/bike-down.svg +19 -0
  4. package/icons/forest/bike-off.svg +20 -0
  5. package/icons/forest/bike-up.svg +19 -0
  6. package/icons/forest/bike-x.svg +19 -0
  7. package/icons/forest/bike.svg +18 -0
  8. package/icons/forest/map/forest-place-count.svg +21 -0
  9. package/icons/forest/map/forest-place-marker.svg +17 -0
  10. package/icons/forest/map/forest-vehicle-marker.svg +73 -0
  11. package/icons/forest/map/manifest.json +373 -0
  12. package/icons/forest/map/place-count-manifest.json +83 -0
  13. package/icons/forest/map/place-manifest.json +74 -0
  14. package/icons/forest/mark-fill.svg +6 -0
  15. package/icons/forest/mark.svg +6 -0
  16. package/icons/forest/parking.svg +3 -0
  17. package/icons/forest/star-fill.svg +4 -0
  18. package/icons/forest/star.svg +4 -0
  19. package/icons/forest/traffic-light-caution.svg +8 -0
  20. package/icons/forest/traffic-light-go.svg +8 -0
  21. package/icons/forest/traffic-light-lit.svg +8 -0
  22. package/icons/forest/traffic-light-stop.svg +8 -0
  23. package/icons/forest/traffic-light.svg +8 -0
  24. package/package.json +64 -0
  25. package/src/address/address.ts +125 -0
  26. package/src/address/autofill.ts +78 -0
  27. package/src/address/geocode.ts +55 -0
  28. package/src/address/index.ts +31 -0
  29. package/src/address/validate.ts +91 -0
  30. package/src/canvas/FCanvasCard.vue +97 -0
  31. package/src/canvas/FCanvasControl.vue +121 -0
  32. package/src/canvas/FCanvasControlGroup.vue +100 -0
  33. package/src/canvas/FCanvasFlyout.vue +216 -0
  34. package/src/canvas/FCanvasHud.vue +402 -0
  35. package/src/canvas/canvasSurface.ts +39 -0
  36. package/src/canvas/index.ts +17 -0
  37. package/src/contexts/ForestContext.vue +53 -0
  38. package/src/contexts/contexts.ts +153 -0
  39. package/src/contexts/index.ts +23 -0
  40. package/src/contexts/marketing-theme.ts +214 -0
  41. package/src/contexts/mobile-theme.ts +402 -0
  42. package/src/filter/FFilterBar.vue +72 -0
  43. package/src/filter/FFilterChip.vue +362 -0
  44. package/src/filter/FFilterClauses.vue +104 -0
  45. package/src/filter/FFilterTrigger.vue +183 -0
  46. package/src/filter/filter.theme.ts +27 -0
  47. package/src/filter/filterClause.ts +265 -0
  48. package/src/filter/filterPredicate.ts +134 -0
  49. package/src/filter/filterSchema.ts +82 -0
  50. package/src/filter/index.ts +36 -0
  51. package/src/forest-preset.ts +68 -0
  52. package/src/icons.ts +79 -0
  53. package/src/index.ts +17 -0
  54. package/src/kpi/FKpi.vue +253 -0
  55. package/src/kpi/FKpiGroup.vue +161 -0
  56. package/src/kpi/index.ts +20 -0
  57. package/src/kpi/kpi.theme.ts +168 -0
  58. package/src/kpi/kpiDelta.ts +82 -0
  59. package/src/kpi/kpiFormat.ts +72 -0
  60. package/src/kpi/kpiGroupState.ts +63 -0
  61. package/src/logo/FLogo.vue +52 -0
  62. package/src/logo/FSubLogo.vue +214 -0
  63. package/src/logo/index.ts +8 -0
  64. package/src/map/FMap.vue +355 -0
  65. package/src/map/FMapCompass.vue +154 -0
  66. package/src/map/FMapCoordinates.vue +134 -0
  67. package/src/map/FMapDrawTools.vue +116 -0
  68. package/src/map/FMapFullscreen.vue +92 -0
  69. package/src/map/FMapGeolocate.vue +208 -0
  70. package/src/map/FMapLayers.vue +75 -0
  71. package/src/map/FMapLegend.vue +45 -0
  72. package/src/map/FMapPopup.vue +129 -0
  73. package/src/map/FMapRamp.vue +69 -0
  74. package/src/map/FMapRegion.vue +77 -0
  75. package/src/map/FMapScale.vue +107 -0
  76. package/src/map/FMapSearch.vue +362 -0
  77. package/src/map/FMapTilt.vue +87 -0
  78. package/src/map/FMapTools.vue +61 -0
  79. package/src/map/FMapZoom.vue +81 -0
  80. package/src/map/FMarker.vue +218 -0
  81. package/src/map/FTrackScrubber.vue +94 -0
  82. package/src/map/FVehicleLegend.vue +72 -0
  83. package/src/map/FVehicleMark.vue +166 -0
  84. package/src/map/bin.ts +196 -0
  85. package/src/map/coordinates.ts +83 -0
  86. package/src/map/density.ts +401 -0
  87. package/src/map/draw.ts +356 -0
  88. package/src/map/ease.ts +67 -0
  89. package/src/map/fullscreen.ts +59 -0
  90. package/src/map/heat.ts +160 -0
  91. package/src/map/index.ts +351 -0
  92. package/src/map/liveMarkers.ts +60 -0
  93. package/src/map/map.css +116 -0
  94. package/src/map/mapColor.ts +31 -0
  95. package/src/map/mapContext.ts +12 -0
  96. package/src/map/mapLayers.ts +55 -0
  97. package/src/map/mapLegend.ts +70 -0
  98. package/src/map/mapSearch.theme.ts +79 -0
  99. package/src/map/mapSearch.ts +279 -0
  100. package/src/map/mapUrl.ts +117 -0
  101. package/src/map/markerAsset.ts +3 -0
  102. package/src/map/padding.ts +39 -0
  103. package/src/map/place.ts +192 -0
  104. package/src/map/ramp.ts +95 -0
  105. package/src/map/regionSelect.ts +163 -0
  106. package/src/map/route.ts +167 -0
  107. package/src/map/scale.ts +329 -0
  108. package/src/map/scaleBar.ts +67 -0
  109. package/src/map/selectionModel.ts +50 -0
  110. package/src/map/sources/coordinates.ts +58 -0
  111. package/src/map/sources/mapboxPlaces.ts +71 -0
  112. package/src/map/style.ts +14 -0
  113. package/src/map/track.ts +279 -0
  114. package/src/map/useFeatureSelect.ts +230 -0
  115. package/src/map/useLiveMarkers.ts +84 -0
  116. package/src/map/useMap.ts +150 -0
  117. package/src/map/useMapDraw.ts +776 -0
  118. package/src/map/useMapOverlay.ts +421 -0
  119. package/src/map/useMapTableSelection.ts +101 -0
  120. package/src/map/useMapUrlState.ts +155 -0
  121. package/src/map/useMarkerSource.ts +163 -0
  122. package/src/map/useRegionSelect.ts +309 -0
  123. package/src/map/useTokenMode.ts +61 -0
  124. package/src/map/useTrackPlayback.ts +131 -0
  125. package/src/map/useVehicleFilter.ts +51 -0
  126. package/src/map/useVisibleFeatures.ts +124 -0
  127. package/src/map/vehicle.ts +807 -0
  128. package/src/map/vehicleFilter.ts +284 -0
  129. package/src/map/vehicleLegend.ts +155 -0
  130. package/src/map/visibleFeatures.ts +192 -0
  131. package/src/map/zone.ts +291 -0
  132. package/src/shell/FAppNavbar.vue +68 -0
  133. package/src/shell/FAppShell.vue +163 -0
  134. package/src/shell/FAppSidebar.vue +215 -0
  135. package/src/shell/FPageToolbar.vue +126 -0
  136. package/src/shell/FScrollShadow.vue +43 -0
  137. package/src/shell/FSidePanel.vue +258 -0
  138. package/src/shell/FToolbarActions.vue +32 -0
  139. package/src/shell/index.ts +33 -0
  140. package/src/shell/nav.ts +37 -0
  141. package/src/shell/pageToolbar.ts +69 -0
  142. package/src/shell/shell.ts +74 -0
  143. package/src/shell/sidePanel.ts +115 -0
  144. package/src/styles/forest.css +852 -0
  145. package/src/styles/index.css +39 -0
  146. package/src/themes/accordion.ts +36 -0
  147. package/src/themes/alert.ts +16 -0
  148. package/src/themes/auth-form.ts +19 -0
  149. package/src/themes/avatar-group.ts +9 -0
  150. package/src/themes/avatar.ts +18 -0
  151. package/src/themes/badge.ts +51 -0
  152. package/src/themes/banner.ts +21 -0
  153. package/src/themes/breadcrumb.ts +10 -0
  154. package/src/themes/button.mechanics.ts +191 -0
  155. package/src/themes/button.ts +136 -0
  156. package/src/themes/calendar.ts +29 -0
  157. package/src/themes/card.ts +67 -0
  158. package/src/themes/carousel.ts +41 -0
  159. package/src/themes/checkbox-group.ts +20 -0
  160. package/src/themes/checkbox.ts +47 -0
  161. package/src/themes/chip.ts +50 -0
  162. package/src/themes/collapsible.ts +26 -0
  163. package/src/themes/color-picker.ts +13 -0
  164. package/src/themes/command-palette.ts +37 -0
  165. package/src/themes/container.ts +14 -0
  166. package/src/themes/context-menu.ts +38 -0
  167. package/src/themes/dashboard-group.ts +11 -0
  168. package/src/themes/dashboard-navbar.ts +10 -0
  169. package/src/themes/dashboard-panel.ts +18 -0
  170. package/src/themes/dashboard-resize-handle.ts +35 -0
  171. package/src/themes/dashboard-sidebar-collapse.ts +7 -0
  172. package/src/themes/dashboard-sidebar-toggle.ts +7 -0
  173. package/src/themes/dashboard-sidebar.ts +58 -0
  174. package/src/themes/dashboard-toolbar.ts +15 -0
  175. package/src/themes/drawer.ts +45 -0
  176. package/src/themes/dropdown-menu.ts +38 -0
  177. package/src/themes/empty.ts +43 -0
  178. package/src/themes/field-group.ts +52 -0
  179. package/src/themes/file-upload.ts +38 -0
  180. package/src/themes/footer-columns.ts +13 -0
  181. package/src/themes/footer.ts +9 -0
  182. package/src/themes/form-field.ts +25 -0
  183. package/src/themes/form.ts +22 -0
  184. package/src/themes/header.ts +12 -0
  185. package/src/themes/icon.ts +61 -0
  186. package/src/themes/index.ts +99 -0
  187. package/src/themes/input-date.ts +73 -0
  188. package/src/themes/input-menu.ts +66 -0
  189. package/src/themes/input-number.ts +58 -0
  190. package/src/themes/input-rating.ts +25 -0
  191. package/src/themes/input-tags.ts +63 -0
  192. package/src/themes/input-time.ts +70 -0
  193. package/src/themes/input.ts +148 -0
  194. package/src/themes/kbd.ts +27 -0
  195. package/src/themes/link.ts +27 -0
  196. package/src/themes/listbox.ts +48 -0
  197. package/src/themes/main.ts +6 -0
  198. package/src/themes/marquee.ts +45 -0
  199. package/src/themes/modal.ts +46 -0
  200. package/src/themes/navigation-menu.ts +80 -0
  201. package/src/themes/page-anchors.ts +7 -0
  202. package/src/themes/page-aside.ts +7 -0
  203. package/src/themes/page-card.ts +22 -0
  204. package/src/themes/page-cta.ts +18 -0
  205. package/src/themes/page-feature.ts +13 -0
  206. package/src/themes/page-header.ts +16 -0
  207. package/src/themes/page-hero.ts +15 -0
  208. package/src/themes/page-links.ts +12 -0
  209. package/src/themes/page-section.ts +14 -0
  210. package/src/themes/page.ts +7 -0
  211. package/src/themes/pagination.ts +17 -0
  212. package/src/themes/pin-input.ts +73 -0
  213. package/src/themes/popover.ts +30 -0
  214. package/src/themes/progress.ts +29 -0
  215. package/src/themes/prose.ts +45 -0
  216. package/src/themes/radio-group.ts +39 -0
  217. package/src/themes/scroll-area.ts +23 -0
  218. package/src/themes/select-menu.ts +71 -0
  219. package/src/themes/select.ts +72 -0
  220. package/src/themes/separator.ts +28 -0
  221. package/src/themes/sidebar.ts +127 -0
  222. package/src/themes/skeleton.ts +15 -0
  223. package/src/themes/slideover.ts +87 -0
  224. package/src/themes/slider.ts +48 -0
  225. package/src/themes/stepper.ts +41 -0
  226. package/src/themes/switch.ts +63 -0
  227. package/src/themes/table.ts +34 -0
  228. package/src/themes/tabs.ts +74 -0
  229. package/src/themes/textarea.ts +77 -0
  230. package/src/themes/timeline.ts +25 -0
  231. package/src/themes/toast.ts +29 -0
  232. package/src/themes/toaster.ts +66 -0
  233. package/src/themes/tooltip.ts +31 -0
  234. package/src/themes/tree.ts +41 -0
  235. package/src/themes/user.ts +28 -0
@@ -0,0 +1,373 @@
1
+ {
2
+ "id": "forest-vehicle-marker",
3
+ "file": "forest-vehicle-marker.svg",
4
+ "size": 40,
5
+ "disc": {
6
+ "cx": 20,
7
+ "cy": 20,
8
+ "r": 14.4
9
+ },
10
+ "inner": {
11
+ "r": 15.2,
12
+ "disc": 14.4,
13
+ "stroke": 1.6
14
+ },
15
+ "outer": {
16
+ "r": 19.2,
17
+ "band": 2.4,
18
+ "stroke": 1.6,
19
+ "ratio": 0.16666666666666666,
20
+ "edgeRatio": 0.6666666666666666
21
+ },
22
+ "bandMid": 17.2,
23
+ "withoutBattery": {
24
+ "outerEdge": 16
25
+ },
26
+ "dot": {
27
+ "cx": 32.16,
28
+ "cy": 7.84,
29
+ "r": 4.64,
30
+ "edge": 1.6
31
+ },
32
+ "floor": {
33
+ "px": 1,
34
+ "atIconSize": 0.625,
35
+ "edges": [
36
+ {
37
+ "name": "edge (inner stroke)",
38
+ "units": 1.6,
39
+ "painted": 1
40
+ },
41
+ {
42
+ "name": "batteryEdge (outer stroke)",
43
+ "units": 1.6,
44
+ "painted": 1
45
+ },
46
+ {
47
+ "name": "battery band",
48
+ "units": 2.4,
49
+ "painted": 1.5
50
+ },
51
+ {
52
+ "name": "dotEdge",
53
+ "units": 1.6,
54
+ "painted": 1
55
+ },
56
+ {
57
+ "name": "badge edges",
58
+ "units": 1.6,
59
+ "painted": 1
60
+ },
61
+ {
62
+ "name": "locked pause bar",
63
+ "units": 1.95,
64
+ "painted": 1.22
65
+ }
66
+ ]
67
+ },
68
+ "locked": {
69
+ "cx": 32.16,
70
+ "cy": 32.16,
71
+ "r": 4.64,
72
+ "edge": 1.6,
73
+ "barW": 1.95,
74
+ "barH": 5.34
75
+ },
76
+ "corner": {
77
+ "scale": 1.15,
78
+ "r": 4.64,
79
+ "edge": 1.6
80
+ },
81
+ "inUse": {
82
+ "cx": 0.35,
83
+ "cy": 0.3,
84
+ "r": 0.85,
85
+ "discR": 14.4
86
+ },
87
+ "badge": {
88
+ "cx": 7.84,
89
+ "cy": 32.16,
90
+ "r": 4.64,
91
+ "edge": 1.6,
92
+ "shapes": [
93
+ "square",
94
+ "triangle",
95
+ "circle",
96
+ "star"
97
+ ],
98
+ "forbidden": [
99
+ "--ui-error",
100
+ "--ui-warning"
101
+ ]
102
+ },
103
+ "glyph": {
104
+ "canvas": 24,
105
+ "scale": 0.828,
106
+ "strokeWidth": 1.74,
107
+ "inset": 10.06,
108
+ "paintedStroke": 1.441,
109
+ "floorIconSize": 0.694
110
+ },
111
+ "params": [
112
+ {
113
+ "name": "body",
114
+ "sentinel": "#FF00FF",
115
+ "kind": "disc",
116
+ "region": "The disc",
117
+ "use": "The colour of the state group"
118
+ },
119
+ {
120
+ "name": "edge",
121
+ "sentinel": "#FF01FF",
122
+ "kind": "extra",
123
+ "region": "The inner circle’s stroke",
124
+ "use": "The stroke of the inner circle. Always the background colour"
125
+ },
126
+ {
127
+ "name": "battery",
128
+ "sentinel": "#FF02FF",
129
+ "kind": "extra",
130
+ "region": "The outer circle’s fill",
131
+ "use": "The fill of the outer circle. Switch it off and the whole ring goes"
132
+ },
133
+ {
134
+ "name": "batteryEdge",
135
+ "sentinel": "#FF03FF",
136
+ "kind": "extra",
137
+ "region": "The outer circle’s stroke",
138
+ "use": "The stroke of the outer circle. Always the background colour"
139
+ },
140
+ {
141
+ "name": "dot",
142
+ "sentinel": "#FF04FF",
143
+ "kind": "extra",
144
+ "region": "The offline dot",
145
+ "use": "Connectivity. The dot appears when the vehicle is offline"
146
+ },
147
+ {
148
+ "name": "dotEdge",
149
+ "sentinel": "#FF05FF",
150
+ "kind": "extra",
151
+ "region": "The offline dot’s outline",
152
+ "use": "The outline of the dot, which separates it from the disc"
153
+ },
154
+ {
155
+ "name": "badgeSquare",
156
+ "sentinel": "#FF06FF",
157
+ "kind": "extra",
158
+ "region": "The square badge",
159
+ "use": "A badge on the lower shoulder. A square carries one class of fact"
160
+ },
161
+ {
162
+ "name": "badgeSquareEdge",
163
+ "sentinel": "#FF07FF",
164
+ "kind": "extra",
165
+ "region": "The square badge’s outline",
166
+ "use": "The outline of the square badge"
167
+ },
168
+ {
169
+ "name": "badgeTriangle",
170
+ "sentinel": "#FF08FF",
171
+ "kind": "extra",
172
+ "region": "The triangle badge",
173
+ "use": "The same badge as a triangle, for a second class of fact"
174
+ },
175
+ {
176
+ "name": "badgeTriangleEdge",
177
+ "sentinel": "#FF09FF",
178
+ "kind": "extra",
179
+ "region": "The triangle badge’s outline",
180
+ "use": "The outline of the triangle badge"
181
+ },
182
+ {
183
+ "name": "badgeCircle",
184
+ "sentinel": "#FF0AFF",
185
+ "kind": "extra",
186
+ "region": "The circle badge",
187
+ "use": "The same badge as a circle, for a third class of fact"
188
+ },
189
+ {
190
+ "name": "badgeCircleEdge",
191
+ "sentinel": "#FF0BFF",
192
+ "kind": "extra",
193
+ "region": "The circle badge’s outline",
194
+ "use": "The outline of the circle badge"
195
+ },
196
+ {
197
+ "name": "badgeStar",
198
+ "sentinel": "#FF0CFF",
199
+ "kind": "extra",
200
+ "region": "The star badge",
201
+ "use": "The same badge as a star, for a fourth class of fact"
202
+ },
203
+ {
204
+ "name": "badgeStarEdge",
205
+ "sentinel": "#FF0DFF",
206
+ "kind": "extra",
207
+ "region": "The star badge’s outline",
208
+ "use": "The outline of the star badge"
209
+ },
210
+ {
211
+ "name": "inUseFrom",
212
+ "sentinel": "#FF0EFF",
213
+ "kind": "extra",
214
+ "region": "The in-use gradient’s centre stop",
215
+ "use": "The centre stop of the in-use gradient. Transparent and the disc keeps `body`"
216
+ },
217
+ {
218
+ "name": "inUseTo",
219
+ "sentinel": "#FF0FFF",
220
+ "kind": "extra",
221
+ "region": "The in-use gradient’s edge stop",
222
+ "use": "The edge stop of the in-use gradient. Both stops go off together"
223
+ },
224
+ {
225
+ "name": "locked",
226
+ "sentinel": "#FF10FF",
227
+ "kind": "extra",
228
+ "region": "The pause mark",
229
+ "use": "The fill of the pause mark. It appears when the rider has locked the vehicle"
230
+ },
231
+ {
232
+ "name": "lockedEdge",
233
+ "sentinel": "#FF11FF",
234
+ "kind": "extra",
235
+ "region": "The pause mark’s outline and bars",
236
+ "use": "The pause mark’s outline AND its two bars — both are the background colour"
237
+ },
238
+ {
239
+ "name": "bike",
240
+ "sentinel": "#FF12FF",
241
+ "kind": "glyph",
242
+ "region": "The bike glyph",
243
+ "use": "FUNCTIONAL / Active. The only state that uses the brand mark",
244
+ "source": "packages/ui/icons/forest/bike.svg"
245
+ },
246
+ {
247
+ "name": "pine",
248
+ "sentinel": "#FF13FF",
249
+ "kind": "glyph",
250
+ "region": "The pine glyph",
251
+ "use": "Any rental. A rider has it",
252
+ "source": "packages/ui/icons/forest/mark.svg"
253
+ },
254
+ {
255
+ "name": "eye",
256
+ "sentinel": "#FF14FF",
257
+ "kind": "glyph",
258
+ "region": "The eye glyph",
259
+ "use": "INSPECT / Inspect. Somebody looks at it",
260
+ "source": "lucide:eye"
261
+ },
262
+ {
263
+ "name": "relocate",
264
+ "sentinel": "#FF15FF",
265
+ "kind": "glyph",
266
+ "region": "The relocate glyph",
267
+ "use": "RELOCATE / Relocate. It must be moved",
268
+ "source": "lucide:arrow-right-left"
269
+ },
270
+ {
271
+ "name": "wrench",
272
+ "sentinel": "#FF16FF",
273
+ "kind": "glyph",
274
+ "region": "The wrench glyph",
275
+ "use": "MAINTENANCE / Task in progress",
276
+ "source": "lucide:wrench"
277
+ },
278
+ {
279
+ "name": "warehouse",
280
+ "sentinel": "#FF17FF",
281
+ "kind": "glyph",
282
+ "region": "The warehouse glyph",
283
+ "use": "SERVICE_WORKSHOP / Warehouse",
284
+ "source": "lucide:warehouse"
285
+ },
286
+ {
287
+ "name": "truck",
288
+ "sentinel": "#FF18FF",
289
+ "kind": "glyph",
290
+ "region": "The truck glyph",
291
+ "use": "COLLECT / Damage collect. Someone takes it away",
292
+ "source": "lucide:truck"
293
+ },
294
+ {
295
+ "name": "bandage",
296
+ "sentinel": "#FF19FF",
297
+ "kind": "glyph",
298
+ "region": "The bandage glyph",
299
+ "use": "SERVICE_ON_SITE / Damaged",
300
+ "source": "lucide:bandage"
301
+ },
302
+ {
303
+ "name": "question",
304
+ "sentinel": "#FF1AFF",
305
+ "kind": "glyph",
306
+ "region": "The question glyph",
307
+ "use": "LOST / Missing",
308
+ "source": "lucide:circle-question-mark"
309
+ },
310
+ {
311
+ "name": "hand",
312
+ "sentinel": "#FF1BFF",
313
+ "kind": "glyph",
314
+ "region": "The hand glyph",
315
+ "use": "OPERATIONAL_HOLD / Support & community",
316
+ "source": "lucide:hand"
317
+ },
318
+ {
319
+ "name": "flag",
320
+ "sentinel": "#FF1CFF",
321
+ "kind": "glyph",
322
+ "region": "The flag glyph",
323
+ "use": "AWAITING_ACTION / Investigation",
324
+ "source": "lucide:flag"
325
+ },
326
+ {
327
+ "name": "ready",
328
+ "sentinel": "#FF1DFF",
329
+ "kind": "glyph",
330
+ "region": "The ready glyph",
331
+ "use": "READY_FOR_DEPLOYMENT / Ready for deployment",
332
+ "source": "lucide:package-check"
333
+ },
334
+ {
335
+ "name": "skull",
336
+ "sentinel": "#FF1EFF",
337
+ "kind": "glyph",
338
+ "region": "The skull glyph",
339
+ "use": "RETIRED / Terminated. Out of the fleet permanently",
340
+ "source": "lucide:skull"
341
+ },
342
+ {
343
+ "name": "container",
344
+ "sentinel": "#FF1FFF",
345
+ "kind": "glyph",
346
+ "region": "The container glyph",
347
+ "use": "IMPOUNDED / Storage",
348
+ "source": "lucide:container"
349
+ },
350
+ {
351
+ "name": "staff",
352
+ "sentinel": "#FF20FF",
353
+ "kind": "glyph",
354
+ "region": "The staff glyph",
355
+ "use": "SERVICE_MECHANICS / Staff. An internal team has it",
356
+ "source": "lucide:briefcase-business"
357
+ }
358
+ ],
359
+ "bannedElements": [
360
+ "style",
361
+ "text",
362
+ "tspan",
363
+ "image",
364
+ "clipPath",
365
+ "mask",
366
+ "filter",
367
+ "pattern",
368
+ "marker",
369
+ "symbol",
370
+ "foreignObject"
371
+ ],
372
+ "generator": "scripts/mapMarker.ts"
373
+ }
@@ -0,0 +1,83 @@
1
+ {
2
+ "id": "forest-place-count",
3
+ "file": "forest-place-count.svg",
4
+ "width": 42,
5
+ "height": 28,
6
+ "shape": "stretchable-pill",
7
+ "ring": {
8
+ "stroke": 2.8,
9
+ "ratio": 0.2
10
+ },
11
+ "floor": {
12
+ "px": 1,
13
+ "atIconSize": 0.7,
14
+ "edges": [
15
+ {
16
+ "name": "ring",
17
+ "units": 2.8,
18
+ "painted": 1.96
19
+ }
20
+ ]
21
+ },
22
+ "glyph": {
23
+ "canvas": 24,
24
+ "scale": 0.5,
25
+ "strokeWidth": 2.52,
26
+ "cx": 14,
27
+ "cy": 14
28
+ },
29
+ "stretchX": {
30
+ "left": 25,
31
+ "width": 2
32
+ },
33
+ "content": {
34
+ "left": 25,
35
+ "top": 0,
36
+ "width": 9,
37
+ "height": 28
38
+ },
39
+ "requires": {
40
+ "icon-text-fit": "width"
41
+ },
42
+ "params": [
43
+ {
44
+ "name": "body",
45
+ "sentinel": "#FF00FF",
46
+ "kind": "body",
47
+ "region": "The pill",
48
+ "use": "The colour of the place."
49
+ },
50
+ {
51
+ "name": "ring",
52
+ "sentinel": "#FF01FF",
53
+ "kind": "extra",
54
+ "region": "The ring",
55
+ "use": "The border, and the halo that separates the mark from the basemap."
56
+ },
57
+ {
58
+ "name": "warehouse",
59
+ "sentinel": "#FF02FF",
60
+ "kind": "glyph",
61
+ "region": "the warehouse glyph",
62
+ "use": "A warehouse or workshop. Vehicles are repaired and stored here.",
63
+ "source": "lucide:house"
64
+ },
65
+ {
66
+ "name": "parking",
67
+ "sentinel": "#FF03FF",
68
+ "kind": "glyph",
69
+ "region": "the parking glyph",
70
+ "use": "A parking bay or station. A rider should leave a vehicle here.",
71
+ "source": "packages/ui/icons/forest/parking.svg"
72
+ },
73
+ {
74
+ "name": "bike",
75
+ "sentinel": "#FF04FF",
76
+ "kind": "glyph",
77
+ "region": "the bike glyph",
78
+ "use": "A count of vehicles. Used on the pill, where the number says how many.",
79
+ "source": "packages/ui/icons/forest/bike.svg"
80
+ }
81
+ ],
82
+ "generator": "scripts/mapPlaces.ts"
83
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "id": "forest-place-marker",
3
+ "file": "forest-place-marker.svg",
4
+ "size": 40,
5
+ "shape": "rounded-square",
6
+ "square": {
7
+ "x": 1.665,
8
+ "y": 1.665,
9
+ "side": 36.67,
10
+ "corner": 9.17,
11
+ "half": 16.67
12
+ },
13
+ "ring": {
14
+ "stroke": 3.33,
15
+ "ratio": 0.2
16
+ },
17
+ "floor": {
18
+ "px": 1,
19
+ "atIconSize": 0.7,
20
+ "edges": [
21
+ {
22
+ "name": "ring",
23
+ "units": 3.33,
24
+ "painted": 2.33
25
+ }
26
+ ]
27
+ },
28
+ "glyph": {
29
+ "canvas": 24,
30
+ "scale": 0.9585,
31
+ "strokeWidth": 1.74
32
+ },
33
+ "params": [
34
+ {
35
+ "name": "body",
36
+ "sentinel": "#FF00FF",
37
+ "kind": "body",
38
+ "region": "The square",
39
+ "use": "The colour of the place."
40
+ },
41
+ {
42
+ "name": "ring",
43
+ "sentinel": "#FF01FF",
44
+ "kind": "extra",
45
+ "region": "The ring",
46
+ "use": "The border, and the halo that separates the mark from the basemap."
47
+ },
48
+ {
49
+ "name": "warehouse",
50
+ "sentinel": "#FF02FF",
51
+ "kind": "glyph",
52
+ "region": "the warehouse glyph",
53
+ "use": "A warehouse or workshop. Vehicles are repaired and stored here.",
54
+ "source": "lucide:house"
55
+ },
56
+ {
57
+ "name": "parking",
58
+ "sentinel": "#FF03FF",
59
+ "kind": "glyph",
60
+ "region": "the parking glyph",
61
+ "use": "A parking bay or station. A rider should leave a vehicle here.",
62
+ "source": "packages/ui/icons/forest/parking.svg"
63
+ },
64
+ {
65
+ "name": "bike",
66
+ "sentinel": "#FF04FF",
67
+ "kind": "glyph",
68
+ "region": "the bike glyph",
69
+ "use": "A count of vehicles. Used on the pill, where the number says how many.",
70
+ "source": "packages/ui/icons/forest/bike.svg"
71
+ }
72
+ ],
73
+ "generator": "scripts/mapPlaces.ts"
74
+ }
@@ -0,0 +1,6 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M12 2L17.2 12.4H15.4L17.2 16H6.8L8.6 12.4H6.8L12 2Z" stroke-width="2"
3
+ stroke-linecap="round" stroke-linejoin="round" />
4
+ <path d="M10.2 16V22H8.6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
5
+ <path d="M13.8 16V22H15.4" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M12 2L17.2 12.4H15.4L17.2 16H6.8L8.6 12.4H6.8L12 2Z" stroke-width="2"
3
+ stroke-linecap="round" stroke-linejoin="round" />
4
+ <path d="M10.2 16V22H8.6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
5
+ <path d="M13.8 16V22H15.4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
6
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M4.68 20.5 6.48 3.5H12.99Q16.15 3.5 17.78 5.02Q19.41 6.53 19.32 9.35Q19.24 12.66 17.19 14.43Q15.14 16.2 11.62 16.2H10.22L9.78 20.5ZM10.7 11.79H11.95Q13 11.79 13.57 11.26Q14.14 10.73 14.2 9.74Q14.23 8.88 13.77 8.4Q13.3 7.91 12.38 7.91H11.1Z" />
3
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M 11.5251 2.2969 a 0.5299 0.5299 0 0 1 0.9498 0 l 2.3095 4.6781 a 2.1196 2.1196 0 0 0 1.5947 1.1598 l 5.165 0.7558 a 0.5299 0.5299 0 0 1 0.2939 0.9038 l -3.7353 3.6373 a 2.1196 2.1196 0 0 0 -0.6109 1.8776 l 0.8818 5.139 a 0.5299 0.5299 0 0 1 -0.7708 0.5599 l -4.6171 -2.4275 a 2.1196 2.1196 0 0 0 -1.9726 0 L 6.3971 21.0082 a 0.5299 0.5299 0 0 1 -0.7698 -0.5599 l 0.8808 -5.138 a 2.1196 2.1196 0 0 0 -0.6109 -1.8786 L 2.162 9.7954 a 0.5299 0.5299 0 0 1 0.2939 -0.9058 l 5.164 -0.7548 a 2.1196 2.1196 0 0 0 1.5967 -1.1598 z"
3
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
4
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M 11.5251 2.2969 a 0.5299 0.5299 0 0 1 0.9498 0 l 2.3095 4.6781 a 2.1196 2.1196 0 0 0 1.5947 1.1598 l 5.165 0.7558 a 0.5299 0.5299 0 0 1 0.2939 0.9038 l -3.7353 3.6373 a 2.1196 2.1196 0 0 0 -0.6109 1.8776 l 0.8818 5.139 a 0.5299 0.5299 0 0 1 -0.7708 0.5599 l -4.6171 -2.4275 a 2.1196 2.1196 0 0 0 -1.9726 0 L 6.3971 21.0082 a 0.5299 0.5299 0 0 1 -0.7698 -0.5599 l 0.8808 -5.138 a 2.1196 2.1196 0 0 0 -0.6109 -1.8786 L 2.162 9.7954 a 0.5299 0.5299 0 0 1 0.2939 -0.9058 l 5.164 -0.7548 a 2.1196 2.1196 0 0 0 1.5967 -1.1598 z"
3
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
4
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="7" y="2" width="10" height="18" rx="2" stroke-width="2" stroke-linecap="round"
3
+ stroke-linejoin="round" />
4
+ <path d="M12 20v2" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
5
+ <circle cx="12" cy="6" r="2" fill="currentColor" stroke="none" />
6
+ <circle cx="12" cy="11" r="2" fill="var(--ui-warning, currentColor)" stroke="none" />
7
+ <circle cx="12" cy="16" r="2" fill="currentColor" stroke="none" />
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="7" y="2" width="10" height="18" rx="2" stroke-width="2" stroke-linecap="round"
3
+ stroke-linejoin="round" />
4
+ <path d="M12 20v2" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
5
+ <circle cx="12" cy="6" r="2" fill="currentColor" stroke="none" />
6
+ <circle cx="12" cy="11" r="2" fill="currentColor" stroke="none" />
7
+ <circle cx="12" cy="16" r="2" fill="var(--ui-success, currentColor)" stroke="none" />
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="7" y="2" width="10" height="18" rx="2" stroke-width="2" stroke-linecap="round"
3
+ stroke-linejoin="round" />
4
+ <path d="M12 20v2" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
5
+ <circle cx="12" cy="6" r="2" fill="var(--ui-error, currentColor)" stroke="none" />
6
+ <circle cx="12" cy="11" r="2" fill="var(--ui-warning, currentColor)" stroke="none" />
7
+ <circle cx="12" cy="16" r="2" fill="var(--ui-success, currentColor)" stroke="none" />
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="7" y="2" width="10" height="18" rx="2" stroke-width="2" stroke-linecap="round"
3
+ stroke-linejoin="round" />
4
+ <path d="M12 20v2" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
5
+ <circle cx="12" cy="6" r="2" fill="var(--ui-error, currentColor)" stroke="none" />
6
+ <circle cx="12" cy="11" r="2" fill="currentColor" stroke="none" />
7
+ <circle cx="12" cy="16" r="2" fill="currentColor" stroke="none" />
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="7" y="2" width="10" height="18" rx="2" stroke-width="2" stroke-linecap="round"
3
+ stroke-linejoin="round" />
4
+ <path d="M12 20v2" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
5
+ <circle cx="12" cy="6" r="2" fill="currentColor" stroke="none" />
6
+ <circle cx="12" cy="11" r="2" fill="currentColor" stroke="none" />
7
+ <circle cx="12" cy="16" r="2" fill="currentColor" stroke="none" />
8
+ </svg>
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@humanforest/ui",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "files": [
6
+ "src",
7
+ "icons",
8
+ "*.css"
9
+ ],
10
+ "dependencies": {
11
+ "@humanforest/tokens": "^0.1.0",
12
+ "@internationalized/date": "^3.12.2",
13
+ "@mapbox/search-js-core": "^1.6.0",
14
+ "@turf/boolean-point-in-polygon": "^7.4.0",
15
+ "@turf/helpers": "^7.4.0",
16
+ "mapbox-gl": "^3.28.1",
17
+ "tailwind-variants": "3.2.2"
18
+ },
19
+ "peerDependencies": {
20
+ "vue": "^3.5",
21
+ "@nuxt/ui": "^4",
22
+ "tailwindcss": "^4",
23
+ "reka-ui": "^2.9.9"
24
+ },
25
+ "exports": {
26
+ ".": "./src/index.ts",
27
+ "./map": "./src/map/index.ts",
28
+ "./map-search-places": "./src/map/sources/mapboxPlaces.ts",
29
+ "./map-search-coordinates": "./src/map/sources/coordinates.ts",
30
+ "./address": "./src/address/index.ts",
31
+ "./canvas": "./src/canvas/index.ts",
32
+ "./kpi": "./src/kpi/index.ts",
33
+ "./logo": "./src/logo/index.ts",
34
+ "./shell": "./src/shell/index.ts",
35
+ "./filter": "./src/filter/index.ts",
36
+ "./contexts": "./src/contexts/index.ts",
37
+ "./icons": "./src/icons.ts",
38
+ "./forest-preset": "./src/forest-preset.ts",
39
+ "./css": "./src/styles/index.css",
40
+ "./styles/forest.css": "./src/styles/forest.css",
41
+ "./map-marker-manifest": "./icons/forest/map/manifest.json",
42
+ "./map-place-manifest": "./icons/forest/map/place-manifest.json",
43
+ "./map-place-count-manifest": "./icons/forest/map/place-count-manifest.json",
44
+ "./map/style": "./src/map/style.ts",
45
+ "./kpi/delta": "./src/kpi/kpiDelta.ts",
46
+ "./kpi/format": "./src/kpi/kpiFormat.ts"
47
+ },
48
+ "devDependencies": {
49
+ "@nuxt/ui": "^4.10.0",
50
+ "@tailwindcss/vite": "^4.3.3",
51
+ "@vitejs/plugin-vue": "^6.0.8",
52
+ "@vitest/browser": "^4.1.10",
53
+ "playwright": "^1.61.1",
54
+ "reka-ui": "2.10.1",
55
+ "tailwindcss": "^4.3.3",
56
+ "vite": "^8.1.5",
57
+ "vitest": "^4.1.10",
58
+ "vue": "^3.5.40"
59
+ },
60
+ "publishConfig": {
61
+ "access": "public"
62
+ },
63
+ "license": "SEE LICENSE IN LICENSE"
64
+ }