coveragebook_components 0.19.12 → 0.20.0
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/app/assets/build/coco/coco.css +20 -4
- data/app/assets/build/coco/coco.js +5 -4
- data/app/components/coco/images/icon/icon.css +6 -0
- data/app/components/coco/images/icon/icon.rb +20 -59
- data/app/components/coco/modals/modal_lightbox/modal_lightbox.css +1 -0
- data/app/helpers/coco/components_helper.rb +8 -2
- data/config/coco.yml +12 -0
- data/lib/coco/engine.rb +12 -0
- data/lib/coco/icon_set.rb +57 -0
- data/lib/coco/icon_sprite.rb +45 -0
- data/lib/coco.rb +9 -1
- data/lookbook/app/helpers/application_helper.rb +28 -0
- data/lookbook/app/previews/buttons/button_group_preview.rb +148 -0
- data/lookbook/app/previews/buttons/button_preview.rb +729 -0
- data/lookbook/app/previews/buttons/button_to_preview.rb +18 -0
- data/lookbook/app/previews/buttons/color_picker_button_preview.rb +42 -0
- data/lookbook/app/previews/buttons/image_picker_button_preview.rb +46 -0
- data/lookbook/app/previews/buttons/layout_picker_button_preview/default.html.erb +12 -0
- data/lookbook/app/previews/buttons/layout_picker_button_preview.rb +6 -0
- data/lookbook/app/previews/buttons/option_bar_preview.rb +29 -0
- data/lookbook/app/previews/buttons/toolbar_preview.rb +115 -0
- data/lookbook/app/previews/embeds/youtube_embed_preview.rb +7 -0
- data/lookbook/app/previews/forms/fields_preview/button.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/check_box.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/color_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/date_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/date_select.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/datetime_local_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/datetime_select.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/email_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/error_message.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/file_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/hint.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/label.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/month_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/number_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/password_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/radio_button.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/range_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/search_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/select.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/submit.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/telephone_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/text_area.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/text_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/time_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/time_select.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/time_zone_select.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/url_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/week_field.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview/weekday_select.html.erb +3 -0
- data/lookbook/app/previews/forms/fields_preview.rb +111 -0
- data/lookbook/app/previews/images/avatar_preview.rb +24 -0
- data/lookbook/app/previews/images/icon_preview.rb +141 -0
- data/lookbook/app/previews/images/image_preview.rb +15 -0
- data/lookbook/app/previews/images/svg_preview.rb +8 -0
- data/lookbook/app/previews/indicators/badge_preview.rb +68 -0
- data/lookbook/app/previews/indicators/stamp_preview.rb +108 -0
- data/lookbook/app/previews/layout/page_layout_preview/block_content.html.erb +13 -0
- data/lookbook/app/previews/layout/page_layout_preview/default.html.erb +19 -0
- data/lookbook/app/previews/layout/page_layout_preview/full_width.html.erb +12 -0
- data/lookbook/app/previews/layout/page_layout_preview/hidden_content.html.erb +18 -0
- data/lookbook/app/previews/layout/page_layout_preview/mixed.html.erb +15 -0
- data/lookbook/app/previews/layout/page_layout_preview/pagination.html.erb +12 -0
- data/lookbook/app/previews/layout/page_layout_preview/polling.html.erb +12 -0
- data/lookbook/app/previews/layout/page_layout_preview/sections.html.erb +13 -0
- data/lookbook/app/previews/layout/page_layout_preview/spacing.html.erb +33 -0
- data/lookbook/app/previews/layout/page_layout_preview.rb +38 -0
- data/lookbook/app/previews/layout/panel_preview/basic.html.erb +5 -0
- data/lookbook/app/previews/layout/panel_preview.rb +6 -0
- data/lookbook/app/previews/layout/spacer_preview/default.html.erb +5 -0
- data/lookbook/app/previews/layout/spacer_preview/responsive.html.erb +12 -0
- data/lookbook/app/previews/layout/spacer_preview/sizes.html.erb +7 -0
- data/lookbook/app/previews/layout/spacer_preview.rb +19 -0
- data/lookbook/app/previews/layout/stack_preview/default.html.erb +13 -0
- data/lookbook/app/previews/layout/stack_preview/item_properties.html.erb +13 -0
- data/lookbook/app/previews/layout/stack_preview/item_spacing.html.erb +23 -0
- data/lookbook/app/previews/layout/stack_preview/nested.html.erb +19 -0
- data/lookbook/app/previews/layout/stack_preview/stack_spacing.html.erb +13 -0
- data/lookbook/app/previews/layout/stack_preview.rb +21 -0
- data/lookbook/app/previews/messaging/notice_preview.rb +196 -0
- data/lookbook/app/previews/messaging/popover_preview/placement.html.erb +7 -0
- data/lookbook/app/previews/messaging/popover_preview/targets.html.erb +17 -0
- data/lookbook/app/previews/messaging/popover_preview/themes.html.erb +19 -0
- data/lookbook/app/previews/messaging/popover_preview/triggers.html.erb +19 -0
- data/lookbook/app/previews/messaging/popover_preview.rb +15 -0
- data/lookbook/app/previews/messaging/snackbar_preview/manual_show.html.erb +5 -0
- data/lookbook/app/previews/messaging/snackbar_preview/queue.html.erb +20 -0
- data/lookbook/app/previews/messaging/snackbar_preview/system_test_manual_show.html.erb +5 -0
- data/lookbook/app/previews/messaging/snackbar_preview.rb +128 -0
- data/lookbook/app/previews/messaging/system_banner_preview.rb +85 -0
- data/lookbook/app/previews/messaging/toast_preview.rb +132 -0
- data/lookbook/app/previews/messaging/tooltip_preview.rb +11 -0
- data/lookbook/app/previews/modals/modal_canvas_preview/basic.html.erb +6 -0
- data/lookbook/app/previews/modals/modal_canvas_preview.rb +7 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/basic.html.erb +4 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/in_page.html.erb +3 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/large.html.erb +4 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/medium.html.erb +4 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/named.html.erb +5 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/navigate.html.erb +3 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/not_dismissable.html.erb +3 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/not_shown.html.erb +5 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/notice.html.erb +8 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/small.html.erb +4 -0
- data/lookbook/app/previews/modals/modal_dialog_preview/triggers.html.erb +9 -0
- data/lookbook/app/previews/modals/modal_dialog_preview.rb +45 -0
- data/lookbook/app/previews/modals/modal_lightbox_preview/basic.html.erb +5 -0
- data/lookbook/app/previews/modals/modal_lightbox_preview/named.html.erb +6 -0
- data/lookbook/app/previews/modals/modal_lightbox_preview/scroll.html.erb +6 -0
- data/lookbook/app/previews/modals/modal_lightbox_preview/triggers.html.erb +8 -0
- data/lookbook/app/previews/modals/modal_lightbox_preview.rb +20 -0
- data/lookbook/app/previews/modals/modal_preview/basic.html.erb +6 -0
- data/lookbook/app/previews/modals/modal_preview.rb +8 -0
- data/lookbook/app/previews/navigation/link_preview.rb +74 -0
- data/lookbook/app/previews/navigation/link_to_preview.rb +88 -0
- data/lookbook/app/previews/navigation/pager_button_preview.rb +12 -0
- data/lookbook/app/previews/navigation/tabs_preview/basic.html.erb +5 -0
- data/lookbook/app/previews/navigation/tabs_preview/full.html.erb +5 -0
- data/lookbook/app/previews/navigation/tabs_preview/icons.html.erb +5 -0
- data/lookbook/app/previews/navigation/tabs_preview.rb +15 -0
- data/lookbook/app/previews/pickers/color_picker_preview.rb +27 -0
- data/lookbook/app/previews/pickers/image_picker_preview.rb +24 -0
- data/lookbook/app/previews/typography/utils_preview/branded_headings.html.erb +24 -0
- data/lookbook/app/previews/typography/utils_preview/fixed_size_headings.html.erb +7 -0
- data/lookbook/app/previews/typography/utils_preview/headings.html.erb +35 -0
- data/lookbook/app/previews/typography/utils_preview.rb +16 -0
- data/lookbook/app/previews/utilities/dropdown_preview.rb +19 -0
- data/lookbook/app/previews/utilities/seamless_textarea_preview/focus.html.erb +9 -0
- data/lookbook/app/previews/utilities/seamless_textarea_preview/multi_line.html.erb +9 -0
- data/lookbook/app/previews/utilities/seamless_textarea_preview/single_line.html.erb +8 -0
- data/lookbook/app/previews/utilities/seamless_textarea_preview.rb +29 -0
- data/lookbook/app/views/layouts/application.html.erb +28 -0
- data/lookbook/app/views/layouts/blank.html.erb +16 -0
- data/lookbook/app/views/lookbook/previews/group.html.erb +37 -0
- data/lookbook/app/views/pages/plans.html.erb +21 -0
- data/lookbook/app/views/panels/_design.html.erb +85 -0
- data/lookbook/app/views/request/success.html.erb +1 -0
- data/lookbook/app/views/turbo_request/done.html.erb +3 -0
- data/lookbook/app/views/turbo_request/success.html.erb +1 -0
- metadata +134 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7174e55d00ea7174b4a8f120730c5314ff329fb91a44dfd3677c7f8232bd3972
|
4
|
+
data.tar.gz: ac82cd35db155780993509201e0d3d4ae0b329efa708634af9305f25923c2687
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5dea756622a25f146fca33444887a500cd03cd8110b4f34c501c6cbbd142fa3d77b38ee804a1dd960c13b5260d9eea44e2476b08257464b44d059007fa71d78d
|
7
|
+
data.tar.gz: 6313414a73a6de9e4f88c09fb6eea5039cafd01978e0633009b8516ff62baef5dfb287c437b0a02e415e677059457032046ae23af1482f1ffaba27fae82870f2
|
@@ -2942,6 +2942,16 @@ select{
|
|
2942
2942
|
|
2943
2943
|
/* Styles */
|
2944
2944
|
|
2945
|
+
[data-coco][data-component="icon"][data-icon] svg {
|
2946
|
+
aspect-ratio: 1 / 1;
|
2947
|
+
stroke-linecap: round;
|
2948
|
+
stroke-linejoin: round;
|
2949
|
+
fill: none;
|
2950
|
+
stroke: currentColor;
|
2951
|
+
stroke-width: 2;
|
2952
|
+
color: currentColor;
|
2953
|
+
}
|
2954
|
+
|
2945
2955
|
[data-coco][data-component="icon"][data-icon]:not([data-style="fill"]):not([data-style="custom"]) svg{
|
2946
2956
|
stroke-linecap: round;
|
2947
2957
|
stroke-linejoin: round;
|
@@ -5083,6 +5093,16 @@ select{
|
|
5083
5093
|
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)
|
5084
5094
|
}
|
5085
5095
|
|
5096
|
+
[data-coco][data-component="modal-lightbox"].\!loaded .modal-lightbox-content{
|
5097
|
+
--tw-bg-opacity: 1;
|
5098
|
+
background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1))
|
5099
|
+
}
|
5100
|
+
|
5101
|
+
[data-coco][data-component="modal-lightbox"].loaded .modal-lightbox-content{
|
5102
|
+
--tw-bg-opacity: 1;
|
5103
|
+
background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1))
|
5104
|
+
}
|
5105
|
+
|
5086
5106
|
[data-coco].coco-link{
|
5087
5107
|
display: inline-flex;
|
5088
5108
|
align-items: center
|
@@ -6105,10 +6125,6 @@ select{
|
|
6105
6125
|
display: block
|
6106
6126
|
}
|
6107
6127
|
|
6108
|
-
.grid{
|
6109
|
-
display: grid
|
6110
|
-
}
|
6111
|
-
|
6112
6128
|
.contents{
|
6113
6129
|
display: contents
|
6114
6130
|
}
|
@@ -13259,6 +13259,7 @@ var require_iro = __commonJS({
|
|
13259
13259
|
var layout = state.layout;
|
13260
13260
|
if (!Array.isArray(layout)) {
|
13261
13261
|
switch (layout) {
|
13262
|
+
// TODO: implement some?
|
13262
13263
|
default:
|
13263
13264
|
layout = [
|
13264
13265
|
{ component: IroWheel },
|
@@ -15343,7 +15344,7 @@ var alpine_default = import_alpinejs.default;
|
|
15343
15344
|
// ../../../package.json
|
15344
15345
|
var package_default = {
|
15345
15346
|
name: "coveragebook-components",
|
15346
|
-
version: "0.
|
15347
|
+
version: "0.20.0",
|
15347
15348
|
repository: "git@github.com:coveragebook/coco.git",
|
15348
15349
|
license: "NO LICENSE",
|
15349
15350
|
author: "Mark Perkins <mark@coveragebook.com>",
|
@@ -15392,12 +15393,12 @@ var package_default = {
|
|
15392
15393
|
"@percy/cli": "^1.30.0",
|
15393
15394
|
"@tailwindcss/container-queries": "^0.1.0",
|
15394
15395
|
"@tailwindcss/forms": "^0.5.9",
|
15395
|
-
"alias-hq": "^6.2.
|
15396
|
+
"alias-hq": "^6.2.4",
|
15396
15397
|
alpinejs: "^3.14.1",
|
15397
15398
|
autoprefixer: "^10.4.16",
|
15398
15399
|
"container-query-polyfill": "^1.0.2",
|
15399
15400
|
del: "^7.1.0",
|
15400
|
-
esbuild: "^0.
|
15401
|
+
esbuild: "^0.25.3",
|
15401
15402
|
"esbuild-plugin-copy": "^2.0.2",
|
15402
15403
|
"fast-glob": "^3.3.1",
|
15403
15404
|
"fast-sort": "^3.4.1",
|
@@ -15436,7 +15437,7 @@ var package_default = {
|
|
15436
15437
|
"npm run build"
|
15437
15438
|
],
|
15438
15439
|
"after:version:bump": "bundle exec rake coco:gem:bump_version[${version}] && bundle && cd lookbook && bundle",
|
15439
|
-
"after:release":
|
15440
|
+
"after:release": 'bundle exec rake "coco:gem:release[${version}]"'
|
15440
15441
|
}
|
15441
15442
|
},
|
15442
15443
|
devDependencies: {
|
@@ -2,82 +2,43 @@ module Coco
|
|
2
2
|
class Icon < Coco::Component
|
3
3
|
include Concerns::AcceptsOptions
|
4
4
|
|
5
|
-
ICON_CACHE = {}
|
6
|
-
|
7
|
-
ALIASES = {
|
8
|
-
edit: "pen-line",
|
9
|
-
"edit-3": "pen-line",
|
10
|
-
"git-commit": "git-commit-horizontal",
|
11
|
-
grid: "grid-3x3",
|
12
|
-
"user-circle": "circle-user",
|
13
|
-
layout: "panels-top-left",
|
14
|
-
"alert-circle": "circle-alert",
|
15
|
-
"check-circle": "circle-check",
|
16
|
-
"loader-2": "loader-circle",
|
17
|
-
"alert-triangle": "triangle-alert",
|
18
|
-
"arrow-right-circle": "circle-arrow-right",
|
19
|
-
"check-square": "square-check",
|
20
|
-
"help-circle": "circle-help",
|
21
|
-
"plus-circle": "circle-plus",
|
22
|
-
"plus-square": "square-plus",
|
23
|
-
"bar-chart-2": "chart-no-axes-column",
|
24
|
-
"bar-chart": "chart-no-axes-column-increasing",
|
25
|
-
"more-horizontal": "ellipsis",
|
26
|
-
"more-vertical": "ellipsis-vertical"
|
27
|
-
}.freeze
|
28
|
-
|
29
|
-
InvalidIconError = Class.new(StandardError)
|
30
|
-
|
31
5
|
accepts_option :size, from: %i[xs sm md lg xl xxl full]
|
32
|
-
accepts_option :spin, from: [true, false]
|
33
|
-
accepts_option :style, from: [:line, :fill, :custom]
|
6
|
+
accepts_option :spin, from: [true, false, nil], default: nil
|
7
|
+
accepts_option :style, from: [:line, :fill, :custom, nil], default: nil
|
34
8
|
|
35
9
|
before_render do
|
36
|
-
if name
|
37
|
-
|
38
|
-
set_option_value(:style, :custom) if icon_data[:custom]
|
39
|
-
end
|
10
|
+
set_tag_data_attr(:icon, name) if name.present?
|
11
|
+
set_option_value :style, :custom if custom?
|
40
12
|
end
|
41
13
|
|
42
14
|
def initialize(name: nil, **kwargs)
|
43
15
|
@icon_name = name&.to_s&.tr("_", "-")
|
44
16
|
end
|
45
17
|
|
46
|
-
def name
|
47
|
-
ALIASES.fetch(@icon_name.to_sym, @icon_name) if @icon_name
|
48
|
-
end
|
49
|
-
|
50
18
|
def svg
|
51
|
-
|
19
|
+
if custom?
|
20
|
+
IconSet.icon_svg(name)
|
21
|
+
elsif name? && content.blank?
|
22
|
+
%(<svg><use href="##{symbol_id}"></use></svg>).html_safe
|
23
|
+
elsif content.present?
|
24
|
+
content.to_s
|
25
|
+
elsif Rails.env.development?
|
26
|
+
raise "Missing icon '#{@icon_name}'"
|
27
|
+
end
|
52
28
|
end
|
53
29
|
|
54
|
-
def
|
55
|
-
|
56
|
-
custom: custom?,
|
57
|
-
svg: read_svg
|
58
|
-
}
|
30
|
+
def name
|
31
|
+
IconSet.resolve_icon_name(@icon_name) if @icon_name.present?
|
59
32
|
end
|
60
33
|
|
61
|
-
def
|
62
|
-
@_custom ||= File.exist?(custom_icon_path)
|
63
|
-
end
|
34
|
+
def name? = name.present?
|
64
35
|
|
65
|
-
def
|
66
|
-
if custom?
|
67
|
-
File.read(custom_icon_path).html_safe
|
68
|
-
elsif File.exist?(icon_path)
|
69
|
-
File.read(icon_path).html_safe
|
70
|
-
elsif Rails.env.development? || Rails.env.test?
|
71
|
-
raise InvalidIconError, "`#{name}` is not a valid icon name"
|
72
|
-
end
|
73
|
-
end
|
36
|
+
def custom? = IconSet.custom_icon?(name)
|
74
37
|
|
75
|
-
|
76
|
-
@_icon_path ||= Coco::Engine.root.join("app/assets/build/coco/icons/#{name}.svg")
|
77
|
-
end
|
38
|
+
protected
|
78
39
|
|
79
|
-
def
|
80
|
-
|
40
|
+
def symbol_id
|
41
|
+
IconSet.symbol_id_for_icon(name)
|
81
42
|
end
|
82
43
|
end
|
83
44
|
end
|
@@ -102,8 +102,14 @@ module Coco
|
|
102
102
|
render Coco::Avatar.new(src: src, name: name, **)
|
103
103
|
end
|
104
104
|
|
105
|
-
def coco_icon(icon_name = nil,
|
106
|
-
|
105
|
+
def coco_icon(icon_name = nil, **kwargs, &)
|
106
|
+
kwargs[:name] = icon_name if icon_name.present?
|
107
|
+
render(Coco::Icon.new(**kwargs), &)
|
108
|
+
end
|
109
|
+
|
110
|
+
def coco_icon_sprite(*extra_icons)
|
111
|
+
icons = [*Coco::IconSet.icons, *extra_icons]
|
112
|
+
Coco::IconSprite.new(icons).to_svg
|
107
113
|
end
|
108
114
|
|
109
115
|
# Indicators
|
data/config/coco.yml
ADDED
data/lib/coco/engine.rb
CHANGED
@@ -14,6 +14,18 @@ module Coco
|
|
14
14
|
#{root}/app/helpers
|
15
15
|
]
|
16
16
|
|
17
|
+
initializer "coco.config" do |app|
|
18
|
+
default_config = app.config_for(Engine.root.join("config/coco.yml")) || {}
|
19
|
+
host_config = begin
|
20
|
+
app.config_for(:coco) || {}
|
21
|
+
rescue
|
22
|
+
{}
|
23
|
+
end
|
24
|
+
|
25
|
+
merged_config = default_config.deep_merge(host_config)
|
26
|
+
app.config.coco = ActiveSupport::OrderedOptions.new.merge!(merged_config)
|
27
|
+
end
|
28
|
+
|
17
29
|
initializer "coco.autoloading" do |app|
|
18
30
|
coco_dir = "#{root}/app/components/coco"
|
19
31
|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Coco
|
2
|
+
module IconSet
|
3
|
+
ICON_DIR = "app/assets/build/coco/icons"
|
4
|
+
ICON_NAMES_FILE = "config/icons.json"
|
5
|
+
|
6
|
+
InvalidIconError = Class.new(StandardError)
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def icons
|
10
|
+
if Coco.env.development?
|
11
|
+
[*all_icons, *Coco.config.icons[:include]].uniq
|
12
|
+
else
|
13
|
+
Coco.config.icons[:include]&.uniq || []
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def aliases
|
18
|
+
Coco.config.icons[:aliases]&.stringify_keys || {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def all_icons
|
22
|
+
@all_icons ||= JSON.load_file(Engine.root.join(ICON_NAMES_FILE))
|
23
|
+
end
|
24
|
+
|
25
|
+
def resolve_icon_name(name)
|
26
|
+
aliases.fetch(name.to_s, name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def resolve_icon_path(icon_name)
|
30
|
+
search_paths = [
|
31
|
+
Engine.root.join(ICON_DIR, "custom", "#{icon_name}.svg"),
|
32
|
+
Engine.root.join(ICON_DIR, "#{icon_name}.svg")
|
33
|
+
]
|
34
|
+
|
35
|
+
search_paths.find { _1.exist? }
|
36
|
+
end
|
37
|
+
|
38
|
+
def symbol_id_for_icon(icon_name)
|
39
|
+
"svg_icon_#{icon_name.tr("-", "_")}" if icon_name.present?
|
40
|
+
end
|
41
|
+
|
42
|
+
def custom_icon?(icon_name)
|
43
|
+
icon_name && Coco.config.icons[:custom].include?(icon_name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def icon_svg(icon_name)
|
47
|
+
icon_path = resolve_icon_path(icon_name)
|
48
|
+
|
49
|
+
if icon_path.present? && icon_path&.exist?
|
50
|
+
File.read(icon_path).html_safe
|
51
|
+
end
|
52
|
+
rescue
|
53
|
+
# Do nothing...
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Coco
|
2
|
+
class IconSprite
|
3
|
+
include ActionView::Helpers::TagHelper
|
4
|
+
|
5
|
+
def initialize(icons = [])
|
6
|
+
@icons = icons
|
7
|
+
@icons.freeze
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_svg
|
11
|
+
tag.svg xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24" do
|
12
|
+
("\n" + symbols.join("\n ") + "\n").html_safe
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def symbols
|
19
|
+
@icons.map { symbol_for_icon(_1) }.compact
|
20
|
+
end
|
21
|
+
|
22
|
+
def symbol_for_icon(icon_name)
|
23
|
+
return unless icon_name.present?
|
24
|
+
|
25
|
+
svg_content = IconSet.icon_svg(icon_name)
|
26
|
+
|
27
|
+
# Extract the path data and attributes from the SVG
|
28
|
+
doc = Nokogiri::XML(svg_content)
|
29
|
+
svg_element = doc.at_css("svg")
|
30
|
+
|
31
|
+
# Extract SVG attributes that should be preserved on the symbol
|
32
|
+
preserved_attrs = %w[fill stroke stroke-width stroke-linecap stroke-linejoin viewBox style]
|
33
|
+
.index_with { svg_element[_1] }
|
34
|
+
.symbolize_keys
|
35
|
+
.with_defaults(viewBox: "0 0 24 24")
|
36
|
+
.compact
|
37
|
+
|
38
|
+
tag.symbol id: IconSet.symbol_id_for_icon(icon_name), **preserved_attrs do
|
39
|
+
svg_element.children.map(&:to_s).join.html_safe # rubocop:disable Rails/OutputSafety
|
40
|
+
end
|
41
|
+
rescue
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/coco.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require "redcarpet"
|
2
|
+
require "faker"
|
3
|
+
|
4
|
+
module ApplicationHelper
|
5
|
+
def markdown(&block)
|
6
|
+
md = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
|
7
|
+
content = capture { block.call }
|
8
|
+
md.render(content).html_safe
|
9
|
+
end
|
10
|
+
|
11
|
+
def lorem
|
12
|
+
Faker::Lorem
|
13
|
+
end
|
14
|
+
|
15
|
+
def avatar
|
16
|
+
Faker::Avatar.image
|
17
|
+
end
|
18
|
+
|
19
|
+
def placeholder_prose_html(paragraphs: 1)
|
20
|
+
markdown do
|
21
|
+
(0..paragraphs).map { lorem.paragraph(sentence_count: 2, supplemental: true, random_sentences_to_add: 4) }.join("\n\n\n")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def dev?
|
26
|
+
Rails.env.development? || (Rails.env.test? && !ENV.include?("CI"))
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
module Buttons
|
2
|
+
class ButtonGroupPreview < Coco::Preview
|
3
|
+
# @!group Basic
|
4
|
+
|
5
|
+
def basic
|
6
|
+
coco_button_group do |group|
|
7
|
+
group.with_button(tooltip: "one") { "Button one" }
|
8
|
+
group.with_button(tooltip: "two") { "Button two" }
|
9
|
+
group.with_button(tooltip: "three") { "Button three" }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def with_dividers
|
14
|
+
coco_button_group do |group|
|
15
|
+
group.with_button { "Button one" }
|
16
|
+
group.with_button { "Button two" }
|
17
|
+
group.with_divider
|
18
|
+
group.with_button { "Button three" }
|
19
|
+
group.with_button { "Button four" }
|
20
|
+
group.with_divider
|
21
|
+
group.with_button { "Button five" }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def segmented
|
26
|
+
coco_button_group(segmented: true, theme: :toolbar) do |group|
|
27
|
+
group.with_button(action: "#", method: :post) { "Form button" }
|
28
|
+
group.with_button { "Regular button" }
|
29
|
+
group.with_button(href: "#") { "Link button" }
|
30
|
+
group.with_menu_button("Menu button") do |button|
|
31
|
+
button.with_menu do |menu|
|
32
|
+
menu.with_button { "Menu item one" }
|
33
|
+
menu.with_button { "Menu item 2" }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
group.with_button do |button|
|
37
|
+
button.with_confirmation do |confirm|
|
38
|
+
confirm.with_text { "Are you sure?" }
|
39
|
+
confirm.with_button { "YES" }
|
40
|
+
end
|
41
|
+
"Button with confirmation"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def floating
|
47
|
+
coco_button_group(floating: true, theme: :toolbar) do |group|
|
48
|
+
group.with_button(tooltip: "one") { "Button one" }
|
49
|
+
group.with_button(tooltip: "two") { "Button two" }
|
50
|
+
group.with_button(tooltip: "three") { "Button three" }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def reversed
|
55
|
+
coco_button_group(reversed: true) do |group|
|
56
|
+
group.with_button(tooltip: "one") { "Button one" }
|
57
|
+
group.with_button(tooltip: "two") { "Button two" }
|
58
|
+
group.with_button(tooltip: "three") { "Button three" }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# @!group Themes
|
63
|
+
|
64
|
+
def with_theme
|
65
|
+
coco_button_group(theme: :negative) do |group|
|
66
|
+
group.with_button { "Button one" }
|
67
|
+
group.with_button { "Button two" }
|
68
|
+
group.with_button { "Button three" }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def mixed_buttons
|
73
|
+
coco_button_group do |group|
|
74
|
+
group.with_button { "Default" }
|
75
|
+
group.with_button(theme: :secondary) { "Secondary" }
|
76
|
+
group.with_button(theme: :negative) { "Negative" }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# @!group Button types
|
81
|
+
|
82
|
+
def with_secondary_actions
|
83
|
+
coco_button_group do |group|
|
84
|
+
group.with_button(tooltip: "This is a tooltip") { "With tooltip" }
|
85
|
+
|
86
|
+
group.with_button do |button|
|
87
|
+
button.with_confirmation do |confirm|
|
88
|
+
confirm.with_text { "Are you sure you want to do that?" }
|
89
|
+
confirm.with_button { "Yes, continue" }
|
90
|
+
end
|
91
|
+
|
92
|
+
"With confirmation"
|
93
|
+
end
|
94
|
+
|
95
|
+
group.with_menu_button do |button|
|
96
|
+
button.with_menu do |menu|
|
97
|
+
menu.with_button(icon: :globe) { "Menu item one" }
|
98
|
+
menu.with_button(icon: :carrot) { "Menu item 2" }
|
99
|
+
menu.with_button(icon: :bell) { "A third menu item" }
|
100
|
+
end
|
101
|
+
|
102
|
+
"With menu"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def custom_buttons
|
108
|
+
coco_button_group do |group|
|
109
|
+
group.with_button_html do
|
110
|
+
"<button>Custom button 1</button>".html_safe
|
111
|
+
end
|
112
|
+
|
113
|
+
group.with_button_html do
|
114
|
+
"<button>Custom button 2</button>".html_safe
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# @!group Collapsible
|
120
|
+
|
121
|
+
# @label All collapsible
|
122
|
+
def collapsible
|
123
|
+
coco_button_group(collapsible: true) do |group|
|
124
|
+
group.with_button(icon: :smile) { "Button one" }
|
125
|
+
group.with_button(icon: :frown) { "Button two" }
|
126
|
+
group.with_button(icon: :carrot) { "Button three" }
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# @label Some collapsible
|
131
|
+
def some_collapsible
|
132
|
+
coco_button_group(collapsible: true) do |group|
|
133
|
+
group.with_button(icon: :check) { "Collapsible" }
|
134
|
+
group.with_button(icon: :x, collapsible: false) { "Not collapsible" }
|
135
|
+
group.with_button(icon: :check) { "Collapsible" }
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# @label None collapsible
|
140
|
+
def none_collapsible
|
141
|
+
coco_button_group(collapsible: false) do |group|
|
142
|
+
group.with_button(icon: :x) { "Not Collapsible" }
|
143
|
+
group.with_button(icon: :x) { "Not collapsible" }
|
144
|
+
group.with_button(icon: :x) { "Not Collapsible" }
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|