Advertisement
  1. Code
  2. PHP
  3. Yii

Building Your Startup: Improving the Mobile Web

Scroll to top
Read Time: 17 min
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: The Dashboard Foundation
Building Your Startup: Issue Tracking and Feature Planning
Final product imageFinal product imageFinal product image
What You'll Be Creating

This tutorial is part of the Building Your Startup With PHP series on Envato Tuts+. In this series, I'm guiding you through launching a startup from concept to reality using my Meeting Planner app as a real-life example. Every step along the way, I'll release the Meeting Planner code as open-source examples you can learn from. I'm also addressing startup-related business issues as they arise.

Mobile Apps vs. the Responsive Web

Strategically, building mobile apps for Meeting Planner on iOS and Android makes sense, but financially I haven't raised the resources for this yet. Mathew Ingram recently wrote in Fortune that due to the plethora of offerings for mobile users, "statistically speaking at least—no one is going to download your app." So while certainly I could enhance the Meeting Planner experience with an app, its likelihood of adoption doesn't make immediate sense with my current resources.

However, it's extremely important to make Meeting Planner a great web experience on mobile devices.

In today's episode, I'll review and discuss making changes oriented to doing just that—essentially making our web application more of a responsive website, easily usable on mobile devices and tablets. Check out the results (on your phone or tablet)!

One of the challenges coding for today's episode was that I'm not a designer or CSS coder. Some days I feel like I shouldn't even be coding myself; at Microsoft I was a Group Program Manager, i.e. we had graphic designers, a fully-staffed usability lab, CSS didn't exist, etc.

Leading up to this work, I felt intimidated trying to learn media queries, breakpoints, and specialized CSS—it's not a subject matter I'm skilled at, and it's time consuming and very detail oriented. Yet, within 48 hours, everything came together quickly and beautifully. If you scan to the bottom of the story, you'll see how few lines of CSS were ultimately needed for all the changes. Suddenly as I began to browse Meeting Planner on my phone, I grew excited for how well the new responsive web experience was working.

Frankly, it made me feel that a dedicated mobile app just isn't necessary at the moment. We can build our audience with the mobile web experience for now, especially through the critical upcoming alpha and beta phases.

In the meantime, if you haven't tried out Meeting Planner yet, go ahead and schedule your first meeting from your phone or tablet. I do participate in the comment threads below, so tell me about your experience! You can also reach me on Twitter @reifman. I'm always interested in new feature requests and suggested tutorial topics.

As a reminder, all of the code for Meeting Planner is written in the Yii2 Framework for PHP. If you'd like to learn more about Yii2, check out our parallel series Programming With Yii2.

The Current Mobile Status

To begin, I browsed the current state of the Meeting Planner service with my iOS phone and took screenshots of the initial application. It's not terrible, but it's not great. Let's review what I found.

The Home Page

The home page looks good, although aesthetically I wish the lead text, "Making Scheduling Easy", would break a bit differently, i.e. on three approximately equal length lines. However, Bootstrap manages the drop-down menu well, and the rest of the page works functionally:

Meeting Planner Responsive Web - Home PageMeeting Planner Responsive Web - Home PageMeeting Planner Responsive Web - Home Page

The Sign-Up Page

Again, other than the headline's aesthetic layout and left margin consistency, the sign-up page is basically functional:

Meeting Planner Responsive Web - Signup PageMeeting Planner Responsive Web - Signup PageMeeting Planner Responsive Web - Signup Page

Planning Meetings

Once the person begins planning meetings, the current index page needs improvement. There are too many columns. The subject is squished. Perhaps the information I chose to display here in the first place isn't essential. And, certainly, the command options aren't in view. The page needs to be adjusted for mobile more significantly.

Meeting Planner Responsive Web - Meetings ListMeeting Planner Responsive Web - Meetings ListMeeting Planner Responsive Web - Meetings List

Other pages function well, such as the new meeting request for a subject. However, mobile users probably don't want to be offered a textarea field to type in a longer message introducing the meeting:

Meeting Planner Responsive Web - New Meeting Subject FormMeeting Planner Responsive Web - New Meeting Subject FormMeeting Planner Responsive Web - New Meeting Subject Form

Adding participants also becomes a bit dysfunctional with the bootstrap extensions we're using:

Meeting Planner Responsive Web - Add a Person FormMeeting Planner Responsive Web - Add a Person FormMeeting Planner Responsive Web - Add a Person Form

And the planning views for places and times begin to break down. Again, the desktop design offers too much detail and too many options for mobile:

Meeting Planner Responsive Web - When Times Form with SwitchesMeeting Planner Responsive Web - When Times Form with SwitchesMeeting Planner Responsive Web - When Times Form with Switches

Other Areas

The Places page functionally works but needs an improved layout of the buttons. And perhaps this functionality isn't needed for mobile users.

Meeting Planner Responsive Web - Add Places FormMeeting Planner Responsive Web - Add Places FormMeeting Planner Responsive Web - Add Places Form

Similarly, the desktop tab and photo layout breaks down on mobile. It also needs to be rethought:

Meeting Planner Responsive Web - Profile SettingsMeeting Planner Responsive Web - Profile SettingsMeeting Planner Responsive Web - Profile Settings

Developing Solutions

Certainly, there are a lot of areas of the site that can be improved. Some areas need to be rethought for mobile, some minimized, and others just aesthetically adjusted. Let's get to work.

Different Approaches

I had pretty much zero experience with media queries and breakpoints when I began this task. For a few days before, I procrastinated over diving into what I feared was an unfamiliar quagmire. I began with a practice media query to tease my editor:

1
@media only life
2
   and (max-energy-level: 60%)
3
   and (-caffeine-ratio: 2) {
4
      .editorBossperson {
5
         available-to:false;
6
         visible-to:false;
7
   }
8
}

Joking around helped break the mental ice in my head. I'm always available and visible to Envato's editorial gods.

There were a number of areas I began to consider:

  • Simplifying functionality, especially with the meeting planning process
  • Identifying the critical information to display for mobile
  • Concealing some functionality on mobile devices, such as elements, columns and menu options
  • Working with media-queries and breakpoints
  • Staying focused on the most important areas for the alpha release

One helpful concept I kept running into on the web was "Design for Mobile First." Unfortunately, I'm old school and hadn't done that. But it was helpful to rethink every page with this theme: Mobile First. 

For example, the meeting index with four table columns had to go and was disorienting on portrait phones.

I kept asking myself how I would have designed all the pages to work from a phone.

Warming Up to Media Queries

Drop-Down Menus

It took me some effort to overcome my hesitation at diving into deep CSS. To warm up, I began working on minimizing the drop-down menus and simplifying the scope of mobile functionality.

For now, I decided to create a single basic media query for smaller devices and use that across the site. Here's frontend/site.css:

1
/* ----------- mobile displays ----------- */
2
3
@media only screen
4
  and (min-device-width: 320px)
5
  and (max-device-width: 667px)
6
  and (-webkit-min-device-pixel-ratio: 2) {
7
    /* hides drop down menu items and footer items */
8
    .itemHide,li.menuHide {
9
      display:none;
10
      visible:false;
11
    }

Making changes turned out to be relatively simple. For any menu item I wanted to hide on mobile, I just needed to add a CSS property, e.g. menuHide.

Here's the menuHide property added to /frontend/views/layouts/main.php:

1
$menuItems[] = [
2
      'label' => 'Account',
3
      'items' => [
4
        [
5
          'label' => Yii::t('frontend','Places'),
6
           'url' => ['/place/yours'],
7
           'options'=>['class'=>'menuHide'],
8
         ],
9
         [
10
            'label' => Yii::t('frontend','Friends'),
11
            'url' => ['/friend'],
12
            'options'=>['class'=>'menuHide'],
13
        ],
14
           [
15
             'label' => Yii::t('frontend','Profile'),
16
             'url' => ['/user-profile'],
17
             'options'=>['class'=>'menuHide'],
18
         ],
19
         [
20
            'label' => Yii::t('frontend','Contact information'),
21
            'url' => ['/user-contact'],
22
            'options'=>['class'=>'menuHide'],
23
        ],
24
        [
25
           'label' => Yii::t('frontend','Settings'),
26
           'url' => ['/user-setting'],
27
           //'options'=>['class'=>'menuHide'],

28
       ],
29
       [
30
          'label' => Yii::t('frontend','Reminders'),
31
          'url' => ['/reminder'],
32
          'options'=>['class'=>'menuHide'],
33
      ],
34
           [
35
              'label' => Yii::t('frontend','Logout').' (' . \common\components\MiscHelpers::getDisplayName(Yii::$app->user->id) . ')',
36
              'url' => ['/site/logout'],
37
              'linkOptions' => ['data-method' => 'post']
38
          ],
39
      ],
40
  ];
41
  echo Nav::widget([
42
      'options' => ['class' => 'navbar-nav navbar-right'],
43
      'items' => $menuItems,
44
  ]);

Suddenly, the drop-down menu had less complexity:

Meeting Planner Responsive Web - Responsive Dropdown MenuMeeting Planner Responsive Web - Responsive Dropdown MenuMeeting Planner Responsive Web - Responsive Dropdown Menu

Gradually, I realized that simplifying and reducing functionality in the mobile web would create the best experience. People can always go back to their desktop to access other features, at least for now. This would also be an opportunity to gather feedback from people during the alpha and beta phases.

Breadcrumbs

Yii's default layout includes a breadcrumb widget which is loaded via composer and harder to customize. I experimented with adding CSS to hide the first element and the first "/" divider:

Meeting Planner Responsive Web - Desktop BreadcrumbsMeeting Planner Responsive Web - Desktop BreadcrumbsMeeting Planner Responsive Web - Desktop Breadcrumbs

It took some time but got me diving deeper into CSS, e.g. nth-child content, and built my confidence:

1
/* removes home and / from breadcrumb */
2
    ul.breadcrumb li:first-child, li.tabHide {
3
      display:none;
4
      visible:false;
5
    }
6
     ul.breadcrumb li:nth-child(2)::before {
7
       content:'';
8
    }

I had no idea that CSS could modify content.

Here's the result:

Meeting Planner Responsive Web - Responsive BreadcrumbsMeeting Planner Responsive Web - Responsive BreadcrumbsMeeting Planner Responsive Web - Responsive Breadcrumbs

Enhanced Button Spacing for Fingertips

Next, I added CSS to provide additional padding for buttons on mobile to make fingertip presses less error-prone. For example, here are the submit and cancel buttons on desktop devices:

Meeting Planner Responsive Web - Default Button Spacing DesktopMeeting Planner Responsive Web - Default Button Spacing DesktopMeeting Planner Responsive Web - Default Button Spacing Desktop

This is the CSS I used and began adding to various buttons and clickable icons around the site:

1
    /* fingertip spacing for buttons */
2
    a.icon-pad {
3
      padding: 0 5px 0 2px;
4
    }
5
    .button-pad {
6
      padding-left:7px;
7
    }

Here's what that form looks like on mobile—notice the new padding between Submit and Cancel:

Meeting Planner Responsive Web - Enhanced Button SpacingMeeting Planner Responsive Web - Enhanced Button SpacingMeeting Planner Responsive Web - Enhanced Button Spacing

Responsive Text Wrapping

Meeting Planner Responsive Web - Home Page with Text WrapMeeting Planner Responsive Web - Home Page with Text WrapMeeting Planner Responsive Web - Home Page with Text Wrap

Making the home page heading, "Scheduling Made Easy," wrap actually turned out to take a bit more time. Ultimately, I added a <br /> tag to the text and hid it by default when not on mobile. But I also had to add a space in a span tag with the itemHide class.

1
<h1>
2
    <?php echo Yii::t('frontend','Scheduling'); ?>
3
    <br class="rwd-break" />
4
    <span class="itemHide">&nbsp;</span>
5
    <?php echo Yii::t('frontend','Made Easy') ?>
6
</h1>         

Here's the CSS for .rwd-break. It's hidden by default and only appears in responsive displays, breaking the header text the way I want. 

1
.rwd-break {
2
  display:none;
3
}
4
/* ----------- mobile displays ----------- */
5
@media only screen
6
  and (min-device-width: 320px)
7
  and (max-device-width: 667px)
8
  and (-webkit-min-device-pixel-ratio: 2) {
9
  ...
10
    .rwd-break {
11
      display:block;
12
    }
13
}

Without the span tag space, the text would break without proper centering.

Simplifying the Meetings List Page

As I thought "mobile first" more and more, I realized that the phone-based user doesn't need all the functionality on my pages. They don't need all the tabs, they don't need the table of data about meetings, and they don't need all the icon button options. In fact, for the meeting page, they just need to be able to open meetings (they can cancel meetings from the meeting view page itself).

I combined the subject and participant columns into a single vertical column, and the result looks much better.

Meeting Planner Responsive Web - Responsive Meeting List Meeting Planner Responsive Web - Responsive Meeting List Meeting Planner Responsive Web - Responsive Meeting List

In /frontend/views/meeting/index.php, I added .tabHide to two of the four tabs:

1
<!-- Nav tabs -->
2
<ul class="nav nav-tabs" role="tablist">
3
  <li class="active"><a href="#planning" role="tab" data-toggle="tab">Planning</a></li>
4
  <li ><a href="#upcoming" role="tab" data-toggle="tab">Confirmed</a></li>
5
  <li class="tabHide"><a href="#past" role="tab" data-toggle="tab" >Past</a></li>
6
  <li class="tabHide"><a href="#canceled" role="tab" data-toggle="tab">Canceled</a></li>
7
</ul>

And, in /frontend/views/meeting/_grid.php, I restructured the column to combine subject and participant:

1
if ($mode =='upcoming' || $mode =='past') {
2
  echo GridView::widget([
3
      'dataProvider' => $dataProvider,
4
      //'filterModel' => $searchModel,

5
      'columns' => [
6
      [
7
        'label'=>'Details',
8
          'attribute' => 'meeting_type',
9
          'format' => 'raw',
10
          'value' => function ($model) {
11
              // to do - remove legacy code when subject didn't exist

12
                if ($model->subject=='') {
13
                  return '<div><a href="'.Url::to(['meeting/view', 'id' => $model->id]).'">'.$model->getMeetingHeader().'</a><br /><span class="index-participant">'.$model->getMeetingParticipants($model->id).'</span></div>';
14
                } else {
15
                  return '<div><a href="'.Url::to(['meeting/view', 'id' => $model->id]).'">'.$model->subject.'</a><br /><span class="index-participant">'.$model->getMeetingParticipants($model->id).'</span></div>';
16
                }
17
              },
18
      ],

Hiding the ActionColumn required a bit of research, but looks like this:

1
['class' => 'yii\grid\ActionColumn','header'=>'Options','template'=>'{view}  {decline}  {cancel}',
2
    'headerOptions' => ['class' => 'itemHide'],
3
    'contentOptions' => ['class' => 'itemHide'],
4
    'buttons'=>[
5
        'view' => function ($url, $model) {
6
          return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', $url,
7
          [
8
                  'title' => Yii::t('frontend', 'view'),
9
                  'class' => 'icon-pad',
10
          ]);
11
        },
12
        'decline' => function ($url, $model) {
13
          return ($model->status==$model::STATUS_SENT ) ? Html::a('<span class="glyphicon glyphicon-thumbs-down"></span>', $url, [
14
                  'title' => Yii::t('frontend', 'decline'),
15
                  'class' => 'icon-pad',
16
          ]) : '';
17
        },
18
        'cancel' => function ($url, $model) {
19
          return ($model->status==$model::STATUS_SENT || $model->status==$model::STATUS_CONFIRMED ) ? Html::a('<span class="glyphicon glyphicon-remove-circle"></span>', $url, [
20
                  'title' => Yii::t('frontend', 'cancel'),
21
                  'data-confirm' => Yii::t('frontend', 'Are you sure you want to cancel this meeting?'),
22
                  'class' => 'icon-pad',
23
          ]) : '';
24
        },
25
      ]
26
    ],

Ultimately, these changes simplified the desktop interface in the process of improving mobile.

The Big Challenge: Meeting Scheduling

Meeting Planner Responsive Web - Existing When Times Planning FormMeeting Planner Responsive Web - Existing When Times Planning FormMeeting Planner Responsive Web - Existing When Times Planning Form

By far the most challenging task for me was to adapt the meeting scheduling page above for mobile. It was a mess on phones, and I was daunted. Separately, I've always worried how I would adopt this interface for multiple participants in the future—responsive requirements might just make this more difficult.

My use of Kartik's Bootstrap Switch Widget extension for Yii has its own limitations when it comes to modifying layout. Placing these elements in table columns worked well, but making table columns responsive wasn't as straightforward with media queries.

Certainly as I showed with the Meetings list page above, hiding columns is easy, but modifying the placement not so much.

I began by moving away from a horizontal table design for showing time and place options and towards a vertical, portrait style. And, apparently, tables and columns have their own capacity to wrap with HTML5 and CSS without media queries. 

You can see the improved, empty meeting plan page here:

Meeting Planner Responsive Web - Responsive New Plan a Meeting FormMeeting Planner Responsive Web - Responsive New Plan a Meeting FormMeeting Planner Responsive Web - Responsive New Plan a Meeting Form

Each partial view required additional css columns for pre-defined Bootstrap grid layouts to work well, e.g. left col-xs4 and right col-xs-8. Here's an example:

1
<div class="panel panel-default">
2
  <!-- Default panel contents -->
3
  <div class="panel-heading">
4
    <div class="row">
5
      <div class="col-lg-4 col-md-4 col-xs-4"><h4>What</h4></div>
6
      <div class="col-lg-8 col-md-8 col-xs-8"><div style="float:right;">
7
      <?php
8
        if ($isOwner) {
9
            echo Html::a('', ['update', 'id' => $model->id], ['class' => 'btn btn-primary glyphicon glyphicon-pencil','title'=>'Edit']);
10
          }
11
        ?>
12
      </div>
13
    </div>
14
    </div>
15
  </div>

Making the place and time scheduling forms responsive was the most difficult. I experimented and ultimately succeeded in using table columns that naturally wrap as the content window (or device) shrink. 

I also eliminated showing participant status in its own column with disabled switches—you can't change them, so why show them as switches? Instead, I created a textual summary of the status of your participants for places and times. Here's the code for getWhenStatus():

1
public static function getWhenStatus($meeting,$viewer_id) {
2
      // get an array of textual status of meeting times for $viewer_id

3
      // Acceptable / Rejected / No response:

4
      $whenStatus['text'] = [];
5
      $whenStatus['style'] = [];
6
      foreach ($meeting->meetingTimes as $mt) {
7
        // build status for each time

8
        $acceptableChoice=[];
9
        $rejectedChoice=[];
10
        $unknownChoice=[];
11
        // to do - add meeting_id to MeetingTimeChoice for sortable queries

12
        foreach ($mt->meetingTimeChoices as $mtc) {
13
          if ($mtc->user_id == $viewer_id) continue;
14
          switch ($mtc->status) {
15
            case MeetingTimeChoice::STATUS_UNKNOWN:
16
              $unknownChoice[]=$mtc->user_id;
17
            break;
18
            case MeetingTimeChoice::STATUS_YES:
19
              $acceptableChoice[]=$mtc->user_id;
20
            break;
21
            case MeetingTimeChoice::STATUS_NO:
22
              $rejectedChoice[]=$mtc->user_id;
23
            break;
24
          }
25
        }
26
        $temp ='';
27
        // to do - update for multiple participants

28
        // to do - integrate current setting for this user in style setting

29
        if (count($acceptableChoice)>0) {
30
          $temp.='Acceptable to '.MiscHelpers::getDisplayName($acceptableChoice[0]);
31
          $whenStatus['style'][$mt->id]='success';
32
        } else if (count($rejectedChoice)>0) {
33
          $temp.='Rejected by '.MiscHelpers::getDisplayName($rejectedChoice[0]);
34
          $whenStatus['style'][$mt->id]='danger';
35
        } else if (count($unknownChoice)>0) {
36
          $temp.='No response from '.MiscHelpers::getDisplayName($unknownChoice[0]);
37
          $whenStatus['style'][$mt->id]='warning';
38
        }
39
        $whenStatus['text'][$mt->id]=$temp;
40
      }
41
      return $whenStatus;
42
    }

Here's what it looks like on desktop —notice the landscape layout of the rows of text and switches:

Meeting Planner Responsive Web - Desktop Layout of Times and Places FormMeeting Planner Responsive Web - Desktop Layout of Times and Places FormMeeting Planner Responsive Web - Desktop Layout of Times and Places Form

And here's the mobile version, more portrait and stacked without media queries:

Meeting Planner Responsive Web - Final Responsive Meeting Planning FormMeeting Planner Responsive Web - Final Responsive Meeting Planning FormMeeting Planner Responsive Web - Final Responsive Meeting Planning Form

As an example, here's the CSS for the way I coded the table columns on the When (times) panel:

1
table.table-list {
2
  width:100%;
3
}
4
table.table-list td.table-list-first {
5
    float: left;
6
    display: inline;
7
    width: auto;
8
  }
9
table.table-list td.table-switches {
10
    width: auto;
11
    float: right;
12
    display: inline;
13
    padding-top: 10px;
14
  }
15
.switch-pad {
16
    padding-left:7px;
17
  }
18
.smallStatus {
19
  font-size:90%;
20
  color: grey;
21
  font-style: italic;
22
}

And here's the code for this partial form from /frontend/views/meeting-time/_list.php:

1
<?php
2
use yii\helpers\Html;
3
use frontend\models\Meeting;
4
use \kartik\switchinput\SwitchInput;
5
?>
6
<tr > <!-- panel row -->
7
  <td >
8
    <table class="table-list"> <!-- list of times -->
9
      <tr>
10
        <td class="table-list-first"> <!-- time & status -->
11
          <?= Meeting::friendlyDateFromTimestamp($model->start,$timezone) ?>
12
          <?php
13
            if ($whenStatus['text'][$model->id]<>'') {
14
            ?>
15
            <br /><span class="smallStatus">
16
            <?php
17
            echo $whenStatus['text'][$model->id];
18
            ?>
19
          </span><br />
20
            <?php
21
            }
22
          ?>
23
      </td>
24
      <td class="table-switches"> <!-- col of switches to float right -->
25
        <table >
26
          <tr>
27
              <td >
28
                <?php
29
                   if ($isOwner) {
30
                     showTimeOwnerStatus($model,$isOwner);
31
                   } else {
32
                     showTimeParticipantStatus($model,$isOwner);
33
                   }
34
                ?>
35
              </td>
36
              <td class="switch-pad">
37
                  <?php
38
                  if ($timeCount>1) {
39
                    if ($model->status == $model::STATUS_SELECTED) {
40
                        $value = $model->id;
41
                    }    else {
42
                      $value = 0;
43
                    }
44
                    if ($isOwner || $participant_choose_date_time) {
45
                      // value has to match for switch to be on

46
                      echo SwitchInput::widget([
47
                          'type' => SwitchInput::RADIO,
48
                          'name' => 'time-chooser',
49
                          'items' => [
50
                              [ 'value' => $model->id],
51
                          ],
52
                          'value' => $value,
53
                          'pluginOptions' => [  'size' => 'mini','handleWidth'=>60,'onText' => '<i class="glyphicon glyphicon-ok"></i>&nbsp;choose','onColor' => 'success','offText'=>'<i class="glyphicon glyphicon-remove"></i>'], // $whenStatus['style'][$model->id],

54
                          'labelOptions' => ['style' => 'font-size: 12px'],
55
                      ]);
56
                    }
57
                  }
58
                  ?>
59
              </td>
60
            </tr>
61
          </table>
62
        </td> <!-- end col with table of switches -->
63
      </tr>
64
  </table> <!-- end table list of times -->
65
  </td>
66
  </tr> <!-- end panel row -->

The best thing about these meeting view changes is that they'll simplify the UX design challenge for future meetings with many participants. Regardless of the number of people in a meeting, the view will remain basically the same as above. Essentially, this solved the greatest barrier to me expanding to multiple participant meetings—UX design.

What's Next?

I hope you've enjoyed following along as I work on the minutiae of responsive web design. As the code and visual changes to the site came together, I felt extremely satisfied and impressed with how little CSS was required. Taken together, you can see it here:

1
.rwd-break {
2
  display:none;
3
}
4
table.table-list {
5
  width:100%;
6
}
7
table.table-list td.table-list-first {
8
    float: left;
9
    display: inline;
10
    width: auto;
11
  }
12
13
table.table-list td.table-switches {
14
    width: auto;
15
    float: right;
16
    display: inline;
17
    padding-top: 10px;
18
  }
19
.switch-pad {
20
    padding-left:7px;
21
  }
22
.smallStatus {
23
  font-size:90%;
24
  color: grey;
25
  font-style: italic;
26
}
27
.setting-label label, #preferences label {

28
  font-weight:normal;
29
}
30
31
/* ----------- mobile displays ----------- */
32
33
@media only screen
34
  and (min-device-width: 320px)
35
  and (max-device-width: 667px)
36
  and (-webkit-min-device-pixel-ratio: 2) {
37
    /* hides drop down menu items and footer items */
38
    .itemHide,li.menuHide {
39
      display:none;
40
      visible:false;
41
    }
42
    /* removes home and / from breadcrumb */
43
    ul.breadcrumb li:first-child, li.tabHide {
44
      display:none;
45
      visible:false;
46
    }
47
     ul.breadcrumb li:nth-child(2)::before {
48
       content:'';
49
    }
50
    /* fingertip spacing for buttons */
51
    a.icon-pad {
52
      padding: 0 5px 0 2px;
53
    }
54
    .button-pad {
55
      padding-left:7px;
56
    }
57
    .rwd-break {
58
      display:block;
59
    }
60
}

My future design efforts will begin, "What should this look like on mobile?"

As mentioned, I'm currently working feverishly to prepare Meeting Planner for alpha release. I am primarily focused on the key improvements and features that will make the alpha release go smoothly.

I'm tracking everything in Asana now, which I'll write about in another tutorial; it's been incredibly helpful. There are also some interesting new features still on their way. 

I'm also beginning to focus more on the upcoming investment gathering effort with Meeting Planner. I'm just beginning to experiment with WeFunder based on the implementation of the SEC's new crowdfunding rules. Please consider following our profile. I will also write more about this in a future tutorial.

Again, while you're waiting for more episodes, schedule your first meeting (from your phone!). Also, I'd appreciate it if you share your experience below in the comments, and I'm always interested in your suggestions. You can also reach me on Twitter @reifman directly. You can also post them at the Meeting Planner support site.

Watch for upcoming tutorials in the Building Your Startup With PHP series.

Related Links

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.