ariadne_view_components 0.0.59 → 0.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +70 -0
- data/LICENSE.txt +661 -49
- data/README.md +52 -4
- data/app/assets/javascripts/ariadne_view_components.js +98 -7
- data/app/assets/javascripts/ariadne_view_components.js.br +0 -0
- data/app/assets/javascripts/ariadne_view_components.js.gz +0 -0
- data/app/assets/javascripts/ariadne_view_components.js.map +1 -1
- data/app/assets/stylesheets/ariadne_view_components.css +1 -7
- data/app/assets/stylesheets/ariadne_view_components.css.br +0 -0
- data/app/assets/stylesheets/ariadne_view_components.css.gz +0 -0
- data/app/components/ariadne/base_component.rb +79 -27
- data/app/components/ariadne/behaviors/tooltipable.rb +120 -0
- data/app/components/ariadne/conditional_wrapper.rb +21 -0
- data/app/components/ariadne/form/base_component.rb +74 -0
- data/app/components/ariadne/form/base_input_component.rb +60 -0
- data/app/components/ariadne/form/caption/component.html.erb +10 -0
- data/app/components/ariadne/form/caption/component.rb +29 -0
- data/app/components/ariadne/form/form_control/component.html.erb +19 -0
- data/app/components/ariadne/form/form_control/component.rb +27 -0
- data/app/components/ariadne/form/form_reference/component.html.erb +1 -0
- data/app/components/ariadne/form/form_reference/component.rb +18 -0
- data/app/components/ariadne/form/group/component.html.erb +5 -0
- data/app/components/ariadne/form/group/component.rb +27 -0
- data/app/components/ariadne/form/hidden_field/component.html.erb +1 -0
- data/app/components/ariadne/form/hidden_field/component.rb +15 -0
- data/app/components/ariadne/form/separator/component.html.erb +1 -0
- data/app/components/ariadne/form/separator/component.rb +8 -0
- data/app/components/ariadne/form/spacing_wrapper/component.html.erb +3 -0
- data/app/components/ariadne/form/spacing_wrapper/component.rb +8 -0
- data/app/components/ariadne/form/text_field/component.html.erb +25 -0
- data/app/components/ariadne/form/text_field/component.rb +132 -0
- data/app/components/ariadne/form/validation_message/component.html.erb +5 -0
- data/app/components/ariadne/form/validation_message/component.rb +14 -0
- data/app/components/ariadne/layout/narrow/component.html.erb +10 -0
- data/app/components/ariadne/layout/narrow/component.rb +24 -0
- data/app/components/ariadne/layout/nav_bar/component.css +0 -0
- data/app/components/ariadne/layout/nav_bar/component.html.erb +123 -0
- data/app/components/ariadne/layout/nav_bar/component.rb +77 -0
- data/app/components/ariadne/ui/button/component.html.erb +5 -0
- data/app/components/ariadne/ui/button/component.rb +184 -0
- data/app/components/ariadne/ui/clipboard_copy/component.html.erb +8 -0
- data/app/components/ariadne/ui/clipboard_copy/component.rb +102 -0
- data/app/components/ariadne/ui/clipboard_copy/component.ts +54 -0
- data/app/components/ariadne/ui/combobox/component.html.erb +32 -0
- data/app/components/ariadne/ui/combobox/component.rb +83 -0
- data/app/components/ariadne/ui/combobox/component.ts +119 -0
- data/app/components/ariadne/ui/combobox/menu_item/component.html.erb +9 -0
- data/app/components/ariadne/ui/combobox/menu_item/component.rb +53 -0
- data/app/components/ariadne/ui/combobox/option/component.html.erb +11 -0
- data/app/components/ariadne/ui/combobox/option/component.rb +45 -0
- data/app/components/ariadne/ui/heroicon/component.html.erb +3 -0
- data/app/components/ariadne/ui/heroicon/component.rb +141 -0
- data/app/components/ariadne/ui/image/component.rb +69 -0
- data/app/components/ariadne/ui/link/component.html.erb +3 -0
- data/app/components/ariadne/ui/link/component.rb +56 -0
- data/app/components/ariadne/ui/typography/component.html.erb +3 -0
- data/app/components/ariadne/ui/typography/component.rb +41 -0
- data/app/frontend/ariadne/index.ts +14 -0
- data/app/frontend/ariadne/stimulus_app.ts +53 -0
- data/app/frontend/ariadne/theme.ts +8 -0
- data/app/frontend/controllers/tooltip.ts +75 -0
- data/app/frontend/entrypoints/application.ts +1 -0
- data/app/frontend/stylesheets/ariadne_view_components.css +18 -0
- data/app/frontend/stylesheets/scrollbar.css +28 -0
- data/app/frontend/stylesheets/tippy.js/themes/tomato.css +4 -0
- data/app/frontend/stylesheets/typography.css +117 -0
- data/app/frontend/utils/createController.ts +95 -0
- data/app/helpers/ariadne/form_helper.rb +31 -0
- data/app/lib/ariadne/attributes_helper.rb +119 -0
- data/app/lib/ariadne/fetch_or_fallback_helper.rb +1 -1
- data/app/lib/ariadne/form.rb +16 -0
- data/app/lib/ariadne/view_helper.rb +2 -5
- data/app/lib/view_components_contrib/html_attrs.rb +64 -0
- data/app/lib/view_components_contrib/style_variants.rb +14 -0
- data/lib/ariadne/forms/acts_as_component.rb +125 -0
- data/lib/ariadne/forms/base.html.erb +8 -0
- data/lib/ariadne/forms/base.rb +132 -0
- data/lib/ariadne/forms/buffer_rewriter.rb +51 -0
- data/lib/ariadne/forms/builder.rb +88 -0
- data/lib/ariadne/forms/dsl/button_input.rb +33 -0
- data/lib/ariadne/forms/dsl/form_object.rb +26 -0
- data/lib/ariadne/forms/dsl/input.rb +322 -0
- data/lib/ariadne/forms/dsl/input_group.rb +34 -0
- data/lib/ariadne/forms/dsl/input_methods.rb +157 -0
- data/lib/ariadne/forms/dsl/submit_button_input.rb +36 -0
- data/lib/ariadne/forms/dsl/text_field_input.rb +73 -0
- data/lib/ariadne/forms/utils.rb +34 -0
- data/lib/ariadne/generate.rb +11 -0
- data/lib/ariadne/view_components/engine.rb +24 -7
- data/lib/ariadne/view_components/version.rb +1 -1
- data/lib/ariadne/view_components.rb +1 -1
- data/lib/ariadne/yard/backend.rb +24 -0
- data/lib/ariadne/yard/component_manifest.rb +148 -0
- data/lib/ariadne/yard/component_ref.rb +49 -0
- data/lib/ariadne/yard/docs_helper.rb +98 -0
- data/lib/ariadne/yard/info_arch_docs_helper.rb +31 -0
- data/lib/ariadne/yard/lookbook_docs_helper.rb +32 -0
- data/lib/ariadne/yard/lookbook_pages_backend.rb +235 -0
- data/lib/ariadne/yard/registry.rb +136 -0
- data/lib/ariadne/yard/renders_many_handler.rb +23 -0
- data/lib/ariadne/yard/renders_one_handler.rb +23 -0
- data/lib/ariadne/yard.rb +19 -0
- data/static/arguments.yml +141 -48
- data/static/audited_at.json +0 -9
- data/static/classes.yml +210 -209
- data/static/constants.json +2 -209
- data/static/statuses.json +0 -9
- metadata +140 -210
- data/app/assets/builds/ariadne_view_components.css +0 -2202
- data/app/assets/javascripts/components/ariadne/accumulator_controller/accumulator_controller.d.ts +0 -22
- data/app/assets/javascripts/components/ariadne/ariadne-form.d.ts +0 -22
- data/app/assets/javascripts/components/ariadne/ariadne.d.ts +0 -2
- data/app/assets/javascripts/components/ariadne/clipboard_copy_component/clipboard-copy-component.d.ts +0 -4
- data/app/assets/javascripts/components/ariadne/dropdown/menu_component.d.ts +0 -1
- data/app/assets/javascripts/components/ariadne/events_controller/events_controller.d.ts +0 -4
- data/app/assets/javascripts/components/ariadne/options_controller/options_controller.d.ts +0 -39
- data/app/assets/javascripts/components/ariadne/outlet_manager_controller/outlet_manager_controller.d.ts +0 -42
- data/app/assets/javascripts/components/ariadne/slideover_component/slideover-component.d.ts +0 -9
- data/app/assets/javascripts/components/ariadne/string_match_controller/string_match_controller.d.ts +0 -27
- data/app/assets/javascripts/components/ariadne/synced_boolean_attributes_controller/synced_boolean_attributes_controller.d.ts +0 -48
- data/app/assets/javascripts/components/ariadne/tab_container_component/tab-container-component.d.ts +0 -1
- data/app/assets/javascripts/components/ariadne/tab_nav_component/tab-nav-component.d.ts +0 -9
- data/app/assets/javascripts/components/ariadne/time_ago_component/time-ago-component.d.ts +0 -1
- data/app/assets/javascripts/components/ariadne/toggleable_controller/toggleable_controller.d.ts +0 -34
- data/app/assets/javascripts/components/ariadne/tooltip_component/tooltip-component.d.ts +0 -24
- data/app/assets/stylesheets/dropdown.css +0 -46
- data/app/assets/stylesheets/prosemirror.css +0 -323
- data/app/assets/stylesheets/tooltip-component.css +0 -37
- data/app/components/ariadne/accumulator_controller/accumulator_controller.d.ts +0 -22
- data/app/components/ariadne/accumulator_controller/accumulator_controller.js +0 -39
- data/app/components/ariadne/accumulator_controller/accumulator_controller.ts +0 -48
- data/app/components/ariadne/action_card_component.html.erb +0 -13
- data/app/components/ariadne/action_card_component.rb +0 -88
- data/app/components/ariadne/ariadne-form.d.ts +0 -22
- data/app/components/ariadne/ariadne-form.js +0 -85
- data/app/components/ariadne/ariadne.d.ts +0 -2
- data/app/components/ariadne/ariadne.js +0 -24
- data/app/components/ariadne/ariadne.ts +0 -29
- data/app/components/ariadne/avatar_component.rb +0 -81
- data/app/components/ariadne/avatar_stack_component/avatar_stack_component.html.erb +0 -12
- data/app/components/ariadne/avatar_stack_component.rb +0 -75
- data/app/components/ariadne/base_button.rb +0 -70
- data/app/components/ariadne/blankslate_component/blankslate_component.html.erb +0 -26
- data/app/components/ariadne/blankslate_component.rb +0 -148
- data/app/components/ariadne/body_component.rb +0 -30
- data/app/components/ariadne/bottom_tab_component.html.erb +0 -4
- data/app/components/ariadne/bottom_tab_component.rb +0 -44
- data/app/components/ariadne/bottom_tab_nav_component.html.erb +0 -5
- data/app/components/ariadne/bottom_tab_nav_component.rb +0 -33
- data/app/components/ariadne/breadcrumbs_component.html.erb +0 -13
- data/app/components/ariadne/breadcrumbs_component.rb +0 -31
- data/app/components/ariadne/button_component/button_component.html.erb +0 -4
- data/app/components/ariadne/button_component.rb +0 -165
- data/app/components/ariadne/checkbox_component.html.erb +0 -5
- data/app/components/ariadne/checkbox_component.rb +0 -43
- data/app/components/ariadne/clipboard_copy_component/clipboard-copy-component.d.ts +0 -4
- data/app/components/ariadne/clipboard_copy_component/clipboard-copy-component.js +0 -18
- data/app/components/ariadne/clipboard_copy_component/clipboard-copy-component.ts +0 -19
- data/app/components/ariadne/clipboard_copy_component/clipboard_copy_component.html.erb +0 -9
- data/app/components/ariadne/clipboard_copy_component.rb +0 -90
- data/app/components/ariadne/close_button_component.html.erb +0 -4
- data/app/components/ariadne/close_button_component.rb +0 -33
- data/app/components/ariadne/combobox_component.html.erb +0 -14
- data/app/components/ariadne/combobox_component.rb +0 -76
- data/app/components/ariadne/component.rb +0 -127
- data/app/components/ariadne/container_component/container_component.html.erb +0 -3
- data/app/components/ariadne/container_component.rb +0 -25
- data/app/components/ariadne/content.rb +0 -12
- data/app/components/ariadne/counter_component.rb +0 -100
- data/app/components/ariadne/details_component/details_component.html.erb +0 -4
- data/app/components/ariadne/details_component.rb +0 -81
- data/app/components/ariadne/dropdown/menu_component.d.ts +0 -1
- data/app/components/ariadne/dropdown/menu_component.html.erb +0 -20
- data/app/components/ariadne/dropdown/menu_component.js +0 -1
- data/app/components/ariadne/dropdown/menu_component.rb +0 -101
- data/app/components/ariadne/dropdown/menu_component.ts +0 -1
- data/app/components/ariadne/dropdown_component/dropdown_component.html.erb +0 -8
- data/app/components/ariadne/dropdown_component.rb +0 -172
- data/app/components/ariadne/events_controller/events_controller.d.ts +0 -4
- data/app/components/ariadne/events_controller/events_controller.js +0 -6
- data/app/components/ariadne/events_controller/events_controller.ts +0 -7
- data/app/components/ariadne/flash_component/flash_component.html.erb +0 -31
- data/app/components/ariadne/flash_component.rb +0 -128
- data/app/components/ariadne/flex_component/flex_component.html.erb +0 -5
- data/app/components/ariadne/flex_component.rb +0 -56
- data/app/components/ariadne/footer_component/footer_component.html.erb +0 -7
- data/app/components/ariadne/footer_component.rb +0 -23
- data/app/components/ariadne/grid_component/grid_component.html.erb +0 -26
- data/app/components/ariadne/grid_component.rb +0 -67
- data/app/components/ariadne/header_component/header_component.html.erb +0 -29
- data/app/components/ariadne/header_component.rb +0 -111
- data/app/components/ariadne/heading_component.rb +0 -49
- data/app/components/ariadne/heroicon_component/heroicon_component.html.erb +0 -4
- data/app/components/ariadne/heroicon_component.rb +0 -166
- data/app/components/ariadne/image_component.rb +0 -53
- data/app/components/ariadne/inline_flex_component/inline_flex_component.html.erb +0 -6
- data/app/components/ariadne/inline_flex_component.rb +0 -72
- data/app/components/ariadne/layout_component.html.erb +0 -21
- data/app/components/ariadne/layout_component.rb +0 -69
- data/app/components/ariadne/link_component.rb +0 -65
- data/app/components/ariadne/list_component/list_component.html.erb +0 -3
- data/app/components/ariadne/list_component.rb +0 -70
- data/app/components/ariadne/modal_component.html.erb +0 -11
- data/app/components/ariadne/modal_component.rb +0 -88
- data/app/components/ariadne/narrow_container_component/narrow_container_component.html.erb +0 -3
- data/app/components/ariadne/narrow_container_component.rb +0 -30
- data/app/components/ariadne/options_controller/options_controller.d.ts +0 -39
- data/app/components/ariadne/options_controller/options_controller.js +0 -89
- data/app/components/ariadne/options_controller/options_controller.ts +0 -122
- data/app/components/ariadne/outlet_manager_controller/outlet_manager_controller.d.ts +0 -42
- data/app/components/ariadne/outlet_manager_controller/outlet_manager_controller.js +0 -237
- data/app/components/ariadne/outlet_manager_controller/outlet_manager_controller.ts +0 -278
- data/app/components/ariadne/panel_bar_component/panel_bar_component.html.erb +0 -20
- data/app/components/ariadne/panel_bar_component.rb +0 -80
- data/app/components/ariadne/pill_component/pill_component.html.erb +0 -3
- data/app/components/ariadne/pill_component.rb +0 -44
- data/app/components/ariadne/popover_component.html.erb +0 -10
- data/app/components/ariadne/popover_component.rb +0 -81
- data/app/components/ariadne/progress_bar_component.html.erb +0 -5
- data/app/components/ariadne/progress_bar_component.rb +0 -63
- data/app/components/ariadne/relative_time_component.html.erb +0 -3
- data/app/components/ariadne/relative_time_component.rb +0 -61
- data/app/components/ariadne/show_more_button_component.html.erb +0 -11
- data/app/components/ariadne/show_more_button_component.rb +0 -47
- data/app/components/ariadne/slideover_component/slideover-component.d.ts +0 -9
- data/app/components/ariadne/slideover_component/slideover-component.js +0 -11
- data/app/components/ariadne/slideover_component/slideover-component.ts +0 -17
- data/app/components/ariadne/slideover_component/slideover_component.html.erb +0 -9
- data/app/components/ariadne/slideover_component.rb +0 -66
- data/app/components/ariadne/spinner_component.html.erb +0 -16
- data/app/components/ariadne/spinner_component.rb +0 -45
- data/app/components/ariadne/string_match_controller/string_match_controller.d.ts +0 -27
- data/app/components/ariadne/string_match_controller/string_match_controller.js +0 -51
- data/app/components/ariadne/string_match_controller/string_match_controller.ts +0 -65
- data/app/components/ariadne/subheader_component.html.erb +0 -11
- data/app/components/ariadne/subheader_component.rb +0 -65
- data/app/components/ariadne/synced_boolean_attributes_controller/synced_boolean_attributes_controller.d.ts +0 -48
- data/app/components/ariadne/synced_boolean_attributes_controller/synced_boolean_attributes_controller.js +0 -207
- data/app/components/ariadne/synced_boolean_attributes_controller/synced_boolean_attributes_controller.ts +0 -256
- data/app/components/ariadne/tab_component/tab_component.html.erb +0 -3
- data/app/components/ariadne/tab_component.rb +0 -98
- data/app/components/ariadne/tab_container_component/tab-container-component.d.ts +0 -1
- data/app/components/ariadne/tab_container_component/tab-container-component.js +0 -23
- data/app/components/ariadne/tab_container_component/tab-container-component.ts +0 -24
- data/app/components/ariadne/tab_container_component.erb +0 -10
- data/app/components/ariadne/tab_container_component.rb +0 -68
- data/app/components/ariadne/tab_nav_component/tab-nav-component.d.ts +0 -9
- data/app/components/ariadne/tab_nav_component/tab-nav-component.js +0 -33
- data/app/components/ariadne/tab_nav_component/tab-nav-component.ts +0 -34
- data/app/components/ariadne/tab_nav_component/tab_nav_component.html.erb +0 -7
- data/app/components/ariadne/tab_nav_component.rb +0 -72
- data/app/components/ariadne/table_nav_component/table_nav_component.html.erb +0 -52
- data/app/components/ariadne/table_nav_component.rb +0 -338
- data/app/components/ariadne/text.rb +0 -25
- data/app/components/ariadne/time_ago_component/time-ago-component.d.ts +0 -1
- data/app/components/ariadne/time_ago_component/time-ago-component.js +0 -1
- data/app/components/ariadne/time_ago_component/time-ago-component.ts +0 -1
- data/app/components/ariadne/time_ago_component.rb +0 -56
- data/app/components/ariadne/timeline_component/timeline_component.html.erb +0 -19
- data/app/components/ariadne/timeline_component.rb +0 -34
- data/app/components/ariadne/toggle_component/toggle_component.html.erb +0 -15
- data/app/components/ariadne/toggle_component.rb +0 -95
- data/app/components/ariadne/toggleable_controller/toggleable_controller.d.ts +0 -34
- data/app/components/ariadne/toggleable_controller/toggleable_controller.js +0 -54
- data/app/components/ariadne/toggleable_controller/toggleable_controller.ts +0 -77
- data/app/components/ariadne/tooltip_component/tooltip-component.d.ts +0 -24
- data/app/components/ariadne/tooltip_component/tooltip-component.js +0 -43
- data/app/components/ariadne/tooltip_component/tooltip-component.ts +0 -57
- data/app/components/ariadne/tooltip_component/tooltip_component.html.erb +0 -4
- data/app/components/ariadne/tooltip_component.rb +0 -108
- data/app/lib/ariadne/action_view_extensions/form_helper.rb +0 -30
- data/app/lib/ariadne/audited/dsl.rb +0 -32
- data/app/lib/ariadne/form_builder.rb +0 -80
- data/app/lib/ariadne/status/dsl.rb +0 -41
- data/config/importmap.rb +0 -3
- data/exe/tailwindcss +0 -21
- data/lib/rubocop/cop/ariadne/base_cop.rb +0 -26
- data/tailwind.config.js +0 -70
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ariadne
|
4
|
-
# `Text` is a wrapper component that will apply typography styles to the text inside.
|
5
|
-
class Text < Ariadne::Component
|
6
|
-
DEFAULT_TAG = :span
|
7
|
-
|
8
|
-
# @example Default
|
9
|
-
# <%= render(Ariadne::Text.new(tag: :p, attributes: { font_weight: :bold })) { "Bold Text" } %>
|
10
|
-
# <%= render(Ariadne::Text.new(tag: :p, attributes: { color: :danger })) { "Danger Text" } %>
|
11
|
-
#
|
12
|
-
# @param tag [Symbol, String] The rendered tag name
|
13
|
-
# @param classes [String] <%= link_to_classes_docs %>
|
14
|
-
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
15
|
-
def initialize(tag: DEFAULT_TAG, classes: "", attributes: {})
|
16
|
-
@tag = tag
|
17
|
-
@classes = classes
|
18
|
-
@attributes = attributes
|
19
|
-
end
|
20
|
-
|
21
|
-
def call
|
22
|
-
render(Ariadne::BaseComponent.new(tag: @tag, classes: @classes, attributes: @attributes)) { content }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
import '@github/time-elements';
|
@@ -1 +0,0 @@
|
|
1
|
-
import '@github/time-elements';
|
@@ -1 +0,0 @@
|
|
1
|
-
import '@github/time-elements'
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ariadne
|
4
|
-
# Displays a time ariadne-relative to how long ago it was. This component requires JavaScript.
|
5
|
-
class TimeAgoComponent < Ariadne::Component
|
6
|
-
DEFAULT_TAG = :"time-ago"
|
7
|
-
TAG_OPTIONS = [DEFAULT_TAG].freeze
|
8
|
-
|
9
|
-
DEFAULT_CLASSES = "ariadne-whitespace-nowrap"
|
10
|
-
|
11
|
-
# @example Default
|
12
|
-
#
|
13
|
-
# <%= render(Ariadne::TimeAgoComponent.new(time: Time.now)) %>
|
14
|
-
#
|
15
|
-
# @param tag [Symbol, String] The rendered tag name.
|
16
|
-
# @param time [Time] The time to be formatted
|
17
|
-
# @param micro [Boolean] If true then the text will be formatted in "micro" mode, using as few characters as possible
|
18
|
-
# @param classes [String] <%%= link_to_classes_docs %>
|
19
|
-
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
20
|
-
def initialize(tag: DEFAULT_TAG, time:, micro: false, classes: "", attributes: {})
|
21
|
-
@tag = check_incoming_tag(DEFAULT_TAG, tag)
|
22
|
-
@classes = merge_class_names(
|
23
|
-
DEFAULT_CLASSES,
|
24
|
-
classes,
|
25
|
-
)
|
26
|
-
|
27
|
-
@time = time
|
28
|
-
@micro = micro
|
29
|
-
@attributes = attributes
|
30
|
-
@attributes[:datetime] = @time.utc.iso8601
|
31
|
-
@attributes[:format] = "micro" if @micro
|
32
|
-
end
|
33
|
-
|
34
|
-
def call
|
35
|
-
render(Ariadne::BaseComponent.new(tag: @tag, classes: @classes, attributes: @attributes)) { time_in_words }
|
36
|
-
end
|
37
|
-
|
38
|
-
private def time_in_words
|
39
|
-
return @time.in_time_zone.strftime("%b %-d, %Y") unless @micro
|
40
|
-
|
41
|
-
seconds_ago = Time.current - @time
|
42
|
-
|
43
|
-
if seconds_ago < 1.minute
|
44
|
-
"1m"
|
45
|
-
elsif seconds_ago >= 1.minute && seconds_ago < 1.hour
|
46
|
-
"#{(seconds_ago / 60).floor}m"
|
47
|
-
elsif seconds_ago >= 1.hour && seconds_ago < 1.day
|
48
|
-
"#{(seconds_ago / 60 / 60).floor}h"
|
49
|
-
elsif seconds_ago >= 1.day && seconds_ago < 1.year
|
50
|
-
"#{(seconds_ago / 60 / 60 / 24).floor}d"
|
51
|
-
elsif seconds_ago >= 1.year
|
52
|
-
"#{(seconds_ago / 60 / 60 / 24 / 365).floor}y"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
<%= render Ariadne::BaseComponent.new(tag: @tag, classes: @classes, attributes: @attributes) do %>
|
2
|
-
<div>
|
3
|
-
<div class="ariadne-divide-y ariadne-divide-gray-200">
|
4
|
-
<div class="ariadne-pb-4">
|
5
|
-
<h2 id="activity-title" class="ariadne-text-lg ariadne-font-medium ariadne-text-gray-900">Timeline</h2>
|
6
|
-
</div>
|
7
|
-
<div class="ariadne-pt-6">
|
8
|
-
<!-- Activity feed-->
|
9
|
-
<div class="ariadne-flow-root">
|
10
|
-
<ul role="list" class="ariadne--mb-8">
|
11
|
-
<% items.each do %>
|
12
|
-
<%= items %>
|
13
|
-
<% end %>
|
14
|
-
</ul>
|
15
|
-
</div>
|
16
|
-
</div>
|
17
|
-
</div>
|
18
|
-
</div>
|
19
|
-
<% end %>
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ariadne
|
4
|
-
# Represents a linear timeline of events. Typically, this is shown
|
5
|
-
# as part of the Conversation component.
|
6
|
-
class TimelineComponent < Ariadne::Component
|
7
|
-
DEFAULT_TAG = :div
|
8
|
-
DEFAULT_CLASSES = ""
|
9
|
-
|
10
|
-
# The sub-items(s) to render
|
11
|
-
renders_many :items, lambda { |static_content = nil, &block|
|
12
|
-
next static_content if static_content.present?
|
13
|
-
|
14
|
-
view_context.capture { block&.call }
|
15
|
-
}
|
16
|
-
|
17
|
-
# @example Default
|
18
|
-
#
|
19
|
-
# <%= render(Ariadne::TimelineComponent.new) { "Example" } %>
|
20
|
-
#
|
21
|
-
# @param tag [Symbol, String] The rendered tag name
|
22
|
-
# @param classes [String] <%= link_to_classes_docs %>
|
23
|
-
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
24
|
-
def initialize(tag: DEFAULT_TAG, classes: "", attributes: {})
|
25
|
-
@tag = check_incoming_tag(DEFAULT_TAG, tag)
|
26
|
-
@classes = merge_class_names(
|
27
|
-
DEFAULT_CLASSES,
|
28
|
-
classes,
|
29
|
-
)
|
30
|
-
|
31
|
-
@attributes = attributes
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
<%= render Ariadne::BaseComponent.new(tag: @tag, classes: @classes, attributes: @attributes) do |wrapper| %>
|
2
|
-
<label class="ariadne-flex ariadne-w-fit ariadne-items-center <%= @label_classes %>">
|
3
|
-
<% if content? %>
|
4
|
-
<span class="group-data-[label-position=start]/wrapper:ariadne-mr-1.5 group-data-[label-position=end]/wrapper:ariadne-ml-1"><%= content %></span>
|
5
|
-
<% end %>
|
6
|
-
<%= render Ariadne::BaseComponent.new(tag: :button, classes: @button_classes, attributes: @button_attributes) do |button| %>
|
7
|
-
<span class="ariadne-sr-only ariadne-translate-x-3">Use setting</span>
|
8
|
-
<span aria-hidden="true" class="ariadne-pointer-events-none ariadne-absolute ariadne-h-full ariadne-w-full ariadne-rounded-md ariadne-bg-white"></span>
|
9
|
-
<span aria-hidden="true"
|
10
|
-
class="ariadne-bg-gray-200 ariadne-pointer-events-none ariadne-absolute ariadne-mx-auto ariadne-rounded-full ariadne-transition-colors ariadne-duration-200 ariadne-ease-in-out <%= @track_classes %>"></span>
|
11
|
-
<span aria-hidden="true"
|
12
|
-
class="ariadne-pointer-events-none ariadne-absolute ariadne-left-0 ariadne-inline-block ariadne-transform ariadne-rounded-full ariadne-border ariadne-border-gray-200 ariadne-bg-white ariadne-shadow ariadne-ring-0 ariadne-transition-transform ariadne-duration-200 ariadne-ease-in-out <%= @thumb_classes %>"></span>
|
13
|
-
<% end %>
|
14
|
-
</label>
|
15
|
-
<% end %>
|
@@ -1,95 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ariadne
|
4
|
-
# Simple toggle switch with on/off state. The logic is controlled by toggleable_controller and styles applied through
|
5
|
-
# tailwind's group+data attributes: https://tailwindcss.com/docs/hover-focus-and-other-states#data-attributes
|
6
|
-
class ToggleComponent < Ariadne::Component
|
7
|
-
DEFAULT_TAG = :div
|
8
|
-
|
9
|
-
DEFAULT_STATUS_LABEL_POSITION = :start
|
10
|
-
STATUS_LABEL_POSITION_MAPPINGS = {
|
11
|
-
start: "ariadne-flex-row",
|
12
|
-
end: "ariadne-flex-row-reverse",
|
13
|
-
}.freeze
|
14
|
-
STATUS_LABEL_POSITION_OPTIONS = STATUS_LABEL_POSITION_MAPPINGS.keys.freeze
|
15
|
-
|
16
|
-
DEFAULT_SIZE = :md
|
17
|
-
THUMB_SIZE_MAPPINGS = { sm: "ariadne-translate-x-0 ariadne-h-3 ariadne-w-3 group-aria-checked/toggle:ariadne-translate-x-3", md: "ariadne-translate-x-0 ariadne-h-5 ariadne-w-5 group-aria-checked/toggle:ariadne-translate-x-5" }.freeze
|
18
|
-
TRACK_SIZE_MAPPINGS = { sm: "ariadne-h-2 ariadne-w-4", md: "ariadne-h-4 ariadne-w-9" }.freeze
|
19
|
-
BUTTON_SIZE_MAPPINGS = { sm: "ariadne-h-3 ariadne-w-6", md: "ariadne-h-5 ariadne-w-10" }.freeze
|
20
|
-
LABEL_SIZE_MAPPINGS = { sm: "ariadne-text-xs", md: "ariadne-text-lg" }.freeze
|
21
|
-
SIZE_OPTIONS = THUMB_SIZE_MAPPINGS.keys.freeze
|
22
|
-
|
23
|
-
DEFAULT_CLASSES = {
|
24
|
-
wrapper: "ariadne-group/wrapper data-[disabled=true]:ariadne-opacity-50 data-[disabled=true]:ariadne-cursor-auto",
|
25
|
-
button: "ariadne-flex ariadne-justify-center ariadne-group/toggle ariadne-relative ariadne-inline-flex ariadne-flex-shrink-0 group-data-[disabled=false]/wrapper:ariadne-cursor-pointer ariadne-items-center ariadne-justify-center ariadne-rounded-full ariadne-focus:outline-none ariadne-focus:ring-2 ariadne-focus:ring-indigo-600 ariadne-focus:ring-offset-2 disabled:ariadne-cursor-auto",
|
26
|
-
}
|
27
|
-
|
28
|
-
DEFAULT_ATTRIBUTES = {
|
29
|
-
wrapper: {}.freeze,
|
30
|
-
button: {
|
31
|
-
role: "switch",
|
32
|
-
"data-controller": "toggleable",
|
33
|
-
"data-toggleable-synced-attrs-value": '["aria-checked"]',
|
34
|
-
"data-action": "click->toggleable#toggle",
|
35
|
-
},
|
36
|
-
}.freeze
|
37
|
-
|
38
|
-
DEFAULT_TRACK_COLOR = :indigo
|
39
|
-
TRACK_COLOR_MAPPINGS = {
|
40
|
-
white: "group-aria-checked/toggle:ariadne-bg-white",
|
41
|
-
green: "group-aria-checked/toggle:ariadne-bg-green-600",
|
42
|
-
blue: "group-aria-checked/toggle:ariadne-bg-blue-600",
|
43
|
-
billy_purple: "group-aria-checked/toggle:ariadne-bg-billy-purple",
|
44
|
-
indigo: "group-aria-checked/toggle:ariadne-bg-indigo-600",
|
45
|
-
}
|
46
|
-
TRACK_COLOR_OPTIONS = TRACK_COLOR_MAPPINGS.keys.freeze
|
47
|
-
|
48
|
-
# @example Default
|
49
|
-
#
|
50
|
-
# <%= render(Ariadne::ToggleComponent.new) { "Example" } %>
|
51
|
-
#
|
52
|
-
# @param classes [String] <%= link_to_classes_docs %>
|
53
|
-
# @param color [String] <%= link_to_classes_docs %>
|
54
|
-
# @param checked [Boolean] <%= link_to_classes_docs %>
|
55
|
-
# @param disabled [Boolean] <%= link_to_classes_docs %>
|
56
|
-
# @param size [String] <%= link_to_classes_docs %>
|
57
|
-
# @param label [String] <%= link_to_classes_docs %>
|
58
|
-
# @param status_label_position [String] <%= link_to_classes_docs %>
|
59
|
-
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
60
|
-
def initialize(
|
61
|
-
classes: nil,
|
62
|
-
checked: false,
|
63
|
-
disabled: false,
|
64
|
-
size: DEFAULT_SIZE,
|
65
|
-
color: DEFAULT_TRACK_COLOR,
|
66
|
-
status_label_position: DEFAULT_STATUS_LABEL_POSITION,
|
67
|
-
attributes: {}
|
68
|
-
)
|
69
|
-
@tag = DEFAULT_TAG
|
70
|
-
@size = fetch_or_raise(SIZE_OPTIONS, size)
|
71
|
-
@status_label_position = fetch_or_raise(STATUS_LABEL_POSITION_OPTIONS, status_label_position)
|
72
|
-
@color = fetch_or_raise(TRACK_COLOR_OPTIONS, color)
|
73
|
-
@classes = merge_class_names(DEFAULT_CLASSES[:wrapper], classes)
|
74
|
-
@checked = checked
|
75
|
-
@disabled = disabled
|
76
|
-
@attributes = DEFAULT_ATTRIBUTES[:wrapper].merge({ "data-label-position": @status_label_position, "data-disabled": @disabled }).merge(attributes)
|
77
|
-
|
78
|
-
@label_classes = merge_class_names(STATUS_LABEL_POSITION_MAPPINGS.fetch(@status_label_position), LABEL_SIZE_MAPPINGS.fetch(@size))
|
79
|
-
|
80
|
-
@button_classes = merge_class_names(DEFAULT_CLASSES[:button], BUTTON_SIZE_MAPPINGS.fetch(@size))
|
81
|
-
@button_attributes = DEFAULT_ATTRIBUTES[:button].merge({ "aria-checked": @checked, "data-toggleable-state-value": @checked, disabled: @disabled })
|
82
|
-
|
83
|
-
@thumb_classes = THUMB_SIZE_MAPPINGS.fetch(@size)
|
84
|
-
@track_classes = merge_class_names(TRACK_SIZE_MAPPINGS.fetch(@size), TRACK_COLOR_MAPPINGS.fetch(@color))
|
85
|
-
end
|
86
|
-
|
87
|
-
def on?
|
88
|
-
@checked
|
89
|
-
end
|
90
|
-
|
91
|
-
def disabled?
|
92
|
-
@disabled
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
import type { TOutletChangeData } from '../outlet_manager_controller/outlet_manager_controller';
|
2
|
-
import SyncedBooleanAttributesController from '../synced_boolean_attributes_controller/synced_boolean_attributes_controller';
|
3
|
-
export interface ToggleableOutlet extends SyncedBooleanAttributesController<boolean> {
|
4
|
-
toggle: (event: Event, updateTo?: TOutletChangeData<boolean>) => void;
|
5
|
-
}
|
6
|
-
export default class ToggleableController extends SyncedBooleanAttributesController<boolean> implements ToggleableOutlet {
|
7
|
-
static outlets: string[];
|
8
|
-
static values: {
|
9
|
-
state: {
|
10
|
-
type: BooleanConstructor;
|
11
|
-
default: boolean;
|
12
|
-
};
|
13
|
-
closeOnOutsideClick: {
|
14
|
-
type: BooleanConstructor;
|
15
|
-
default: boolean;
|
16
|
-
};
|
17
|
-
syncedAttrs: ArrayConstructor;
|
18
|
-
antiAttrs: ArrayConstructor;
|
19
|
-
protectAttrs: BooleanConstructor;
|
20
|
-
outletEvents: ArrayConstructor;
|
21
|
-
};
|
22
|
-
stateValue: boolean;
|
23
|
-
readonly closeOnOutsideClickValue: boolean;
|
24
|
-
connect(): void;
|
25
|
-
toggle(event: Event, updateTo?: TOutletChangeData<boolean>): void;
|
26
|
-
on(event: Event): void;
|
27
|
-
off(event: Event): void;
|
28
|
-
clickOutside(event: Event): void;
|
29
|
-
getValueForElement(element: Element): boolean | null;
|
30
|
-
getElementsToSync(): Element[] | null | undefined;
|
31
|
-
getState(): boolean;
|
32
|
-
get event_key_postfix(): "on" | "off";
|
33
|
-
outletUpdate: (event: Event, updateTo?: TOutletChangeData<boolean>) => void;
|
34
|
-
}
|
@@ -1,54 +0,0 @@
|
|
1
|
-
import { useClickOutside } from 'stimulus-use';
|
2
|
-
import SyncedBooleanAttributesController from '../synced_boolean_attributes_controller/synced_boolean_attributes_controller';
|
3
|
-
class ToggleableController extends SyncedBooleanAttributesController {
|
4
|
-
constructor() {
|
5
|
-
super(...arguments);
|
6
|
-
this.outletUpdate = this.toggle;
|
7
|
-
}
|
8
|
-
connect() {
|
9
|
-
this.syncElementAttributes();
|
10
|
-
useClickOutside(this, { dispatchEvent: this.closeOnOutsideClickValue && this.stateValue });
|
11
|
-
}
|
12
|
-
toggle(event, updateTo = {}) {
|
13
|
-
var _a;
|
14
|
-
const v = (_a = updateTo.data) !== null && _a !== void 0 ? _a : !this.stateValue;
|
15
|
-
this.updateAttributesForElement(this.element, v);
|
16
|
-
this.stateValue = v;
|
17
|
-
this.sendToOutlets(event, Object.assign(Object.assign({}, updateTo), { data: v }));
|
18
|
-
}
|
19
|
-
on(event) {
|
20
|
-
this.toggle(event, { data: true });
|
21
|
-
}
|
22
|
-
off(event) {
|
23
|
-
this.toggle(event, { data: false });
|
24
|
-
}
|
25
|
-
clickOutside(event) {
|
26
|
-
if (this.closeOnOutsideClickValue && this.stateValue) {
|
27
|
-
this.toggle(event, { data: false });
|
28
|
-
}
|
29
|
-
}
|
30
|
-
getValueForElement(element) {
|
31
|
-
if (element !== this.element) {
|
32
|
-
return null;
|
33
|
-
}
|
34
|
-
return this.stateValue;
|
35
|
-
}
|
36
|
-
getElementsToSync() {
|
37
|
-
return [this.element];
|
38
|
-
}
|
39
|
-
getState() {
|
40
|
-
return this.stateValue;
|
41
|
-
}
|
42
|
-
get event_key_postfix() {
|
43
|
-
return this.stateValue ? 'on' : 'off';
|
44
|
-
}
|
45
|
-
}
|
46
|
-
ToggleableController.outlets = SyncedBooleanAttributesController.outlets;
|
47
|
-
ToggleableController.values = Object.assign(Object.assign({}, SyncedBooleanAttributesController.values), { state: {
|
48
|
-
type: Boolean,
|
49
|
-
default: false,
|
50
|
-
}, closeOnOutsideClick: {
|
51
|
-
type: Boolean,
|
52
|
-
default: false,
|
53
|
-
} });
|
54
|
-
export default ToggleableController;
|
@@ -1,77 +0,0 @@
|
|
1
|
-
import type {TOutletChangeData} from '../outlet_manager_controller/outlet_manager_controller'
|
2
|
-
import {useClickOutside} from 'stimulus-use'
|
3
|
-
import SyncedBooleanAttributesController from '../synced_boolean_attributes_controller/synced_boolean_attributes_controller'
|
4
|
-
|
5
|
-
export interface ToggleableOutlet extends SyncedBooleanAttributesController<boolean> {
|
6
|
-
toggle: (event: Event, updateTo?: TOutletChangeData<boolean>) => void
|
7
|
-
}
|
8
|
-
|
9
|
-
export default class ToggleableController
|
10
|
-
extends SyncedBooleanAttributesController<boolean>
|
11
|
-
implements ToggleableOutlet
|
12
|
-
{
|
13
|
-
static outlets = SyncedBooleanAttributesController.outlets
|
14
|
-
static values = {
|
15
|
-
...SyncedBooleanAttributesController.values,
|
16
|
-
state: {
|
17
|
-
type: Boolean,
|
18
|
-
default: false,
|
19
|
-
},
|
20
|
-
closeOnOutsideClick: {
|
21
|
-
type: Boolean,
|
22
|
-
default: false,
|
23
|
-
},
|
24
|
-
}
|
25
|
-
|
26
|
-
declare stateValue: boolean
|
27
|
-
declare readonly closeOnOutsideClickValue: boolean
|
28
|
-
|
29
|
-
connect(): void {
|
30
|
-
this.syncElementAttributes()
|
31
|
-
useClickOutside(this, {dispatchEvent: this.closeOnOutsideClickValue && this.stateValue})
|
32
|
-
}
|
33
|
-
|
34
|
-
toggle(event: Event, updateTo: TOutletChangeData<boolean> = {}) {
|
35
|
-
const v = updateTo.data ?? !this.stateValue
|
36
|
-
|
37
|
-
this.updateAttributesForElement(this.element, v)
|
38
|
-
this.stateValue = v
|
39
|
-
this.sendToOutlets(event, {...updateTo, data: v})
|
40
|
-
}
|
41
|
-
|
42
|
-
on(event: Event) {
|
43
|
-
this.toggle(event, {data: true})
|
44
|
-
}
|
45
|
-
|
46
|
-
off(event: Event) {
|
47
|
-
this.toggle(event, {data: false})
|
48
|
-
}
|
49
|
-
|
50
|
-
clickOutside(event: Event) {
|
51
|
-
if (this.closeOnOutsideClickValue && this.stateValue) {
|
52
|
-
this.toggle(event, {data: false})
|
53
|
-
}
|
54
|
-
}
|
55
|
-
|
56
|
-
getValueForElement(element: Element): boolean | null {
|
57
|
-
if (element !== this.element) {
|
58
|
-
return null
|
59
|
-
}
|
60
|
-
|
61
|
-
return this.stateValue
|
62
|
-
}
|
63
|
-
|
64
|
-
getElementsToSync(): Element[] | null | undefined {
|
65
|
-
return [this.element]
|
66
|
-
}
|
67
|
-
|
68
|
-
getState() {
|
69
|
-
return this.stateValue
|
70
|
-
}
|
71
|
-
|
72
|
-
get event_key_postfix() {
|
73
|
-
return this.stateValue ? 'on' : 'off'
|
74
|
-
}
|
75
|
-
|
76
|
-
outletUpdate = this.toggle
|
77
|
-
}
|
@@ -1,24 +0,0 @@
|
|
1
|
-
import { Controller } from '@hotwired/stimulus';
|
2
|
-
import type { Instance, Placement } from '@popperjs/core';
|
3
|
-
export default class TooltipComponent extends Controller {
|
4
|
-
static targets: string[];
|
5
|
-
readonly triggerTarget: HTMLElement;
|
6
|
-
readonly tooltipTarget: HTMLElement;
|
7
|
-
static values: {
|
8
|
-
placement: {
|
9
|
-
type: StringConstructor;
|
10
|
-
default: string;
|
11
|
-
};
|
12
|
-
offset: {
|
13
|
-
type: ArrayConstructor;
|
14
|
-
default: number[];
|
15
|
-
};
|
16
|
-
};
|
17
|
-
readonly placementValue: Placement;
|
18
|
-
readonly offsetValue: Array<number>;
|
19
|
-
popperInstance: Instance;
|
20
|
-
connect(): void;
|
21
|
-
disconnect(): void;
|
22
|
-
show(): void;
|
23
|
-
hide(): void;
|
24
|
-
}
|
@@ -1,43 +0,0 @@
|
|
1
|
-
import { Controller } from '@hotwired/stimulus';
|
2
|
-
import { createPopper } from '@popperjs/core';
|
3
|
-
class TooltipComponent extends Controller {
|
4
|
-
// Create a new Popper instance
|
5
|
-
connect() {
|
6
|
-
this.popperInstance = createPopper(this.triggerTarget, this.tooltipTarget, {
|
7
|
-
placement: this.placementValue,
|
8
|
-
modifiers: [
|
9
|
-
{
|
10
|
-
name: 'offset',
|
11
|
-
options: {
|
12
|
-
offset: this.offsetValue,
|
13
|
-
},
|
14
|
-
},
|
15
|
-
],
|
16
|
-
});
|
17
|
-
}
|
18
|
-
// Destroy the Popper instance
|
19
|
-
disconnect() {
|
20
|
-
if (this.popperInstance) {
|
21
|
-
this.popperInstance.destroy();
|
22
|
-
}
|
23
|
-
}
|
24
|
-
show() {
|
25
|
-
this.tooltipTarget.setAttribute('data-tooltip-show', '');
|
26
|
-
this.tooltipTarget.classList.remove('ariadne-invisible');
|
27
|
-
// We need to tell Popper to update the tooltip position
|
28
|
-
// after we show the tooltip, otherwise it will be incorrect
|
29
|
-
this.popperInstance.update();
|
30
|
-
this.dispatch('shown', { detail: { trigger: this.triggerTarget, tooltip: this.tooltipTarget } });
|
31
|
-
}
|
32
|
-
hide() {
|
33
|
-
this.tooltipTarget.removeAttribute('data-tooltip-show');
|
34
|
-
this.tooltipTarget.classList.add('ariadne-invisible');
|
35
|
-
this.dispatch('ariadne-hidden', { detail: { trigger: this.triggerTarget, tooltip: this.tooltipTarget } });
|
36
|
-
}
|
37
|
-
}
|
38
|
-
TooltipComponent.targets = ['trigger', 'tooltip'];
|
39
|
-
TooltipComponent.values = {
|
40
|
-
placement: { type: String, default: 'top' },
|
41
|
-
offset: { type: Array, default: [0, 8] },
|
42
|
-
};
|
43
|
-
export default TooltipComponent;
|
@@ -1,57 +0,0 @@
|
|
1
|
-
import {Controller} from '@hotwired/stimulus'
|
2
|
-
import {createPopper} from '@popperjs/core'
|
3
|
-
import type {Instance, Placement} from '@popperjs/core'
|
4
|
-
|
5
|
-
export default class TooltipComponent extends Controller {
|
6
|
-
static targets = ['trigger', 'tooltip']
|
7
|
-
declare readonly triggerTarget: HTMLElement
|
8
|
-
declare readonly tooltipTarget: HTMLElement
|
9
|
-
|
10
|
-
static values = {
|
11
|
-
placement: {type: String, default: 'top'},
|
12
|
-
offset: {type: Array, default: [0, 8]},
|
13
|
-
}
|
14
|
-
declare readonly placementValue: Placement
|
15
|
-
declare readonly offsetValue: Array<number>
|
16
|
-
|
17
|
-
popperInstance: Instance
|
18
|
-
|
19
|
-
// Create a new Popper instance
|
20
|
-
connect() {
|
21
|
-
this.popperInstance = createPopper(this.triggerTarget, this.tooltipTarget, {
|
22
|
-
placement: this.placementValue,
|
23
|
-
modifiers: [
|
24
|
-
{
|
25
|
-
name: 'offset',
|
26
|
-
options: {
|
27
|
-
offset: this.offsetValue,
|
28
|
-
},
|
29
|
-
},
|
30
|
-
],
|
31
|
-
})
|
32
|
-
}
|
33
|
-
|
34
|
-
// Destroy the Popper instance
|
35
|
-
disconnect() {
|
36
|
-
if (this.popperInstance) {
|
37
|
-
this.popperInstance.destroy()
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
show() {
|
42
|
-
this.tooltipTarget.setAttribute('data-tooltip-show', '')
|
43
|
-
this.tooltipTarget.classList.remove('ariadne-invisible')
|
44
|
-
|
45
|
-
// We need to tell Popper to update the tooltip position
|
46
|
-
// after we show the tooltip, otherwise it will be incorrect
|
47
|
-
this.popperInstance.update()
|
48
|
-
this.dispatch('shown', {detail: {trigger: this.triggerTarget, tooltip: this.tooltipTarget}})
|
49
|
-
}
|
50
|
-
|
51
|
-
hide() {
|
52
|
-
this.tooltipTarget.removeAttribute('data-tooltip-show')
|
53
|
-
this.tooltipTarget.classList.add('ariadne-invisible')
|
54
|
-
|
55
|
-
this.dispatch('ariadne-hidden', {detail: {trigger: this.triggerTarget, tooltip: this.tooltipTarget}})
|
56
|
-
}
|
57
|
-
}
|
@@ -1,108 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Ariadne
|
4
|
-
# `Tooltip` only appears on mouse hover or keyboard focus and contain a label or description text.
|
5
|
-
# Use tooltips sparingly and as a last resort.
|
6
|
-
#
|
7
|
-
# When using a tooltip, follow the provided guidelines to avoid accessibility issues.
|
8
|
-
#
|
9
|
-
# - Tooltip text should be brief and to the point. The tooltip content must be a string.
|
10
|
-
# - Tooltips should contain only **non-essential text**. Tooltips can easily be missed and are not accessible on touch devices so never
|
11
|
-
# use tooltips to convey critical information.
|
12
|
-
#
|
13
|
-
# @accessibility
|
14
|
-
# - **Never set tooltips on static elements.** Tooltips should only be used on interactive elements like buttons or links to avoid excluding keyboard-only users
|
15
|
-
# and screen reader users.
|
16
|
-
# - Place `Tooltip` adjacent after its trigger element in the DOM. This allows screen reader users to navigate to and copy the tooltip
|
17
|
-
# content.
|
18
|
-
# ### Which `type` should I set?
|
19
|
-
# Setting `:description` establishes an `aria-describedby` relationship, while `:label` establishes an `aria-labelledby` relationship between the trigger element and the tooltip,
|
20
|
-
#
|
21
|
-
# The `type` drastically changes semantics and screen reader behavior so follow these guidelines carefully:
|
22
|
-
# - When there is already a visible label text on the trigger element, the tooltip is likely intended to supplement the existing text, so set `type: :description`.
|
23
|
-
# The majority of tooltips will fall under this category.
|
24
|
-
# - When there is no visible text on the trigger element and the tooltip content is appropriate as a label for the element, set `type: :label`.
|
25
|
-
# This type is usually only appropriate for an icon-only control.
|
26
|
-
class TooltipComponent < Ariadne::Component
|
27
|
-
DEFAULT_TAG = :tooltip
|
28
|
-
DEFAULT_PLACEMENT = :top
|
29
|
-
VALID_PLACEMENTS = [DEFAULT_PLACEMENT, :right, :bottom, :left].freeze
|
30
|
-
|
31
|
-
DEFAULT_CLASSES = "ariadne-invisible ariadne-absolute ariadne-bg-slate-900 ariadne-text-white ariadne-font-semibold ariadne-max-w-xs ariadne-py-1 ariadne-px-2 ariadne-rounded ariadne-z-max"
|
32
|
-
|
33
|
-
DATA_CONTROLLER = "tooltip-component"
|
34
|
-
DATA_ACTION = "mouseover->tooltip-component#show mouseout->tooltip-component#hide"
|
35
|
-
|
36
|
-
TYPE_DEFAULT = :description
|
37
|
-
VALID_TYPES = [:label, TYPE_DEFAULT].freeze
|
38
|
-
|
39
|
-
# DEFAULT_DATA_ATTRIBUTES = {
|
40
|
-
# "data-controller": DATA_CONTROLLER,
|
41
|
-
# "data-action": "mouseover->tooltip-component#show mouseout->tooltip-component#hide",
|
42
|
-
# "data-tooltip-component-placement": DEFAULT_PLACEMENT,
|
43
|
-
# }
|
44
|
-
|
45
|
-
# @example As a description for an icon-only button
|
46
|
-
# @description
|
47
|
-
# If the tooltip content provides supplementary description, set `type: :description` to establish an `aria-describedby` relationship.
|
48
|
-
# The trigger element should also have a _concise_ accessible label via `aria-label`.
|
49
|
-
# @code
|
50
|
-
# <%= render(Ariadne::HeroiconComponent.new(icon: :moon, variant: HeroiconsHelper::Icon::VARIANT_OUTLINE, attributes: { id: "bold-button-0" })) %>
|
51
|
-
# <%= render(Ariadne::TooltipComponent.new(for_id: "bold-button-0", type: :description, text: "Add bold text", direction: :top)) %>
|
52
|
-
# @example As a label for an icon-only button
|
53
|
-
# @description
|
54
|
-
# If the tooltip labels the icon-only button, set `type: :label`. This tooltip content becomes the accessible name for the button.
|
55
|
-
# @code
|
56
|
-
# <%= render(Ariadne::ButtonComponent.new(attributes: { id: "like-button" })) { "👍" } %>
|
57
|
-
# <%= render(Ariadne::TooltipComponent.new(for_id: "like-button", type: :label, text: "Like", direction: :top)) %>
|
58
|
-
#
|
59
|
-
# @example As a description for a button with visible label
|
60
|
-
# @description
|
61
|
-
# If the button already has visible label text, the tooltip content is likely supplementary so set `type: :description`.
|
62
|
-
# @code
|
63
|
-
# <%= render(Ariadne::ButtonComponent.new(attributes: {id: "save-button"}, scheme: :success)) { "Save" } %>
|
64
|
-
# <%= render(Ariadne::TooltipComponent.new(for_id: "save-button", type: :description, text: "This will immediately impact all organization members", direction: :right)) %>
|
65
|
-
# @example With direction
|
66
|
-
# @description
|
67
|
-
# Set direction of tooltip with `direction`. The tooltip is responsive and will automatically adjust direction to avoid cutting off.
|
68
|
-
# @code
|
69
|
-
# <%= render(Ariadne::ButtonComponent.new(attributes: {id: "North", m: 2})) { "North" } %>
|
70
|
-
# <%= render(Ariadne::TooltipComponent.new(for_id: "North", type: :description, text: "This is a North-facing tooltip, and is responsive.", direction: :top)) %>
|
71
|
-
# <%= render(Ariadne::ButtonComponent.new(attributes: {id: "South", m: 2})) { "South" } %>
|
72
|
-
# <%= render(Ariadne::TooltipComponent.new(for_id: "South", type: :description, text: "This is a South-facing tooltip and is responsive.", direction: :bottom)) %>
|
73
|
-
# <%= render(Ariadne::ButtonComponent.new(attributes: {id: "East", m: 2})) { "East" } %>
|
74
|
-
# <%= render(Ariadne::TooltipComponent.new(for_id: "East", type: :description, text: "This is a East-facing tooltip and is responsive.", direction: :right)) %>
|
75
|
-
# <%= render(Ariadne::ButtonComponent.new(attributes: {id: "West", m: 2})) { "West" } %>
|
76
|
-
# <%= render(Ariadne::TooltipComponent.new(for_id: "West""", type: :description, text: "This is a West-facing tooltip and is responsive.", direction: :left)) %>
|
77
|
-
# @example With relative parent
|
78
|
-
# @description
|
79
|
-
# When the tooltip and trigger element have a parent container with `relative: position`, it should not affect width of the tooltip.
|
80
|
-
# @code
|
81
|
-
# <span style="position: relative;">
|
82
|
-
# <%= render(Ariadne::ButtonComponent.new(attributes: {id: "test-button"}, scheme: :info)) { "Test" } %>
|
83
|
-
# <%= render(Ariadne::TooltipComponent.new(for_id: "test-button", type: :description, text: "This tooltip should take up the full width", direction: :bottom)) %>
|
84
|
-
# </span>
|
85
|
-
# @param tag [Symbol, String] The rendered tag name
|
86
|
-
# @param for_id [String] The ID of the element that the tooltip should be attached to.
|
87
|
-
# @param text [String] The text content of the tooltip. This should be brief and no longer than a sentence.
|
88
|
-
# @param type [Symbol] <%= one_of(Ariadne::TooltipComponent::VALID_TYPES) %>
|
89
|
-
# @param direction [Symbol] <%= one_of(Ariadne::TooltipComponent::VALID_PLACEMENTS) %>
|
90
|
-
# @param classes [String] <%= link_to_classes_docs %>
|
91
|
-
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
92
|
-
def initialize(tag: DEFAULT_TAG, for_id:, text:, type: TYPE_DEFAULT, direction: DEFAULT_PLACEMENT, classes: "", attributes: {})
|
93
|
-
raise TypeError, "tooltip text must be a string" unless text.is_a?(String)
|
94
|
-
|
95
|
-
@tag = check_incoming_tag(DEFAULT_TAG, tag)
|
96
|
-
|
97
|
-
@text = text
|
98
|
-
@classes = merge_class_names(DEFAULT_CLASSES, classes)
|
99
|
-
|
100
|
-
@attributes = attributes
|
101
|
-
@attributes[:for] = for_id
|
102
|
-
|
103
|
-
@attributes[:"data-tooltip-component-placement"] = fetch_or_raise(VALID_PLACEMENTS, direction)
|
104
|
-
@attributes[:"data-type"] = fetch_or_raise(VALID_TYPES, type)
|
105
|
-
@attributes[:"data-tooltip-component-target"] = "tooltip"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|