@signalk/freeboard-sk 3.1.0-beta.0 → 3.1.0-beta.2

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signalk/freeboard-sk",
3
- "version": "3.1.0-beta.0",
3
+ "version": "3.1.0-beta.2",
4
4
  "description": "Openlayers chart plotter implementation for Signal K",
5
5
  "keywords": [
6
6
  "signalk-webapp",
@@ -1 +1 @@
1
- {"docs":[{"id":"buddy-list","raw":"---\nid: buddy-list\ntitle: Buddy List\ncategory: AIS & Vessels\n---\n\nKeep track of boats you know — friends, other boats in your flotilla — by\nmarking them as **buddies**, then filter the vessel list down to just them\nwhen you want to find one quickly.\n\nThis requires the [signalk-buddylist-plugin](https://www.npmjs.com/package/signalk-buddylist-plugin)\ninstalled on your Signal K server. Without it, Freeboard behaves as before —\nthere's no buddy marking or filtering available.\n\n**To mark a vessel as a buddy**, tap it on the chart to open its popover and\ntap the **Is Buddy** button. Tap it again to remove the mark.\n\n**To see just your buddies**, open **Vessels** from the main menu and switch\non the **Buddies Only** toggle in the filter row. The list narrows to the\nvessels you've marked. Buddies Only can be combined with the list's other\nfilters — Ship Type and IMO Only — to narrow things down further.\n"},{"id":"chart-image-adjustment","raw":"---\nid: chart-image-adjustment\ntitle: Chart Image Adjustment\ncategory: Charts\n---\n\n![Fig 1. The Image Adjustment palette, opened from the tune icon in the chart list](chart-image-adjustment-1.jpg)\n\nAerial and satellite chart imagery is usually exposed for the land, which\ncan leave the water — where the hazards are — looking crushed and nearly\nblack. Adjusting the brightness and contrast can pull submerged rocks,\nshallows, and reefs back into view, which is handy when you're scouting an\nanchorage.\n\n**To adjust a chart's image**, open the chart list and tap the **tune**\nicon next to a chart (it appears alongside the existing opacity control,\nfor image-based charts only). The chart list closes and a compact **Image\nAdjustment** palette opens over the map, headed by the name of the chart\nlayer you're working on.\n\nThe palette is modeless — there is no backdrop, so panning and zooming stay\navailable while you adjust. Drag it by its header to move it clear of the\nwater you're studying; it reopens wherever you last left it, even after a\nreload.\n\n**Brightness** and **Contrast** run from 0% to 200%, with 100% being\nneutral, and the chart updates live as you drag. **RESET** returns both to\nneutral. **SAVE** keeps your changes; closing the palette with its **close**\nbutton instead discards them and puts the chart back as it was.\n\nA saved adjustment is stored with that chart, alongside its opacity, so it's\nstill applied the next time you open Freeboard. Left untouched, a chart looks\nexactly as it always has — the neutral default makes no visible change.\n\nThis applies to raster, tile, WMS, and WMTS image charts. Vector charts\n(like S-57) don't have an image to adjust, so the control doesn't appear\nfor them.\n"},{"id":"chart-list","raw":"---\nid: chart-list\ntitle: Chart List\ncategory: Charts\n---\n\n![Fig 1. The chart list, with Bounds turned on so each chart's outline is drawn on the map](chart-list-1.jpg)\n\nThe **Chart List** is where you pick which charts are drawn on the screen, what order\nthey stack in, and how each one looks. Open it from the resources menu, then **Charts**.\n\nEvery chart the server offers is listed with its name and description. A **map** icon\nmarks a chart hosted on your own Signal K server; a **globe** icon marks one fetched from\nthe internet — worth a glance before you rely on a chart offshore.\n\n**To show or hide a chart**, tick or untick its checkbox. The checkbox at the top of the\npanel switches every chart on or off at once, and **refresh** re-reads the list from the\nserver if you've just installed new charts.\n\n## Finding a chart in a long list\n\nA boat carrying a full regional ENC set can have hundreds of charts, so there are three\nways to narrow the list. They combine, so you can use them together.\n\n- **Type to filter list** — matches on the chart's name.\n- **In view** — hides every chart that doesn't cover what you're currently looking at.\n The list re-filters live as you pan and zoom, so it always reflects the current view.\n Charts that don't declare bounds (OpenStreetMap, for instance) count as covering\n everywhere and stay listed whatever the view.\n- **Bounds** — draws the outline of every listed chart on the map, so you can see what\n covers where. Clicking an outline brings up the charts at that spot and lets you switch\n one on directly, without finding it in the list.\n\n**In view** and **Bounds** both start off each time you open the list — they're a way to\nsearch, not a setting to leave set.\n\n## Chart order\n\nCharts are drawn stacked, and the one on top is the one you read. **Re-order** (the\n`import_export` icon) opens the **Chart Order** screen: drag charts to arrange them, with\nthe top layer at the top of the list and the base layer — a world map, typically — at the\nbottom. Your order is saved and reused next time.\n\n![Fig 2. The Chart Order screen — drag a chart to move it up or down the stack](chart-list-2.jpg)\n\nThe chart list itself is shown in that same top-layer-first order, so what you see in the\nlist is the stack you arranged. Change the order and return, and the list follows\nimmediately.\n\nCharts you have never re-ordered start out stacked by scale — the largest-area chart at\nthe bottom, so the most detailed one ends up on top. That is only the starting point:\nonce you drag anything, your order wins.\n\n## Per-chart actions\n\n![Fig 3. A chart entry, with its actions along the bottom](chart-list-3.jpg)\n\nAlong the bottom of each entry is a row of icons — the actions for that chart. Only the\nones that apply are shown, so the row is shorter on some charts than on others. In the\nrow above, left to right:\n\n- **Properties** (the *i* in a circle) — view and edit the chart's details.\n- **Opacity** (the droplet) — fade a chart to let the one beneath show through. Useful\n for laying a harbour chart over an aerial image.\n- **Image adjustment** (the sliders) — brightness and contrast; image-based charts only.\n See the **Chart Image Adjustment** feature.\n- **Add to Group** (the shapes) — file the chart into a resource group. Only shown when\n your server supports resource groups.\n\nTwo more appear where they apply:\n\n- **Cache Tiles** (the download arrow) — select an area of the map to download for\n offline use. Only offered for charts the chart provider serves as proxied.\n- **Remove** (the waste bin) — delete a chart you added yourself. Charts that come from\n the server's chart plugin can't be deleted from here.\n\nOpacity and image adjustment are saved per chart and persist between sessions. The\ncheckbox on the right of the entry is what shows or hides the chart.\n\n## Adding your own chart source\n\n**Add** (the `add` icon) registers a new chart source with the server — **WMTS**, **WMS**,\nor a **JSON Map Source**. Added charts appear in the list alongside the rest and can be\nremoved again with **Remove**.\n\nFreeboard also offers OpenStreetMap and OpenSeaMap without any server-side charts\ninstalled; both need an internet connection to draw.\n\nNote that everything else in the list comes from the Signal K server, so a chart plugin\n(such as `@signalk/charts-plugin`) has to be installed and configured before your own\ncharts appear here.\n"},{"id":"chart-zoom-limits","raw":"---\nid: chart-zoom-limits\ntitle: Chart Zoom Limits\ncategory: Charts\n---\n\nEvery chart holds detail down to a certain resolution and no further. Zoom in past that\npoint and you aren't shown more information — you're shown the last real chart data\nmagnified, which looks sharper than it is. Freeboard gives you two controls over what\nhappens at that boundary.\n\n## Constrain map zoom\n\nThe **Constrain map zoom** button (the `zoom_in_map` icon on the right-hand toolbar) stops\nthe map at the edge of your chart data. Turn it on and you simply cannot zoom in — or out —\nbeyond the range your selected charts actually cover. The button highlights while active,\nand the zoom **+** / **−** buttons grey out once you reach a limit.\n\nThe limits are taken from the **widest** range across all currently selected charts: the\nlowest minimum zoom and the highest maximum zoom of any of them. Selecting or deselecting\ncharts recalculates it, so the constraint always reflects what you have switched on. Charts\nthat don't declare their own zoom range fall back to a 0–24 range. With the setting off,\nthe map is free to move between zoom 2 and 28 regardless of what your charts hold.\n\nThis is off by default. It matters most when you're working from downloaded or offline\nchart sets — a cached raster or MBTiles collection on a boat with no internet — where\nzooming past the data can't be rescued by fetching better tiles, and where a magnified\ntile can read as detail that was never surveyed.\n\n## Keep tiles visible on max zoom\n\nThe companion setting, **Keep tiles visible on max zoom** (Settings → Map), decides what a\nchart layer does once you pass *its* maximum zoom. Leave it on — it is on by default — and\nthe chart keeps drawing, stretched, instead of disappearing. Turn it off and each layer\nstops rendering beyond the resolution it genuinely has, leaving the chart blank there.\n\nIt also matters when charts of different resolutions are stacked. In a selection mixing a\nwide-area chart with a detailed harbour chart, the lower-resolution one keeps rendering\n(stretched) up to the map's maximum rather than dropping out as you zoom in.\n\nThe two settings answer different questions: *Constrain map zoom* decides **whether you can\nget there at all**, while *Keep tiles visible on max zoom* decides **what you see if you\ndo**. With the defaults — constrain off, keep-tiles on — you can zoom freely and charts\nstay visible but progressively blurrier past their real detail.\n"},{"id":"cursor-eta","raw":"---\nid: cursor-eta\ntitle: Live ETA at Cursor\ncategory: Display\n---\n\n![Fig 1. The Status Bar Options settings, and the resulting Brg/Dist/ETA readout in the status bar](cursor-eta-1.jpg)\n\nGet a quick bearing, distance, and time estimate to any point on the chart —\nwithout setting a destination first.\n\n**To turn it on**, go to **Settings → Display → Status Bar Options** and check\n**Live ETA at cursor**. It's off by default. Once on, the status bar adds the\nbearing, distance, and ETA from your boat to the point you're pointing at,\nalongside the existing latitude/longitude readout.\n\n**With a mouse**, the readout follows the pointer as you move it over the chart.\n\n**Click or tap the chart** and the readout locks onto that point, with a marker\nshowing which point it refers to. The marker fades away and the readout is\nreleased with it, so the numbers are never left on screen with nothing\nidentifying what they describe. Tap somewhere else to measure to the new point.\nThis gives a touchscreen at the helm the same \"how far is that?\" gesture a mouse\nuser gets — dragging the chart still just pans it, and a press-and-hold still\nopens the chart menu.\n\n**Tap Fade Speed** sets how long the marker takes to fade, in seconds (minimum\n1, default 1.5). Raise it to give yourself longer to read the numbers; lower it\nif the marker sits over something on the chart you want to see or grab.\n\nThe ETA uses your boat's current speed over ground. If you're stopped — at\nanchor, hove to — there's no speed to estimate from, so Freeboard falls back to\na **Reference Boat Speed** you set alongside the checkbox, keeping the ETA\nuseful even when you're not moving.\n"},{"id":"custom-map-symbols","raw":"---\nid: custom-map-symbols\ntitle: Custom Map Symbols\ncategory: Charts\n---\n\n![Fig 1. A custom route start marker and a custom anchorage icon shown on the chart](custom-map-symbols-1.jpg)\n\nFreeboard normally marks notes, waypoints, your boat, AIS traffic, aids to\nnavigation, and route points with its own built-in icons. If you'd rather use\nyour own artwork — a personal marker for a favorite dive site, a custom boat\nicon for your own vessel, a branded buoy — you can, once you install a\n**symbol provider** app on your Signal K server. Freeboard picks up whatever\nicons the provider offers and uses them automatically — there's nothing to\nturn on.\n\nThe reference app for this is\n[signalk-symbol-manager](https://www.npmjs.com/package/signalk-symbol-manager),\nwhich gives you a simple web page for uploading and organizing your own icons.\nAny similar app that publishes icons the standard way works too.\n\n## Two ways to use a custom icon\n\n**Replace one of Freeboard's built-in icons.** Give your icon the same name\nas the built-in you want to replace (for example `dive-site`) and mark it as\nbelonging to Freeboard's icon set. Your version then shows up everywhere that\nicon is normally used — on the chart and in the icon pickers — without you\nhaving to touch any existing notes or waypoints. See the reference list below\nfor which built-in names you can replace.\n\n**Add a brand-new icon.** Give your icon a new name of your choosing and it\nshows up as an extra option in the icon pickers, alongside the built-ins.\n\nWhen you've replaced a built-in, the picker shows only your version — not\nboth — so the list doesn't get cluttered. Flip the **\"Show all symbols\"**\ntoggle in a note or waypoint's icon picker to see everything at once,\nbuilt-ins included, in case you ever want to go back to the original. If you\ndeliberately pick the original built-in this way, Freeboard remembers your\nchoice and won't swap your custom icon back in later.\n\n## Where custom icons show up\n\n| Area | Custom icons? |\n|------|:---:|\n| Notes | Yes |\n| Waypoints | Yes |\n| Your own vessel | Yes |\n| AIS vessels | Yes |\n| Aids to navigation | Yes |\n| Route start / turn / end points | Yes |\n| Wind, ocean current and tidal current arrows | Yes |\n| Special waypoint markers (start pin, start boat, sightings, alarms) | No |\n| Shaded chart areas | No |\n| Dots for moored vessels | No |\n\nIcons that normally rotate to a heading or bearing — your vessel, AIS\ntargets, aids to navigation, route turn points, and the wind and current\ndirection arrows — keep rotating correctly even when you've replaced them with\nyour own artwork.\n\n## Built-in icon names you can replace\n\nTo replace one of these, give your icon the matching name below.\n\n**Note and waypoint markers:**\n\n```\nanchorage boatramp bridge business dam\ndive-site ferry hazard inlet lock\nmarina dock turning-basin radio-call-point\ntranshipment-dock notice-to-mariners diver-down\nnavigation-structure fuel tunnel waterway-guage\n```\n\n**Generic waypoint marker:** `waypoint`\n\n**Your own vessel:** `vessel-self`\n\n**AIS vessels** (by type):\n\n```\nais_active ais_highspeed ais_special ais_passenger ais_cargo\nais_tanker ais_other ais_inactive ais_buddy ais_self\n```\n\n(`ais_self` is whichever AIS target you currently have selected — not your\nown boat, which is `vessel-self`.)\n\n**Aids to navigation** — each comes in a physical (`real-…`) and an AIS-only\n(`virtual-…`) version:\n\n```\nreal-north / virtual-north real-east / virtual-east\nreal-south / virtual-south real-west / virtual-west\nreal-port / virtual-port real-starboard / virtual-starboard\nreal-danger / virtual-danger real-safe / virtual-safe\nreal-special / virtual-special real-basestation / virtual-basestation\nreal-weatherStation / virtual-weatherStation\nreal-aton / virtual-aton\n```\n\n**Route points:** `route-start`, `route-waypoint`, `route-end`\n\n**Weather indicators** — the direction arrows on the wind, ocean current and\ntidal current overlays:\n\n```\nwindIndicator-arrow oceanCurrentIndicator-arrow tidalCurrentIndicator-arrow\n```\n\nThe two current arrows are tinted by Freeboard to show speed, so draw\nreplacements for those with a plain white fill — a pre-coloured glyph comes out\nmuddy. The wind arrow isn't tinted and renders in your own colours.\n\nYour own vessel, AIS, aids-to-navigation, route and weather-indicator icons\napply everywhere at once — Freeboard picks these automatically rather than\nletting you choose them per marker, so one custom icon covers every marker of\nthat kind.\n\n## Keeping icons through GPX import and export\n\nIf your icon declares a matching GPX symbol name, Freeboard will recognize it\nwhen you import a GPX file — a waypoint tagged with that symbol picks up your\ncustom icon instead of the default marker. Exporting a waypoint that uses a\ncustom icon writes the same information back into the GPX file, so the icon\nsurvives a round trip: export, re-import elsewhere, and your custom icon is\nstill there.\n\n## Without a symbol provider\n\nIf you haven't installed a symbol provider — or it isn't publishing any\nicons — Freeboard looks and behaves exactly as it always has: built-in icons\neverywhere, and \"Show all symbols\" just shows the built-ins.\n"},{"id":"extension-panels","raw":"---\nid: extension-panels\ntitle: Extension Panels\ncategory: Extensions\n---\n\n![Fig 1. A plugin's search panel open alongside its toolbar button](extension-panels-1.jpg)\n\nPanel extensions let a Signal K server plugin add a completely new feature to\nFreeboard, without waiting on a Freeboard code change to get it. You can pick\nand choose which of these tools you want installed on your boat. Each one\nadds its own new button to Freeboard's toolbar — for example, a proximity\nsearch for nearby points of interest, or an automatic route planner that\nroutes around land.\n\n![Fig 2. An auto-routing panel, another example of a panel extension](extension-panels-2.jpg)\n\n**To use one**, tap the grid icon in the top-right corner of the chart to\nreveal the toolbar, then tap the plugin's button. Its panel slides in from\nthe right-hand side of the screen. Tap the button again, or use the panel's\nown close button, to put it away.\n\nA panel can also narrow down what's shown on the chart — for example,\nfiltering the waypoints list to just the ones matching your search. When a\npanel does this, a small chip appears near the top of the screen describing\nthe filter; tap its **×** to clear it and show everything again.\n\nIf you haven't installed any plugins that add a panel, the extension toolbar\nbutton doesn't appear — Freeboard looks and works exactly as it always has.\n"},{"id":"feature-browser","raw":"---\nid: feature-browser\ntitle: Feature Browser\ncategory: Display\n---\n\nThis very window you're looking at right now is the **Feature Browser** — a\nsearchable \"What's New\" window covering everything Freeboard can do. Curious\nwhat a feature does, how to use it, or when it was added? Open it any time\nfrom the **⋯ (More actions)** menu, no matter what you're doing on the\nchart.\n\nEach entry shows a screenshot, a plain description of what the feature does\nand how to use it, and the release it last changed in — click a screenshot\nto view it larger. When a feature has changed in the current release, its\nnewest changes are listed at the top of the entry so you don't have to hunt\nfor them; the complete history sits in a table at the bottom. Search narrows\nthe list by name, and you can sort the table by category, feature, status,\nor release.\n\nA small lightbulb button also appears on the left toolbar whenever there's\nsomething new or changed you haven't seen yet — click it to jump straight\ninto the Feature Browser. It only shows up when there's something to tell\nyou about, and disappears once you've opened the browser. Freeboard no\nlonger interrupts you with a welcome screen or a \"what's new\" popup when it\nstarts — this lightbulb is the quiet, opt-in replacement.\n"},{"id":"follow-vessel","raw":"---\nid: follow-vessel\ntitle: Center & Follow Vessel\ncategory: Map\n---\n\n![Fig 1. Following with an Ahead offset — the boat sits low on screen and the chart in front of it gets the room](follow-vessel-1.jpg)\n\nKeep your boat on screen without touching the chart. Follow Vessel mode centers the\nvessel and holds it there as you move, so the chart scrolls under you instead of you\nchasing it.\n\n## The button\n\n**Center & Follow Vessel**, on the left-hand toolbar, does both jobs. A press centers the\nvessel and turns follow mode on, easing out to your offset a couple of seconds later. The\nbutton stays highlighted while follow mode is on. Press it again to turn follow mode off —\nthe chart stays exactly where it is, so whatever you'd panned across to study stays in\nview. The button is disabled until your boat's position is known.\n\nJust want to center the boat once, without following it? Press again before it eases off\ncenter, and the boat stays where it is.\n\n## Offset Vessel Center\n\n![Fig 2. Offset Vessel Center and Map Pan When Following, in Settings → Map](follow-vessel-2.jpg)\n\nSitting dead center spends half your screen on water you have already covered.\n**Settings → Map → Offset Vessel Center (%)** moves the boat off center so the chart that\nmatters gets the room. Two values, each a whole percentage up to ±90 of the distance from\nthe middle of the screen to its edge:\n\n- **Ahead** — moves the vessel back so there is more chart in front of it. `50` puts the\n boat halfway between the center and the trailing edge. A negative value looks behind the\n boat instead.\n- **Abeam** — moves the vessel to one side. A positive value shows more to starboard, a\n negative value more to port.\n\nBoth are measured against your **course** rather than the screen, so the offset turns with\nthe boat. That is what keeps it honest in north-up: an offset fixed to the screen would\nshow a vessel heading south the water it had already passed.\n\nLarge values on both axes together would put the boat diagonally outside the corner of the\nscreen, so Freeboard scales the pair back as a unit when that would happen — the vessel\nstays visible, and the offset you are shown is the offset that gets stored. A value on one\naxis alone is never affected.\n\n## Setting the offset by panning\n\nYou don't have to work the numbers out at all. With **Map Pan When Following** set to\n**Set Follow Offset**, simply pan the chart until the boat sits where you want it.\nFreeboard works out the Ahead and Abeam values from where you dropped it and saves them,\nstaying in follow mode the whole time — so the boat holds that spot from then on. For most\npeople this is the only way they will ever set the offset.\n\n## Map Pan When Following\n\n**Settings → Map → Map Pan When Following** decides what panning the chart does while\nfollow mode is on:\n\n- **Set Follow Offset** — follow mode stays on and your pan sets the offset, as above.\n- **Exit Follow Mode** — panning turns follow mode off and leaves the chart where you put\n it.\n- **Do nothing** — follow mode stays on and the vessel returns to its usual position on\n the next position update. Worth choosing at the helm, where a stray touch shouldn't\n disturb the view.\n"},{"id":"notes","raw":"---\nid: notes\ntitle: Notes\ncategory: Notes\n---\n\nDrop a note anywhere on the chart to mark something worth remembering — a\ngood anchorage, a hazard, a spot to check next time you're through.\n\n**To add a note**, open the edit menu (pencil icon) and choose **Add Note**,\nthen tap the chart where you want it.\n\n**To work with an existing note**, tap it on the chart. By default this\nopens a quick popover with **Move**, **Edit**, **Delete**, and **Info**\n(the info panel or a details dialog, depending on your **Prefer Info-Panel**\nsetting under **Settings → Display**). If you'd rather skip that popover and\ngo straight to the note's details, turn on **Single Click for Note Details**\nin the same settings section — a single tap then opens the details directly,\nand the details view itself offers **Move**, **Edit**, and **Delete**, so\nyou don't lose anything by skipping the popover.\n\nA note with rich content — an embedded image, or a graph like the one on a\ntide-station note — resizes its details dialog to fit, instead of clipping\nthe content or forcing you to scroll in two directions.\n"},{"id":"radar-overlay","raw":"---\nid: radar-overlay\ntitle: Radar Overlay\ncategory: Radar\n---\n\n![Fig 1. Radar returns painted over the chart, centred on the vessel](radar-overlay-1.jpg)\n\nOverlays live radar returns on the chart, centred on your vessel and rotated\nto its heading, using the Signal K Radar API. Returns are drawn spoke by spoke\nas the scanner turns, on top of the chart layers.\n\n**What it needs.** Server side, the radar must be reaching Signal K — that\nmeans the **signalk-container** and **@marineyachtradar/signalk-plugin**\n(MaYaRa) plugins installed and running. The radar controls only appear once the\nserver reports the Radar API _and_ at least one radar has been discovered; with\nno radar found, nothing radar-related is shown. Display side, the browser must\nsupport WebGL — on a device without it, the radar button reports that rather\nthan opening the panel.\n\n**Turning it on.** A radar button appears on the toolbar, and **Radar Overlay**\nin the map's _More actions_ menu. Either one connects to the radar and opens\nthe **radar control panel**. If you use radar often, **Settings → Display →\nAction Button → \"Radar Overlay\"** promotes it to the main floating action\nbutton.\n\n**The control panel** shows the selected radar's name and brand, and:\n\n- **Off / On** — the connection to the radar. Switching Off drops the spoke\n stream and clears the overlay while leaving the panel open.\n- **Opacity** — how strongly the returns paint over the chart underneath.\n- **Radar controls** — range, gain, sea clutter, rain and whatever else your\n radar exposes. Freeboard doesn't ship a fixed list of knobs: it builds these\n from the control definitions the radar itself advertises, so you see exactly\n what your unit supports. Controls with a fixed set of values become\n drop-downs, numeric ones a value field, and anything the radar reports as\n read-only stays read-only. Changes are sent to the radar immediately, and\n changes made elsewhere — at the MFD, or from another device — appear here\n live. All controls are disabled while the overlay is Off.\n\n**More than one radar.** Pick the one to use in **Settings → Radar → Radar\nDevices**, with **REFRESH** to re-query the server for the current list. The\nselection is locked while the overlay is running — switch it Off first. Your\nchoice is remembered for next time; if that radar is no longer present, the\nfirst one found is used.\n\n**Server versions.** Both Radar API 3.4.0 and earlier servers are supported.\nFreeboard detects the version when it discovers the radars and talks to the\nright endpoint automatically — there is nothing to configure.\n\nIf the radar stream fails, Freeboard reports the error and switches the overlay\noff.\n"},{"id":"route-planning","raw":"---\nid: route-planning\ntitle: Route Planning\ncategory: Routes\n---\n\n![Fig 1. Tapping a route brings up its actions — Modify, Start, Points, Notes, Info, Delete](route-planning-1.jpg)\n\nDraw a route on the chart, review and adjust it, then save it for later —\nor skip saving and just use it right away.\n\n**To draw a route**, open the edit menu (pencil icon) and choose **Draw\nRoute**. Tap each point along your intended route. A small editing card\nshows the running distance and a **Finish** button — tap **Finish** (or\npress Enter) when the route is complete, or **Cancel** to discard it.\nPlaced a point in the wrong spot? **Undo** (the card's Undo button, or\nCtrl-Z / ⌘-Z) removes the last point, again and again back to the first.\nYour new route appears on the chart in amber to show it hasn't been saved\nyet.\n\n**Unsaved and saved routes work the same way.** Tap any route on the\nchart — freshly drawn or previously saved — to bring up its actions:\n**Modify** to reshape it, **Points** to reorder its point list, **Hide**\nto take it off the chart, **Delete** to remove it, and more. An unsaved\nroute also offers **Save** right there, so turning a quick sketch into a\npermanent route is one tap. Saving keeps the route right where it is on the\nchart — it won't disappear on you.\n\n![Fig 2. The editing card while modifying a route — running distance, the active leg, and Undo / Save / Cancel in one place](route-planning-2.jpg)\n\n**Modifying a route** uses the same editing card as drawing, showing the\nrunning distance and the leg you're working on. Drag a point to move it,\ndrag a leg to add a point, or remove a point with Ctrl-Click or a\npress-and-hold. Both delete gestures work the same with a mouse, a\ntouchscreen or a pen; a press that turns into a drag moves the point instead\nof deleting it. To **extend the route**, click open water past its end: the\nroute grows by a new end point, the same way you drew it, without leaving\nModify.\n**Undo** steps back through your edits one at a time. The card's commit\naction saves your changes — labelled **Save** for a route that isn't stored\nyet, **Finish** for one that is — and **Cancel** (or the ✕) discards them,\nwith no separate \"save changes?\" prompt to answer.\n\n**Reordering points** works on any route, saved or not. Open **Points**\nfrom the route's actions to drag its waypoints into a new order; on an\nunsaved draft the new order is held with the rest of your draft until you\nSave.\n\n**Hiding a route** takes it off the chart without deleting it — the same as\nunchecking **Show on Map** in the Routes list, but reachable straight from\nthe route on the chart. The route stays in your Routes list, ready to show\nagain, and the list's checkbox stays in step. (A route that is currently\nactive can't be hidden.)\n\nThe route's info panel offers the same actions — **Save**, **Edit**,\n**Delete** — plus the point list, distance, and a description you can write\nfor the route. A route that hasn't been saved yet is labelled **(unsaved)**\nso you always know its status at a glance.\n\nIf you have an extension plugin installed that helps you plan routes — an\nauto-router that fits a route around land, for instance — it can work with\nyour route while it's still a draft, before you decide to save it.\n"},{"id":"screen-widgets","raw":"---\nid: screen-widgets\ntitle: Screen Widgets\ncategory: Extensions\n---\n\n![Fig 1. Instrument and tide widgets placed around the edges of the chart](screen-widgets-1.jpg)\n\nIf you've installed a Signal K server plugin that provides a screen widget,\nyou can place it directly onto the chart screen — a compact readout like a\nspeed dial, a wind gauge, or anything else the plugin offers. Two examples\nare [signalk-instrument-widgets](https://www.npmjs.com/package/signalk-instrument-widgets),\na set of boat instrument gauges, and\n[signalk-basic-tide-widgets](https://www.npmjs.com/package/signalk-basic-tide-widgets),\nwhich shows upcoming tides.\n\nWidgets sit in the corners of the screen and at the centre of the top and\nbottom edges *(the top-left corner is reserved for Freeboard's own menu)*.\n\n**To add a widget**, press and hold an empty spot in one of these areas for\nabout a second and a half (or right-click there if you're using a mouse and\nkeyboard). A short list of the widgets that fit there appears — choose one\nand it's added to your screen. As you place more, widgets stack neatly from\nthe edge inward.\n\n**To change or remove a widget**, press and hold the widget itself. This\nopens its settings, where you can adjust it (if it has any options) or\nremove it from the screen.\n\nYour layout is remembered, so the widgets you place are still there the next\ntime you open Freeboard-SK.\n\nSome widgets can also narrow down what's shown elsewhere on the chart — for\nexample, showing only certain waypoints. When a widget does this, a small\nchip appears near the top of the screen describing the filter; tap its **×**\nto clear it and show everything again.\n\nIf you haven't installed any plugins that provide screen widgets, none of\nthis is visible — Freeboard looks and works exactly as it always has.\n"},{"id":"unit-preferences","raw":"---\nid: unit-preferences\ntitle: Units & Value Display\ncategory: Display\n---\n\n![Fig 1. The Units settings panel, with Use Server Unit Preferences turned on](unit-preferences-1.jpg)\n\nFreeboard shows every numeric value in the units you prefer. You choose them in\n**Settings** on the **Units** tab, under **UNITS & VALUES**.\n\n## Choosing your own units\n\nFive settings, each covering one kind of value:\n\n- **Distance units** - Kilometres or Nautical Miles. Ranges, route legs, distance to\n the next waypoint.\n- **Depth units** - metres, feet or fathoms.\n- **Length units** - metres or feet. Vessel dimensions and other short lengths, kept\n separate from Distance so you can read a boat's length in feet while navigating in\n nautical miles.\n- **Speed units** - knots, m/sec, km/h or mph.\n- **Temperature units** - Celsius or Fahrenheit.\n\nA change applies straight away, with no restart.\n\nThe depth setting reaches further than the instrument readouts: it also sets the unit\nS-57 vector charts label their soundings in, so changing it redraws the chart as well.\nSounder depth and charted depth always agree.\n\n## Taking your units from the Signal K server\n\nThe server keeps its own unit preferences, set per user in **Server Admin** under\n**Server &rarr; Configuration &rarr; Settings &rarr; Unit Preferences**. Tick\n**Use Server Unit Preferences** and Freeboard follows those instead: the five\nselections above grey out and take their values from the server.\n\nThe point of this is to set your units once, on the server, and have every app that\nhonours them agree - Freeboard included. Change a unit on the server and Freeboard\npicks it up; there is nothing to update here.\n\nThe checkbox is only available if your server actually publishes unit preferences. On\na server without them it stays greyed out and your own selections apply.\n\nIf the server asks for a unit Freeboard doesn't offer, Freeboard keeps your existing\nchoice for that category rather than showing a value it cannot convert.\n\n## When one value needs a different unit\n\nA single unit per category isn't always what you want. Wind speed in metres per second\nalongside boat speed in knots is the common case, and normal practice in much of\nEurope.\n\nThe server handles this by publishing a unit against one specific data path rather than\nagainst the whole category. Freeboard honours that for **wind speed**: with **Use\nServer Unit Preferences** on, the true and apparent wind speeds in a vessel popover\ndisplay in the server's wind-speed unit, while boat speed stays in your Speed unit.\n\nThere is nothing to set in Freeboard. Configure the override on the server and it\nappears; where the server publishes no override, wind speed falls back to the Speed\nunit like everything else. Turning **Use Server Unit Preferences** off drops the\noverrides along with the rest of the server's preferences.\n\nThe true-wind value Freeboard reads is the one you selected under **Preferred Paths**,\nso if you have picked a particular true-wind source the override follows that choice.\n\nWind speed is currently the only value that uses a per-path unit.\n\n## Also on this tab\n\nTwo further settings share the **UNITS & VALUES** panel because they change how values\nare shown rather than what they are:\n\n- **Position display format** - how latitude and longitude are written, from decimal\n degrees through to degrees, minutes and seconds.\n- **Prefer True / Magnetic values** - which of the two Freeboard uses for paths you\n have not pinned under **Preferred Paths**.\n"},{"id":"vessel-tracks","raw":"---\nid: vessel-tracks\ntitle: Vessel Tracks\ncategory: Tracks\n---\n\n![Fig 1. The \"Show vessel track\" button in a vessel's popover](vessel-tracks-1.jpg)\n\nSee where another AIS vessel has been by showing its recent track (trail) on\nthe chart.\n\n**To show every vessel's track at once**, turn on **Show Track** under\n**Settings → Vessels → Other Vessels**. Every AIS vessel's track then draws\non the chart.\n\n**To follow just one or two vessels** instead of cluttering the chart with\neveryone's track, leave that setting off and pick vessels individually: tap\na vessel on the chart to open its popover, or find it in the AIS vessel\nlist, and use the **track** button (labelled **TRACK** in the list) to turn\nits track on or off. Your picks apply for the current session only — they\naren't saved between visits.\n\nThe per-vessel picker is only available while **Show Track** is off; with it\non, every vessel is already shown, so there's nothing to pick.\n\nTrack data comes from your Signal K server, so no extra setup is needed\nbeyond what tracking already requires on the server side.\n"},{"id":"weather-overlays","raw":"---\nid: weather-overlays\ntitle: Wind, Currents & Tides\ncategory: Weather\n---\n\n![Fig 1. Wind and ocean current overlays on the chart](weather-overlays-1.jpg)\n\nGrid overlays sample live weather and current data across the visible chart\narea, each toggled independently from the **Weather** panel (opened from the\nresources list):\n\n- **Wind** — \"Enable wind layer\" toggle. Requires a Signal K Weather Provider\n plugin installed on the server. Freeboard samples a 5×4 grid of points across\n the current view and refreshes them shortly after you pan or zoom. Each point\n renders as a **wind barb** by default (half feather = 5 kn, full = 10 kn,\n pennant = 50 kn, staff pointing into the wind) or, with the\n **Display → Weather → \"Wind indicator\"** setting set to Arrow, an arrow\n pointing where the wind flows to. Either glyph always shows the sampled wind\n speed as a label. The glyph choice is shared with the wind barbs shown on\n weather-station targets — switching the Wind indicator setting changes both\n at once. The arrow glyph can be replaced with custom artwork through a symbol\n provider plugin by publishing a symbol with the well-known id\n `windIndicator-arrow`.\n\n- **Ocean Currents** — \"Enable ocean currents layer\" toggle. No server plugin\n needed — Freeboard queries the Open-Meteo Marine API directly. It samples a\n denser 10×8 grid; each arrow points in the current's flow direction, is\n colour-graded from blue (slow) to red (fast), sized by speed, and labelled\n with the current's velocity in knots.\n\n![Fig 2. The Tidal Currents section of the Weather panel, with its 24-hour time bar, and the current overlay on the chart](weather-overlays-2.jpg)\n\n- **Tidal Currents** — appears in the Weather panel as **\"Enable tidal\n currents layer\"**, but only when a `signalk-tidal-currents` plugin is\n installed on the server; otherwise this option doesn't show up at all.\n Arrows are colour-graded and labelled with speed, the same as Ocean\n Currents. What sets it apart is a **24-hour time bar** underneath the\n toggle: drag it, click anywhere on it, or use the step buttons (±1h, ±6h)\n to see how currents shift through the day, with **Play** to animate\n through time and **Now** to jump back to the current moment.\n\nBoth current arrows can also be replaced with custom artwork through a symbol\nprovider plugin, each under its own well-known id — `oceanCurrentIndicator-arrow`\nand `tidalCurrentIndicator-arrow` — so the two overlays stay distinguishable\nwhen shown together. Because Freeboard tints these arrows to encode speed, draw\na replacement with a plain white fill; a pre-coloured glyph comes out muddy.\n\nAll three overlays refresh automatically as you pan or zoom, and can be\nshown together or independently.\n"},{"id":"weather-station-wind-barbs","raw":"---\nid: weather-station-wind-barbs\ntitle: Weather Station Wind Barbs\ncategory: Weather\n---\n\n![Fig 1. A weather-station target rendered as a wind barb](weather-station-wind-barbs-1.jpg)\n\nWeather-station (`meteo`) targets — AIS Met/Hydro buoys and plugin-published shore\nstations such as signalk-viva — show wind as a standard **wind barb**: half\nfeather = 5 kn, full = 10 kn, pennant = 50 kn. The barb is picked from the\nstation's reported wind speed in 5-knot buckets (5–75 kn, clamped) and its staff\nrotates to point into the reported wind direction. Below 5 kn, or when no wind is\nreported, the target falls back to the plain windsock icon, unrotated.\n\nThe wind speed is always shown as a label next to the glyph, in your configured\nwind-speed units.\n\nAll 15 barb glyphs ship with Freeboard, so this works with no setup. Any bucket\ncan be replaced with custom artwork through a symbol provider plugin by\npublishing a symbol whose id matches the well-known bucket id —\n`real-weatherStation-<kts>` for real stations, `virtual-weatherStation-<kts>` for\nvirtual ones, where `<kts>` is one of the buckets 5–75 (e.g.\n`real-weatherStation-25`).\n\nA **Display → Weather → \"Wind indicator\"** setting can switch the glyph to a\nplain arrow instead of a barb for every weather-station target on the chart.\n"}],"ledger":[{"feature":"weather-station-wind-barbs","pr":495,"kind":"new","since":"v3.0.0","date":"2026-07-10","title":"feat(map): render meteo targets as wind barbs"},{"feature":"weather-overlays","pr":413,"kind":"new","since":"v3.0.0","date":"2026-07-03","title":"feat(weather): add wind and ocean current overlays"},{"feature":"weather-overlays","pr":520,"kind":"enhanced","since":"v3.0.0","date":"2026-07-14","title":"feat(weather): unify wind indicator rendering across overlays"},{"feature":"weather-station-wind-barbs","pr":520,"kind":"enhanced","since":"v3.0.0","date":"2026-07-14","title":"feat(weather): unify wind indicator rendering across overlays"},{"feature":null,"pr":520,"kind":"skip","reason":"internal UI fix — settings dialog fixed sizing/scrolling, not a distinct feature"},{"feature":"custom-map-symbols","pr":394,"kind":"new","since":"v3.0.0","date":"2026-06-25","title":"feat(charts): Custom map symbols via symbol providers"},{"feature":"screen-widgets","pr":395,"kind":"new","since":"v3.0.0","date":"2026-06-26","title":"feat: Add plotter extension host: widgets, panels, buttons, resource filters & background runtimes"},{"feature":"extension-panels","pr":395,"kind":"new","since":"v3.0.0","date":"2026-06-26","title":"feat: Add plotter extension host: widgets, panels, buttons, resource filters & background runtimes"},{"feature":"route-planning","pr":432,"kind":"enhanced","since":"v3.0.0","date":"2026-06-29","title":"feat(routes): live route editing — editable drafts + plotter-extension route API"},{"feature":null,"pr":432,"kind":"skip","reason":"adds the routes capability to the Plotter Extensions API for extension plugins (e.g. auto-routing); no direct end-user surface in Freeboard itself"},{"feature":"vessel-tracks","pr":448,"kind":"enhanced","since":"v3.0.0","date":"2026-07-02","title":"feat(map): add per-vessel AIS track display"},{"feature":"cursor-eta","pr":455,"kind":"new","since":"v3.0.0","date":"2026-07-03","title":"feat(map): show live bearing, distance and ETA at cursor"},{"feature":"cursor-eta","pr":636,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-27","title":"feat(map): support the cursor bearing/distance/ETA readout on touch devices"},{"feature":"buddy-list","pr":484,"kind":"enhanced","since":"v3.0.0","date":"2026-07-07","title":"feat(ais): add \"Buddies only\" option to the vessel filter"},{"feature":"chart-image-adjustment","pr":489,"kind":"new","since":"v3.0.0","date":"2026-07-07","title":"feat(charts): add brightness/contrast adjustment for raster image layers"},{"feature":"chart-image-adjustment","pr":497,"kind":"enhanced","since":"v3.0.0","date":"2026-07-10","title":"feat(charts): make image adjustment a modeless draggable palette"},{"feature":"chart-image-adjustment","pr":510,"kind":"enhanced","since":"v3.0.0","date":"2026-07-12","title":"feat(charts): trim image adjustment palette and remember its position"},{"feature":"weather-overlays","pr":491,"kind":"enhanced","since":"v3.0.0","date":"2026-07-11","title":"feat(weather): add tidal currents overlay with time-stepping controls"},{"feature":"weather-overlays","pr":523,"kind":"enhanced","since":"v3.0.0","date":"2026-07-14","title":"feat(weather): make current-overlay arrows customizable symbols"},{"feature":"notes","pr":485,"kind":"enhanced","since":"v3.0.0","date":"2026-07-07","title":"feat(notes): size Note Details dialog to fit its content"},{"feature":"notes","pr":512,"kind":"enhanced","since":"v3.0.0","date":"2026-07-12","title":"feat(notes): add option to open note details on single click"},{"feature":"feature-browser","pr":528,"kind":"new","since":"v3.0.0","date":"2026-07-16","title":"feat(features): add a searchable \"What's New\" feature browser"},{"feature":"feature-browser","pr":530,"kind":"enhanced","since":"v3.0.0","date":"2026-07-17","title":"feat(features): replace forced onboarding modals with a passive What's New indicator"},{"feature":"feature-browser","pr":604,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-27","title":"feat(features): show a feature's newest changes above its instructions"},{"feature":"chart-zoom-limits","kind":"new","since":"v2.1.0","date":"2023-07-06","title":"limit zoom to selected maps"},{"feature":"route-planning","pr":580,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(map): delete a route vertex with a long left-click, matching touch"},{"feature":"route-planning","pr":582,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(routes): unify the route draw and modify helper panels"},{"feature":"route-planning","pr":584,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(routes): add undo for route drawing and editing"},{"feature":"route-planning","pr":593,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(routes): add a Hide action to the route popover"},{"feature":"route-planning","pr":597,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-26","title":"feat(routes): allow reordering points on unsaved routes"},{"feature":"route-planning","pr":598,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-26","title":"feat(routes): extend a route by clicking open water in modify mode"},{"feature":"chart-list","kind":"new","since":"v0.0.2","date":"2016-07-05","title":"Add charts find and display"},{"feature":"chart-list","kind":"enhanced","since":"v1.14.0","date":"2020-12-19","title":"Chart List ordering (closes #88)"},{"feature":"chart-list","pr":177,"kind":"enhanced","since":"v2.11.2","date":"2024-08-30","title":"Toggle chart on boundary click"},{"feature":"chart-list","kind":"enhanced","since":"v2.19.6","date":"2026-01-07","title":"Editable chart properties"},{"feature":"chart-list","kind":"enhanced","since":"v2.22.0","date":"2026-04-30","title":"Add chart opacity control (closes #368)"},{"feature":"chart-list","pr":352,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(charts): add In view filter to chart list"},{"feature":"chart-list","pr":595,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-26","title":"feat(charts): order chart list to match the chosen layer order"},{"feature":"follow-vessel","kind":"new","since":"v0.0.2","date":"2015-05-18","title":"Added vesselUp and followVessel control buttons"},{"feature":"follow-vessel","kind":"enhanced","since":"v2.11.2","date":"2024-09-05","title":"Lock in Follow Vessel setting to remain in this mode when map is panned"},{"feature":"follow-vessel","kind":"enhanced","since":"v2.17.0","date":"2025-08-18","title":"Look ahead"},{"feature":"follow-vessel","pr":601,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-26","title":"feat(map): single center/follow button and pan to set follow offset"},{"feature":"follow-vessel","pr":616,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-27","title":"feat(map): offset the vessel abeam as well as ahead when following"},{"feature":"radar-overlay","kind":"new","since":"v2.19.7","date":"2026-01-18","title":"Initial RADAR API support"},{"feature":"radar-overlay","kind":"enhanced","since":"v2.24.0","date":"2026-06-19","title":"Radar control panel with overlay toggle, opacity and radar controls"},{"feature":"radar-overlay","pr":573,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(radar): Support Radar API 3.4.0 in the radar overlay (with pre-3.4.0 fallback)"},{"feature":"unit-preferences","kind":"new","since":"v1.8.0-rc1","date":"2018-09-12","title":"Unit selection for distance, depth, speed and temperature"},{"feature":"unit-preferences","kind":"enhanced","since":"v2.20.0","date":"2026-03-14","title":"Use unit preferences configured on the Signal K server"},{"feature":"unit-preferences","kind":"enhanced","since":"v2.21.0","date":"2026-04-01","title":"server unit preferences additional support"},{"feature":"unit-preferences","pr":447,"kind":"enhanced","since":"v3.0.0","date":"2026-07-02","title":"feat(units): honor per-path display units for wind speed"},{"feature":null,"pr":446,"kind":"skip","reason":"adds the optional path argument and display-unit cache to formatValueForDisplay; foundation only, with no user-facing change until #447 populates it"},{"feature":null,"pr":454,"kind":"skip","reason":"adds the charts capability to the Plotter Extensions API — display management of chart layers Freeboard already manages, for extension plugins; no direct end-user surface in Freeboard itself"},{"feature":null,"pr":505,"kind":"skip","reason":"implements the nightMode capability of the Plotter Extensions API for extension plugins; the user-facing Dark Mode / Auto-set Night Mode settings are unchanged"},{"feature":null,"pr":508,"kind":"skip","reason":"exposes the host API to an embedding application (e.g. KIP) over the plotter-extension bus; an integration topology change with no end-user surface in Freeboard itself"},{"feature":null,"pr":607,"kind":"skip","reason":"emits the map.view event of the Plotter Extensions API so extensions stop polling map.getView; no end-user surface"},{"feature":null,"pr":529,"kind":"skip","reason":"developer tooling — generates the GitHub Release body from the feature ledger; excluded from the npm package, never shipped to users"},{"feature":null,"pr":450,"kind":"skip","reason":"developer tooling — dev-tools/fsk-mcp lets an AI agent drive a running Freeboard; excluded from the npm package, never shipped to users"},{"feature":null,"pr":419,"kind":"skip","reason":"performance work — runs OpenLayers and change detection outside the Angular zone; no change to what the user can do"},{"feature":null,"pr":420,"kind":"skip","reason":"performance work — debounces config saves and guards dark-mode updates; no change to what the user can do"},{"feature":null,"kind":"skip","date":"2026-06-05","title":"feat(charts): honor chart tileSize for raster tile sources","reason":"corrects the rendering scale of raster charts whose tiles are not 256px; a correctness fix despite the feat prefix, with nothing new for the user to do"},{"feature":null,"kind":"skip","date":"2026-05-23","title":"perf(app): lazy-load dialog components on demand","reason":"performance work — no change to what the user can do"},{"feature":null,"kind":"skip","date":"2026-05-23","title":"perf(s57): cache derived text-style config across features","reason":"performance work — no change to what the user can do"},{"feature":null,"kind":"skip","date":"2026-04-04","title":"perf: defer S57 chart symbols loading until first use","reason":"performance work — no change to what the user can do"}],"categories":[{"name":"Charts","hue":215},{"name":"Waypoints","hue":30},{"name":"Routes","hue":140},{"name":"Tracks","hue":170},{"name":"Notes","hue":50},{"name":"Navigation","hue":265},{"name":"Autopilot","hue":300},{"name":"Weather","hue":200},{"name":"Radar","hue":110},{"name":"AIS & Vessels","hue":240},{"name":"Alarms & Notifications","hue":5},{"name":"Import/Export","hue":80},{"name":"Extensions","hue":325},{"name":"Display","hue":185},{"name":"Map","hue":345}]}
1
+ {"docs":[{"id":"buddy-list","raw":"---\nid: buddy-list\ntitle: Buddy List\ncategory: AIS & Vessels\n---\n\nKeep track of boats you know — friends, other boats in your flotilla — by\nmarking them as **buddies**, then filter the vessel list down to just them\nwhen you want to find one quickly.\n\nThis requires the [signalk-buddylist-plugin](https://www.npmjs.com/package/signalk-buddylist-plugin)\ninstalled on your Signal K server. Without it, Freeboard behaves as before —\nthere's no buddy marking or filtering available.\n\n**To mark a vessel as a buddy**, tap it on the chart to open its popover and\ntap the **Is Buddy** button. Tap it again to remove the mark.\n\n**To see just your buddies**, open **Vessels** from the main menu and switch\non the **Buddies Only** toggle in the filter row. The list narrows to the\nvessels you've marked. Buddies Only can be combined with the list's other\nfilters — Ship Type and IMO Only — to narrow things down further.\n"},{"id":"chart-image-adjustment","raw":"---\nid: chart-image-adjustment\ntitle: Chart Image Adjustment\ncategory: Charts\n---\n\n![Fig 1. The Image Adjustment palette, opened from the tune icon in the chart list](chart-image-adjustment-1.jpg)\n\nAerial and satellite chart imagery is usually exposed for the land, which\ncan leave the water — where the hazards are — looking crushed and nearly\nblack. Adjusting the brightness and contrast can pull submerged rocks,\nshallows, and reefs back into view, which is handy when you're scouting an\nanchorage.\n\n**To adjust a chart's image**, open the chart list and tap the **tune**\nicon next to a chart (it appears alongside the existing opacity control,\nfor image-based charts only). The chart list closes and a compact **Image\nAdjustment** palette opens over the map, headed by the name of the chart\nlayer you're working on.\n\nThe palette is modeless — there is no backdrop, so panning and zooming stay\navailable while you adjust. Drag it by its header to move it clear of the\nwater you're studying; it reopens wherever you last left it, even after a\nreload.\n\n**Brightness** and **Contrast** run from 0% to 200%, with 100% being\nneutral, and the chart updates live as you drag. **RESET** returns both to\nneutral. **SAVE** keeps your changes; closing the palette with its **close**\nbutton instead discards them and puts the chart back as it was.\n\nA saved adjustment is stored with that chart, alongside its opacity, so it's\nstill applied the next time you open Freeboard. Left untouched, a chart looks\nexactly as it always has — the neutral default makes no visible change.\n\nThis applies to raster, tile, WMS, and WMTS image charts. Vector charts\n(like S-57) don't have an image to adjust, so the control doesn't appear\nfor them.\n"},{"id":"chart-list","raw":"---\nid: chart-list\ntitle: Chart List\ncategory: Charts\n---\n\n![Fig 1. The chart list, with Bounds turned on so each chart's outline is drawn on the map](chart-list-1.jpg)\n\nThe **Chart List** is where you pick which charts are drawn on the screen, what order\nthey stack in, and how each one looks. Open it from the resources menu, then **Charts**.\n\nEvery chart the server offers is listed with its name and description. A **map** icon\nmarks a chart hosted on your own Signal K server; a **globe** icon marks one fetched from\nthe internet — worth a glance before you rely on a chart offshore.\n\n**To show or hide a chart**, tick or untick its checkbox. The checkbox at the top of the\npanel switches every chart on or off at once, and **refresh** re-reads the list from the\nserver if you've just installed new charts.\n\n## Finding a chart in a long list\n\nA boat carrying a full regional ENC set can have hundreds of charts, so there are three\nways to narrow the list. They combine, so you can use them together.\n\n- **Type to filter list** — matches on the chart's name.\n- **In view** — hides every chart that doesn't cover what you're currently looking at.\n The list re-filters live as you pan and zoom, so it always reflects the current view.\n Charts that don't declare bounds (OpenStreetMap, for instance) count as covering\n everywhere and stay listed whatever the view.\n- **Bounds** — draws the outline of every listed chart on the map, so you can see what\n covers where. Clicking an outline brings up the charts at that spot and lets you switch\n one on directly, without finding it in the list.\n\n**In view** and **Bounds** both start off each time you open the list — they're a way to\nsearch, not a setting to leave set.\n\n## Chart order\n\nCharts are drawn stacked, and the one on top is the one you read. **Re-order** (the\n`import_export` icon) opens the **Chart Order** screen: drag charts to arrange them, with\nthe top layer at the top of the list and the base layer — a world map, typically — at the\nbottom. Your order is saved and reused next time.\n\n![Fig 2. The Chart Order screen — drag a chart to move it up or down the stack](chart-list-2.jpg)\n\nThe chart list itself is shown in that same top-layer-first order, so what you see in the\nlist is the stack you arranged. Change the order and return, and the list follows\nimmediately.\n\nCharts you have never re-ordered start out stacked by scale — the largest-area chart at\nthe bottom, so the most detailed one ends up on top. That is only the starting point:\nonce you drag anything, your order wins.\n\n## Per-chart actions\n\n![Fig 3. A chart entry, with its actions along the bottom](chart-list-3.jpg)\n\nAlong the bottom of each entry is a row of icons — the actions for that chart. Only the\nones that apply are shown, so the row is shorter on some charts than on others. In the\nrow above, left to right:\n\n- **Properties** (the *i* in a circle) — view and edit the chart's details.\n- **Opacity** (the droplet) — fade a chart to let the one beneath show through. Useful\n for laying a harbour chart over an aerial image.\n- **Image adjustment** (the sliders) — brightness and contrast; image-based charts only.\n See the **Chart Image Adjustment** feature.\n- **Add to Group** (the shapes) — file the chart into a resource group. Only shown when\n your server supports resource groups.\n\nTwo more appear where they apply:\n\n- **Cache Tiles** (the download arrow) — select an area of the map to download for\n offline use. Only offered for charts the chart provider serves as proxied.\n- **Remove** (the waste bin) — delete a chart you added yourself. Charts that come from\n the server's chart plugin can't be deleted from here.\n\nOpacity and image adjustment are saved per chart and persist between sessions. The\ncheckbox on the right of the entry is what shows or hides the chart.\n\n## Adding your own chart source\n\n**Add** (the `add` icon) registers a new chart source with the server — **WMTS**, **WMS**,\nor a **JSON Map Source**. Added charts appear in the list alongside the rest and can be\nremoved again with **Remove**.\n\nFreeboard also offers OpenStreetMap and OpenSeaMap without any server-side charts\ninstalled; both need an internet connection to draw.\n\nNote that everything else in the list comes from the Signal K server, so a chart plugin\n(such as `@signalk/charts-plugin`) has to be installed and configured before your own\ncharts appear here.\n"},{"id":"chart-zoom-limits","raw":"---\nid: chart-zoom-limits\ntitle: Chart Zoom Limits\ncategory: Charts\n---\n\nEvery chart holds detail down to a certain resolution and no further. Zoom in past that\npoint and you aren't shown more information — you're shown the last real chart data\nmagnified, which looks sharper than it is. Freeboard gives you two controls over what\nhappens at that boundary.\n\n## Constrain map zoom\n\nThe **Constrain map zoom** button (the `zoom_in_map` icon on the right-hand toolbar) stops\nthe map at the edge of your chart data. Turn it on and you simply cannot zoom in — or out —\nbeyond the range your selected charts actually cover. The button highlights while active,\nand the zoom **+** / **−** buttons grey out once you reach a limit.\n\nThe limits are taken from the **widest** range across all currently selected charts: the\nlowest minimum zoom and the highest maximum zoom of any of them. Selecting or deselecting\ncharts recalculates it, so the constraint always reflects what you have switched on. Charts\nthat don't declare their own zoom range fall back to a 0–24 range. With the setting off,\nthe map is free to move between zoom 2 and 28 regardless of what your charts hold.\n\nThis is off by default. It matters most when you're working from downloaded or offline\nchart sets — a cached raster or MBTiles collection on a boat with no internet — where\nzooming past the data can't be rescued by fetching better tiles, and where a magnified\ntile can read as detail that was never surveyed.\n\n## Keep tiles visible on max zoom\n\nThe companion setting, **Keep tiles visible on max zoom** (Settings → Map), decides what a\nchart layer does once you pass *its* maximum zoom. Leave it on — it is on by default — and\nthe chart keeps drawing, stretched, instead of disappearing. Turn it off and each layer\nstops rendering beyond the resolution it genuinely has, leaving the chart blank there.\n\nIt also matters when charts of different resolutions are stacked. In a selection mixing a\nwide-area chart with a detailed harbour chart, the lower-resolution one keeps rendering\n(stretched) up to the map's maximum rather than dropping out as you zoom in.\n\nThe two settings answer different questions: *Constrain map zoom* decides **whether you can\nget there at all**, while *Keep tiles visible on max zoom* decides **what you see if you\ndo**. With the defaults — constrain off, keep-tiles on — you can zoom freely and charts\nstay visible but progressively blurrier past their real detail.\n"},{"id":"cursor-eta","raw":"---\nid: cursor-eta\ntitle: Live ETA at Cursor\ncategory: Display\n---\n\n![Fig 1. The Status Bar Options settings, and the resulting Brg/Dist/ETA readout in the status bar](cursor-eta-1.jpg)\n\nGet a quick bearing, distance, and time estimate to any point on the chart —\nwithout setting a destination first.\n\n**To turn it on**, go to **Settings → Display → Status Bar Options** and check\n**Live ETA at cursor**. It's off by default. Once on, the status bar adds the\nbearing, distance, and ETA from your boat to the point you're pointing at,\nalongside the existing latitude/longitude readout.\n\n**With a mouse**, the readout follows the pointer as you move it over the chart.\n\n**Click or tap the chart** and the readout locks onto that point, with a marker\nshowing which point it refers to. The marker fades away and the readout is\nreleased with it, so the numbers are never left on screen with nothing\nidentifying what they describe. Tap somewhere else to measure to the new point.\nThis gives a touchscreen at the helm the same \"how far is that?\" gesture a mouse\nuser gets — dragging the chart still just pans it, and a press-and-hold still\nopens the chart menu.\n\n**Tap Fade Speed** sets how long the marker takes to fade, in seconds (minimum\n1, default 1.5). Raise it to give yourself longer to read the numbers; lower it\nif the marker sits over something on the chart you want to see or grab.\n\nThe ETA uses your boat's current speed over ground. If you're stopped — at\nanchor, hove to — there's no speed to estimate from, so Freeboard falls back to\na **Reference Boat Speed** you set alongside the checkbox, keeping the ETA\nuseful even when you're not moving.\n"},{"id":"custom-map-symbols","raw":"---\nid: custom-map-symbols\ntitle: Custom Map Symbols\ncategory: Charts\n---\n\n![Fig 1. A custom route start marker and a custom anchorage icon shown on the chart](custom-map-symbols-1.jpg)\n\nFreeboard normally marks notes, waypoints, your boat, AIS traffic, aids to\nnavigation, and route points with its own built-in icons. If you'd rather use\nyour own artwork — a personal marker for a favorite dive site, a custom boat\nicon for your own vessel, a branded buoy — you can, once you install a\n**symbol provider** app on your Signal K server. Freeboard picks up whatever\nicons the provider offers and uses them automatically — there's nothing to\nturn on.\n\nThe reference app for this is\n[signalk-symbol-manager](https://www.npmjs.com/package/signalk-symbol-manager),\nwhich gives you a simple web page for uploading and organizing your own icons.\nAny similar app that publishes icons the standard way works too.\n\n## Two ways to use a custom icon\n\n**Replace one of Freeboard's built-in icons.** Give your icon the same name\nas the built-in you want to replace (for example `dive-site`) and mark it as\nbelonging to Freeboard's icon set. Your version then shows up everywhere that\nicon is normally used — on the chart and in the icon pickers — without you\nhaving to touch any existing notes or waypoints. See the reference list below\nfor which built-in names you can replace.\n\n**Add a brand-new icon.** Give your icon a new name of your choosing and it\nshows up as an extra option in the icon pickers, alongside the built-ins.\n\nWhen you've replaced a built-in, the picker shows only your version — not\nboth — so the list doesn't get cluttered. Flip the **\"Show all symbols\"**\ntoggle in a note or waypoint's icon picker to see everything at once,\nbuilt-ins included, in case you ever want to go back to the original. If you\ndeliberately pick the original built-in this way, Freeboard remembers your\nchoice and won't swap your custom icon back in later.\n\n## Where custom icons show up\n\n| Area | Custom icons? |\n|------|:---:|\n| Notes | Yes |\n| Waypoints | Yes |\n| Your own vessel | Yes |\n| AIS vessels | Yes |\n| Aids to navigation | Yes |\n| Route start / turn / end points | Yes |\n| Wind, ocean current and tidal current arrows | Yes |\n| Special waypoint markers (start pin, start boat, sightings, alarms) | No |\n| Shaded chart areas | No |\n| Dots for moored vessels | No |\n\nIcons that normally rotate to a heading or bearing — your vessel, AIS\ntargets, aids to navigation, route turn points, and the wind and current\ndirection arrows — keep rotating correctly even when you've replaced them with\nyour own artwork.\n\n## Built-in icon names you can replace\n\nTo replace one of these, give your icon the matching name below.\n\n**Note and waypoint markers:**\n\n```\nanchorage boatramp bridge business dam\ndive-site ferry hazard inlet lock\nmarina dock turning-basin radio-call-point\ntranshipment-dock notice-to-mariners diver-down\nnavigation-structure fuel tunnel waterway-guage\n```\n\n**Generic waypoint marker:** `waypoint`\n\n**Your own vessel:** `vessel-self`\n\n**AIS vessels** (by type):\n\n```\nais_active ais_highspeed ais_special ais_passenger ais_cargo\nais_tanker ais_other ais_inactive ais_buddy ais_self\n```\n\n(`ais_self` is whichever AIS target you currently have selected — not your\nown boat, which is `vessel-self`.)\n\n**Aids to navigation** — each comes in a physical (`real-…`) and an AIS-only\n(`virtual-…`) version:\n\n```\nreal-north / virtual-north real-east / virtual-east\nreal-south / virtual-south real-west / virtual-west\nreal-port / virtual-port real-starboard / virtual-starboard\nreal-danger / virtual-danger real-safe / virtual-safe\nreal-special / virtual-special real-basestation / virtual-basestation\nreal-weatherStation / virtual-weatherStation\nreal-aton / virtual-aton\n```\n\n**Route points:** `route-start`, `route-waypoint`, `route-end`\n\n**Weather indicators** — the direction arrows on the wind, ocean current and\ntidal current overlays:\n\n```\nwindIndicator-arrow oceanCurrentIndicator-arrow tidalCurrentIndicator-arrow\n```\n\nThe two current arrows are tinted by Freeboard to show speed, so draw\nreplacements for those with a plain white fill — a pre-coloured glyph comes out\nmuddy. The wind arrow isn't tinted and renders in your own colours.\n\nYour own vessel, AIS, aids-to-navigation, route and weather-indicator icons\napply everywhere at once — Freeboard picks these automatically rather than\nletting you choose them per marker, so one custom icon covers every marker of\nthat kind.\n\n## Keeping icons through GPX import and export\n\nIf your icon declares a matching GPX symbol name, Freeboard will recognize it\nwhen you import a GPX file — a waypoint tagged with that symbol picks up your\ncustom icon instead of the default marker. Exporting a waypoint that uses a\ncustom icon writes the same information back into the GPX file, so the icon\nsurvives a round trip: export, re-import elsewhere, and your custom icon is\nstill there.\n\n## Without a symbol provider\n\nIf you haven't installed a symbol provider — or it isn't publishing any\nicons — Freeboard looks and behaves exactly as it always has: built-in icons\neverywhere, and \"Show all symbols\" just shows the built-ins.\n"},{"id":"extension-panels","raw":"---\nid: extension-panels\ntitle: Extension Panels\ncategory: Extensions\n---\n\n![Fig 1. A plugin's search panel open alongside its toolbar button](extension-panels-1.jpg)\n\nPanel extensions let a Signal K server plugin add a completely new feature to\nFreeboard, without waiting on a Freeboard code change to get it. You can pick\nand choose which of these tools you want installed on your boat. Each one\nadds its own new button to Freeboard's toolbar — for example, a proximity\nsearch for nearby points of interest, or an automatic route planner that\nroutes around land.\n\n![Fig 2. An auto-routing panel, another example of a panel extension](extension-panels-2.jpg)\n\n**To use one**, tap the grid icon in the top-right corner of the chart to\nreveal the toolbar, then tap the plugin's button. Its panel slides in from\nthe right-hand side of the screen. Tap the button again, or use the panel's\nown close button, to put it away.\n\nA panel can also narrow down what's shown on the chart — for example,\nfiltering the waypoints list to just the ones matching your search. When a\npanel does this, a small chip appears near the top of the screen describing\nthe filter; tap its **×** to clear it and show everything again.\n\nIf you haven't installed any plugins that add a panel, the extension toolbar\nbutton doesn't appear — Freeboard looks and works exactly as it always has.\n"},{"id":"feature-browser","raw":"---\nid: feature-browser\ntitle: Feature Browser\ncategory: Display\n---\n\nThis very window you're looking at right now is the **Feature Browser** — a\nsearchable \"What's New\" window covering everything Freeboard can do. Curious\nwhat a feature does, how to use it, or when it was added? Open it any time\nfrom the **⋯ (More actions)** menu, no matter what you're doing on the\nchart.\n\nEach entry shows a screenshot, a plain description of what the feature does\nand how to use it, and the release it last changed in — click a screenshot\nto view it larger. When a feature has changed in the current release, its\nnewest changes are listed at the top of the entry so you don't have to hunt\nfor them; the complete history sits in a table at the bottom. Search narrows\nthe list by name, and you can sort the table by category, feature, status,\nor release.\n\nA small lightbulb button also appears on the left toolbar whenever there's\nsomething new or changed you haven't seen yet — click it to jump straight\ninto the Feature Browser. It only shows up when there's something to tell\nyou about, and disappears once you've opened the browser. Freeboard no\nlonger interrupts you with a welcome screen or a \"what's new\" popup when it\nstarts — this lightbulb is the quiet, opt-in replacement.\n"},{"id":"follow-vessel","raw":"---\nid: follow-vessel\ntitle: Center & Follow Vessel\ncategory: Map\n---\n\n![Fig 1. Following with a positive Vertical offset — the boat sits low on screen and the chart in front of it gets the room](follow-vessel-1.jpg)\n\nKeep your boat on screen without touching the chart. Follow Vessel mode centers the\nvessel and holds it there as you move, so the chart scrolls under you instead of you\nchasing it.\n\n## The button\n\n**Center & Follow Vessel**, on the left-hand toolbar, does both jobs. A press centers the\nvessel and turns follow mode on, easing out to your offset a couple of seconds later. The\nbutton stays highlighted while follow mode is on. Press it again to turn follow mode off —\nthe chart stays exactly where it is, so whatever you'd panned across to study stays in\nview. The button is disabled until your boat's position is known.\n\nJust want to center the boat once, without following it? Press again before it eases off\ncenter, and the boat stays where it is.\n\n## Offset Vessel Center\n\n![Fig 2. Offset Vessel Center and Map Pan When Following, in Settings → Map](follow-vessel-2.jpg)\n\nSitting dead center spends half your screen on water you have already covered.\n**Settings → Map → Offset Vessel Center (%)** moves the boat off center so the chart that\nmatters gets the room. Two values, each a whole percentage up to ±90 of the distance from\nthe middle of the screen to its edge:\n\n- **Vertical** — moves the vessel up or down the screen. A positive value looks ahead,\n putting more chart in front of the boat; `50` puts the boat halfway between the center\n and the bottom edge. A negative value looks behind instead.\n- **Horizontal** — moves the vessel left or right. A positive value shifts the map to the\n right, putting the boat toward the left of the screen with more chart visible to the\n right; a negative value does the opposite.\n\nBoth are measured against the **screen**, not your course — the offset holds the exact spot\nyou set it to whether you're underway, drifting, or sitting still, instead of swinging\naround as your heading jitters at low speed or with no course at all. In heading-up mode\nthis comes to the same thing as ahead/abeam, since \"up the screen\" already tracks your\ncourse; the difference only shows in north-up. Zooming keeps the boat on that same spot\ntoo, scaling the chart around it rather than nudging the boat back toward center.\n\n## Setting the offset by panning\n\nYou don't have to work the numbers out at all. With **Map Pan When Following** set to\n**Set Follow Offset**, simply pan the chart until the boat sits where you want it.\nFreeboard works out the Vertical and Horizontal values from where you dropped it and saves\nthem, staying in follow mode the whole time — so the boat holds that spot from then on. For\nmost people this is the only way they will ever set the offset.\n\nPan the boat clean off the screen and Freeboard takes it as \"stop following\" instead —\nfollow mode turns off and the chart stays exactly where you left it, rather than snapping\nthe boat back into view.\n\n## Map Pan When Following\n\n**Settings → Map → Map Pan When Following** decides what panning the chart does while\nfollow mode is on:\n\n- **Set Follow Offset** — follow mode stays on and your pan sets the offset, as above.\n- **Exit Follow Mode** — panning turns follow mode off and leaves the chart where you put\n it.\n- **Do nothing** — follow mode stays on and the vessel returns to its usual position on\n the next position update. Worth choosing at the helm, where a stray touch shouldn't\n disturb the view.\n"},{"id":"notes","raw":"---\nid: notes\ntitle: Notes\ncategory: Notes\n---\n\nDrop a note anywhere on the chart to mark something worth remembering — a\ngood anchorage, a hazard, a spot to check next time you're through.\n\n**To add a note**, open the edit menu (pencil icon) and choose **Add Note**,\nthen tap the chart where you want it.\n\n**To work with an existing note**, tap it on the chart. By default this\nopens a quick popover with **Move**, **Edit**, **Delete**, and **Info**\n(the info panel or a details dialog, depending on your **Prefer Info-Panel**\nsetting under **Settings → Display**). If you'd rather skip that popover and\ngo straight to the note's details, turn on **Single Click for Note Details**\nin the same settings section — a single tap then opens the details directly,\nand the details view itself offers **Move**, **Edit**, and **Delete**, so\nyou don't lose anything by skipping the popover.\n\nA note with rich content — an embedded image, or a graph like the one on a\ntide-station note — resizes its details dialog to fit, instead of clipping\nthe content or forcing you to scroll in two directions.\n"},{"id":"radar-overlay","raw":"---\nid: radar-overlay\ntitle: Radar Overlay\ncategory: Radar\n---\n\n![Fig 1. Radar returns painted over the chart, centred on the vessel](radar-overlay-1.jpg)\n\nOverlays live radar returns on the chart, centred on your vessel and rotated\nto its heading, using the Signal K Radar API. Returns are drawn spoke by spoke\nas the scanner turns, on top of the chart layers.\n\n**What it needs.** Server side, the radar must be reaching Signal K — that\nmeans the **signalk-container** and **@marineyachtradar/signalk-plugin**\n(MaYaRa) plugins installed and running. The radar controls only appear once the\nserver reports the Radar API _and_ at least one radar has been discovered; with\nno radar found, nothing radar-related is shown. Display side, the browser must\nsupport WebGL — on a device without it, the radar button reports that rather\nthan opening the panel.\n\n**Turning it on.** A radar button appears on the toolbar, and **Radar Overlay**\nin the map's _More actions_ menu. Either one connects to the radar and opens\nthe **radar control panel**. If you use radar often, **Settings → Display →\nAction Button → \"Radar Overlay\"** promotes it to the main floating action\nbutton.\n\n**The control panel** shows the selected radar's name and brand, and:\n\n- **Off / On** — the connection to the radar. Switching Off drops the spoke\n stream and clears the overlay while leaving the panel open.\n- **Opacity** — how strongly the returns paint over the chart underneath.\n- **Radar controls** — range, gain, sea clutter, rain and whatever else your\n radar exposes. Freeboard doesn't ship a fixed list of knobs: it builds these\n from the control definitions the radar itself advertises, so you see exactly\n what your unit supports. Controls with a fixed set of values become\n drop-downs, numeric ones a value field, and anything the radar reports as\n read-only stays read-only. Changes are sent to the radar immediately, and\n changes made elsewhere — at the MFD, or from another device — appear here\n live. All controls are disabled while the overlay is Off.\n\n**More than one radar.** Pick the one to use in **Settings → Radar → Radar\nDevices**, with **REFRESH** to re-query the server for the current list. The\nselection is locked while the overlay is running — switch it Off first. Your\nchoice is remembered for next time; if that radar is no longer present, the\nfirst one found is used.\n\n**Server versions.** Both Radar API 3.4.0 and earlier servers are supported.\nFreeboard detects the version when it discovers the radars and talks to the\nright endpoint automatically — there is nothing to configure.\n\nIf the radar stream fails, Freeboard reports the error and switches the overlay\noff.\n"},{"id":"route-planning","raw":"---\nid: route-planning\ntitle: Route Planning\ncategory: Routes\n---\n\n![Fig 1. Tapping a route brings up its actions — Modify, Start, Points, Notes, Info, Delete](route-planning-1.jpg)\n\nDraw a route on the chart, review and adjust it, then save it for later —\nor skip saving and just use it right away.\n\n**To draw a route**, open the edit menu (pencil icon) and choose **Draw\nRoute**. Tap each point along your intended route. A small editing card\nshows the running distance and a **Finish** button — tap **Finish** (or\npress Enter) when the route is complete, or **Cancel** to discard it.\nPlaced a point in the wrong spot? **Undo** (the card's Undo button, or\nCtrl-Z / ⌘-Z) removes the last point, again and again back to the first.\nYour new route appears on the chart in amber to show it hasn't been saved\nyet.\n\n**Unsaved and saved routes work the same way.** Tap any route on the\nchart — freshly drawn or previously saved — to bring up its actions:\n**Modify** to reshape it, **Points** to reorder its point list, **Hide**\nto take it off the chart, **Delete** to remove it, and more. An unsaved\nroute also offers **Save** right there, so turning a quick sketch into a\npermanent route is one tap. Saving keeps the route right where it is on the\nchart — it won't disappear on you.\n\n![Fig 2. The editing card while modifying a route — running distance, the active leg, and Undo / Save / Cancel in one place](route-planning-2.jpg)\n\n**Modifying a route** uses the same editing card as drawing, showing the\nrunning distance and the leg you're working on. Drag a point to move it,\ndrag a leg to add a point, or remove a point with Ctrl-Click or a\npress-and-hold. Both delete gestures work the same with a mouse, a\ntouchscreen or a pen; a press that turns into a drag moves the point instead\nof deleting it. To **extend the route**, click open water past its end: the\nroute grows by a new end point, the same way you drew it, without leaving\nModify.\n**Undo** steps back through your edits one at a time. The card's commit\naction saves your changes — labelled **Save** for a route that isn't stored\nyet, **Finish** for one that is — and **Cancel** (or the ✕) discards them,\nwith no separate \"save changes?\" prompt to answer.\n\n**Reordering points** works on any route, saved or not. Open **Points**\nfrom the route's actions to drag its waypoints into a new order; on an\nunsaved draft the new order is held with the rest of your draft until you\nSave.\n\n**Hiding a route** takes it off the chart without deleting it — the same as\nunchecking **Show on Map** in the Routes list, but reachable straight from\nthe route on the chart. The route stays in your Routes list, ready to show\nagain, and the list's checkbox stays in step. (A route that is currently\nactive can't be hidden.)\n\nThe route's info panel offers the same actions — **Save**, **Edit**,\n**Delete** — plus the point list, distance, and a description you can write\nfor the route. A route that hasn't been saved yet is labelled **(unsaved)**\nso you always know its status at a glance.\n\nIf you have an extension plugin installed that helps you plan routes — an\nauto-router that fits a route around land, for instance — it can work with\nyour route while it's still a draft, before you decide to save it.\n"},{"id":"screen-widgets","raw":"---\nid: screen-widgets\ntitle: Screen Widgets\ncategory: Extensions\n---\n\n![Fig 1. Instrument and tide widgets placed around the edges of the chart](screen-widgets-1.jpg)\n\nIf you've installed a Signal K server plugin that provides a screen widget,\nyou can place it directly onto the chart screen — a compact readout like a\nspeed dial, a wind gauge, or anything else the plugin offers. Two examples\nare [signalk-instrument-widgets](https://www.npmjs.com/package/signalk-instrument-widgets),\na set of boat instrument gauges, and\n[signalk-basic-tide-widgets](https://www.npmjs.com/package/signalk-basic-tide-widgets),\nwhich shows upcoming tides.\n\nWidgets sit in the corners of the screen and at the centre of the top and\nbottom edges *(the top-left corner is reserved for Freeboard's own menu)*.\n\n**To add a widget**, press and hold an empty spot in one of these areas for\nabout a second and a half (or right-click there if you're using a mouse and\nkeyboard). A short list of the widgets that fit there appears — choose one\nand it's added to your screen. As you place more, widgets stack neatly from\nthe edge inward.\n\n**To change or remove a widget**, press and hold the widget itself. This\nopens its settings, where you can adjust it (if it has any options) or\nremove it from the screen.\n\nYour layout is remembered, so the widgets you place are still there the next\ntime you open Freeboard-SK.\n\nSome widgets can also narrow down what's shown elsewhere on the chart — for\nexample, showing only certain waypoints. When a widget does this, a small\nchip appears near the top of the screen describing the filter; tap its **×**\nto clear it and show everything again.\n\nIf you haven't installed any plugins that provide screen widgets, none of\nthis is visible — Freeboard looks and works exactly as it always has.\n"},{"id":"unit-preferences","raw":"---\nid: unit-preferences\ntitle: Units & Value Display\ncategory: Display\n---\n\n![Fig 1. The Units settings panel, with Use Server Unit Preferences turned on](unit-preferences-1.jpg)\n\nFreeboard shows every numeric value in the units you prefer. You choose them in\n**Settings** on the **Units** tab, under **UNITS & VALUES**.\n\n## Choosing your own units\n\nFive settings, each covering one kind of value:\n\n- **Distance units** - Kilometres or Nautical Miles. Ranges, route legs, distance to\n the next waypoint.\n- **Depth units** - metres, feet or fathoms.\n- **Length units** - metres or feet. Vessel dimensions and other short lengths, kept\n separate from Distance so you can read a boat's length in feet while navigating in\n nautical miles.\n- **Speed units** - knots, m/sec, km/h or mph.\n- **Temperature units** - Celsius or Fahrenheit.\n\nA change applies straight away, with no restart.\n\nThe depth setting reaches further than the instrument readouts: it also sets the unit\nS-57 vector charts label their soundings in, so changing it redraws the chart as well.\nSounder depth and charted depth always agree.\n\n## Taking your units from the Signal K server\n\nThe server keeps its own unit preferences, set per user in **Server Admin** under\n**Server &rarr; Configuration &rarr; Settings &rarr; Unit Preferences**. Tick\n**Use Server Unit Preferences** and Freeboard follows those instead: the five\nselections above grey out and take their values from the server.\n\nThe point of this is to set your units once, on the server, and have every app that\nhonours them agree - Freeboard included. Change a unit on the server and Freeboard\npicks it up; there is nothing to update here.\n\nThe checkbox is only available if your server actually publishes unit preferences. On\na server without them it stays greyed out and your own selections apply.\n\nIf the server asks for a unit Freeboard doesn't offer, Freeboard keeps your existing\nchoice for that category rather than showing a value it cannot convert.\n\n## When one value needs a different unit\n\nA single unit per category isn't always what you want. Wind speed in metres per second\nalongside boat speed in knots is the common case, and normal practice in much of\nEurope.\n\nThe server handles this by publishing a unit against one specific data path rather than\nagainst the whole category. Freeboard honours that for **wind speed**: with **Use\nServer Unit Preferences** on, the true and apparent wind speeds in a vessel popover\ndisplay in the server's wind-speed unit, while boat speed stays in your Speed unit.\n\nThere is nothing to set in Freeboard. Configure the override on the server and it\nappears; where the server publishes no override, wind speed falls back to the Speed\nunit like everything else. Turning **Use Server Unit Preferences** off drops the\noverrides along with the rest of the server's preferences.\n\nThe true-wind value Freeboard reads is the one you selected under **Preferred Paths**,\nso if you have picked a particular true-wind source the override follows that choice.\n\nWind speed is currently the only value that uses a per-path unit.\n\n## Also on this tab\n\nTwo further settings share the **UNITS & VALUES** panel because they change how values\nare shown rather than what they are:\n\n- **Position display format** - how latitude and longitude are written, from decimal\n degrees through to degrees, minutes and seconds.\n- **Prefer True / Magnetic values** - which of the two Freeboard uses for paths you\n have not pinned under **Preferred Paths**.\n"},{"id":"vessel-tracks","raw":"---\nid: vessel-tracks\ntitle: Vessel Tracks\ncategory: Tracks\n---\n\n![Fig 1. The \"Show vessel track\" button in a vessel's popover](vessel-tracks-1.jpg)\n\nSee where another AIS vessel has been by showing its recent track (trail) on\nthe chart.\n\n**To show every vessel's track at once**, turn on **Show Track** under\n**Settings → Vessels → Other Vessels**. Every AIS vessel's track then draws\non the chart.\n\n**To follow just one or two vessels** instead of cluttering the chart with\neveryone's track, leave that setting off and pick vessels individually: tap\na vessel on the chart to open its popover, or find it in the AIS vessel\nlist, and use the **track** button (labelled **TRACK** in the list) to turn\nits track on or off. Your picks apply for the current session only — they\naren't saved between visits.\n\nThe per-vessel picker is only available while **Show Track** is off; with it\non, every vessel is already shown, so there's nothing to pick.\n\nTrack data comes from your Signal K server, so no extra setup is needed\nbeyond what tracking already requires on the server side.\n"},{"id":"weather-overlays","raw":"---\nid: weather-overlays\ntitle: Wind, Currents & Tides\ncategory: Weather\n---\n\n![Fig 1. Wind and ocean current overlays on the chart](weather-overlays-1.jpg)\n\nGrid overlays sample live weather and current data across the visible chart\narea, each toggled independently from the **Weather** panel (opened from the\nresources list):\n\n- **Wind** — \"Enable wind layer\" toggle. Requires a Signal K Weather Provider\n plugin installed on the server. Freeboard samples a 5×4 grid of points across\n the current view and refreshes them shortly after you pan or zoom. Each point\n renders as a **wind barb** by default (half feather = 5 kn, full = 10 kn,\n pennant = 50 kn, staff pointing into the wind) or, with the\n **Display → Weather → \"Wind indicator\"** setting set to Arrow, an arrow\n pointing where the wind flows to. Either glyph always shows the sampled wind\n speed as a label. The glyph choice is shared with the wind barbs shown on\n weather-station targets — switching the Wind indicator setting changes both\n at once. The arrow glyph can be replaced with custom artwork through a symbol\n provider plugin by publishing a symbol with the well-known id\n `windIndicator-arrow`.\n\n- **Ocean Currents** — \"Enable ocean currents layer\" toggle. No server plugin\n needed — Freeboard queries the Open-Meteo Marine API directly. It samples a\n denser 10×8 grid; each arrow points in the current's flow direction, is\n colour-graded from blue (slow) to red (fast), sized by speed, and labelled\n with the current's velocity in knots.\n\n![Fig 2. The Tidal Currents section of the Weather panel, with its 24-hour time bar, and the current overlay on the chart](weather-overlays-2.jpg)\n\n- **Tidal Currents** — appears in the Weather panel as **\"Enable tidal\n currents layer\"**, but only when a `signalk-tidal-currents` plugin is\n installed on the server; otherwise this option doesn't show up at all.\n Arrows are colour-graded and labelled with speed, the same as Ocean\n Currents. What sets it apart is a **24-hour time bar** underneath the\n toggle: drag it, click anywhere on it, or use the step buttons (±1h, ±6h)\n to see how currents shift through the day, with **Play** to animate\n through time and **Now** to jump back to the current moment.\n\nBoth current arrows can also be replaced with custom artwork through a symbol\nprovider plugin, each under its own well-known id — `oceanCurrentIndicator-arrow`\nand `tidalCurrentIndicator-arrow` — so the two overlays stay distinguishable\nwhen shown together. Because Freeboard tints these arrows to encode speed, draw\na replacement with a plain white fill; a pre-coloured glyph comes out muddy.\n\nAll three overlays refresh automatically as you pan or zoom, and can be\nshown together or independently.\n"},{"id":"weather-station-wind-barbs","raw":"---\nid: weather-station-wind-barbs\ntitle: Weather Station Wind Barbs\ncategory: Weather\n---\n\n![Fig 1. A weather-station target rendered as a wind barb](weather-station-wind-barbs-1.jpg)\n\nWeather-station (`meteo`) targets — AIS Met/Hydro buoys and plugin-published shore\nstations such as signalk-viva — show wind as a standard **wind barb**: half\nfeather = 5 kn, full = 10 kn, pennant = 50 kn. The barb is picked from the\nstation's reported wind speed in 5-knot buckets (5–75 kn, clamped) and its staff\nrotates to point into the reported wind direction. Below 5 kn, or when no wind is\nreported, the target falls back to the plain windsock icon, unrotated.\n\nThe wind speed is always shown as a label next to the glyph, in your configured\nwind-speed units.\n\nAll 15 barb glyphs ship with Freeboard, so this works with no setup. Any bucket\ncan be replaced with custom artwork through a symbol provider plugin by\npublishing a symbol whose id matches the well-known bucket id —\n`real-weatherStation-<kts>` for real stations, `virtual-weatherStation-<kts>` for\nvirtual ones, where `<kts>` is one of the buckets 5–75 (e.g.\n`real-weatherStation-25`).\n\nA **Display → Weather → \"Wind indicator\"** setting can switch the glyph to a\nplain arrow instead of a barb for every weather-station target on the chart.\n"}],"ledger":[{"feature":"weather-station-wind-barbs","pr":495,"kind":"new","since":"v3.0.0","date":"2026-07-10","title":"feat(map): render meteo targets as wind barbs"},{"feature":"weather-overlays","pr":413,"kind":"new","since":"v3.0.0","date":"2026-07-03","title":"feat(weather): add wind and ocean current overlays"},{"feature":"weather-overlays","pr":520,"kind":"enhanced","since":"v3.0.0","date":"2026-07-14","title":"feat(weather): unify wind indicator rendering across overlays"},{"feature":"weather-station-wind-barbs","pr":520,"kind":"enhanced","since":"v3.0.0","date":"2026-07-14","title":"feat(weather): unify wind indicator rendering across overlays"},{"feature":null,"pr":520,"kind":"skip","reason":"internal UI fix — settings dialog fixed sizing/scrolling, not a distinct feature"},{"feature":"custom-map-symbols","pr":394,"kind":"new","since":"v3.0.0","date":"2026-06-25","title":"feat(charts): Custom map symbols via symbol providers"},{"feature":"screen-widgets","pr":395,"kind":"new","since":"v3.0.0","date":"2026-06-26","title":"feat: Add plotter extension host: widgets, panels, buttons, resource filters & background runtimes"},{"feature":"extension-panels","pr":395,"kind":"new","since":"v3.0.0","date":"2026-06-26","title":"feat: Add plotter extension host: widgets, panels, buttons, resource filters & background runtimes"},{"feature":"route-planning","pr":432,"kind":"enhanced","since":"v3.0.0","date":"2026-06-29","title":"feat(routes): live route editing — editable drafts + plotter-extension route API"},{"feature":null,"pr":432,"kind":"skip","reason":"adds the routes capability to the Plotter Extensions API for extension plugins (e.g. auto-routing); no direct end-user surface in Freeboard itself"},{"feature":"vessel-tracks","pr":448,"kind":"enhanced","since":"v3.0.0","date":"2026-07-02","title":"feat(map): add per-vessel AIS track display"},{"feature":"cursor-eta","pr":455,"kind":"new","since":"v3.0.0","date":"2026-07-03","title":"feat(map): show live bearing, distance and ETA at cursor"},{"feature":"cursor-eta","pr":636,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-27","title":"feat(map): support the cursor bearing/distance/ETA readout on touch devices"},{"feature":"buddy-list","pr":484,"kind":"enhanced","since":"v3.0.0","date":"2026-07-07","title":"feat(ais): add \"Buddies only\" option to the vessel filter"},{"feature":"chart-image-adjustment","pr":489,"kind":"new","since":"v3.0.0","date":"2026-07-07","title":"feat(charts): add brightness/contrast adjustment for raster image layers"},{"feature":"chart-image-adjustment","pr":497,"kind":"enhanced","since":"v3.0.0","date":"2026-07-10","title":"feat(charts): make image adjustment a modeless draggable palette"},{"feature":"chart-image-adjustment","pr":510,"kind":"enhanced","since":"v3.0.0","date":"2026-07-12","title":"feat(charts): trim image adjustment palette and remember its position"},{"feature":"weather-overlays","pr":491,"kind":"enhanced","since":"v3.0.0","date":"2026-07-11","title":"feat(weather): add tidal currents overlay with time-stepping controls"},{"feature":"weather-overlays","pr":523,"kind":"enhanced","since":"v3.0.0","date":"2026-07-14","title":"feat(weather): make current-overlay arrows customizable symbols"},{"feature":"notes","pr":485,"kind":"enhanced","since":"v3.0.0","date":"2026-07-07","title":"feat(notes): size Note Details dialog to fit its content"},{"feature":"notes","pr":512,"kind":"enhanced","since":"v3.0.0","date":"2026-07-12","title":"feat(notes): add option to open note details on single click"},{"feature":"feature-browser","pr":528,"kind":"new","since":"v3.0.0","date":"2026-07-16","title":"feat(features): add a searchable \"What's New\" feature browser"},{"feature":"feature-browser","pr":530,"kind":"enhanced","since":"v3.0.0","date":"2026-07-17","title":"feat(features): replace forced onboarding modals with a passive What's New indicator"},{"feature":"feature-browser","pr":604,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-27","title":"feat(features): show a feature's newest changes above its instructions"},{"feature":"chart-zoom-limits","kind":"new","since":"v2.1.0","date":"2023-07-06","title":"limit zoom to selected maps"},{"feature":"route-planning","pr":580,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(map): delete a route vertex with a long left-click, matching touch"},{"feature":"route-planning","pr":582,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(routes): unify the route draw and modify helper panels"},{"feature":"route-planning","pr":584,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(routes): add undo for route drawing and editing"},{"feature":"route-planning","pr":593,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(routes): add a Hide action to the route popover"},{"feature":"route-planning","pr":597,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-26","title":"feat(routes): allow reordering points on unsaved routes"},{"feature":"route-planning","pr":598,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-26","title":"feat(routes): extend a route by clicking open water in modify mode"},{"feature":"chart-list","kind":"new","since":"v0.0.2","date":"2016-07-05","title":"Add charts find and display"},{"feature":"chart-list","kind":"enhanced","since":"v1.14.0","date":"2020-12-19","title":"Chart List ordering (closes #88)"},{"feature":"chart-list","pr":177,"kind":"enhanced","since":"v2.11.2","date":"2024-08-30","title":"Toggle chart on boundary click"},{"feature":"chart-list","kind":"enhanced","since":"v2.19.6","date":"2026-01-07","title":"Editable chart properties"},{"feature":"chart-list","kind":"enhanced","since":"v2.22.0","date":"2026-04-30","title":"Add chart opacity control (closes #368)"},{"feature":"chart-list","pr":352,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(charts): add In view filter to chart list"},{"feature":"chart-list","pr":595,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-26","title":"feat(charts): order chart list to match the chosen layer order"},{"feature":"follow-vessel","kind":"new","since":"v0.0.2","date":"2015-05-18","title":"Added vesselUp and followVessel control buttons"},{"feature":"follow-vessel","kind":"enhanced","since":"v2.11.2","date":"2024-09-05","title":"Lock in Follow Vessel setting to remain in this mode when map is panned"},{"feature":"follow-vessel","kind":"enhanced","since":"v2.17.0","date":"2025-08-18","title":"Look ahead"},{"feature":"follow-vessel","pr":601,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-26","title":"feat(map): single center/follow button and pan to set follow offset"},{"feature":"follow-vessel","pr":616,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-27","title":"feat(map): offset the vessel abeam as well as ahead when following"},{"feature":"follow-vessel","pr":638,"kind":"enhanced","since":"v3.1.0-beta.1","date":"2026-07-28","title":"fix(map): hold the follow-vessel offset fixed to the screen, not the boat"},{"feature":"follow-vessel","pr":642,"kind":"enhanced","since":"v3.1.0-beta.2","date":"2026-07-29","title":"fix(map): keep the follow offset fixed on screen while zooming"},{"feature":"radar-overlay","kind":"new","since":"v2.19.7","date":"2026-01-18","title":"Initial RADAR API support"},{"feature":"radar-overlay","kind":"enhanced","since":"v2.24.0","date":"2026-06-19","title":"Radar control panel with overlay toggle, opacity and radar controls"},{"feature":"radar-overlay","pr":573,"kind":"enhanced","since":"v3.1.0-beta.0","date":"2026-07-25","title":"feat(radar): Support Radar API 3.4.0 in the radar overlay (with pre-3.4.0 fallback)"},{"feature":"unit-preferences","kind":"new","since":"v1.8.0-rc1","date":"2018-09-12","title":"Unit selection for distance, depth, speed and temperature"},{"feature":"unit-preferences","kind":"enhanced","since":"v2.20.0","date":"2026-03-14","title":"Use unit preferences configured on the Signal K server"},{"feature":"unit-preferences","kind":"enhanced","since":"v2.21.0","date":"2026-04-01","title":"server unit preferences additional support"},{"feature":"unit-preferences","pr":447,"kind":"enhanced","since":"v3.0.0","date":"2026-07-02","title":"feat(units): honor per-path display units for wind speed"},{"feature":null,"pr":446,"kind":"skip","reason":"adds the optional path argument and display-unit cache to formatValueForDisplay; foundation only, with no user-facing change until #447 populates it"},{"feature":null,"pr":454,"kind":"skip","reason":"adds the charts capability to the Plotter Extensions API — display management of chart layers Freeboard already manages, for extension plugins; no direct end-user surface in Freeboard itself"},{"feature":null,"pr":505,"kind":"skip","reason":"implements the nightMode capability of the Plotter Extensions API for extension plugins; the user-facing Dark Mode / Auto-set Night Mode settings are unchanged"},{"feature":null,"pr":508,"kind":"skip","reason":"exposes the host API to an embedding application (e.g. KIP) over the plotter-extension bus; an integration topology change with no end-user surface in Freeboard itself"},{"feature":null,"pr":607,"kind":"skip","reason":"emits the map.view event of the Plotter Extensions API so extensions stop polling map.getView; no end-user surface"},{"feature":null,"pr":529,"kind":"skip","reason":"developer tooling — generates the GitHub Release body from the feature ledger; excluded from the npm package, never shipped to users"},{"feature":null,"pr":450,"kind":"skip","reason":"developer tooling — dev-tools/fsk-mcp lets an AI agent drive a running Freeboard; excluded from the npm package, never shipped to users"},{"feature":null,"pr":419,"kind":"skip","reason":"performance work — runs OpenLayers and change detection outside the Angular zone; no change to what the user can do"},{"feature":null,"pr":420,"kind":"skip","reason":"performance work — debounces config saves and guards dark-mode updates; no change to what the user can do"},{"feature":null,"kind":"skip","date":"2026-06-05","title":"feat(charts): honor chart tileSize for raster tile sources","reason":"corrects the rendering scale of raster charts whose tiles are not 256px; a correctness fix despite the feat prefix, with nothing new for the user to do"},{"feature":null,"kind":"skip","date":"2026-05-23","title":"perf(app): lazy-load dialog components on demand","reason":"performance work — no change to what the user can do"},{"feature":null,"kind":"skip","date":"2026-05-23","title":"perf(s57): cache derived text-style config across features","reason":"performance work — no change to what the user can do"},{"feature":null,"kind":"skip","date":"2026-04-04","title":"perf: defer S57 chart symbols loading until first use","reason":"performance work — no change to what the user can do"}],"categories":[{"name":"Charts","hue":215},{"name":"Waypoints","hue":30},{"name":"Routes","hue":140},{"name":"Tracks","hue":170},{"name":"Notes","hue":50},{"name":"Navigation","hue":265},{"name":"Autopilot","hue":300},{"name":"Weather","hue":200},{"name":"Radar","hue":110},{"name":"AIS & Vessels","hue":240},{"name":"Alarms & Notifications","hue":5},{"name":"Import/Export","hue":80},{"name":"Extensions","hue":325},{"name":"Display","hue":185},{"name":"Map","hue":345}]}
@@ -2409,23 +2409,26 @@
2409
2409
  while in "Follow Vessel" mode, so you can give yourself more
2410
2410
  visible chart in the direction you care about. Each value is a
2411
2411
  percentage of the distance from the center of the screen to its
2412
- edge, and both are measured relative to your course, so the view
2413
- keeps its bearings as the vessel turns.
2412
+ edge, and both are measured relative to the screen, so the offset
2413
+ holds its spot whether the vessel is underway, drifting, or at
2414
+ rest.
2414
2415
  <ul>
2415
2416
  <li>
2416
- <b>Ahead</b>: moves the vessel back from the center to show
2417
- more chart in front of it, so <b>50</b> places the vessel half
2418
- way between the center and the trailing edge. A negative value
2417
+ <b>Vertical</b>: moves the vessel up or down the screen, so
2418
+ <b>50</b> places the vessel half way between the center and
2419
+ the bottom edge, showing more chart ahead. A negative value
2419
2420
  looks behind the vessel instead.
2420
2421
  </li>
2421
2422
  <li>
2422
- <b>Abeam</b>: moves the vessel to one side. A positive value
2423
- shows more chart to starboard, a negative value more to port.
2423
+ <b>Horizontal</b>: moves the vessel left or right. A positive
2424
+ value shifts the map to the right, showing more chart to the
2425
+ right of the vessel; a negative value does the opposite.
2424
2426
  </li>
2425
2427
  </ul>
2426
2428
  You can also set both by eye: with
2427
2429
  <b>Map Pan When Following</b> set to <b>Set Follow Offset</b>,
2428
- simply pan the chart to put the vessel where you want it.<br />
2430
+ simply pan the chart to put the vessel where you want it. Panning
2431
+ the vessel off screen instead turns follow mode off.<br />
2429
2432
  </li>
2430
2433
  <li>
2431
2434
  <b>Popover close with button</b>: Select this option in order to a
@@ -1 +1 @@
1
- import{Ca as a}from"./chunk-544H55DG.js";import"./chunk-SYVLSUHP.js";import"./chunk-R7KV75Y6.js";import"./chunk-EJ5G7BX7.js";import"./chunk-66UI7RYU.js";import"./chunk-3QUJEXF6.js";import"./chunk-XB3A3UP3.js";import"./chunk-HYKTIWCS.js";import"./chunk-DSS236J5.js";import"./chunk-2BXQ52IR.js";import"./chunk-P5GLUSCN.js";import"./chunk-EQVTEUXC.js";export{a as GeoJSONImportDialog};
1
+ import{Ca as a}from"./chunk-MWGE4BLM.js";import"./chunk-SYVLSUHP.js";import"./chunk-R7KV75Y6.js";import"./chunk-EJ5G7BX7.js";import"./chunk-66UI7RYU.js";import"./chunk-3QUJEXF6.js";import"./chunk-XB3A3UP3.js";import"./chunk-HYKTIWCS.js";import"./chunk-DSS236J5.js";import"./chunk-2BXQ52IR.js";import"./chunk-P5GLUSCN.js";import"./chunk-EQVTEUXC.js";export{a as GeoJSONImportDialog};
@@ -0,0 +1 @@
1
+ import{F as Qe,M as $e,N as et,O as tt,ca as it,da as $,e as xe,ea as ee,ia as nt,ja as at,ka as ot,m as ze,n as B,p as qe,q as je,s as Xe,t as Ye,y as Je,ya as rt,z as L,za as st}from"./chunk-MWGE4BLM.js";import{a as K,b as He,c as Ke}from"./chunk-SYVLSUHP.js";import{a as Ve,h as ke,j as Pe,k as Le}from"./chunk-R7KV75Y6.js";import{a as Be,d as Ie,i as Fe,j as Ae,k as Ne}from"./chunk-EJ5G7BX7.js";import{a as Y,b as J,c as Ze,d as Q}from"./chunk-66UI7RYU.js";import{a as Oe}from"./chunk-3QUJEXF6.js";import"./chunk-XB3A3UP3.js";import"./chunk-HYKTIWCS.js";import"./chunk-DSS236J5.js";import{b as z,c as Re,f as Ue,i as q,j as Ge,n as j,o as X}from"./chunk-2BXQ52IR.js";import{$d as U,Da as O,Dd as ye,Ea as T,Fa as D,Ha as b,Hd as Se,Ia as y,Ja as S,Jd as Ce,Ka as h,Kb as F,La as i,Ma as n,Na as E,Ob as he,P as W,Pb as A,Q as m,R as c,Rd as Me,S as x,T as ce,Td as we,Ua as V,Wa as p,Wd as N,X as pe,Ya as w,Yd as ve,Z as I,Zd as R,_ as _e,ca as fe,ee as G,gb as M,he as Z,ie as be,ja as r,jb as ue,lb as s,le as Te,mb as C,me as De,nb as k,ne as Ee,oe as We,pb as _,pe as H,qb as f,ra as P,rb as u}from"./chunk-P5GLUSCN.js";import"./chunk-EQVTEUXC.js";var ht=(l,d)=>d[0];function yt(l,d){if(l&1&&(i(0,"mat-option",8),x(),i(1,"svg",6),E(2,"line",7),n()()),l&2){let a=d.$implicit;h("value",a),r(2),O("stroke-width",a)}}function St(l,d){if(l&1&&(i(0,"mat-option",8),x(),i(1,"svg",6),E(2,"line",9),n()()),l&2){let a=d.$implicit;h("value",a[0]),r(2),O("stroke-dasharray",a[1])}}var te=class l{color=A("#ff0000");dash=A("none");weight=A(1);_color=F(()=>this.color());_dash=F(()=>this.dash());_weight=F(()=>this.weight());selectionChange=he();app=W(L);line={dashArrays:this.app.lineDashMap,weights:[1,2,3,4,5]};constructor(){}ngOnInit(){}onSelectChange(d){let a=this.app.formatLineDashArray(this._dash());this.selectionChange.emit({lineStyle:{fill:{color:this._color()},stroke:{color:this._color(),width:this._weight(),lineDash:a}},config:{color:this._color(),weight:this._weight(),dash:this._dash()}})}static \u0275fac=function(a){return new(a||l)};static \u0275cmp=P({type:l,selectors:[["linestyle-select"]],inputs:{color:[1,"color"],dash:[1,"dash"],weight:[1,"weight"]},outputs:{selectionChange:"selectionChange"},decls:25,vars:5,consts:[[2,"display","flex"],[2,"width","100px"],["mat-input","","matNativeControl","","type","color",3,"ngModelChange","change","ngModel"],[2,"width","110px"],[3,"ngModelChange","selectionChange","ngModel"],[2,"display","flex","align-items","center","gap","8px"],["width","48","height","10",2,"vertical-align","middle","margin-right","6px"],["x1","0","y1","5","x2","48","y2","5","stroke","currentColor","stroke-array","none"],[3,"value"],["x1","0","y1","5","x2","48","y2","5","stroke","currentColor","stroke-width","2"]],template:function(a,e){a&1&&(i(0,"div",0)(1,"mat-form-field",1)(2,"mat-label"),s(3,"Color"),n(),i(4,"input",2),u("ngModelChange",function(o){return f(e._color,o)||(e._color=o),o}),p("change",function(o){return e.onSelectChange({key:"color",value:o.srcElement.value})}),n()(),i(5,"mat-form-field",3)(6,"mat-label"),s(7,"Weight"),n(),i(8,"mat-select",4),u("ngModelChange",function(o){return f(e._weight,o)||(e._weight=o),o}),p("selectionChange",function(o){return e.onSelectChange({key:"weight",value:o.value})}),i(9,"mat-select-trigger")(10,"div",5),x(),i(11,"svg",6),E(12,"line",7),n()()(),y(13,yt,3,2,"mat-option",8,b),n()(),ce(),i(15,"mat-form-field",3)(16,"mat-label"),s(17,"Style"),n(),i(18,"mat-select",4),u("ngModelChange",function(o){return f(e._dash,o)||(e._dash=o),o}),p("selectionChange",function(o){return e.onSelectChange({key:"dash",value:o.value})}),i(19,"mat-select-trigger")(20,"div",5),x(),i(21,"svg",6),E(22,"line",9),n()()(),y(23,St,3,2,"mat-option",8,ht),n()()()),a&2&&(r(4),_("ngModel",e._color),r(4),_("ngModel",e._weight),r(4),O("stroke-width",e._weight()),r(),S(e.line.weights),r(5),_("ngModel",e._dash),r(4),O("stroke-dasharray",e.line.dashArrays.get(e._dash())),r(),S(e.line.dashArrays))},dependencies:[H,U,G,Z,R,N,K,X,j,q,z,Q,J,Ze,Y],encapsulation:2})};var Mt=(l,d)=>d[0];function wt(l,d){if(l&1){let a=V();i(0,"div",4)(1,"mat-radio-button",5,0),p("change",function(){m(a);let g=M(2),o=w().$implicit,t=w();return o[1].current=g.value,c(t.save(!0))}),s(3),n()()}if(l&2){let a=d.$implicit,e=w().$implicit;r(),h("name",e[0])("value",a)("checked",a===e[1].current),r(2),k(" ",a.split(".").slice(-1)," ")}}function vt(l,d){if(l&1&&(i(0,"div",2)(1,"div",3)(2,"div"),s(3),n()(),i(4,"div"),y(5,wt,4,4,"div",4,b),n()()),l&2){let a=d.$implicit;r(3),C(a[1].name),r(2),S(a[1].available)}}var ie=class l{title="";chosen=new pe;pathChoices={tws:{name:"True Wind Speed",choices:["environment.wind.speedTrue","environment.wind.speedOverGround"],available:[],current:""},twd:{name:"True Wind Direction",choices:["environment.wind.directionTrue","environment.wind.directionMagnetic","environment.wind.angleTrueGround","environment.wind.angleTrueWater"],available:[],current:""},heading:{name:"Heading / COG",choices:["navigation.courseOverGroundTrue","navigation.courseOverGroundMagnetic","navigation.headingTrue","navigation.headingMagnetic"],available:[],current:""}};pathChoicesArray=Object.entries(this.pathChoices);availPaths;app=W(L);constructor(){}ngOnInit(){this.initEntries()}initEntries(){this.availPaths=new Map(Object.entries(this.app.data.vessels.prefAvailablePaths)),this.pathChoices.tws.current=this.app.config.units.preferredPaths.tws,this.pathChoices.twd.current=this.app.config.units.preferredPaths.twd,this.pathChoices.heading.current=this.app.config.units.preferredPaths.heading,Object.entries(this.pathChoices).forEach(a=>{let e=a[1];e.choices.forEach(g=>{this.availPaths.has(g)&&e.available.push(g)}),e.available.length===0&&e.available.push(e.choices[0])})}save(d){let a={};Object.entries(this.pathChoices).forEach(e=>{a[e[0]]=e[1].current}),this.chosen.emit({save:d,value:a})}static \u0275fac=function(a){return new(a||l)};static \u0275cmp=P({type:l,selectors:[["signalk-preferred-paths"]],inputs:{title:"title"},outputs:{chosen:"chosen"},decls:6,vars:1,consts:[["pathopt",""],[2,"font-size","10pt"],[1,"sk-details"],[1,"title"],[2,"margin","5px 0 5px 0"],[3,"change","name","value","checked"]],template:function(a,e){a&1&&(i(0,"fieldset")(1,"legend",1),s(2),n(),i(3,"div"),y(4,vt,7,1,"div",2,Mt),n()()),a&2&&(r(2),C(e.title),r(2),S(e.pathChoicesArray))},dependencies:[ee,$],styles:[".sk-details[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;font-family:Roboto,Arial,Helvetica,sans-serif;font-size:10pt;max-height:100%;width:60vw;max-width:300px}.sk-details[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{background:left 1px -webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.18)),color-stop(.65,transparent)) #b2bbc2e3;padding:3px 5px 0;margin-top:3px;font-weight:500;line-height:23px;color:#000}.sk-details[_ngcontent-%COMP%] .content[_ngcontent-%COMP%]{padding:0;line-height:23px;margin:0;flex:1 1 auto;overflow:auto}.sk-details[_ngcontent-%COMP%] .item[_ngcontent-%COMP%]{display:flex;flex-direction:row;line-height:26px;border-width:0 0 0 0;border-style:solid;border-color:gray;padding-left:5px}.sk-details[_ngcontent-%COMP%] .content[_ngcontent-%COMP%] .item[_ngcontent-%COMP%]{border-width:0 0 1px 0}.sk-details[_ngcontent-%COMP%] .sectionname[_ngcontent-%COMP%]{text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;font-weight:500}.sk-details[_ngcontent-%COMP%] .pathvalue[_ngcontent-%COMP%]{display:flex;flex-wrap:nowrap;width:100%;background-color:#fff}.sk-details[_ngcontent-%COMP%] .pathvalue[_ngcontent-%COMP%] .path[_ngcontent-%COMP%]{text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-style:italic}.sk-details[_ngcontent-%COMP%] .pathvalue[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}"],changeDetection:0})};var v=(l,d)=>d[0],bt=(l,d)=>d.id;function Tt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Dt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Et(l,d){if(l&1&&(i(0,"mat-option",127),s(1),n()),l&2){let a=d.$implicit;h("value",a.url)("matTooltip",a.description),r(),k(" ",a.name," ")}}function Wt(l,d){if(l&1){let a=V();i(0,"div",47)(1,"div",38)(2,"mat-form-field",39)(3,"mat-label"),s(4,"Select Instruments App"),n(),i(5,"mat-select",65),u("ngModelChange",function(g){m(a);let o=w();return f(o.facade.settings.display.plugins.instruments,g)||(o.facade.settings.display.plugins.instruments=g),c(g)}),p("selectionChange",function(){m(a);let g=w();return c(g.onInstrumentApp())}),y(6,Et,2,3,"mat-option",127,b),n()()(),i(8,"div",38)(9,"mat-form-field",53)(10,"mat-label"),s(11,"Parameters"),n(),i(12,"input",128,21),u("ngModelChange",function(g){m(a);let o=w();return f(o.facade.settings.display.plugins.parameters,g)||(o.facade.settings.display.plugins.parameters=g),c(g)}),p("change",function(){m(a);let g=w();return c(g.persistModel("pluginParameters"))}),n()()(),i(14,"div",38)(15,"mat-checkbox",129),u("ngModelChange",function(g){m(a);let o=w();return f(o.facade.settings.display.plugins.startOnOpen,g)||(o.facade.settings.display.plugins.startOnOpen=g),c(g)}),p("change",function(){m(a);let g=w();return c(g.persistModel("pluginStartOnOpen"))}),s(16," Halt App on hide "),n()(),i(17,"div",38)(18,"button",130),p("click",function(){m(a);let g=w();return c(g.toggleFavourites())}),i(19,"mat-icon"),s(20,"star"),n(),s(21," FAVOURITES "),n()()()}if(l&2){let a=w();r(5),_("ngModel",a.facade.settings.display.plugins.instruments),r(),S(a.facade.applicationList),r(6),h("disabled",a.facade.settings.display.plugins.instruments===null),_("ngModel",a.facade.settings.display.plugins.parameters),r(3),_("ngModel",a.facade.settings.display.plugins.startOnOpen)}}function Vt(l,d){if(l&1&&(i(0,"mat-list-option",132),s(1),n()),l&2){let a=d.$implicit,e=w(2);h("disabled",a.url==e.facade.settings.display.plugins.instruments)("selected",e.facade.settings.display.plugins.favourites.includes(a.url))("value",a.url),r(),k(" ",a.name," ")}}function kt(l,d){if(l&1){let a=V();i(0,"div",37)(1,"div",38)(2,"div",109),E(3,"br"),s(4,"Select Favourite Apps: "),n(),E(5,"mat-divider"),i(6,"mat-selection-list",131,22),p("selectionChange",function(g){m(a);let o=M(7),t=w();return c(t.onFavSelected(g,o))}),y(8,Vt,2,4,"mat-list-option",132,b),n()()()}if(l&2){let a=w();r(8),S(a.facade.favouritesList)}}function Pt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Lt(l,d){l&1&&(i(0,"mat-error"),s(1,"Please enter a number >= 0"),n())}function xt(l,d){l&1&&(i(0,"mat-error"),s(1,"Please enter a number >= 1"),n())}function Ot(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Bt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function It(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Ft(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function At(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Nt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Rt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Ut(l,d){if(l&1){let a=V();i(0,"div",38)(1,"mat-form-field",39)(2,"mat-label"),s(3,"Position display format"),n(),i(4,"mat-select",133),u("ngModelChange",function(g){m(a);let o=w();return f(o.facade.settings.units.positionFormat,g)||(o.facade.settings.units.positionFormat=g),c(g)}),p("selectionChange",function(){m(a);let g=w();return c(g.persistModel())}),y(5,Rt,2,2,"mat-option",41,b),n()()()}if(l&2){let a=w();r(4),_("ngModel",a.facade.settings.units.positionFormat),r(),S(a.options.preferredValues.coords)}}function Gt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Zt(l,d){if(l&1){let a=V();i(0,"div",38)(1,"mat-form-field",39)(2,"mat-label"),s(3,"Prefer True / Magnetic values"),n(),i(4,"mat-select",134),u("ngModelChange",function(g){m(a);let o=w();return f(o.facade.settings.units.headingAttribute,g)||(o.facade.settings.units.headingAttribute=g),c(g)}),p("selectionChange",function(){m(a);let g=w();return c(g.persistModel("headingAttribute"))}),y(5,Gt,2,2,"mat-option",41,b),n()()()}if(l&2){let a=w();r(4),_("ngModel",a.facade.settings.units.headingAttribute),r(),S(a.options.preferredValues.heading)}}function Ht(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a),r(),C(a)}}function Kt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function zt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function qt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function jt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Xt(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a),r(),C(a)}}function Yt(l,d){l&1&&(i(0,"mat-error"),s(1," Please enter a positive number "),n())}function Jt(l,d){l&1&&(i(0,"mat-error"),s(1," Please enter a positive number "),n())}function Qt(l,d){l&1&&(i(0,"mat-error"),s(1," Please enter a positive number "),n())}function $t(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function ei(l,d){l&1&&(i(0,"mat-error"),s(1," Please enter a number > 0 "),n())}function ti(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a),r(),C(a)}}function ii(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function ni(l,d){if(l&1&&(i(0,"mat-radio-button",41),E(1,"img",135),s(2),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),ue(`transform: scale(${a[0]})`),r(),k(" (",a[1],") ")}}function ai(l,d){l&1&&(i(0,"mat-error"),s(1," Please enter a value between -90 and 90 (max 9 decimals) "),n())}function oi(l,d){l&1&&(i(0,"mat-error"),s(1," Please enter a value between -180 and 180 (max 9 decimals) "),n())}function ri(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function si(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function li(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a),r(),C(a)}}function di(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a),r(),C(a)}}function gi(l,d){l&1&&(i(0,"mat-error"),s(1," Please enter a number >= 1. "),n())}function mi(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function ci(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function pi(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function _i(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function fi(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function ui(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function hi(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a),r(),C(a)}}function yi(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Si(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a),r(),C(a)}}function Ci(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a),r(),C(a)}}function Mi(l,d){if(l&1){let a=V();i(0,"button",136),p("click",function(){m(a),w();let g=M(552);return c(g.value="")}),i(1,"mat-icon"),s(2,"close"),n()()}}function wi(l,d){if(l&1&&(i(0,"mat-list-option",111),s(1),n()),l&2){let a=d.$implicit,e=w();h("selected",e.facade.settings.resources.paths.includes(a))("value",a),r(),k(" ",a," ")}}function vi(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a.id),r(),C(a.name)}}function bi(l,d){if(l&1){let a=V();i(0,"mat-tab",112)(1,"div",32)(2,"div",33)(3,"div",124)(4,"div",35),s(5,"RADAR SETTINGS"),n(),i(6,"mat-card",36)(7,"div",47)(8,"div",38)(9,"mat-form-field",137)(10,"mat-label"),s(11,"Radar Devices"),n(),i(12,"mat-select",138,23),u("ngModelChange",function(g){m(a);let o=w();return f(o.facade.settings.radars.deviceId,g)||(o.facade.settings.radars.deviceId=g),c(g)}),p("selectionChange",function(){m(a);let g=w();return c(g.doRadar())}),y(14,vi,2,2,"mat-option",41,bt),n()()(),i(16,"div",38)(17,"button",139),p("click",function(){m(a);let g=w();return c(g.refreshRadars())}),i(18,"mat-icon"),s(19," refresh"),n(),s(20," REFRESH "),n()()()()()()()()}if(l&2){let a=w();r(12),h("disabled",!a.radarList().length||a.app.uiCtrl().radarLayer),_("ngModel",a.facade.settings.radars.deviceId),r(2),S(a.radarList())}}function Ti(l,d){if(l&1&&(i(0,"mat-option",41),s(1),n()),l&2){let a=d.$implicit;h("value",a[0]),r(),C(a[1])}}function Di(l,d){l&1&&(i(0,"mat-error"),s(1," Value required. "),n())}var gt=class l{show={favourites:I(!1)};options;centerOffsetLimit=qe;aisStateFilter={moored:!1,anchored:!1};formattedNumberModel={rangeCirclesDistance:1e3};unitsChangedSignal=I(0);radarList=I([]);saveOnClose=!1;facade=W(st);myElement=W(fe);dialogRef=W(ye);wakeLock=W(ze);s57=W(Xe);app=W(L);radarApi=W(Je);constructor(){this.options=new rt,_e(()=>{this.unitsChangedSignal(),this.formatNumberModel()})}ngOnInit(){this.facade.refresh(),this.facade.settings.selections.aisState.forEach(d=>{d in this.aisStateFilter&&(this.aisStateFilter[d]=!0)}),this.refreshRadars()}refreshRadars(){this.radarApi.listRadars().then(d=>{this.radarList.set(d)}).catch(()=>{this.radarList.set([])})}formatNumberModel(){this.formattedNumberModel={rangeCirclesDistance:this.facade.settings.units.distance==="kilometer"?Math.floor(this.facade.settings.vessels.rangeCirclesDistance/1e3):Math.floor(B.transform(this.facade.settings.vessels.rangeCirclesDistance,"m","naut-mile"))}}raiseChange(){this.app.alignUnitPrefs(this.app.serverConfig.unitPreferences()),this.unitsChangedSignal.update(d=>d+1)}handleClose(){this.saveOnClose&&this.persistModel(),this.dialogRef.close()}doWakelock(d){this.persistModel(),d?this.wakeLock.disable():this.wakeLock.enable()}doS57(d){this.facade.settings.map.s57Options.depthUnit=this.facade.settings.units.depth,d?this.parseNumber(d):this.persistModel(),this.s57.setOptions(this.facade.settings.map.s57Options)}doRadar(){this.radarApi.init(this.facade.settings.radars.deviceId).then(d=>{d&&this.persistModel()})}onLineStyle(d,a){let e=this.facade.settings.vessels.selfLines[d];e&&(e.color=a.config.color,e.dash=a.config.dash,e.weight=a.config.weight,this.app.selfLines.update(g=>{let o=Object.assign({},g);return o[d]=a.lineStyle,o}),this.persistModel())}toggleFavourites(){this.show.favourites.update(d=>!d)}parseCenterOffset(d){d.reset(typeof d.model=="number"?je(d.model):0),this.persistModel()}parseNumber(d,a){if(typeof d.model!="number"){d.reset(this.fallbackToDefault());return}!a&&d.model<0&&d.reset(Math.abs(d.model)),this.persistModel()}parseFormattedNumber(d,a){typeof d.model=="number"&&(!a&&d.model<0&&d.reset(Math.abs(d.model)),this.facade.settings.vessels.rangeCirclesDistance=this.facade.settings.units.distance==="kilometer"?Math.floor(this.formattedNumberModel.rangeCirclesDistance*1e3):Math.floor(B.nauticalMilesToKm(this.formattedNumberModel.rangeCirclesDistance)*1e3),this.persistModel())}fallbackToDefault(){let d=Ye();if(typeof this.facade.settings.display.statusBar.referenceSpeed!="number")return d.display.statusBar.referenceSpeed;if(typeof this.facade.settings.display.statusBar.tapFadeSpeed!="number")return d.display.statusBar.tapFadeSpeed;if(typeof this.facade.settings.map.s57Options.shallowDepth!="number")return d.map.s57Options.shallowDepth;if(typeof this.facade.settings.map.s57Options.safetyDepth!="number")return d.map.s57Options.safetyDepth;if(typeof this.facade.settings.map.s57Options.deepDepth!="number")return d.map.s57Options.deepDepth;if(typeof this.facade.fixedPosition[0]!="number"||typeof this.facade.fixedPosition[1]!="number")return 0;if(typeof this.facade.settings.course.arrivalCircle!="number")return d.course.arrivalCircle}persistModel(d){this.facade.applySettings(),this.facade.emitChangeEvent(d)}get speedUnitSymbol(){return B.getSymbol(this.facade.settings.units.speed)}deferPersist(d){this.saveOnClose=!0,this.facade.emitChangeEvent(d)}onInstrumentApp(){this.persistModel("pluginInstruments"),this.facade.buildFavouritesList()}onPreferredPaths(d){d.save&&(this.facade.settings.units.preferredPaths=d.value,this.persistModel())}onFavSelected(d,a){this.facade.settings.display.plugins.favourites=a.selectedOptions.selected.map(e=>e.value),this.persistModel()}onAisStateFilter(){let d=[];for(let a in this.aisStateFilter)this.aisStateFilter[a]&&d.push(a);this.facade.settings.selections.aisState=[].concat(d),this.persistModel()}onResPathSelected(d){this.facade.settings.resources.paths=d.selectedOptions.selected.map(a=>a.value),this.facade.settings.resources.paths.forEach(a=>{a in this.facade.settings.selections.resourceSets||(this.facade.settings.selections.resourceSets[a]=[])}),this.persistModel()}clearAuthToken(){this.facade.clearToken()}renderSymbol(d){return B.getSymbol(d)}static \u0275fac=function(a){return new(a||l)};static \u0275cmp=P({type:l,selectors:[["settings-dialog"]],decls:647,vars:136,consts:[["refspeed","ngModel"],["tapfade","ngModel"],["serverprefs",""],["distunits",""],["centerOffsetY","ngModel"],["centerOffsetX","ngModel"],["s57shallowDepth","ngModel"],["s57safetyDepth","ngModel"],["s57deepDepth","ngModel"],["coursearrivalcircle","ngModel"],["courseautoadvance",""],["courseautoadvanceon",""],["vesselfixedlocationmode",""],["fixedlat","ngModel"],["fixedlon","ngModel"],["rangeCirclesDistance","ngModel"],["notesrootfilter",""],["respath",""],["skmaxradius",""],["videourl","ngModel"],["experiments",""],["instparams","ngModel"],["favs",""],["radarlist",""],[2,"background-color","transparent"],[1,"dialog-icon"],[2,"flex","1 1 auto","text-align","center"],[2,"text-align","right"],["mat-icon-button","",3,"click"],["mat-dialog-content",""],["dynamicHeight","false","mat-stretch-tabs","false","mat-align-tabs","start"],["label","Display"],[1,"theme-page","settings"],[1,"theme-panel"],["id","sectDisplay",1,"setting-group"],[1,"setting-group-title"],[1,"setting-card"],[1,"setting-card-row",2,"padding-bottom","10px"],[1,"setting-card-row-item"],[2,"width","100%"],["matTooltip","Dark Mode setting.",3,"ngModelChange","selectionChange","ngModel"],[3,"value"],["label","after","matTooltip","Auto-set using environment.mode value.",3,"ngModelChange","change","ngModel"],["matTooltip","Action button selection.",3,"ngModelChange","selectionChange","ngModel"],["label","after","matTooltip","Disable wake lock.",3,"ngModelChange","change","disabled","ngModel"],["label","after","matTooltip","Un-check to prefer dialogs over the information panel",3,"ngModelChange","change","ngModel"],["label","after","matTooltip","Open Note details with a single click instead of showing the pop-up options",3,"ngModelChange","change","ngModel"],[1,"setting-card-row"],["matTooltip","Do not play sounds","label","after",3,"ngModelChange","change","ngModel"],["label","after",3,"ngModelChange","change","ngModel"],["matTooltip","Period of time out of alarm state before re-triggering.",3,"ngModelChange","selectionChange","ngModel","disabled"],[1,"setting-group"],["label","after","matTooltip","Show the bearing, distance and ETA from the vessel to the cursor in the status bar. Click or tap the chart to hold the readout on that point.",3,"ngModelChange","change","ngModel"],["floatLabel","always",2,"width","100%"],["matInput","","type","number","min","0","matTooltip","Boat speed used to estimate ETA when SOG is unavailable (e.g. at anchor or hove to).",3,"ngModelChange","change","disabled","ngModel"],["matInput","","type","number","min","1","step","0.5","matTooltip","How long the marker left by a click or tap takes to fade. The readout stays held on that point until it does.",3,"ngModelChange","change","disabled","ngModel"],["matTooltip","Glyph used to display wind direction and speed.",3,"ngModelChange","selectionChange","ngModel"],["label","Units"],["id","sectUnits",1,"setting-group"],["label","after","matTooltip","Use the unit preferences configured on the server.",3,"ngModelChange","change","disabled","ngModel"],[3,"ngModelChange","selectionChange","disabled","ngModel"],["title","Preferred Paths",3,"chosen"],["label","Map"],["id","sectMap",1,"setting-group"],["aria-hidden","true",1,"setting-field-group-title"],[3,"ngModelChange","selectionChange","ngModel"],[1,"setting-field-group-title"],[1,"setting-field-group"],["floatLabel","always"],["matInput","","type","number","matTooltip","Where the vessel sits up or down the screen, as a percentage of the distance to the edge. Positive looks ahead (vessel lower); negative looks behind.",3,"ngModelChange","change","min","max","ngModel"],["matInput","","type","number","matTooltip","Where the vessel sits left or right of centre, as a percentage of the distance to the edge. Positive shifts the map right (vessel left).",3,"ngModelChange","change","min","max","ngModel"],["matTooltip","Add close button to popovers","label","after",3,"ngModelChange","change","ngModel"],["matTooltip","Double Click map to zoom","label","after",3,"ngModelChange","change","ngModel"],["matTooltip","Keep tiles visible when zooming past chart maxZoom","label","after",3,"ngModelChange","change","ngModel"],["matTooltip","What panning the chart does while following the vessel.",3,"ngModelChange","selectionChange","ngModel"],["placeholder","Graphicsstyle",3,"ngModelChange","selectionChange","ngModel"],["placeholder","Boundaries",3,"ngModelChange","selectionChange","ngModel"],["placeholder","Color Table",3,"ngModelChange","selectionChange","ngModel"],["placeholder","Colors",3,"ngModelChange","selectionChange","ngModel"],["matInput","","type","number","required","","min","0",3,"ngModelChange","change","ngModel"],["matSuffix",""],["multiple","","placeholder","Layers",3,"ngModelChange","selectionChange","ngModel"],["label","Course"],["id","sectCourse",1,"setting-group"],["matTooltip","Select the trigger for advancing to next point.",3,"ngModelChange","selectionChange","disabled","ngModel"],["matTooltip","Period of time before destination is advanced to next waypoint.",3,"ngModelChange","selectionChange","disabled","ngModel"],["label","Vessels"],["id","sectVessels",1,"setting-group"],[3,"ngModelChange","change","ngModel"],["label","after","matTooltip","e.g. Building, Camp, etc.",3,"ngModelChange","change","ngModel"],["matInput","","type","number","required","","pattern","^-?([1-8]?[0-9])(\\.\\d{1,9})?$","min","-90","max","90",3,"ngModelChange","change","ngModel","disabled"],["matInput","","type","number","required","","pattern","^-?(1[0-7]?[0-9]|[1-9]?[0-9])(\\.\\d{1,9})?$","min","-180","max","180",3,"ngModelChange","change","ngModel","disabled"],["matTooltip","Length of heading line.",3,"ngModelChange","selectionChange","ngModel"],[3,"selectionChange","color","dash","weight"],["matTooltip","Length of COG line.",3,"ngModelChange","selectionChange","ngModel"],[3,"ngModelChange","selectionChange","ngModel","disabled"],["label","after",3,"ngModelChange","change","ngModel","disabled"],["matInput","","type","number","required","","min","1",3,"ngModelChange","change","ngModel","disabled"],["matTooltip","Select to source trail data from the server","label","after",3,"ngModelChange","change","disabled","ngModel"],["discrete","","tickInterval","1","min","1","max","96",3,"disabled"],["matSliderThumb","",3,"ngModelChange","valueChange","ngModel"],["label","Resources"],["id","sectNotes",1,"setting-group"],[3,"valueChange","selectionChange","disabled","value"],["matInput","","type","text","placeholder","?radius=%note:radius%","matTooltip","Filter to apply when retrieving notes",3,"ngModelChange","change","ngModel"],["matSuffix","","mat-icon-button",""],["matTooltip","Allow group name editing.","label","after",3,"ngModelChange","change","ngModel"],["matTooltip","Require position information when adding notes to a group.","label","after",3,"ngModelChange","change","ngModel"],["id","sectResLayers",1,"setting-group"],[2,"font-style","italic"],["matTooltip","Select resource layers to show.",3,"selectionChange"],[3,"selected","value"],["label","Radar"],["label","Signal K"],["id","sectSKConnection",1,"setting-group"],[2,"font-size","smaller"],["matToolTip","Check to receive other vessel data","label","after",3,"ngModelChange","change","ngModel"],["matToolTip","Check to receive AtoN data","matTooltipPosition","below","label","after",3,"ngModelChange","change","ngModel"],["matTooltip","Check to receive aircraft data","matTooltipPosition","below","label","after",3,"ngModelChange","change","ngModel"],["matToolTip","Check to receive SaR data","matTooltipPosition","below","label","after",3,"ngModelChange","change","ngModel"],["matToolTip","Check to receive Weather / Meteo data","matTooltipPosition","below","label","after",3,"ngModelChange","change","ngModel"],["matToolTip","Only include AIS targets within this distance","matTooltipPosition","below",3,"ngModelChange","selectionChange","ngModel"],["mat-icon-button","","matTooltip","Clear Auth Token",3,"click"],["label","Experiments"],["id","sectExperiments",1,"setting-group"],["matInput","","type","text","required","","placeholder","Video stream URL","matTooltip","Enter URL of video stream",3,"ngModelChange","change","disabled","ngModel"],["matTooltip","Enable ALL experimental Features","label","after",3,"ngModelChange","change","ngModel"],["matTooltipPosition","right",3,"value","matTooltip"],["matInput","","type","text","placeholder","e.g. ?layout=mylayout","matTooltip","Enter parameters to pass to Instrument App",3,"ngModelChange","change","disabled","ngModel"],["matTooltip","Stop instrument app when hidden","label","after",3,"ngModelChange","change","ngModel"],["mat-raised-button","","matTooltip","Favourite Apps","label","after",3,"click"],[3,"selectionChange"],[3,"disabled","selected","value"],["matTooltip","Display position in this format",3,"ngModelChange","selectionChange","ngModel"],["matTooltip","Preferred value type for paths not in Preferred Paths above",3,"ngModelChange","selectionChange","ngModel"],["src","./assets/img/vessels/self.png"],["matSuffix","","mat-icon-button","",3,"click"],[2,"width","stretch"],["matToolTip","Select radar device","matTooltipPosition","below",3,"ngModelChange","selectionChange","disabled","ngModel"],["mat-raised-button","",3,"click"]],template:function(a,e){if(a&1){let g=V();i(0,"mat-toolbar",24)(1,"span",25)(2,"mat-icon"),s(3,"settings"),n()(),i(4,"span",26),s(5,"Settings"),n(),i(6,"span",27)(7,"button",28),p("click",function(){return e.handleClose()}),i(8,"mat-icon"),s(9,"close"),n()()()(),i(10,"div",29)(11,"mat-tab-group",30)(12,"mat-tab",31)(13,"div",32)(14,"div",33)(15,"div",34)(16,"div",35),s(17,"DISPLAY"),n(),i(18,"mat-card",36)(19,"mat-card-content")(20,"div",37)(21,"div",38)(22,"mat-form-field",39)(23,"mat-label"),s(24,"Dark Mode setting"),n(),i(25,"mat-select",40),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.darkMode.source,t)||(e.facade.settings.display.darkMode.source=t),c(t)}),p("selectionChange",function(){return e.persistModel("darkTheme")}),y(26,Tt,2,2,"mat-option",41,v),n()()(),i(28,"div",38)(29,"mat-checkbox",42),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.nightMode,t)||(e.facade.settings.display.nightMode=t),c(t)}),p("change",function(){return e.persistModel()}),s(30," Auto-set Night Mode "),n()(),i(31,"div",38)(32,"mat-form-field",39)(33,"mat-label"),s(34,"Action Button"),n(),i(35,"mat-select",43),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.fab,t)||(e.facade.settings.display.fab=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(36,Dt,2,2,"mat-option",41,v),n()()(),i(38,"div",38)(39,"mat-checkbox",44),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.disableWakelock,t)||(e.facade.settings.display.disableWakelock=t),c(t)}),p("change",function(t){return e.doWakelock(t.checked)}),s(40," Allow Device to Sleep "),n()(),i(41,"div",38)(42,"mat-checkbox",45),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.preferInfoPanel,t)||(e.facade.settings.display.preferInfoPanel=t),c(t)}),p("change",function(){return e.persistModel()}),s(43," Prefer Info-Panel "),n()(),i(44,"div",38)(45,"mat-checkbox",46),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.singleClickNoteDetails,t)||(e.facade.settings.display.singleClickNoteDetails=t),c(t)}),p("change",function(){return e.persistModel()}),s(46," Single Click for Note Details "),n()()()()(),E(47,"br"),i(48,"mat-card",36)(49,"mat-card-content"),T(50,Wt,22,4,"div",47),T(51,kt,10,0,"div",37),n()(),E(52,"br"),n(),i(53,"div",34)(54,"div",35),s(55,"SOUND"),n(),i(56,"mat-card",36)(57,"mat-card-content")(58,"div",37)(59,"div",38)(60,"mat-checkbox",48),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.muteSound,t)||(e.facade.settings.display.muteSound=t),c(t)}),p("change",function(){return e.persistModel()}),s(61," Do not Play Sounds "),n()(),i(62,"div",38)(63,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.depthAlarm.enabled,t)||(e.facade.settings.display.depthAlarm.enabled=t),c(t)}),p("change",function(){return e.persistModel()}),s(64," Show DEPTH Alarms "),n()(),i(65,"div",38)(66,"mat-form-field",39)(67,"mat-label"),s(68,"Alarm Smoothing Time"),n(),i(69,"mat-select",50),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.depthAlarm.smoothing,t)||(e.facade.settings.display.depthAlarm.smoothing=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(70,Pt,2,2,"mat-option",41,v),n()()()()()()(),i(72,"div",51)(73,"div",35),s(74,"STATUS BAR OPTIONS"),n(),i(75,"mat-card",36)(76,"mat-card-content")(77,"div",37)(78,"div",38)(79,"mat-checkbox",52),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.statusBar.liveEta,t)||(e.facade.settings.display.statusBar.liveEta=t),c(t)}),p("change",function(){return e.persistModel()}),s(80," Live ETA at cursor "),n()(),i(81,"div",38)(82,"mat-form-field",53)(83,"mat-label"),s(84),n(),i(85,"input",54,0),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.statusBar.referenceSpeed,t)||(e.facade.settings.display.statusBar.referenceSpeed=t),c(t)}),p("change",function(){m(g);let t=M(86);return c(e.parseNumber(t))}),n(),T(87,Lt,2,0,"mat-error"),n()(),i(88,"div",38)(89,"mat-form-field",53)(90,"mat-label"),s(91,"Tap Fade Speed (s)"),n(),i(92,"input",55,1),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.statusBar.tapFadeSpeed,t)||(e.facade.settings.display.statusBar.tapFadeSpeed=t),c(t)}),p("change",function(){m(g);let t=M(93);return c(e.parseNumber(t))}),n(),T(94,xt,2,0,"mat-error"),n()()()()()(),i(95,"div",51)(96,"div",35),s(97,"WEATHER"),n(),i(98,"mat-card",36)(99,"mat-card-content")(100,"div",37)(101,"div",38)(102,"mat-form-field",39)(103,"mat-label"),s(104,"Wind indicator"),n(),i(105,"mat-select",56),u("ngModelChange",function(t){return m(g),f(e.facade.settings.display.windIndicator,t)||(e.facade.settings.display.windIndicator=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(106,Ot,2,2,"mat-option",41,v),n()()()()()()()()()(),i(108,"mat-tab",57)(109,"div",32)(110,"div",33)(111,"div",58)(112,"div",35),s(113,"UNITS & VALUES"),n(),i(114,"mat-card",36)(115,"mat-card-content")(116,"div",37)(117,"div",38)(118,"fieldset")(119,"legend")(120,"mat-checkbox",59,2),u("ngModelChange",function(t){return m(g),f(e.facade.settings.units.useServerPrefs,t)||(e.facade.settings.units.useServerPrefs=t),c(t)}),p("change",function(){return m(g),e.raiseChange(),c(e.persistModel())}),s(122," Use Server Unit Preferences "),n()(),i(123,"div",37)(124,"div",38)(125,"mat-form-field",39)(126,"mat-label"),s(127,"Distance units"),n(),i(128,"mat-select",60,3),u("ngModelChange",function(t){return m(g),f(e.facade.settings.units.distance,t)||(e.facade.settings.units.distance=t),c(t)}),p("selectionChange",function(){return m(g),e.raiseChange(),c(e.persistModel())}),y(130,Bt,2,2,"mat-option",41,v),n()()(),i(132,"div",38)(133,"mat-form-field",39)(134,"mat-label"),s(135,"Depth units"),n(),i(136,"mat-select",60),u("ngModelChange",function(t){return m(g),f(e.facade.settings.units.depth,t)||(e.facade.settings.units.depth=t),c(t)}),p("selectionChange",function(){return m(g),e.raiseChange(),c(e.doS57())}),y(137,It,2,2,"mat-option",41,v),n()()(),i(139,"div",38)(140,"mat-form-field",39)(141,"mat-label"),s(142,"Length units"),n(),i(143,"mat-select",60),u("ngModelChange",function(t){return m(g),f(e.facade.settings.units.length,t)||(e.facade.settings.units.length=t),c(t)}),p("selectionChange",function(){return m(g),e.raiseChange(),c(e.persistModel())}),y(144,Ft,2,2,"mat-option",41,v),n()()(),i(146,"div",38)(147,"mat-form-field",39)(148,"mat-label"),s(149,"Temperature units"),n(),i(150,"mat-select",60),u("ngModelChange",function(t){return m(g),f(e.facade.settings.units.temperature,t)||(e.facade.settings.units.temperature=t),c(t)}),p("selectionChange",function(){return m(g),e.raiseChange(),c(e.persistModel())}),y(151,At,2,2,"mat-option",41,v),n()()(),i(153,"div",38)(154,"mat-form-field",39)(155,"mat-label"),s(156,"Speed units"),n(),i(157,"mat-select",60),u("ngModelChange",function(t){return m(g),f(e.facade.settings.units.speed,t)||(e.facade.settings.units.speed=t),c(t)}),p("selectionChange",function(){return m(g),e.raiseChange(),c(e.persistModel())}),y(158,Nt,2,2,"mat-option",41,v),n()()()()()()(),i(160,"div",37),T(161,Ut,7,1,"div",38),T(162,Zt,7,1,"div",38),i(163,"div",38)(164,"signalk-preferred-paths",61),p("chosen",function(t){return e.onPreferredPaths(t)}),n()()()()()()()()(),i(165,"mat-tab",62)(166,"div",32)(167,"div",33)(168,"div",63)(169,"div",35),s(170,"MAP"),n(),i(171,"mat-card")(172,"mat-card-content")(173,"div",37)(174,"div",38)(175,"div",64),s(176," \xA0 "),n(),i(177,"mat-form-field",39)(178,"mat-label"),s(179,"Feature label zoom level"),n(),i(180,"mat-select",65),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.labelsMinZoom,t)||(e.facade.settings.map.labelsMinZoom=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(181,Ht,2,2,"mat-option",41,b),n()()(),i(183,"div",38)(184,"div",66),s(185," Offset Vessel Center (%) "),n(),i(186,"div",67)(187,"mat-form-field",68)(188,"mat-label"),s(189,"Vertical"),n(),i(190,"input",69,4),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.centerOffset.y,t)||(e.facade.settings.map.centerOffset.y=t),c(t)}),p("change",function(){m(g);let t=M(191);return c(e.parseCenterOffset(t))}),n()(),i(192,"mat-form-field",68)(193,"mat-label"),s(194,"Horizontal"),n(),i(195,"input",70,5),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.centerOffset.x,t)||(e.facade.settings.map.centerOffset.x=t),c(t)}),p("change",function(){m(g);let t=M(196);return c(e.parseCenterOffset(t))}),n()()()(),i(197,"div",38)(198,"mat-checkbox",71),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.popoverMulti,t)||(e.facade.settings.map.popoverMulti=t),c(t)}),p("change",function(){return e.persistModel()}),s(199," Popovers close with button "),n()(),i(200,"div",38)(201,"mat-checkbox",72),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.doubleClickZoom,t)||(e.facade.settings.map.doubleClickZoom=t),c(t)}),p("change",function(){return e.persistModel()}),s(202," Double click to Zoom "),n()(),i(203,"div",38)(204,"mat-checkbox",73),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.overZoomTiles,t)||(e.facade.settings.map.overZoomTiles=t),c(t)}),p("change",function(){return e.persistModel()}),s(205," Keep tiles visible on max zoom "),n()(),i(206,"div",38)(207,"mat-form-field",39)(208,"mat-label"),s(209,"Map Pan When Following"),n(),i(210,"mat-select",74),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.panBehavior,t)||(e.facade.settings.map.panBehavior=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(211,Kt,2,2,"mat-option",41,v),n()()()()()(),i(213,"div",35),s(214,"VECTOR CHARTS"),n(),i(215,"mat-card")(216,"mat-card-content")(217,"div",37)(218,"div",38)(219,"mat-form-field",39)(220,"mat-label"),s(221,"Graphics Style"),n(),i(222,"mat-select",75),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.s57Options.graphicsStyle,t)||(e.facade.settings.map.s57Options.graphicsStyle=t),c(t)}),p("selectionChange",function(){return e.doS57()}),y(223,zt,2,2,"mat-option",41,v),n()()(),i(225,"div",38)(226,"mat-form-field",39)(227,"mat-label"),s(228,"Boundaries"),n(),i(229,"mat-select",76),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.s57Options.boundaries,t)||(e.facade.settings.map.s57Options.boundaries=t),c(t)}),p("selectionChange",function(){return e.doS57()}),y(230,qt,2,2,"mat-option",41,v),n()()(),i(232,"div",38)(233,"mat-form-field",39)(234,"mat-label"),s(235,"Color Table (Requires refresh)"),n(),i(236,"mat-select",77),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.s57Options.colorTable,t)||(e.facade.settings.map.s57Options.colorTable=t),c(t)}),p("selectionChange",function(){return e.doS57()}),y(237,jt,2,2,"mat-option",41,v),n()()(),i(239,"div",38)(240,"mat-form-field",39)(241,"mat-label"),s(242,"Colors"),n(),i(243,"mat-select",78),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.s57Options.colors,t)||(e.facade.settings.map.s57Options.colors=t),c(t)}),p("selectionChange",function(){return e.doS57()}),y(244,Xt,2,2,"mat-option",41,b),n()()()(),i(246,"div",37)(247,"div",38)(248,"mat-form-field",39)(249,"mat-label"),s(250,"Shallow depth"),n(),i(251,"input",79,6),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.s57Options.shallowDepth,t)||(e.facade.settings.map.s57Options.shallowDepth=t),c(t)}),p("change",function(){m(g);let t=M(252);return c(e.doS57(t))}),n(),T(253,Yt,2,0,"mat-error"),i(254,"span",80),s(255,"m"),n()()(),i(256,"div",38)(257,"mat-form-field",39)(258,"mat-label"),s(259,"Safety depth"),n(),i(260,"input",79,7),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.s57Options.safetyDepth,t)||(e.facade.settings.map.s57Options.safetyDepth=t),c(t)}),p("change",function(){m(g);let t=M(261);return c(e.doS57(t))}),n(),T(262,Jt,2,0,"mat-error"),i(263,"span",80),s(264,"m"),n()()(),i(265,"div",38)(266,"mat-form-field",39)(267,"mat-label"),s(268,"Deep depth"),n(),i(269,"input",79,8),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.s57Options.deepDepth,t)||(e.facade.settings.map.s57Options.deepDepth=t),c(t)}),p("change",function(){m(g);let t=M(270);return c(e.doS57(t))}),n(),T(271,Qt,2,0,"mat-error"),i(272,"span",80),s(273,"m"),n()()(),i(274,"div",38)(275,"mat-form-field",39)(276,"mat-label"),s(277,"Layers"),n(),i(278,"mat-select",81),u("ngModelChange",function(t){return m(g),f(e.facade.settings.map.s57Options.otherLayers,t)||(e.facade.settings.map.s57Options.otherLayers=t),c(t)}),p("selectionChange",function(){return e.doS57()}),y(279,$t,2,2,"mat-option",41,v),n()()()()()()()()()(),i(281,"mat-tab",82)(282,"div",32)(283,"div",33)(284,"div",83)(285,"div",35),s(286,"COURSE"),n(),i(287,"mat-card",36)(288,"mat-card-content")(289,"div",37)(290,"div",38)(291,"mat-form-field",39)(292,"mat-label"),s(293,"Arrival Circle"),n(),i(294,"input",79,9),u("ngModelChange",function(t){return m(g),f(e.facade.settings.course.arrivalCircle,t)||(e.facade.settings.course.arrivalCircle=t),c(t)}),p("change",function(){m(g);let t=M(295);return c(e.parseNumber(t))}),n(),T(296,ei,2,0,"mat-error"),i(297,"span",80),s(298,"m"),n()()()(),i(299,"div",37)(300,"div",38)(301,"mat-checkbox",49,10),u("ngModelChange",function(t){return m(g),f(e.facade.settings.course.autoNextPointOnArrival,t)||(e.facade.settings.course.autoNextPointOnArrival=t),c(t)}),p("change",function(){return e.persistModel()}),s(303," Auto-advance to next point on arrival "),n()()(),i(304,"div",37)(305,"div",38)(306,"mat-form-field",39)(307,"mat-label"),s(308,"Notification type to use"),n(),i(309,"mat-select",84,11),u("ngModelChange",function(t){return m(g),f(e.facade.settings.course.autoNextPointTrigger,t)||(e.facade.settings.course.autoNextPointTrigger=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(311,ti,2,2,"mat-option",41,b),n()()(),i(313,"div",38)(314,"mat-form-field",39)(315,"mat-label"),s(316,"Time to wait before advancing"),n(),i(317,"mat-select",85),u("ngModelChange",function(t){return m(g),f(e.facade.settings.course.autoNextPointDelay,t)||(e.facade.settings.course.autoNextPointDelay=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(318,ii,2,2,"mat-option",41,v),n()()()()()()()()()(),i(320,"mat-tab",86)(321,"div",32)(322,"div",33)(323,"div",87)(324,"div",35),s(325,"VESSEL"),n(),i(326,"mat-card",36)(327,"mat-card-content")(328,"div",37)(329,"div",38)(330,"fieldset")(331,"legend"),s(332,"Vessel Icon Size"),n(),i(333,"div",37)(334,"div",38)(335,"mat-radio-group",88),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.iconScale,t)||(e.facade.settings.vessels.iconScale=t),c(t)}),p("change",function(){return e.persistModel()}),y(336,ni,3,4,"mat-radio-button",41,v),n()()()()()(),i(338,"div",38)(339,"fieldset")(340,"legend")(341,"mat-checkbox",89,12),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.fixedLocationMode,t)||(e.facade.settings.vessels.fixedLocationMode=t),c(t)}),p("change",function(){return e.persistModel()}),s(343," Fixed Location Mode "),n()(),i(344,"div",37)(345,"div",38)(346,"mat-form-field",68)(347,"mat-label"),s(348,"Latitude"),n(),i(349,"input",90,13),u("ngModelChange",function(t){return m(g),f(e.facade.fixedPosition[1],t)||(e.facade.fixedPosition[1]=t),c(t)}),p("change",function(){m(g);let t=M(350);return c(e.parseNumber(t,!0))}),n(),T(351,ai,2,0,"mat-error"),n(),i(352,"mat-form-field",68)(353,"mat-label"),s(354,"Longitude"),n(),i(355,"input",91,14),u("ngModelChange",function(t){return m(g),f(e.facade.fixedPosition[0],t)||(e.facade.fixedPosition[0]=t),c(t)}),p("change",function(){m(g);let t=M(356);return c(e.parseNumber(t,!0))}),n(),T(357,oi,2,0,"mat-error"),n()()()()()()(),E(358,"br"),i(359,"mat-card",36)(360,"mat-card-content")(361,"div",38)(362,"fieldset")(363,"legend"),s(364,"Vessel Lines:"),n(),i(365,"div",37)(366,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.windVectors,t)||(e.facade.settings.vessels.windVectors=t),c(t)}),p("change",function(){return e.persistModel()}),s(367," Display Wind Vectors "),n(),i(368,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.laylines,t)||(e.facade.settings.vessels.laylines=t),c(t)}),p("change",function(){return e.persistModel()}),s(369," Display Laylines "),n()(),i(370,"div",37)(371,"div",38)(372,"fieldset")(373,"legend"),s(374,"Heading Line"),n(),i(375,"div",37)(376,"div",38)(377,"mat-form-field")(378,"mat-label"),s(379,"Heading Line Length"),n(),i(380,"mat-select",92),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.selfLines.heading.length,t)||(e.facade.settings.vessels.selfLines.heading.length=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(381,ri,2,2,"mat-option",41,v),n()()(),i(383,"div",38)(384,"linestyle-select",93),p("selectionChange",function(t){return e.onLineStyle("heading",t)}),n()()()()()(),i(385,"div",37)(386,"div",38)(387,"fieldset")(388,"legend"),s(389,"COG Line"),n(),i(390,"div",37)(391,"div",38)(392,"mat-form-field")(393,"mat-label"),s(394,"COG Line Length"),n(),i(395,"mat-select",94),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.selfLines.cog.length,t)||(e.facade.settings.vessels.selfLines.cog.length=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(396,si,2,2,"mat-option",41,v),n()()(),i(398,"div",38)(399,"linestyle-select",93),p("selectionChange",function(t){return e.onLineStyle("cog",t)}),n()()()()()()()(),i(400,"div",38)(401,"fieldset")(402,"legend")(403,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.rangeCircles,t)||(e.facade.settings.vessels.rangeCircles=t),c(t)}),p("change",function(){return e.persistModel()}),s(404," Display Range Circles "),n()(),i(405,"div",37)(406,"div",38)(407,"mat-form-field",39)(408,"mat-label"),s(409,"Number of Range Circles"),n(),i(410,"mat-select",95),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.rangeCircleCount,t)||(e.facade.settings.vessels.rangeCircleCount=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(411,li,2,2,"mat-option",41,b),n()()(),i(413,"div",38)(414,"mat-form-field",39)(415,"mat-label"),s(416,"Minimum Zoom Level"),n(),i(417,"mat-select",95),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.rangeCircleMinZoom,t)||(e.facade.settings.vessels.rangeCircleMinZoom=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(418,di,2,2,"mat-option",41,b),n()()()(),i(420,"div",37)(421,"div",38)(422,"mat-checkbox",96),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.rangeCirclesFixed,t)||(e.facade.settings.vessels.rangeCirclesFixed=t),c(t)}),p("change",function(){return e.persistModel()}),s(423," Use Fixed Distance "),n()(),i(424,"div",38)(425,"mat-form-field",68)(426,"mat-label"),s(427),n(),i(428,"input",97,15),u("ngModelChange",function(t){return m(g),f(e.formattedNumberModel.rangeCirclesDistance,t)||(e.formattedNumberModel.rangeCirclesDistance=t),c(t)}),p("change",function(){m(g);let t=M(429);return c(e.parseFormattedNumber(t))}),n(),T(430,gi,2,0,"mat-error"),n()()()()()()(),E(431,"br"),i(432,"mat-card",36)(433,"mat-card-content")(434,"div",37)(435,"fieldset")(436,"legend")(437,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.trail,t)||(e.facade.settings.vessels.trail=t),c(t)}),p("change",function(){return e.persistModel("vesselTrail")}),s(438," Display Vessel Track "),n()(),i(439,"div",37)(440,"div",38)(441,"mat-checkbox",98),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.trailFromServer,t)||(e.facade.settings.vessels.trailFromServer=t),c(t)}),p("change",function(){return e.persistModel("trailFromServer")}),s(442," Get Track from server "),n(),s(443," \xA0\xA0 "),i(444,"mat-slider",99)(445,"input",100),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.trailDuration,t)||(e.facade.settings.vessels.trailDuration=t),c(t)}),p("valueChange",function(){return e.deferPersist()}),n()(),s(446),n()(),i(447,"div",37)(448,"div",38)(449,"mat-form-field",39)(450,"mat-label"),s(451,"Resolution: Last hour"),n(),i(452,"mat-select",95),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.trailResolution.lastHour,t)||(e.facade.settings.vessels.trailResolution.lastHour=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(453,mi,2,2,"mat-option",41,v),n()()(),i(455,"div",38)(456,"mat-form-field",39)(457,"mat-label"),s(458,"Resolution: 1 hr -> 24 hrs"),n(),i(459,"mat-select",95),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.trailResolution.next23,t)||(e.facade.settings.vessels.trailResolution.next23=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(460,ci,2,2,"mat-option",41,v),n()()(),i(462,"div",38)(463,"mat-form-field",39)(464,"mat-label"),s(465,"Resolution: > 24 hrs"),n(),i(466,"mat-select",95),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.trailResolution.beyond24,t)||(e.facade.settings.vessels.trailResolution.beyond24=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(467,pi,2,2,"mat-option",41,v),n()()()()()()()(),i(469,"div",35),s(470,"OTHER VESSELS"),n(),i(471,"mat-card",36)(472,"mat-card-content")(473,"div",37)(474,"div",38)(475,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.aisShowTrack,t)||(e.facade.settings.vessels.aisShowTrack=t),c(t)}),p("change",function(){return e.persistModel()}),s(476," Show Track "),n(),s(477," \xA0 "),i(478,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.aisStateFilter.moored,t)||(e.aisStateFilter.moored=t),c(t)}),p("change",function(){return e.onAisStateFilter()}),s(479," Hide Moored "),n(),s(480," \xA0 "),i(481,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.aisStateFilter.anchored,t)||(e.aisStateFilter.anchored=t),c(t)}),p("change",function(){return e.onAisStateFilter()}),s(482," Hide Anchored "),n()()(),i(483,"div",37)(484,"div",38)(485,"mat-form-field",39)(486,"mat-label"),s(487,"Mark AIS target inactive after"),n(),i(488,"mat-select",65),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.aisStaleAge,t)||(e.facade.settings.vessels.aisStaleAge=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(489,_i,2,2,"mat-option",41,v),n()()(),i(491,"div",38)(492,"mat-form-field",39)(493,"mat-label"),s(494,"Remove AIS target after"),n(),i(495,"mat-select",65),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.aisMaxAge,t)||(e.facade.settings.vessels.aisMaxAge=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(496,fi,2,2,"mat-option",41,v),n()()(),i(498,"div",38)(499,"mat-form-field",39)(500,"mat-label"),s(501,"Wind Vector Value"),n(),i(502,"mat-select",65),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.aisWindApparent,t)||(e.facade.settings.vessels.aisWindApparent=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(503,ui,2,2,"mat-option",41,v),n()()(),i(505,"div",38)(506,"mat-form-field",39)(507,"mat-label"),s(508,"Wind / Track Zoom Level"),n(),i(509,"mat-select",65),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.aisWindMinZoom,t)||(e.facade.settings.vessels.aisWindMinZoom=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(510,hi,2,2,"mat-option",41,b),n()()(),i(512,"div",38)(513,"mat-form-field",39)(514,"mat-label"),s(515,"COG Line"),n(),i(516,"mat-select",65),u("ngModelChange",function(t){return m(g),f(e.facade.settings.vessels.aisCogLine,t)||(e.facade.settings.vessels.aisCogLine=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(517,yi,2,2,"mat-option",41,v),n()()()()()()()()()(),i(519,"mat-tab",101)(520,"div",32)(521,"div",33)(522,"div",102)(523,"div",35),s(524,"NOTES"),n(),i(525,"mat-card",36)(526,"mat-card-content")(527,"div",47)(528,"div",38)(529,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.facade.settings.ui.showNotes,t)||(e.facade.settings.ui.showNotes=t),c(t)}),p("change",function(){return e.persistModel()}),s(530," Display Notes on Map "),n()(),i(531,"div",38)(532,"mat-form-field",39)(533,"mat-label"),s(534,"Notes Zoom Level"),n(),i(535,"mat-select",103),u("valueChange",function(t){return m(g),f(e.facade.settings.resources.notes.minZoom,t)||(e.facade.settings.resources.notes.minZoom=t),c(t)}),p("selectionChange",function(){return e.persistModel("fetchNotes")}),y(536,Si,2,2,"mat-option",41,b),n()()()(),i(538,"div",47)(539,"div",38)(540,"mat-form-field",39)(541,"mat-label"),s(542),n(),i(543,"mat-select",60),u("ngModelChange",function(t){return m(g),f(e.facade.settings.resources.notes.getRadius,t)||(e.facade.settings.resources.notes.getRadius=t),c(t)}),p("selectionChange",function(){return e.persistModel("fetchNotes")}),y(544,Ci,2,2,"mat-option",41,b),n()()()(),i(546,"div",47)(547,"div",38)(548,"mat-form-field",53)(549,"mat-label"),s(550,"Notes fetch filter:"),n(),i(551,"input",104,16),u("ngModelChange",function(t){return m(g),f(e.facade.settings.resources.notes.rootFilter,t)||(e.facade.settings.resources.notes.rootFilter=t),c(t)}),p("change",function(){return e.persistModel("fetchNotes")}),n(),T(553,Mi,3,0,"button",105),n()()(),i(554,"div",47)(555,"div",38)(556,"mat-checkbox",106),u("ngModelChange",function(t){return m(g),f(e.facade.settings.resources.notes.groupNameEdit,t)||(e.facade.settings.resources.notes.groupNameEdit=t),c(t)}),p("change",function(){return e.persistModel()}),s(557," Edit Group Names "),n()(),i(558,"div",38)(559,"mat-checkbox",107),u("ngModelChange",function(t){return m(g),f(e.facade.settings.resources.notes.groupRequiresPosition,t)||(e.facade.settings.resources.notes.groupRequiresPosition=t),c(t)}),p("change",function(){return e.persistModel()}),s(560," Position Group Note "),n()()()()()(),i(561,"div",108)(562,"div",35),s(563,"CUSTOM RESOURCES"),n(),i(564,"mat-card",36)(565,"mat-card-content")(566,"div",47)(567,"div",38)(568,"div",109),s(569," Select custom resource types (./resources/<name>) "),n(),i(570,"mat-selection-list",110,17),p("selectionChange",function(){m(g);let t=M(571);return c(e.onResPathSelected(t))}),y(572,wi,2,3,"mat-list-option",111,b),n()()()()()()()()(),T(574,bi,21,2,"mat-tab",112),i(575,"mat-tab",113)(576,"div",32)(577,"div",33)(578,"div",114)(579,"div",35),s(580,"SIGNAL K: CONNECTION"),n(),i(581,"mat-card",36)(582,"mat-card-content")(583,"div",47)(584,"fieldset")(585,"legend"),s(586,"Filter Stream data:"),n(),i(587,"span",115),s(588," Check to include Signal K schema groups on display."),E(589,"br"),i(590,"i"),s(591,"Use to manage display performance."),n()(),i(592,"div",38)(593,"mat-checkbox",116),u("ngModelChange",function(t){return m(g),f(e.facade.settings.signalk.vessels,t)||(e.facade.settings.signalk.vessels=t),c(t)}),p("change",function(){return e.persistModel()}),s(594," Vessels (other than Self) "),n()(),i(595,"div",38)(596,"mat-checkbox",117),u("ngModelChange",function(t){return m(g),f(e.facade.settings.signalk.atons,t)||(e.facade.settings.signalk.atons=t),c(t)}),p("change",function(){return e.persistModel()}),s(597," Aids to Navigation (AtoN) "),n()(),i(598,"div",38)(599,"mat-checkbox",118),u("ngModelChange",function(t){return m(g),f(e.facade.settings.signalk.aircraft,t)||(e.facade.settings.signalk.aircraft=t),c(t)}),p("change",function(){return e.persistModel()}),s(600," Aircraft "),n()(),i(601,"div",38)(602,"mat-checkbox",119),u("ngModelChange",function(t){return m(g),f(e.facade.settings.signalk.sar,t)||(e.facade.settings.signalk.sar=t),c(t)}),p("change",function(){return e.persistModel()}),s(603," Search and Rescue (SaR) "),n()(),i(604,"div",38)(605,"mat-checkbox",120),u("ngModelChange",function(t){return m(g),f(e.facade.settings.signalk.meteo,t)||(e.facade.settings.signalk.meteo=t),c(t)}),p("change",function(){return e.persistModel()}),s(606," Weather (Meteo) "),n()(),i(607,"div",38),E(608,"br"),i(609,"mat-form-field",39)(610,"mat-label"),s(611,"Max. distance from vessel"),n(),i(612,"mat-select",121,18),u("ngModelChange",function(t){return m(g),f(e.facade.settings.signalk.maxRadius,t)||(e.facade.settings.signalk.maxRadius=t),c(t)}),p("selectionChange",function(){return e.persistModel()}),y(614,Ti,2,2,"mat-option",41,v),n()()()()(),i(616,"div",47)(617,"div",38)(618,"button",122),p("click",function(){return e.clearAuthToken()}),i(619,"mat-icon"),s(620,"key_off"),n()()()()()()()()()(),i(621,"mat-tab",123)(622,"div",32)(623,"div",33)(624,"div",124)(625,"div",35),s(626,"EXPERIMENTS"),n(),i(627,"mat-card",36)(628,"mat-card-content")(629,"div",47)(630,"div",38)(631,"mat-checkbox",49),u("ngModelChange",function(t){return m(g),f(e.facade.settings.resources.video.enable,t)||(e.facade.settings.resources.video.enable=t),c(t)}),p("change",function(){return e.persistModel()}),s(632," Enable Video "),n()(),i(633,"div",38)(634,"mat-form-field",53)(635,"mat-label"),s(636,"url:"),n(),i(637,"input",125,19),u("ngModelChange",function(t){return m(g),f(e.facade.settings.resources.video.url,t)||(e.facade.settings.resources.video.url=t),c(t)}),p("change",function(){return e.persistModel("videoUrl")}),n(),T(639,Di,2,0,"mat-error"),n()()(),i(640,"div",47)(641,"div",38)(642,"mat-checkbox",126,20),u("ngModelChange",function(t){return m(g),f(e.facade.settings.experiments,t)||(e.facade.settings.experiments=t),c(t)}),p("change",function(){return e.persistModel()}),i(644,"mat-icon"),s(645,"science"),n(),s(646," Experimental Features "),n()()()()()()()()()()()}if(a&2){let g=M(86),o=M(93),t=M(129),ne=M(252),ae=M(261),oe=M(270),re=M(295),ge=M(302),me=M(342),se=M(350),le=M(356),de=M(429),mt=M(552),ct=M(638);r(25),_("ngModel",e.facade.settings.display.darkMode.source),r(),S(e.options.darkMode),r(3),_("ngModel",e.facade.settings.display.nightMode),r(6),_("ngModel",e.facade.settings.display.fab),r(),S(e.options.buttons.fab),r(3),h("disabled",!e.wakeLock.isAvailable),_("ngModel",e.facade.settings.display.disableWakelock),r(3),_("ngModel",e.facade.settings.display.preferInfoPanel),r(3),_("ngModel",e.facade.settings.display.singleClickNoteDetails),r(5),D(e.facade.applicationList.length>1?50:-1),r(),D(e.show.favourites()?51:-1),r(9),_("ngModel",e.facade.settings.display.muteSound),r(3),_("ngModel",e.facade.settings.display.depthAlarm.enabled),r(6),_("ngModel",e.facade.settings.display.depthAlarm.smoothing),h("disabled",!e.facade.settings.display.depthAlarm.enabled),r(),S(e.options.alarm.smoothing),r(9),_("ngModel",e.facade.settings.display.statusBar.liveEta),r(5),k("Reference Boat Speed (",e.speedUnitSymbol,")"),r(),h("disabled",!e.facade.settings.display.statusBar.liveEta),_("ngModel",e.facade.settings.display.statusBar.referenceSpeed),r(2),D(g.invalid&&(g.dirty||g.touched)?87:-1),r(5),h("disabled",!e.facade.settings.display.statusBar.liveEta),_("ngModel",e.facade.settings.display.statusBar.tapFadeSpeed),r(2),D(o.invalid&&(o.dirty||o.touched)?94:-1),r(11),_("ngModel",e.facade.settings.display.windIndicator),r(),S(e.options.windIndicator),r(14),h("disabled",!e.app.serverConfig.unitPreferences()),_("ngModel",e.facade.settings.units.useServerPrefs),r(8),h("disabled",e.facade.settings.units.useServerPrefs),_("ngModel",e.facade.settings.units.distance),r(2),S(e.options.availableUnits.distance),r(6),h("disabled",e.facade.settings.units.useServerPrefs),_("ngModel",e.facade.settings.units.depth),r(),S(e.options.availableUnits.depth),r(6),h("disabled",e.facade.settings.units.useServerPrefs),_("ngModel",e.facade.settings.units.length),r(),S(e.options.availableUnits.length),r(6),h("disabled",e.facade.settings.units.useServerPrefs),_("ngModel",e.facade.settings.units.temperature),r(),S(e.options.availableUnits.temperature),r(6),h("disabled",e.facade.settings.units.useServerPrefs),_("ngModel",e.facade.settings.units.speed),r(),S(e.options.availableUnits.speed),r(3),D(e.options.preferredValues.coords.length!==0?161:-1),r(),D(e.options.preferredValues.heading.length!==0?162:-1),r(18),_("ngModel",e.facade.settings.map.labelsMinZoom),r(),S(e.options.zoomLevels),r(9),h("min",-e.centerOffsetLimit)("max",e.centerOffsetLimit),_("ngModel",e.facade.settings.map.centerOffset.y),r(5),h("min",-e.centerOffsetLimit)("max",e.centerOffsetLimit),_("ngModel",e.facade.settings.map.centerOffset.x),r(3),_("ngModel",e.facade.settings.map.popoverMulti),r(3),_("ngModel",e.facade.settings.map.doubleClickZoom),r(3),_("ngModel",e.facade.settings.map.overZoomTiles),r(6),_("ngModel",e.facade.settings.map.panBehavior),r(),S(e.options.map.panBehavior),r(11),_("ngModel",e.facade.settings.map.s57Options.graphicsStyle),r(),S(e.options.map.s57.graphicsStyle),r(6),_("ngModel",e.facade.settings.map.s57Options.boundaries),r(),S(e.options.map.s57.boundaries),r(6),_("ngModel",e.facade.settings.map.s57Options.colorTable),r(),S(e.options.map.s57.colorTables),r(6),_("ngModel",e.facade.settings.map.s57Options.colors),r(),S(e.options.map.s57.colors),r(7),_("ngModel",e.facade.settings.map.s57Options.shallowDepth),r(2),D(ne.invalid&&(ne.dirty||ne.touched)?253:-1),r(7),_("ngModel",e.facade.settings.map.s57Options.safetyDepth),r(2),D(ae.invalid&&(ae.dirty||ae.touched)?262:-1),r(7),_("ngModel",e.facade.settings.map.s57Options.deepDepth),r(2),D(oe.invalid&&(oe.dirty||oe.touched)?271:-1),r(7),_("ngModel",e.facade.settings.map.s57Options.otherLayers),r(),S(e.options.map.s57.otherLayers),r(15),_("ngModel",e.facade.settings.course.arrivalCircle),r(2),D(re.invalid&&(re.dirty||re.touched)?296:-1),r(5),_("ngModel",e.facade.settings.course.autoNextPointOnArrival),r(8),h("disabled",ge.checked===!1),_("ngModel",e.facade.settings.course.autoNextPointTrigger),r(2),S(e.options.course.nextPointTrigger),r(6),h("disabled",ge.checked===!1),_("ngModel",e.facade.settings.course.autoNextPointDelay),r(),S(e.options.course.nextPointDelay),r(17),_("ngModel",e.facade.settings.vessels.iconScale),r(),S(e.options.vessel.selfIconScale),r(5),_("ngModel",e.facade.settings.vessels.fixedLocationMode),r(8),_("ngModel",e.facade.fixedPosition[1]),h("disabled",!me.checked),r(2),D(se.invalid&&(se.dirty||se.touched)?351:-1),r(4),_("ngModel",e.facade.fixedPosition[0]),h("disabled",!me.checked),r(2),D(le.invalid&&(le.dirty||le.touched)?357:-1),r(9),_("ngModel",e.facade.settings.vessels.windVectors),r(2),_("ngModel",e.facade.settings.vessels.laylines),r(12),_("ngModel",e.facade.settings.vessels.selfLines.heading.length),r(),S(e.options.vessel.headingLine),r(3),h("color",e.facade.settings.vessels.selfLines.heading.color)("dash",e.facade.settings.vessels.selfLines.heading.dash)("weight",e.facade.settings.vessels.selfLines.heading.weight),r(11),_("ngModel",e.facade.settings.vessels.selfLines.cog.length),r(),S(e.options.vessel.cogLine),r(3),h("color",e.facade.settings.vessels.selfLines.cog.color)("dash",e.facade.settings.vessels.selfLines.cog.dash)("weight",e.facade.settings.vessels.selfLines.cog.weight),r(4),_("ngModel",e.facade.settings.vessels.rangeCircles),r(7),_("ngModel",e.facade.settings.vessels.rangeCircleCount),h("disabled",!e.facade.settings.vessels.rangeCircles),r(),S(e.options.rangeCircles.count),r(6),_("ngModel",e.facade.settings.vessels.rangeCircleMinZoom),h("disabled",!e.facade.settings.vessels.rangeCircles),r(),S(e.options.rangeCircles.zoomLevels),r(4),_("ngModel",e.facade.settings.vessels.rangeCirclesFixed),h("disabled",!e.facade.settings.vessels.rangeCircles),r(5),k(" Distance between circles (",e.renderSymbol(e.facade.settings.units.distance),") "),r(),_("ngModel",e.formattedNumberModel.rangeCirclesDistance),h("disabled",!e.facade.settings.vessels.rangeCircles||!e.facade.settings.vessels.rangeCirclesFixed),r(2),D(de.invalid&&(de.dirty||de.touched)?430:-1),r(7),_("ngModel",e.facade.settings.vessels.trail),r(4),h("disabled",!e.facade.settings.vessels.trail),_("ngModel",e.facade.settings.vessels.trailFromServer),r(3),h("disabled",!e.facade.settings.vessels.trailFromServer||!e.facade.settings.vessels.trail),r(),_("ngModel",e.facade.settings.vessels.trailDuration),r(),k(" Length (",e.facade.settings.vessels.trailDuration," hrs) "),r(6),_("ngModel",e.facade.settings.vessels.trailResolution.lastHour),h("disabled",!e.facade.settings.vessels.trailFromServer||!e.facade.settings.vessels.trail),r(),S(e.options.trailIntervals.highResolution),r(6),_("ngModel",e.facade.settings.vessels.trailResolution.next23),h("disabled",!e.facade.settings.vessels.trailFromServer||!e.facade.settings.vessels.trail),r(),S(e.options.trailIntervals.highResolution),r(6),_("ngModel",e.facade.settings.vessels.trailResolution.beyond24),h("disabled",!e.facade.settings.vessels.trailFromServer||!e.facade.settings.vessels.trail),r(),S(e.options.trailIntervals.mediumResolution),r(8),_("ngModel",e.facade.settings.vessels.aisShowTrack),r(3),_("ngModel",e.aisStateFilter.moored),r(3),_("ngModel",e.aisStateFilter.anchored),r(7),_("ngModel",e.facade.settings.vessels.aisStaleAge),r(),S(e.options.vessel.aisTimeouts),r(6),_("ngModel",e.facade.settings.vessels.aisMaxAge),r(),S(e.options.vessel.aisTimeouts),r(6),_("ngModel",e.facade.settings.vessels.aisWindApparent),r(),S(e.options.preferredValues.wind),r(6),_("ngModel",e.facade.settings.vessels.aisWindMinZoom),r(),S(e.options.zoomLevels),r(6),_("ngModel",e.facade.settings.vessels.aisCogLine),r(),S(e.options.vessel.aisCogLine),r(12),_("ngModel",e.facade.settings.ui.showNotes),r(6),h("disabled",!e.facade.settings.ui.showNotes),_("value",e.facade.settings.resources.notes.minZoom),r(),S(e.options.zoomLevels),r(6),C("Fetch Notes radius: ("+e.options.availableUnits.distance.get(t.value)+")"),r(),h("disabled",!e.facade.settings.ui.showNotes),_("ngModel",e.facade.settings.resources.notes.getRadius),r(),S(e.options.resources.noteRadius),r(7),_("ngModel",e.facade.settings.resources.notes.rootFilter),r(2),D(mt.value?553:-1),r(3),_("ngModel",e.facade.settings.resources.notes.groupNameEdit),r(3),_("ngModel",e.facade.settings.resources.notes.groupRequiresPosition),r(13),S(e.facade.resourcePathList),r(2),D(e.app.featureFlags().radarApi?574:-1),r(19),_("ngModel",e.facade.settings.signalk.vessels),r(3),_("ngModel",e.facade.settings.signalk.atons),r(3),_("ngModel",e.facade.settings.signalk.aircraft),r(3),_("ngModel",e.facade.settings.signalk.sar),r(3),_("ngModel",e.facade.settings.signalk.meteo),r(7),_("ngModel",e.facade.settings.signalk.maxRadius),r(2),S(e.options.vessel.aisMaxRadius),r(17),_("ngModel",e.facade.settings.resources.video.enable),r(6),h("disabled",!e.facade.settings.resources.video.enable),_("ngModel",e.facade.settings.resources.video.url),r(2),D(ct.invalid?639:-1),r(3),_("ngModel",e.facade.settings.experiments)}},dependencies:[H,U,be,G,Ee,We,De,Te,Z,Ce,Se,Ne,Ae,ee,it,$,Fe,Be,Ie,Le,Pe,ke,Ve,N,we,Me,R,ve,K,Oe,ot,nt,at,Qe,Q,q,z,Re,Ue,J,Y,Ge,X,j,xe,Ke,He,tt,$e,et,ie,te],styles:["[_nghost-%COMP%] .mat-dialog-content{padding:0 4px}[_nghost-%COMP%] .mat-mdc-dialog-content{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;max-height:none;overflow:hidden}[_nghost-%COMP%] .mat-mdc-dialog-content .mat-mdc-tab-group, [_nghost-%COMP%] .mat-mdc-dialog-content .mat-mdc-tab-body-wrapper{flex:1 1 auto;min-height:0}.settings[_ngcontent-%COMP%] .setting-group-title[_ngcontent-%COMP%]{font-weight:700;font-size:10pt;font-family:Arial,Helvetica,sans-serif;padding:10px 0}.setting-card-row[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap}.settings[_ngcontent-%COMP%] .setting-card-row-item[_ngcontent-%COMP%]{padding-right:15px;flex:1 1 auto}.settings[_ngcontent-%COMP%] .setting-field-group-title[_ngcontent-%COMP%]{font-size:10pt;font-family:Arial,Helvetica,sans-serif;opacity:.7;line-height:1.4;min-height:1.4em;padding-bottom:2px}.settings[_ngcontent-%COMP%] .setting-field-group[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:10px}.settings[_ngcontent-%COMP%] .setting-field-group[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{flex:0 1 150px;min-width:80px}@media only screen and (max-width:599px){.settings[_ngcontent-%COMP%] .setting-group[_ngcontent-%COMP%]{padding:5px 5%}}@media only screen and (min-width:600px)and (max-width:959px),screen and (min-width:960px)and (max-width:1279px),screen and (min-width:1280px)and (max-width:1919px),screen and (min-width:1920px)and (max-width:5000px){.settings[_ngcontent-%COMP%] .setting-group[_ngcontent-%COMP%]{padding:5px 5%}}"]})};export{gt as SettingsDialog};
@@ -1 +1 @@
1
- import{Da as a}from"./chunk-544H55DG.js";import"./chunk-SYVLSUHP.js";import"./chunk-R7KV75Y6.js";import"./chunk-EJ5G7BX7.js";import"./chunk-66UI7RYU.js";import"./chunk-3QUJEXF6.js";import"./chunk-XB3A3UP3.js";import"./chunk-HYKTIWCS.js";import"./chunk-DSS236J5.js";import"./chunk-2BXQ52IR.js";import"./chunk-P5GLUSCN.js";import"./chunk-EQVTEUXC.js";export{a as Trail2RouteDialog};
1
+ import{Da as a}from"./chunk-MWGE4BLM.js";import"./chunk-SYVLSUHP.js";import"./chunk-R7KV75Y6.js";import"./chunk-EJ5G7BX7.js";import"./chunk-66UI7RYU.js";import"./chunk-3QUJEXF6.js";import"./chunk-XB3A3UP3.js";import"./chunk-HYKTIWCS.js";import"./chunk-DSS236J5.js";import"./chunk-2BXQ52IR.js";import"./chunk-P5GLUSCN.js";import"./chunk-EQVTEUXC.js";export{a as Trail2RouteDialog};
@@ -1 +1 @@
1
- import{va as z}from"./chunk-544H55DG.js";import"./chunk-SYVLSUHP.js";import"./chunk-R7KV75Y6.js";import"./chunk-EJ5G7BX7.js";import"./chunk-66UI7RYU.js";import"./chunk-3QUJEXF6.js";import"./chunk-XB3A3UP3.js";import"./chunk-HYKTIWCS.js";import"./chunk-DSS236J5.js";import"./chunk-2BXQ52IR.js";import{Dd as C,Ea as m,Ed as w,Fa as d,Gd as S,Hd as R,Id as E,Jd as O,Ka as _,La as a,Ma as o,Na as v,Q as f,R as u,Rd as T,Td as A,Ua as D,Wa as p,Wd as k,Ya as g,Yd as j,Zd as V,ab as b,bb as x,cb as y,ha as h,ja as s,kc as I,lb as r,mb as M,oa as c,ra as P}from"./chunk-P5GLUSCN.js";import"./chunk-EQVTEUXC.js";var U=["frame"];function Q(n,e){if(n&1&&(a(0,"mat-dialog-content",3),v(1,"iframe",6,0),o()),n&2){let t=g();s(),_("src",t.url,h)("title",t.data.panel.title)}}function B(n,e){n&1&&(a(0,"mat-dialog-content",4),r(1," This widget has no settings. "),o())}function F(n,e){if(n&1){let t=D();a(0,"mat-dialog-actions",5)(1,"button",7),p("click",function(){f(t);let l=g();return u(l.removeWidget())}),a(2,"mat-icon"),r(3,"delete"),o(),r(4," Remove widget "),o()()}}var W=class n{constructor(e,t,i,l){this.dialogRef=e;this.data=t;this.service=i;this.sanitizer=l}frame;url;detach=null;ngOnInit(){let e=this.data.panel;e&&(this.url=this.sanitizer.bypassSecurityTrustResourceUrl(e.url?this.service.resolveAssetUrl(e.url):"about:blank"))}ngAfterViewInit(){let e=this.data.panel;!e||!this.frame||(this.detach=this.service.attachPanel(this.frame.nativeElement,{extension:this.data.extension,panel:e,targetInstance:this.data.targetInstance,targetWidget:this.data.targetWidget,close:()=>this.dialogRef.close()}))}removeWidget(){this.data.targetInstance&&this.service.removeWidget(this.data.targetInstance),this.dialogRef.close()}ngOnDestroy(){this.detach?.(),this.detach=null}static \u0275fac=function(t){return new(t||n)(c(C),c(w),c(z),c(I))};static \u0275cmp=P({type:n,selectors:[["fb-plotterext-panel-dialog"]],viewQuery:function(t,i){if(t&1&&b(U,5),t&2){let l;x(l=y())&&(i.frame=l.first)}},decls:9,vars:3,consts:[["frame",""],["mat-dialog-title","",1,"pe-panel-header"],["mat-icon-button","","aria-label","Close",3,"click"],[1,"pe-panel-content"],[1,"pe-panel-noconfig"],[1,"pe-panel-actions"],["sandbox","allow-scripts allow-same-origin allow-forms",3,"src","title"],["mat-button","",1,"pe-remove",3,"click"]],template:function(t,i){t&1&&(a(0,"div",1)(1,"span"),r(2),o(),a(3,"button",2),p("click",function(){return i.dialogRef.close()}),a(4,"mat-icon"),r(5,"close"),o()()(),m(6,Q,3,2,"mat-dialog-content",3)(7,B,2,0,"mat-dialog-content",4),m(8,F,5,0,"mat-dialog-actions",5)),t&2&&(s(2),M(i.data.panel?i.data.panel.title:i.data.title),s(4),d(i.data.panel?6:7),s(2),d(i.data.targetInstance?8:-1))},dependencies:[O,S,E,R,k,A,T,V,j],styles:[".pe-panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding-right:8px}.pe-panel-content[_ngcontent-%COMP%]{padding:0;height:60vh}.pe-panel-noconfig[_ngcontent-%COMP%]{padding:16px 24px;color:#0009}iframe[_ngcontent-%COMP%]{display:block;width:100%;height:100%;border:none}.pe-panel-actions[_ngcontent-%COMP%]{justify-content:flex-start}.pe-remove[_ngcontent-%COMP%]{color:#d32f2f}"]})};export{W as PlotterPanelDialog};
1
+ import{va as z}from"./chunk-MWGE4BLM.js";import"./chunk-SYVLSUHP.js";import"./chunk-R7KV75Y6.js";import"./chunk-EJ5G7BX7.js";import"./chunk-66UI7RYU.js";import"./chunk-3QUJEXF6.js";import"./chunk-XB3A3UP3.js";import"./chunk-HYKTIWCS.js";import"./chunk-DSS236J5.js";import"./chunk-2BXQ52IR.js";import{Dd as C,Ea as m,Ed as w,Fa as d,Gd as S,Hd as R,Id as E,Jd as O,Ka as _,La as a,Ma as o,Na as v,Q as f,R as u,Rd as T,Td as A,Ua as D,Wa as p,Wd as k,Ya as g,Yd as j,Zd as V,ab as b,bb as x,cb as y,ha as h,ja as s,kc as I,lb as r,mb as M,oa as c,ra as P}from"./chunk-P5GLUSCN.js";import"./chunk-EQVTEUXC.js";var U=["frame"];function Q(n,e){if(n&1&&(a(0,"mat-dialog-content",3),v(1,"iframe",6,0),o()),n&2){let t=g();s(),_("src",t.url,h)("title",t.data.panel.title)}}function B(n,e){n&1&&(a(0,"mat-dialog-content",4),r(1," This widget has no settings. "),o())}function F(n,e){if(n&1){let t=D();a(0,"mat-dialog-actions",5)(1,"button",7),p("click",function(){f(t);let l=g();return u(l.removeWidget())}),a(2,"mat-icon"),r(3,"delete"),o(),r(4," Remove widget "),o()()}}var W=class n{constructor(e,t,i,l){this.dialogRef=e;this.data=t;this.service=i;this.sanitizer=l}frame;url;detach=null;ngOnInit(){let e=this.data.panel;e&&(this.url=this.sanitizer.bypassSecurityTrustResourceUrl(e.url?this.service.resolveAssetUrl(e.url):"about:blank"))}ngAfterViewInit(){let e=this.data.panel;!e||!this.frame||(this.detach=this.service.attachPanel(this.frame.nativeElement,{extension:this.data.extension,panel:e,targetInstance:this.data.targetInstance,targetWidget:this.data.targetWidget,close:()=>this.dialogRef.close()}))}removeWidget(){this.data.targetInstance&&this.service.removeWidget(this.data.targetInstance),this.dialogRef.close()}ngOnDestroy(){this.detach?.(),this.detach=null}static \u0275fac=function(t){return new(t||n)(c(C),c(w),c(z),c(I))};static \u0275cmp=P({type:n,selectors:[["fb-plotterext-panel-dialog"]],viewQuery:function(t,i){if(t&1&&b(U,5),t&2){let l;x(l=y())&&(i.frame=l.first)}},decls:9,vars:3,consts:[["frame",""],["mat-dialog-title","",1,"pe-panel-header"],["mat-icon-button","","aria-label","Close",3,"click"],[1,"pe-panel-content"],[1,"pe-panel-noconfig"],[1,"pe-panel-actions"],["sandbox","allow-scripts allow-same-origin allow-forms",3,"src","title"],["mat-button","",1,"pe-remove",3,"click"]],template:function(t,i){t&1&&(a(0,"div",1)(1,"span"),r(2),o(),a(3,"button",2),p("click",function(){return i.dialogRef.close()}),a(4,"mat-icon"),r(5,"close"),o()()(),m(6,Q,3,2,"mat-dialog-content",3)(7,B,2,0,"mat-dialog-content",4),m(8,F,5,0,"mat-dialog-actions",5)),t&2&&(s(2),M(i.data.panel?i.data.panel.title:i.data.title),s(4),d(i.data.panel?6:7),s(2),d(i.data.targetInstance?8:-1))},dependencies:[O,S,E,R,k,A,T,V,j],styles:[".pe-panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding-right:8px}.pe-panel-content[_ngcontent-%COMP%]{padding:0;height:60vh}.pe-panel-noconfig[_ngcontent-%COMP%]{padding:16px 24px;color:#0009}iframe[_ngcontent-%COMP%]{display:block;width:100%;height:100%;border:none}.pe-panel-actions[_ngcontent-%COMP%]{justify-content:flex-start}.pe-remove[_ngcontent-%COMP%]{color:#d32f2f}"]})};export{W as PlotterPanelDialog};