diff options
| author | qsm-odoo <qsm@odoo.com> | 2018-02-15 18:14:58 +0100 |
|---|---|---|
| committer | qsm-odoo <qsm@odoo.com> | 2018-04-18 15:59:18 +0200 |
| commit | fbfd0119041ca7dc830796e76d9ae5c303459d4f (patch) | |
| tree | e30dd1a85988a97411a6d00945248fa1166cf465 /addons | |
| parent | 97aa0a8dec384ad75eb66045f43384b6e54f1d6e (diff) | |
[REF] *: get rid of introduced @extend
During first scss convertion, classes called as mixins were changed to
an @extend instruction which was the best approximation given the fact
there is no equivalent in sass to do that. The problem is that the
instruction is slowing the scss computation a lot and might also break
the style in unexpected ways because of the complex unwanted selectors
the instruction induces.
This commit removes the need of extends. This is done case per case.
Sometimes this involves adding classes in xml, sometimes to change the
style a little, ... The button rendering refactoring which was made
at the start of the LESS to SASS merge was also done in prevision of
this.
After this commit, sass computation is like 5-6 times faster than less
computation while it was like 10 times *slower* before this commit.
Diffstat (limited to 'addons')
26 files changed, 39 insertions, 73 deletions
diff --git a/addons/account/views/account_journal_dashboard_view.xml b/addons/account/views/account_journal_dashboard_view.xml index 9c7f1aca551..f6b74013d54 100644 --- a/addons/account/views/account_journal_dashboard_view.xml +++ b/addons/account/views/account_journal_dashboard_view.xml @@ -29,7 +29,7 @@ </t> </div> <t t-if="journal_type == 'bank' || journal_type == 'cash' || journal_type == 'sale' || journal_type == 'purchase'" t-call="JournalBodyGraph"/> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <t t-call="JournalManage"/> </div> </div> diff --git a/addons/base_import/static/src/js/import_action.js b/addons/base_import/static/src/js/import_action.js index 1e17798ae34..d995e9cf055 100644 --- a/addons/base_import/static/src/js/import_action.js +++ b/addons/base_import/static/src/js/import_action.js @@ -281,7 +281,7 @@ var DataImport = AbstractAction.extend(ControlPanelMixin, { // TODO: test that write // succeeded? this.$el.removeClass('oe_import_preview_error oe_import_error'); this.$el.toggleClass( - 'oe_import_noheaders', + 'oe_import_noheaders text-muted', !this.$('input.oe_import_has_header').prop('checked')); this._rpc({ model: 'base_import.import', diff --git a/addons/base_import/static/src/scss/base_import.scss b/addons/base_import/static/src/scss/base_import.scss index 72fe2651331..9a4ce56f5c2 100644 --- a/addons/base_import/static/src/scss/base_import.scss +++ b/addons/base_import/static/src/scss/base_import.scss @@ -84,10 +84,6 @@ display: block; } - .oe_import_noheaders { - @extend .text-muted; // FIXME was a mixin before scss convertion - } - /* ------------- ERRORS AND WARNINGS REPORT ------------ */ .oe_import_error_report { > ul { @@ -99,18 +95,6 @@ list-style: none; border-radius: $border-radius-base; } - .oe_import_report_error { - @extend .bg-danger; // FIXME was a mixin before scss convertion - @extend .text-danger; // FIXME was a mixin before scss convertion - } - .oe_import_report_warning { - @extend .bg-warning; // FIXME was a mixin before scss convertion - @extend .text-warning; // FIXME was a mixin before scss convertion - } - .oe_import_report_info { - @extend .bg-info; // FIXME was a mixin before scss convertion - @extend .text-info; // FIXME was a mixin before scss convertion - } } /* ------------- THE CSV TABLE ------------ */ diff --git a/addons/base_import/static/src/xml/base_import.xml b/addons/base_import/static/src/xml/base_import.xml index f882bf7f557..276d9ca0245 100644 --- a/addons/base_import/static/src/xml/base_import.xml +++ b/addons/base_import/static/src/xml/base_import.xml @@ -68,7 +68,7 @@ Track history during import </label> </div> - <div title="If the model uses parent/child relations, computing the + <div title="If the model uses parent/child relations, computing the parent / child relation occurs on every line, and lead to a slower import. Defering it can speed up import." class="oe_import_deferparentstore"> @@ -84,7 +84,7 @@ <input type="checkbox" class="oe_import_advanced_mode" checked="checked" id="oe_import_advanced_mode"/> <label for="oe_import_advanced_mode">Show fields of relation fields (advanced)</label> - <p class="oe_import_noheaders">If the file contains + <p class="oe_import_noheaders text-muted">If the file contains the column names, Odoo can try auto-detecting the field corresponding to the column. This makes imports simpler especially when the file has many columns.</p> @@ -124,7 +124,7 @@ </tbody> </t> <t t-name="ImportView.preview.error"> - <div class="oe_import_report oe_import_report_error"> + <div class="oe_import_report bg-danger text-danger"> <p>Import preview failed due to: <t t-esc="error"/>.</p> <p>For CSV files, the issue could be an incorrect encoding.</p> <p t-if="preview">Here is the start of the file we could not import:</p> @@ -133,7 +133,7 @@ </t> <ul t-name="ImportView.error"> <li t-foreach="errors" t-as="error" - t-attf-class="oe_import_report oe_import_report_#{error_value[0].type}"> + t-attf-class="oe_import_report bg-#{error_value[0].type} text-#{error_value[0].type}"> <t t-call="ImportView.error.each"> <t t-set="error" t-value="error_value[0]"/> </t> diff --git a/addons/hr/views/hr_views.xml b/addons/hr/views/hr_views.xml index 7fd75167757..7e5d6a61b39 100644 --- a/addons/hr/views/hr_views.xml +++ b/addons/hr/views/hr_views.xml @@ -554,7 +554,7 @@ <div class="col-xs-6 o_kanban_primary_right"> </div> </div> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <div class="row"> <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_to_do"> <div class="o_kanban_card_manage_title"> diff --git a/addons/hr_recruitment/views/hr_job_views.xml b/addons/hr_recruitment/views/hr_job_views.xml index 60971806e89..2311188baed 100644 --- a/addons/hr_recruitment/views/hr_job_views.xml +++ b/addons/hr_recruitment/views/hr_job_views.xml @@ -68,7 +68,7 @@ </div> </div> </t> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <div t-if="widget.editable" class="o_kanban_card_manage_settings row"> <div class="col-xs-8"> <ul class="oe_kanban_colorpicker" data-field="color"/> diff --git a/addons/mail/static/src/scss/systray.scss b/addons/mail/static/src/scss/systray.scss index 958e1ff2c08..c06bde1d3f1 100644 --- a/addons/mail/static/src/scss/systray.scss +++ b/addons/mail/static/src/scss/systray.scss @@ -45,7 +45,6 @@ border-bottom: 1px solid $gray-lighter-darker; box-shadow: 0 0 2px $gray-lighter-darker; .o_filter_button, .o_new_message { - @extend .btn-link; // FIXME was a mixin before scss convertion padding: 5px; } .o_filter_button { @@ -87,7 +86,6 @@ } } .o_activity_filter_button { - @extend .btn-link; // FIXME was a mixin before scss convertion padding: 2px; } .o_no_activity { diff --git a/addons/mail/static/src/scss/thread.scss b/addons/mail/static/src/scss/thread.scss index 9f9ace65de9..4a2edb68913 100644 --- a/addons/mail/static/src/scss/thread.scss +++ b/addons/mail/static/src/scss/thread.scss @@ -144,10 +144,6 @@ .o_mail_info { margin-bottom: 2px; - @extend .text-muted; // FIXME was a mixin before scss convertion - .o_mail_mailto, .o_mail_mailto:hover { - @extend .text-muted; // FIXME was a mixin before scss convertion - } strong { color: $headings-color; diff --git a/addons/mail/static/src/xml/activity.xml b/addons/mail/static/src/xml/activity.xml index fadb93dfa7d..9bdcfcdcb90 100644 --- a/addons/mail/static/src/xml/activity.xml +++ b/addons/mail/static/src/xml/activity.xml @@ -23,7 +23,7 @@ </div> </div> <div class="o_thread_message_core"> - <div class="o_mail_info"> + <div class="o_mail_info text-muted"> <strong><span t-attf-class="o_activity_date o_activity_color_#{activity.state}"><t t-esc="activity.label_delay" /></span></strong>: <strong t-if="activity.summary"> “<t t-esc="activity.summary"/>”</strong> <strong t-if="!activity.summary"> <t t-esc="activity.activity_type_id[1]" /></strong> diff --git a/addons/mail/static/src/xml/systray.xml b/addons/mail/static/src/xml/systray.xml index dd61c486b9b..54df73c1b94 100644 --- a/addons/mail/static/src/xml/systray.xml +++ b/addons/mail/static/src/xml/systray.xml @@ -14,11 +14,11 @@ </li> <li t-if="!widget.isMobile" class="o_mail_navbar_dropdown_top"> <div> - <button type="button" class="btn btn-sm o_filter_button active"> All </button> - <button type="button" class="btn btn-sm o_filter_button" data-filter='chat'> Chat </button> - <button type="button" class="btn btn-sm o_filter_button" data-filter='channels'> Channels </button> + <button type="button" class="btn btn-sm btn-link o_filter_button active"> All </button> + <button type="button" class="btn btn-sm btn-link o_filter_button" data-filter='chat'> Chat </button> + <button type="button" class="btn btn-sm btn-link o_filter_button" data-filter='channels'> Channels </button> </div> - <button type="button" class="btn btn-sm o_new_message"> New message </button> + <button type="button" class="btn btn-sm btn-link o_new_message"> New message </button> </li> <li class="o_mail_navbar_dropdown_channels"/> <li t-if="widget.isMobile"> @@ -93,4 +93,3 @@ </li> </t> </templates> - diff --git a/addons/mail/static/src/xml/thread.xml b/addons/mail/static/src/xml/thread.xml index 118e96da8ff..c3aa2388154 100644 --- a/addons/mail/static/src/xml/thread.xml +++ b/addons/mail/static/src/xml/thread.xml @@ -142,14 +142,14 @@ t-att-class="'fa o_thread_message_star o_thread_icon ' + (message.is_starred ? 'fa-star' : 'fa-star-o')" t-att-data-message-id="message.id" title="Mark as Todo"/> </div> - <div class='o_thread_message_core'> - <p t-if="message.display_author" class="o_mail_info"> + <div class="o_thread_message_core"> + <p t-if="message.display_author" class="o_mail_info text-muted"> <t t-if="message.is_note"> Note by </t> <strong t-if="message.mailto"> - <a class="o_mail_mailto" t-attf-href="mailto:#{message.mailto}?subject=Re: #{message.subject}"> + <a class="text-muted" t-attf-href="mailto:#{message.mailto}?subject=Re: #{message.subject}"> <t t-esc="message.mailto"/> </a> </strong> diff --git a/addons/mail/wizard/mail_compose_message_view.xml b/addons/mail/wizard/mail_compose_message_view.xml index a3d00f5228c..45aa65256b4 100644 --- a/addons/mail/wizard/mail_compose_message_view.xml +++ b/addons/mail/wizard/mail_compose_message_view.xml @@ -18,7 +18,7 @@ <field name="active_domain" invisible="1"/> <!-- Various warnings --> - <div colspan="2" class="oe_form_box_info oe_text_center" + <div colspan="2" class="oe_form_box_info bg-info oe_text_center" attrs="{'invisible': [('active_domain', '=', False)]}"> <p attrs="{'invisible': [('use_active_domain', '=', False)]}"> <strong> diff --git a/addons/maintenance/views/maintenance_views.xml b/addons/maintenance/views/maintenance_views.xml index 2a3f2e4b8d3..06709b3bb3b 100644 --- a/addons/maintenance/views/maintenance_views.xml +++ b/addons/maintenance/views/maintenance_views.xml @@ -872,7 +872,7 @@ </div> </div> </div> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <div class="row"> <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view"> <div class="o_kanban_card_manage_title"> diff --git a/addons/mass_mailing/views/mass_mailing_stats_views.xml b/addons/mass_mailing/views/mass_mailing_stats_views.xml index dfa12f5b564..7cf644dad93 100644 --- a/addons/mass_mailing/views/mass_mailing_stats_views.xml +++ b/addons/mass_mailing/views/mass_mailing_stats_views.xml @@ -51,7 +51,7 @@ <field name="model">mail.mail.statistics</field> <field name="arch" type="xml"> <form string="Mail Statistics" create="0"> - <div class="oe_form_box_info oe_text_center alert-info" attrs="{'invisible': [('exception', '=', False)]}"> + <div class="oe_form_box_info bg-info oe_text_center alert-info" attrs="{'invisible': [('exception', '=', False)]}"> <p><strong>This email could not be sent.</strong></p> </div> <sheet> diff --git a/addons/mass_mailing/views/mass_mailing_views.xml b/addons/mass_mailing/views/mass_mailing_views.xml index 586d805bf8b..fc7ca90e12d 100644 --- a/addons/mass_mailing/views/mass_mailing_views.xml +++ b/addons/mass_mailing/views/mass_mailing_views.xml @@ -419,7 +419,7 @@ <field name="state" readonly="1" widget="statusbar"/> </header> - <div class="oe_form_box_info oe_text_center" attrs="{'invisible': [('scheduled', '=', 0)]}"> + <div class="oe_form_box_info bg-info oe_text_center" attrs="{'invisible': [('scheduled', '=', 0)]}"> <p> <button class="btn-link" name="%(action_view_mail_mail_statistics_mailing_list)d" @@ -432,7 +432,7 @@ </button> </p> </div> - <div class="oe_form_box_info oe_text_center alert-info" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('failed', '=', 0)]}"> + <div class="oe_form_box_info bg-info oe_text_center alert-info" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('failed', '=', 0)]}"> <p> <button class="btn-link" name="%(action_view_mail_mail_statistics_mailing_list)d" @@ -445,7 +445,7 @@ </button> </p> </div> - <div class="oe_form_box_info oe_text_center" attrs="{'invisible': [('state', '!=', 'in_queue')]}"> + <div class="oe_form_box_info bg-info oe_text_center" attrs="{'invisible': [('state', '!=', 'in_queue')]}"> <p><strong> This mailing is scheduled for <field name="next_departure" class="oe_inline"/>. diff --git a/addons/mrp/views/mrp_workcenter_views.xml b/addons/mrp/views/mrp_workcenter_views.xml index 605d904e14a..954da835817 100644 --- a/addons/mrp/views/mrp_workcenter_views.xml +++ b/addons/mrp/views/mrp_workcenter_views.xml @@ -242,7 +242,7 @@ attrs="{'invisible': [('working_state','in',('normal','blocked'))]}"/> </div> </div> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <div class="row"> <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view"> <div class="o_kanban_card_manage_title"> diff --git a/addons/mrp/views/stock_picking_views.xml b/addons/mrp/views/stock_picking_views.xml index 844a669489b..e647d45705a 100644 --- a/addons/mrp/views/stock_picking_views.xml +++ b/addons/mrp/views/stock_picking_views.xml @@ -55,7 +55,7 @@ </div> </div> </div> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <div class="row"> <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view" name="picking_left_manage_pane"> <div class="o_kanban_card_manage_title"> diff --git a/addons/point_of_sale/views/point_of_sale_dashboard.xml b/addons/point_of_sale/views/point_of_sale_dashboard.xml index 8b70e02c9ec..de8d20ab2c0 100644 --- a/addons/point_of_sale/views/point_of_sale_dashboard.xml +++ b/addons/point_of_sale/views/point_of_sale_dashboard.xml @@ -118,7 +118,7 @@ </div> </div> </div> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <div class="row"> <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view"> <div class="o_kanban_card_manage_title"> diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml index 4ec031f7aa7..35326927f15 100644 --- a/addons/project/views/project_views.xml +++ b/addons/project/views/project_views.xml @@ -326,7 +326,7 @@ </div> </div> </div> - <div class="o_kanban_card_manage_pane" groups="project.group_project_manager"> + <div class="o_kanban_card_manage_pane dropdown-menu" groups="project.group_project_manager"> <div class="o_kanban_card_manage_section o_kanban_manage_reports"> <div> <a type="edit">Edit</a> diff --git a/addons/sales_team/views/sales_team_dashboard.xml b/addons/sales_team/views/sales_team_dashboard.xml index e77949ad667..18f3ade0013 100644 --- a/addons/sales_team/views/sales_team_dashboard.xml +++ b/addons/sales_team/views/sales_team_dashboard.xml @@ -41,7 +41,7 @@ <div class="col-xs-12 o_kanban_primary_bottom bottom_block"> </div> </div> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <div class="row"> <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_view"> <div class="o_kanban_card_manage_title"> diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml index 998231982c1..e02f5773093 100644 --- a/addons/stock/views/stock_picking_views.xml +++ b/addons/stock/views/stock_picking_views.xml @@ -688,7 +688,7 @@ </div> </div> </div> - </div><div class="container o_kanban_card_manage_pane"> + </div><div class="container o_kanban_card_manage_pane dropdown-menu"> <div class="row"> <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view"> <div class="o_kanban_card_manage_title"> diff --git a/addons/web/static/src/scss/dropdown_extra.scss b/addons/web/static/src/scss/dropdown_extra.scss index f925c4f6190..d15496fe0c9 100644 --- a/addons/web/static/src/scss/dropdown_extra.scss +++ b/addons/web/static/src/scss/dropdown_extra.scss @@ -56,8 +56,3 @@ $tag-border: #afafb6; } } } - -// Buttons used as dropdown toggler -.o_dropdown_toggler_btn { - @extend .btn-default; // FIXME was a mixin before scss convertion -} diff --git a/addons/web/static/src/scss/form_view.scss b/addons/web/static/src/scss/form_view.scss index 3698ee07e74..c5e0207022d 100644 --- a/addons/web/static/src/scss/form_view.scss +++ b/addons/web/static/src/scss/form_view.scss @@ -3,7 +3,6 @@ // Utility classes .oe_form_box_info { - @extend .bg-info; // FIXME was a mixin before scss convertion @include o-webclient-padding($top: 5px, $bottom: 5px); > p { margin: auto; @@ -24,11 +23,11 @@ } } .oe_left { - @extend .oe_inline; // FIXME was a mixin before scss convertion + @extend .oe_inline; float: left!important; } .oe_right { - @extend .oe_inline; // FIXME was a mixin before scss convertion + @extend .oe_inline; float: right!important; } @@ -443,7 +442,7 @@ // Specific style classes .o_group.o_inner_group.oe_subtotal_footer { - @extend .oe_right; // FIXME was a mixin after scss convertion + @extend .oe_right; > tbody > tr > td { padding: 0; diff --git a/addons/web/static/src/scss/kanban_dashboard.scss b/addons/web/static/src/scss/kanban_dashboard.scss index 0a1688260a8..791b582efd1 100644 --- a/addons/web/static/src/scss/kanban_dashboard.scss +++ b/addons/web/static/src/scss/kanban_dashboard.scss @@ -209,7 +209,6 @@ $o-kanban-dashboard-dropdown-complex-gap: 5px; } .o_kanban_card_manage_pane { - @extend .dropdown-menu; // FIXME was a mixin before scss convertion @include o-kanban-dropdown-menu; // Arbitrary value to place the dropdown-menu exactly below the @@ -252,8 +251,11 @@ $o-kanban-dashboard-dropdown-complex-gap: 5px; padding-right: $o-kanban-dashboard-dropdown-complex-gap; > .o_kanban_card_manage_title { - @extend .h5; // FIXME was a mixin before scss convertion + margin: ($line-height-computed / 2) 0; + color: $headings-color; + font-size: $font-size-h5; font-weight: 500; + line-height: $headings-line-height; } > div:not(.o_kanban_card_manage_title) { @include o-kanban-dashboard-dropdown-link($link-padding-gap: $o-kanban-dashboard-dropdown-complex-gap); diff --git a/addons/web/static/src/scss/search_view_extra.scss b/addons/web/static/src/scss/search_view_extra.scss index e5b378e6e41..247b188c396 100644 --- a/addons/web/static/src/scss/search_view_extra.scss +++ b/addons/web/static/src/scss/search_view_extra.scss @@ -34,10 +34,3 @@ } } } - -// Search options: inputs and selects style -.o_search_options { - input[type="text"], select { - @extend .form-control; // FIXME was a mixin before scss convertion - } -} diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 44412379a93..957e5ce6953 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -318,7 +318,7 @@ <t t-name="Sidebar"> <t t-foreach="widget.sections" t-as="section"> <div class="btn-group o_dropdown"> - <button t-if="section.name != 'buttons'" class="o_dropdown_toggler_btn btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + <button t-if="section.name != 'buttons'" class="o_dropdown_toggler_btn btn btn-sm btn-link btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> <t t-if="section.name == 'files'" t-raw="widget.items[section.name].length || ''"/> <t t-esc="section.label"/> <span class="caret"/> </button> @@ -1026,7 +1026,7 @@ <ul class="dropdown-menu o_searchview_autocomplete" role="menu"></ul> </t> <div t-name="SearchView.FilterMenu" class="btn-group o_dropdown"> - <button class="o_dropdown_toggler_btn btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1"> + <button class="o_dropdown_toggler_btn btn btn-sm btn-link btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1"> <span class="fa fa-filter"/> Filters <span class="caret"/> </button> <ul class="dropdown-menu o_filters_menu" role="menu"> @@ -1138,7 +1138,7 @@ </select> </t> <div t-name="SearchView.GroupByMenu" class="btn-group hidden-xs o_dropdown"> - <button class="o_dropdown_toggler_btn btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1"> + <button class="o_dropdown_toggler_btn btn btn-sm btn-link btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1"> <span class="fa fa-bars"/> Group By <span class="caret"/> </button> <ul class="dropdown-menu o_group_by_menu" role="menu"> @@ -1159,7 +1159,7 @@ </li> </t> <div t-name="SearchView.FavoriteMenu" class="btn-group o_dropdown"> - <button class="o_dropdown_toggler_btn btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1"> + <button class="o_dropdown_toggler_btn btn btn-sm btn-link btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1"> <span class="fa fa-star"/> Favorites <span class="caret"/> </button> <ul class="dropdown-menu o_favorites_menu" role="menu"> |
