polivalente 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/app/assets/build/css/components/_bookmarks.scss +20 -0
  4. data/app/assets/build/css/components/_colors.scss +104 -0
  5. data/app/assets/build/css/components/_forms.scss +23 -0
  6. data/app/assets/build/css/components/_pagination.scss +75 -0
  7. data/app/assets/build/css/components/_player.scss +148 -0
  8. data/app/assets/build/css/components/_tags.scss +29 -0
  9. data/app/assets/build/css/components/_themes.scss +69 -0
  10. data/app/assets/build/css/components/_tribute.scss +25 -0
  11. data/app/assets/build/css/components/plyr.css +1 -0
  12. data/app/assets/build/css/components/trix/_clipboard.scss +27 -0
  13. data/app/assets/build/css/components/trix/_trix.scss +181 -0
  14. data/app/assets/build/css/index.css +19 -0
  15. data/app/assets/build/js/application.js +2 -0
  16. data/app/assets/build/js/controllers/accordion_controller.js +21 -0
  17. data/app/assets/build/js/controllers/dynamic_select_controller.js +22 -0
  18. data/app/assets/build/js/controllers/index.js +33 -0
  19. data/app/assets/build/js/controllers/offline_controller.js +19 -0
  20. data/app/assets/build/js/controllers/reactive_text_controller.js +15 -0
  21. data/app/assets/build/js/controllers/text_counter_controller.js +38 -0
  22. data/app/assets/build/js/controllers/theme_controller.js +36 -0
  23. data/app/assets/build/js/controllers/trix_attachment_blocker_controller.js +15 -0
  24. data/app/assets/build/js/controllers/trix_autocomplete_controller.js +86 -0
  25. data/app/assets/build/js/controllers/trix_blockcode_controller.js +41 -0
  26. data/app/assets/build/js/controllers/trix_clipboard_controller.js +50 -0
  27. data/app/assets/build/js/controllers/trix_color_controller.js +49 -0
  28. data/app/assets/build/js/controllers/trix_highlight_controller.js +55 -0
  29. data/app/assets/build/js/controllers/trix_plyr_controller.js +86 -0
  30. data/app/assets/build/js/controllers/trix_toolbar_controller.js +48 -0
  31. data/app/assets/config/polivalente_manifest.js +1 -0
  32. data/app/assets/javascripts/polivalente/application.js +173 -0
  33. data/app/assets/stylesheets/polivalente/application.css +3 -14
  34. data/app/assets/stylesheets/polivalente/styles.css +1928 -0
  35. data/app/controllers/polivalente/application_controller.rb +2 -0
  36. data/app/controllers/polivalente/archives_controller.rb +18 -0
  37. data/app/controllers/polivalente/autocomplete_controller.rb +2 -3
  38. data/app/controllers/polivalente/comments_controller.rb +27 -0
  39. data/app/controllers/polivalente/trashes_controller.rb +18 -0
  40. data/app/controllers/polivalente/users_controller.rb +42 -0
  41. data/app/helpers/polivalente/gravatar_helper.rb +0 -4
  42. data/app/models/polivalente/tag.rb +1 -0
  43. data/app/views/layouts/polivalente/application.html.erb +9 -3
  44. data/app/views/polivalente/archives/_archive.html.erb +2 -0
  45. data/app/views/polivalente/archives/index.html.erb +3 -0
  46. data/app/views/polivalente/archives/show.html.erb +3 -0
  47. data/app/views/polivalente/autocomplete/tags.json.jbuilder +1 -0
  48. data/app/views/polivalente/autocomplete/users.json.jbuilder +1 -0
  49. data/app/views/polivalente/shared/_notices.html.erb +10 -0
  50. data/app/views/polivalente/shared/_offline_indicator.html.erb +10 -0
  51. data/app/views/polivalente/shared/_theme_toggle.html.erb +1 -0
  52. data/app/views/polivalente/tags/_cloud.html.erb +7 -0
  53. data/app/views/polivalente/tags/_list.html.erb +5 -0
  54. data/app/views/polivalente/tags/_tag.html.erb +1 -0
  55. data/app/views/polivalente/tags/_tag.json.jbuilder +4 -0
  56. data/app/views/polivalente/trashes/_trash.html.erb +2 -0
  57. data/app/views/polivalente/trashes/index.html.erb +3 -0
  58. data/app/views/polivalente/trashes/show.html.erb +3 -0
  59. data/app/views/polivalente/users/_form.html.erb +38 -0
  60. data/app/views/polivalente/users/_user.html.erb +4 -0
  61. data/app/views/polivalente/users/_user.json.jbuilder +4 -0
  62. data/app/views/polivalente/users/activities/_activity.html.erb +12 -0
  63. data/app/views/polivalente/users/activities/_recent.html.erb +17 -0
  64. data/app/views/polivalente/users/edit.html.erb +13 -0
  65. data/app/views/polivalente/users/related/_user.html.erb +14 -0
  66. data/app/views/polivalente/users/related/_users.html.erb +14 -0
  67. data/app/views/polivalente/users/show.html.erb +180 -0
  68. data/config/locales/en.yml +72 -0
  69. data/config/locales/es.yml +72 -0
  70. data/config/locales/fr.yml +74 -0
  71. data/config/locales/pt.yml +72 -0
  72. data/config/routes.rb +6 -0
  73. data/lib/generators/polivalente/install/install_generator.rb +1 -1
  74. data/lib/generators/polivalente/locales/locales_generator.rb +11 -0
  75. data/lib/generators/polivalente/templates/user.rb +3 -0
  76. data/lib/polivalente/engine.rb +1 -0
  77. data/lib/polivalente/version.rb +1 -1
  78. data/lib/polivalente.rb +3 -0
  79. metadata +107 -2
@@ -1,4 +1,6 @@
1
1
  module Polivalente
2
2
  class ApplicationController < Polivalente.config.base_controller.constantize
3
+ include Polivalente::UserLocale
4
+ before_action :set_user_locale!
3
5
  end
4
6
  end
@@ -0,0 +1,18 @@
1
+ module Polivalente
2
+ class ArchivesController < ApplicationController
3
+ before_action :set_archive, only: [:show]
4
+
5
+ def index
6
+ @archives = Archive.latest
7
+ end
8
+
9
+ def show
10
+ end
11
+
12
+ private
13
+
14
+ def set_archive
15
+ @archive = Archive.find(params[:id])
16
+ end
17
+ end
18
+ end
@@ -4,14 +4,13 @@ module Polivalente
4
4
 
5
5
  def tags
6
6
  @tags = Tag.all.latest
7
- render json: @tags, status: 200
7
+ render "polivalente/autocomplete/tags"
8
8
  end
9
9
 
10
10
  def users
11
11
  user_class = Polivalente.config.user_class.constantize
12
-
13
12
  @users = user_class.all.latest
14
- render json: @users, status: 200
13
+ render "polivalente/autocomplete/users"
15
14
  end
16
15
 
17
16
  protected
@@ -0,0 +1,27 @@
1
+ module Polivalente
2
+ class CommentsController < ApplicationController
3
+ def create
4
+ @comment = @commentable.comments.new(comment_params)
5
+ @comment.user = current_user
6
+ @comment.save
7
+ redirect_to @commentable, notice: "Your comment was successfully posted."
8
+ end
9
+
10
+ def destroy
11
+ @comment = Comment.where(user_id: current_user.id).find(params[:id])
12
+
13
+ @comment.destroy if @comment
14
+
15
+ respond_to do |format|
16
+ format.html { redirect_back(fallback_location: @commentable) }
17
+ format.json { head :no_content }
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def comment_params
24
+ params.require(:comment).permit(:content)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ module Polivalente
2
+ class TrashesController < ApplicationController
3
+ before_action :set_trash, only: [:show]
4
+
5
+ def index
6
+ @trash = Trash.latest
7
+ end
8
+
9
+ def show
10
+ end
11
+
12
+ private
13
+
14
+ def set_trash
15
+ @trash = Trash.find(params[:id])
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,42 @@
1
+ module Polivalente
2
+ class UsersController < ApplicationController
3
+ before_action :set_user, except: [:index, :create, :new]
4
+
5
+ def index
6
+ end
7
+
8
+ def show
9
+ @recent_activities = []
10
+
11
+ # Sudo-random list of user suggestions
12
+ @related_users = @user_class.all
13
+ .where(id: 10.times.map { rand(@user_class.first.id...@user_class.last.id) })
14
+ .where.not(id: @user.id)
15
+ .latest
16
+ .first(4)
17
+ end
18
+
19
+ def edit
20
+ end
21
+
22
+ def update
23
+ if @user.update(user_params)
24
+ render :show
25
+ else
26
+ render :edit
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def set_user
33
+ @user_class = Polivalente.config.user_class.constantize
34
+ @user = @user_class.find(params[:id])
35
+ @page_title = @user.name
36
+ end
37
+
38
+ def user_params
39
+ params.require(:user).permit(:first_name, :last_name, :photo)
40
+ end
41
+ end
42
+ end
@@ -9,10 +9,6 @@ module Polivalente
9
9
  end
10
10
 
11
11
  def user_avatar(user)
12
- unless defined?(user.photo)
13
- return user_gravatar(user.email, size: 40)
14
- end
15
-
16
12
  user.photo.attached? ? user.photo : user_gravatar(user.email, size: 40)
17
13
  end
18
14
 
@@ -1,5 +1,6 @@
1
1
  module Polivalente
2
2
  class Tag < ApplicationRecord
3
+ include ActionText::Attachable
3
4
  include Sortable
4
5
 
5
6
  has_many :taggings
@@ -1,14 +1,20 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html data-controller="theme" data-theme-target="theme">
3
3
  <head>
4
- <title>Polivalente</title>
4
+ <title>
5
+ <%= @page_title.nil? ? "" : "#{@page_title} | " %><%= Rails.application.class %>
6
+ </title>
5
7
  <%= csrf_meta_tags %>
6
8
  <%= csp_meta_tag %>
7
9
 
8
- <%= stylesheet_link_tag "polivalente/application", media: "all" %>
10
+ <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track": "reload" %>
11
+ <%= javascript_include_tag "polivalente/application", media: "all", "data-turbolinks-track": "reload" %>
9
12
  </head>
10
13
  <body>
11
14
 
15
+ <%= render 'polivalente/shared/offline_indicator' %>
16
+ <%= render 'polivalente/shared/notices' %>
17
+
12
18
  <%= yield %>
13
19
 
14
20
  </body>
@@ -0,0 +1,2 @@
1
+ <h2><%= archive.archivable_id %></h2>
2
+ <h2><%= archive.archivable_type %></h2>
@@ -0,0 +1,3 @@
1
+ <h2>Archives</h2>
2
+
3
+ <%= render @archives %>
@@ -0,0 +1,3 @@
1
+ <h2>Archive Item</h2>
2
+
3
+ <%= render @archive %>
@@ -0,0 +1 @@
1
+ json.array! @tags, partial: "polivalente/tags/tag", as: :tag
@@ -0,0 +1 @@
1
+ json.array! @users, partial: "polivalente/users/user", as: :user
@@ -0,0 +1,10 @@
1
+ <% flash.each do |message_type, message| %>
2
+ <div class="my-2 max-w-2xl mx-auto border border-tertiary rounded-md text-primary px-4 py-3 shadow-sm mb-3" role="alert">
3
+ <div class="flex items-center space-x-2">
4
+ <svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
5
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
6
+ </svg>
7
+ <p class="text-sm"><%= message %></p>
8
+ </div>
9
+ </div>
10
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <nav data-controller="offline" class="fixed bottom-0 right-5 z-10 text-red-600 dark:text-red-500 font-semibold">
2
+ <div data-offline-target="indicator" class="w-full bg-primary my-2 max-w-2xl mx-auto hidden border border-tertiary rounded-md px-4 py-3 shadow-md mb-3" role="alert">
3
+ <div class="flex items-center space-x-2">
4
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
5
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0" />
6
+ </svg>
7
+ <p class="text-sm"><%= t("views.errors.offline") %></p>
8
+ </div>
9
+ </div>
10
+ </nav>
@@ -0,0 +1 @@
1
+ <%= select_tag :theme, options_for_select(%w[Light Dark]), { class: 'mb-4 rounded-md bg-secondary', prompt_text: 'Select a theme', data: {action: 'input->theme#toggleTheme'}} %>
@@ -0,0 +1,7 @@
1
+ <div class="tag-cloud">
2
+ <%= link_to "all", articles_path, class: class_names('all', { active: current_page?(articles_path) }) %>
3
+
4
+ <% tag_cloud(collection, %w{s m l}) do |tag, css_class| %>
5
+ <%= link_to "##{tag.name}", tag_path(tag.name), class: class_names(css_class, 'tag', { active: current_page?(tag_path(tag.name)) }) %>
6
+ <% end %>
7
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="tag-list space-x-2 lowercase">
2
+ <% taggable.tags.map do |tag| %>
3
+ <%= link_to "##{tag.name}", tag_path(tag.name) %>
4
+ <% end %>
5
+ </div>
@@ -0,0 +1 @@
1
+ <p class="mention inline-flex bg-amber-400"><%= tag.name %></p>
@@ -0,0 +1,4 @@
1
+ json.extract! tag, :name
2
+ json.sgid tag.attachable_sgid
3
+ json.content render(partial: "polivalente/tags/tag", locals: { tag: tag }, formats: [:html])
4
+ json.url tag_url(tag.name) if defined?(tag_url)
@@ -0,0 +1,2 @@
1
+ <h2><%= trash.trashable_id %></h2>
2
+ <h2><%= trash.trashable_type %></h2>
@@ -0,0 +1,3 @@
1
+ <h2>Trash Bin</h2>
2
+
3
+ <%= render @trash %>
@@ -0,0 +1,3 @@
1
+ <h2>Trash Item</h2>
2
+
3
+ <%= render @trash %>
@@ -0,0 +1,38 @@
1
+ <%= form_with(model: user, :html => {class: 'form flex flex-col text-primary'}) do |form| %>
2
+ <% if user.errors.any? %>
3
+ <div id="error_explanation" class="text-primary">
4
+ <h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>
5
+
6
+ <ul>
7
+ <% user.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div class="my-2">
15
+ <%= form.text_field :first_name, class: "input-base bg-primary text-secondary-x border-tertiary text-2xl leading-8 font-extrabold tracking-tight sm:text-4xl" %>
16
+ </div>
17
+
18
+ <div class="my-2">
19
+ <%= form.text_field :last_name, class: "input-base bg-primary text-secondary-x border-tertiary text-2xl leading-8 font-extrabold tracking-tight sm:text-4xl" %>
20
+ </div>
21
+
22
+ <div class="my-2">
23
+ <%= form.file_field :photo, class: "input-base bg-primary text-secondary-x border-tertiary text-2xl leading-8 font-extrabold tracking-tight sm:text-4xl" %>
24
+ </div>
25
+
26
+
27
+ <div class="actions">
28
+ <div class="flex justify-between">
29
+ <%= form.submit nil, class: "py-2 px-4 mb-6 bg-green-600 hover:bg-green-800 text-white text-sm font-bold rounded transition duration-200" %>
30
+
31
+ <div class="flex space-x-3">
32
+ <%= link_to 'Cancel', user.new_record? ? users_url : user_url, class: "py-2 px-4 mb-6 bg-secondary border-2 hover:bg-tertiary text-primary text-sm font-bold rounded transition duration-200" %>
33
+ </div>
34
+
35
+ </div>
36
+ </div>
37
+ <% end %>
38
+
@@ -0,0 +1,4 @@
1
+ <%= link_to user, class: "mention inline-flex space-x-2 items-center align-center p-0 m-0", data: "#{user.name}" do %>
2
+ <%= image_tag main_app.url_for(user_avatar(user)), class: "w-5 h-5 rounded border border-tertiary" %>
3
+ <p><%= user.name %></p>
4
+ <% end %>
@@ -0,0 +1,4 @@
1
+ json.extract! user, :name
2
+ json.sgid user.attachable_sgid
3
+ json.content render(partial: "polivalente/users/user", locals: { user: user }, formats: [:html])
4
+ json.url user_url(user)
@@ -0,0 +1,12 @@
1
+ <li class="py-5">
2
+ <div class="relative focus-within:ring-2 focus-within:ring-cyan-500">
3
+ <h3 class="text-sm font-semibold text-gray-800">
4
+ <a href="#" class="hover:underline focus:outline-none">
5
+ <!-- Extend touch target to entire panel -->
6
+ <span class="absolute inset-0" aria-hidden="true"></span>
7
+ <%= activity.title %>
8
+ </a>
9
+ </h3>
10
+ <p class="mt-1 text-sm text-gray-600 line-clamp-2"><%= activity.description %></p>
11
+ </div>
12
+ </li>
@@ -0,0 +1,17 @@
1
+ <section aria-labelledby="recent-activities-title">
2
+ <div class="rounded-lg bg-white overflow-hidden shadow">
3
+ <div class="p-6">
4
+ <h2 class="text-base font-medium text-gray-900" id="recent-activities-title">Recent Activities</h2>
5
+ <div class="flow-root mt-6">
6
+ <ul role="list" class="-my-5 divide-y divide-gray-200">
7
+ <% activities.each do |activity| %>
8
+ <%= render "polivalente/users/activities/activity", activity: activity %>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <div class="mt-6">
13
+ <a href="#" class="w-full flex justify-center items-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"> View all </a>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </section>
@@ -0,0 +1,13 @@
1
+ <h2 class="text-3xl font-semibold pb-4"><%= @user.name %></h2>
2
+
3
+ <section class="max-w-3xl">
4
+ <%= rich_text_area :content,
5
+ class: "input-base bg-primary border-tertiary",
6
+ data: { controller: "trix-autocomplete autocomplete trix-attachment-blocker",
7
+ trix_autocomplete_url_value: autocomplete_users_path,
8
+ trix_autocomplete_trigger_value: "@"
9
+ }
10
+ %>
11
+ <!-- <span class="absolute text-sm border border-tertiary bg-primary rounded px-2 right-2 bottom-2" data-text-counter-target="output"></span> -->
12
+ <%#= render "form", user: @user %>
13
+ </section>
@@ -0,0 +1,14 @@
1
+ <li class="py-4">
2
+ <div class="flex items-center space-x-4">
3
+ <div class="flex-shrink-0">
4
+ <%= image_tag main_app.url_for(user_avatar(user)), class: "h-8 w-8 rounded-full", alt: user.name %>
5
+ </div>
6
+ <div class="flex-1 min-w-0">
7
+ <p class="text-sm font-medium text-gray-900 truncate"><%= user.name %></p>
8
+ <p class="text-sm text-gray-500 truncate"><%= "#{user.name}" %></p>
9
+ </div>
10
+ <div>
11
+ <%= link_to "View", user, class: "inline-flex items-center shadow-sm px-2.5 py-0.5 border border-gray-300 text-sm leading-5 font-medium rounded-full text-gray-700 bg-white hover:bg-gray-50" %>
12
+ </div>
13
+ </div>
14
+ </li>
@@ -0,0 +1,14 @@
1
+ <section aria-labelledby="recent-hires-title">
2
+ <div class="rounded-lg bg-white overflow-hidden shadow">
3
+ <div class="p-6">
4
+ <h2 class="text-base font-medium text-gray-900" id="recent-hires-title">Related Users</h2>
5
+ <div class="flow-root mt-6">
6
+ <ul role="list" class="-my-5 divide-y divide-gray-200">
7
+ <% users.each do |user| %>
8
+ <%= render "polivalente/users/related/user", user: user %>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ </div>
13
+ </div>
14
+ </section>
@@ -0,0 +1,180 @@
1
+ <main class="h-full bg-gray-100">
2
+ <section class="h-full">
3
+ <div class="min-h-full">
4
+ <header class="pb-24 bg-gradient-to-r from-sky-800 to-cyan-600">
5
+ <div class="max-w-3xl mx-auto px-4 sm:px-6 lg:max-w-7xl lg:px-8">
6
+ <div class="relative flex flex-wrap items-center justify-center lg:justify-between">
7
+ <div class="w-full py-5 lg:border-t lg:border-white lg:border-opacity-20">
8
+ <div class="lg:grid lg:grid-cols-3 lg:gap-8 lg:items-center">
9
+ </div>
10
+ </div>
11
+ </div>
12
+ </div>
13
+
14
+ <!-- Mobile menu, show/hide based on mobile menu state. -->
15
+ </header>
16
+ <main class="-mt-24 pb-8">
17
+ <div class="max-w-3xl mx-auto px-4 sm:px-6 lg:max-w-7xl lg:px-8">
18
+ <h1 class="sr-only">Profile</h1>
19
+ <!-- Main 3 column grid -->
20
+ <div class="grid grid-cols-1 gap-4 items-start lg:grid-cols-3 lg:gap-8">
21
+ <!-- Left column -->
22
+ <div class="grid grid-cols-1 gap-4 lg:col-span-2">
23
+ <!-- Welcome panel -->
24
+ <section aria-labelledby="profile-overview-title">
25
+ <div class="rounded-lg bg-white overflow-hidden shadow">
26
+ <h2 class="sr-only" id="profile-overview-title">Profile Overview</h2>
27
+ <div class="bg-white p-6">
28
+ <div class="sm:flex sm:items-center sm:justify-between">
29
+ <div class="sm:flex sm:space-x-5">
30
+ <div class="flex-shrink-0">
31
+ <%= image_tag main_app.url_for(user_avatar(@user)), class: "mx-auto h-20 w-20 rounded-full" %>
32
+ </div>
33
+ <div class="mt-4 text-center sm:mt-0 sm:pt-1 sm:text-left">
34
+ <p class="text-sm font-medium text-gray-600">#</p>
35
+ <p class="text-xl font-bold text-gray-900 sm:text-2xl"><%= @user.name %></p>
36
+ <p class="text-sm font-medium text-gray-600">
37
+ <%= t("member_since") %> <%= time_ago_in_words @user.confirmed_at %>
38
+ </p>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </section>
44
+
45
+ <!-- Actions panel -->
46
+ <section aria-labelledby="quick-links-title">
47
+ <div class="rounded-lg bg-gray-200 overflow-hidden shadow divide-y divide-gray-200 sm:divide-y-0 sm:grid sm:grid-cols-2 sm:gap-px">
48
+ <h2 class="sr-only" id="quick-links-title">Quick links</h2>
49
+
50
+ <div class="rounded-tl-lg rounded-tr-lg sm:rounded-tr-none relative group bg-white p-6 focus-within:ring-2 focus-within:ring-inset focus-within:ring-cyan-500">
51
+ <div>
52
+ <span class="rounded-lg inline-flex p-3 bg-teal-50 text-teal-700 ring-4 ring-white">
53
+ <!-- Heroicon name: outline/clock -->
54
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
55
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
56
+ </svg>
57
+ </span>
58
+ </div>
59
+ <div class="mt-8">
60
+ <h3 class="text-lg font-medium">
61
+ <a href="#" class="focus:outline-none">
62
+ <!-- Extend touch target to entire panel -->
63
+ <span class="absolute inset-0" aria-hidden="true"></span>
64
+ Request time off
65
+ </a>
66
+ </h3>
67
+ <p class="mt-2 text-sm text-gray-500">Doloribus dolores nostrum quia qui natus officia quod et dolorem. Sit repellendus qui ut at blanditiis et quo et molestiae.</p>
68
+ </div>
69
+ <span class="pointer-events-none absolute top-6 right-6 text-gray-300 group-hover:text-gray-400" aria-hidden="true">
70
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24">
71
+ <path d="M20 4h1a1 1 0 00-1-1v1zm-1 12a1 1 0 102 0h-2zM8 3a1 1 0 000 2V3zM3.293 19.293a1 1 0 101.414 1.414l-1.414-1.414zM19 4v12h2V4h-2zm1-1H8v2h12V3zm-.707.293l-16 16 1.414 1.414 16-16-1.414-1.414z" />
72
+ </svg>
73
+ </span>
74
+ </div>
75
+
76
+ <div class="sm:rounded-tr-lg relative group bg-white p-6 focus-within:ring-2 focus-within:ring-inset focus-within:ring-cyan-500">
77
+ <div>
78
+ <span class="rounded-lg inline-flex p-3 bg-purple-50 text-purple-700 ring-4 ring-white">
79
+ <!-- Heroicon name: outline/badge-check -->
80
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
81
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z" />
82
+ </svg>
83
+ </span>
84
+ </div>
85
+ <div class="mt-8">
86
+ <h3 class="text-lg font-medium">
87
+ <a href="#" class="focus:outline-none">
88
+ <!-- Extend touch target to entire panel -->
89
+ <span class="absolute inset-0" aria-hidden="true"></span>
90
+ Benefits
91
+ </a>
92
+ </h3>
93
+ <p class="mt-2 text-sm text-gray-500">Doloribus dolores nostrum quia qui natus officia quod et dolorem. Sit repellendus qui ut at blanditiis et quo et molestiae.</p>
94
+ </div>
95
+ <span class="pointer-events-none absolute top-6 right-6 text-gray-300 group-hover:text-gray-400" aria-hidden="true">
96
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24">
97
+ <path d="M20 4h1a1 1 0 00-1-1v1zm-1 12a1 1 0 102 0h-2zM8 3a1 1 0 000 2V3zM3.293 19.293a1 1 0 101.414 1.414l-1.414-1.414zM19 4v12h2V4h-2zm1-1H8v2h12V3zm-.707.293l-16 16 1.414 1.414 16-16-1.414-1.414z" />
98
+ </svg>
99
+ </span>
100
+ </div>
101
+
102
+ <div class="relative group bg-white p-6 focus-within:ring-2 focus-within:ring-inset focus-within:ring-cyan-500">
103
+ <div>
104
+ <span class="rounded-lg inline-flex p-3 bg-sky-50 text-sky-700 ring-4 ring-white">
105
+ <!-- Heroicon name: outline/users -->
106
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
107
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z" />
108
+ </svg>
109
+ </span>
110
+ </div>
111
+ <div class="mt-8">
112
+ <h3 class="text-lg font-medium">
113
+ <a href="#" class="focus:outline-none">
114
+ <!-- Extend touch target to entire panel -->
115
+ <span class="absolute inset-0" aria-hidden="true"></span>
116
+ Schedule a one-on-one
117
+ </a>
118
+ </h3>
119
+ <p class="mt-2 text-sm text-gray-500">Doloribus dolores nostrum quia qui natus officia quod et dolorem. Sit repellendus qui ut at blanditiis et quo et molestiae.</p>
120
+ </div>
121
+ <span class="pointer-events-none absolute top-6 right-6 text-gray-300 group-hover:text-gray-400" aria-hidden="true">
122
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24">
123
+ <path d="M20 4h1a1 1 0 00-1-1v1zm-1 12a1 1 0 102 0h-2zM8 3a1 1 0 000 2V3zM3.293 19.293a1 1 0 101.414 1.414l-1.414-1.414zM19 4v12h2V4h-2zm1-1H8v2h12V3zm-.707.293l-16 16 1.414 1.414 16-16-1.414-1.414z" />
124
+ </svg>
125
+ </span>
126
+ </div>
127
+
128
+ <div class="rounded-bl-lg rounded-br-lg sm:rounded-bl-none relative group bg-white p-6 focus-within:ring-2 focus-within:ring-inset focus-within:ring-cyan-500">
129
+ <div>
130
+ <span class="rounded-lg inline-flex p-3 bg-indigo-50 text-indigo-700 ring-4 ring-white">
131
+ <!-- Heroicon name: outline/academic-cap -->
132
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
133
+ <path d="M12 14l9-5-9-5-9 5 9 5z" />
134
+ <path d="M12 14l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14z" />
135
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 14l9-5-9-5-9 5 9 5zm0 0l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14zm-4 6v-7.5l4-2.222" />
136
+ </svg>
137
+ </span>
138
+ </div>
139
+ <div class="mt-8">
140
+ <h3 class="text-lg font-medium">
141
+ <a href="#" class="focus:outline-none">
142
+ <!-- Extend touch target to entire panel -->
143
+ <span class="absolute inset-0" aria-hidden="true"></span>
144
+ Training
145
+ </a>
146
+ </h3>
147
+ <p class="mt-2 text-sm text-gray-500">Doloribus dolores nostrum quia qui natus officia quod et dolorem. Sit repellendus qui ut at blanditiis et quo et molestiae.</p>
148
+ </div>
149
+ <span class="pointer-events-none absolute top-6 right-6 text-gray-300 group-hover:text-gray-400" aria-hidden="true">
150
+ <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24">
151
+ <path d="M20 4h1a1 1 0 00-1-1v1zm-1 12a1 1 0 102 0h-2zM8 3a1 1 0 000 2V3zM3.293 19.293a1 1 0 101.414 1.414l-1.414-1.414zM19 4v12h2V4h-2zm1-1H8v2h12V3zm-.707.293l-16 16 1.414 1.414 16-16-1.414-1.414z" />
152
+ </svg>
153
+ </span>
154
+ </div>
155
+ </div>
156
+ </section>
157
+ </div>
158
+
159
+ <%# Right column %>
160
+ <div class="grid grid-cols-1 gap-4">
161
+ <%# recent-activities %>
162
+ <% unless @recent_activities.empty? %>
163
+ <%= render "polivalente/users/activities/recent", activities: @recent_activities %>
164
+ <% end %>
165
+
166
+ <%# Related Users %>
167
+ <%= render "polivalente/users/related/users", users: @related_users %>
168
+ </div>
169
+ </div>
170
+ </div>
171
+
172
+ </main>
173
+ <footer>
174
+ <div class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 lg:max-w-7xl">
175
+ <div class="border-t border-gray-200 py-8 text-sm text-gray-500 text-center sm:text-left"><span class="block sm:inline">&copy; 2022 Polivalente Gem.</span> <span class="block sm:inline">All rights reserved.</span></div>
176
+ </div>
177
+ </footer>
178
+ </div>
179
+ </section>
180
+ </main>