diff options
Diffstat (limited to 'web')
22 files changed, 1056 insertions, 196 deletions
diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js index caef01886..096a5824e 100644 --- a/web/cobrands/fixmystreet/assets.js +++ b/web/cobrands/fixmystreet/assets.js @@ -27,8 +27,15 @@ OpenLayers.Layer.VectorAsset = OpenLayers.Class(OpenLayers.Layer.Vector, { relevant: function() { var category = $('select#form_category').val(), - layer = this.fixmystreet; - return OpenLayers.Util.indexOf(layer.asset_category, category) != -1 && + group = $('select#category_group').val(), + layer = this.fixmystreet, + relevant; + if (layer.asset_group) { + relevant = (layer.asset_group === group); + } else { + relevant = (OpenLayers.Util.indexOf(layer.asset_category, category) != -1); + } + return relevant && ( !layer.body || OpenLayers.Util.indexOf(fixmystreet.bodies, layer.body) != -1 ); }, @@ -77,10 +84,10 @@ OpenLayers.Layer.VectorAsset = OpenLayers.Class(OpenLayers.Layer.Vector, { }, get_select_control: function() { - var controls = fixmystreet.map.getControlsByClass('OpenLayers.Control.SelectFeature'); - for (var i=0; i<controls.length; i++) { + var controls = this.controls || []; + for (var i = 0; i < controls.length; i++) { var control = controls[i]; - if (control.layer == this && !control.hover) { + if (!control.hover) { return control; } } @@ -253,7 +260,7 @@ var fault_popup = null; function init_asset_layer(layer, pins_layer) { layer.update_layer_visibility(); fixmystreet.map.addLayer(layer); - if (layer.fixmystreet.asset_category) { + if (layer.fixmystreet.asset_category || layer.fixmystreet.asset_group) { fixmystreet.map.events.register( 'zoomend', layer, check_zoom_message_visibility); } @@ -370,7 +377,8 @@ function check_zoom_message_visibility() { if (this.fixmystreet.non_interactive) { return; } - var category = $("select#form_category").val(), + var select = this.fixmystreet.asset_group ? 'category_group' : 'form_category'; + var category = $("select#" + select).val() || '', prefix = category.replace(/[^a-z]/gi, ''), id = "category_meta_message_" + prefix, $p = $('#' + id); @@ -390,6 +398,11 @@ function check_zoom_message_visibility() { $p.html('Zoom in to pick a ' + this.fixmystreet.asset_item + ' from the map'); } + } else if (this.fixmystreet.asset_group) { + prefix = this.fixmystreet.asset_group.replace(/[^a-z]/gi, ''); + id = "category_meta_message_" + prefix; + $p = $('#' + id); + $p.remove(); } else { $.each(this.fixmystreet.asset_category, function(i, c) { var prefix = c.replace(/[^a-z]/gi, ''), @@ -407,7 +420,20 @@ function layer_visibilitychanged() { } return; } else if (!this.getVisibility()) { - this.asset_not_found(); + asset_unselected.call(this); + this.asset_not_found(); // as trigger won't call on non-visible layers + } + + var controls = this.controls || []; + var j; + if (this.getVisibility()) { + for (j = 0; j < controls.length; j++) { + controls[j].activate(); + } + } else { + for (j = 0; j < controls.length; j++) { + controls[j].deactivate(); + } } check_zoom_message_visibility.call(this); @@ -480,6 +506,231 @@ function get_fault_stylemap() { }); } +function construct_protocol_options(options) { + var protocol_options; + if (options.http_options !== undefined) { + protocol_options = options.http_options; + OpenLayers.Util.applyDefaults(options, { + format_class: OpenLayers.Format.GML, + format_options: {} + }); + if (options.geometryName) { + options.format_options.geometryName = options.geometryName; + } + protocol_options.format = new options.format_class(options.format_options); + } else { + protocol_options = { + version: "1.1.0", + url: options.wfs_url, + featureType: options.wfs_feature, + geometryName: options.geometryName + }; + if (options.srsName !== undefined) { + protocol_options.srsName = options.srsName; + } else if (fixmystreet.wmts_config) { + protocol_options.srsName = fixmystreet.wmts_config.map_projection; + } + if (options.propertyNames) { + protocol_options.propertyNames = options.propertyNames; + } + } + return protocol_options; +} + +function construct_protocol_class(options) { + if (options.http_options !== undefined) { + return options.protocol_class || OpenLayers.Protocol.HTTP; + } else { + return OpenLayers.Protocol.WFS; + } +} + +function construct_layer_options(options, protocol) { + var StrategyClass = options.strategy_class || OpenLayers.Strategy.BBOX; + + var max_resolution = options.max_resolution; + if (typeof max_resolution === 'object') { + max_resolution = max_resolution[fixmystreet.cobrand]; + } + + var layer_options = { + fixmystreet: options, + strategies: [new StrategyClass()], + protocol: protocol, + visibility: false, + maxResolution: max_resolution, + minResolution: options.min_resolution, + styleMap: options.stylemap || get_asset_stylemap(), + assets: true + }; + if (options.attribution !== undefined) { + layer_options.attribution = options.attribution; + } + if (options.srsName !== undefined) { + layer_options.projection = new OpenLayers.Projection(options.srsName); + } else if (fixmystreet.wmts_config) { + layer_options.projection = new OpenLayers.Projection(fixmystreet.wmts_config.map_projection); + } + + if (options.filter_key) { + // Add this filter to the layer, so it can potentially be used + // in the request (though only Bristol currently does this). + if (OpenLayers.Util.isArray(options.filter_value)) { + layer_options.filter = new OpenLayers.Filter.Logical({ + type: OpenLayers.Filter.Logical.OR, + filters: $.map(options.filter_value, function(value) { + return new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.EQUAL_TO, + property: options.filter_key, + value: value + }); + }) + }); + } else if (typeof options.filter_value === 'function') { + layer_options.filter = new OpenLayers.Filter.FeatureId({ + type: OpenLayers.Filter.Function, + evaluate: options.filter_value + }); + } else { + layer_options.filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.EQUAL_TO, + property: options.filter_key, + value: options.filter_value + }); + } + // Add a strategy filter to the layer, to filter the incoming results + // after they are received. Bristol does not need this, but has to ask + // for the filter data in its response so it doesn't then disappear. + layer_options.strategies.push(new OpenLayers.Strategy.Filter({filter: layer_options.filter})); + } + + return layer_options; +} + +function construct_layer_class(options) { + var layer_class = options.class || OpenLayers.Layer.VectorAsset; + if (options.usrn || options.road) { + layer_class = OpenLayers.Layer.VectorNearest; + } + return layer_class; +} + +function construct_fault_layer(options, protocol_options, layer_options) { + if (!options.wfs_fault_feature) { + return null; + } + + // A non-interactive layer to display existing asset faults + var po = { + featureType: options.wfs_fault_feature + }; + OpenLayers.Util.applyDefaults(po, protocol_options); + var fault_protocol = new OpenLayers.Protocol.WFS(po); + var lo = { + strategies: [new OpenLayers.Strategy.BBOX()], + protocol: fault_protocol, + styleMap: get_fault_stylemap(), + assets: true + }; + OpenLayers.Util.applyDefaults(lo, layer_options); + asset_fault_layer = new OpenLayers.Layer.Vector("WFS", lo); + asset_fault_layer.events.register( 'loadstart', null, fixmystreet.maps.loading_spinner.show); + asset_fault_layer.events.register( 'loadend', null, fixmystreet.maps.loading_spinner.hide); + return asset_fault_layer; +} + +function construct_asset_layer(options) { + // An interactive layer for selecting an asset (e.g. street light) + var protocol_options = construct_protocol_options(options); + var protocol_class = construct_protocol_class(options); + var protocol = new protocol_class(protocol_options); + + var layer_options = construct_layer_options(options, protocol); + var layer_class = construct_layer_class(options); + var asset_layer = new layer_class(options.name || "WFS", layer_options); + + var asset_fault_layer = construct_fault_layer(options, protocol_options, layer_options); + if (asset_fault_layer) { + asset_layer.fixmystreet.fault_layer = asset_fault_layer; + } + + return asset_layer; +} + +function construct_select_layer_events(asset_layer, options) { + asset_layer.events.register( 'featureselected', asset_layer, asset_selected); + asset_layer.events.register( 'featureunselected', asset_layer, asset_unselected); + + // When panning/zooming the map check that this layer is still correctly shown + // and any selected marker is preserved + asset_layer.events.register( 'loadend', asset_layer, layer_loadend); + + if (options.disable_pin_snapping) { + // The pin is snapped to the centre of a feature by the select + // handler. We can stop this handler from running, and the pin + // being snapped, by returning false from a beforefeatureselected + // event handler. This handler does need to make sure the + // attributes of the clicked feature are applied to the extra + // details form fields first though. + asset_layer.events.register( 'beforefeatureselected', asset_layer, function(e) { + var attributes = this.fixmystreet.attributes; + if (attributes) { + set_fields_from_attributes(attributes, e.feature); + } + + // The next click on the map may not be on an asset - so + // clear the fields for this layer when the pin is next + // updated. If it is on an asset then the fields will be + // set by whatever feature was selected. + $(fixmystreet).one('maps:update_pin', function() { + if (attributes) { + clear_fields_for_attributes(attributes); + } + }); + return false; + }); + } +} + +// Set up handler for selecting/unselecting markers +function construct_select_feature_control(asset_layers, options) { + if (options.non_interactive) { + return; + } + + $.each(asset_layers, function(i, layer) { + construct_select_layer_events(layer, options); + }); + + return new OpenLayers.Control.SelectFeature(asset_layers); +} + +function construct_hover_feature_control(asset_layers, options) { + // Even if an asset layer is marked as non-interactive it can still have + // a hover style which we'll need to set up. + if (options.non_interactive && !(options.stylemap && options.stylemap.styles.hover)) { + return; + } + + // Set up handlers for simply hovering over an asset marker + var hover_feature_control = new OpenLayers.Control.SelectFeature( + asset_layers, + { + hover: true, + highlightOnly: true, + renderIntent: 'hover' + } + ); + hover_feature_control.events.register('beforefeaturehighlighted', null, function(e) { + // Don't let marker go from selected->hover state, + // as it causes some mad flickering effect. + if (e.feature.renderIntent == 'select') { + return false; + } + }); + return hover_feature_control; +} + // fixmystreet.pin_prefix isn't always available here, due // to file loading order, so get it from the DOM directly. var map_data = document.getElementById('js-map-data'); @@ -531,186 +782,18 @@ fixmystreet.assets = { } options = $.extend(true, {}, default_options, options); + var asset_layer = this.add_layer(options); + this.add_controls([asset_layer], options); + }, - var asset_fault_layer = null; - - // An interactive layer for selecting an asset (e.g. street light) - var protocol_options; - var protocol; - if (options.http_options !== undefined) { - protocol_options = options.http_options; - OpenLayers.Util.applyDefaults(options, { - format_class: OpenLayers.Format.GML, - format_options: {} - }); - if (options.geometryName) { - options.format_options.geometryName = options.geometryName; - } - protocol_options.format = new options.format_class(options.format_options); - var protocol_class = options.protocol_class || OpenLayers.Protocol.HTTP; - protocol = new protocol_class(protocol_options); - } else { - protocol_options = { - version: "1.1.0", - url: options.wfs_url, - featureType: options.wfs_feature, - geometryName: options.geometryName - }; - if (options.srsName !== undefined) { - protocol_options.srsName = options.srsName; - } else if (fixmystreet.wmts_config) { - protocol_options.srsName = fixmystreet.wmts_config.map_projection; - } - if (options.propertyNames) { - protocol_options.propertyNames = options.propertyNames; - } - protocol = new OpenLayers.Protocol.WFS(protocol_options); - } - var StrategyClass = options.strategy_class || OpenLayers.Strategy.BBOX; - + add_layer: function(options) { // Upgrade `asset_category` to an array, in the case that this layer is // only associated with a single category. if (options.asset_category && !OpenLayers.Util.isArray(options.asset_category)) { options.asset_category = [ options.asset_category ]; } - var max_resolution = options.max_resolution; - if (typeof max_resolution === 'object') { - max_resolution = max_resolution[fixmystreet.cobrand]; - } - - var layer_options = { - fixmystreet: options, - strategies: [new StrategyClass()], - protocol: protocol, - visibility: false, - maxResolution: max_resolution, - minResolution: options.min_resolution, - styleMap: options.stylemap || get_asset_stylemap(), - assets: true - }; - if (options.attribution !== undefined) { - layer_options.attribution = options.attribution; - } - if (options.srsName !== undefined) { - layer_options.projection = new OpenLayers.Projection(options.srsName); - } else if (fixmystreet.wmts_config) { - layer_options.projection = new OpenLayers.Projection(fixmystreet.wmts_config.map_projection); - } - if (options.filter_key) { - // Add this filter to the layer, so it can potentially be used - // in the request (though only Bristol currently does this). - if (OpenLayers.Util.isArray(options.filter_value)) { - layer_options.filter = new OpenLayers.Filter.Logical({ - type: OpenLayers.Filter.Logical.OR, - filters: $.map(options.filter_value, function(value) { - return new OpenLayers.Filter.Comparison({ - type: OpenLayers.Filter.Comparison.EQUAL_TO, - property: options.filter_key, - value: value - }); - }) - }); - } else if (typeof options.filter_value === 'function') { - layer_options.filter = new OpenLayers.Filter.FeatureId({ - type: OpenLayers.Filter.Function, - evaluate: options.filter_value - }); - } else { - layer_options.filter = new OpenLayers.Filter.Comparison({ - type: OpenLayers.Filter.Comparison.EQUAL_TO, - property: options.filter_key, - value: options.filter_value - }); - } - // Add a strategy filter to the layer, to filter the incoming results - // after they are received. Bristol does not need this, but has to ask - // for the filter data in its response so it doesn't then disappear. - layer_options.strategies.push(new OpenLayers.Strategy.Filter({filter: layer_options.filter})); - } - - var layer_class = options.class || OpenLayers.Layer.VectorAsset; - if (options.usrn || options.road) { - layer_class = OpenLayers.Layer.VectorNearest; - } - var asset_layer = new layer_class(options.name || "WFS", layer_options); - - // A non-interactive layer to display existing asset faults - if (options.wfs_fault_feature) { - var po = { - featureType: options.wfs_fault_feature - }; - OpenLayers.Util.applyDefaults(po, protocol_options); - var fault_protocol = new OpenLayers.Protocol.WFS(po); - var lo = { - strategies: [new OpenLayers.Strategy.BBOX()], - protocol: fault_protocol, - styleMap: get_fault_stylemap(), - assets: true - }; - OpenLayers.Util.applyDefaults(lo, layer_options); - asset_fault_layer = new OpenLayers.Layer.Vector("WFS", lo); - asset_fault_layer.events.register( 'loadstart', null, fixmystreet.maps.loading_spinner.show); - asset_fault_layer.events.register( 'loadend', null, fixmystreet.maps.loading_spinner.hide); - asset_layer.fixmystreet.fault_layer = asset_fault_layer; - } - - var hover_feature_control, select_feature_control; - if (!options.non_interactive) { - // Set up handlers for selecting/unselecting markers - select_feature_control = new OpenLayers.Control.SelectFeature( asset_layer ); - asset_layer.events.register( 'featureselected', asset_layer, asset_selected); - asset_layer.events.register( 'featureunselected', asset_layer, asset_unselected); - if (options.disable_pin_snapping) { - // The pin is snapped to the centre of a feature by the select - // handler. We can stop this handler from running, and the pin - // being snapped, by returning false from a beforefeatureselected - // event handler. This handler does need to make sure the - // attributes of the clicked feature are applied to the extra - // details form fields first though. - asset_layer.events.register( 'beforefeatureselected', asset_layer, function(e) { - var attributes = this.fixmystreet.attributes; - if (attributes) { - set_fields_from_attributes(attributes, e.feature); - } - - // The next click on the map may not be on an asset - so - // clear the fields for this layer when the pin is next - // updated. If it is on an asset then the fields will be - // set by whatever feature was selected. - $(fixmystreet).one('maps:update_pin', function() { - if (attributes) { - clear_fields_for_attributes(attributes); - } - }); - return false; - }); - } - // When panning/zooming the map check that this layer is still correctly shown - // and any selected marker is preserved - asset_layer.events.register( 'loadend', asset_layer, layer_loadend); - } - - // Even if an asset layer is marked as non-interactive it can still have - // a hover style which we'll need to set up. - if (!options.non_interactive || (options.stylemap && options.stylemap.styles.hover)) { - // Set up handlers for simply hovering over an asset marker - hover_feature_control = new OpenLayers.Control.SelectFeature( - asset_layer, - { - hover: true, - highlightOnly: true, - renderIntent: 'hover' - } - ); - hover_feature_control.events.register('beforefeaturehighlighted', null, function(e) { - // Don't let marker go from selected->hover state, - // as it causes some mad flickering effect. - if (e.feature.renderIntent == 'select') { - return false; - } - }); - } + var asset_layer = construct_asset_layer(options); if (!options.always_visible || options.road) { asset_layer.events.register( 'visibilitychanged', asset_layer, layer_visibilitychanged); @@ -724,12 +807,22 @@ fixmystreet.assets = { if (options.always_visible) { asset_layer.setVisibility(true); } - if (hover_feature_control) { - fixmystreet.assets.controls.push(hover_feature_control); - } - if (select_feature_control) { - fixmystreet.assets.controls.push(select_feature_control); - } + return asset_layer; + }, + + add_controls: function(asset_layers, options) { + var select_feature_control = construct_select_feature_control(asset_layers, options); + var hover_feature_control = construct_hover_feature_control(asset_layers, options); + + $.each(asset_layers, function(i, asset_layer) { + asset_layer.controls = asset_layer.controls || []; + if (hover_feature_control) { + asset_layer.controls.push(hover_feature_control); + } + if (select_feature_control) { + asset_layer.controls.push(select_feature_control); + } + }); }, init: function() { @@ -759,12 +852,12 @@ fixmystreet.assets = { var pins_layer = fixmystreet.map.getLayersByName("Pins")[0]; for (var i = 0; i < fixmystreet.assets.layers.length; i++) { - init_asset_layer(fixmystreet.assets.layers[i], pins_layer); - } - - for (i = 0; i < fixmystreet.assets.controls.length; i++) { - fixmystreet.map.addControl(fixmystreet.assets.controls[i]); - fixmystreet.assets.controls[i].activate(); + var asset_layer = fixmystreet.assets.layers[i]; + var controls = asset_layer.controls || []; + for (var j = 0; j < controls.length; j++) { + fixmystreet.map.addControl(controls[j]); + } + init_asset_layer(asset_layer, pins_layer); } } }; diff --git a/web/cobrands/fixmystreet/fixmystreet.js b/web/cobrands/fixmystreet/fixmystreet.js index 7aac072ea..704a665ff 100644 --- a/web/cobrands/fixmystreet/fixmystreet.js +++ b/web/cobrands/fixmystreet/fixmystreet.js @@ -347,7 +347,7 @@ $.extend(fixmystreet.set_up, { $('.js-form-name').addClass('required'); } ); - $('#facebook_sign_in, #twitter_sign_in').click(function(e){ + $('#facebook_sign_in, #twitter_sign_in, #oidc_sign_in').click(function(e){ $('#username, #form_username_register, #form_username_sign_in').removeClass('required'); }); @@ -1242,7 +1242,7 @@ fixmystreet.fetch_reporting_data = function() { return; } $('#side-form').show(); - var old_category_group = $('#category_group').val(), + var old_category_group = $('#category_group').val() || $('#filter_group').val(), old_category = $("#form_category").val(), filter_category = $("#filter_categories").val(); diff --git a/web/cobrands/sass/_base.scss b/web/cobrands/sass/_base.scss index 8c1445b36..32a85fa04 100644 --- a/web/cobrands/sass/_base.scss +++ b/web/cobrands/sass/_base.scss @@ -379,6 +379,14 @@ select.form-control { margin: 0 0 0.5em 0; } } + + small { + margin: 0.5em auto; + display: block; + text-align: center; + font-style: normal; + width: 75%; + } } // Purposefully *not* wrapped in `html.js` because the margin-top helps @@ -387,6 +395,29 @@ select.form-control { margin-top: 1.5em; } +/* On a reporting page MyW/anon */ +small#or { + margin: 1em auto; + width: 100%; +} +small#or:before, small#or:after { + background-color: #fff; + content: ""; + display: inline-block; + height: 2px; + position: relative; + vertical-align: middle; + width: 50%; +} +small#or:before { + right: 1em; + margin-left: -50%; +} +small#or:after { + left: 1em; + margin-right: -50%; +} + // grey background, full width box .form-box { margin: 0 -1em 0.25em; diff --git a/web/cobrands/westminster/_colours.scss b/web/cobrands/westminster/_colours.scss new file mode 100644 index 000000000..be1779daa --- /dev/null +++ b/web/cobrands/westminster/_colours.scss @@ -0,0 +1,38 @@ +/* COLOURS */ + +$westminster_black: #0d0e16; +$westminster_blue: #1e6dc7; +$westminster_green: #137c71; +$westminster_pink: #c8007b; +$westminster_navy: #0b2265; +$westminster_yellow: #fecb00; +$westminster_grey: #f7f5f6; + +$primary: $westminster_yellow; + +$primary_b: #000000; +$primary_text: #222222; + +$base_bg: $westminster_grey; +$base_fg: #000; + +$nav_background_colour: #fff; +$nav_colour: $westminster_navy; +$nav_hover_background_colour: $westminster_blue; + +// Colour used for front page 'how to report a problem' steps +$col_big_numbers: #ccc; + +$header-top-border: false; + +$menu-image: 'menu-black'; + +$col_click_map: $westminster_yellow; + +$body-font: 'Open Sans', sans-serif; +$heading-font: $body-font; +$meta-font: $body-font; + +$mappage-header-height: 4.5em; + +$high-dpi-screen: '-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi';
\ No newline at end of file diff --git a/web/cobrands/westminster/assets.js b/web/cobrands/westminster/assets.js new file mode 100644 index 000000000..1e46ae192 --- /dev/null +++ b/web/cobrands/westminster/assets.js @@ -0,0 +1,313 @@ +(function(){ + +if (!fixmystreet.maps) { + return; +} + +/* First let us set up some necessary subclasses */ + +/* ArcGIS wants to receive the bounding box as a 'geometry' parameter, not 'bbox' */ +var format = new OpenLayers.Format.QueryStringFilter(); +OpenLayers.Protocol.Westminster = OpenLayers.Class(OpenLayers.Protocol.HTTP, { + filterToParams: function(filter, params) { + params = format.write(filter, params); + params.geometry = params.bbox; + delete params.bbox; + return params; + }, + CLASS_NAME: "OpenLayers.Protocol.Westminster" +}); + +/* This layer is relevant depending upon the category *and* the choice of the 'type' Open311 extra attribute question */ +var SubcatMixin = OpenLayers.Class({ + relevant: function() { + var relevant = OpenLayers.Layer.VectorAsset.prototype.relevant.apply(this, arguments), + subcategories = this.fixmystreet.subcategories, + subcategory = $(this.fixmystreet.subcategory_id).val(), + relevant_sub = OpenLayers.Util.indexOf(subcategories, subcategory) > -1; + return relevant && relevant_sub; + }, + CLASS_NAME: 'SubcatMixin' +}); +OpenLayers.Layer.VectorAssetWestminsterSubcat = OpenLayers.Class(OpenLayers.Layer.VectorAsset, SubcatMixin, { + CLASS_NAME: 'OpenLayers.Layer.VectorAssetWestminsterSubcat' +}); + +// This is required so that the found/not found actions are fired on category +// select and pin move rather than just on asset select/not select. +function uprn_init(name, options) { + OpenLayers.Layer.VectorAsset.prototype.initialize.apply(this, arguments); + $(fixmystreet).on('report_new:category_change', this.checkSelected.bind(this)); +} +OpenLayers.Layer.VectorAssetWestminsterUPRN = OpenLayers.Class(OpenLayers.Layer.VectorAsset, { + initialize: function(name, options) { uprn_init.apply(this, arguments); }, + CLASS_NAME: 'OpenLayers.Layer.VectorAssetWestminsterUPRN' +}); +OpenLayers.Layer.VectorAssetWestminsterSubcatUPRN = OpenLayers.Class(OpenLayers.Layer.VectorAsset, SubcatMixin, { + cls: OpenLayers.Layer.VectorAsset, + initialize: function(name, options) { uprn_init.apply(this, arguments); }, + CLASS_NAME: 'OpenLayers.Layer.VectorAssetWestminsterSubcatUPRN' +}); + +var url_base = 'https://tilma.staging.mysociety.org/resource-proxy/proxy.php?https://westminster.assets/'; + +var defaults = { + http_options: { + params: { + inSR: '4326', + f: 'geojson' + } + }, + asset_type: 'spot', + max_resolution: 4.777314267158508, + min_resolution: 0.5971642833948135, + asset_id_field: 'central_asset_id', + srsName: "EPSG:4326", + body: "Westminster City Council", + format_class: OpenLayers.Format.GeoJSON, + format_options: {ignoreExtraDims: true}, + protocol_class: OpenLayers.Protocol.Westminster, + strategy_class: OpenLayers.Strategy.FixMyStreet +}; + +fixmystreet.assets.add(defaults, { + http_options: { + url: url_base + '40/query?', + params: { + outFields: 'USRN' + } + }, + all_categories: true, + always_visible: true, + non_interactive: true, + stylemap: fixmystreet.assets.stylemap_invisible, + nearest_radius: 100, + usrn: { + attribute: 'USRN', + field: 'USRN' + } +}); + +var tfl_categories = [ 'Pavement damage', 'Pothole', 'Road pavement damage', 'Road or pavement damage' ]; + +fixmystreet.assets.add(defaults, { + http_options: { + url: url_base + '2/query?' + }, + asset_category: tfl_categories, + non_interactive: true, + road: true, + nearest_radius: 25, + stylemap: fixmystreet.assets.stylemap_invisible, + actions: { + found: function(layer, feature) { + if (!fixmystreet.assets.selectedFeature()) { + fixmystreet.body_overrides.only_send('TfL'); + } else { + fixmystreet.body_overrides.remove_only_send(); + } + }, + not_found: function(layer) { + fixmystreet.body_overrides.remove_only_send(); + } + } +}); + +fixmystreet.message_controller.register_category({ + body: defaults.body, + category: function() { + var category = $('#form_category').val(); + if (OpenLayers.Util.indexOf(tfl_categories, category) === -1 || + fixmystreet.body_overrides.get_only_send() === 'TfL') { + return false; + } + return true; + }, + message: 'Due to the need to consider a priority response we would ask you to call <a href="tel:+442076412000">020 7641 2000</a> with exact details of the problem.' +}); + +var layer_data = [ + { category: [ 'Food safety/hygiene' ] }, + { category: 'Damaged, dirty, or missing bin', subcategories: [ '1', '4' ], subcategory_id: '#form_bin_type' }, + { category: 'Noise', subcategories: [ '1', '3', '4', '7', '8', '9', '10' ] }, + { category: 'Smoke and odours' }, +]; + +function uprn_sort(a, b) { + a = a.attributes.ADDRESS; + b = b.attributes.ADDRESS; + var a_flat = a.match(/^(Flat|Unit)s? (\d+)/); + var b_flat = b.match(/^(Flat|Unit)s? (\d+)/); + if (a_flat && b_flat && a_flat[1] === b_flat[1]) { + return a_flat[2] - b_flat[2]; + } + return a.localeCompare(b); +} + +var old_uprn; + +function add_to_uprn_select($select, assets) { + assets.sort(uprn_sort); + $.each(assets, function(i, f) { + $select.append('<option value="' + f.attributes.UPRN + '">' + f.attributes.ADDRESS + '</option>'); + }); + if (old_uprn && $select.find('option[value=\"' + old_uprn + '\"]').length) { + $select.val(old_uprn); + } +} + +function construct_uprn_select(assets, has_children) { + old_uprn = $('#uprn').val(); + $("#uprn_select").remove(); + $('.category_meta_message').html(''); + var $div = $('<div class="extra-category-questions" id="uprn_select">'); + if (assets.length > 1 || has_children) { + $div.append('<label for="uprn">Please choose a property:</label>'); + var $select = $('<select id="uprn" class="form-control" name="UPRN" required>'); + $select.append('<option value="">---</option>'); + add_to_uprn_select($select, assets); + $div.append($select); + } else { + $div.html('You have selected <b>' + assets[0].attributes.ADDRESS + '</b>'); + } + $div.appendTo('#js-post-category-messages'); +} + +$.each(layer_data, function(i, o) { + var params = { + class: OpenLayers.Layer.VectorAssetWestminsterUPRN, + asset_category: o.category, + asset_item: 'property', + http_options: { + url: url_base + '25/query?', + params: { + where: "PARENTUPRN='XXXX' AND PROPERTYTYPE NOT IN ('Pay Phone','Street Record')", + outFields: 'UPRN,Address,ParentChild' + } + }, + max_resolution: 0.5971642833948135, + select_action: true, + attributes: { + 'UPRN': 'UPRN' + }, + actions: { + asset_found: function(asset) { + if (fixmystreet.message_controller.asset_found()) { + return; + } + var lonlat = asset.geometry.getBounds().getCenterLonLat(); + var overlap_threshold = 1; // Features considered overlapping if within 1m of each other + var overlapping_features = this.getFeaturesWithinDistance( + new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat), + overlap_threshold + ); + + var parent_uprns = []; + $.each(overlapping_features, function(i, f) { + if (f.attributes.PARENTCHILD === 'Parent') { + parent_uprns.push("PARENTUPRN='" + f.attributes.UPRN + "'"); + } + }); + parent_uprns = parent_uprns.join(' OR '); + + if (parent_uprns) { + var url = url_base + '25/query?' + OpenLayers.Util.getParameterString({ + inSR: 4326, + f: 'geojson', + outFields: 'UPRN,Address', + where: parent_uprns + }); + $.getJSON(url, function(data) { + var features = []; + $.each(data.features, function(i, f) { + features.push({ attributes: f.properties }); + }); + add_to_uprn_select($('#uprn'), features); + }); + } + construct_uprn_select(overlapping_features, parent_uprns); + }, + asset_not_found: function() { + $('.category_meta_message').html('You can pick a <b class="asset-spot">' + this.fixmystreet.asset_item + '</b> from the map »'); + $("#uprn_select").remove(); + fixmystreet.message_controller.asset_not_found(this); + } + } + }; + + if (o.subcategories) { + params.class = OpenLayers.Layer.VectorAssetWestminsterSubcatUPRN; + params.subcategories = o.subcategories; + params.subcategory_id = o.subcategory_id || '#form_type'; + } + + fixmystreet.assets.add(defaults, params); +}); + +layer_data = [ + { group: 'Street lights', item: 'street light', layers: [ 18, 50, 60 ] }, + { category: 'Pavement damage', layers: [ 14 ], road: true }, + { category: 'Pothole', layers: [ 11, 44 ], road: true }, + { group: 'Drains', item: 'gully', layers: [ 16 ] }, + + { category: 'Signs and bollards', subcategories: [ '1' ], subcategory_id: '#form_featuretypecode', item: 'bollard', layers: [ 42, 52 ] }, + { category: 'Signs and bollards', subcategories: [ 'PLFP' ], subcategory_id: '#form_featuretypecode', item: 'feeder pillar', layers: [ 56 ] }, + { category: 'Signs and bollards', subcategories: [ '3' ], subcategory_id: '#form_featuretypecode', item: 'sign', layers: [ 48, 58, 54 ] }, + { category: 'Signs and bollards', subcategories: [ '2' ], subcategory_id: '#form_featuretypecode', item: 'street nameplate', layers: [ 46 ] } +]; + +$.each(layer_data, function(i, o) { + var layers_added = []; + var attr = 'central_asset_id'; + var params = $.extend(true, {}, defaults, { + asset_category: o.category, + asset_item: o.item, + http_options: { + params: { + outFields: attr + } + }, + attributes: {} + }); + + if (o.group) { + params.asset_group = o.group; + } else if (o.subcategories) { + params.class = OpenLayers.Layer.VectorAssetWestminsterSubcat; + params.subcategories = o.subcategories; + params.subcategory_id = o.subcategory_id || '#form_type'; + } + + if (o.road) { + params.non_interactive = true; + params.nearest_radius = 100; + params.stylemap = fixmystreet.assets.stylemap_invisible; + params.usrn = { + attribute: attr, + field: attr + }; + } else { + params.attributes[attr] = attr; + } + + $.each(o.layers, function(i, l) { + var layer_url = { http_options: { url: url_base + l + '/query?' } }; + var options = $.extend(true, {}, params, layer_url); + layers_added.push(fixmystreet.assets.add_layer(options)); + }); + fixmystreet.assets.add_controls(layers_added, params); +}); + +$(function(){ + $("#problem_form").on("change.category", "#form_type, #form_featuretypecode, #form_bin_type", function() { + $(fixmystreet).trigger('report_new:category_change'); + }); +}); + +fixmystreet.message_controller.register_category({ + body: defaults.body, + category: 'Burst water main', + message: 'To report a burst water main, please <a href="https://www.thameswater.co.uk/help-and-advice/Report-a-problem/Report-a-problem">contact Thames Water</a>' +}); + +})(); diff --git a/web/cobrands/westminster/base.scss b/web/cobrands/westminster/base.scss new file mode 100644 index 000000000..3820c8fea --- /dev/null +++ b/web/cobrands/westminster/base.scss @@ -0,0 +1,232 @@ +@import "../sass/h5bp"; +@import "colours"; +@import "../sass/mixins"; + +@import "../sass/base"; + +body.frontpage { + background-color: #fff; // instead of $westminster_grey +} + +#site-logo { + background-position: 0 0; + background-size: 120px 30px; + height: 30px; + width: 130px; // 10px of white space to the right, so centred logo position matches main site + background-image: url(/cobrands/westminster/images/wcc_logo.png); + margin: 0 auto; // centre logo +} + +#site-header { + padding-top: 13px; + padding-bottom: 15px; + border-bottom: 3px solid $westminster-yellow; +} + +#nav-link { + right: auto; + left: 0.25em; // roughly match "menu" icon location on left of the main site +} + +#report-cta { + right: 1em; // right-aligned, rather than left-aligned +} + +#front-main { + background-color: $westminster_grey; + margin: 0; + padding: 1em; + text-align: inherit; + + h1 { + font-weight: bold; + color: $westminster_navy; + } + + #postcodeForm { + margin: 0; + padding: 0; + background: transparent; + color: inherit; + + div { + display: block; + border: none; + background: transparent; + position: relative; + + input#pc { + display: block; + width: 100%; + box-sizing: border-box; + padding: 10px 22px; + box-shadow: 1px 1px 5px 1px rgba(104, 104, 104, 0.4); + background: #fff; + } + + input#sub { + position: absolute; + top: 0; + right: 0; + bottom: 0; + display: block; + width: 0; + height: auto; + padding-left: 50px; + overflow: hidden; + background: transparent url(/cobrands/westminster/images/search-icon.png) no-repeat 50% 50%; + background-size: 25px 25px; + + &:hover { + background: transparent url(/cobrands/westminster/images/search-icon.png) no-repeat 50% 50%; + background-size: 25px 25px; + } + + &:focus { + outline: 1px dotted #000; + } + } + } + } + + a#geolocate_link { + background: transparent; + display: block; + padding: 0; + margin-top: 0.5em; + font-family: inherit; + font-size: 1em; + border-radius: 0; + color: $westminster_blue; + + &:hover { + background: transparent; + text-decoration: underline; + } + } + + .form-hint { + color: inherit; + } +} + +#front-howto h2, +#front-recently h2 { + font-weight: bold; + color: $westminster-navy; +} + +ol.big-numbers>li:before { + color: $westminster-navy; +} + +#front_stats { + background-color: $westminster-blue; + color: #fff; +} + +#report-cta { + border: 0; + background-color: $westminster-yellow; + &:hover, + &:focus { + color: #fff; + } +} + +.westminster-footer { + background-color: $westminster_navy; + border-top: 3px solid $westminster-yellow; + padding: 1.5em 0; + text-align: center; + + a { + color: #fff; + } +} + +.westminster-footer-logo { + a { + $image-width: 200px*(130/200); + $image-height: 49px*(130/200); + display: inline-block; + overflow: hidden; + width: $image-width; + padding-top: $image-height; + height: 0; + background-size: $image-width $image-height; + background-position: center center; + background-repeat: no-repeat; + @include svg-background-image('/cobrands/westminster/images/footer-logo'); + } +} + +.westminster-site-links, +.westminster-social-links, +.westminster-tertiary-links { + list-style: none; + margin: 0; + + li { + list-style: none; + } +} + +.westminster-site-links { + margin-top: 1.5em; + font-size: 1.1em; + + li { + margin-bottom: 1em; + } +} + +.westminster-social-links { + margin: 1.5em -6px; + + li { + display: inline-block; + margin: 0 6px; + } + + a { + display: inline-block; + overflow: hidden; + width: 38px; + padding-top: 38px; + height: 0; + background-color: $westminster_grey; + background-size: 24px 24px; + background-repeat: no-repeat; + background-position: center center; + border-radius: 38px; + } +} + +.westminster-social-links__twitter { + @include svg-background-image('/cobrands/westminster/images/footer-twitter'); +} + +.westminster-social-links__instagram { + @include svg-background-image('/cobrands/westminster/images/footer-instagram'); +} + +.westminster-social-links__facebook { + @include svg-background-image('/cobrands/westminster/images/footer-facebook'); +} + +.westminster-tertiary-links { + font-size: 0.8em; + padding-top: 2em; + border-top: 1px solid $westminster_grey; + margin: 0 -6px; + + li { + display: inline-block; + margin: 0.2em 6px; + } +} + +.item-list__item--expandable__actions a.btn--primary { + display: none; // No updates +} diff --git a/web/cobrands/westminster/favicon.ico b/web/cobrands/westminster/favicon.ico Binary files differnew file mode 100644 index 000000000..35c7ff782 --- /dev/null +++ b/web/cobrands/westminster/favicon.ico diff --git a/web/cobrands/westminster/images/chevron-black-right.png b/web/cobrands/westminster/images/chevron-black-right.png Binary files differnew file mode 100644 index 000000000..4375d7f71 --- /dev/null +++ b/web/cobrands/westminster/images/chevron-black-right.png diff --git a/web/cobrands/westminster/images/chevron-black-right.svg b/web/cobrands/westminster/images/chevron-black-right.svg new file mode 100644 index 000000000..5b24145ac --- /dev/null +++ b/web/cobrands/westminster/images/chevron-black-right.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="43" height="33"><path fill="#0D0E16" d="M0 0h13l13 16-13 16H0l13-16"/></svg>
\ No newline at end of file diff --git a/web/cobrands/westminster/images/collection-default-bg.jpg b/web/cobrands/westminster/images/collection-default-bg.jpg Binary files differnew file mode 100644 index 000000000..7ccfab873 --- /dev/null +++ b/web/cobrands/westminster/images/collection-default-bg.jpg diff --git a/web/cobrands/westminster/images/footer-facebook.png b/web/cobrands/westminster/images/footer-facebook.png Binary files differnew file mode 100644 index 000000000..72e74c606 --- /dev/null +++ b/web/cobrands/westminster/images/footer-facebook.png diff --git a/web/cobrands/westminster/images/footer-facebook.svg b/web/cobrands/westminster/images/footer-facebook.svg new file mode 100644 index 000000000..4dea6ce6f --- /dev/null +++ b/web/cobrands/westminster/images/footer-facebook.svg @@ -0,0 +1 @@ +<svg width="24" height="24" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.8 1v3.6h-2.1c-.8 0-1.3.1-1.6.4-.2.4-.4.8-.4 1.5V9h4l-.6 4h-3.4V23h-4V13H6.1V9h3.4V6c0-1.6.5-2.9 1.4-3.8A5 5 0 0 1 14.7 1l3 .1z" fill="#091F67" fill-rule="nonzero"/></svg>
\ No newline at end of file diff --git a/web/cobrands/westminster/images/footer-instagram.png b/web/cobrands/westminster/images/footer-instagram.png Binary files differnew file mode 100644 index 000000000..f1bdee818 --- /dev/null +++ b/web/cobrands/westminster/images/footer-instagram.png diff --git a/web/cobrands/westminster/images/footer-instagram.svg b/web/cobrands/westminster/images/footer-instagram.svg new file mode 100644 index 000000000..a3623fde1 --- /dev/null +++ b/web/cobrands/westminster/images/footer-instagram.svg @@ -0,0 +1 @@ +<svg width="24" height="24" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20 19.1v-8.7H18l.3 1.8a6.2 6.2 0 0 1-3.2 5.4c-1 .5-2 .8-3.2.8-1.7 0-3.3-.6-4.5-1.8a5.9 5.9 0 0 1-1.6-6.2H4v8.7c0 .2 0 .4.2.6l.6.2h14.3c.3 0 .5 0 .6-.2l.3-.6zM16.2 12c0-1.1-.5-2-1.3-2.9A4 4 0 0 0 12 8 4 4 0 0 0 9.1 9C8.3 10 7.9 11 7.9 12a4 4 0 0 0 4.1 4 4 4 0 0 0 3-1.2c.7-.8 1.2-1.7 1.2-2.8zM20 7V5l-.3-.6A.9.9 0 0 0 19 4h-2.3c-.3 0-.5.1-.7.3l-.2.6v2.2c0 .3 0 .5.2.7.2.2.4.3.7.3H19c.3 0 .5-.1.7-.3.2-.2.3-.4.3-.7zm2.3-2.7v15.2c0 .8-.3 1.4-.8 2-.5.4-1.1.7-1.9.7H4.4c-.8 0-1.4-.3-2-.8-.4-.5-.7-1.1-.7-1.9V4.4c0-.8.3-1.4.8-2 .5-.4 1.1-.7 1.9-.7h15.2c.8 0 1.4.3 2 .8.4.5.7 1.1.7 1.9z" fill="#091F67" fill-rule="nonzero"/></svg>
\ No newline at end of file diff --git a/web/cobrands/westminster/images/footer-logo.png b/web/cobrands/westminster/images/footer-logo.png Binary files differnew file mode 100644 index 000000000..0131b9342 --- /dev/null +++ b/web/cobrands/westminster/images/footer-logo.png diff --git a/web/cobrands/westminster/images/footer-logo.svg b/web/cobrands/westminster/images/footer-logo.svg new file mode 100644 index 000000000..b06e03cb4 --- /dev/null +++ b/web/cobrands/westminster/images/footer-logo.svg @@ -0,0 +1 @@ +<svg width="200" height="49" viewBox="0 0 200 49" xmlns="http://www.w3.org/2000/svg"><g fill="#FFF" fill-rule="nonzero"><path d="M195 33.4c0-.3 0-.5-.3-.5l-.7.8c-.5.7-1.9 1.6-2.4 1.9-.3 0-.4.2-.4.4 0 .3.2.3.3.3.9.1 1.2.2 1.2 2.1v6c0 1.7 0 2-1 2.3-.6 0-.8.2-.8.5 0 .4.3.4.4.4l2.5-.1h2.8c.2 0 .5 0 .5-.4s-.3-.5-.8-.5c-1.3 0-1.3-1-1.3-2.2v-5.9c0-2.6.7-3 1.2-3 .2 0 .3 0 .8.6.3.6.7.8 1.2.8.6 0 1.5-.5 1.5-1.7 0-1.3-.9-2-1.8-2-1.4 0-2.5 1.9-2.6 2l-.2.2-.1-.4v-1.6zM84.7 36.4l-.2-.7.1-.4 1.6-4c.8-2 1-2.2 1.7-2.2.6 0 .9-.2.9-.6 0-.4-.3-.4-.6-.4l-1.3.1h-2c-.2 0-.4 0-.4.3a.4.4 0 0 0 .4.4c.5.1.8.3.8.7 0 .4-.1.7-.3 1L84 34.5l-1.4-4-.2-1.1c0-.3.2-.4.5-.4.2 0 .9 0 .9-.5a.4.4 0 0 0-.4-.4l-2.3.1h-2.6c-.2 0-.5 0-.5.3 0 .4.3.4.9.6.4 0 .6.4 1.1 1.9l2.4 6.6v.9l-1.9 4.7-4.4-12.7c-.2-.3-.2-.7-.3-1 0-.4.5-.5.6-.5.4 0 .7 0 .7-.5 0-.4-.3-.4-.6-.4l-2.5.1-2.4-.1c-.2 0-.5 0-.5.4s0 .4.9.6c.4 0 .7.2 1.3 1.8L79 47.3c.1.4.3.7.5.7s.3-.1.6-.9l2.9-7.8 2.5 8c.2.6.4.7.6.7.2 0 .3-.2.4-.6l5.1-15.6c.8-2.6 1.2-2.6 1.7-2.7.6-.1.9-.2.9-.6 0-.4-.3-.4-.4-.4l-1.7.1h-1.8c-.2 0-.6 0-.6.3 0 .4.2.4.4.5.8.1 1 .2 1 .7a9 9 0 0 1-.4 1.7L87 43l-2.2-6.5zM101.6 38.2c.3 0 .6 0 .6-.5 0-1-.8-4.5-4.4-4.5-3.2 0-6 3-6 7.5 0 4.4 2.5 7 5.6 7 3 0 4.8-2.7 4.8-3.1 0-.1 0-.3-.3-.3l-.5.5c-.6.8-1.6 1.2-2.6 1.2-2.5 0-4.3-2.6-4.3-6.1 0-1.6.3-1.7.7-1.7h6.4zm-6.1-1c-.6 0-.7 0-.7-.3 0-.5.8-3 3-3 .3 0 2 0 2 1.9 0 .8-.7 1.5-1.7 1.5h-2.6zM103.6 45.7c0 .8 0 1 .3 1.2.9.5 2 .8 3 .9 3.2 0 4.6-2.7 4.6-5 0-2.7-2-3.8-2.8-4.2-2.4-1.3-3-1.6-3-2.8a1.8 1.8 0 0 1 2-2c1.6 0 2.2 1.7 2.4 2.3.1.6.2.7.4.7s.3-.4.3-.5v-1.8c0-.5 0-.9-.5-1l-2.4-.3c-3.1 0-4.2 2.5-4.2 4.2 0 2.3 1.7 3.1 3.1 3.9 1.7.8 2.8 1.5 2.8 3.2 0 1.6-1.3 2.5-2.4 2.5-2 0-2.6-2.7-2.7-3.3-.1-.5-.3-.8-.5-.8-.3 0-.4.4-.4.5v2.3zM116.3 35.6c0-.6 0-.7.4-.7h2.1c.4 0 .4 0 .5-.6 0-.5-.1-.6-.3-.6h-2.1c-.5 0-.6 0-.6-.7v-2c0-.6-.3-.6-.3-.6-.2 0-.4.3-.4.4a7 7 0 0 1-2.2 2.8l-.6.4-.4.6c0 .3.3.3.4.3h.6c.4 0 .5.2.5.6v8.9c0 2.3 1.2 3.4 2.5 3.4 1.7 0 3.2-2 3.2-2.4 0-.1 0-.3-.2-.3l-.2.2c-.9.6-1.2.7-1.6.7-1.2 0-1.3-1.4-1.3-2.8v-7.6zM135.8 44.4c0 1.7 0 2-1 2.3-.5 0-.7.2-.7.5 0 .4.2.4.4.4l2.4-.1h2.5c.2 0 .4 0 .4-.3s-.1-.4-.7-.5c-1-.2-1-.6-1-2.3V37c0-1-.3-3.8-3.4-3.8-.8 0-1.7.4-2.7 1.4 0 .1-.6 1-.8 1l-.5-.8c-.4-1-1.4-1.6-2.5-1.6s-2 .2-3.3 2l-.3.3-.1-.6v-1.5c0-.3 0-.6-.3-.6-.2 0-.4.3-.5.6a7 7 0 0 1-2.5 2c-.2 0-.3.2-.3.4 0 .4.3.4.6.4.8.1.8.8.8 2.3v6c0 1.6 0 2-1 2.2-.6 0-.8.2-.8.5 0 .4.3.4.4.4l2.5-.1h2.4c.2 0 .5 0 .5-.3s-.1-.4-.7-.5c-1-.2-1-.6-1-2.3v-6.6c0-.7 0-1.3.4-1.7.4-.7 1-1 2-1 1.7 0 2 1.6 2 3.2v6c0 1.9 0 2.2-1 2.4-.5 0-.7.2-.7.5 0 .4.2.4.4.4l2.5-.1h2.4c.2 0 .4 0 .4-.3s0-.4-.7-.5c-1-.2-1-.6-1-2.3v-6.7c0-.6 0-1.3.4-1.8.5-.6 1.2-1 2-1 2 0 2 2 2 3v6.5zM145 29.8c0-1-.5-1.8-1.2-1.8-.8 0-1.4.9-1.4 1.7 0 1 .6 1.7 1.4 1.7.7 0 1.3-.8 1.3-1.6M142.6 44.4c0 1.7 0 2-1 2.3-.5 0-.7.2-.7.5 0 .4.2.4.4.4l2.5-.1h2.5c.1 0 .4 0 .4-.3s-.1-.4-.7-.5c-1-.2-1-.6-1-2.3v-10c0-.7 0-1.1-.3-1.1-.2 0-1 .8-1.1 1-.4.4-1 .8-2.1 1.3-.3 0-.4.2-.4.5s.4.4.4.4c.9 0 1.1.5 1.1 2v6zM156.6 44.4c0 1.7 0 2-1 2.3-.6 0-.8.2-.8.5 0 .4.3.4.4.4l2.5-.1h2.5c.2 0 .4 0 .4-.3s0-.4-.7-.5c-1-.2-1-.6-1-2.3v-7.2c0-3-1.7-4-3.3-4-1.4 0-2 .4-3.5 2.1l-.4.2v-2.1c0-.3-.1-.6-.3-.6-.2 0-.4.3-.6.6a7 7 0 0 1-2.4 2c-.3 0-.3.2-.3.4 0 .4.2.4.6.4.7.1.7.8.7 2.2v6c0 1.7 0 2-1 2.3-.5 0-.7.2-.7.5 0 .4.2.4.4.4l2.5-.2 2.5.2c.2 0 .4 0 .4-.4 0-.3-.1-.4-.7-.5-1-.2-1-.6-1-2.3v-6.6c0-.7 0-1.3.4-1.7.5-.7 1.2-1 2-1 2.4 0 2.4 2.2 2.4 3.7v5.6zM162.4 45.7c0 .8 0 1 .3 1.2 1 .5 2 .8 3 .9 3.2 0 4.7-2.7 4.7-5 0-2.7-2-3.8-2.8-4.2-2.5-1.3-3-1.6-3-2.8a1.8 1.8 0 0 1 2-2c1.6 0 2.2 1.7 2.3 2.3.2.6.3.7.5.7s.3-.4.3-.5v-1.8c0-.5 0-.9-.6-1l-2.3-.3c-3.2 0-4.2 2.5-4.2 4.2 0 2.3 1.7 3.1 3 3.9 1.7.8 2.8 1.5 2.8 3.2 0 1.6-1.2 2.5-2.3 2.5-2 0-2.6-2.7-2.8-3.3 0-.5-.2-.8-.5-.8s-.3.4-.3.5v2.3zM175.8 35.6c0-.6 0-.7.5-.7h2c.4 0 .5 0 .5-.6 0-.5 0-.6-.3-.6H176.4c-.5 0-.6 0-.6-.7v-2c0-.6-.2-.6-.3-.6-.2 0-.3.3-.4.4a7 7 0 0 1-2.1 2.8l-.6.4c-.2.2-.4.4-.4.6 0 .3.3.3.4.3h.5c.4 0 .6.2.6.6v8.9c0 2.3 1.2 3.4 2.4 3.4 1.8 0 3.3-2 3.3-2.4 0-.1 0-.3-.2-.3 0 0-.2 0-.3.2-.8.6-1.1.7-1.5.7-1.2 0-1.4-1.4-1.4-2.8v-7.6zM189.3 38.2c.3 0 .6 0 .6-.5 0-1-.8-4.5-4.4-4.5-3.2 0-6 3-6 7.5 0 4.4 2.5 7 5.6 7 3 0 4.7-2.7 4.7-3.1 0-.1 0-.3-.2-.3l-.5.5c-.6.8-1.6 1.2-2.6 1.2-2.5 0-4.2-2.6-4.2-6.1 0-1.6.2-1.7.6-1.7h6.4zm-6.1-1c-.6 0-.6 0-.6-.3 0-.5.7-3 2.9-3 .3 0 2 0 2 1.9 0 .8-.7 1.5-1.7 1.5h-2.6z"/><g><path d="M86.5 2.8c-.1-.9-.2-1.2-1.3-1.4-1.6-.4-2-.5-3.1-.5C75.9 1 73 6.6 73 11c0 4 2.6 10.2 8.7 10.2 2.4 0 4-1 4.4-1.3.3-.3.6-.7.5-1.2l.2-2.6c0-.3 0-.5-.3-.5s-.5.4-.5.6c-1 2.4-2 4.1-4.3 4.1-3.5 0-5.5-5-5.5-9.4 0-4 1.8-9.1 5.7-9.1 2.2 0 3 1.4 4 3.2.2.5.4.5.5.5.3 0 .3-.2.3-.5l-.2-2.2zM92.5 2.8c0-1-.6-1.8-1.3-1.8-.8 0-1.3.9-1.3 1.8s.5 1.7 1.3 1.7 1.3-.9 1.3-1.7M90 17.8c0 1.7 0 2-1 2.2-.5.1-.7.3-.7.5 0 .5.2.5.4.5l2.5-.2 2.5.2c.2 0 .4 0 .4-.4 0-.3-.1-.5-.7-.6-1-.2-1-.5-1-2.3V7.5c0-.7 0-1-.3-1-.2 0-1 .8-1.1 1-.4.3-1 .7-2.1 1.2-.3.1-.4.3-.4.5 0 .4.4.4.5.4.8.1 1 .5 1 2.2v6zM98 8.8c0-.7 0-.7.5-.7h2.1c.3 0 .4 0 .4-.6s0-.7-.3-.7H98.6c-.5 0-.6 0-.6-.6V4c0-.5-.2-.5-.3-.5l-.4.4a7.2 7.2 0 0 1-2 2.8l-.7.5c-.2 0-.4.3-.4.5 0 .4.3.4.4.4h.6c.3 0 .5.1.5.5v9.1c0 2.4 1.2 3.4 2.4 3.4 1.8 0 3.3-1.9 3.3-2.4 0 0 0-.2-.2-.2h-.3c-.8.8-1.1.9-1.5.9-1.2 0-1.4-1.5-1.4-2.9V8.8zM106 9.5c-.2-.3-.2-.6-.3-1 0-.5.3-.8.6-.8 1-.1 1-.1 1-.5 0-.3-.1-.4-.4-.4h-5c-.2 0-.6 0-.6.4l.1.3h.3c1 .2 1.1.2 1.7 2l3 10 .4 1.6-.2.9-.6 1.8c-.4 1-.7 1.1-1 1.1h-.8c-.8 0-1 .8-1 1.5 0 .4 0 1.3 1.3 1.3s1.4-.5 1.7-1.8l2.2-7.7c1-3.3 1.9-5.6 2.9-8.3.5-1.5.8-2.2 1.3-2.3.7 0 .9-.1.9-.5V7c-.2-.1-.3-.2-.4-.1h-3.8s-.4 0-.4.4.3.4.9.4c.6 0 .8.4.8 1l-.3 1.5-2.1 6.7-2.3-7.3zM135.8 8.8c0-.6.1-.7.6-.7h2.1c.3 0 .4 0 .4-.4 0-.7-.2-.9-.4-.9h-2.2c-.4 0-.5 0-.5-.7 0-1.2 0-5 1.5-5 .4 0 .7.3 1.3 1.5.1.2.5.7.8.7.4 0 1-1.5 1-2 0-1.2-1.7-1.3-2-1.3-1.5 0-4.3 1.6-4.7 5.4-.2 1.4-.3 1.5-.8 1.6-.6.2-.9.4-.9.8 0 .3.2.4.4.4l.6-.1c.4 0 .5 0 .5 1.1v8.5c0 1.3 0 2.1-1.2 2.3-.5 0-.8 0-.8.5s.3.5.5.5c.1 0 1-.2 2.7-.2 1.6 0 2.4.2 2.7.2.2 0 .5 0 .5-.5s-.4-.5-.9-.5c-1.2-.1-1.2-1-1.2-2.3V8.8zM130.5 13.4c0-4.7-3-7.1-5.8-7.1-3.5 0-5.8 3.8-5.8 7.4 0 3.6 2.2 7.4 6 7.4 3.2 0 5.6-3.5 5.6-7.7m-9-.3c0-3.8 1.3-6.1 3-6.1 2.7 0 3.5 4.6 3.5 6.7 0 3.8-1.5 6.7-3.2 6.7-2 0-3.4-3.3-3.4-7.3"/></g><g><path d="M30.8 14.5c1.8-.1 3.5-.1 5.2.1.7.2.3-.4.2-.5l-1.1-1H35l-.3-.2h-2.2c-1 0-1.8.2-2.7.4-.4.1 0 .4 0 .4a4.6 4.6 0 0 1 .6.8h.4M27.7 13.4a8 8 0 0 0 1-.3c.1-.1.1-.2-.1-.2h-1l-.3.1c.1.2 0 .5.4.4M23 16.7l-.2.2-.2.2-.4 2.8v2.5l.2.4s.1.3.3.3h2.7c1.6.1 3.1.3 3.4-.2.3-.4.2-1.4.4-2.6 0-2 .1-3-.1-3.4-.4-.4-2.1-.2-6.2-.2m5 2.6v1.1c0 .4-.4.6-.6.9-.2.2.1.7 0 .9-.2 0-.3 0-.5-.2-.2-.3-.5.3-1.1.3l-1-.5c-.2 0-.3 0-.5.2-.3 0 0-.4-.2-.8-.1-.3-.4-.1-.6-.5-.1-.4 0-.8.1-1l-.2-.6c-.1-.2.5 0 .7-.2.2-.2 0-.3.2-.7.2-.3.5-.2.9-.3.3 0 .3-.5.5-.7.2-.2.2.6.8.6.5 0 .9.1 1 .6.3.4.5.4.8.5.2 0 0 .1-.2.4"/><path d="M65.8 15.4h-.3c-.7 0-1.3.2-1.7.7l-.6 1.3-.1.3c0 .1 0 .2-.2.3h-.4l.3-.5v-.8c0-.2 0-.5.2-.7.1-.3 0-.7-.3-.8-.2 0-.4.1-.4.3l-.7 1-.8.8c-1.3 1.9-2.3 3.8-2 6 .2 1.6.7 2 2 3.5.9 1.6 1.8 2.8 1.4 4.2-.2.9-1.3.9-2.2.7.1-2.1-.4-3.2-1.4-5-1-1.8-2.4-2.8-3.6-4.5l-.1-.2v-.1c.2 0 .2-.2.3-.3.2.2.6.3.8.1.5-.4.2-1 .2-1.3l.1-.2.4-.1h.3c0 .1.8.1 1-.1.5-.4.2-1.4 0-2.2-.2-.8-.5-1-.4-1.6.4-.3 1 1 1.4.4.5-.5-.2-.8-.2-1.4 0-.2.7-.3.7-.7.1-.4-.5-1-.7-1.2h-.3V13l-.1-1.6-.5-1.3c0-.4.6-.7.6-1 0-.2-.4-.2-.6-.5-.3-.8.1-1.3-.3-1.4-.3 0-.3.2-.7.5-.2 0-.1-.4-.4-.5l-.5.3-.4.4-.4.2-.6.3-1.1.3c-.4 0-.7.2-1 .3-.7.4-.9.6-1.5 1.2-.2 0-.3.3-.3.5 0 .1 0 .3.2.4 0 .5 0 1 .2 1 .6.4 1.1 0 1.5.2 0 .2-.9.4-1.6.4l-1.1-.2h-.6l-.3-.1h-.2c-.1.1.3.3.7.6.5.3.4.7 1 .7.5 0 1.8-.7 1.8-.5.1.1-.4.3-.7.4-.5.3-1 0-1.2 1 0 .7 1.4 0 1.3.3 0 .3-.8.6-1.5.6a2 2 0 0 0-.6.5c-.1.1 0 .3-.2.4-.4.6-1.4.1-4.1-1a5.2 5.2 0 0 0-3.6-.5c-.2 0-.4.3-.4.5 0 .4.6.6 1 .4.4 0 .9-.1 1.2.3.3.3.1.5 0 1.2 0 .3.1.7.3 1l.4.5c.2.2.4 0 .5.1l.2.4.2.1c.2.2 0 .5.1.5.1.1.4 0 .6-.2v-.1l.3.3c0 .2 0 .5.3.6.3.3.6-.2.8 0 .1.1-.6 1-1.2 1.4-.4.5-.7.6-1.3 1.1-.5.6-.6 1.1-1 2.2-.2.4-.1.6-.6 1l.2-.9c.1-.4.1-.8.4-1 0-.1.3-.3.2-.4h-22l.3.3c.2.3.2.7.3 1.1.2.4.3.5.3 1-.5-.5-.5-.7-.6-1.1-.4-1-.5-1.6-1-2.2l-1.4-1c-.5-.6-1.3-1.4-1.2-1.5.2-.2.6.3.9 0 .2-.1.3-.4.3-.6l.2-.3c.3.2.5.4.6.3.2 0 0-.3.1-.5h.3l.1-.5h.6l.3-.6.4-1c-.2-.6-.3-.8 0-1.2.3-.4.7-.3 1.2-.2.3.1 1 0 1-.5 0-.2-.2-.4-.5-.5-1.2-.3-2.4 0-3.5.5-2.8 1.1-3.8 1.6-4.2 1l-.1-.4a2 2 0 0 0-.6-.5h-.1c-.7 0-1.5-.3-1.5-.6s1.3.4 1.3-.2c-.2-1.1-.6-.8-1.2-1-.3-.2-.8-.3-.7-.5 0-.2 1.3.6 1.8.6.6 0 .6-.5 1-.8.4-.3.9-.5.7-.5h-.2-.8c-.5 0-.7.3-1.2.2-.7 0-1.5-.2-1.6-.4.4-.1 1 .2 1.5-.1.3-.2.2-.6.3-1.1a.6.6 0 0 0-.2-1c-.6-.5-.8-.7-1.4-1l-1-.4-1.1-.2-.6-.4-.5-.2-.4-.4s-.4-.4-.5-.3c-.2 0-.1.4-.4.5-.4-.3-.4-.5-.7-.5-.4.1 0 .6-.3 1.5-.2.2-.6.2-.6.5 0 .2.6.6.6.9l-.5 1.3a5.1 5.1 0 0 0 0 1.8H7c-.2.3-1 .8-.8 1.2 0 .4.8.5.8.7 0 .6-.8 1-.3 1.4.6.6 1-.7 1.4-.4.1.6-.1.8-.4 1.6-.2.8-.4 1.7 0 2.2.2.2 1 .3 1 0h.3c0 .2.2.1.4.2l.2.2c0 .3-.4 1 .2 1.3.2.2.5 0 .7 0l.3.2v.3c-1.2 1.6-2.6 2.7-3.6 4.5-1 1.8-1.6 2.9-1.4 5-1 .2-2 .2-2.2-.7-.4-1.4.5-2.6 1.4-4.2 1.2-1.5 1.7-2 2-3.5.3-2.2-.7-4.1-2-6-.4-.2-.7-.5-.9-.8l-.6-1c-.1-.2-.3-.3-.5-.3-.3 0-.4.5-.2.8l.1.7v.8l.3.5h-.4a2.5 2.5 0 0 1-.3-.6c-.3-.7-.3-1-.6-1.3-.4-.5-1-.7-1.6-.8-.2 0-.4 0-.4.2v.2c.4.2.7.4 1 .8.5.9.2 1.7.9 2.4.9.9 2 1.5 3 1.9h.4l.4.9c.3.5.5.8.3 1.4-.3 1-.8 2-1.5 2.8-1.9 2.2-2.8 3.7-2.4 5.9.2 1.1 1.9 1.7 3.7 1l.4-.2h.1l.3.3s.2 0 .3.2c.4.3.6.9.4 1.4-.3 1-1 1.5-1.8 2.4v.2l-.4.1v.3l-.3.2c-.2.1 0 .4 0 .7 0 .4-.8.4-.7 1 0 .5.5.3.6.6.1.3-.8.5-.5 1.2.6.6 1.2.4 1.4 1l-.1.6c-.2.2-.2.5 0 .7 0 .2.2.1.6.1l.4-.2.7-.3c.1-.1.3-.1.4 0 .1 0 .2 0 .2.2-.3 0-1 .3-1.2.5-.7.3-1 .6-1.1.8-.2.5 0 .5.4 1.2.3.7.3 1.7.6 2 .4.3 1.2.2 2-.4 2.8-1.4 4.3-1.7 7-2.9l3.8-1.6c-.2.3-.3.5-.3.8 0 .8.2 1 0 2.3 0 .7 0 1 .2 1.5.5.7 1.5.5 2.7.5.8 0 5.7-.3 10.2-.3h1.6c4.5 0 9.4.3 10.2.3 1.2 0 2.2.2 2.7-.5.3-.5.3-.8.2-1.5-.2-1.3 0-1.5 0-2.3 0-.3-.1-.5-.3-.8l3.8 1.6c2.7 1.2 4.2 1.5 7 3 .8.5 1.7.6 2 .2.3-.3.3-1.2.6-1.9.4-.7.6-.8.4-1.2 0-.2-.4-.5-1-.8-.2-.2-1-.5-1.3-.5l.2-.3h.4l.7.3.5.3c.3 0 .4 0 .6-.2v-.6a.7.7 0 0 1-.2-.6c.2-.6.9-.4 1.4-1 .4-.8-.6-.9-.5-1.2.1-.3.6-.1.6-.7.1-.5-.6-.5-.7-1 0-.2.2-.5 0-.6l-.2-.2v-.3c-.2-.1-.3-.2-.4-.1l-.1-.2c-.7-.9-1.5-1.5-1.8-2.5-.2-.5 0-1 .4-1.4.1 0 .3 0 .3-.2 0 0 .2 0 .2-.2h.2c.1 0 .3 0 .4.2 1.8.7 3.5 0 3.7-1 .4-2.2-.6-3.7-2.4-6a7.5 7.5 0 0 1-1.5-2.8c-.2-.5 0-.9.3-1.4l.4-.8h.3a8 8 0 0 0 3.1-2c.7-.7.4-1.4 1-2.4l.8-.8c.1 0 .1-.2 0-.2m-12.7-5c.3-.2 1.1-.5 1.1-.3.2.8-.3.5-.6.7-.2.2-.8.6-.8.2 0-.3 0-.6.3-.7m-15.8 17c.4-.1.4-.4.5-.6 0-.3.5-.3.9-.2h.2l.3-.4c.1-.2.2-.3.4-.3.3.2.2.4.5.4s.7-.7 1-.3c.1.3-.3 1-.4 1.3l-.2.4c0 .3.1.6.3.7a.6.6 0 0 1 0 .9c-.2.4 0 .4.1.7v.4l-.6.8c-.3 0-.6-.4-.9-.2-.3.1-.6.7-1 .4-.3-.2-.3-.2-.6 0-.5.4-1 .6-.9 0 0-.4.2-.7.5-1 .2-.3-.3-.5.2-.8.7-.3.6-.6.5-.6h-.4l-.5.2c-.2 0-.4-.6-.1-.7.4-.1.8-.2.8-.4h-.6c-.2.3-.4.1-.5.1l-.1-.4c0-.4.3-.4.6-.5m-6.5.7l.5-1.1c0-.3.3-.6.2-.9 0-.3-.2-.6 0-.8.2-.4.7-.5 1-.5 1.4 0 1.4 1.3 1.5 1.5.2.3.8 0 1 .4v1c.1.6.7.3.8 1.5 0 .7-.3.7-.4 1.1l-.2.6v.3c0 .1-.3.5-.2.6l.2 1c.1.5.4.8.6 1.2v.7c0 .8 0 1.1-.2 1.2-.3.2-.4.2-1 .2a6 6 0 0 1-1 0c-.5-.2-1-.2-1.5 0-.4 0-.6.3-1 .3h-.5l-.3.2c-.1 0 0-.2-.2-.3v-.9c0-.6.2-1.2.4-1.8l.7-1.7-.1-.6v-.2c-.4-.1-.9-.3-1-.7-.5-.7.4-1.5.7-2.3m-.2 8.9c.7 0 1.2.5 1.6.3.8 0 1.1-.3 1.9-.3h.5c.7.2 1.2.4 1.7.4l1.4-.2c.2.4 0 .5-.4 1l-.3.2h-.2c-.7.2-.7 0-1.4 0L34 38h-.3c-.3 0-.9.3-1.5.3-.7 0-1.4-.5-1.7-.3-.6 0-1 .4-1.5.3-.3 0-.5-.2-.7-.3-.4-.5-.5-.6-.4-1l1.2.1 1.4-.2m3.7 2.5c-.3-.1-.8.2-1.3.2h-.2c-.5 0-1-.3-1.2-.2-.5 0-.7.3-1.1.2l-.6-.2c-.3-.4-.4-.5-.3-.8l1 .1 1-.2c.6 0 1 .4 1.3.3h.2l1.2-.2 1 .1h1c.1.2 0 .3-.3.6-.1.2-.3.2-.5.3-.5 0-.7-.2-1.2-.3m.4 1.3l-.2.2c-.3.1-.4-.1-.6-.2l-.6.2-.5-.1h-.1c-.2 0-.4.3-.6.2a.5.5 0 0 1-.3-.2c-.1-.3-.2-.4-.1-.6h.5l.4-.1.7.2.6-.2.5.1h.5l-.2.5m-9.5-13.3c.3 0 .3-.3.4-.5.2-.3.5-.3 1-.2h.2l.3-.4c.1-.2.1-.3.3-.3.3.2.2.4.6.4.3 0 .7-.7 1-.3.1.3-.3 1-.4 1.3l-.2.4c0 .3 0 .6.2.7a.6.6 0 0 1 .1.9c-.3.4 0 .4 0 .7.1.1 0 .3 0 .4-.1.2-.3.7-.6.8-.2 0-.5-.4-.8-.2-.3.1-.6.7-1 .4-.3-.2-.3-.2-.7 0-.5.4-.9.6-.8 0 0-.4.2-.7.5-1 .2-.3-.3-.5.2-.8.6-.3.5-.6.5-.6h-.4l-.5.2c-.3 0-.4-.6-.2-.7.5-.1.8-.2.8-.4 0-.1 0 0-.2 0H25c-.2.3-.3.1-.4.1l-.2-.4c0-.4.4-.4.7-.5m-13.4-17c0-.2.8 0 1.2.1.3.2.2.5.2.7 0 .4-.5 0-.8-.2-.3-.2-.7 0-.6-.7M18 39l-3 1.4-2.3 1-1.7.6a5.8 5.8 0 0 0-1.2.6l.1-.4c.4-.4.5-1 .3-1.3-.4-.6-1.9-.4-2.4-.2h-.2-.2v-.2a9.8 9.8 0 0 1 2.8-3.1c2.2-1.7 3.1-3 3-3.8-.1-.5-.3-1-.6-1.4h.5c.4-.1.7 0 1 .4.1.2 0 .2 0 .4 0 .4-.7 2.5.4 3.4 1.1 1.1 2.7.5 3.2 1 .3.3.3.9.7.9.4 0 .5-.5.8-.6.4 0 .7.3 1 .5l-2.2.8m3.9-1.3l-1.4.4c.2-.3.4-.6.6-.6.3 0 .5.2.8 0v.2m22.2 0v-.1c.3.1.6-.1.8-.1.2 0 .4.3.7.6a38 38 0 0 0-1.5-.4m1.6-2.4a.5.5 0 0 0-.4-.2l-.7-.2c-.4 0-.8.1-1.1.5a4 4 0 0 1-.5.6l-.5.5c-.1.1-.2.2-.1.3v.1l.4.1-.2.3c-.2 0-.5 0-.6.2-.5.4-.5 1-.7 1.7-.2.8-.6 1-.6 1.4.2.7.6.9 1 1.3.5.3.8.7 1.1 1.2l.3.4-1.6-.2a54.2 54.2 0 0 0-6.6 0h-2 .3-8.6l-1.7.2.3-.4c.3-.5.7-.9 1.1-1.2.5-.4.8-.6 1-1.3.1-.4-.3-.6-.5-1.4-.2-.7-.3-1.3-.7-1.7a.7.7 0 0 0-.6-.2l-.2-.2V37h.3l.1-.2c0-.1 0-.2-.2-.3l-1-1.1c-.2-.4-.6-.6-1-.5-.3 0-.5 0-.7.2l-.4.2-.1.1H20l-.1.1c-1.3-.3-2-.7-2.5-1.9-.8-2 .2-4-.8-5-.9-.6-1.6-.3-2.4 0l-1 .3h-.9l.6-.8c.7-.7 1.5-.6 2.3-1.3.8-.7 1.6-2.4 1.7-2.2.2 0-.2 1 .6 1.1.5.1.8-.7 1-.6.2 0 .3.3.3.5 0 .4 0 .8-.3 1.1-.2.2-.3.8-.2 1 .2.2 1.2-.5 1.4-.4.2.1 0 1.2.6 1.3.3 0 .5 0 .7-.3l.2-.3c.1.3.2.5.6.4.4 0 .4-.5.4-.7.1-.3.3-.2.3 0v1.4c0 1.7.6 3.4 1.4 4.9 1.5 2.5 3.4 4.1 5.5 5.8l1.4 1.2 1.5 1.1c.2.2.2.3.4.3h.4l.4-.3c.6-.3 1-.7 1.5-1.2l1.4-1c2.1-1.8 4-3.4 5.5-6a10.9 10.9 0 0 0 1.4-6.2c0-.2.3-.3.3 0 0 .2 0 .6.5.7.3 0 .5-.2.6-.5l.2.3c.1.3.4.4.7.3.5 0 .4-1.1.6-1.2.2-.1 1.1.6 1.3.4.2-.2 0-.8-.2-1-.2-.4-.3-.7-.2-1.1l.2-.6c.2 0 .6.7 1.1.7.7-.1.4-1.2.5-1.2.1-.2 1 1.5 1.8 2.3.8.6 1.5.5 2.3 1.2l.6.8h-.8-.1l-1-.2c-.8-.3-1.6-.6-2.4 0-1 1 0 3-.8 5-.5 1.1-1.3 1.6-2.6 1.9l-.2-.1-.1-.1m12.9 5.1v.2l-.2.1h-.2c-.5-.3-2-.5-2.3.1-.2.3-.1 1 .2 1.4v.3L55 42l-1.7-.6c-1-.3-1.4-.6-2.2-1l-3.1-1.5-2.2-.8c.3-.1.6-.5 1-.4.4 0 .4.6.8.5.4 0 .4-.6.7-.9.5-.5 2.1.2 3.2-1 1-.8.5-3 .4-3.4 0-.2-.1-.2 0-.4a1 1 0 0 1 1-.4h.5c-.3.4-.4 1-.5 1.4-.2.8.7 2.1 3 3.8 1 .8 2 1.9 2.7 3.1"/><path d="M29.2 13.8c-.3-.2-.2-.3-.4-.3l-1.6.3c-1.9.6-2.2 1-2.1 1.6 0 .6 1.2.4 1.6.2a31 31 0 0 1 2.7-1c.8 0 .2-.5-.2-.8M43 9.1c-.8-1.3-1-1.9-1.5-2.2-.2-.1-.4 0-.6.2-.5-.2-.8-.5-1.1-.2-.2.2 0 .3 0 .5-.4.3-.7.7-.7 1 .2.4.7.6 1.5 2.2.6 1.1 1.2 0 1.3.4 0 .2-.6.3-.6.9.3.8.8 1.5 1.3 2.2.2.2.3.5.5.5.2.1.7-.2.8-.3.3 0 .6.5.9.3.2-.2 0-.3.1-.6.2-.3.6-.3.6-.6l-.1-.7c-1.2-1.5-1-2-1.5-2.3-.3-.1-.6.3-1 .2l-.1-.4c.2-.4.4-.3.4-.6L43 9m-1.4.3c-.1.7-.3.9-.4.8-1-1.3-1.4-1.3-1.2-1.6.3-.3.4-.3.7.1.1 0 .3 0 .3-.2s-.2-.3-.1-.5c.3 0 .6-.2.7 0 .3.4.9 1 .6 1.5-.3.2-.6-.3-.6 0m1.5 2.8c.1-.3 0-.8.2-.9.3 0 .5.3.8.7 0 .2.5 1 .2 1-.3.2-.6-.7-.7-.4.2.6 0 .6-.2.7-.5.3-.7-.2-1-.5-.2-.7-.4-.7-.1-1 .4-.3.5.3.8.4M25.5 13.4s0-.1-.2 0l-1 .1s-.3.2-.1.4c0 .2.3.6.5.5l1-.4c.2 0 .2-.2 0-.4 0-.2-.2-.2-.2-.2M26.4 13.8c.5-.1 1-.2.8-.5-.1-.3-.2-.3-.4-.3l-.7.2c-.3 0-.4.1-.2.4.1.2 0 .4.5.2M40.4 3.3c-.4.7-.6.8-.7 1.4a1 1 0 0 0 1.1 1c.6 0 1-.4 1.1-.6.6-.4 1 0 1.1-.2.3-.3-.3-1-.2-1.3 0-.4.5-1 .2-1.3-.3-.1-1 .3-1.5.3s-.5-.3-1-.2c-.3 0 .2.4 0 .9M24.5 5.7c1.5-.1 3-3.5-.3-3.2l-.9.2c-1.4.5-2.2 3.4 1.1 3m.4-2.3l.1.1c.6.6-.6 1.7-1.3 1.2-1-.6.4-1.9 1.2-1.3M29.8 23h1a139.4 139.4 0 0 0 3.6 0H36.1c.3-.2.5-.2.4-2l-.2-3.6c0-.2 0-.5-.2-.7l-.8-.3H33l-1 .1-1.9.1c-.3.1-.4.2-.5.6l-.2 3.2v2c0 .2.1.5.4.6m2.4-4c.2 0 0-.9 0-1.2 0-.3 0-.8.7-.7.6 0 .5.6.5.8v1.2c.2.1 2.3-.3 2 .5 0 .4.3.6-1 .6-.3.1-1 0-1 .5l-.1 1.1v.2c-.2.2-.4.4-.7.4-1.1.1 0-2.2-.5-2.2 0-.4-2.3.4-2.2-.6.2-1 2-.4 2.3-.6M41.6 13.9c.2-.2 0-.3-.2-.4l-1-.2-.3.3c-.2.2-.1.4 0 .4l1 .4c.2.1.4-.3.6-.5M26.3 27.6s.6-.2.7-.4c0-.2-.3-.3-.5-.2-.2 0-.5.2-.5.3 0 .2.1.3.3.3M38.1 13.4c.3 0 .3-.2.4-.4 0-.2-.2-.2-.4-.2h-.9c-.2.1-.2.2-.1.3l1 .2M37 23c.3.4 1.9.2 3.5.2 1-.2 2.1 0 2.9 0l.2-.5v-.3-2.5c0-1-.1-1.9-.3-2.8-.1-.2-.1-.3-.2-.2-4 0-6-.4-6.3 0-.3.5-.2 1.4 0 3.4 0 1.2 0 2.2.3 2.6m.6-4c.2-.1.5 0 .7-.5.2-.5.6-.5 1-.6.7 0 .7-.8.9-.6.2.2.2.7.5.7.4.1.6 0 .9.3.2.4 0 .5.2.7.2.2.8 0 .7.2 0 .2-.3.3-.2.6 0 .2.2.6 0 1-.1.4-.4.2-.5.5-.2.4 0 .9-.2.8-.2-.1-.3-.3-.5-.2-.2.1-.5.4-1 .5-.6 0-1-.5-1.1-.3-.2.2-.4.3-.5.2-.1-.2.2-.7 0-1-.2-.2-.6-.4-.6-.8v-1c-.3-.4-.5-.5-.3-.5M37.2 14.8h.2l2 .9c.5.1 1.6.4 1.7-.3 0-.5-.3-1-2.1-1.5-1.6-.5-2.8-.7-3-.7-.1 0-.2.1-.1.2.5.3.9.7 1.2 1.2l.1.2M40 13.6c.1-.3 0-.4-.2-.4L39 13c-.2 0-.2 0-.4.3s.4.4.8.5c.5.2.4 0 .6-.2"/><path d="M21 14c0 .3 0 .5.2.6.2.3.5-.2.8-.2.1 0 .6.4.8.2.2 0 .3-.3.5-.5.5-.6 1-1.4 1.3-2.2 0-.6-.7-.6-.6-.9.1-.3.7.7 1.3-.3.8-1.6 1.3-1.9 1.4-2.3 0 1.2.2 2 .3 3.2a5.5 5.5 0 0 0 .4 1c.1.1.1 0 .4 0 .5-.2 1-.3 1.1-.6 0-.2 0-.2-.4-.2-.2 0 0-1 0-1.1h1c0 .1.3.8.1.8-.6.2-.4.3.2.8.3.2.4.7.6.7.2 0 .2-.3.6-.6.1-.2.8-.7.1-.7-.1 0 0-1 .2-1l1 .1c0 .2.2.7-.2.7-.3 0-.3.3.3.8.2.1.4.5.6.4.2 0 .5-.4.8-.6 0 0 .5-.4 0-.5l-.3-.1.1-.8h1c.2-.1.3.1.3.4.1.5 0 .4-.2.4l-.2.4.7.5c.4.2.2.4.5.5l.6-.5c.3-.2 1-.5.4-.8-.3-.1-.3-.2-.3-.5 0-.1 0-.3.2-.4.2-.2.7 0 1 0 .1 0 .1.8-.2.8-.6.1-.1.3 0 .5l.6.5.3.2c.2.1.4-.8.6-1.1 0-1.7.3-2.5.2-4.2-.2-2.2 0-4.3.2-4.3.3-.3 2-1.3.8-2.6-.6-.7-2-.3-2.2 1l-.6.2h-2.7l-1.7.1h-4.2l-.7-.1v-.3C27.5.2 26.3-.2 25.6.5c-1.1 1.2.6 2.3 1 2.6.1 0 .3 2 .1 4.2v.7a2 2 0 0 0-.6-.7V7c-.4-.3-.7 0-1.1.2-.3-.1-.5-.3-.7-.2-.5.3-.7.9-1.4 2.2-.2.3-.3.3-.3.5 0 .3.2.2.4.6-.1.3 0 .4-.2.4-.2.1-.6-.3-.8-.2-.6.4-.4.8-1.5 2.4-.2.1-.3.4-.2.6 0 .3.4.3.6.6M39.4.8h.2c.4.6 0 1.3-.6 1.2-1.1-.3-.2-1.7.4-1.2m-1.3 8.8l-2-.1.1-1.7c.1-.2 1.7-.1 1.8 0 0 0 .3 1.8 0 1.8m-1.7-7a5.8 5.8 0 0 1 1.7-.1v.3c-.1.6.2 1.2-.2 1.5h-1.3-.1v-.1c.1-.9-.2-1.5 0-1.6m-.2 2.7c.2-.3.9 0 1.6-.2a.1.1 0 0 1 .2.2c-.1.9.3 1.7 0 1.7-.7.2-1.8.2-1.8 0V5.3m-2.7-2.6v-.1h.1c.8 0 1.5-.2 1.7 0v1.8c0 .2-1.1.2-1.7 0-.4 0 0-.8 0-1.7m0 2.8c-.1 0 0 0 0-.2h1.6c.1 0 0 .2 0 .4v.7.6h-1.7c-.2 0 0-.8 0-1.6m-.1 2.4c0-.2 1.2-.1 1.9-.1.2 0 0 1.8-.1 1.8h-1.8V7.7m-2.8-2.4v-.2h1.6c.3.2 0 .9.1 1.5V7L30.5 7V5.4m1.9 2.8l-.1.7v.6h-1.7c-.2 0 0-.8 0-1.6h.1c0-.2 1.4-.2 1.6-.1.1 0 0 .1 0 .4m-1.8-5.5v-.2h.1c.8.1 1.4 0 1.6.2a6 6 0 0 1 0 1.6c0 .3-1 .3-1.7.1-.3 0 0-.9 0-1.7M28 2.5s1.5 0 1.6.2V4s.1.3 0 .4H28c-.3-.3 0-1-.2-1.6v-.2m0 2.8a.2.2 0 0 1 .1-.2h.1c.8.1 1.4-.1 1.6.1V7c0 .2-1.1.2-1.7.1-.3 0 0-.9 0-1.7m-.1 2.4l1.8.1v1.6c0 .2-1.2.1-1.9.2-.2 0 0-1.8.1-1.9m-1-5.8c-.6.2-1-.5-.6-1.1h.2V.7h.2c.4-.3 1.4 1 .2 1.2m-2.6 6c.1-.2.5 0 .8 0 0 .2-.3.3-.2.5l.3.2c.3-.4.4-.4.7 0 .2.2-.2.2-1.1 1.5-.2.1-.4-.1-.4-.7 0-.3-.4.2-.7 0-.3-.6.3-1.1.6-1.5m-2.4 4c.2-.3.4-.6.7-.6.2 0 0 .6.2.9.3 0 .4-.6.8-.3.3.2 0 .2-.2.9-.2.3-.4.8-.9.6-.2-.1-.4-.2-.2-.7 0-.4-.4.5-.7.4-.2-.2.1-.8.3-1.1"/></g></g></svg>
\ No newline at end of file diff --git a/web/cobrands/westminster/images/footer-twitter.png b/web/cobrands/westminster/images/footer-twitter.png Binary files differnew file mode 100644 index 000000000..e70085637 --- /dev/null +++ b/web/cobrands/westminster/images/footer-twitter.png diff --git a/web/cobrands/westminster/images/footer-twitter.svg b/web/cobrands/westminster/images/footer-twitter.svg new file mode 100644 index 000000000..092ec907e --- /dev/null +++ b/web/cobrands/westminster/images/footer-twitter.svg @@ -0,0 +1 @@ +<svg width="24" height="24" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22.6 5.5a9 9 0 0 1-2.2 2.2v.6a12.3 12.3 0 0 1-2 6.8c-.8 1-1.6 2-2.5 2.8a12.6 12.6 0 0 1-14.4.7h1c2 0 3.8-.5 5.4-1.8-1 0-1.8-.3-2.6-.8a4.2 4.2 0 0 1-1.5-2.2l.8.1 1.2-.1c-1-.3-1.9-.7-2.5-1.5-.7-.8-1-1.7-1-2.8.6.3 1.3.5 2 .5a4.3 4.3 0 0 1-1.4-5.8 12.3 12.3 0 0 0 9 4.5l-.2-1c0-1.1.5-2.2 1.3-3 .8-.8 1.9-1.3 3-1.3 1.3 0 2.4.5 3.2 1.4 1-.2 2-.5 2.8-1-.4 1-1 1.8-2 2.3.9 0 1.7-.3 2.6-.6z" fill="#091F67" fill-rule="nonzero"/></svg>
\ No newline at end of file diff --git a/web/cobrands/westminster/images/search-icon.png b/web/cobrands/westminster/images/search-icon.png Binary files differnew file mode 100644 index 000000000..8a2937508 --- /dev/null +++ b/web/cobrands/westminster/images/search-icon.png diff --git a/web/cobrands/westminster/images/wcc_logo.png b/web/cobrands/westminster/images/wcc_logo.png Binary files differnew file mode 100644 index 000000000..9144bf5b1 --- /dev/null +++ b/web/cobrands/westminster/images/wcc_logo.png diff --git a/web/cobrands/westminster/layout.scss b/web/cobrands/westminster/layout.scss new file mode 100644 index 000000000..7864f37ac --- /dev/null +++ b/web/cobrands/westminster/layout.scss @@ -0,0 +1,148 @@ +@import "colours"; +@import "../sass/layout"; + +#site-logo { + margin: 0; // reset the centering we introduced in the mobile view +} + +#site-header { + padding-top: 1.25em; + padding-bottom: 1.25em; +} + +#front-main { + background-color: $westminster_grey; + padding: 50px 0; + + label { + font-size: 18px; + } + + h1 { + font-size: 40px; + } + + #postcodeForm { + overflow: visible; + margin: 0; + + div { + margin: 0; + overflow: visible; + + input#pc { + float: none; + height: auto; + width: 100%; + padding: 10px 22px; + } + + input#sub { + float: none; + height: auto; + width: 0; + padding-top: 0; + } + } + } + + #front-main-container { + padding: 0 1em; + } +} + +#front-main a#geolocate_link { + color: $westminster-blue; +} + +body.mappage { + #site-header { + box-sizing: border-box; // count padding as part of height, so border-bottom is visible + padding-top: 18px; // 1.25em minus 3px, to visually compensate for 3px border-bottom + } + + .nav-wrapper { + top: -3px; // to visually compensate for 3px border-bottom on #site-header + } + + .westminster-footer { + display: none; + } +} + +.nav-menu--main { + li { + color: $westminster_navy; + } + + a, span, a:visited { + padding: 0.25em 0.5em; + margin: 0.5em 0.25em; + color: inherit; + font-weight: bold; + } + + a { + &:hover, + &:focus { + background: transparent; + color: inherit; + } + } + + // Make it look unclickable (because it is). + span.report-a-problem-btn:hover { + color: inherit; + cursor: default; + } + + // Make it not look like a button any more. + a.report-a-problem-btn, + a.report-a-problem-btn:hover { + color: inherit; + background: transparent; + padding: 0.25em 0.5em; + margin: 0.5em 0.25em; + } +} + +.big-green-banner { + color: $westminster-black; + background: $col_click_map inline-image("../westminster/images/chevron-black-right.svg") $right center no-repeat; + + .ie8 & { + background-image: url(/cobrands/westminster/images/chevron-black-right.png); + } +} + +.problem-header h1 { + font-weight: bold; +} + +.westminster-footer { + text-align: inherit; +} + +.westminster-footer-logo { + a { + $image-width: 200px; + $image-height: 49px; + float: right; + margin-top: 70px; + width: $image-width; + padding-top: $image-height; + background-size: $image-width $image-height; + } +} + +.westminster-site-links { + margin-top: 0; + + li { + margin-bottom: 0.5em; + } +} + +.westminster-tertiary-links { + text-align: center; +} diff --git a/web/js/geolocation.js b/web/js/geolocation.js index fbef4d7ea..63599d4c1 100644 --- a/web/js/geolocation.js +++ b/web/js/geolocation.js @@ -34,7 +34,7 @@ fixmystreet.geolocate = function(element, success_callback) { fixmystreet.geolocate(link, function(pos) { var latitude = pos.coords.latitude.toFixed(6); var longitude = pos.coords.longitude.toFixed(6); - var coords = 'latitude=' + latitude + ';longitude=' + longitude; + var coords = 'lat=' + latitude + '&lon=' + longitude; location.href = link.href + (link.href.indexOf('?') > -1 ? ';' : '?') + coords; }); } else { |