You are here
Home > Uncategorized > Marin Transit to Decide on Countywide Service Changes in late March

Marin Transit to Decide on Countywide Service Changes in late March

As the implementation of Marin Transit’s service adjustment plan draws closer in June 2016, the agency held several public hearings in Marin City, San Rafael, and Novato, in which those drew interested audiences about the upcoming line changes throughout the county. The final decision will take place on 28 March 2016, in which I will personally attend the meeting to see what changes the agency will present to the Marin County Board of Supervisors and, hopefully, be satisfied with the proposals.
Note to readers: my apologies if I haven’t updated this recurring series for a long time as I’ve been away capturing even more mesmerizing images from throughout the North Bay, and I have become more active in a group dedicated to address Marin County’s concerns on housing densities, transportation, and social justice, called the Coalition for a Livable Marin (website link provided at the end of this blog).

Just to recap the changes, I will list down the links to the proposed changes and my analysis:

Overview
Personal Analysis
In Focus: Novato and North San Rafael
In Focus: San Rafael and Central Marin
In Focus: South Marin adjustments

As for additional suggestions on the proposed changes after its latest release in January 2016, I will list them after I note all the modifications.

San Rafael and the Canal District

#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .border-box {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box {
position: relative;
margin: 20px 0;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box-tab-group {
font-size: 0;
margin: 0;
padding: 0;
float: left;
list-style: none;
height: 60px;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
white-space: nowrap;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box-tab {
margin: 0;
cursor: pointer;
height: 60px;
display: inline-block;
min-width: 19%;
position: relative;
background-color: #F7F7F7;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box-content-group {
clear: both;
float: left;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box-content {
padding: 40px 20px 40px 20px;
display: none;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .scrollArrow {
width: 25px;
background-color: white;
text-align: center;
position: absolute;
z-index: 3;
top: 0;
display: none;
cursor: pointer;
height: 60px;
line-height: 60px;
font-weight: bold;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .scrollArrow.scrollArrow-left {
left: 0;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .scrollArrow.scrollArrow-right {
right: 0;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box.scrollable .tabbed-box-tab-group {
border-bottom: none;
overflow-x: hidden;
overflow-y: hidden;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box.scrollable .tabbed-box-bar:hover .scrollArrow.active {
display: block;
}
@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3),only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2),only screen and (max-width: 499px) {
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box-tab-group {
overflow-x: scroll !important;
}
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard .tabbed-box-tab-group {
border-left: 1px solid #CCCCCC;
border-bottom: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard .tabbed-box-tab {
border: 1px solid #CCCCCC;
border-left: none;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard .tabbed-box-tab .paragraph {
color: #A8ABAC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard .tabbed-box-content-group {
border: 1px solid #CCCCCC;
border-top: none;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard.scrollable .tabbed-box-tab-group {
border-right: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard.scrollable .tabbed-box-tab-group .tabbed-box-tab:last-child {
border-right: none;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard.scrollable .scrollArrow-left {
border: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .standard.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line .tabbed-box-tab-group {
border: 1px solid #CCCCCC;
border-bottom: none;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line .tabbed-box-content-group {
border: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line.scrollable .tabbed-box-tab-group {
height: 61px;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line.scrollable .tabbed-box-content-group {
border-top: none;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line.scrollable .scrollArrow-left,
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .line.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
border-bottom: none;
border-top: none;
height: 61px;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .simple .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
height: 61px;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .simple .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .simple .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .simple .tabbed-box-content-group {
border-top: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .simple .tabbed-box-content {
padding: 20px 0px 20px 0px;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .simple .scrollArrow-left {
border-right: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .simple .scrollArrow-right {
border-left: 1px solid #CCCCCC;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .s3d-shadow {
-webkit-box-shadow: #f5f5f5;
-moz-box-shadow: #f5f5f5;
box-shadow: #f5f5f5;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .s3d-content-shadow {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .s3d .tabbed-box-tab .paragraph {
color: #A8ABAC;
background-color: #F7F7F7;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .s3d .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
-webkit-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
-moz-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .s3d .tabbed-box-tab.active .paragraph {
background-color: white;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .s3d .tabbed-box-content-group {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box-tab .paragraph {
padding: 0px;
line-height: 60px !important;
text-align: center !important;
font-weight: bold;
font-size: 16px !important;
margin: 0 20px;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box-content .paragraph {
padding: 0;
line-height: 30px;
}
#element-5a436b82-ae86-4b15-8d19-d0b8a625371c .tabbed-box-tab:last-child .w-delete-outer {
display: none;
position: relative;
float: right;
}

  • Routes 35, 36, and 45
  • Route 245
<
>

One of the initial adjustments made when the plan was being developed was the elimination of Route 35 and instead shift all of its resources to the Route 45, in which from its original section between San Rafael Transit Center and Northgate Mall, it will be extended in both directions:

  • South to serve the Canal District
  • North to serve Downtown Novato via the bus pads along US-101

This plan was then revised to eliminate Routes 45/45K and instead keep Route 35. However, the extensions originally proposed for the enhanced Route 45 will still be implemented.

As for Route 36 (Canal-Marin City via San Rafael TC and US-101 bus pads), the proposal to make it a daily service instead of weekday peaks only will still be done. But, Marin Transit removed plans to let it serve Strawberry directly.

Route 35 service span:
Daily from 5am to 2:30am, every 30 minutes, leaving at :00 and :30 past from San Rafael TC
Novato extension operates:

  • Weekdays: 6am to 8:30pm
  • Weekends & Holidays: 7am to 8pm

Route 36 service span:
Every 30 minutes entire route, leaving at :15 and :45 past from San Rafael TC

  • Weekdays: 6:30am to 8pm
  • Weekends & Holidays: 7:30am to 7pm
In my original post, the initial plan was to downgrade all Lincoln Avenue services to become shuttles only (with Routes 233 and 245 operating along that corridor). However, Marin Transit reversed that plan and big bus service will continue along that busy corridor with the expanded Route 35, thus continuing the legacy of the current Routes 45/45K. As a compromise, the upcoming Route 245 will operate as an express between Freitas Parkway (at Northgate One) and San Rafael Transit Center with a stop at North San Pedro Road bus pads (north and southbound). However, the loop around Kaiser Hospital seems to be undecided as the entire loop can be done either way… it will cover:

  • Las Gallinas Avenue
  • Freitas Parkway
  • Nova Albion Way
  • Montecillo Road

If it were me, I would do the following:

  • Northbound alignment: after stop on Freitas Pkwy & Northgate Drive, straight on Freitas, serve Scotty’s Market (at Del Ganado), left on Montecillo and serve Kaiser Hospital, left on Nova Albion Way (to serve Terra Linda High School and Vallecitos Elementary), and left on Las Gallinas Avenue towards Lucas Valley Road
  • Southbound will be the reverse of the northbound leg: after stop at Las Gallinas Ave & Holly Dr, continue south on Las Gallinas and serve Las Gallinas & Nova Albion Way stop, right on Nova Albion Way, right on Montecillo Road, right on Freitas Pkwy and serve Scotty’s Market before continuing to US-101 (straight shot)
  • If I can suggest, have a meeting with the Montecillo Road homeowners and ask them if they want to have an additional stop or two along that roadway to make transit even more accessible in that neighborhood. My suggested stops are Montecillo & Trellis, Montecillo & Tamarack, and Montecillo & Tarragon. In this way, potential riders will not need to walk as far as Kaiser Hospital (on Montecillo & Nova Albion) or Scotty’s Market (at Freitas Pkwy & Del Ganado).

function setupElement434342261772712145() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “135397292802228534-1.3.2”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var TabbedBox = PlatformElement.extend({
events: {
‘click .tabbed-box-tab’: ‘clickTab’,
// in case they type and that causes an overflow, we should determine scrollability here
‘keyup .tabbed-box-tab .paragraph’: ‘determineScrollability’,
‘mousedown .scrollArrow-left’: ‘scrollLeft’,
‘mousedown .scrollArrow-right’: ‘scrollRight’,
‘touchstart .scrollArrow-left’: ‘scrollLeft’,
‘touchstart .scrollArrow-right’: ‘scrollRight’
},
initialize: function() {
var view = this;
var tabs = this.$(‘.tabbed-box-tab’);
var content = this.$(‘.tabbed-box-content’);
// optimization
this.scrollArrowLeft = this.$(‘.scrollArrow-left’);
this.scrollArrowRight = this.$(‘.scrollArrow-right’);
this.scrollTabsBar = this.$(‘.tabbed-box-tab-group’);
// resize handler and mouseup handler
// since we want to be able to handle mouseup wherever the user releases (not just over the element)
// we set it here as a property of the window.
$(window).resize(function() {
this.determineScrollability();
}.bind(this)).on(‘mouseup touchend’, function() {
this.stopScrolling();
}.bind(this));
// since scroll events don’t propagate up, we have to bind it here as opposed to in the events object
this.$(‘.tabbed-box-tab-group’).scroll(function() {
this.determineHandlers();
}.bind(this));
// determine whether or not we should show the scroll handlers
this.determineScrollability();
// load the first tab.
$(document).ready(function() {
this.scrollTabsBar.children().first().click();
}.bind(this));
},
/*
Handle click event on a tab.
Uses ‘rel’ attribute of each tab as an index to access
the class of the corresponding content area.
*/
clickTab: function(e) {
var active = $(e.currentTarget); // Clicked tab
var content_wrapper = this.$(‘.tabbed-box-content-group’); // wrapper for all content divs
this.stopScrolling();
this.determineClickScroll(active);
// Set new active tab
active.siblings().removeClass(‘active’);
active.addClass(‘active’);
// mark the new active tab
this.settings.set(‘activeTabIndexInternal’, this.scrollTabsBar.children().index(active));
this.settings.save();
// Set new active content
content_wrapper.children().hide();
content_wrapper.find(‘.’ + active.attr(‘rel’)).fadeIn();
this.determineHandlers();
// Stop propagation in case this is a nested tab app
e.stopPropagation();
},
// determines whether or not the two arrows (left and right scroll handlers) should be visible or not.
determineScrollability: function() {
var group = this.scrollTabsBar[0];
if (group.scrollWidth > group.clientWidth) {
this.$el.children().addClass(‘scrollable’);
this.determineHandlers();
} else {
this.$el.children().removeClass(‘scrollable’);
}
},
// determines whether or not the two arrows (left and right scroll handlers) should be active or not.
determineHandlers: function() {
var target = this.scrollTabsBar[0];
// left handler
if (target.scrollLeft != 0) {
this.scrollArrowLeft.addClass(‘active’);
} else {
this.scrollArrowLeft.removeClass(‘active’);
}
// right handler
if (target.scrollLeft + target.clientWidth < target.scrollWidth – 1) {
this.scrollArrowRight.addClass('active');
} else {
this.scrollArrowRight.removeClass('active');
}
},
// scrolls the tabs bar to the left.
scrollLeft: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowRight.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft -= Math.floor(factor);
factor *= 1.05;
if (scrollEl.scrollLeft == 0) {
view.stopScrolling();
}
}, 10);
},
// scrolls the tabs bar to the right.
scrollRight: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowLeft.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft += Math.floor(factor);
factor *= 1.05;
// forcefully stop the interval if it's not doing anything anymore
if (scrollEl.scrollLeft + scrollEl.clientWidth == scrollEl.scrollWidth) {
view.stopScrolling();
}
}, 10);
},
stopScrolling: function() {
clearInterval(this.scrollInterval);
this.determineHandlers();
},
determineClickScroll: function(active) {
// figure out where the element is, and if we need to change our view to show it
var scroll;
// determine where the element we're going to is in respect to the tabs bar
// 25px is the size of the scroll arrows
var leftSidePosition = active.position().left – 50;
var rightSidePosition = active.position().left + active.width() + 50;
// the gap is how much space we want there to be between the selected element
// when it's out of view, and we go to it.
var gap = 25;
if (this.scrollTabsBar.children().index(active) == 0) {
// this the first element, so define the scroll to be 0.
scroll = 0;
} else if (this.scrollTabsBar.children().index(active) == this.scrollTabsBar.children().length – 1) {
// this the last element, so define the scroll to be all the way to the right.
scroll = this.scrollTabsBar[0].scrollWidth – this.scrollTabsBar[0].clientWidth;
} else if (leftSidePosition this.scrollTabsBar.width()) {
// the right corner is out of view.
scroll = this.scrollTabsBar[0].scrollLeft + (rightSidePosition – this.scrollTabsBar.width()) + gap;
} else {
scroll = this.scrollTabsBar[0].scrollLeft;
}
// start scrolling
scroll = Math.floor(scroll);
var delta = scroll – this.scrollTabsBar[0].scrollLeft;
var startedDown = false;
if (delta != 0) {
clearInterval(this.scrollInterval);
var distance = 0;
var direction = (delta > 0 ? 1 : -1);
var speed = 1;
var factor = 1.25; // for parabolic acceleration
this.scrollInterval = setInterval(function() {
if (distance >= Math.abs(delta)) {
this.stopScrolling();
}
this.scrollTabsBar[0].scrollLeft += (Math.max(1, Math.floor(speed)) * direction);
distance += Math.max(1, Math.floor(speed));
if (distance * 2 >= Math.abs(delta)) { // if we’ve traversed more than half
if (factor == 1.25) { // 5/4
factor = 1; // 4/4
} else {
factor = 0.8; // 4/5
}
}
speed *= factor;
}.bind(this), 20);
}
}
});
return TabbedBox;
})();
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“tabs_each”:[{“tabs_index”:0},{“tabs_index”:1}],”activeTabIndexInternal_each”:[{“activeTabIndexInternal_index”:0}],”theme”:”s3d”,”tabs”:2,”active_tab”:”white”,”inactive_tab”:”#F7F7F7″,”border_color”:”#CCCCCC”,”activeTabIndexInternal”:1});
_Element.prototype.settings.page_element_id = “434342261772712145”;
_Element.prototype.element_id = “5a436b82-ae86-4b15-8d19-d0b8a625371c”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/135397292802228534-1.3.2/assets/”;
new _Element({
el: ‘#element-5a436b82-ae86-4b15-8d19-d0b8a625371c’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement434342261772712145();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement434342261772712145, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement434342261772712145();
}
});
}


Novato and North San Rafael

#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .border-box {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box {
position: relative;
margin: 20px 0;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box-tab-group {
font-size: 0;
margin: 0;
padding: 0;
float: left;
list-style: none;
height: 60px;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
white-space: nowrap;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box-tab {
margin: 0;
cursor: pointer;
height: 60px;
display: inline-block;
min-width: 19%;
position: relative;
background-color: #F7F7F7;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box-content-group {
clear: both;
float: left;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box-content {
padding: 40px 20px 40px 20px;
display: none;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .scrollArrow {
width: 25px;
background-color: white;
text-align: center;
position: absolute;
z-index: 3;
top: 0;
display: none;
cursor: pointer;
height: 60px;
line-height: 60px;
font-weight: bold;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .scrollArrow.scrollArrow-left {
left: 0;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .scrollArrow.scrollArrow-right {
right: 0;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box.scrollable .tabbed-box-tab-group {
border-bottom: none;
overflow-x: hidden;
overflow-y: hidden;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box.scrollable .tabbed-box-bar:hover .scrollArrow.active {
display: block;
}
@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3),only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2),only screen and (max-width: 499px) {
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box-tab-group {
overflow-x: scroll !important;
}
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard .tabbed-box-tab-group {
border-left: 1px solid #CCCCCC;
border-bottom: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard .tabbed-box-tab {
border: 1px solid #CCCCCC;
border-left: none;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard .tabbed-box-tab .paragraph {
color: #A8ABAC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard .tabbed-box-content-group {
border: 1px solid #CCCCCC;
border-top: none;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard.scrollable .tabbed-box-tab-group {
border-right: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard.scrollable .tabbed-box-tab-group .tabbed-box-tab:last-child {
border-right: none;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard.scrollable .scrollArrow-left {
border: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .standard.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line .tabbed-box-tab-group {
border: 1px solid #CCCCCC;
border-bottom: none;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line .tabbed-box-content-group {
border: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line.scrollable .tabbed-box-tab-group {
height: 61px;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line.scrollable .tabbed-box-content-group {
border-top: none;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line.scrollable .scrollArrow-left,
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .line.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
border-bottom: none;
border-top: none;
height: 61px;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .simple .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
height: 61px;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .simple .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .simple .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .simple .tabbed-box-content-group {
border-top: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .simple .tabbed-box-content {
padding: 20px 0px 20px 0px;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .simple .scrollArrow-left {
border-right: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .simple .scrollArrow-right {
border-left: 1px solid #CCCCCC;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .s3d-shadow {
-webkit-box-shadow: #f5f5f5;
-moz-box-shadow: #f5f5f5;
box-shadow: #f5f5f5;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .s3d-content-shadow {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .s3d .tabbed-box-tab .paragraph {
color: #A8ABAC;
background-color: #F7F7F7;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .s3d .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
-webkit-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
-moz-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .s3d .tabbed-box-tab.active .paragraph {
background-color: white;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .s3d .tabbed-box-content-group {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box-tab .paragraph {
padding: 0px;
line-height: 60px !important;
text-align: center !important;
font-weight: bold;
font-size: 16px !important;
margin: 0 20px;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box-content .paragraph {
padding: 0;
line-height: 30px;
}
#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5 .tabbed-box-tab:last-child .w-delete-outer {
display: none;
position: relative;
float: right;
}

  • Route 49
  • Shuttle Routes
<
>

Route 49 will have the same route alignment, but it will see a return of weekend and holiday service, operating hourly from 7am to 9pm. On top of that, weekday frequency will be improved from hourly to every 30 minutes during peak periods. However, the span of service will be reduced from 6am to 8pm to 6am to 7pm (first trip at 6:15am from San Rafael, last trip at 6:15pm).
There will be a few tweaks with the shuttle services serving Novato:

  • Route 251 (San Marin-Hamilton via Vintage Oaks) will see a reduction of its night trips, in which weekday trips leaving at 7:43pm, 8:43pm, and 9:43pm will be eliminated, while the last southbound trip weekends and holidays currently departing at 10:16pm will be axed. Also, instead of just serving the Hamilton Theatre after serving Hamilton-Meadow Park School, it will also serve the Marin Airporter and Sunny Cove Dr/Chapel Hill Dr stops on Hamilton Parkway as a one-way loop to the Theatre and Main Gate Road.
  • Route 257 will be rerouted to operate via Marinwood Avenue and Miller Creek Middle School (along Las Gallinas Avenue) instead of Smith Ranch Road and Marin County EDD. 
  • Route 259 will be discontinued and will be replaced by daily service on Route 49. Other alternate routes include Routes 35, 54 (Golden Gate), 245, and 257, depending on the portion of the route.
Route 251 service span:
Hourly service, with flexible service (call ahead) to and from Novato Community Hospital.

  • Weekdays: 6:30am to 7pm
  • Weekends and Holidays: 8am to 10pm

Route 257 service span:
Hourly service weekdays only

  • Northbound: 7:30am to 9:30pm
  • Southbound: 6:30am to 10:30pm

function setupElement227769992690811383() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “135397292802228534-1.3.2”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var TabbedBox = PlatformElement.extend({
events: {
‘click .tabbed-box-tab’: ‘clickTab’,
// in case they type and that causes an overflow, we should determine scrollability here
‘keyup .tabbed-box-tab .paragraph’: ‘determineScrollability’,
‘mousedown .scrollArrow-left’: ‘scrollLeft’,
‘mousedown .scrollArrow-right’: ‘scrollRight’,
‘touchstart .scrollArrow-left’: ‘scrollLeft’,
‘touchstart .scrollArrow-right’: ‘scrollRight’
},
initialize: function() {
var view = this;
var tabs = this.$(‘.tabbed-box-tab’);
var content = this.$(‘.tabbed-box-content’);
// optimization
this.scrollArrowLeft = this.$(‘.scrollArrow-left’);
this.scrollArrowRight = this.$(‘.scrollArrow-right’);
this.scrollTabsBar = this.$(‘.tabbed-box-tab-group’);
// resize handler and mouseup handler
// since we want to be able to handle mouseup wherever the user releases (not just over the element)
// we set it here as a property of the window.
$(window).resize(function() {
this.determineScrollability();
}.bind(this)).on(‘mouseup touchend’, function() {
this.stopScrolling();
}.bind(this));
// since scroll events don’t propagate up, we have to bind it here as opposed to in the events object
this.$(‘.tabbed-box-tab-group’).scroll(function() {
this.determineHandlers();
}.bind(this));
// determine whether or not we should show the scroll handlers
this.determineScrollability();
// load the first tab.
$(document).ready(function() {
this.scrollTabsBar.children().first().click();
}.bind(this));
},
/*
Handle click event on a tab.
Uses ‘rel’ attribute of each tab as an index to access
the class of the corresponding content area.
*/
clickTab: function(e) {
var active = $(e.currentTarget); // Clicked tab
var content_wrapper = this.$(‘.tabbed-box-content-group’); // wrapper for all content divs
this.stopScrolling();
this.determineClickScroll(active);
// Set new active tab
active.siblings().removeClass(‘active’);
active.addClass(‘active’);
// mark the new active tab
this.settings.set(‘activeTabIndexInternal’, this.scrollTabsBar.children().index(active));
this.settings.save();
// Set new active content
content_wrapper.children().hide();
content_wrapper.find(‘.’ + active.attr(‘rel’)).fadeIn();
this.determineHandlers();
// Stop propagation in case this is a nested tab app
e.stopPropagation();
},
// determines whether or not the two arrows (left and right scroll handlers) should be visible or not.
determineScrollability: function() {
var group = this.scrollTabsBar[0];
if (group.scrollWidth > group.clientWidth) {
this.$el.children().addClass(‘scrollable’);
this.determineHandlers();
} else {
this.$el.children().removeClass(‘scrollable’);
}
},
// determines whether or not the two arrows (left and right scroll handlers) should be active or not.
determineHandlers: function() {
var target = this.scrollTabsBar[0];
// left handler
if (target.scrollLeft != 0) {
this.scrollArrowLeft.addClass(‘active’);
} else {
this.scrollArrowLeft.removeClass(‘active’);
}
// right handler
if (target.scrollLeft + target.clientWidth < target.scrollWidth – 1) {
this.scrollArrowRight.addClass('active');
} else {
this.scrollArrowRight.removeClass('active');
}
},
// scrolls the tabs bar to the left.
scrollLeft: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowRight.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft -= Math.floor(factor);
factor *= 1.05;
if (scrollEl.scrollLeft == 0) {
view.stopScrolling();
}
}, 10);
},
// scrolls the tabs bar to the right.
scrollRight: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowLeft.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft += Math.floor(factor);
factor *= 1.05;
// forcefully stop the interval if it's not doing anything anymore
if (scrollEl.scrollLeft + scrollEl.clientWidth == scrollEl.scrollWidth) {
view.stopScrolling();
}
}, 10);
},
stopScrolling: function() {
clearInterval(this.scrollInterval);
this.determineHandlers();
},
determineClickScroll: function(active) {
// figure out where the element is, and if we need to change our view to show it
var scroll;
// determine where the element we're going to is in respect to the tabs bar
// 25px is the size of the scroll arrows
var leftSidePosition = active.position().left – 50;
var rightSidePosition = active.position().left + active.width() + 50;
// the gap is how much space we want there to be between the selected element
// when it's out of view, and we go to it.
var gap = 25;
if (this.scrollTabsBar.children().index(active) == 0) {
// this the first element, so define the scroll to be 0.
scroll = 0;
} else if (this.scrollTabsBar.children().index(active) == this.scrollTabsBar.children().length – 1) {
// this the last element, so define the scroll to be all the way to the right.
scroll = this.scrollTabsBar[0].scrollWidth – this.scrollTabsBar[0].clientWidth;
} else if (leftSidePosition this.scrollTabsBar.width()) {
// the right corner is out of view.
scroll = this.scrollTabsBar[0].scrollLeft + (rightSidePosition – this.scrollTabsBar.width()) + gap;
} else {
scroll = this.scrollTabsBar[0].scrollLeft;
}
// start scrolling
scroll = Math.floor(scroll);
var delta = scroll – this.scrollTabsBar[0].scrollLeft;
var startedDown = false;
if (delta != 0) {
clearInterval(this.scrollInterval);
var distance = 0;
var direction = (delta > 0 ? 1 : -1);
var speed = 1;
var factor = 1.25; // for parabolic acceleration
this.scrollInterval = setInterval(function() {
if (distance >= Math.abs(delta)) {
this.stopScrolling();
}
this.scrollTabsBar[0].scrollLeft += (Math.max(1, Math.floor(speed)) * direction);
distance += Math.max(1, Math.floor(speed));
if (distance * 2 >= Math.abs(delta)) { // if we’ve traversed more than half
if (factor == 1.25) { // 5/4
factor = 1; // 4/4
} else {
factor = 0.8; // 4/5
}
}
speed *= factor;
}.bind(this), 20);
}
}
});
return TabbedBox;
})();
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“tabs_each”:[{“tabs_index”:0},{“tabs_index”:1}],”theme”:”s3d”,”tabs”:2,”active_tab”:”white”,”inactive_tab”:”#F7F7F7″,”border_color”:”#CCCCCC”,”activeTabIndexInternal”:0});
_Element.prototype.settings.page_element_id = “227769992690811383”;
_Element.prototype.element_id = “68909b15-61a6-4ebe-83ad-f4d8672f0cb5”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/135397292802228534-1.3.2/assets/”;
new _Element({
el: ‘#element-68909b15-61a6-4ebe-83ad-f4d8672f0cb5’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement227769992690811383();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement227769992690811383, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement227769992690811383();
}
});
}


​With Route 259 being on the chopping block, Route 257 no longer serving Smith Ranch Road, and Route 49 will see a shorter span of service, those are things that I detest for several reasons:

  • Novato has been constantly short-changed on adequate transit service, especially on localized services from San Rafael, such that the freeway services seem to be given a higher priority than providing a balance between both trunkline and localized services.
  • An early end of service along South Novato Boulevard would force passengers to transfer either at Hamilton (for the longer Route 251) or Ignacio (for the hit-or-miss Route 54) just to get to where residents along that major corridor need to go.
  • A shorter span of service on the Route 49 would eventually compromise residents, not just in Hamilton, but also along South Novato Boulevard in that a much shorter night service would be detrimental to the agency’s goals of lessening reliance on the automobile and better accessibility to residents living beyond the US-101 corridor.

South Marin County (Sausalito, Mill Valley, and Strawberry)

#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .border-box {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box {
position: relative;
margin: 20px 0;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box-tab-group {
font-size: 0;
margin: 0;
padding: 0;
float: left;
list-style: none;
height: 60px;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
white-space: nowrap;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box-tab {
margin: 0;
cursor: pointer;
height: 60px;
display: inline-block;
min-width: 19%;
position: relative;
background-color: #F7F7F7;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box-content-group {
clear: both;
float: left;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box-content {
padding: 40px 20px 40px 20px;
display: none;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .scrollArrow {
width: 25px;
background-color: white;
text-align: center;
position: absolute;
z-index: 3;
top: 0;
display: none;
cursor: pointer;
height: 60px;
line-height: 60px;
font-weight: bold;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .scrollArrow.scrollArrow-left {
left: 0;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .scrollArrow.scrollArrow-right {
right: 0;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box.scrollable .tabbed-box-tab-group {
border-bottom: none;
overflow-x: hidden;
overflow-y: hidden;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box.scrollable .tabbed-box-bar:hover .scrollArrow.active {
display: block;
}
@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3),only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2),only screen and (max-width: 499px) {
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box-tab-group {
overflow-x: scroll !important;
}
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard .tabbed-box-tab-group {
border-left: 1px solid #CCCCCC;
border-bottom: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard .tabbed-box-tab {
border: 1px solid #CCCCCC;
border-left: none;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard .tabbed-box-tab .paragraph {
color: #A8ABAC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard .tabbed-box-content-group {
border: 1px solid #CCCCCC;
border-top: none;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard.scrollable .tabbed-box-tab-group {
border-right: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard.scrollable .tabbed-box-tab-group .tabbed-box-tab:last-child {
border-right: none;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard.scrollable .scrollArrow-left {
border: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .standard.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line .tabbed-box-tab-group {
border: 1px solid #CCCCCC;
border-bottom: none;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line .tabbed-box-content-group {
border: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line.scrollable .tabbed-box-tab-group {
height: 61px;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line.scrollable .tabbed-box-content-group {
border-top: none;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line.scrollable .scrollArrow-left,
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .line.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
border-bottom: none;
border-top: none;
height: 61px;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .simple .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
height: 61px;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .simple .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .simple .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .simple .tabbed-box-content-group {
border-top: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .simple .tabbed-box-content {
padding: 20px 0px 20px 0px;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .simple .scrollArrow-left {
border-right: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .simple .scrollArrow-right {
border-left: 1px solid #CCCCCC;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .s3d-shadow {
-webkit-box-shadow: #f5f5f5;
-moz-box-shadow: #f5f5f5;
box-shadow: #f5f5f5;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .s3d-content-shadow {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .s3d .tabbed-box-tab .paragraph {
color: #A8ABAC;
background-color: #F7F7F7;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .s3d .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
-webkit-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
-moz-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .s3d .tabbed-box-tab.active .paragraph {
background-color: white;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .s3d .tabbed-box-content-group {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box-tab .paragraph {
padding: 0px;
line-height: 60px !important;
text-align: center !important;
font-weight: bold;
font-size: 16px !important;
margin: 0 20px;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box-content .paragraph {
padding: 0;
line-height: 30px;
}
#element-89a71a98-7270-4fd2-98f6-9d46191961b0 .tabbed-box-tab:last-child .w-delete-outer {
display: none;
position: relative;
float: right;
}

  • Route 22
  • Route 71
  • Golden Gate Transit
<
>

Route 22 will see additional trips in the mornings as more trips leaving at 6, 6:30, and 7am from San Rafael Transit Center will be introduced (and these will not be tagged anymore to Golden Gate Transit’s Route 18, as it has been done for many years). However, nighttime schedules are shifted as the last northbound trip leaving Marin City at around 11pm will be axed, while an additional southbound trip at 10pm from San Rafael will be introduced.
Route 71 will become a limited-stop service, spanning almost the entire US-101 corridor in Marin County from Novato to Sausalito. It will make the following stops:

  • Local service in Downtown Novato
  • De Long Avenue bus pad
  • Rowland Blvd bus pad
  • Ignacio Blvd bus pad (Enfrente & Salvatore)
  • San Rafael Transit Center
  • Tiburon Wye bus pad
  • Seminary Drive bus pad
  • Marin City (Donahue & Terners)
  • Local service along Broadway to Sausalito Ferry
Route 71 service span:

  • Weekdays: 6:30am to 8pm, hourly service (every 30 minutes peaks)
  • No weekend or holiday service

Golden Gate Transit now has a plan to eliminate the Route 10, which does San Francisco to Strawberry via Marin City, and replace it with the Route 30, which will emulate the 10 until Marin City and will serve US-101 bus pads until San Rafael Transit Center. As a result:

  • Riders using the 10 to access San Francisco Civic Center and Van Ness Avenue from Strawberry will now have to use Route 4 and transfer at the Golden Gate Bridge Toll Plaza for the Routes 30, 70, 93 (peak periods only), or 101
  • Similarly, riders from Tam Valley will now have to get the Route 4 at either Tam Junction or Manzanita Park-and-Ride to get to San Francisco and transfer at the Toll Plaza for the 30, 70, 93 (peak periods only), or 101

Also, as a result of this pending service adjustment, service on Route 70 will be reduced to hourly headways instead of every 30 minutes, as more services will be provided on Routes 35, 49, and 71 north of San Rafael, and Routes 17, 36, and 71 south of San Rafael.

Route 30 Service Span:

  • Every 60 minutes
  • Departs at :30 past from San Rafael TC
  • Departs at :50 past southbound, :35 past northbound from Marin City

Route 70 Service Span:

  • Every 60 minutes
  • Departs at :00 southbound, :30 past northbound from San Rafael TC
  • Departs at :20 past southbound, :05 past northbound from Marin City

function setupElement228569752995406727() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “135397292802228534-1.3.2”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var TabbedBox = PlatformElement.extend({
events: {
‘click .tabbed-box-tab’: ‘clickTab’,
// in case they type and that causes an overflow, we should determine scrollability here
‘keyup .tabbed-box-tab .paragraph’: ‘determineScrollability’,
‘mousedown .scrollArrow-left’: ‘scrollLeft’,
‘mousedown .scrollArrow-right’: ‘scrollRight’,
‘touchstart .scrollArrow-left’: ‘scrollLeft’,
‘touchstart .scrollArrow-right’: ‘scrollRight’
},
initialize: function() {
var view = this;
var tabs = this.$(‘.tabbed-box-tab’);
var content = this.$(‘.tabbed-box-content’);
// optimization
this.scrollArrowLeft = this.$(‘.scrollArrow-left’);
this.scrollArrowRight = this.$(‘.scrollArrow-right’);
this.scrollTabsBar = this.$(‘.tabbed-box-tab-group’);
// resize handler and mouseup handler
// since we want to be able to handle mouseup wherever the user releases (not just over the element)
// we set it here as a property of the window.
$(window).resize(function() {
this.determineScrollability();
}.bind(this)).on(‘mouseup touchend’, function() {
this.stopScrolling();
}.bind(this));
// since scroll events don’t propagate up, we have to bind it here as opposed to in the events object
this.$(‘.tabbed-box-tab-group’).scroll(function() {
this.determineHandlers();
}.bind(this));
// determine whether or not we should show the scroll handlers
this.determineScrollability();
// load the first tab.
$(document).ready(function() {
this.scrollTabsBar.children().first().click();
}.bind(this));
},
/*
Handle click event on a tab.
Uses ‘rel’ attribute of each tab as an index to access
the class of the corresponding content area.
*/
clickTab: function(e) {
var active = $(e.currentTarget); // Clicked tab
var content_wrapper = this.$(‘.tabbed-box-content-group’); // wrapper for all content divs
this.stopScrolling();
this.determineClickScroll(active);
// Set new active tab
active.siblings().removeClass(‘active’);
active.addClass(‘active’);
// mark the new active tab
this.settings.set(‘activeTabIndexInternal’, this.scrollTabsBar.children().index(active));
this.settings.save();
// Set new active content
content_wrapper.children().hide();
content_wrapper.find(‘.’ + active.attr(‘rel’)).fadeIn();
this.determineHandlers();
// Stop propagation in case this is a nested tab app
e.stopPropagation();
},
// determines whether or not the two arrows (left and right scroll handlers) should be visible or not.
determineScrollability: function() {
var group = this.scrollTabsBar[0];
if (group.scrollWidth > group.clientWidth) {
this.$el.children().addClass(‘scrollable’);
this.determineHandlers();
} else {
this.$el.children().removeClass(‘scrollable’);
}
},
// determines whether or not the two arrows (left and right scroll handlers) should be active or not.
determineHandlers: function() {
var target = this.scrollTabsBar[0];
// left handler
if (target.scrollLeft != 0) {
this.scrollArrowLeft.addClass(‘active’);
} else {
this.scrollArrowLeft.removeClass(‘active’);
}
// right handler
if (target.scrollLeft + target.clientWidth < target.scrollWidth – 1) {
this.scrollArrowRight.addClass('active');
} else {
this.scrollArrowRight.removeClass('active');
}
},
// scrolls the tabs bar to the left.
scrollLeft: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowRight.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft -= Math.floor(factor);
factor *= 1.05;
if (scrollEl.scrollLeft == 0) {
view.stopScrolling();
}
}, 10);
},
// scrolls the tabs bar to the right.
scrollRight: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowLeft.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft += Math.floor(factor);
factor *= 1.05;
// forcefully stop the interval if it's not doing anything anymore
if (scrollEl.scrollLeft + scrollEl.clientWidth == scrollEl.scrollWidth) {
view.stopScrolling();
}
}, 10);
},
stopScrolling: function() {
clearInterval(this.scrollInterval);
this.determineHandlers();
},
determineClickScroll: function(active) {
// figure out where the element is, and if we need to change our view to show it
var scroll;
// determine where the element we're going to is in respect to the tabs bar
// 25px is the size of the scroll arrows
var leftSidePosition = active.position().left – 50;
var rightSidePosition = active.position().left + active.width() + 50;
// the gap is how much space we want there to be between the selected element
// when it's out of view, and we go to it.
var gap = 25;
if (this.scrollTabsBar.children().index(active) == 0) {
// this the first element, so define the scroll to be 0.
scroll = 0;
} else if (this.scrollTabsBar.children().index(active) == this.scrollTabsBar.children().length – 1) {
// this the last element, so define the scroll to be all the way to the right.
scroll = this.scrollTabsBar[0].scrollWidth – this.scrollTabsBar[0].clientWidth;
} else if (leftSidePosition this.scrollTabsBar.width()) {
// the right corner is out of view.
scroll = this.scrollTabsBar[0].scrollLeft + (rightSidePosition – this.scrollTabsBar.width()) + gap;
} else {
scroll = this.scrollTabsBar[0].scrollLeft;
}
// start scrolling
scroll = Math.floor(scroll);
var delta = scroll – this.scrollTabsBar[0].scrollLeft;
var startedDown = false;
if (delta != 0) {
clearInterval(this.scrollInterval);
var distance = 0;
var direction = (delta > 0 ? 1 : -1);
var speed = 1;
var factor = 1.25; // for parabolic acceleration
this.scrollInterval = setInterval(function() {
if (distance >= Math.abs(delta)) {
this.stopScrolling();
}
this.scrollTabsBar[0].scrollLeft += (Math.max(1, Math.floor(speed)) * direction);
distance += Math.max(1, Math.floor(speed));
if (distance * 2 >= Math.abs(delta)) { // if we’ve traversed more than half
if (factor == 1.25) { // 5/4
factor = 1; // 4/4
} else {
factor = 0.8; // 4/5
}
}
speed *= factor;
}.bind(this), 20);
}
}
});
return TabbedBox;
})();
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“tabs_each”:[{“tabs_index”:0},{“tabs_index”:1},{“tabs_index”:2}],”theme”:”s3d”,”tabs”:3,”active_tab”:”white”,”inactive_tab”:”#F7F7F7″,”border_color”:”#CCCCCC”,”activeTabIndexInternal”:0});
_Element.prototype.settings.page_element_id = “228569752995406727”;
_Element.prototype.element_id = “89a71a98-7270-4fd2-98f6-9d46191961b0”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/135397292802228534-1.3.2/assets/”;
new _Element({
el: ‘#element-89a71a98-7270-4fd2-98f6-9d46191961b0’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement228569752995406727();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement228569752995406727, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement228569752995406727();
}
});
}


Central Marin and Sir Francis Drake Corridor

Perhaps the most aggressive changes are still to be found along Sir Francis Drake Boulevard and the Miracle Mile (Fourth Street) in central Marin County wherein a massive shift of services will be pursued.  

#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .border-box {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box {
position: relative;
margin: 20px 0;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box-tab-group {
font-size: 0;
margin: 0;
padding: 0;
float: left;
list-style: none;
height: 60px;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
white-space: nowrap;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box-tab {
margin: 0;
cursor: pointer;
height: 60px;
display: inline-block;
min-width: 19%;
position: relative;
background-color: #F7F7F7;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box-content-group {
clear: both;
float: left;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box-content {
padding: 40px 20px 40px 20px;
display: none;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .scrollArrow {
width: 25px;
background-color: white;
text-align: center;
position: absolute;
z-index: 3;
top: 0;
display: none;
cursor: pointer;
height: 60px;
line-height: 60px;
font-weight: bold;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .scrollArrow.scrollArrow-left {
left: 0;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .scrollArrow.scrollArrow-right {
right: 0;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box.scrollable .tabbed-box-tab-group {
border-bottom: none;
overflow-x: hidden;
overflow-y: hidden;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box.scrollable .tabbed-box-bar:hover .scrollArrow.active {
display: block;
}
@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3),only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2),only screen and (max-width: 499px) {
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box-tab-group {
overflow-x: scroll !important;
}
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard .tabbed-box-tab-group {
border-left: 1px solid #CCCCCC;
border-bottom: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard .tabbed-box-tab {
border: 1px solid #CCCCCC;
border-left: none;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard .tabbed-box-tab .paragraph {
color: #A8ABAC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard .tabbed-box-content-group {
border: 1px solid #CCCCCC;
border-top: none;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard.scrollable .tabbed-box-tab-group {
border-right: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard.scrollable .tabbed-box-tab-group .tabbed-box-tab:last-child {
border-right: none;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard.scrollable .scrollArrow-left {
border: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .standard.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line .tabbed-box-tab-group {
border: 1px solid #CCCCCC;
border-bottom: none;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line .tabbed-box-content-group {
border: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line.scrollable .tabbed-box-tab-group {
height: 61px;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line.scrollable .tabbed-box-content-group {
border-top: none;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line.scrollable .scrollArrow-left,
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .line.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
border-bottom: none;
border-top: none;
height: 61px;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .simple .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
height: 61px;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .simple .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .simple .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .simple .tabbed-box-content-group {
border-top: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .simple .tabbed-box-content {
padding: 20px 0px 20px 0px;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .simple .scrollArrow-left {
border-right: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .simple .scrollArrow-right {
border-left: 1px solid #CCCCCC;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .s3d-shadow {
-webkit-box-shadow: #f5f5f5;
-moz-box-shadow: #f5f5f5;
box-shadow: #f5f5f5;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .s3d-content-shadow {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .s3d .tabbed-box-tab .paragraph {
color: #A8ABAC;
background-color: #F7F7F7;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .s3d .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
-webkit-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
-moz-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .s3d .tabbed-box-tab.active .paragraph {
background-color: white;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .s3d .tabbed-box-content-group {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box-tab .paragraph {
padding: 0px;
line-height: 60px !important;
text-align: center !important;
font-weight: bold;
font-size: 16px !important;
margin: 0 20px;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box-content .paragraph {
padding: 0;
line-height: 30px;
}
#element-1fff1a32-056a-40d8-8348-3b05a1f6162b .tabbed-box-tab:last-child .w-delete-outer {
display: none;
position: relative;
float: right;
}

  • Routes 23, 23X, and 68
  • Route 228
  • Route 29
<
>

The Sir Francis Drake and Miracle Mile corridors will see more service, especially west of San Anselmo and east of San Rafael TC.

  • The new Route 23X will operate weekday peaks only between the Canal District in San Rafael and Fairfax Manor via San Rafael Transit Center. The express portion will be between San Rafael TC and San Anselmo Hub, utilizing Second and Third Streets, bypassing a total of seven stops each way. And in the Canal District, the service will loop clockwise (from Francisco Blvd E, it will turn to Medway Blvd, Canal Street, Kerner Street, and Bellam Blvd before returning to Francisco Blvd E), similar to how the eastbound Routes 23 and 29 are done today.
  • The local Route 23 will still be truncated to operate up to Downtown Fairfax only, similar to its weekend counterpart, to unify service. As a result, service to Fairfax Manor will be covered by expanding Route 228 from weekends only to daily service, and by West Marin Stagecoach Route 68.

​Personal insight: when I personally attended one of Marin Transit’s focus groups earlier this month, a small contingent from Fairfax Manor complained about the unreliability of Route 68, especially that it starts way further west in Inverness, making it unpredictable when the bus will arrive at Manor.

Picture

Introducing West Marin Stagecoach’s newest vehicle, an El Dorado National XHF 30-footer bus (no. 301), doing the westbound 68 to Inverness.
Route 23 service span:
Hourly service, with one extra trip school days

  • Weekdays: 5:45am to 10:45pm, departures from San Rafael at :15 past the hour
  • Weekends & Holidays: 6:45am to 9:45pm, departures from San Rafael at :30 past the hour

Route 23X service span:
Hourly service, weekday peak periods only, no weekends or holidays, departures from San Rafael at :30 past the hour

  • Eastbound: 6am to 9:45am, 3pm to 7:30pm
  • Westbound: 6:15am to 9:45am, 3pm to 7pm
Route 228 will start serving more of Bon Air south of Marin General Hospital and west of Bon Air Shopping Center to serve the medical clinics and residential areas along S Eliseo Avenue and environs while maintaining its overall route alignment between San Rafael Transit Center and Fairfax Manor via Sir Francis Drake Blvd and Larkspur Landing.
The massive changes on Route 29 will still be pursued as it will further reduce service from all-day on weekdays to weekday peaks only, and service will be cut along Andersen Drive and Sir Francis Drake Blvd west of College of Marin. Furthermore, the Canal loop will be similar to its eastbound service; instead of going towards Andersen Drive, however, it will return to San Rafael Transit Center via Francisco Blvd E. Finally, south of San Rafael, it will serve Larkspur Landing, Bon Air Shopping Center, College of Marin, and Marin General Hospital before returning to Larkspur Landing and San Rafael.
Route 29 service span:
Weekday peak periods only, hourly service, with departures from San Rafael on the hour

  • AM Peak: 6:30am to 10am
  • PM Peak: 2pm to 9pm

function setupElement771003897565901856() {
var elementRequire = require || _wAMD.require;
elementRequire([
‘jquery’,
‘underscore’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
$,
_,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “135397292802228534-1.3.2”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var TabbedBox = PlatformElement.extend({
events: {
‘click .tabbed-box-tab’: ‘clickTab’,
// in case they type and that causes an overflow, we should determine scrollability here
‘keyup .tabbed-box-tab .paragraph’: ‘determineScrollability’,
‘mousedown .scrollArrow-left’: ‘scrollLeft’,
‘mousedown .scrollArrow-right’: ‘scrollRight’,
‘touchstart .scrollArrow-left’: ‘scrollLeft’,
‘touchstart .scrollArrow-right’: ‘scrollRight’
},
initialize: function() {
var view = this;
var tabs = this.$(‘.tabbed-box-tab’);
var content = this.$(‘.tabbed-box-content’);
// optimization
this.scrollArrowLeft = this.$(‘.scrollArrow-left’);
this.scrollArrowRight = this.$(‘.scrollArrow-right’);
this.scrollTabsBar = this.$(‘.tabbed-box-tab-group’);
// resize handler and mouseup handler
// since we want to be able to handle mouseup wherever the user releases (not just over the element)
// we set it here as a property of the window.
$(window).resize(function() {
this.determineScrollability();
}.bind(this)).on(‘mouseup touchend’, function() {
this.stopScrolling();
}.bind(this));
// since scroll events don’t propagate up, we have to bind it here as opposed to in the events object
this.$(‘.tabbed-box-tab-group’).scroll(function() {
this.determineHandlers();
}.bind(this));
// determine whether or not we should show the scroll handlers
this.determineScrollability();
// load the first tab.
$(document).ready(function() {
this.scrollTabsBar.children().first().click();
}.bind(this));
},
/*
Handle click event on a tab.
Uses ‘rel’ attribute of each tab as an index to access
the class of the corresponding content area.
*/
clickTab: function(e) {
var active = $(e.currentTarget); // Clicked tab
var content_wrapper = this.$(‘.tabbed-box-content-group’); // wrapper for all content divs
this.stopScrolling();
this.determineClickScroll(active);
// Set new active tab
active.siblings().removeClass(‘active’);
active.addClass(‘active’);
// mark the new active tab
this.settings.set(‘activeTabIndexInternal’, this.scrollTabsBar.children().index(active));
this.settings.save();
// Set new active content
content_wrapper.children().hide();
content_wrapper.find(‘.’ + active.attr(‘rel’)).fadeIn();
this.determineHandlers();
// Stop propagation in case this is a nested tab app
e.stopPropagation();
},
// determines whether or not the two arrows (left and right scroll handlers) should be visible or not.
determineScrollability: function() {
var group = this.scrollTabsBar[0];
if (group.scrollWidth > group.clientWidth) {
this.$el.children().addClass(‘scrollable’);
this.determineHandlers();
} else {
this.$el.children().removeClass(‘scrollable’);
}
},
// determines whether or not the two arrows (left and right scroll handlers) should be active or not.
determineHandlers: function() {
var target = this.scrollTabsBar[0];
// left handler
if (target.scrollLeft != 0) {
this.scrollArrowLeft.addClass(‘active’);
} else {
this.scrollArrowLeft.removeClass(‘active’);
}
// right handler
if (target.scrollLeft + target.clientWidth < target.scrollWidth – 1) {
this.scrollArrowRight.addClass('active');
} else {
this.scrollArrowRight.removeClass('active');
}
},
// scrolls the tabs bar to the left.
scrollLeft: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowRight.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft -= Math.floor(factor);
factor *= 1.05;
if (scrollEl.scrollLeft == 0) {
view.stopScrolling();
}
}, 10);
},
// scrolls the tabs bar to the right.
scrollRight: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowLeft.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft += Math.floor(factor);
factor *= 1.05;
// forcefully stop the interval if it's not doing anything anymore
if (scrollEl.scrollLeft + scrollEl.clientWidth == scrollEl.scrollWidth) {
view.stopScrolling();
}
}, 10);
},
stopScrolling: function() {
clearInterval(this.scrollInterval);
this.determineHandlers();
},
determineClickScroll: function(active) {
// figure out where the element is, and if we need to change our view to show it
var scroll;
// determine where the element we're going to is in respect to the tabs bar
// 25px is the size of the scroll arrows
var leftSidePosition = active.position().left – 50;
var rightSidePosition = active.position().left + active.width() + 50;
// the gap is how much space we want there to be between the selected element
// when it's out of view, and we go to it.
var gap = 25;
if (this.scrollTabsBar.children().index(active) == 0) {
// this the first element, so define the scroll to be 0.
scroll = 0;
} else if (this.scrollTabsBar.children().index(active) == this.scrollTabsBar.children().length – 1) {
// this the last element, so define the scroll to be all the way to the right.
scroll = this.scrollTabsBar[0].scrollWidth – this.scrollTabsBar[0].clientWidth;
} else if (leftSidePosition this.scrollTabsBar.width()) {
// the right corner is out of view.
scroll = this.scrollTabsBar[0].scrollLeft + (rightSidePosition – this.scrollTabsBar.width()) + gap;
} else {
scroll = this.scrollTabsBar[0].scrollLeft;
}
// start scrolling
scroll = Math.floor(scroll);
var delta = scroll – this.scrollTabsBar[0].scrollLeft;
var startedDown = false;
if (delta != 0) {
clearInterval(this.scrollInterval);
var distance = 0;
var direction = (delta > 0 ? 1 : -1);
var speed = 1;
var factor = 1.25; // for parabolic acceleration
this.scrollInterval = setInterval(function() {
if (distance >= Math.abs(delta)) {
this.stopScrolling();
}
this.scrollTabsBar[0].scrollLeft += (Math.max(1, Math.floor(speed)) * direction);
distance += Math.max(1, Math.floor(speed));
if (distance * 2 >= Math.abs(delta)) { // if we’ve traversed more than half
if (factor == 1.25) { // 5/4
factor = 1; // 4/4
} else {
factor = 0.8; // 4/5
}
}
speed *= factor;
}.bind(this), 20);
}
}
});
return TabbedBox;
})();
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“tabs_each”:[{“tabs_index”:0},{“tabs_index”:1},{“tabs_index”:2}],”activeTabIndexInternal_each”:[{“activeTabIndexInternal_index”:0},{“activeTabIndexInternal_index”:1}],”theme”:”s3d”,”tabs”:3,”active_tab”:”white”,”inactive_tab”:”#F7F7F7″,”border_color”:”#CCCCCC”,”activeTabIndexInternal”:2});
_Element.prototype.settings.page_element_id = “771003897565901856”;
_Element.prototype.element_id = “1fff1a32-056a-40d8-8348-3b05a1f6162b”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/135397292802228534-1.3.2/assets/”;
new _Element({
el: ‘#element-1fff1a32-056a-40d8-8348-3b05a1f6162b’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement771003897565901856();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement771003897565901856, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement771003897565901856();
}
});
}


With the final vote by the Marin County Board of Supervisors coming closer on 28 March 2016, I have the following recommendations for Marin Transit to reconsider prior to adopting the service changes due in June 2016:

  • Reconsider maintaining the last trip on the Route 49 weekdays at 7:15pm, if not adding one last trip at 8:15pm, to mimic current service levels provided by the dual Routes 49 and 259 and allow workers to walk less to the freeway stops (current last NB trip with Route 259 gets to Northgate Mall by 9pm; last SB trip through Northgate with 259 arrives Northgate Mall by 10:45pm).
  • Consider adjusting service on the Route 228 to serve Andersen Drive and Lindaro Street as Golden Gate Transit’s Route 580 only serves the area five times a day weekday peaks only (westbound AM, eastbound PM). Should this be pursued, additional trip times of up to 15 minutes per way will have to be made, especially during the PM peak.
  • Adjust services on the upcoming Route 245 and existing Route 257 so that Marinwood can be served daily (on Route 245) and allow more people from Novato to access Smith Ranch Road and the Marin County EDD at least on the weekdays (on Route 257). I even have devised my own schedule plan that interlines Routes 228 and 245 so that services from as far north as Marinwood and far west as Fairfax Manor can be covered on a daily basis (and will ultimately require three vehicles total, even during weekday peaks).
  • Continue monitoring ridership west of Fairfax to see whether keeping big bus service up to Fairfax Manor can still be warranted. If not, allow Route 68 to provide replacement big bus service, in which Marin Transit should consider adding one or two more 30-footer heavy duty buses to augment its existing heavy-duty van fleet (considering the fact that the Federal lifespan for buses stands at 12 years, compared to 7 for cutaway vans).

Perhaps a most radical idea would be this: if Marin Transit is bold enough to handle congestion issues along the following corridors with Marin Transit and Golden Gate Transit bus lines:

  • AM peak: southbound US-101 from Atherton Avenue to N San Pedro Road, eastbound Sir Francis Drake Blvd from Downtown Fairfax to Greenbrae
  • PM peak: northbound US-101 from Spencer Avenue to I-580, eastbound Sir Francis Drake Blvd from US-101 to I-580, eastbound Second Street in San Rafael from E Street to Irwin Street

It should work with Transportation Authority of Marin (TAM) to address congestion concerns to allow faster, more reliable transit service along those corridors. 


Additional resources available below:

Marin Transit 2016 Proposed Changes

Golden Gate Transit June 2016 Proposed Changes

Coalition for a Livable Marin (CALM)

Leave a Reply

Top