From 17e013e852114611c6cf12f257c457277d9f5bfb Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Fri, 28 Mar 2025 19:24:23 +0100 Subject: [PATCH 01/14] Support for archive link title --- .../php/AcfFields/json/mod-posts-source.json | 57 ++++++++++++++++-- source/php/AcfFields/php/mod-posts-source.php | 60 +++++++++++++++---- source/php/Module/Posts/Posts.php | 3 + .../Posts/views/partials/more.blade.php | 2 +- 4 files changed, 105 insertions(+), 17 deletions(-) diff --git a/source/php/AcfFields/json/mod-posts-source.json b/source/php/AcfFields/json/mod-posts-source.json index a9ca75e28..6760e33ba 100644 --- a/source/php/AcfFields/json/mod-posts-source.json +++ b/source/php/AcfFields/json/mod-posts-source.json @@ -50,9 +50,17 @@ ] ], "wrapper": { - "width": "" + "width": "", + "class": "", + "id": "" + }, + "choices": { + "Place": "Place", + "School": "School", + "Project": "Project", + "JobPosting": "JobPosting", + "SpecialAnnouncement": "SpecialAnnouncement" }, - "choices": [], "default_value": false, "return_format": "value", "multiple": 0, @@ -173,8 +181,8 @@ "id": "" }, "default_value": 10, - "min": "1", - "max": "100", + "min": 1, + "max": 100, "step": "", "placeholder": "", "prepend": "", @@ -251,6 +259,34 @@ "ui_on_text": "", "ui_off_text": "" }, + { + "key": "field_67e6e75d155eb", + "label": "Link title", + "name": "archive_link_title", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 1, + "conditional_logic": [ + [ + { + "field": "field_57ecf1007b749", + "operator": "==", + "value": "1" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "placeholder": "", + "prepend": "", + "append": "" + }, { "key": "field_6710ff6562e8c", "label": "From network sites", @@ -280,7 +316,16 @@ "class": "", "id": "" }, - "choices": [], + "choices": { + "1": "Municipio", + "201": "Familjen Helsingborg", + "202": "Traineeprogrammet Familjen Helsingborg", + "203": false, + "204": false, + "205": "Intran\u00e4t", + "206": false, + "217": false + }, "default_value": [], "return_format": "array", "multiple": 1, @@ -324,4 +369,4 @@ "acfe_meta": "", "acfe_note": "" }] - + \ No newline at end of file diff --git a/source/php/AcfFields/php/mod-posts-source.php b/source/php/AcfFields/php/mod-posts-source.php index 77f365b2b..9b07919f6 100644 --- a/source/php/AcfFields/php/mod-posts-source.php +++ b/source/php/AcfFields/php/mod-posts-source.php @@ -1,9 +1,7 @@ 'group_571dfaabc3fc5', 'title' => __('Data source', 'modularity'), 'fields' => array( @@ -55,9 +53,16 @@ ), ), 'wrapper' => array( - 'width' => '' + 'width' => '', + 'class' => '', + 'id' => '', ), 'choices' => array( + 'Place' => __('Place', 'modularity'), + 'School' => __('School', 'modularity'), + 'Project' => __('Project', 'modularity'), + 'JobPosting' => __('JobPosting', 'modularity'), + 'SpecialAnnouncement' => __('SpecialAnnouncement', 'modularity'), ), 'default_value' => false, 'return_format' => 'value', @@ -185,8 +190,8 @@ 'id' => '', ), 'default_value' => 10, - 'min' => '1', - 'max' => '100', + 'min' => 1, + 'max' => 100, 'step' => '', 'placeholder' => '', 'prepend' => '', @@ -264,6 +269,34 @@ 'ui_off_text' => '', ), 8 => array( + 'key' => 'field_67e6e75d155eb', + 'label' => __('Link title', 'modularity'), + 'name' => 'archive_link_title', + 'aria-label' => '', + 'type' => 'text', + 'instructions' => '', + 'required' => 1, + 'conditional_logic' => array( + 0 => array( + 0 => array( + 'field' => 'field_57ecf1007b749', + 'operator' => '==', + 'value' => '1', + ), + ), + ), + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'default_value' => '', + 'maxlength' => '', + 'placeholder' => '', + 'prepend' => '', + 'append' => '', + ), + 9 => array( 'key' => 'field_6710ff6562e8c', 'label' => __('From network sites', 'modularity'), 'name' => 'posts_data_network_sources', @@ -293,6 +326,14 @@ 'id' => '', ), 'choices' => array( + 1 => __('Municipio', 'modularity'), + 201 => __('Familjen Helsingborg', 'modularity'), + 202 => __('Traineeprogrammet Familjen Helsingborg', 'modularity'), + 203 => false, + 204 => false, + 205 => __('Intranät', 'modularity'), + 206 => false, + 217 => false, ), 'default_value' => array( ), @@ -338,5 +379,4 @@ 'acfe_meta' => '', 'acfe_note' => '', )); - -} \ No newline at end of file + } \ No newline at end of file diff --git a/source/php/Module/Posts/Posts.php b/source/php/Module/Posts/Posts.php index 7e8540928..90ed19856 100644 --- a/source/php/Module/Posts/Posts.php +++ b/source/php/Module/Posts/Posts.php @@ -173,6 +173,9 @@ public function data(): array $this->fields ?? null ); + // Archive link title + $data['archive_link_title'] = $this->fields['archive_link_title']; + //Add filters to archive link if($data['archive_link_url'] && is_array($data['filters']) && !empty($data['filters'])) { $data['archive_link_url'] .= "?" . http_build_query($data['filters']); diff --git a/source/php/Module/Posts/views/partials/more.blade.php b/source/php/Module/Posts/views/partials/more.blade.php index bbc7a5a47..02ba09912 100644 --- a/source/php/Module/Posts/views/partials/more.blade.php +++ b/source/php/Module/Posts/views/partials/more.blade.php @@ -1,7 +1,7 @@ @if ($posts_data_source !== 'input' && !empty($archive_link_url))
@button([ - 'text' => $lang['showMore'], + 'text' => $archive_link_title ?? $lang['showMore'], 'color' => 'secondary', 'style' => 'filled', 'href' => $archive_link_url, From 16ed291df8a3f65db39016331063e1133d1964ab Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Fri, 28 Mar 2025 20:15:19 +0100 Subject: [PATCH 02/14] Possibility to have archive link above posts --- .../php/AcfFields/json/mod-posts-source.json | 28 +++++++++++++++++++ source/php/AcfFields/php/mod-posts-source.php | 28 +++++++++++++++++++ source/php/Module/Posts/Posts.php | 3 ++ source/php/Module/Posts/views/index.blade.php | 18 ++++++++---- .../Posts/views/partials/head.blade.php | 4 +++ .../Posts/views/partials/more-link.blade.php | 25 +++++++++++++++++ 6 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 source/php/Module/Posts/views/partials/head.blade.php create mode 100644 source/php/Module/Posts/views/partials/more-link.blade.php diff --git a/source/php/AcfFields/json/mod-posts-source.json b/source/php/AcfFields/json/mod-posts-source.json index 6760e33ba..7a4d48bd1 100644 --- a/source/php/AcfFields/json/mod-posts-source.json +++ b/source/php/AcfFields/json/mod-posts-source.json @@ -287,6 +287,34 @@ "prepend": "", "append": "" }, + { + "key": "field_67e6eed195ff6", + "label": "Archive link above posts", + "name": "archive_link_above_posts", + "aria-label": "", + "type": "true_false", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_57ecf1007b749", + "operator": "==", + "value": "1" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "message": "", + "default_value": 0, + "ui_on_text": "", + "ui_off_text": "", + "ui": 1 + }, { "key": "field_6710ff6562e8c", "label": "From network sites", diff --git a/source/php/AcfFields/php/mod-posts-source.php b/source/php/AcfFields/php/mod-posts-source.php index 9b07919f6..4a18633cb 100644 --- a/source/php/AcfFields/php/mod-posts-source.php +++ b/source/php/AcfFields/php/mod-posts-source.php @@ -297,6 +297,34 @@ 'append' => '', ), 9 => array( + 'key' => 'field_67e6eed195ff6', + 'label' => __('Archive link above posts', 'modularity'), + 'name' => 'archive_link_above_posts', + 'aria-label' => '', + 'type' => 'true_false', + 'instructions' => '', + 'required' => 0, + 'conditional_logic' => array( + 0 => array( + 0 => array( + 'field' => 'field_57ecf1007b749', + 'operator' => '==', + 'value' => '1', + ), + ), + ), + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'message' => '', + 'default_value' => 0, + 'ui_on_text' => '', + 'ui_off_text' => '', + 'ui' => 1, + ), + 10 => array( 'key' => 'field_6710ff6562e8c', 'label' => __('From network sites', 'modularity'), 'name' => 'posts_data_network_sources', diff --git a/source/php/Module/Posts/Posts.php b/source/php/Module/Posts/Posts.php index 90ed19856..0d4a2ef5a 100644 --- a/source/php/Module/Posts/Posts.php +++ b/source/php/Module/Posts/Posts.php @@ -176,6 +176,9 @@ public function data(): array // Archive link title $data['archive_link_title'] = $this->fields['archive_link_title']; + // Archive link position + $data['archive_link_above_posts'] = $this->fields['archive_link_above_posts']; + //Add filters to archive link if($data['archive_link_url'] && is_array($data['filters']) && !empty($data['filters'])) { $data['archive_link_url'] .= "?" . http_build_query($data['filters']); diff --git a/source/php/Module/Posts/views/index.blade.php b/source/php/Module/Posts/views/index.blade.php index a86ee170c..606247536 100644 --- a/source/php/Module/Posts/views/index.blade.php +++ b/source/php/Module/Posts/views/index.blade.php @@ -1,7 +1,15 @@ -@includeWhen((!$hideTitle && !empty($postTitle))|| !empty($titleCTA), 'partials.post-title', - ['titleCTA' => $titleCTA ?? null] -) -@includeWhen($preamble, 'partials.preamble') +@if($archive_link_above_posts) +
+
+ @include('partials.head') +
+
+ @include('partials.more-link') +
+
+@else + @include('partials.head') +@endif
@@ -21,4 +29,4 @@ @endif
-@include('partials.more') +@includeWhen(!$archive_link_above_posts, 'partials.more') diff --git a/source/php/Module/Posts/views/partials/head.blade.php b/source/php/Module/Posts/views/partials/head.blade.php new file mode 100644 index 000000000..4f599274b --- /dev/null +++ b/source/php/Module/Posts/views/partials/head.blade.php @@ -0,0 +1,4 @@ +@includeWhen((!$hideTitle && !empty($postTitle))|| !empty($titleCTA), 'partials.post-title', + ['titleCTA' => $titleCTA ?? null] +) +@includeWhen($preamble, 'partials.preamble') \ No newline at end of file diff --git a/source/php/Module/Posts/views/partials/more-link.blade.php b/source/php/Module/Posts/views/partials/more-link.blade.php new file mode 100644 index 000000000..a52c0b1c3 --- /dev/null +++ b/source/php/Module/Posts/views/partials/more-link.blade.php @@ -0,0 +1,25 @@ +@if ($posts_data_source !== 'input' && !empty($archive_link_url)) + @link([ + 'href' => $archive_link_url, + 'classList' => ['u-display-block'] + ]) + @group([ + 'classList' => [ + 'u-gap-1', + 'u-margin__top--1@xs', + 'u-margin__top--1@sm', + 'u-justify-content--end@md', + 'u-justify-content--end@lg', + 'u-justify-content--end@xl' + ] + ]) + {{ $archive_link_title ?? $lang['showMore'] }} + @icon([ + 'icon' => 'arrow_right_alt', + 'size' => 'md', + 'classList' => [$baseClass . '__icon'] + ]) + @endicon + @endgroup + @endlink +@endif From e443cae6ffeaf9c15144070756753510a87c4f1a Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Fri, 28 Mar 2025 20:18:18 +0100 Subject: [PATCH 03/14] Change icon size and position --- source/php/Module/Posts/views/partials/more-link.blade.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/php/Module/Posts/views/partials/more-link.blade.php b/source/php/Module/Posts/views/partials/more-link.blade.php index a52c0b1c3..d863d98bc 100644 --- a/source/php/Module/Posts/views/partials/more-link.blade.php +++ b/source/php/Module/Posts/views/partials/more-link.blade.php @@ -10,13 +10,14 @@ 'u-margin__top--1@sm', 'u-justify-content--end@md', 'u-justify-content--end@lg', - 'u-justify-content--end@xl' + 'u-justify-content--end@xl', + 'u-align-items--center' ] ]) {{ $archive_link_title ?? $lang['showMore'] }} @icon([ 'icon' => 'arrow_right_alt', - 'size' => 'md', + 'size' => 'lg', 'classList' => [$baseClass . '__icon'] ]) @endicon From 6f12e843f6a1ecc39dd12ff6d80d6d10d2f0989f Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Fri, 28 Mar 2025 20:36:23 +0100 Subject: [PATCH 04/14] Changed icon --- source/php/Module/Posts/views/partials/more-link.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/php/Module/Posts/views/partials/more-link.blade.php b/source/php/Module/Posts/views/partials/more-link.blade.php index d863d98bc..af5fc45d1 100644 --- a/source/php/Module/Posts/views/partials/more-link.blade.php +++ b/source/php/Module/Posts/views/partials/more-link.blade.php @@ -16,7 +16,7 @@ ]) {{ $archive_link_title ?? $lang['showMore'] }} @icon([ - 'icon' => 'arrow_right_alt', + 'icon' => 'trending_flat', 'size' => 'lg', 'classList' => [$baseClass . '__icon'] ]) From b641b45128564d214cba5c951f527534a9f8d279 Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Sun, 6 Apr 2025 15:03:59 +0200 Subject: [PATCH 05/14] Colored cards base code --- modularity.php | 1 + .../php/AcfFields/json/mod-colored-cards.json | 260 +++++++++++++ .../php/AcfFields/php/mod-colored-cards.php | 263 +++++++++++++ .../php/Module/ColoredCards/ColoredCards.php | 359 ++++++++++++++++++ .../php/Module/ColoredCards/assets/icon.svg | 1 + .../Module/ColoredCards/views/base.blade.php | 18 + .../Module/ColoredCards/views/cards.blade.php | 7 + .../views/partials/card.blade.php | 42 ++ 8 files changed, 951 insertions(+) create mode 100644 source/php/AcfFields/json/mod-colored-cards.json create mode 100644 source/php/AcfFields/php/mod-colored-cards.php create mode 100644 source/php/Module/ColoredCards/ColoredCards.php create mode 100644 source/php/Module/ColoredCards/assets/icon.svg create mode 100644 source/php/Module/ColoredCards/views/base.blade.php create mode 100644 source/php/Module/ColoredCards/views/cards.blade.php create mode 100644 source/php/Module/ColoredCards/views/partials/card.blade.php diff --git a/modularity.php b/modularity.php index 31bc28b40..88e76ea11 100644 --- a/modularity.php +++ b/modularity.php @@ -45,6 +45,7 @@ $acfExportManager->setExportFolder(MODULARITY_PATH . 'source/php/AcfFields/'); $acfExportManager->autoExport(array( 'mod-booking' => 'group_56a89f42b432b', + 'mod-colored-cards' => 'group_67efeb5e4b211', 'mod-contact-info' => 'group_56a0a3928c017', 'mod-contact-contacts' => 'group_5757b93da8d5c', 'mod-contacts' => 'group_5805e5dc0a3be', diff --git a/source/php/AcfFields/json/mod-colored-cards.json b/source/php/AcfFields/json/mod-colored-cards.json new file mode 100644 index 000000000..275bef607 --- /dev/null +++ b/source/php/AcfFields/json/mod-colored-cards.json @@ -0,0 +1,260 @@ +[{ + "key": "group_67efeb5e4b211", + "title": "Cards", + "fields": [ + { + "key": "field_67f00aac8f0c4", + "label": "Max cards per column", + "name": "cards_per_column", + "aria-label": "", + "type": "number", + "instructions": "", + "required": 1, + "conditional_logic": 0, + "wrapper": { + "width": "25", + "class": "", + "id": "" + }, + "default_value": 3, + "min": 2, + "max": 4, + "placeholder": "", + "step": "", + "prepend": "", + "append": "" + }, + { + "key": "field_67f00ad48f0c5", + "label": "Wrap cards in background color", + "name": "wrap_cards_color_container", + "aria-label": "", + "type": "true_false", + "instructions": "Will only work properly if module is centered on page", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "25", + "class": "", + "id": "" + }, + "message": "Yes", + "default_value": 0, + "ui": 0, + "ui_on_text": "", + "ui_off_text": "" + }, + { + "key": "field_67f00af58f0c6", + "label": "Background color", + "name": "container_background_color", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_67f00ad48f0c5", + "operator": "==", + "value": "1" + } + ] + ], + "wrapper": { + "width": "25", + "class": "", + "id": "" + }, + "choices": { + "color-palette-primary-base": "<\/span>", + "color-palette-primary-dark": "<\/span>", + "color-palette-primary-light": "<\/span>", + "color-palette-secondary-base": "<\/span>", + "color-background-background": "<\/span>", + "color-background-complementary": "<\/span>", + "custom-color": "Custom color" + }, + "default_value": "blue", + "return_format": "value", + "multiple": 0, + "allow_custom": 0, + "search_placeholder": "", + "allow_null": 0, + "ui": 1, + "ajax": 0, + "placeholder": "" + }, + { + "key": "field_67f27a0f3028f", + "label": "Custom background color", + "name": "container_background_color_custom", + "aria-label": "", + "type": "color_picker", + "instructions": "Beware WCAG rules regarding contrasts", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_67f00af58f0c6", + "operator": "==", + "value": "custom-color" + } + ] + ], + "wrapper": { + "width": "25", + "class": "", + "id": "" + }, + "default_value": "", + "enable_opacity": 0, + "return_format": "string" + }, + { + "key": "field_67efeb5e223df", + "label": "Cards", + "name": "cards", + "aria-label": "", + "type": "repeater", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "100", + "class": "", + "id": "" + }, + "acfe_repeater_stylised_button": 0, + "layout": "block", + "pagination": 0, + "min": 0, + "max": 0, + "collapsed": "", + "button_label": "Add card", + "rows_per_page": 20, + "sub_fields": [ + { + "key": "field_67efec4d6d2ab", + "label": "Heading", + "name": "heading", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 1, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "placeholder": "", + "prepend": "", + "append": "", + "parent_repeater": "field_67efeb5e223df" + }, + { + "key": "field_67efec596d2ac", + "label": "Content", + "name": "content", + "aria-label": "", + "type": "wysiwyg", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "tabs": "all", + "toolbar": "full", + "media_upload": 1, + "delay": 0, + "parent_repeater": "field_67efeb5e223df" + }, + { + "key": "field_67efec6d6d2ad", + "label": "Image", + "name": "image", + "aria-label": "", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "uploader": "", + "return_format": "id", + "acfe_thumbnail": 0, + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "", + "preview_size": "medium", + "library": "all", + "parent_repeater": "field_67efeb5e223df" + }, + { + "key": "field_67efece36d2af", + "label": "Link", + "name": "link", + "aria-label": "", + "type": "link", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "parent_repeater": "field_67efeb5e223df" + } + ] + } + ], + "location": [ + [ + { + "param": "post_type", + "operator": "==", + "value": "mod-coloredcards" + } + ], + [ + { + "param": "block", + "operator": "==", + "value": "acf\/coloredcards" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "left", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "acfe_display_title": "", + "acfe_autosync": [ + "json" + ], + "acfe_form": 0, + "acfe_meta": "", + "acfe_note": "" +}] + \ No newline at end of file diff --git a/source/php/AcfFields/php/mod-colored-cards.php b/source/php/AcfFields/php/mod-colored-cards.php new file mode 100644 index 000000000..96154f0a4 --- /dev/null +++ b/source/php/AcfFields/php/mod-colored-cards.php @@ -0,0 +1,263 @@ + 'group_67efeb5e4b211', + 'title' => __('Cards', 'modularity'), + 'fields' => array( + 0 => array( + 'key' => 'field_67f00aac8f0c4', + 'label' => __('Max cards per column', 'modularity'), + 'name' => 'cards_per_column', + 'aria-label' => '', + 'type' => 'number', + 'instructions' => '', + 'required' => 1, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '25', + 'class' => '', + 'id' => '', + ), + 'default_value' => 3, + 'min' => 2, + 'max' => 4, + 'placeholder' => '', + 'step' => '', + 'prepend' => '', + 'append' => '', + ), + 1 => array( + 'key' => 'field_67f00ad48f0c5', + 'label' => __('Wrap cards in background color', 'modularity'), + 'name' => 'wrap_cards_color_container', + 'aria-label' => '', + 'type' => 'true_false', + 'instructions' => __('Will only work properly if module is centered on page', 'modularity'), + 'required' => 0, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '25', + 'class' => '', + 'id' => '', + ), + 'message' => __('Yes', 'modularity'), + 'default_value' => 0, + 'ui' => 0, + 'ui_on_text' => '', + 'ui_off_text' => '', + ), + 2 => array( + 'key' => 'field_67f00af58f0c6', + 'label' => __('Background color', 'modularity'), + 'name' => 'container_background_color', + 'aria-label' => '', + 'type' => 'select', + 'instructions' => '', + 'required' => 0, + 'conditional_logic' => array( + 0 => array( + 0 => array( + 'field' => 'field_67f00ad48f0c5', + 'operator' => '==', + 'value' => '1', + ), + ), + ), + 'wrapper' => array( + 'width' => '25', + 'class' => '', + 'id' => '', + ), + 'choices' => array( + 'color-palette-primary-base' => __('', 'modularity'), + 'color-palette-primary-dark' => __('', 'modularity'), + 'color-palette-primary-light' => __('', 'modularity'), + 'color-palette-secondary-base' => __('', 'modularity'), + 'color-background-background' => __('', 'modularity'), + 'color-background-complementary' => __('', 'modularity'), + 'custom-color' => __('Custom color', 'modularity'), + ), + 'default_value' => __('blue', 'modularity'), + 'return_format' => 'value', + 'multiple' => 0, + 'allow_custom' => 0, + 'search_placeholder' => '', + 'allow_null' => 0, + 'ui' => 1, + 'ajax' => 0, + 'placeholder' => '', + ), + 3 => array( + 'key' => 'field_67f27a0f3028f', + 'label' => __('Custom background color', 'modularity'), + 'name' => 'container_background_color_custom', + 'aria-label' => '', + 'type' => 'color_picker', + 'instructions' => __('Beware WCAG rules regarding contrasts', 'modularity'), + 'required' => 0, + 'conditional_logic' => array( + 0 => array( + 0 => array( + 'field' => 'field_67f00af58f0c6', + 'operator' => '==', + 'value' => 'custom-color', + ), + ), + ), + 'wrapper' => array( + 'width' => '25', + 'class' => '', + 'id' => '', + ), + 'default_value' => '', + 'enable_opacity' => 0, + 'return_format' => 'string', + ), + 4 => array( + 'key' => 'field_67efeb5e223df', + 'label' => __('Cards', 'modularity'), + 'name' => 'cards', + 'aria-label' => '', + 'type' => 'repeater', + 'instructions' => '', + 'required' => 0, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '100', + 'class' => '', + 'id' => '', + ), + 'acfe_repeater_stylised_button' => 0, + 'layout' => 'block', + 'pagination' => 0, + 'min' => 0, + 'max' => 0, + 'collapsed' => '', + 'button_label' => __('Add card', 'modularity'), + 'rows_per_page' => 20, + 'sub_fields' => array( + 0 => array( + 'key' => 'field_67efec4d6d2ab', + 'label' => __('Heading', 'modularity'), + 'name' => 'heading', + 'aria-label' => '', + 'type' => 'text', + 'instructions' => '', + 'required' => 1, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'default_value' => '', + 'maxlength' => '', + 'placeholder' => '', + 'prepend' => '', + 'append' => '', + 'parent_repeater' => 'field_67efeb5e223df', + ), + 1 => array( + 'key' => 'field_67efec596d2ac', + 'label' => __('Content', 'modularity'), + 'name' => 'content', + 'aria-label' => '', + 'type' => 'wysiwyg', + 'instructions' => '', + 'required' => 0, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'default_value' => '', + 'tabs' => 'all', + 'toolbar' => 'full', + 'media_upload' => 1, + 'delay' => 0, + 'parent_repeater' => 'field_67efeb5e223df', + ), + 2 => array( + 'key' => 'field_67efec6d6d2ad', + 'label' => __('Image', 'modularity'), + 'name' => 'image', + 'aria-label' => '', + 'type' => 'image', + 'instructions' => '', + 'required' => 0, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'uploader' => '', + 'return_format' => 'id', + 'acfe_thumbnail' => 0, + 'min_width' => '', + 'min_height' => '', + 'min_size' => '', + 'max_width' => '', + 'max_height' => '', + 'max_size' => '', + 'mime_types' => '', + 'preview_size' => 'medium', + 'library' => 'all', + 'parent_repeater' => 'field_67efeb5e223df', + ), + 3 => array( + 'key' => 'field_67efece36d2af', + 'label' => __('Link', 'modularity'), + 'name' => 'link', + 'aria-label' => '', + 'type' => 'link', + 'instructions' => '', + 'required' => 0, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'return_format' => 'array', + 'parent_repeater' => 'field_67efeb5e223df', + ), + ), + ), + ), + 'location' => array( + 0 => array( + 0 => array( + 'param' => 'post_type', + 'operator' => '==', + 'value' => 'mod-coloredcards', + ), + ), + 1 => array( + 0 => array( + 'param' => 'block', + 'operator' => '==', + 'value' => 'acf/coloredcards', + ), + ), + ), + 'menu_order' => 0, + 'position' => 'normal', + 'style' => 'default', + 'label_placement' => 'left', + 'instruction_placement' => 'label', + 'hide_on_screen' => '', + 'active' => true, + 'description' => '', + 'show_in_rest' => 0, + 'acfe_display_title' => '', + 'acfe_autosync' => array( + 0 => 'json', + ), + 'acfe_form' => 0, + 'acfe_meta' => '', + 'acfe_note' => '', +)); + } \ No newline at end of file diff --git a/source/php/Module/ColoredCards/ColoredCards.php b/source/php/Module/ColoredCards/ColoredCards.php new file mode 100644 index 000000000..5beebab05 --- /dev/null +++ b/source/php/Module/ColoredCards/ColoredCards.php @@ -0,0 +1,359 @@ + ['full'] + ); + + private $baseClass; + + private static $palettesToGet = [ + 'color_palette_primary', + 'color_palette_secondary', + 'color_background', + ]; + + public function init() + { + $this->nameSingular = __("Colored Cards", 'modularity'); + $this->namePlural = __("Colored Cards", 'modularity'); + $this->description = __("Creates card with colored backgrounds from manual data.", 'modularity'); + + $this->baseClass = $this->slug . '-' . $this->ID;; + + add_filter('Modularity/Block/Data', array($this, 'blockData'), 50, 3); + + add_filter('acf/load_field/key=field_67f00af58f0c6', array($this, 'colorChoices')); + } + + public function data(): array + { + $data = []; + $fields = $this->getFields(); + + $data['cards'] = $this->prepareCards($fields['cards']); + + $data['baseClass'] = $this->baseClass; + $data['cardClass'] = 'colored-card u-padding--4'; + $data['columnClass'] = $this->getColumnClass(); + $data['wrapperClass'] = $this->getWrapperClass(); + + $data['wrapCards'] = $fields['wrap_cards_color_container']; + + if ($data['wrapCards']) { + $data['wrapperBackgroundColor'] = $this->getWrapperBackgroundColor($fields['container_background_color']); + } + + /* $data['manualInputs'] = []; + $data['ID'] = $this->ID; + $data['columns'] = !empty($fields['columns']) ? $fields['columns'] . '@md' : 'o-grid-4@md'; + $data['context'] = ['module.manual-input.' . $this->template]; + $data['ratio'] = !empty($fields['ratio']) ? $fields['ratio'] : '4:3'; + $data['imagePosition'] = !empty($fields['image_position']) ? true : false; + $imageSize = $this->getImageSize($displayAs); + $data['freeTextFiltering'] = !empty($fields['free_text_filtering']) ? true : false; + $data['lang'] = [ + 'search' => __('Search', 'modularity'), + ]; + + $data['accordionColumnTitles'] = $this->createAccordionTitles( + isset($fields['accordion_column_titles']) ? $fields['accordion_column_titles'] : [], + isset($fields['accordion_column_marking']) ? $fields['accordion_column_marking'] : '' + ); + + if (!empty($fields['manual_inputs']) && is_array($fields['manual_inputs'])) { + foreach ($fields['manual_inputs'] as $index => &$input) { + $input = array_filter($input, function($value) { + return !empty($value) || $value === false; + }); + $arr = array_merge($this->getManualInputDefaultValues(), $input); + $arr['isHighlighted'] = $this->canBeHighlighted($fields, $index); + // TODO: change name and migrate + $arr['icon'] = $arr['box_icon']; + $arr['image'] = $this->maybeGetImageImageContract($displayAs, $arr['image']) ?? $this->getImageData($arr['image'], $imageSize); + $arr['accordion_column_values'] = $this->createAccordionTitles($arr['accordion_column_values'], $arr['title']); + $arr['view'] = $this->getInputView($arr['isHighlighted']); + $arr['columnSize'] = $this->getInputColumnSize($fields, $arr['isHighlighted']); + $arr = \Municipio\Helper\FormatObject::camelCase($arr); + $data['manualInputs'][] = (array) $arr; + } + } + + //Check if any item has an image + $data['anyItemHasImage'] = array_reduce($data['manualInputs'], function($carry, $item) { + if (isset($item['image'])) { + if (is_a($item['image'], ImageComponentContract::class)) { + return $carry || $item['image']->getUrl(); + } + return $carry || !empty($item['image']); + } + return $carry; + }, false); */ + + return $data; + } + + public function colorChoices($field) + { + $colors = $this->getColorsFromPalettes(); + + $field['choices'] = []; + foreach ($colors as $name => $hex) { + $field['choices'][$name] = ''; + } + + $field['choices']['custom-color'] = __('Custom color', 'modularity'); + + return $field; + } + + private function getWrapperBackgroundColor($color) { + $colorMapper = [ + 'color-palette-primary-base' => 'var(--color-primary)', + 'color-palette-primary-light' => 'var(--color-primary-light)', + 'color-palette-primary-dark' => 'var(--color-primary-dark)', + 'color-palette-secondary-base' => 'var(--color-secondary)', + 'color-palette-secondary-light' => 'var(--color-secondary-light)', + 'color-palette-secondary-dark' => 'var(--color-secondary-dark)', + 'color-background-background' => 'var(--color-background)', + 'color-background-complementary' => 'var(--color-background-complementary)', + ]; + + if ($color === 'custom-color') { + $fields = $this->getFields(); + + if (!isset($fields['container_background_color_custom'])) { + return false; + } + + return $fields['container_background_color_custom']; + } + + if (!isset($colorMapper[$color])) { + return false; + } + + return $colorMapper[$color]; + } + + private function getColorsFromPalettes() + { + $colorsToGet = [ + 'base', + 'dark', + 'light', + 'background', + 'complementary', + ]; + $hexesToIgnore = [ + '#ffffff', + ]; + + $colors = []; + $rawColors = \Municipio\Helper\Color::getPalettes(self::$palettesToGet); + + foreach ($rawColors as $paletteName => $palette) { + if (!is_array($palette)) { + continue; + } + + foreach ($palette as $color => $hex) { + if (in_array($color, $colorsToGet) && !in_array(strtolower($hex), $hexesToIgnore)) { + $colors[str_replace('_', '-', $paletteName) . '-' . $color] = $hex; + } + } + } + + return array_unique($colors); + } + + private function prepareCards(array $cardData) + { + $preparedData = []; + + if (!is_array($cardData)) { + return $preparedData; + } + + foreach ($cardData as $card) { + $preparedData[] = [ + 'heading' => $card['heading'], + 'content' => !empty($card['content']) ? $card['content'] : false, + 'image' => is_int($card['image']) ? $this->getImageContract($card['image']) : false, + 'link' => $card['link'], + 'columnClass' => $this->getColumnClass(), + ]; + } + + return $preparedData; + } + + private function getColumnClass() + { + return 'o-grid-4@md'; + } + + private function getWrapperClass() + { + $classes = [ + "{$this->baseClass}__wrapper", + 'u-padding__y--4@xs', + 'u-padding__y--4@sm', + 'u-padding__y--4@md', + 'u-padding__y--8@lg', + 'u-padding__y--8@xl', + ]; + + return implode(' ', $classes); + } + + private function getImageContract(int $imageId) + { + return ImageComponentContract::factory( + $imageId, + [600, false], + new ImageResolver() + ); + } + + /** + * @return array Array with default values + */ + private function getManualInputDefaultValues(): array + { + return [ + 'title' => null, + 'content' => null, + 'link' => null, + 'link_text' => __("Read more", 'modularity'), + 'image' => null, + 'accordion_column_values' => [], + 'box_icon' => null + ]; + } + + /** + * Returns the input column size based on the given fields. + * + * @param array $fields The array of fields. + * @return string The input column size. + */ + private function getInputColumnSize(array $fields): string + { + $columnSize = !empty($fields['columns']) ? $fields['columns'] : 'o-grid-4'; + + return $columnSize . '@md'; + } + + /** + * Get all data attached to the image. + * + * @param array $fields All the acf fields + * @param array|string $size Array containing height and width OR predefined size as a string. + * @return array + */ + private function getImageData($imageId = false, $size = [400, 225]) + { + if (!empty($imageId)) { + $image = ImageHelper::getImageAttachmentData($imageId, $size); + + if ($image) { + $image['removeCaption'] = true; + } + + unset($image['title']); + unset($image['description']); + + return $image; + } + + return false; + } + + /** + * Decides the size of the image based on view + * + * @param string $displayAs The name of the template/view. + * @return array + */ + private function getImageSize($displayAs, $return = "both"): null|array|int { + switch ($displayAs) { + case "segment": + $dimensions = [1920, 1080]; + case "block": + $dimensions = [1024, 1024]; + case "collection": + case "box": + $dimensions = [768, 768]; + default: + $dimensions = [1440, 810]; + } + + if($return == "width") { + return $dimensions[0] ?? null; + } + + if($return == "height") { + return $dimensions[1] ?? null; + } + + return $dimensions; + } + + /** + * Add full width setting to frontend. + * @param [array] $viewData + * @param [array] $block + * @param [object] $module + * @return array + */ + public function blockData($viewData, $block, $module) { + if (strpos($block['name'], "acf/manualinput") === 0 && $block['align'] == 'full' && !is_admin()) { + $viewData['stretch'] = true; + } else { + $viewData['stretch'] = false; + } + return $viewData; + } + + /** + * Get the template file name for rendering. + * + * This function returns the name of the template file to use for rendering + * based on the template property of the current object. If the specified + * template file exists, it will be returned; otherwise, a default template + * ('card.blade.php') will be used. + * + * @return string The template file name. + */ + public function template() + { + $path = __DIR__ . "/views/" . $this->template . ".blade.php"; + + if (file_exists($path)) { + return $this->template . ".blade.php"; + } + + return 'base.blade.php'; + } + + /** + * Available "magic" methods for modules: + * init() What to do on initialization + * data() Use to send data to view (return array) + * style() Enqueue style only when module is used on page + * script Enqueue script only when module is used on page + * adminEnqueue() Enqueue scripts for the module edit/add page in admin + * template() Return the view template (blade) the module should use when displayed + */ +} diff --git a/source/php/Module/ColoredCards/assets/icon.svg b/source/php/Module/ColoredCards/assets/icon.svg new file mode 100644 index 000000000..ea8305edb --- /dev/null +++ b/source/php/Module/ColoredCards/assets/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/php/Module/ColoredCards/views/base.blade.php b/source/php/Module/ColoredCards/views/base.blade.php new file mode 100644 index 000000000..e65987cbc --- /dev/null +++ b/source/php/Module/ColoredCards/views/base.blade.php @@ -0,0 +1,18 @@ +@if ($wrapCards) +
+
+ @include('cards') +
+
+ +@else + @include('cards') +@endif diff --git a/source/php/Module/ColoredCards/views/cards.blade.php b/source/php/Module/ColoredCards/views/cards.blade.php new file mode 100644 index 000000000..c58c8deda --- /dev/null +++ b/source/php/Module/ColoredCards/views/cards.blade.php @@ -0,0 +1,7 @@ +
+ @foreach ($cards as $card) +
+ @include('partials.card') +
+ @endforeach +
diff --git a/source/php/Module/ColoredCards/views/partials/card.blade.php b/source/php/Module/ColoredCards/views/partials/card.blade.php new file mode 100644 index 000000000..1cbe4722d --- /dev/null +++ b/source/php/Module/ColoredCards/views/partials/card.blade.php @@ -0,0 +1,42 @@ +@card([ + 'link' => $card['link'] ? $card['link']['url'] : false +]) +
+
+ @typography([ + 'element' => 'h2', + 'variant' => 'h3' + ]) + {{ $card['heading'] }} + @endtypography +
+ @if ($card['image']) +
+ @image([ + 'src' => $card['image'] + ]) + @endimage +
+ @endif + @if ($card['content']) +
+ {!! $card['content'] !!} +
+ @endif + @if ($card['link']) +
+ @typography([ + 'classList' => ['u-display--flex', 'u-align-items--center', 'u-gap-1'], + 'variant' => 'bold' + ]) + {{ $card['link']['title'] }} + @icon([ + 'icon' => 'trending_flat', + 'size' => 'lg' + ]) + @endicon + @endtypography +
+ @endif +
+@endcard From deb936a715f16cc6aa3be05dbbefc8a83f1f78d7 Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Sun, 6 Apr 2025 21:33:15 +0200 Subject: [PATCH 06/14] Better support for background colors --- .../php/AcfFields/json/mod-colored-cards.json | 65 +++- .../php/AcfFields/php/mod-colored-cards.php | 65 +++- .../php/Module/ColoredCards/ColoredCards.php | 285 +++++------------- .../ColoredCards/Helpers/ColorHelper.php | 193 ++++++++++++ .../Module/ColoredCards/views/base.blade.php | 11 + .../views/partials/card.blade.php | 5 +- 6 files changed, 391 insertions(+), 233 deletions(-) create mode 100644 source/php/Module/ColoredCards/Helpers/ColorHelper.php diff --git a/source/php/AcfFields/json/mod-colored-cards.json b/source/php/AcfFields/json/mod-colored-cards.json index 275bef607..e6b86a360 100644 --- a/source/php/AcfFields/json/mod-colored-cards.json +++ b/source/php/AcfFields/json/mod-colored-cards.json @@ -67,15 +67,10 @@ "id": "" }, "choices": { - "color-palette-primary-base": "<\/span>", - "color-palette-primary-dark": "<\/span>", - "color-palette-primary-light": "<\/span>", - "color-palette-secondary-base": "<\/span>", - "color-background-background": "<\/span>", - "color-background-complementary": "<\/span>", + "none": "None", "custom-color": "Custom color" }, - "default_value": "blue", + "default_value": "none", "return_format": "value", "multiple": 0, "allow_custom": 0, @@ -220,6 +215,62 @@ }, "return_format": "array", "parent_repeater": "field_67efeb5e223df" + }, + { + "key": "field_67f289dc6aa72", + "label": "Background color", + "name": "background_color", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "none": "None", + "custom-color": "Custom color" + }, + "default_value": "none", + "return_format": "value", + "multiple": 0, + "allow_custom": 0, + "search_placeholder": "", + "allow_null": 0, + "ui": 1, + "ajax": 0, + "placeholder": "", + "parent_repeater": "field_67efeb5e223df" + }, + { + "key": "field_67f28b0cfbfbc", + "label": "Custom background color", + "name": "background_color_custom", + "aria-label": "", + "type": "color_picker", + "instructions": "Beware WCAG rules for contrasts and readability", + "required": 0, + "conditional_logic": [ + [ + { + "field": "field_67f289dc6aa72", + "operator": "==", + "value": "custom-color" + } + ] + ], + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "enable_opacity": 0, + "return_format": "string", + "parent_repeater": "field_67efeb5e223df" } ] } diff --git a/source/php/AcfFields/php/mod-colored-cards.php b/source/php/AcfFields/php/mod-colored-cards.php index 96154f0a4..3ef464cbc 100644 --- a/source/php/AcfFields/php/mod-colored-cards.php +++ b/source/php/AcfFields/php/mod-colored-cards.php @@ -70,15 +70,10 @@ 'id' => '', ), 'choices' => array( - 'color-palette-primary-base' => __('', 'modularity'), - 'color-palette-primary-dark' => __('', 'modularity'), - 'color-palette-primary-light' => __('', 'modularity'), - 'color-palette-secondary-base' => __('', 'modularity'), - 'color-background-background' => __('', 'modularity'), - 'color-background-complementary' => __('', 'modularity'), + 'none' => __('None', 'modularity'), 'custom-color' => __('Custom color', 'modularity'), ), - 'default_value' => __('blue', 'modularity'), + 'default_value' => __('none', 'modularity'), 'return_format' => 'value', 'multiple' => 0, 'allow_custom' => 0, @@ -224,6 +219,62 @@ 'return_format' => 'array', 'parent_repeater' => 'field_67efeb5e223df', ), + 4 => array( + 'key' => 'field_67f289dc6aa72', + 'label' => __('Background color', 'modularity'), + 'name' => 'background_color', + 'aria-label' => '', + 'type' => 'select', + 'instructions' => '', + 'required' => 0, + 'conditional_logic' => 0, + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'choices' => array( + 'none' => __('None', 'modularity'), + 'custom-color' => __('Custom color', 'modularity'), + ), + 'default_value' => __('none', 'modularity'), + 'return_format' => 'value', + 'multiple' => 0, + 'allow_custom' => 0, + 'search_placeholder' => '', + 'allow_null' => 0, + 'ui' => 1, + 'ajax' => 0, + 'placeholder' => '', + 'parent_repeater' => 'field_67efeb5e223df', + ), + 5 => array( + 'key' => 'field_67f28b0cfbfbc', + 'label' => __('Custom background color', 'modularity'), + 'name' => 'background_color_custom', + 'aria-label' => '', + 'type' => 'color_picker', + 'instructions' => __('Beware WCAG rules for contrasts and readability', 'modularity'), + 'required' => 0, + 'conditional_logic' => array( + 0 => array( + 0 => array( + 'field' => 'field_67f289dc6aa72', + 'operator' => '==', + 'value' => 'custom-color', + ), + ), + ), + 'wrapper' => array( + 'width' => '', + 'class' => '', + 'id' => '', + ), + 'default_value' => '', + 'enable_opacity' => 0, + 'return_format' => 'string', + 'parent_repeater' => 'field_67efeb5e223df', + ), ), ), ), diff --git a/source/php/Module/ColoredCards/ColoredCards.php b/source/php/Module/ColoredCards/ColoredCards.php index 5beebab05..343bbb9a2 100644 --- a/source/php/Module/ColoredCards/ColoredCards.php +++ b/source/php/Module/ColoredCards/ColoredCards.php @@ -2,7 +2,7 @@ namespace Modularity\Module\ColoredCards; -use Municipio\Helper\Image as ImageHelper; +use Modularity\Module\ColoredCards\Helpers\ColorHelper; use Modularity\Integrations\Component\ImageResolver; use ComponentLibrary\Integrations\Image\Image as ImageComponentContract; @@ -17,23 +17,16 @@ class ColoredCards extends \Modularity\Module private $baseClass; - private static $palettesToGet = [ - 'color_palette_primary', - 'color_palette_secondary', - 'color_background', - ]; - public function init() { $this->nameSingular = __("Colored Cards", 'modularity'); $this->namePlural = __("Colored Cards", 'modularity'); $this->description = __("Creates card with colored backgrounds from manual data.", 'modularity'); - $this->baseClass = $this->slug . '-' . $this->ID;; - - add_filter('Modularity/Block/Data', array($this, 'blockData'), 50, 3); + $this->baseClass = $this->slug . '-' . $this->ID; add_filter('acf/load_field/key=field_67f00af58f0c6', array($this, 'colorChoices')); + add_filter('acf/load_field/key=field_67f289dc6aa72', array($this, 'colorChoices')); } public function data(): array @@ -44,137 +37,85 @@ public function data(): array $data['cards'] = $this->prepareCards($fields['cards']); $data['baseClass'] = $this->baseClass; - $data['cardClass'] = 'colored-card u-padding--4'; + $data['cardClass'] = 'colored-card'; $data['columnClass'] = $this->getColumnClass(); $data['wrapperClass'] = $this->getWrapperClass(); $data['wrapCards'] = $fields['wrap_cards_color_container']; if ($data['wrapCards']) { - $data['wrapperBackgroundColor'] = $this->getWrapperBackgroundColor($fields['container_background_color']); + $data['wrapperBackgroundColor'] = $this->getBackgroundColor($fields['container_background_color'], $fields, 'container_background_color_custom'); } - /* $data['manualInputs'] = []; - $data['ID'] = $this->ID; - $data['columns'] = !empty($fields['columns']) ? $fields['columns'] . '@md' : 'o-grid-4@md'; - $data['context'] = ['module.manual-input.' . $this->template]; - $data['ratio'] = !empty($fields['ratio']) ? $fields['ratio'] : '4:3'; - $data['imagePosition'] = !empty($fields['image_position']) ? true : false; - $imageSize = $this->getImageSize($displayAs); - $data['freeTextFiltering'] = !empty($fields['free_text_filtering']) ? true : false; - $data['lang'] = [ - 'search' => __('Search', 'modularity'), - ]; - - $data['accordionColumnTitles'] = $this->createAccordionTitles( - isset($fields['accordion_column_titles']) ? $fields['accordion_column_titles'] : [], - isset($fields['accordion_column_marking']) ? $fields['accordion_column_marking'] : '' - ); - - if (!empty($fields['manual_inputs']) && is_array($fields['manual_inputs'])) { - foreach ($fields['manual_inputs'] as $index => &$input) { - $input = array_filter($input, function($value) { - return !empty($value) || $value === false; - }); - $arr = array_merge($this->getManualInputDefaultValues(), $input); - $arr['isHighlighted'] = $this->canBeHighlighted($fields, $index); - // TODO: change name and migrate - $arr['icon'] = $arr['box_icon']; - $arr['image'] = $this->maybeGetImageImageContract($displayAs, $arr['image']) ?? $this->getImageData($arr['image'], $imageSize); - $arr['accordion_column_values'] = $this->createAccordionTitles($arr['accordion_column_values'], $arr['title']); - $arr['view'] = $this->getInputView($arr['isHighlighted']); - $arr['columnSize'] = $this->getInputColumnSize($fields, $arr['isHighlighted']); - $arr = \Municipio\Helper\FormatObject::camelCase($arr); - $data['manualInputs'][] = (array) $arr; - } - } - - //Check if any item has an image - $data['anyItemHasImage'] = array_reduce($data['manualInputs'], function($carry, $item) { - if (isset($item['image'])) { - if (is_a($item['image'], ImageComponentContract::class)) { - return $carry || $item['image']->getUrl(); - } - return $carry || !empty($item['image']); - } - return $carry; - }, false); */ + $data['cardStyles'] = $this->getCardStyles($data['cards']); return $data; } public function colorChoices($field) { - $colors = $this->getColorsFromPalettes(); + $colors = ColorHelper::getColorsFromMunicipioPalettes(); + + $field['choices'] = [ + 'none' => __('None', 'modularity'), + 'custom-color' => __('Custom color', 'modularity'), + ]; + + if (is_admin() && ($screen = get_current_screen()) && $screen->id === 'acf-field-group') { + return $field; + } - $field['choices'] = []; foreach ($colors as $name => $hex) { $field['choices'][$name] = ''; } - $field['choices']['custom-color'] = __('Custom color', 'modularity'); - return $field; } - private function getWrapperBackgroundColor($color) { - $colorMapper = [ - 'color-palette-primary-base' => 'var(--color-primary)', - 'color-palette-primary-light' => 'var(--color-primary-light)', - 'color-palette-primary-dark' => 'var(--color-primary-dark)', - 'color-palette-secondary-base' => 'var(--color-secondary)', - 'color-palette-secondary-light' => 'var(--color-secondary-light)', - 'color-palette-secondary-dark' => 'var(--color-secondary-dark)', - 'color-background-background' => 'var(--color-background)', - 'color-background-complementary' => 'var(--color-background-complementary)', - ]; + private function getCardStyles($cardData) { + $cardStyles = []; - if ($color === 'custom-color') { - $fields = $this->getFields(); - - if (!isset($fields['container_background_color_custom'])) { - return false; + foreach ($cardData as $card) { + if ($card['background']) { + $cardStyles[$card['id']] = [ + 'background' => $card['background'], + 'color' => ColorHelper::getBestContrastColor($card['background']) + ]; } - - return $fields['container_background_color_custom']; } - - if (!isset($colorMapper[$color])) { + + if (sizeof($cardStyles) === 0) { return false; } - return $colorMapper[$color]; + return $cardStyles; } - - private function getColorsFromPalettes() - { - $colorsToGet = [ - 'base', - 'dark', - 'light', - 'background', - 'complementary', - ]; - $hexesToIgnore = [ - '#ffffff', - ]; - - $colors = []; - $rawColors = \Municipio\Helper\Color::getPalettes(self::$palettesToGet); - - foreach ($rawColors as $paletteName => $palette) { - if (!is_array($palette)) { - continue; + + /** + * Get proper background color value for CSS + * + * @param string Color value for field + * @param array Array of fields from where to search for custom color value + * @param string Name of field to get custom color value from within fields array + * @return bool|string + */ + private function getBackgroundColor(string $color, array $fields, string $customColorField = 'background_color_custom') : bool|string + { + // Get custom color from correct field in fields + if ($color === 'custom-color') { + if (!isset($fields[$customColorField])) { + return false; } - foreach ($palette as $color => $hex) { - if (in_array($color, $colorsToGet) && !in_array(strtolower($hex), $hexesToIgnore)) { - $colors[str_replace('_', '-', $paletteName) . '-' . $color] = $hex; - } - } + return $fields[$customColorField]; + } + + // If we have a CSS var, wrap it in proper CSS function + if (strpos($color, '--') === 0) { + return "var({$color})"; } - return array_unique($colors); + return false; } private function prepareCards(array $cardData) @@ -187,11 +128,13 @@ private function prepareCards(array $cardData) foreach ($cardData as $card) { $preparedData[] = [ + 'id' => uniqid(), 'heading' => $card['heading'], 'content' => !empty($card['content']) ? $card['content'] : false, 'image' => is_int($card['image']) ? $this->getImageContract($card['image']) : false, 'link' => $card['link'], 'columnClass' => $this->getColumnClass(), + 'background' => $this->getBackgroundColor($card['background_color'], $card) ]; } @@ -200,7 +143,21 @@ private function prepareCards(array $cardData) private function getColumnClass() { - return 'o-grid-4@md'; + $fields = $this->getFields(); + + switch ($fields['cards_per_column']) { + case 2: + $class = 'o-grid-6@md'; + break; + case 3: + $class = 'o-grid-4@md'; + break; + case 4: + $class = 'o-grid-6@md o-grid-3@lg'; + break; + } + + return $class; } private function getWrapperClass() @@ -211,7 +168,7 @@ private function getWrapperClass() 'u-padding__y--4@sm', 'u-padding__y--4@md', 'u-padding__y--8@lg', - 'u-padding__y--8@xl', + 'u-padding__y--12@xl', ]; return implode(' ', $classes); @@ -226,106 +183,6 @@ private function getImageContract(int $imageId) ); } - /** - * @return array Array with default values - */ - private function getManualInputDefaultValues(): array - { - return [ - 'title' => null, - 'content' => null, - 'link' => null, - 'link_text' => __("Read more", 'modularity'), - 'image' => null, - 'accordion_column_values' => [], - 'box_icon' => null - ]; - } - - /** - * Returns the input column size based on the given fields. - * - * @param array $fields The array of fields. - * @return string The input column size. - */ - private function getInputColumnSize(array $fields): string - { - $columnSize = !empty($fields['columns']) ? $fields['columns'] : 'o-grid-4'; - - return $columnSize . '@md'; - } - - /** - * Get all data attached to the image. - * - * @param array $fields All the acf fields - * @param array|string $size Array containing height and width OR predefined size as a string. - * @return array - */ - private function getImageData($imageId = false, $size = [400, 225]) - { - if (!empty($imageId)) { - $image = ImageHelper::getImageAttachmentData($imageId, $size); - - if ($image) { - $image['removeCaption'] = true; - } - - unset($image['title']); - unset($image['description']); - - return $image; - } - - return false; - } - - /** - * Decides the size of the image based on view - * - * @param string $displayAs The name of the template/view. - * @return array - */ - private function getImageSize($displayAs, $return = "both"): null|array|int { - switch ($displayAs) { - case "segment": - $dimensions = [1920, 1080]; - case "block": - $dimensions = [1024, 1024]; - case "collection": - case "box": - $dimensions = [768, 768]; - default: - $dimensions = [1440, 810]; - } - - if($return == "width") { - return $dimensions[0] ?? null; - } - - if($return == "height") { - return $dimensions[1] ?? null; - } - - return $dimensions; - } - - /** - * Add full width setting to frontend. - * @param [array] $viewData - * @param [array] $block - * @param [object] $module - * @return array - */ - public function blockData($viewData, $block, $module) { - if (strpos($block['name'], "acf/manualinput") === 0 && $block['align'] == 'full' && !is_admin()) { - $viewData['stretch'] = true; - } else { - $viewData['stretch'] = false; - } - return $viewData; - } - /** * Get the template file name for rendering. * @@ -337,13 +194,7 @@ public function blockData($viewData, $block, $module) { * @return string The template file name. */ public function template() - { - $path = __DIR__ . "/views/" . $this->template . ".blade.php"; - - if (file_exists($path)) { - return $this->template . ".blade.php"; - } - + { return 'base.blade.php'; } diff --git a/source/php/Module/ColoredCards/Helpers/ColorHelper.php b/source/php/Module/ColoredCards/Helpers/ColorHelper.php new file mode 100644 index 000000000..480c01bad --- /dev/null +++ b/source/php/Module/ColoredCards/Helpers/ColorHelper.php @@ -0,0 +1,193 @@ + '--color-primary', + 'color-palette-primary-light' => '--color-primary-light', + 'color-palette-primary-dark' => '--color-primary-dark', + 'color-palette-secondary-base' => '--color-secondary', + 'color-palette-secondary-light' => '--color-secondary-light', + 'color-palette-secondary-dark' => '--color-secondary-dark', + 'color-background-background' => '--color-background', + 'color-background-complementary' => '--color-background-complementary', + ]; + + public static function mapPaletteColorToCssVar($paletteColorName) + { + if (!isset(self::$colorMap[$paletteColorName])) { + return false; + } + + return self::$colorMap[$paletteColorName]; + } + + public static function mapCssVarToHexColor($cssVar) + { + if (preg_match('/var\(\s*(--[^)]+)\s*\)/', $cssVar, $matches)) { + $cssVar = $matches[1]; + } + + $paletteColors = self::getColorsFromMunicipioPalettes(); + + return $paletteColors[$cssVar]; + } + + public static function getBestContrastColor(string $backgroundColor, bool $returnAnyColor = false): string + { + if (strpos($backgroundColor, 'var(') === 0) { + $backgroundColor = ColorHelper::mapCssVarToHexColor($backgroundColor); + } + + [$r, $g, $b] = self::hexToRgb($backgroundColor); + $bgLuminance = self::getRelativeLuminance($r, $g, $b); + + $whiteContrast = self::getContrastRatio($bgLuminance, self::getRelativeLuminance(255, 255, 255)); + $blackContrast = self::getContrastRatio($bgLuminance, self::getRelativeLuminance(0, 0, 0)); + + if (!$returnAnyColor) { + return $whiteContrast >= $blackContrast ? 'white' : 'black'; + } + + [$h, $s, $l] = self::rgbToHsl($r, $g, $b); + $l = $l < 0.5 ? 0.95 : 0.05; + [$rNew, $gNew, $bNew] = self::hslToRgb($h, $s, $l); + + return sprintf("#%02x%02x%02x", $rNew, $gNew, $bNew); + } + + public static function getColorsFromMunicipioPalettes() + { + $colorsToGet = [ + 'base', + 'dark', + 'light', + 'background', + 'complementary', + ]; + $hexesToIgnore = [ + '#ffffff', + ]; + + $colors = []; + $rawColors = \Municipio\Helper\Color::getPalettes(self::$palettesToGet); + + foreach ($rawColors as $paletteName => $palette) { + if (!is_array($palette)) { + continue; + } + + foreach ($palette as $color => $hex) { + $paletteColorName = str_replace('_', '-', $paletteName) . '-' . $color; + $colorVarName = self::mapPaletteColorToCssVar($paletteColorName); + + if ($colorVarName && in_array($color, $colorsToGet) && !in_array(strtolower($hex), $hexesToIgnore)) { + $colors[$colorVarName] = $hex; + } + } + } + + return array_unique($colors); + } + + private static function getContrastRatio(float $lum1, float $lum2): float + { + return ($lum1 > $lum2) + ? ($lum1 + 0.05) / ($lum2 + 0.05) + : ($lum2 + 0.05) / ($lum1 + 0.05); + } + + private static function getRelativeLuminance(int $r, int $g, int $b): float + { + [$r, $g, $b] = array_map(function ($c) { + $c = $c / 255; + return $c <= 0.03928 ? $c / 12.92 : pow(($c + 0.055) / 1.055, 2.4); + }, [$r, $g, $b]); + + return 0.2126 * $r + 0.7152 * $g + 0.0722 * $b; + } + + private static function hexToRgb(string $hex): array + { + $hex = ltrim($hex, '#'); + if (strlen($hex) === 3) { + $hex = $hex[0] . $hex[0] + . $hex[1] . $hex[1] + . $hex[2] . $hex[2]; + } + + return [ + hexdec(substr($hex, 0, 2)), + hexdec(substr($hex, 2, 2)), + hexdec(substr($hex, 4, 2)), + ]; + } + + private static function rgbToHsl(int $r, int $g, int $b): array + { + $r /= 255; + $g /= 255; + $b /= 255; + + $max = max($r, $g, $b); + $min = min($r, $g, $b); + $h = $s = $l = ($max + $min) / 2; + + if ($max !== $min) { + $d = $max - $min; + $s = $l > 0.5 ? $d / (2 - $max - $min) : $d / ($max + $min); + + switch ($max) { + case $r: + $h = ($g - $b) / $d + ($g < $b ? 6 : 0); + break; + case $g: + $h = ($b - $r) / $d + 2; + break; + case $b: + $h = ($r - $g) / $d + 4; + break; + } + + $h /= 6; + } else { + $h = $s = 0; + } + + return [$h, $s, $l]; + } + + private static function hslToRgb(float $h, float $s, float $l): array + { + if ($s == 0) { + $val = round($l * 255); + return [$val, $val, $val]; + } + + $q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s; + $p = 2 * $l - $q; + + return [ + round(self::hue2rgb($p, $q, $h + 1/3) * 255), + round(self::hue2rgb($p, $q, $h) * 255), + round(self::hue2rgb($p, $q, $h - 1/3) * 255) + ]; + } + + private static function hue2rgb(float $p, float $q, float $t): float + { + if ($t < 0) $t += 1; + if ($t > 1) $t -= 1; + if ($t < 1/6) return $p + ($q - $p) * 6 * $t; + if ($t < 1/2) return $q; + if ($t < 2/3) return $p + ($q - $p) * (2/3 - $t) * 6; + return $p; + } +} \ No newline at end of file diff --git a/source/php/Module/ColoredCards/views/base.blade.php b/source/php/Module/ColoredCards/views/base.blade.php index e65987cbc..eafc1ac00 100644 --- a/source/php/Module/ColoredCards/views/base.blade.php +++ b/source/php/Module/ColoredCards/views/base.blade.php @@ -16,3 +16,14 @@ @else @include('cards') @endif + diff --git a/source/php/Module/ColoredCards/views/partials/card.blade.php b/source/php/Module/ColoredCards/views/partials/card.blade.php index 1cbe4722d..699bd86ce 100644 --- a/source/php/Module/ColoredCards/views/partials/card.blade.php +++ b/source/php/Module/ColoredCards/views/partials/card.blade.php @@ -1,7 +1,8 @@ @card([ - 'link' => $card['link'] ? $card['link']['url'] : false + 'link' => $card['link'] ? $card['link']['url'] : false, + 'classList' => ["{$cardClass}-{$card['id']}"] ]) -
+
@typography([ 'element' => 'h2', From 0be718543157fd8024fb27127839c2e87a7d281c Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Tue, 8 Apr 2025 18:50:22 +0200 Subject: [PATCH 07/14] Support for config and custom color palette --- .../php/Module/ColoredCards/ColoredCards.php | 37 +- .../Helpers/{ColorHelper.php => Color.php} | 40 +- .../Module/ColoredCards/Helpers/ColorName.php | 199 + .../Module/ColoredCards/Helpers/Config.php | 15 + .../php/Module/ColoredCards/Models/Color.php | 25 + .../php/Module/ColoredCards/Models/Config.php | 60 + .../Module/ColoredCards/assets/colors.json | 6266 +++++++++++++++++ 7 files changed, 6636 insertions(+), 6 deletions(-) rename source/php/Module/ColoredCards/Helpers/{ColorHelper.php => Color.php} (79%) create mode 100644 source/php/Module/ColoredCards/Helpers/ColorName.php create mode 100644 source/php/Module/ColoredCards/Helpers/Config.php create mode 100644 source/php/Module/ColoredCards/Models/Color.php create mode 100644 source/php/Module/ColoredCards/Models/Config.php create mode 100644 source/php/Module/ColoredCards/assets/colors.json diff --git a/source/php/Module/ColoredCards/ColoredCards.php b/source/php/Module/ColoredCards/ColoredCards.php index 343bbb9a2..5e5a8abac 100644 --- a/source/php/Module/ColoredCards/ColoredCards.php +++ b/source/php/Module/ColoredCards/ColoredCards.php @@ -2,11 +2,14 @@ namespace Modularity\Module\ColoredCards; -use Modularity\Module\ColoredCards\Helpers\ColorHelper; +use Modularity\Module\ColoredCards\Helpers\Color as ColorHelper; +use Modularity\Module\ColoredCards\Helpers\Config as ConfigHelper; use Modularity\Integrations\Component\ImageResolver; use ComponentLibrary\Integrations\Image\Image as ImageComponentContract; +use Modularity\Module\ColoredCards\Models\Config; + class ColoredCards extends \Modularity\Module { public $slug = 'coloredcards'; @@ -17,6 +20,8 @@ class ColoredCards extends \Modularity\Module private $baseClass; + private Config $config; + public function init() { $this->nameSingular = __("Colored Cards", 'modularity'); @@ -25,6 +30,8 @@ public function init() $this->baseClass = $this->slug . '-' . $this->ID; + $this->config = ConfigHelper::getConfig(); + add_filter('acf/load_field/key=field_67f00af58f0c6', array($this, 'colorChoices')); add_filter('acf/load_field/key=field_67f289dc6aa72', array($this, 'colorChoices')); } @@ -58,15 +65,32 @@ public function colorChoices($field) $field['choices'] = [ 'none' => __('None', 'modularity'), - 'custom-color' => __('Custom color', 'modularity'), ]; + if ($this->config->isCustomColorsAllowed()) { + $field['choices']['custom-color'] = __('Custom color', 'modularity'); + } + if (is_admin() && ($screen = get_current_screen()) && $screen->id === 'acf-field-group') { return $field; } - foreach ($colors as $name => $hex) { - $field['choices'][$name] = ''; + foreach ($colors as $var => $hex) { + $field['choices'][$var] = ' + + + ' . ColorHelper::mapCssVarToColorName($var) . ' + + '; + } + + foreach ($this->config->getColors() as $color) { + $field['choices'][$color->getHex()] = ' + + + ' . $color->getName() . ' + + '; } return $field; @@ -110,6 +134,11 @@ private function getBackgroundColor(string $color, array $fields, string $custom return $fields[$customColorField]; } + // If hex code + if (preg_match('/^#[0-9a-fA-F]{6}$/', $color)) { + return $color; + } + // If we have a CSS var, wrap it in proper CSS function if (strpos($color, '--') === 0) { return "var({$color})"; diff --git a/source/php/Module/ColoredCards/Helpers/ColorHelper.php b/source/php/Module/ColoredCards/Helpers/Color.php similarity index 79% rename from source/php/Module/ColoredCards/Helpers/ColorHelper.php rename to source/php/Module/ColoredCards/Helpers/Color.php index 480c01bad..f2f60a924 100644 --- a/source/php/Module/ColoredCards/Helpers/ColorHelper.php +++ b/source/php/Module/ColoredCards/Helpers/Color.php @@ -2,7 +2,7 @@ namespace Modularity\Module\ColoredCards\Helpers; -class ColorHelper { +class Color { private static $palettesToGet = [ 'color_palette_primary', 'color_palette_secondary', @@ -20,6 +20,26 @@ class ColorHelper { 'color-background-complementary' => '--color-background-complementary', ]; + private static $colorNames; + + public static function getColorNames() + { + if (!isset(self::$colorNames)) { + self::$colorNames = [ + 'color-palette-primary-base' => __('Primary color', 'modularity'), + 'color-palette-primary-light' => __('Primary color light', 'modularity'), + 'color-palette-primary-dark' => __('Primary color dark', 'modularity'), + 'color-palette-secondary-base' => __('Secondary color', 'modularity'), + 'color-palette-secondary-light' => __('Secondary color light', 'modularity'), + 'color-palette-secondary-dark' => __('Secondary color dark', 'modularity'), + 'color-background-background' => __('Background color', 'modularity'), + 'color-background-complementary' => __('Background color complementary', 'modularity'), + ]; + } + + return self::$colorNames; + } + public static function mapPaletteColorToCssVar($paletteColorName) { if (!isset(self::$colorMap[$paletteColorName])) { @@ -29,6 +49,22 @@ public static function mapPaletteColorToCssVar($paletteColorName) return self::$colorMap[$paletteColorName]; } + public static function mapCssVarToColorName($cssVar) + { + if (preg_match('/var\(\s*(--[^)]+)\s*\)/', $cssVar, $matches)) { + $cssVar = $matches[1]; + } + + $colorNames = self::getColorNames(); + $colorId = array_flip(self::$colorMap)[$cssVar]; + + if (!isset($colorNames[$colorId])) { + return false; + } + + return $colorNames[$colorId]; + } + public static function mapCssVarToHexColor($cssVar) { if (preg_match('/var\(\s*(--[^)]+)\s*\)/', $cssVar, $matches)) { @@ -43,7 +79,7 @@ public static function mapCssVarToHexColor($cssVar) public static function getBestContrastColor(string $backgroundColor, bool $returnAnyColor = false): string { if (strpos($backgroundColor, 'var(') === 0) { - $backgroundColor = ColorHelper::mapCssVarToHexColor($backgroundColor); + $backgroundColor = self::mapCssVarToHexColor($backgroundColor); } [$r, $g, $b] = self::hexToRgb($backgroundColor); diff --git a/source/php/Module/ColoredCards/Helpers/ColorName.php b/source/php/Module/ColoredCards/Helpers/ColorName.php new file mode 100644 index 000000000..7f6a4f8df --- /dev/null +++ b/source/php/Module/ColoredCards/Helpers/ColorName.php @@ -0,0 +1,199 @@ + 7) { + return ["#000000", "Invalid Color: " . $color, false]; + } + + // Normalize color format + if (strlen($color) % 3 == 0) { + $color = "#" . $color; + } + + // Convert shorthand hex (#ABC) to full form (#AABBCC) + if (strlen($color) == 4) { + $color = "#" . $color[1] . $color[1] . $color[2] . $color[2] . $color[3] . $color[3]; + } + + $rgb = self::rgb($color); + $r = $rgb[0]; + $g = $rgb[1]; + $b = $rgb[2]; + + $hsl = self::hsl($color); + $h = $hsl[0]; + $s = $hsl[1]; + $l = $hsl[2]; + + $ndf1 = 0; + $ndf2 = 0; + $ndf = 0; + $cl = -1; + $df = -1; + + // Load colors from JSON file + $colorNames = self::loadColors(); + + // Find the closest color match + foreach ($colorNames as $i => $colorData) { + // Get the target color in proper format + $targetColor = "#" . $colorData[0]; + + // Check for exact match + if ($color == $targetColor) { + return [$targetColor, $colorData[1], true]; + } + + // Calculate RGB and HSL for the target color on the fly + $targetRgb = self::rgb($targetColor); + $targetHsl = self::hsl($targetColor); + + // Calculate color distance using RGB and HSL + $ndf1 = pow($r - $targetRgb[0], 2) + pow($g - $targetRgb[1], 2) + pow($b - $targetRgb[2], 2); + $ndf2 = pow($h - $targetHsl[0], 2) + pow($s - $targetHsl[1], 2) + pow($l - $targetHsl[2], 2); + $ndf = $ndf1 + $ndf2 * 2; + + if ($df < 0 || $df > $ndf) { + $df = $ndf; + $cl = $i; + } + } + + return ($cl < 0) ? + ["#000000", "Invalid Color: " . $color, false] : + ["#" . $colorNames[$cl][0], $colorNames[$cl][1], false]; + } + + /** + * Convert hex color to HSL + * Adapted from Farbtastic 1.2 (http://acko.net/dev/farbtastic) + * + * @param string $color Hex color code + * @return array [h, s, l] values + */ + private static function hsl($color) { + $rgb = [ + hexdec(substr($color, 1, 2)) / 255, + hexdec(substr($color, 3, 2)) / 255, + hexdec(substr($color, 5, 2)) / 255 + ]; + + $r = $rgb[0]; + $g = $rgb[1]; + $b = $rgb[2]; + + $min = min($r, min($g, $b)); + $max = max($r, max($g, $b)); + $delta = $max - $min; + $l = ($min + $max) / 2; + + $s = 0; + if ($l > 0 && $l < 1) { + $s = $delta / ($l < 0.5 ? (2 * $l) : (2 - 2 * $l)); + } + + $h = 0; + if ($delta > 0) { + if ($max == $r && $max != $g) $h += ($g - $b) / $delta; + if ($max == $g && $max != $b) $h += (2 + ($b - $r) / $delta); + if ($max == $b && $max != $r) $h += (4 + ($r - $g) / $delta); + $h /= 6; + } + + return [intval($h * 255), intval($s * 255), intval($l * 255)]; + } + + /** + * Convert hex color to RGB + * Adapted from Farbtastic 1.2 (http://acko.net/dev/farbtastic) + * + * @param string $color Hex color code + * @return array [r, g, b] values + */ + private static function rgb($color) { + return [ + hexdec(substr($color, 1, 2)), + hexdec(substr($color, 3, 2)), + hexdec(substr($color, 5, 2)) + ]; + } +} diff --git a/source/php/Module/ColoredCards/Helpers/Config.php b/source/php/Module/ColoredCards/Helpers/Config.php new file mode 100644 index 000000000..365ac51ae --- /dev/null +++ b/source/php/Module/ColoredCards/Helpers/Config.php @@ -0,0 +1,15 @@ +name = $name; + $this->hexColor = $hexColor; + } + + public function getName() : string + { + return $this->name; + } + + public function getHex() : string + { + return $this->hexColor; + } +} \ No newline at end of file diff --git a/source/php/Module/ColoredCards/Models/Config.php b/source/php/Module/ColoredCards/Models/Config.php new file mode 100644 index 000000000..37c0024d9 --- /dev/null +++ b/source/php/Module/ColoredCards/Models/Config.php @@ -0,0 +1,60 @@ +customColorsAllowed = $data['colored_cards_allow_custom_colors']; + } + + if (isset($data['colored_cards_colors']) && is_array($data['colored_cards_colors'])) { + $this->colorPalette = $this->parseColors($data['colored_cards_colors']); + } + } + + /** + * Get whether or not custom colors is allowed in module + * + * @return bool + */ + public function isCustomColorsAllowed() : bool + { + return $this->customColorsAllowed; + } + + /** + * Get colors from custom palette + * + * @return Color[] + */ + public function getColors() : array + { + return $this->colorPalette; + } + + /* + * @param mixed $colorData + * @return Color[] + */ + private function parseColors($colorData) : array { + $colors = []; + + foreach ($colorData as $item) { + if (isset($item['color']) && preg_match('/^#[0-9a-fA-F]{6}$/', $item['color'])) { + $colorInfo = ColorName::getName($item['color']); + $colors[] = new Color($colorInfo[1], $item['color']); + } + } + + return $colors; + } +} \ No newline at end of file diff --git a/source/php/Module/ColoredCards/assets/colors.json b/source/php/Module/ColoredCards/assets/colors.json new file mode 100644 index 000000000..3b6b364b9 --- /dev/null +++ b/source/php/Module/ColoredCards/assets/colors.json @@ -0,0 +1,6266 @@ +[ + [ + "000000", + "Black" + ], + [ + "000080", + "Navy Blue" + ], + [ + "0000C8", + "Dark Blue" + ], + [ + "0000FF", + "Blue" + ], + [ + "000741", + "Stratos" + ], + [ + "001B1C", + "Swamp" + ], + [ + "002387", + "Resolution Blue" + ], + [ + "002900", + "Deep Fir" + ], + [ + "002E20", + "Burnham" + ], + [ + "002FA7", + "International Klein Blue" + ], + [ + "003153", + "Prussian Blue" + ], + [ + "003366", + "Midnight Blue" + ], + [ + "003399", + "Smalt" + ], + [ + "003532", + "Deep Teal" + ], + [ + "003E40", + "Cyprus" + ], + [ + "004620", + "Kaitoke Green" + ], + [ + "0047AB", + "Cobalt" + ], + [ + "004816", + "Crusoe" + ], + [ + "004950", + "Sherpa Blue" + ], + [ + "0056A7", + "Endeavour" + ], + [ + "00581A", + "Camarone" + ], + [ + "0066CC", + "Science Blue" + ], + [ + "0066FF", + "Blue Ribbon" + ], + [ + "00755E", + "Tropical Rain Forest" + ], + [ + "0076A3", + "Allports" + ], + [ + "007BA7", + "Deep Cerulean" + ], + [ + "007EC7", + "Lochmara" + ], + [ + "007FFF", + "Azure Radiance" + ], + [ + "008080", + "Teal" + ], + [ + "0095B6", + "Bondi Blue" + ], + [ + "009DC4", + "Pacific Blue" + ], + [ + "00A693", + "Persian Green" + ], + [ + "00A86B", + "Jade" + ], + [ + "00CC99", + "Caribbean Green" + ], + [ + "00CCCC", + "Robin's Egg Blue" + ], + [ + "00FF00", + "Green" + ], + [ + "00FF7F", + "Spring Green" + ], + [ + "00FFFF", + "Cyan / Aqua" + ], + [ + "010D1A", + "Blue Charcoal" + ], + [ + "011635", + "Midnight" + ], + [ + "011D13", + "Holly" + ], + [ + "012731", + "Daintree" + ], + [ + "01361C", + "Cardin Green" + ], + [ + "01371A", + "County Green" + ], + [ + "013E62", + "Astronaut Blue" + ], + [ + "013F6A", + "Regal Blue" + ], + [ + "014B43", + "Aqua Deep" + ], + [ + "015E85", + "Orient" + ], + [ + "016162", + "Blue Stone" + ], + [ + "016D39", + "Fun Green" + ], + [ + "01796F", + "Pine Green" + ], + [ + "017987", + "Blue Lagoon" + ], + [ + "01826B", + "Deep Sea" + ], + [ + "01A368", + "Green Haze" + ], + [ + "022D15", + "English Holly" + ], + [ + "02402C", + "Sherwood Green" + ], + [ + "02478E", + "Congress Blue" + ], + [ + "024E46", + "Evening Sea" + ], + [ + "026395", + "Bahama Blue" + ], + [ + "02866F", + "Observatory" + ], + [ + "02A4D3", + "Cerulean" + ], + [ + "03163C", + "Tangaroa" + ], + [ + "032B52", + "Green Vogue" + ], + [ + "036A6E", + "Mosque" + ], + [ + "041004", + "Midnight Moss" + ], + [ + "041322", + "Black Pearl" + ], + [ + "042E4C", + "Blue Whale" + ], + [ + "044022", + "Zuccini" + ], + [ + "044259", + "Teal Blue" + ], + [ + "051040", + "Deep Cove" + ], + [ + "051657", + "Gulf Blue" + ], + [ + "055989", + "Venice Blue" + ], + [ + "056F57", + "Watercourse" + ], + [ + "062A78", + "Catalina Blue" + ], + [ + "063537", + "Tiber" + ], + [ + "069B81", + "Gossamer" + ], + [ + "06A189", + "Niagara" + ], + [ + "073A50", + "Tarawera" + ], + [ + "080110", + "Jaguar" + ], + [ + "081910", + "Black Bean" + ], + [ + "082567", + "Deep Sapphire" + ], + [ + "088370", + "Elf Green" + ], + [ + "08E8DE", + "Bright Turquoise" + ], + [ + "092256", + "Downriver" + ], + [ + "09230F", + "Palm Green" + ], + [ + "09255D", + "Madison" + ], + [ + "093624", + "Bottle Green" + ], + [ + "095859", + "Deep Sea Green" + ], + [ + "097F4B", + "Salem" + ], + [ + "0A001C", + "Black Russian" + ], + [ + "0A480D", + "Dark Fern" + ], + [ + "0A6906", + "Japanese Laurel" + ], + [ + "0A6F75", + "Atoll" + ], + [ + "0B0B0B", + "Cod Gray" + ], + [ + "0B0F08", + "Marshland" + ], + [ + "0B1107", + "Gordons Green" + ], + [ + "0B1304", + "Black Forest" + ], + [ + "0B6207", + "San Felix" + ], + [ + "0BDA51", + "Malachite" + ], + [ + "0C0B1D", + "Ebony" + ], + [ + "0C0D0F", + "Woodsmoke" + ], + [ + "0C1911", + "Racing Green" + ], + [ + "0C7A79", + "Surfie Green" + ], + [ + "0C8990", + "Blue Chill" + ], + [ + "0D0332", + "Black Rock" + ], + [ + "0D1117", + "Bunker" + ], + [ + "0D1C19", + "Aztec" + ], + [ + "0D2E1C", + "Bush" + ], + [ + "0E0E18", + "Cinder" + ], + [ + "0E2A30", + "Firefly" + ], + [ + "0F2D9E", + "Torea Bay" + ], + [ + "10121D", + "Vulcan" + ], + [ + "101405", + "Green Waterloo" + ], + [ + "105852", + "Eden" + ], + [ + "110C6C", + "Arapawa" + ], + [ + "120A8F", + "Ultramarine" + ], + [ + "123447", + "Elephant" + ], + [ + "126B40", + "Jewel" + ], + [ + "130000", + "Diesel" + ], + [ + "130A06", + "Asphalt" + ], + [ + "13264D", + "Blue Zodiac" + ], + [ + "134F19", + "Parsley" + ], + [ + "140600", + "Nero" + ], + [ + "1450AA", + "Tory Blue" + ], + [ + "151F4C", + "Bunting" + ], + [ + "1560BD", + "Denim" + ], + [ + "15736B", + "Genoa" + ], + [ + "161928", + "Mirage" + ], + [ + "161D10", + "Hunter Green" + ], + [ + "162A40", + "Big Stone" + ], + [ + "163222", + "Celtic" + ], + [ + "16322C", + "Timber Green" + ], + [ + "163531", + "Gable Green" + ], + [ + "171F04", + "Pine Tree" + ], + [ + "175579", + "Chathams Blue" + ], + [ + "182D09", + "Deep Forest Green" + ], + [ + "18587A", + "Blumine" + ], + [ + "19330E", + "Palm Leaf" + ], + [ + "193751", + "Nile Blue" + ], + [ + "1959A8", + "Fun Blue" + ], + [ + "1A1A68", + "Lucky Point" + ], + [ + "1AB385", + "Mountain Meadow" + ], + [ + "1B0245", + "Tolopea" + ], + [ + "1B1035", + "Haiti" + ], + [ + "1B127B", + "Deep Koamaru" + ], + [ + "1B1404", + "Acadia" + ], + [ + "1B2F11", + "Seaweed" + ], + [ + "1B3162", + "Biscay" + ], + [ + "1B659D", + "Matisse" + ], + [ + "1C1208", + "Crowshead" + ], + [ + "1C1E13", + "Rangoon Green" + ], + [ + "1C39BB", + "Persian Blue" + ], + [ + "1C402E", + "Everglade" + ], + [ + "1C7C7D", + "Elm" + ], + [ + "1D6142", + "Green Pea" + ], + [ + "1E0F04", + "Creole" + ], + [ + "1E1609", + "Karaka" + ], + [ + "1E1708", + "El Paso" + ], + [ + "1E385B", + "Cello" + ], + [ + "1E433C", + "Te Papa Green" + ], + [ + "1E90FF", + "Dodger Blue" + ], + [ + "1E9AB0", + "Eastern Blue" + ], + [ + "1F120F", + "Night Rider" + ], + [ + "1FC2C2", + "Java" + ], + [ + "20208D", + "Jacksons Purple" + ], + [ + "202E54", + "Cloud Burst" + ], + [ + "204852", + "Blue Dianne" + ], + [ + "211A0E", + "Eternity" + ], + [ + "220878", + "Deep Blue" + ], + [ + "228B22", + "Forest Green" + ], + [ + "233418", + "Mallard" + ], + [ + "240A40", + "Violet" + ], + [ + "240C02", + "Kilamanjaro" + ], + [ + "242A1D", + "Log Cabin" + ], + [ + "242E16", + "Black Olive" + ], + [ + "24500F", + "Green House" + ], + [ + "251607", + "Graphite" + ], + [ + "251706", + "Cannon Black" + ], + [ + "251F4F", + "Port Gore" + ], + [ + "25272C", + "Shark" + ], + [ + "25311C", + "Green Kelp" + ], + [ + "2596D1", + "Curious Blue" + ], + [ + "260368", + "Paua" + ], + [ + "26056A", + "Paris M" + ], + [ + "261105", + "Wood Bark" + ], + [ + "261414", + "Gondola" + ], + [ + "262335", + "Steel Gray" + ], + [ + "26283B", + "Ebony Clay" + ], + [ + "273A81", + "Bay of Many" + ], + [ + "27504B", + "Plantation" + ], + [ + "278A5B", + "Eucalyptus" + ], + [ + "281E15", + "Oil" + ], + [ + "283A77", + "Astronaut" + ], + [ + "286ACD", + "Mariner" + ], + [ + "290C5E", + "Violent Violet" + ], + [ + "292130", + "Bastille" + ], + [ + "292319", + "Zeus" + ], + [ + "292937", + "Charade" + ], + [ + "297B9A", + "Jelly Bean" + ], + [ + "29AB87", + "Jungle Green" + ], + [ + "2A0359", + "Cherry Pie" + ], + [ + "2A140E", + "Coffee Bean" + ], + [ + "2A2630", + "Baltic Sea" + ], + [ + "2A380B", + "Turtle Green" + ], + [ + "2A52BE", + "Cerulean Blue" + ], + [ + "2B0202", + "Sepia Black" + ], + [ + "2B194F", + "Valhalla" + ], + [ + "2B3228", + "Heavy Metal" + ], + [ + "2C0E8C", + "Blue Gem" + ], + [ + "2C1632", + "Revolver" + ], + [ + "2C2133", + "Bleached Cedar" + ], + [ + "2C8C84", + "Lochinvar" + ], + [ + "2D2510", + "Mikado" + ], + [ + "2D383A", + "Outer Space" + ], + [ + "2D569B", + "St Tropaz" + ], + [ + "2E0329", + "Jacaranda" + ], + [ + "2E1905", + "Jacko Bean" + ], + [ + "2E3222", + "Rangitoto" + ], + [ + "2E3F62", + "Rhino" + ], + [ + "2E8B57", + "Sea Green" + ], + [ + "2EBFD4", + "Scooter" + ], + [ + "2F270E", + "Onion" + ], + [ + "2F3CB3", + "Governor Bay" + ], + [ + "2F519E", + "Sapphire" + ], + [ + "2F5A57", + "Spectra" + ], + [ + "2F6168", + "Casal" + ], + [ + "300529", + "Melanzane" + ], + [ + "301F1E", + "Cocoa Brown" + ], + [ + "302A0F", + "Woodrush" + ], + [ + "304B6A", + "San Juan" + ], + [ + "30D5C8", + "Turquoise" + ], + [ + "311C17", + "Eclipse" + ], + [ + "314459", + "Pickled Bluewood" + ], + [ + "315BA1", + "Azure" + ], + [ + "31728D", + "Calypso" + ], + [ + "317D82", + "Paradiso" + ], + [ + "32127A", + "Persian Indigo" + ], + [ + "32293A", + "Blackcurrant" + ], + [ + "323232", + "Mine Shaft" + ], + [ + "325D52", + "Stromboli" + ], + [ + "327C14", + "Bilbao" + ], + [ + "327DA0", + "Astral" + ], + [ + "33036B", + "Christalle" + ], + [ + "33292F", + "Thunder" + ], + [ + "33CC99", + "Shamrock" + ], + [ + "341515", + "Tamarind" + ], + [ + "350036", + "Mardi Gras" + ], + [ + "350E42", + "Valentino" + ], + [ + "350E57", + "Jagger" + ], + [ + "353542", + "Tuna" + ], + [ + "354E8C", + "Chambray" + ], + [ + "363050", + "Martinique" + ], + [ + "363534", + "Tuatara" + ], + [ + "363C0D", + "Waiouru" + ], + [ + "36747D", + "Ming" + ], + [ + "368716", + "La Palma" + ], + [ + "370202", + "Chocolate" + ], + [ + "371D09", + "Clinker" + ], + [ + "37290E", + "Brown Tumbleweed" + ], + [ + "373021", + "Birch" + ], + [ + "377475", + "Oracle" + ], + [ + "380474", + "Blue Diamond" + ], + [ + "381A51", + "Grape" + ], + [ + "383533", + "Dune" + ], + [ + "384555", + "Oxford Blue" + ], + [ + "384910", + "Clover" + ], + [ + "394851", + "Limed Spruce" + ], + [ + "396413", + "Dell" + ], + [ + "3A0020", + "Toledo" + ], + [ + "3A2010", + "Sambuca" + ], + [ + "3A2A6A", + "Jacarta" + ], + [ + "3A686C", + "William" + ], + [ + "3A6A47", + "Killarney" + ], + [ + "3AB09E", + "Keppel" + ], + [ + "3B000B", + "Temptress" + ], + [ + "3B0910", + "Aubergine" + ], + [ + "3B1F1F", + "Jon" + ], + [ + "3B2820", + "Treehouse" + ], + [ + "3B7A57", + "Amazon" + ], + [ + "3B91B4", + "Boston Blue" + ], + [ + "3C0878", + "Windsor" + ], + [ + "3C1206", + "Rebel" + ], + [ + "3C1F76", + "Meteorite" + ], + [ + "3C2005", + "Dark Ebony" + ], + [ + "3C3910", + "Camouflage" + ], + [ + "3C4151", + "Bright Gray" + ], + [ + "3C4443", + "Cape Cod" + ], + [ + "3C493A", + "Lunar Green" + ], + [ + "3D0C02", + "Bean " + ], + [ + "3D2B1F", + "Bistre" + ], + [ + "3D7D52", + "Goblin" + ], + [ + "3E0480", + "Kingfisher Daisy" + ], + [ + "3E1C14", + "Cedar" + ], + [ + "3E2B23", + "English Walnut" + ], + [ + "3E2C1C", + "Black Marlin" + ], + [ + "3E3A44", + "Ship Gray" + ], + [ + "3EABBF", + "Pelorous" + ], + [ + "3F2109", + "Bronze" + ], + [ + "3F2500", + "Cola" + ], + [ + "3F3002", + "Madras" + ], + [ + "3F307F", + "Minsk" + ], + [ + "3F4C3A", + "Cabbage Pont" + ], + [ + "3F583B", + "Tom Thumb" + ], + [ + "3F5D53", + "Mineral Green" + ], + [ + "3FC1AA", + "Puerto Rico" + ], + [ + "3FFF00", + "Harlequin" + ], + [ + "401801", + "Brown Pod" + ], + [ + "40291D", + "Cork" + ], + [ + "403B38", + "Masala" + ], + [ + "403D19", + "Thatch Green" + ], + [ + "405169", + "Fiord" + ], + [ + "40826D", + "Viridian" + ], + [ + "40A860", + "Chateau Green" + ], + [ + "410056", + "Ripe Plum" + ], + [ + "411F10", + "Paco" + ], + [ + "412010", + "Deep Oak" + ], + [ + "413C37", + "Merlin" + ], + [ + "414257", + "Gun Powder" + ], + [ + "414C7D", + "East Bay" + ], + [ + "4169E1", + "Royal Blue" + ], + [ + "41AA78", + "Ocean Green" + ], + [ + "420303", + "Burnt Maroon" + ], + [ + "423921", + "Lisbon Brown" + ], + [ + "427977", + "Faded Jade" + ], + [ + "431560", + "Scarlet Gum" + ], + [ + "433120", + "Iroko" + ], + [ + "433E37", + "Armadillo" + ], + [ + "434C59", + "River Bed" + ], + [ + "436A0D", + "Green Leaf" + ], + [ + "44012D", + "Barossa" + ], + [ + "441D00", + "Morocco Brown" + ], + [ + "444954", + "Mako" + ], + [ + "454936", + "Kelp" + ], + [ + "456CAC", + "San Marino" + ], + [ + "45B1E8", + "Picton Blue" + ], + [ + "460B41", + "Loulou" + ], + [ + "462425", + "Crater Brown" + ], + [ + "465945", + "Gray Asparagus" + ], + [ + "4682B4", + "Steel Blue" + ], + [ + "480404", + "Rustic Red" + ], + [ + "480607", + "Bulgarian Rose" + ], + [ + "480656", + "Clairvoyant" + ], + [ + "481C1C", + "Cocoa Bean" + ], + [ + "483131", + "Woody Brown" + ], + [ + "483C32", + "Taupe" + ], + [ + "49170C", + "Van Cleef" + ], + [ + "492615", + "Brown Derby" + ], + [ + "49371B", + "Metallic Bronze" + ], + [ + "495400", + "Verdun Green" + ], + [ + "496679", + "Blue Bayoux" + ], + [ + "497183", + "Bismark" + ], + [ + "4A2A04", + "Bracken" + ], + [ + "4A3004", + "Deep Bronze" + ], + [ + "4A3C30", + "Mondo" + ], + [ + "4A4244", + "Tundora" + ], + [ + "4A444B", + "Gravel" + ], + [ + "4A4E5A", + "Trout" + ], + [ + "4B0082", + "Pigment Indigo" + ], + [ + "4B5D52", + "Nandor" + ], + [ + "4C3024", + "Saddle" + ], + [ + "4C4F56", + "Abbey" + ], + [ + "4D0135", + "Blackberry" + ], + [ + "4D0A18", + "Cab Sav" + ], + [ + "4D1E01", + "Indian Tan" + ], + [ + "4D282D", + "Cowboy" + ], + [ + "4D282E", + "Livid Brown" + ], + [ + "4D3833", + "Rock" + ], + [ + "4D3D14", + "Punga" + ], + [ + "4D400F", + "Bronzetone" + ], + [ + "4D5328", + "Woodland" + ], + [ + "4E0606", + "Mahogany" + ], + [ + "4E2A5A", + "Bossanova" + ], + [ + "4E3B41", + "Matterhorn" + ], + [ + "4E420C", + "Bronze Olive" + ], + [ + "4E4562", + "Mulled Wine" + ], + [ + "4E6649", + "Axolotl" + ], + [ + "4E7F9E", + "Wedgewood" + ], + [ + "4EABD1", + "Shakespeare" + ], + [ + "4F1C70", + "Honey Flower" + ], + [ + "4F2398", + "Daisy Bush" + ], + [ + "4F69C6", + "Indigo" + ], + [ + "4F7942", + "Fern Green" + ], + [ + "4F9D5D", + "Fruit Salad" + ], + [ + "4FA83D", + "Apple" + ], + [ + "504351", + "Mortar" + ], + [ + "507096", + "Kashmir Blue" + ], + [ + "507672", + "Cutty Sark" + ], + [ + "50C878", + "Emerald" + ], + [ + "514649", + "Emperor" + ], + [ + "516E3D", + "Chalet Green" + ], + [ + "517C66", + "Como" + ], + [ + "51808F", + "Smalt Blue" + ], + [ + "52001F", + "Castro" + ], + [ + "520C17", + "Maroon Oak" + ], + [ + "523C94", + "Gigas" + ], + [ + "533455", + "Voodoo" + ], + [ + "534491", + "Victoria" + ], + [ + "53824B", + "Hippie Green" + ], + [ + "541012", + "Heath" + ], + [ + "544333", + "Judge Gray" + ], + [ + "54534D", + "Fuscous Gray" + ], + [ + "549019", + "Vida Loca" + ], + [ + "55280C", + "Cioccolato" + ], + [ + "555B10", + "Saratoga" + ], + [ + "556D56", + "Finlandia" + ], + [ + "5590D9", + "Havelock Blue" + ], + [ + "56B4BE", + "Fountain Blue" + ], + [ + "578363", + "Spring Leaves" + ], + [ + "583401", + "Saddle Brown" + ], + [ + "585562", + "Scarpa Flow" + ], + [ + "587156", + "Cactus" + ], + [ + "589AAF", + "Hippie Blue" + ], + [ + "591D35", + "Wine Berry" + ], + [ + "592804", + "Brown Bramble" + ], + [ + "593737", + "Congo Brown" + ], + [ + "594433", + "Millbrook" + ], + [ + "5A6E9C", + "Waikawa Gray" + ], + [ + "5A87A0", + "Horizon" + ], + [ + "5B3013", + "Jambalaya" + ], + [ + "5C0120", + "Bordeaux" + ], + [ + "5C0536", + "Mulberry Wood" + ], + [ + "5C2E01", + "Carnaby Tan" + ], + [ + "5C5D75", + "Comet" + ], + [ + "5D1E0F", + "Redwood" + ], + [ + "5D4C51", + "Don Juan" + ], + [ + "5D5C58", + "Chicago" + ], + [ + "5D5E37", + "Verdigris" + ], + [ + "5D7747", + "Dingley" + ], + [ + "5DA19F", + "Breaker Bay" + ], + [ + "5E483E", + "Kabul" + ], + [ + "5E5D3B", + "Hemlock" + ], + [ + "5F3D26", + "Irish Coffee" + ], + [ + "5F5F6E", + "Mid Gray" + ], + [ + "5F6672", + "Shuttle Gray" + ], + [ + "5FA777", + "Aqua Forest" + ], + [ + "5FB3AC", + "Tradewind" + ], + [ + "604913", + "Horses Neck" + ], + [ + "605B73", + "Smoky" + ], + [ + "606E68", + "Corduroy" + ], + [ + "6093D1", + "Danube" + ], + [ + "612718", + "Espresso" + ], + [ + "614051", + "Eggplant" + ], + [ + "615D30", + "Costa Del Sol" + ], + [ + "61845F", + "Glade Green" + ], + [ + "622F30", + "Buccaneer" + ], + [ + "623F2D", + "Quincy" + ], + [ + "624E9A", + "Butterfly Bush" + ], + [ + "625119", + "West Coast" + ], + [ + "626649", + "Finch" + ], + [ + "639A8F", + "Patina" + ], + [ + "63B76C", + "Fern" + ], + [ + "6456B7", + "Blue Violet" + ], + [ + "646077", + "Dolphin" + ], + [ + "646463", + "Storm Dust" + ], + [ + "646A54", + "Siam" + ], + [ + "646E75", + "Nevada" + ], + [ + "6495ED", + "Cornflower Blue" + ], + [ + "64CCDB", + "Viking" + ], + [ + "65000B", + "Rosewood" + ], + [ + "651A14", + "Cherrywood" + ], + [ + "652DC1", + "Purple Heart" + ], + [ + "657220", + "Fern Frond" + ], + [ + "65745D", + "Willow Grove" + ], + [ + "65869F", + "Hoki" + ], + [ + "660045", + "Pompadour" + ], + [ + "660099", + "Purple" + ], + [ + "66023C", + "Tyrian Purple" + ], + [ + "661010", + "Dark Tan" + ], + [ + "66B58F", + "Silver Tree" + ], + [ + "66FF00", + "Bright Green" + ], + [ + "66FF66", + "Screamin' Green" + ], + [ + "67032D", + "Black Rose" + ], + [ + "675FA6", + "Scampi" + ], + [ + "676662", + "Ironside Gray" + ], + [ + "678975", + "Viridian Green" + ], + [ + "67A712", + "Christi" + ], + [ + "683600", + "Nutmeg Wood Finish" + ], + [ + "685558", + "Zambezi" + ], + [ + "685E6E", + "Salt Box" + ], + [ + "692545", + "Tawny Port" + ], + [ + "692D54", + "Finn" + ], + [ + "695F62", + "Scorpion" + ], + [ + "697E9A", + "Lynch" + ], + [ + "6A442E", + "Spice" + ], + [ + "6A5D1B", + "Himalaya" + ], + [ + "6A6051", + "Soya Bean" + ], + [ + "6B2A14", + "Hairy Heath" + ], + [ + "6B3FA0", + "Royal Purple" + ], + [ + "6B4E31", + "Shingle Fawn" + ], + [ + "6B5755", + "Dorado" + ], + [ + "6B8BA2", + "Bermuda Gray" + ], + [ + "6B8E23", + "Olive Drab" + ], + [ + "6C3082", + "Eminence" + ], + [ + "6CDAE7", + "Turquoise Blue" + ], + [ + "6D0101", + "Lonestar" + ], + [ + "6D5E54", + "Pine Cone" + ], + [ + "6D6C6C", + "Dove Gray" + ], + [ + "6D9292", + "Juniper" + ], + [ + "6D92A1", + "Gothic" + ], + [ + "6E0902", + "Red Oxide" + ], + [ + "6E1D14", + "Moccaccino" + ], + [ + "6E4826", + "Pickled Bean" + ], + [ + "6E4B26", + "Dallas" + ], + [ + "6E6D57", + "Kokoda" + ], + [ + "6E7783", + "Pale Sky" + ], + [ + "6F440C", + "Cafe Royale" + ], + [ + "6F6A61", + "Flint" + ], + [ + "6F8E63", + "Highland" + ], + [ + "6F9D02", + "Limeade" + ], + [ + "6FD0C5", + "Downy" + ], + [ + "701C1C", + "Persian Plum" + ], + [ + "704214", + "Sepia" + ], + [ + "704A07", + "Antique Bronze" + ], + [ + "704F50", + "Ferra" + ], + [ + "706555", + "Coffee" + ], + [ + "708090", + "Slate Gray" + ], + [ + "711A00", + "Cedar Wood Finish" + ], + [ + "71291D", + "Metallic Copper" + ], + [ + "714693", + "Affair" + ], + [ + "714AB2", + "Studio" + ], + [ + "715D47", + "Tobacco Brown" + ], + [ + "716338", + "Yellow Metal" + ], + [ + "716B56", + "Peat" + ], + [ + "716E10", + "Olivetone" + ], + [ + "717486", + "Storm Gray" + ], + [ + "718080", + "Sirocco" + ], + [ + "71D9E2", + "Aquamarine Blue" + ], + [ + "72010F", + "Venetian Red" + ], + [ + "724A2F", + "Old Copper" + ], + [ + "726D4E", + "Go Ben" + ], + [ + "727B89", + "Raven" + ], + [ + "731E8F", + "Seance" + ], + [ + "734A12", + "Raw Umber" + ], + [ + "736C9F", + "Kimberly" + ], + [ + "736D58", + "Crocodile" + ], + [ + "737829", + "Crete" + ], + [ + "738678", + "Xanadu" + ], + [ + "74640D", + "Spicy Mustard" + ], + [ + "747D63", + "Limed Ash" + ], + [ + "747D83", + "Rolling Stone" + ], + [ + "748881", + "Blue Smoke" + ], + [ + "749378", + "Laurel" + ], + [ + "74C365", + "Mantis" + ], + [ + "755A57", + "Russett" + ], + [ + "7563A8", + "Deluge" + ], + [ + "76395D", + "Cosmic" + ], + [ + "7666C6", + "Blue Marguerite" + ], + [ + "76BD17", + "Lima" + ], + [ + "76D7EA", + "Sky Blue" + ], + [ + "770F05", + "Dark Burgundy" + ], + [ + "771F1F", + "Crown of Thorns" + ], + [ + "773F1A", + "Walnut" + ], + [ + "776F61", + "Pablo" + ], + [ + "778120", + "Pacifika" + ], + [ + "779E86", + "Oxley" + ], + [ + "77DD77", + "Pastel Green" + ], + [ + "780109", + "Japanese Maple" + ], + [ + "782D19", + "Mocha" + ], + [ + "782F16", + "Peanut" + ], + [ + "78866B", + "Camouflage Green" + ], + [ + "788A25", + "Wasabi" + ], + [ + "788BBA", + "Ship Cove" + ], + [ + "78A39C", + "Sea Nymph" + ], + [ + "795D4C", + "Roman Coffee" + ], + [ + "796878", + "Old Lavender" + ], + [ + "796989", + "Rum" + ], + [ + "796A78", + "Fedora" + ], + [ + "796D62", + "Sandstone" + ], + [ + "79DEEC", + "Spray" + ], + [ + "7A013A", + "Siren" + ], + [ + "7A58C1", + "Fuchsia Blue" + ], + [ + "7A7A7A", + "Boulder" + ], + [ + "7A89B8", + "Wild Blue Yonder" + ], + [ + "7AC488", + "De York" + ], + [ + "7B3801", + "Red Beech" + ], + [ + "7B3F00", + "Cinnamon" + ], + [ + "7B6608", + "Yukon Gold" + ], + [ + "7B7874", + "Tapa" + ], + [ + "7B7C94", + "Waterloo " + ], + [ + "7B8265", + "Flax Smoke" + ], + [ + "7B9F80", + "Amulet" + ], + [ + "7BA05B", + "Asparagus" + ], + [ + "7C1C05", + "Kenyan Copper" + ], + [ + "7C7631", + "Pesto" + ], + [ + "7C778A", + "Topaz" + ], + [ + "7C7B7A", + "Concord" + ], + [ + "7C7B82", + "Jumbo" + ], + [ + "7C881A", + "Trendy Green" + ], + [ + "7CA1A6", + "Gumbo" + ], + [ + "7CB0A1", + "Acapulco" + ], + [ + "7CB7BB", + "Neptune" + ], + [ + "7D2C14", + "Pueblo" + ], + [ + "7DA98D", + "Bay Leaf" + ], + [ + "7DC8F7", + "Malibu" + ], + [ + "7DD8C6", + "Bermuda" + ], + [ + "7E3A15", + "Copper Canyon" + ], + [ + "7F1734", + "Claret" + ], + [ + "7F3A02", + "Peru Tan" + ], + [ + "7F626D", + "Falcon" + ], + [ + "7F7589", + "Mobster" + ], + [ + "7F76D3", + "Moody Blue" + ], + [ + "7FFF00", + "Chartreuse" + ], + [ + "7FFFD4", + "Aquamarine" + ], + [ + "800000", + "Maroon" + ], + [ + "800B47", + "Rose Bud Cherry" + ], + [ + "801818", + "Falu Red" + ], + [ + "80341F", + "Red Robin" + ], + [ + "803790", + "Vivid Violet" + ], + [ + "80461B", + "Russet" + ], + [ + "807E79", + "Friar Gray" + ], + [ + "808000", + "Olive" + ], + [ + "808080", + "Gray" + ], + [ + "80B3AE", + "Gulf Stream" + ], + [ + "80B3C4", + "Glacier" + ], + [ + "80CCEA", + "Seagull" + ], + [ + "81422C", + "Nutmeg" + ], + [ + "816E71", + "Spicy Pink" + ], + [ + "817377", + "Empress" + ], + [ + "819885", + "Spanish Green" + ], + [ + "826F65", + "Sand Dune" + ], + [ + "828685", + "Gunsmoke" + ], + [ + "828F72", + "Battleship Gray" + ], + [ + "831923", + "Merlot" + ], + [ + "837050", + "Shadow" + ], + [ + "83AA5D", + "Chelsea Cucumber" + ], + [ + "83D0C6", + "Monte Carlo" + ], + [ + "843179", + "Plum" + ], + [ + "84A0A0", + "Granny Smith" + ], + [ + "8581D9", + "Chetwode Blue" + ], + [ + "858470", + "Bandicoot" + ], + [ + "859FAF", + "Bali Hai" + ], + [ + "85C4CC", + "Half Baked" + ], + [ + "860111", + "Red Devil" + ], + [ + "863C3C", + "Lotus" + ], + [ + "86483C", + "Ironstone" + ], + [ + "864D1E", + "Bull Shot" + ], + [ + "86560A", + "Rusty Nail" + ], + [ + "868974", + "Bitter" + ], + [ + "86949F", + "Regent Gray" + ], + [ + "871550", + "Disco" + ], + [ + "87756E", + "Americano" + ], + [ + "877C7B", + "Hurricane" + ], + [ + "878D91", + "Oslo Gray" + ], + [ + "87AB39", + "Sushi" + ], + [ + "885342", + "Spicy Mix" + ], + [ + "886221", + "Kumera" + ], + [ + "888387", + "Suva Gray" + ], + [ + "888D65", + "Avocado" + ], + [ + "893456", + "Camelot" + ], + [ + "893843", + "Solid Pink" + ], + [ + "894367", + "Cannon Pink" + ], + [ + "897D6D", + "Makara" + ], + [ + "8A3324", + "Burnt Umber" + ], + [ + "8A73D6", + "True V" + ], + [ + "8A8360", + "Clay Creek" + ], + [ + "8A8389", + "Monsoon" + ], + [ + "8A8F8A", + "Stack" + ], + [ + "8AB9F1", + "Jordy Blue" + ], + [ + "8B00FF", + "Electric Violet" + ], + [ + "8B0723", + "Monarch" + ], + [ + "8B6B0B", + "Corn Harvest" + ], + [ + "8B8470", + "Olive Haze" + ], + [ + "8B847E", + "Schooner" + ], + [ + "8B8680", + "Natural Gray" + ], + [ + "8B9C90", + "Mantle" + ], + [ + "8B9FEE", + "Portage" + ], + [ + "8BA690", + "Envy" + ], + [ + "8BA9A5", + "Cascade" + ], + [ + "8BE6D8", + "Riptide" + ], + [ + "8C055E", + "Cardinal Pink" + ], + [ + "8C472F", + "Mule Fawn" + ], + [ + "8C5738", + "Potters Clay" + ], + [ + "8C6495", + "Trendy Pink" + ], + [ + "8D0226", + "Paprika" + ], + [ + "8D3D38", + "Sanguine Brown" + ], + [ + "8D3F3F", + "Tosca" + ], + [ + "8D7662", + "Cement" + ], + [ + "8D8974", + "Granite Green" + ], + [ + "8D90A1", + "Manatee" + ], + [ + "8DA8CC", + "Polo Blue" + ], + [ + "8E0000", + "Red Berry" + ], + [ + "8E4D1E", + "Rope" + ], + [ + "8E6F70", + "Opium" + ], + [ + "8E775E", + "Domino" + ], + [ + "8E8190", + "Mamba" + ], + [ + "8EABC1", + "Nepal" + ], + [ + "8F021C", + "Pohutukawa" + ], + [ + "8F3E33", + "El Salva" + ], + [ + "8F4B0E", + "Korma" + ], + [ + "8F8176", + "Squirrel" + ], + [ + "8FD6B4", + "Vista Blue" + ], + [ + "900020", + "Burgundy" + ], + [ + "901E1E", + "Old Brick" + ], + [ + "907874", + "Hemp" + ], + [ + "907B71", + "Almond Frost" + ], + [ + "908D39", + "Sycamore" + ], + [ + "92000A", + "Sangria" + ], + [ + "924321", + "Cumin" + ], + [ + "926F5B", + "Beaver" + ], + [ + "928573", + "Stonewall" + ], + [ + "928590", + "Venus" + ], + [ + "9370DB", + "Medium Purple" + ], + [ + "93CCEA", + "Cornflower" + ], + [ + "93DFB8", + "Algae Green" + ], + [ + "944747", + "Copper Rust" + ], + [ + "948771", + "Arrowtown" + ], + [ + "950015", + "Scarlett" + ], + [ + "956387", + "Strikemaster" + ], + [ + "959396", + "Mountain Mist" + ], + [ + "960018", + "Carmine" + ], + [ + "964B00", + "Brown" + ], + [ + "967059", + "Leather" + ], + [ + "9678B6", + "Purple Mountain's Majesty" + ], + [ + "967BB6", + "Lavender Purple" + ], + [ + "96A8A1", + "Pewter" + ], + [ + "96BBAB", + "Summer Green" + ], + [ + "97605D", + "Au Chico" + ], + [ + "9771B5", + "Wisteria" + ], + [ + "97CD2D", + "Atlantis" + ], + [ + "983D61", + "Vin Rouge" + ], + [ + "9874D3", + "Lilac Bush" + ], + [ + "98777B", + "Bazaar" + ], + [ + "98811B", + "Hacienda" + ], + [ + "988D77", + "Pale Oyster" + ], + [ + "98FF98", + "Mint Green" + ], + [ + "990066", + "Fresh Eggplant" + ], + [ + "991199", + "Violet Eggplant" + ], + [ + "991613", + "Tamarillo" + ], + [ + "991B07", + "Totem Pole" + ], + [ + "996666", + "Copper Rose" + ], + [ + "9966CC", + "Amethyst" + ], + [ + "997A8D", + "Mountbatten Pink" + ], + [ + "9999CC", + "Blue Bell" + ], + [ + "9A3820", + "Prairie Sand" + ], + [ + "9A6E61", + "Toast" + ], + [ + "9A9577", + "Gurkha" + ], + [ + "9AB973", + "Olivine" + ], + [ + "9AC2B8", + "Shadow Green" + ], + [ + "9B4703", + "Oregon" + ], + [ + "9B9E8F", + "Lemon Grass" + ], + [ + "9C3336", + "Stiletto" + ], + [ + "9D5616", + "Hawaiian Tan" + ], + [ + "9DACB7", + "Gull Gray" + ], + [ + "9DC209", + "Pistachio" + ], + [ + "9DE093", + "Granny Smith Apple" + ], + [ + "9DE5FF", + "Anakiwa" + ], + [ + "9E5302", + "Chelsea Gem" + ], + [ + "9E5B40", + "Sepia Skin" + ], + [ + "9EA587", + "Sage" + ], + [ + "9EA91F", + "Citron" + ], + [ + "9EB1CD", + "Rock Blue" + ], + [ + "9EDEE0", + "Morning Glory" + ], + [ + "9F381D", + "Cognac" + ], + [ + "9F821C", + "Reef Gold" + ], + [ + "9F9F9C", + "Star Dust" + ], + [ + "9FA0B1", + "Santas Gray" + ], + [ + "9FD7D3", + "Sinbad" + ], + [ + "9FDD8C", + "Feijoa" + ], + [ + "A02712", + "Tabasco" + ], + [ + "A1750D", + "Buttered Rum" + ], + [ + "A1ADB5", + "Hit Gray" + ], + [ + "A1C50A", + "Citrus" + ], + [ + "A1DAD7", + "Aqua Island" + ], + [ + "A1E9DE", + "Water Leaf" + ], + [ + "A2006D", + "Flirt" + ], + [ + "A23B6C", + "Rouge" + ], + [ + "A26645", + "Cape Palliser" + ], + [ + "A2AAB3", + "Gray Chateau" + ], + [ + "A2AEAB", + "Edward" + ], + [ + "A3807B", + "Pharlap" + ], + [ + "A397B4", + "Amethyst Smoke" + ], + [ + "A3E3ED", + "Blizzard Blue" + ], + [ + "A4A49D", + "Delta" + ], + [ + "A4A6D3", + "Wistful" + ], + [ + "A4AF6E", + "Green Smoke" + ], + [ + "A50B5E", + "Jazzberry Jam" + ], + [ + "A59B91", + "Zorba" + ], + [ + "A5CB0C", + "Bahia" + ], + [ + "A62F20", + "Roof Terracotta" + ], + [ + "A65529", + "Paarl" + ], + [ + "A68B5B", + "Barley Corn" + ], + [ + "A69279", + "Donkey Brown" + ], + [ + "A6A29A", + "Dawn" + ], + [ + "A72525", + "Mexican Red" + ], + [ + "A7882C", + "Luxor Gold" + ], + [ + "A85307", + "Rich Gold" + ], + [ + "A86515", + "Reno Sand" + ], + [ + "A86B6B", + "Coral Tree" + ], + [ + "A8989B", + "Dusty Gray" + ], + [ + "A899E6", + "Dull Lavender" + ], + [ + "A8A589", + "Tallow" + ], + [ + "A8AE9C", + "Bud" + ], + [ + "A8AF8E", + "Locust" + ], + [ + "A8BD9F", + "Norway" + ], + [ + "A8E3BD", + "Chinook" + ], + [ + "A9A491", + "Gray Olive" + ], + [ + "A9ACB6", + "Aluminium" + ], + [ + "A9B2C3", + "Cadet Blue" + ], + [ + "A9B497", + "Schist" + ], + [ + "A9BDBF", + "Tower Gray" + ], + [ + "A9BEF2", + "Perano" + ], + [ + "A9C6C2", + "Opal" + ], + [ + "AA375A", + "Night Shadz" + ], + [ + "AA4203", + "Fire" + ], + [ + "AA8B5B", + "Muesli" + ], + [ + "AA8D6F", + "Sandal" + ], + [ + "AAA5A9", + "Shady Lady" + ], + [ + "AAA9CD", + "Logan" + ], + [ + "AAABB7", + "Spun Pearl" + ], + [ + "AAD6E6", + "Regent St Blue" + ], + [ + "AAF0D1", + "Magic Mint" + ], + [ + "AB0563", + "Lipstick" + ], + [ + "AB3472", + "Royal Heath" + ], + [ + "AB917A", + "Sandrift" + ], + [ + "ABA0D9", + "Cold Purple" + ], + [ + "ABA196", + "Bronco" + ], + [ + "AC8A56", + "Limed Oak" + ], + [ + "AC91CE", + "East Side" + ], + [ + "AC9E22", + "Lemon Ginger" + ], + [ + "ACA494", + "Napa" + ], + [ + "ACA586", + "Hillary" + ], + [ + "ACA59F", + "Cloudy" + ], + [ + "ACACAC", + "Silver Chalice" + ], + [ + "ACB78E", + "Swamp Green" + ], + [ + "ACCBB1", + "Spring Rain" + ], + [ + "ACDD4D", + "Conifer" + ], + [ + "ACE1AF", + "Celadon" + ], + [ + "AD781B", + "Mandalay" + ], + [ + "ADBED1", + "Casper" + ], + [ + "ADDFAD", + "Moss Green" + ], + [ + "ADE6C4", + "Padua" + ], + [ + "ADFF2F", + "Green Yellow" + ], + [ + "AE4560", + "Hippie Pink" + ], + [ + "AE6020", + "Desert" + ], + [ + "AE809E", + "Bouquet" + ], + [ + "AF4035", + "Medium Carmine" + ], + [ + "AF4D43", + "Apple Blossom" + ], + [ + "AF593E", + "Brown Rust" + ], + [ + "AF8751", + "Driftwood" + ], + [ + "AF8F2C", + "Alpine" + ], + [ + "AF9F1C", + "Lucky" + ], + [ + "AFA09E", + "Martini" + ], + [ + "AFB1B8", + "Bombay" + ], + [ + "AFBDD9", + "Pigeon Post" + ], + [ + "B04C6A", + "Cadillac" + ], + [ + "B05D54", + "Matrix" + ], + [ + "B05E81", + "Tapestry" + ], + [ + "B06608", + "Mai Tai" + ], + [ + "B09A95", + "Del Rio" + ], + [ + "B0E0E6", + "Powder Blue" + ], + [ + "B0E313", + "Inch Worm" + ], + [ + "B10000", + "Bright Red" + ], + [ + "B14A0B", + "Vesuvius" + ], + [ + "B1610B", + "Pumpkin Skin" + ], + [ + "B16D52", + "Santa Fe" + ], + [ + "B19461", + "Teak" + ], + [ + "B1E2C1", + "Fringy Flower" + ], + [ + "B1F4E7", + "Ice Cold" + ], + [ + "B20931", + "Shiraz" + ], + [ + "B2A1EA", + "Biloba Flower" + ], + [ + "B32D29", + "Tall Poppy" + ], + [ + "B35213", + "Fiery Orange" + ], + [ + "B38007", + "Hot Toddy" + ], + [ + "B3AF95", + "Taupe Gray" + ], + [ + "B3C110", + "La Rioja" + ], + [ + "B43332", + "Well Read" + ], + [ + "B44668", + "Blush" + ], + [ + "B4CFD3", + "Jungle Mist" + ], + [ + "B57281", + "Turkish Rose" + ], + [ + "B57EDC", + "Lavender" + ], + [ + "B5A27F", + "Mongoose" + ], + [ + "B5B35C", + "Olive Green" + ], + [ + "B5D2CE", + "Jet Stream" + ], + [ + "B5ECDF", + "Cruise" + ], + [ + "B6316C", + "Hibiscus" + ], + [ + "B69D98", + "Thatch" + ], + [ + "B6B095", + "Heathered Gray" + ], + [ + "B6BAA4", + "Eagle" + ], + [ + "B6D1EA", + "Spindle" + ], + [ + "B6D3BF", + "Gum Leaf" + ], + [ + "B7410E", + "Rust" + ], + [ + "B78E5C", + "Muddy Waters" + ], + [ + "B7A214", + "Sahara" + ], + [ + "B7A458", + "Husk" + ], + [ + "B7B1B1", + "Nobel" + ], + [ + "B7C3D0", + "Heather" + ], + [ + "B7F0BE", + "Madang" + ], + [ + "B81104", + "Milano Red" + ], + [ + "B87333", + "Copper" + ], + [ + "B8B56A", + "Gimblet" + ], + [ + "B8C1B1", + "Green Spring" + ], + [ + "B8C25D", + "Celery" + ], + [ + "B8E0F9", + "Sail" + ], + [ + "B94E48", + "Chestnut" + ], + [ + "B95140", + "Crail" + ], + [ + "B98D28", + "Marigold" + ], + [ + "B9C46A", + "Wild Willow" + ], + [ + "B9C8AC", + "Rainee" + ], + [ + "BA0101", + "Guardsman Red" + ], + [ + "BA450C", + "Rock Spray" + ], + [ + "BA6F1E", + "Bourbon" + ], + [ + "BA7F03", + "Pirate Gold" + ], + [ + "BAB1A2", + "Nomad" + ], + [ + "BAC7C9", + "Submarine" + ], + [ + "BAEEF9", + "Charlotte" + ], + [ + "BB3385", + "Medium Red Violet" + ], + [ + "BB8983", + "Brandy Rose" + ], + [ + "BBD009", + "Rio Grande" + ], + [ + "BBD7C1", + "Surf" + ], + [ + "BCC9C2", + "Powder Ash" + ], + [ + "BD5E2E", + "Tuscany" + ], + [ + "BD978E", + "Quicksand" + ], + [ + "BDB1A8", + "Silk" + ], + [ + "BDB2A1", + "Malta" + ], + [ + "BDB3C7", + "Chatelle" + ], + [ + "BDBBD7", + "Lavender Gray" + ], + [ + "BDBDC6", + "French Gray" + ], + [ + "BDC8B3", + "Clay Ash" + ], + [ + "BDC9CE", + "Loblolly" + ], + [ + "BDEDFD", + "French Pass" + ], + [ + "BEA6C3", + "London Hue" + ], + [ + "BEB5B7", + "Pink Swan" + ], + [ + "BEDE0D", + "Fuego" + ], + [ + "BF5500", + "Rose of Sharon" + ], + [ + "BFB8B0", + "Tide" + ], + [ + "BFBED8", + "Blue Haze" + ], + [ + "BFC1C2", + "Silver Sand" + ], + [ + "BFC921", + "Key Lime Pie" + ], + [ + "BFDBE2", + "Ziggurat" + ], + [ + "BFFF00", + "Lime" + ], + [ + "C02B18", + "Thunderbird" + ], + [ + "C04737", + "Mojo" + ], + [ + "C08081", + "Old Rose" + ], + [ + "C0C0C0", + "Silver" + ], + [ + "C0D3B9", + "Pale Leaf" + ], + [ + "C0D8B6", + "Pixie Green" + ], + [ + "C1440E", + "Tia Maria" + ], + [ + "C154C1", + "Fuchsia Pink" + ], + [ + "C1A004", + "Buddha Gold" + ], + [ + "C1B7A4", + "Bison Hide" + ], + [ + "C1BAB0", + "Tea" + ], + [ + "C1BECD", + "Gray Suit" + ], + [ + "C1D7B0", + "Sprout" + ], + [ + "C1F07C", + "Sulu" + ], + [ + "C26B03", + "Indochine" + ], + [ + "C2955D", + "Twine" + ], + [ + "C2BDB6", + "Cotton Seed" + ], + [ + "C2CAC4", + "Pumice" + ], + [ + "C2E8E5", + "Jagged Ice" + ], + [ + "C32148", + "Maroon Flush" + ], + [ + "C3B091", + "Indian Khaki" + ], + [ + "C3BFC1", + "Pale Slate" + ], + [ + "C3C3BD", + "Gray Nickel" + ], + [ + "C3CDE6", + "Periwinkle Gray" + ], + [ + "C3D1D1", + "Tiara" + ], + [ + "C3DDF9", + "Tropical Blue" + ], + [ + "C41E3A", + "Cardinal" + ], + [ + "C45655", + "Fuzzy Wuzzy Brown" + ], + [ + "C45719", + "Orange Roughy" + ], + [ + "C4C4BC", + "Mist Gray" + ], + [ + "C4D0B0", + "Coriander" + ], + [ + "C4F4EB", + "Mint Tulip" + ], + [ + "C54B8C", + "Mulberry" + ], + [ + "C59922", + "Nugget" + ], + [ + "C5994B", + "Tussock" + ], + [ + "C5DBCA", + "Sea Mist" + ], + [ + "C5E17A", + "Yellow Green" + ], + [ + "C62D42", + "Brick Red" + ], + [ + "C6726B", + "Contessa" + ], + [ + "C69191", + "Oriental Pink" + ], + [ + "C6A84B", + "Roti" + ], + [ + "C6C3B5", + "Ash" + ], + [ + "C6C8BD", + "Kangaroo" + ], + [ + "C6E610", + "Las Palmas" + ], + [ + "C7031E", + "Monza" + ], + [ + "C71585", + "Red Violet" + ], + [ + "C7BCA2", + "Coral Reef" + ], + [ + "C7C1FF", + "Melrose" + ], + [ + "C7C4BF", + "Cloud" + ], + [ + "C7C9D5", + "Ghost" + ], + [ + "C7CD90", + "Pine Glade" + ], + [ + "C7DDE5", + "Botticelli" + ], + [ + "C88A65", + "Antique Brass" + ], + [ + "C8A2C8", + "Lilac" + ], + [ + "C8A528", + "Hokey Pokey" + ], + [ + "C8AABF", + "Lily" + ], + [ + "C8B568", + "Laser" + ], + [ + "C8E3D7", + "Edgewater" + ], + [ + "C96323", + "Piper" + ], + [ + "C99415", + "Pizza" + ], + [ + "C9A0DC", + "Light Wisteria" + ], + [ + "C9B29B", + "Rodeo Dust" + ], + [ + "C9B35B", + "Sundance" + ], + [ + "C9B93B", + "Earls Green" + ], + [ + "C9C0BB", + "Silver Rust" + ], + [ + "C9D9D2", + "Conch" + ], + [ + "C9FFA2", + "Reef" + ], + [ + "C9FFE5", + "Aero Blue" + ], + [ + "CA3435", + "Flush Mahogany" + ], + [ + "CABB48", + "Turmeric" + ], + [ + "CADCD4", + "Paris White" + ], + [ + "CAE00D", + "Bitter Lemon" + ], + [ + "CAE6DA", + "Skeptic" + ], + [ + "CB8FA9", + "Viola" + ], + [ + "CBCAB6", + "Foggy Gray" + ], + [ + "CBD3B0", + "Green Mist" + ], + [ + "CBDBD6", + "Nebula" + ], + [ + "CC3333", + "Persian Red" + ], + [ + "CC5500", + "Burnt Orange" + ], + [ + "CC7722", + "Ochre" + ], + [ + "CC8899", + "Puce" + ], + [ + "CCCAA8", + "Thistle Green" + ], + [ + "CCCCFF", + "Periwinkle" + ], + [ + "CCFF00", + "Electric Lime" + ], + [ + "CD5700", + "Tenn" + ], + [ + "CD5C5C", + "Chestnut Rose" + ], + [ + "CD8429", + "Brandy Punch" + ], + [ + "CDF4FF", + "Onahau" + ], + [ + "CEB98F", + "Sorrell Brown" + ], + [ + "CEBABA", + "Cold Turkey" + ], + [ + "CEC291", + "Yuma" + ], + [ + "CEC7A7", + "Chino" + ], + [ + "CFA39D", + "Eunry" + ], + [ + "CFB53B", + "Old Gold" + ], + [ + "CFDCCF", + "Tasman" + ], + [ + "CFE5D2", + "Surf Crest" + ], + [ + "CFF9F3", + "Humming Bird" + ], + [ + "CFFAF4", + "Scandal" + ], + [ + "D05F04", + "Red Stage" + ], + [ + "D06DA1", + "Hopbush" + ], + [ + "D07D12", + "Meteor" + ], + [ + "D0BEF8", + "Perfume" + ], + [ + "D0C0E5", + "Prelude" + ], + [ + "D0F0C0", + "Tea Green" + ], + [ + "D18F1B", + "Geebung" + ], + [ + "D1BEA8", + "Vanilla" + ], + [ + "D1C6B4", + "Soft Amber" + ], + [ + "D1D2CA", + "Celeste" + ], + [ + "D1D2DD", + "Mischka" + ], + [ + "D1E231", + "Pear" + ], + [ + "D2691E", + "Hot Cinnamon" + ], + [ + "D27D46", + "Raw Sienna" + ], + [ + "D29EAA", + "Careys Pink" + ], + [ + "D2B48C", + "Tan" + ], + [ + "D2DA97", + "Deco" + ], + [ + "D2F6DE", + "Blue Romance" + ], + [ + "D2F8B0", + "Gossip" + ], + [ + "D3CBBA", + "Sisal" + ], + [ + "D3CDC5", + "Swirl" + ], + [ + "D47494", + "Charm" + ], + [ + "D4B6AF", + "Clam Shell" + ], + [ + "D4BF8D", + "Straw" + ], + [ + "D4C4A8", + "Akaroa" + ], + [ + "D4CD16", + "Bird Flower" + ], + [ + "D4D7D9", + "Iron" + ], + [ + "D4DFE2", + "Geyser" + ], + [ + "D4E2FC", + "Hawkes Blue" + ], + [ + "D54600", + "Grenadier" + ], + [ + "D591A4", + "Can Can" + ], + [ + "D59A6F", + "Whiskey" + ], + [ + "D5D195", + "Winter Hazel" + ], + [ + "D5F6E3", + "Granny Apple" + ], + [ + "D69188", + "My Pink" + ], + [ + "D6C562", + "Tacha" + ], + [ + "D6CEF6", + "Moon Raker" + ], + [ + "D6D6D1", + "Quill Gray" + ], + [ + "D6FFDB", + "Snowy Mint" + ], + [ + "D7837F", + "New York Pink" + ], + [ + "D7C498", + "Pavlova" + ], + [ + "D7D0FF", + "Fog" + ], + [ + "D84437", + "Valencia" + ], + [ + "D87C63", + "Japonica" + ], + [ + "D8BFD8", + "Thistle" + ], + [ + "D8C2D5", + "Maverick" + ], + [ + "D8FCFA", + "Foam" + ], + [ + "D94972", + "Cabaret" + ], + [ + "D99376", + "Burning Sand" + ], + [ + "D9B99B", + "Cameo" + ], + [ + "D9D6CF", + "Timberwolf" + ], + [ + "D9DCC1", + "Tana" + ], + [ + "D9E4F5", + "Link Water" + ], + [ + "D9F7FF", + "Mabel" + ], + [ + "DA3287", + "Cerise" + ], + [ + "DA5B38", + "Flame Pea" + ], + [ + "DA6304", + "Bamboo" + ], + [ + "DA6A41", + "Red Damask" + ], + [ + "DA70D6", + "Orchid" + ], + [ + "DA8A67", + "Copperfield" + ], + [ + "DAA520", + "Golden Grass" + ], + [ + "DAECD6", + "Zanah" + ], + [ + "DAF4F0", + "Iceberg" + ], + [ + "DAFAFF", + "Oyster Bay" + ], + [ + "DB5079", + "Cranberry" + ], + [ + "DB9690", + "Petite Orchid" + ], + [ + "DB995E", + "Di Serria" + ], + [ + "DBDBDB", + "Alto" + ], + [ + "DBFFF8", + "Frosted Mint" + ], + [ + "DC143C", + "Crimson" + ], + [ + "DC4333", + "Punch" + ], + [ + "DCB20C", + "Galliano" + ], + [ + "DCB4BC", + "Blossom" + ], + [ + "DCD747", + "Wattle" + ], + [ + "DCD9D2", + "Westar" + ], + [ + "DCDDCC", + "Moon Mist" + ], + [ + "DCEDB4", + "Caper" + ], + [ + "DCF0EA", + "Swans Down" + ], + [ + "DDD6D5", + "Swiss Coffee" + ], + [ + "DDF9F1", + "White Ice" + ], + [ + "DE3163", + "Cerise Red" + ], + [ + "DE6360", + "Roman" + ], + [ + "DEA681", + "Tumbleweed" + ], + [ + "DEBA13", + "Gold Tips" + ], + [ + "DEC196", + "Brandy" + ], + [ + "DECBC6", + "Wafer" + ], + [ + "DED4A4", + "Sapling" + ], + [ + "DED717", + "Barberry" + ], + [ + "DEE5C0", + "Beryl Green" + ], + [ + "DEF5FF", + "Pattens Blue" + ], + [ + "DF73FF", + "Heliotrope" + ], + [ + "DFBE6F", + "Apache" + ], + [ + "DFCD6F", + "Chenin" + ], + [ + "DFCFDB", + "Lola" + ], + [ + "DFECDA", + "Willow Brook" + ], + [ + "DFFF00", + "Chartreuse Yellow" + ], + [ + "E0B0FF", + "Mauve" + ], + [ + "E0B646", + "Anzac" + ], + [ + "E0B974", + "Harvest Gold" + ], + [ + "E0C095", + "Calico" + ], + [ + "E0FFFF", + "Baby Blue" + ], + [ + "E16865", + "Sunglo" + ], + [ + "E1BC64", + "Equator" + ], + [ + "E1C0C8", + "Pink Flare" + ], + [ + "E1E6D6", + "Periglacial Blue" + ], + [ + "E1EAD4", + "Kidnapper" + ], + [ + "E1F6E8", + "Tara" + ], + [ + "E25465", + "Mandy" + ], + [ + "E2725B", + "Terracotta" + ], + [ + "E28913", + "Golden Bell" + ], + [ + "E292C0", + "Shocking" + ], + [ + "E29418", + "Dixie" + ], + [ + "E29CD2", + "Light Orchid" + ], + [ + "E2D8ED", + "Snuff" + ], + [ + "E2EBED", + "Mystic" + ], + [ + "E2F3EC", + "Apple Green" + ], + [ + "E30B5C", + "Razzmatazz" + ], + [ + "E32636", + "Alizarin Crimson" + ], + [ + "E34234", + "Cinnabar" + ], + [ + "E3BEBE", + "Cavern Pink" + ], + [ + "E3F5E1", + "Peppermint" + ], + [ + "E3F988", + "Mindaro" + ], + [ + "E47698", + "Deep Blush" + ], + [ + "E49B0F", + "Gamboge" + ], + [ + "E4C2D5", + "Melanie" + ], + [ + "E4CFDE", + "Twilight" + ], + [ + "E4D1C0", + "Bone" + ], + [ + "E4D422", + "Sunflower" + ], + [ + "E4D5B7", + "Grain Brown" + ], + [ + "E4D69B", + "Zombie" + ], + [ + "E4F6E7", + "Frostee" + ], + [ + "E4FFD1", + "Snow Flurry" + ], + [ + "E52B50", + "Amaranth" + ], + [ + "E5841B", + "Zest" + ], + [ + "E5CCC9", + "Dust Storm" + ], + [ + "E5D7BD", + "Stark White" + ], + [ + "E5D8AF", + "Hampton" + ], + [ + "E5E0E1", + "Bon Jour" + ], + [ + "E5E5E5", + "Mercury" + ], + [ + "E5F9F6", + "Polar" + ], + [ + "E64E03", + "Trinidad" + ], + [ + "E6BE8A", + "Gold Sand" + ], + [ + "E6BEA5", + "Cashmere" + ], + [ + "E6D7B9", + "Double Spanish White" + ], + [ + "E6E4D4", + "Satin Linen" + ], + [ + "E6F2EA", + "Harp" + ], + [ + "E6F8F3", + "Off Green" + ], + [ + "E6FFE9", + "Hint of Green" + ], + [ + "E6FFFF", + "Tranquil" + ], + [ + "E77200", + "Mango Tango" + ], + [ + "E7730A", + "Christine" + ], + [ + "E79F8C", + "Tonys Pink" + ], + [ + "E79FC4", + "Kobi" + ], + [ + "E7BCB4", + "Rose Fog" + ], + [ + "E7BF05", + "Corn" + ], + [ + "E7CD8C", + "Putty" + ], + [ + "E7ECE6", + "Gray Nurse" + ], + [ + "E7F8FF", + "Lily White" + ], + [ + "E7FEFF", + "Bubbles" + ], + [ + "E89928", + "Fire Bush" + ], + [ + "E8B9B3", + "Shilo" + ], + [ + "E8E0D5", + "Pearl Bush" + ], + [ + "E8EBE0", + "Green White" + ], + [ + "E8F1D4", + "Chrome White" + ], + [ + "E8F2EB", + "Gin" + ], + [ + "E8F5F2", + "Aqua Squeeze" + ], + [ + "E96E00", + "Clementine" + ], + [ + "E97451", + "Burnt Sienna" + ], + [ + "E97C07", + "Tahiti Gold" + ], + [ + "E9CECD", + "Oyster Pink" + ], + [ + "E9D75A", + "Confetti" + ], + [ + "E9E3E3", + "Ebb" + ], + [ + "E9F8ED", + "Ottoman" + ], + [ + "E9FFFD", + "Clear Day" + ], + [ + "EA88A8", + "Carissma" + ], + [ + "EAAE69", + "Porsche" + ], + [ + "EAB33B", + "Tulip Tree" + ], + [ + "EAC674", + "Rob Roy" + ], + [ + "EADAB8", + "Raffia" + ], + [ + "EAE8D4", + "White Rock" + ], + [ + "EAF6EE", + "Panache" + ], + [ + "EAF6FF", + "Solitude" + ], + [ + "EAF9F5", + "Aqua Spring" + ], + [ + "EAFFFE", + "Dew" + ], + [ + "EB9373", + "Apricot" + ], + [ + "EBC2AF", + "Zinnwaldite" + ], + [ + "ECA927", + "Fuel Yellow" + ], + [ + "ECC54E", + "Ronchi" + ], + [ + "ECC7EE", + "French Lilac" + ], + [ + "ECCDB9", + "Just Right" + ], + [ + "ECE090", + "Wild Rice" + ], + [ + "ECEBBD", + "Fall Green" + ], + [ + "ECEBCE", + "Aths Special" + ], + [ + "ECF245", + "Starship" + ], + [ + "ED0A3F", + "Red Ribbon" + ], + [ + "ED7A1C", + "Tango" + ], + [ + "ED9121", + "Carrot Orange" + ], + [ + "ED989E", + "Sea Pink" + ], + [ + "EDB381", + "Tacao" + ], + [ + "EDC9AF", + "Desert Sand" + ], + [ + "EDCDAB", + "Pancho" + ], + [ + "EDDCB1", + "Chamois" + ], + [ + "EDEA99", + "Primrose" + ], + [ + "EDF5DD", + "Frost" + ], + [ + "EDF5F5", + "Aqua Haze" + ], + [ + "EDF6FF", + "Zumthor" + ], + [ + "EDF9F1", + "Narvik" + ], + [ + "EDFC84", + "Honeysuckle" + ], + [ + "EE82EE", + "Lavender Magenta" + ], + [ + "EEC1BE", + "Beauty Bush" + ], + [ + "EED794", + "Chalky" + ], + [ + "EED9C4", + "Almond" + ], + [ + "EEDC82", + "Flax" + ], + [ + "EEDEDA", + "Bizarre" + ], + [ + "EEE3AD", + "Double Colonial White" + ], + [ + "EEEEE8", + "Cararra" + ], + [ + "EEEF78", + "Manz" + ], + [ + "EEF0C8", + "Tahuna Sands" + ], + [ + "EEF0F3", + "Athens Gray" + ], + [ + "EEF3C3", + "Tusk" + ], + [ + "EEF4DE", + "Loafer" + ], + [ + "EEF6F7", + "Catskill White" + ], + [ + "EEFDFF", + "Twilight Blue" + ], + [ + "EEFF9A", + "Jonquil" + ], + [ + "EEFFE2", + "Rice Flower" + ], + [ + "EF863F", + "Jaffa" + ], + [ + "EFEFEF", + "Gallery" + ], + [ + "EFF2F3", + "Porcelain" + ], + [ + "F091A9", + "Mauvelous" + ], + [ + "F0D52D", + "Golden Dream" + ], + [ + "F0DB7D", + "Golden Sand" + ], + [ + "F0DC82", + "Buff" + ], + [ + "F0E2EC", + "Prim" + ], + [ + "F0E68C", + "Khaki" + ], + [ + "F0EEFD", + "Selago" + ], + [ + "F0EEFF", + "Titan White" + ], + [ + "F0F8FF", + "Alice Blue" + ], + [ + "F0FCEA", + "Feta" + ], + [ + "F18200", + "Gold Drop" + ], + [ + "F19BAB", + "Wewak" + ], + [ + "F1E788", + "Sahara Sand" + ], + [ + "F1E9D2", + "Parchment" + ], + [ + "F1E9FF", + "Blue Chalk" + ], + [ + "F1EEC1", + "Mint Julep" + ], + [ + "F1F1F1", + "Seashell" + ], + [ + "F1F7F2", + "Saltpan" + ], + [ + "F1FFAD", + "Tidal" + ], + [ + "F1FFC8", + "Chiffon" + ], + [ + "F2552A", + "Flamingo" + ], + [ + "F28500", + "Tangerine" + ], + [ + "F2C3B2", + "Mandys Pink" + ], + [ + "F2F2F2", + "Concrete" + ], + [ + "F2FAFA", + "Black Squeeze" + ], + [ + "F34723", + "Pomegranate" + ], + [ + "F3AD16", + "Buttercup" + ], + [ + "F3D69D", + "New Orleans" + ], + [ + "F3D9DF", + "Vanilla Ice" + ], + [ + "F3E7BB", + "Sidecar" + ], + [ + "F3E9E5", + "Dawn Pink" + ], + [ + "F3EDCF", + "Wheatfield" + ], + [ + "F3FB62", + "Canary" + ], + [ + "F3FBD4", + "Orinoco" + ], + [ + "F3FFD8", + "Carla" + ], + [ + "F400A1", + "Hollywood Cerise" + ], + [ + "F4A460", + "Sandy brown" + ], + [ + "F4C430", + "Saffron" + ], + [ + "F4D81C", + "Ripe Lemon" + ], + [ + "F4EBD3", + "Janna" + ], + [ + "F4F2EE", + "Pampas" + ], + [ + "F4F4F4", + "Wild Sand" + ], + [ + "F4F8FF", + "Zircon" + ], + [ + "F57584", + "Froly" + ], + [ + "F5C85C", + "Cream Can" + ], + [ + "F5C999", + "Manhattan" + ], + [ + "F5D5A0", + "Maize" + ], + [ + "F5DEB3", + "Wheat" + ], + [ + "F5E7A2", + "Sandwisp" + ], + [ + "F5E7E2", + "Pot Pourri" + ], + [ + "F5E9D3", + "Albescent White" + ], + [ + "F5EDEF", + "Soft Peach" + ], + [ + "F5F3E5", + "Ecru White" + ], + [ + "F5F5DC", + "Beige" + ], + [ + "F5FB3D", + "Golden Fizz" + ], + [ + "F5FFBE", + "Australian Mint" + ], + [ + "F64A8A", + "French Rose" + ], + [ + "F653A6", + "Brilliant Rose" + ], + [ + "F6A4C9", + "Illusion" + ], + [ + "F6F0E6", + "Merino" + ], + [ + "F6F7F7", + "Black Haze" + ], + [ + "F6FFDC", + "Spring Sun" + ], + [ + "F7468A", + "Violet Red" + ], + [ + "F77703", + "Chilean Fire" + ], + [ + "F77FBE", + "Persian Pink" + ], + [ + "F7B668", + "Rajah" + ], + [ + "F7C8DA", + "Azalea" + ], + [ + "F7DBE6", + "We Peep" + ], + [ + "F7F2E1", + "Quarter Spanish White" + ], + [ + "F7F5FA", + "Whisper" + ], + [ + "F7FAF7", + "Snow Drift" + ], + [ + "F8B853", + "Casablanca" + ], + [ + "F8C3DF", + "Chantilly" + ], + [ + "F8D9E9", + "Cherub" + ], + [ + "F8DB9D", + "Marzipan" + ], + [ + "F8DD5C", + "Energy Yellow" + ], + [ + "F8E4BF", + "Givry" + ], + [ + "F8F0E8", + "White Linen" + ], + [ + "F8F4FF", + "Magnolia" + ], + [ + "F8F6F1", + "Spring Wood" + ], + [ + "F8F7DC", + "Coconut Cream" + ], + [ + "F8F7FC", + "White Lilac" + ], + [ + "F8F8F7", + "Desert Storm" + ], + [ + "F8F99C", + "Texas" + ], + [ + "F8FACD", + "Corn Field" + ], + [ + "F8FDD3", + "Mimosa" + ], + [ + "F95A61", + "Carnation" + ], + [ + "F9BF58", + "Saffron Mango" + ], + [ + "F9E0ED", + "Carousel Pink" + ], + [ + "F9E4BC", + "Dairy Cream" + ], + [ + "F9E663", + "Portica" + ], + [ + "F9EAF3", + "Amour" + ], + [ + "F9F8E4", + "Rum Swizzle" + ], + [ + "F9FF8B", + "Dolly" + ], + [ + "F9FFF6", + "Sugar Cane" + ], + [ + "FA7814", + "Ecstasy" + ], + [ + "FA9D5A", + "Tan Hide" + ], + [ + "FAD3A2", + "Corvette" + ], + [ + "FADFAD", + "Peach Yellow" + ], + [ + "FAE600", + "Turbo" + ], + [ + "FAEAB9", + "Astra" + ], + [ + "FAECCC", + "Champagne" + ], + [ + "FAF0E6", + "Linen" + ], + [ + "FAF3F0", + "Fantasy" + ], + [ + "FAF7D6", + "Citrine White" + ], + [ + "FAFAFA", + "Alabaster" + ], + [ + "FAFDE4", + "Hint of Yellow" + ], + [ + "FAFFA4", + "Milan" + ], + [ + "FB607F", + "Brink Pink" + ], + [ + "FB8989", + "Geraldine" + ], + [ + "FBA0E3", + "Lavender Rose" + ], + [ + "FBA129", + "Sea Buckthorn" + ], + [ + "FBAC13", + "Sun" + ], + [ + "FBAED2", + "Lavender Pink" + ], + [ + "FBB2A3", + "Rose Bud" + ], + [ + "FBBEDA", + "Cupid" + ], + [ + "FBCCE7", + "Classic Rose" + ], + [ + "FBCEB1", + "Apricot Peach" + ], + [ + "FBE7B2", + "Banana Mania" + ], + [ + "FBE870", + "Marigold Yellow" + ], + [ + "FBE96C", + "Festival" + ], + [ + "FBEA8C", + "Sweet Corn" + ], + [ + "FBEC5D", + "Candy Corn" + ], + [ + "FBF9F9", + "Hint of Red" + ], + [ + "FBFFBA", + "Shalimar" + ], + [ + "FC0FC0", + "Shocking Pink" + ], + [ + "FC80A5", + "Tickle Me Pink" + ], + [ + "FC9C1D", + "Tree Poppy" + ], + [ + "FCC01E", + "Lightning Yellow" + ], + [ + "FCD667", + "Goldenrod" + ], + [ + "FCD917", + "Candlelight" + ], + [ + "FCDA98", + "Cherokee" + ], + [ + "FCF4D0", + "Double Pearl Lusta" + ], + [ + "FCF4DC", + "Pearl Lusta" + ], + [ + "FCF8F7", + "Vista White" + ], + [ + "FCFBF3", + "Bianca" + ], + [ + "FCFEDA", + "Moon Glow" + ], + [ + "FCFFE7", + "China Ivory" + ], + [ + "FCFFF9", + "Ceramic" + ], + [ + "FD0E35", + "Torch Red" + ], + [ + "FD5B78", + "Wild Watermelon" + ], + [ + "FD7B33", + "Crusta" + ], + [ + "FD7C07", + "Sorbus" + ], + [ + "FD9FA2", + "Sweet Pink" + ], + [ + "FDD5B1", + "Light Apricot" + ], + [ + "FDD7E4", + "Pig Pink" + ], + [ + "FDE1DC", + "Cinderella" + ], + [ + "FDE295", + "Golden Glow" + ], + [ + "FDE910", + "Lemon" + ], + [ + "FDF5E6", + "Old Lace" + ], + [ + "FDF6D3", + "Half Colonial White" + ], + [ + "FDF7AD", + "Drover" + ], + [ + "FDFEB8", + "Pale Prim" + ], + [ + "FDFFD5", + "Cumulus" + ], + [ + "FE28A2", + "Persian Rose" + ], + [ + "FE4C40", + "Sunset Orange" + ], + [ + "FE6F5E", + "Bittersweet" + ], + [ + "FE9D04", + "California" + ], + [ + "FEA904", + "Yellow Sea" + ], + [ + "FEBAAD", + "Melon" + ], + [ + "FED33C", + "Bright Sun" + ], + [ + "FED85D", + "Dandelion" + ], + [ + "FEDB8D", + "Salomie" + ], + [ + "FEE5AC", + "Cape Honey" + ], + [ + "FEEBF3", + "Remy" + ], + [ + "FEEFCE", + "Oasis" + ], + [ + "FEF0EC", + "Bridesmaid" + ], + [ + "FEF2C7", + "Beeswax" + ], + [ + "FEF3D8", + "Bleach White" + ], + [ + "FEF4CC", + "Pipi" + ], + [ + "FEF4DB", + "Half Spanish White" + ], + [ + "FEF4F8", + "Wisp Pink" + ], + [ + "FEF5F1", + "Provincial Pink" + ], + [ + "FEF7DE", + "Half Dutch White" + ], + [ + "FEF8E2", + "Solitaire" + ], + [ + "FEF8FF", + "White Pointer" + ], + [ + "FEF9E3", + "Off Yellow" + ], + [ + "FEFCED", + "Orange White" + ], + [ + "FF0000", + "Red" + ], + [ + "FF007F", + "Rose" + ], + [ + "FF00CC", + "Purple Pizzazz" + ], + [ + "FF00FF", + "Magenta / Fuchsia" + ], + [ + "FF2400", + "Scarlet" + ], + [ + "FF3399", + "Wild Strawberry" + ], + [ + "FF33CC", + "Razzle Dazzle Rose" + ], + [ + "FF355E", + "Radical Red" + ], + [ + "FF3F34", + "Red Orange" + ], + [ + "FF4040", + "Coral Red" + ], + [ + "FF4D00", + "Vermilion" + ], + [ + "FF4F00", + "International Orange" + ], + [ + "FF6037", + "Outrageous Orange" + ], + [ + "FF6600", + "Blaze Orange" + ], + [ + "FF66FF", + "Pink Flamingo" + ], + [ + "FF681F", + "Orange" + ], + [ + "FF69B4", + "Hot Pink" + ], + [ + "FF6B53", + "Persimmon" + ], + [ + "FF6FFF", + "Blush Pink" + ], + [ + "FF7034", + "Burning Orange" + ], + [ + "FF7518", + "Pumpkin" + ], + [ + "FF7D07", + "Flamenco" + ], + [ + "FF7F00", + "Flush Orange" + ], + [ + "FF7F50", + "Coral" + ], + [ + "FF8C69", + "Salmon" + ], + [ + "FF9000", + "Pizazz" + ], + [ + "FF910F", + "West Side" + ], + [ + "FF91A4", + "Pink Salmon" + ], + [ + "FF9933", + "Neon Carrot" + ], + [ + "FF9966", + "Atomic Tangerine" + ], + [ + "FF9980", + "Vivid Tangerine" + ], + [ + "FF9E2C", + "Sunshade" + ], + [ + "FFA000", + "Orange Peel" + ], + [ + "FFA194", + "Mona Lisa" + ], + [ + "FFA500", + "Web Orange" + ], + [ + "FFA6C9", + "Carnation Pink" + ], + [ + "FFAB81", + "Hit Pink" + ], + [ + "FFAE42", + "Yellow Orange" + ], + [ + "FFB0AC", + "Cornflower Lilac" + ], + [ + "FFB1B3", + "Sundown" + ], + [ + "FFB31F", + "My Sin" + ], + [ + "FFB555", + "Texas Rose" + ], + [ + "FFB7D5", + "Cotton Candy" + ], + [ + "FFB97B", + "Macaroni and Cheese" + ], + [ + "FFBA00", + "Selective Yellow" + ], + [ + "FFBD5F", + "Koromiko" + ], + [ + "FFBF00", + "Amber" + ], + [ + "FFC0A8", + "Wax Flower" + ], + [ + "FFC0CB", + "Pink" + ], + [ + "FFC3C0", + "Your Pink" + ], + [ + "FFC901", + "Supernova" + ], + [ + "FFCBA4", + "Flesh" + ], + [ + "FFCC33", + "Sunglow" + ], + [ + "FFCC5C", + "Golden Tainoi" + ], + [ + "FFCC99", + "Peach Orange" + ], + [ + "FFCD8C", + "Chardonnay" + ], + [ + "FFD1DC", + "Pastel Pink" + ], + [ + "FFD2B7", + "Romantic" + ], + [ + "FFD38C", + "Grandis" + ], + [ + "FFD700", + "Gold" + ], + [ + "FFD800", + "School bus Yellow" + ], + [ + "FFD8D9", + "Cosmos" + ], + [ + "FFDB58", + "Mustard" + ], + [ + "FFDCD6", + "Peach Schnapps" + ], + [ + "FFDDAF", + "Caramel" + ], + [ + "FFDDCD", + "Tuft Bush" + ], + [ + "FFDDCF", + "Watusi" + ], + [ + "FFDDF4", + "Pink Lace" + ], + [ + "FFDEAD", + "Navajo White" + ], + [ + "FFDEB3", + "Frangipani" + ], + [ + "FFE1DF", + "Pippin" + ], + [ + "FFE1F2", + "Pale Rose" + ], + [ + "FFE2C5", + "Negroni" + ], + [ + "FFE5A0", + "Cream Brulee" + ], + [ + "FFE5B4", + "Peach" + ], + [ + "FFE6C7", + "Tequila" + ], + [ + "FFE772", + "Kournikova" + ], + [ + "FFEAC8", + "Sandy Beach" + ], + [ + "FFEAD4", + "Karry" + ], + [ + "FFEC13", + "Broom" + ], + [ + "FFEDBC", + "Colonial White" + ], + [ + "FFEED8", + "Derby" + ], + [ + "FFEFA1", + "Vis Vis" + ], + [ + "FFEFC1", + "Egg White" + ], + [ + "FFEFD5", + "Papaya Whip" + ], + [ + "FFEFEC", + "Fair Pink" + ], + [ + "FFF0DB", + "Peach Cream" + ], + [ + "FFF0F5", + "Lavender blush" + ], + [ + "FFF14F", + "Gorse" + ], + [ + "FFF1B5", + "Buttermilk" + ], + [ + "FFF1D8", + "Pink Lady" + ], + [ + "FFF1EE", + "Forget Me Not" + ], + [ + "FFF1F9", + "Tutu" + ], + [ + "FFF39D", + "Picasso" + ], + [ + "FFF3F1", + "Chardon" + ], + [ + "FFF46E", + "Paris Daisy" + ], + [ + "FFF4CE", + "Barley White" + ], + [ + "FFF4DD", + "Egg Sour" + ], + [ + "FFF4E0", + "Sazerac" + ], + [ + "FFF4E8", + "Serenade" + ], + [ + "FFF4F3", + "Chablis" + ], + [ + "FFF5EE", + "Seashell Peach" + ], + [ + "FFF5F3", + "Sauvignon" + ], + [ + "FFF6D4", + "Milk Punch" + ], + [ + "FFF6DF", + "Varden" + ], + [ + "FFF6F5", + "Rose White" + ], + [ + "FFF8D1", + "Baja White" + ], + [ + "FFF9E2", + "Gin Fizz" + ], + [ + "FFF9E6", + "Early Dawn" + ], + [ + "FFFACD", + "Lemon Chiffon" + ], + [ + "FFFAF4", + "Bridal Heath" + ], + [ + "FFFBDC", + "Scotch Mist" + ], + [ + "FFFBF9", + "Soapstone" + ], + [ + "FFFC99", + "Witch Haze" + ], + [ + "FFFCEA", + "Buttery White" + ], + [ + "FFFCEE", + "Island Spice" + ], + [ + "FFFDD0", + "Cream" + ], + [ + "FFFDE6", + "Chilean Heath" + ], + [ + "FFFDE8", + "Travertine" + ], + [ + "FFFDF3", + "Orchid White" + ], + [ + "FFFDF4", + "Quarter Pearl Lusta" + ], + [ + "FFFEE1", + "Half and Half" + ], + [ + "FFFEEC", + "Apricot White" + ], + [ + "FFFEF0", + "Rice Cake" + ], + [ + "FFFEF6", + "Black White" + ], + [ + "FFFEFD", + "Romance" + ], + [ + "FFFF00", + "Yellow" + ], + [ + "FFFF66", + "Laser Lemon" + ], + [ + "FFFF99", + "Pale Canary" + ], + [ + "FFFFB4", + "Portafino" + ], + [ + "FFFFF0", + "Ivory" + ], + [ + "FFFFFF", + "White" + ] +] \ No newline at end of file From fe7b52d7c724d5e6270369b492564eeaa7e24325 Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Sun, 13 Apr 2025 19:45:50 +0200 Subject: [PATCH 08/14] Don't add background to wrapper if no background selected --- source/php/Module/ColoredCards/views/base.blade.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/php/Module/ColoredCards/views/base.blade.php b/source/php/Module/ColoredCards/views/base.blade.php index eafc1ac00..b1d601ad7 100644 --- a/source/php/Module/ColoredCards/views/base.blade.php +++ b/source/php/Module/ColoredCards/views/base.blade.php @@ -6,7 +6,9 @@
@else @include('cards') @endif - + @endif + @if ($cardStyles) + @foreach ($cardStyles as $cardId => $values) + .{{ $cardClass }}-{{ $cardId }}, + .{{ $cardClass }}-{{ $cardId }}:hover { + background: {{ $values['background'] }} !important; + color: {{ $values['color'] }} !important; + } + @endforeach + @endif + +@endif From 4184dc749a29733595b5d680ba4fbd9309492d66 Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Tue, 15 Apr 2025 20:33:14 +0200 Subject: [PATCH 13/14] Fallback title and translation --- languages/modularity-sv_SE.mo | Bin 819777 -> 819819 bytes languages/modularity-sv_SE.po | 8 ++++++-- .../php/Module/ColoredCards/ColoredCards.php | 13 ++++++++++++- .../views/partials/card.blade.php | 6 +++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/languages/modularity-sv_SE.mo b/languages/modularity-sv_SE.mo index b85b9cfe3ce1bf206f920d39212a1a97e683c90f..870365354ceb78c1da7c6459786c2f40f6595ed0 100644 GIT binary patch delta 48170 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%0A7X=w` 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 $card['heading'], 'content' => !empty($card['content']) ? $card['content'] : false, 'image' => is_int($card['image']) ? $this->getImageContract($card['image']) : false, - 'link' => $card['link'], + 'link' => $this->prepareLink($card['link']), 'columnClass' => $this->getColumnClass(), 'background' => $this->getBackgroundColor($card['background_color'], $card) ]; @@ -170,6 +170,17 @@ private function prepareCards(array $cardData) return $preparedData; } + private function prepareLink(array $link) { + $link['ariaTitle'] = false; + + if (!isset($link['title']) || empty($link['title'])) { + $link['title'] = __('Read more', 'modularity'); + $link['ariaTitle'] = __('Read more about', 'modularity');; + } + + return $link; + } + private function getColumnClass() { $fields = $this->getFields(); diff --git a/source/php/Module/ColoredCards/views/partials/card.blade.php b/source/php/Module/ColoredCards/views/partials/card.blade.php index 699bd86ce..cfcb88be5 100644 --- a/source/php/Module/ColoredCards/views/partials/card.blade.php +++ b/source/php/Module/ColoredCards/views/partials/card.blade.php @@ -30,7 +30,11 @@ 'classList' => ['u-display--flex', 'u-align-items--center', 'u-gap-1'], 'variant' => 'bold' ]) - {{ $card['link']['title'] }} + @if ($card['link']['ariaTitle']) + {{ $card['link']['title'] }} + @else + {{ $card['link']['title'] }} + @endif @icon([ 'icon' => 'trending_flat', 'size' => 'lg' From 4e3434ca95ed4388767d6cb256f24e1e5d2f4ae0 Mon Sep 17 00:00:00 2001 From: Michael Claesson Date: Tue, 22 Apr 2025 13:24:22 +0200 Subject: [PATCH 14/14] Don't add base values in field groups --- source/php/AcfFields/json/mod-colored-cards.json | 10 ++-------- source/php/AcfFields/php/mod-colored-cards.php | 4 ---- source/php/Module/ColoredCards/ColoredCards.php | 8 ++++---- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/source/php/AcfFields/json/mod-colored-cards.json b/source/php/AcfFields/json/mod-colored-cards.json index e6b86a360..d459a6539 100644 --- a/source/php/AcfFields/json/mod-colored-cards.json +++ b/source/php/AcfFields/json/mod-colored-cards.json @@ -66,10 +66,7 @@ "class": "", "id": "" }, - "choices": { - "none": "None", - "custom-color": "Custom color" - }, + "choices": [], "default_value": "none", "return_format": "value", "multiple": 0, @@ -230,10 +227,7 @@ "class": "", "id": "" }, - "choices": { - "none": "None", - "custom-color": "Custom color" - }, + "choices": [], "default_value": "none", "return_format": "value", "multiple": 0, diff --git a/source/php/AcfFields/php/mod-colored-cards.php b/source/php/AcfFields/php/mod-colored-cards.php index 3ef464cbc..0de9f905a 100644 --- a/source/php/AcfFields/php/mod-colored-cards.php +++ b/source/php/AcfFields/php/mod-colored-cards.php @@ -70,8 +70,6 @@ 'id' => '', ), 'choices' => array( - 'none' => __('None', 'modularity'), - 'custom-color' => __('Custom color', 'modularity'), ), 'default_value' => __('none', 'modularity'), 'return_format' => 'value', @@ -234,8 +232,6 @@ 'id' => '', ), 'choices' => array( - 'none' => __('None', 'modularity'), - 'custom-color' => __('Custom color', 'modularity'), ), 'default_value' => __('none', 'modularity'), 'return_format' => 'value', diff --git a/source/php/Module/ColoredCards/ColoredCards.php b/source/php/Module/ColoredCards/ColoredCards.php index faa5521ac..42e33f7f5 100644 --- a/source/php/Module/ColoredCards/ColoredCards.php +++ b/source/php/Module/ColoredCards/ColoredCards.php @@ -61,6 +61,10 @@ public function data(): array public function colorChoices($field) { + if (is_admin() && ($screen = get_current_screen()) && $screen->id === 'acf-field-group') { + return $field; + } + $colors = ColorHelper::getColorsFromMunicipioPalettes(); $field['choices'] = [ @@ -71,10 +75,6 @@ public function colorChoices($field) $field['choices']['custom-color'] = __('Custom color', 'modularity'); } - if (is_admin() && ($screen = get_current_screen()) && $screen->id === 'acf-field-group') { - return $field; - } - foreach ($colors as $var => $hex) { $field['choices'][$var] = '