├── .circleci └── config.yml ├── .ddev ├── addon-metadata │ ├── elasticsearch │ │ └── manifest.yaml │ └── redis │ │ └── manifest.yaml ├── commands │ ├── redis │ │ ├── redis │ │ └── redis-flush │ └── web │ │ └── generate-oauth-keys.sh ├── config.yaml ├── docker-compose.elasticsearch8.yaml ├── docker-compose.elasticsearch_extras.yaml ├── docker-compose.elasticvue.yaml ├── docker-compose.redis.yaml ├── elasticsearch │ ├── config │ │ └── elasticsearch8.yml │ ├── docker-compose.elasticsearch8.yaml │ └── elasticsearch-setup.sh ├── redis │ ├── advanced.conf │ ├── append.conf │ ├── general.conf │ ├── io.conf │ ├── memory.conf │ ├── network.conf │ ├── redis.conf │ ├── security.conf │ └── snapshots.conf └── traefik │ └── config │ └── frontend.yaml ├── .dockerignore ├── .git-blame-ignore-revs ├── .gitattributes ├── .github ├── dependabot.yml └── pull_request_template.md ├── .gitignore ├── .lando.yml ├── .lando ├── .env ├── generate_oauth_keys.sh ├── my.cnf ├── php.ini ├── phpunit.sh └── xdebug.sh ├── CHANGELOG.md ├── README.md ├── drupal ├── .env.example ├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .prettierrc.json ├── .stylelintrc.json ├── .vscode │ ├── extensions.json │ ├── launch.json │ └── settings.json ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── config │ └── sync │ │ └── .htaccess ├── drush │ ├── Commands │ │ ├── PolicyCommands.php │ │ └── SiltaAliasAlterCommands.php │ ├── README.md │ ├── drush.yml │ └── sites │ │ └── self.site.yml ├── grumphp.yml ├── load.environment.php ├── oauth │ └── .gitignore ├── package-lock.json ├── package.json ├── patches │ └── graphl_compose_entity_url_in_preview_returns_error.patch ├── phpcs.xml ├── phpstan.neon ├── phpunit.xml ├── recipes │ ├── README.md │ ├── wunder_base │ │ ├── README.md │ │ ├── config │ │ │ ├── admin_toolbar.settings.yml │ │ │ ├── block.block.claro_breadcrumbs.yml │ │ │ ├── block.block.claro_content.yml │ │ │ ├── block.block.claro_help.yml │ │ │ ├── block.block.claro_local_actions.yml │ │ │ ├── block.block.claro_messages.yml │ │ │ ├── block.block.claro_page_title.yml │ │ │ ├── block.block.claro_primary_local_tasks.yml │ │ │ ├── block.block.claro_secondary_local_tasks.yml │ │ │ ├── core.entity_form_display.node.article.default.yml │ │ │ ├── core.entity_view_display.node.article.default.yml │ │ │ ├── core.entity_view_mode.taxonomy_term.full.yml │ │ │ ├── core.entity_view_mode.taxonomy_term.token.yml │ │ │ ├── editor.editor.basic_html.yml │ │ │ ├── editor.editor.full_html.yml │ │ │ ├── field.field.node.article.body.yml │ │ │ ├── field.field.node.article.field_excerpt.yml │ │ │ ├── field.field.node.article.field_image.yml │ │ │ ├── field.field.node.article.field_tags.yml │ │ │ ├── field.storage.node.field_excerpt.yml │ │ │ ├── field.storage.node.field_image.yml │ │ │ ├── field.storage.node.field_tags.yml │ │ │ ├── filter.format.basic_html.yml │ │ │ ├── filter.format.full_html.yml │ │ │ ├── filter.format.restricted_html.yml │ │ │ ├── image.settings.yml │ │ │ ├── image.style.large.yml │ │ │ ├── image.style.medium.yml │ │ │ ├── image.style.thumbnail.yml │ │ │ ├── image.style.wide.yml │ │ │ ├── menu_link_attributes.config.yml │ │ │ ├── metatag.metatag_defaults.403.yml │ │ │ ├── metatag.metatag_defaults.404.yml │ │ │ ├── metatag.metatag_defaults.front.yml │ │ │ ├── metatag.metatag_defaults.global.yml │ │ │ ├── metatag.metatag_defaults.node.yml │ │ │ ├── metatag.metatag_defaults.taxonomy_term.yml │ │ │ ├── metatag.metatag_defaults.user.yml │ │ │ ├── metatag.settings.yml │ │ │ ├── node.type.article.yml │ │ │ ├── system.action.taxonomy_term_publish_action.yml │ │ │ ├── system.action.taxonomy_term_unpublish_action.yml │ │ │ ├── system.action.user_remove_role_action.administrator.yml │ │ │ ├── taxonomy.settings.yml │ │ │ ├── taxonomy.vocabulary.tags.yml │ │ │ ├── user.role.administrator.yml │ │ │ ├── views.view.content.yml │ │ │ ├── views.view.content_recent.yml │ │ │ └── views.view.files.yml │ │ └── recipe.yml │ ├── wunder_languages │ │ ├── README.md │ │ ├── composer.json │ │ ├── config │ │ │ ├── language.content_settings.menu_link_content.menu_link_content.yml │ │ │ ├── language.content_settings.node.article.yml │ │ │ ├── language.entity.fi.yml │ │ │ ├── language.entity.sv.yml │ │ │ ├── language.mappings.yml │ │ │ ├── language.negotiation.yml │ │ │ ├── language.types.yml │ │ │ └── locale.settings.yml │ │ └── recipe.yml │ ├── wunder_media │ │ ├── README.md │ │ ├── composer.json │ │ ├── config │ │ │ ├── core.base_field_override.media.audio.changed.yml │ │ │ ├── core.base_field_override.media.audio.created.yml │ │ │ ├── core.base_field_override.media.audio.name.yml │ │ │ ├── core.base_field_override.media.audio.path.yml │ │ │ ├── core.base_field_override.media.audio.status.yml │ │ │ ├── core.base_field_override.media.audio.thumbnail.yml │ │ │ ├── core.base_field_override.media.audio.uid.yml │ │ │ ├── core.base_field_override.media.document.changed.yml │ │ │ ├── core.base_field_override.media.document.created.yml │ │ │ ├── core.base_field_override.media.document.path.yml │ │ │ ├── core.base_field_override.media.document.status.yml │ │ │ ├── core.base_field_override.media.document.thumbnail.yml │ │ │ ├── core.base_field_override.media.document.uid.yml │ │ │ ├── core.base_field_override.media.image.changed.yml │ │ │ ├── core.base_field_override.media.image.created.yml │ │ │ ├── core.base_field_override.media.image.path.yml │ │ │ ├── core.base_field_override.media.image.status.yml │ │ │ ├── core.base_field_override.media.image.uid.yml │ │ │ ├── core.base_field_override.media.remote_video.changed.yml │ │ │ ├── core.base_field_override.media.remote_video.created.yml │ │ │ ├── core.base_field_override.media.remote_video.name.yml │ │ │ ├── core.base_field_override.media.remote_video.path.yml │ │ │ ├── core.base_field_override.media.remote_video.status.yml │ │ │ ├── core.base_field_override.media.remote_video.uid.yml │ │ │ ├── core.base_field_override.media.video.changed.yml │ │ │ ├── core.base_field_override.media.video.created.yml │ │ │ ├── core.base_field_override.media.video.path.yml │ │ │ ├── core.base_field_override.media.video.status.yml │ │ │ ├── core.base_field_override.media.video.thumbnail.yml │ │ │ ├── core.base_field_override.media.video.uid.yml │ │ │ ├── core.entity_form_display.media.audio.default.yml │ │ │ ├── core.entity_form_display.media.audio.media_library.yml │ │ │ ├── core.entity_form_display.media.document.default.yml │ │ │ ├── core.entity_form_display.media.document.media_library.yml │ │ │ ├── core.entity_form_display.media.image.default.yml │ │ │ ├── core.entity_form_display.media.image.media_library.yml │ │ │ ├── core.entity_form_display.media.remote_video.default.yml │ │ │ ├── core.entity_form_display.media.remote_video.media_library.yml │ │ │ ├── core.entity_form_display.media.video.default.yml │ │ │ ├── core.entity_form_display.media.video.media_library.yml │ │ │ ├── core.entity_form_mode.media.media_library.yml │ │ │ ├── core.entity_view_display.media.audio.media_library.yml │ │ │ ├── core.entity_view_display.media.document.media_library.yml │ │ │ ├── core.entity_view_display.media.image.default.yml │ │ │ ├── core.entity_view_display.media.image.media_library.yml │ │ │ ├── core.entity_view_display.media.remote_video.default.yml │ │ │ ├── core.entity_view_display.media.remote_video.media_library.yml │ │ │ ├── core.entity_view_display.media.video.default.yml │ │ │ ├── core.entity_view_display.media.video.media_library.yml │ │ │ ├── core.entity_view_mode.media.media_library.yml │ │ │ ├── field.field.media.audio.field_media_audio_file.yml │ │ │ ├── field.field.media.document.field_media_document.yml │ │ │ ├── field.field.media.image.field_media_image.yml │ │ │ ├── field.field.media.remote_video.field_media_oembed_video.yml │ │ │ ├── field.field.media.video.field_media_video_file.yml │ │ │ ├── field.storage.media.field_media_audio_file.yml │ │ │ ├── field.storage.media.field_media_document.yml │ │ │ ├── field.storage.media.field_media_image.yml │ │ │ ├── field.storage.media.field_media_oembed_video.yml │ │ │ ├── field.storage.media.field_media_video_file.yml │ │ │ ├── image.style.media_library.yml │ │ │ ├── language.content_settings.media.audio.yml │ │ │ ├── language.content_settings.media.document.yml │ │ │ ├── language.content_settings.media.image.yml │ │ │ ├── language.content_settings.media.remote_video.yml │ │ │ ├── language.content_settings.media.video.yml │ │ │ ├── media.settings.yml │ │ │ ├── media.type.audio.yml │ │ │ ├── media.type.document.yml │ │ │ ├── media.type.image.yml │ │ │ ├── media.type.remote_video.yml │ │ │ ├── media.type.video.yml │ │ │ ├── media_library.settings.yml │ │ │ └── views.view.media_library.yml │ │ └── recipe.yml │ ├── wunder_next_setup │ │ ├── README.md │ │ ├── config │ │ │ ├── graphql.graphql_servers.graphql_compose_server.yml │ │ │ ├── graphql.settings.yml │ │ │ ├── graphql_compose.settings.yml │ │ │ ├── next.next_entity_type_config.node.article.yml │ │ │ ├── next.next_entity_type_config.node.frontpage.yml │ │ │ ├── next.next_entity_type_config.node.landing_page.yml │ │ │ ├── next.next_site.frontend.yml │ │ │ ├── next.settings.yml │ │ │ ├── pathauto.pattern.article.yml │ │ │ ├── redirect.settings.yml │ │ │ ├── registration_role.setting.yml │ │ │ ├── require_login.settings.yml │ │ │ ├── rest.resource.user_registration.yml │ │ │ ├── rest.resource.webform_rest_complete_submission.yml │ │ │ ├── rest.resource.webform_rest_submit.yml │ │ │ ├── simple_oauth.settings.yml │ │ │ ├── user.role.frontend_login.yml │ │ │ ├── user.role.next_api_role.yml │ │ │ ├── user.role.next_api_viewer_role.yml │ │ │ ├── views.view.articles.yml │ │ │ ├── views.view.sitemap.yml │ │ │ └── views.view.webform_submissions_by_user.yml │ │ └── recipe.yml │ ├── wunder_pages │ │ ├── README.md │ │ ├── composer.json │ │ ├── config │ │ │ ├── core.base_field_override.node.frontpage.promote.yml │ │ │ ├── core.base_field_override.paragraph.formatted_text.created.yml │ │ │ ├── core.base_field_override.paragraph.formatted_text.status.yml │ │ │ ├── core.base_field_override.paragraph.image.created.yml │ │ │ ├── core.base_field_override.paragraph.image.status.yml │ │ │ ├── core.base_field_override.paragraph.video.created.yml │ │ │ ├── core.base_field_override.paragraph.video.status.yml │ │ │ ├── core.entity_form_display.node.frontpage.default.yml │ │ │ ├── core.entity_form_display.node.page.default.yml │ │ │ ├── core.entity_form_display.paragraph.accordion.default.yml │ │ │ ├── core.entity_form_display.paragraph.accordion_item.default.yml │ │ │ ├── core.entity_form_display.paragraph.file_attachments.default.yml │ │ │ ├── core.entity_form_display.paragraph.formatted_text.default.yml │ │ │ ├── core.entity_form_display.paragraph.hero.default.yml │ │ │ ├── core.entity_form_display.paragraph.image.default.yml │ │ │ ├── core.entity_form_display.paragraph.liftups_articles.default.yml │ │ │ ├── core.entity_form_display.paragraph.links.default.yml │ │ │ ├── core.entity_form_display.paragraph.listing_articles.default.yml │ │ │ ├── core.entity_form_display.paragraph.video.default.yml │ │ │ ├── core.entity_view_display.node.frontpage.default.yml │ │ │ ├── core.entity_view_display.node.page.default.yml │ │ │ ├── core.entity_view_display.paragraph.accordion.default.yml │ │ │ ├── core.entity_view_display.paragraph.accordion_item.default.yml │ │ │ ├── core.entity_view_display.paragraph.file_attachments.default.yml │ │ │ ├── core.entity_view_display.paragraph.formatted_text.default.yml │ │ │ ├── core.entity_view_display.paragraph.hero.default.yml │ │ │ ├── core.entity_view_display.paragraph.image.default.yml │ │ │ ├── core.entity_view_display.paragraph.liftups_articles.default.yml │ │ │ ├── core.entity_view_display.paragraph.links.default.yml │ │ │ ├── core.entity_view_display.paragraph.listing_articles.default.yml │ │ │ ├── core.entity_view_display.paragraph.video.default.yml │ │ │ ├── field.field.node.frontpage.field_content_elements.yml │ │ │ ├── field.field.node.frontpage.field_excerpt.yml │ │ │ ├── field.field.node.frontpage.field_image.yml │ │ │ ├── field.field.node.page.field_content_elements.yml │ │ │ ├── field.field.node.page.field_excerpt.yml │ │ │ ├── field.field.node.page.field_image.yml │ │ │ ├── field.field.paragraph.accordion.field_accordion_items.yml │ │ │ ├── field.field.paragraph.accordion.field_accordion_layout.yml │ │ │ ├── field.field.paragraph.accordion.field_formatted_text.yml │ │ │ ├── field.field.paragraph.accordion.field_heading.yml │ │ │ ├── field.field.paragraph.accordion.field_primary_link.yml │ │ │ ├── field.field.paragraph.accordion_item.field_content_elements.yml │ │ │ ├── field.field.paragraph.accordion_item.field_formatted_text.yml │ │ │ ├── field.field.paragraph.accordion_item.field_heading.yml │ │ │ ├── field.field.paragraph.file_attachments.field_file_attachments.yml │ │ │ ├── field.field.paragraph.file_attachments.field_formatted_text.yml │ │ │ ├── field.field.paragraph.file_attachments.field_heading.yml │ │ │ ├── field.field.paragraph.formatted_text.field_formatted_text.yml │ │ │ ├── field.field.paragraph.formatted_text.field_heading.yml │ │ │ ├── field.field.paragraph.hero.field_formatted_text.yml │ │ │ ├── field.field.paragraph.hero.field_heading.yml │ │ │ ├── field.field.paragraph.hero.field_image.yml │ │ │ ├── field.field.paragraph.hero.field_primary_link.yml │ │ │ ├── field.field.paragraph.hero.field_secondary_link.yml │ │ │ ├── field.field.paragraph.image.field_image.yml │ │ │ ├── field.field.paragraph.liftups_articles.field_articles.yml │ │ │ ├── field.field.paragraph.liftups_articles.field_heading.yml │ │ │ ├── field.field.paragraph.links.field_links.yml │ │ │ ├── field.field.paragraph.listing_articles.field_heading.yml │ │ │ ├── field.field.paragraph.listing_articles.field_limit.yml │ │ │ ├── field.field.paragraph.video.field_video.yml │ │ │ ├── field.storage.node.field_content_elements.yml │ │ │ ├── field.storage.paragraph.field_accordion_items.yml │ │ │ ├── field.storage.paragraph.field_accordion_layout.yml │ │ │ ├── field.storage.paragraph.field_articles.yml │ │ │ ├── field.storage.paragraph.field_content_elements.yml │ │ │ ├── field.storage.paragraph.field_file_attachments.yml │ │ │ ├── field.storage.paragraph.field_formatted_text.yml │ │ │ ├── field.storage.paragraph.field_heading.yml │ │ │ ├── field.storage.paragraph.field_image.yml │ │ │ ├── field.storage.paragraph.field_limit.yml │ │ │ ├── field.storage.paragraph.field_links.yml │ │ │ ├── field.storage.paragraph.field_primary_link.yml │ │ │ ├── field.storage.paragraph.field_secondary_link.yml │ │ │ ├── field.storage.paragraph.field_video.yml │ │ │ ├── language.content_settings.node.frontpage.yml │ │ │ ├── language.content_settings.node.page.yml │ │ │ ├── language.content_settings.paragraph.accordion.yml │ │ │ ├── language.content_settings.paragraph.accordion_item.yml │ │ │ ├── language.content_settings.paragraph.file_attachments.yml │ │ │ ├── language.content_settings.paragraph.formatted_text.yml │ │ │ ├── language.content_settings.paragraph.hero.yml │ │ │ ├── language.content_settings.paragraph.image.yml │ │ │ ├── language.content_settings.paragraph.liftups_articles.yml │ │ │ ├── language.content_settings.paragraph.links.yml │ │ │ ├── language.content_settings.paragraph.listing_articles.yml │ │ │ ├── language.content_settings.paragraph.video.yml │ │ │ ├── node.type.frontpage.yml │ │ │ ├── node.type.page.yml │ │ │ ├── paragraphs.paragraphs_type.accordion.yml │ │ │ ├── paragraphs.paragraphs_type.accordion_item.yml │ │ │ ├── paragraphs.paragraphs_type.file_attachments.yml │ │ │ ├── paragraphs.paragraphs_type.formatted_text.yml │ │ │ ├── paragraphs.paragraphs_type.hero.yml │ │ │ ├── paragraphs.paragraphs_type.image.yml │ │ │ ├── paragraphs.paragraphs_type.liftups_articles.yml │ │ │ ├── paragraphs.paragraphs_type.links.yml │ │ │ ├── paragraphs.paragraphs_type.listing_articles.yml │ │ │ ├── paragraphs.paragraphs_type.video.yml │ │ │ ├── paragraphs.settings.yml │ │ │ ├── pathauto.pattern.frontpage.yml │ │ │ ├── pathauto.pattern.page.yml │ │ │ └── workflows.workflow.moderation.yml │ │ └── recipe.yml │ ├── wunder_roles │ │ ├── README.md │ │ ├── composer.json │ │ ├── config │ │ │ └── user.role.wunder_content_editor.yml │ │ └── recipe.yml │ └── wunder_search │ │ ├── config │ │ └── elasticsearch_helper.settings.yml │ │ └── recipe.yml ├── scripts │ └── composer │ │ └── ScriptHandler.php └── web │ ├── .dockerignore │ ├── modules │ └── custom │ │ ├── wunder_democontent │ │ ├── migrations │ │ │ ├── menuitems_pages.yml │ │ │ ├── menuitems_pages_level_1.yml │ │ │ ├── menuitems_pages_level_2.yml │ │ │ ├── menuitems_pages_translations.yml │ │ │ ├── menuitems_pages_translations_level_1.yml │ │ │ ├── menuitems_pages_translations_level_2.yml │ │ │ ├── nodes_articles.yml │ │ │ ├── nodes_articles_images.yml │ │ │ ├── nodes_articles_translations.yml │ │ │ ├── nodes_frontpage_images.yml │ │ │ ├── nodes_frontpage_media_images.yml │ │ │ ├── nodes_frontpages.yml │ │ │ ├── nodes_frontpages_translations.yml │ │ │ ├── nodes_pages.yml │ │ │ ├── nodes_pages_attachments.yml │ │ │ ├── nodes_pages_images.yml │ │ │ ├── nodes_pages_media_files_attachments.yml │ │ │ ├── nodes_pages_media_images.yml │ │ │ ├── nodes_pages_media_remote_video.yml │ │ │ ├── nodes_pages_translations.yml │ │ │ ├── paragraphs_frontpage_formatted_text.yml │ │ │ ├── paragraphs_frontpage_formatted_text_translations.yml │ │ │ ├── paragraphs_frontpage_hero.yml │ │ │ ├── paragraphs_frontpage_hero_translations.yml │ │ │ ├── paragraphs_frontpage_liftups_articles.yml │ │ │ ├── paragraphs_frontpage_liftups_articles_translations.yml │ │ │ ├── paragraphs_frontpage_listing_articles.yml │ │ │ ├── paragraphs_frontpage_listing_articles_translations.yml │ │ │ ├── paragraphs_pages_acc_attachments_0.yml │ │ │ ├── paragraphs_pages_acc_attachments_0_translations.yml │ │ │ ├── paragraphs_pages_acc_formatted_text0.yml │ │ │ ├── paragraphs_pages_acc_formatted_text0_translations.yml │ │ │ ├── paragraphs_pages_acc_formatted_text1.yml │ │ │ ├── paragraphs_pages_acc_formatted_text1_translations.yml │ │ │ ├── paragraphs_pages_acc_image1.yml │ │ │ ├── paragraphs_pages_acc_image1_translations.yml │ │ │ ├── paragraphs_pages_acc_links_0.yml │ │ │ ├── paragraphs_pages_acc_links_0_translations.yml │ │ │ ├── paragraphs_pages_acc_video0.yml │ │ │ ├── paragraphs_pages_acc_video0_translations.yml │ │ │ ├── paragraphs_pages_accordion.yml │ │ │ ├── paragraphs_pages_accordion_item0.yml │ │ │ ├── paragraphs_pages_accordion_item0_translations.yml │ │ │ ├── paragraphs_pages_accordion_item1.yml │ │ │ ├── paragraphs_pages_accordion_item1_translations.yml │ │ │ ├── paragraphs_pages_accordion_translations.yml │ │ │ ├── paragraphs_pages_file_attachments.yml │ │ │ ├── paragraphs_pages_file_attachments_translations.yml │ │ │ ├── paragraphs_pages_formatted_text.yml │ │ │ ├── paragraphs_pages_formatted_text_translations.yml │ │ │ ├── paragraphs_pages_image.yml │ │ │ ├── paragraphs_pages_image_translations.yml │ │ │ ├── paragraphs_pages_links.yml │ │ │ ├── paragraphs_pages_links_translations.yml │ │ │ ├── paragraphs_pages_video.yml │ │ │ ├── paragraphs_pages_video_translations.yml │ │ │ └── users.yml │ │ ├── sources │ │ │ ├── articles.csv │ │ │ ├── attachments │ │ │ │ ├── Pdf-file-example1.pdf │ │ │ │ ├── Pdf-file-example2.pdf │ │ │ │ ├── Pdf-file-example3.pdf │ │ │ │ ├── Pdf-file-example4.pdf │ │ │ │ ├── Pdf-file-example5.pdf │ │ │ │ └── Pdf-file-example6.pdf │ │ │ ├── frontpages.csv │ │ │ ├── images │ │ │ │ ├── 1.jpg │ │ │ │ ├── 10.jpg │ │ │ │ ├── 11.jpg │ │ │ │ ├── 12.jpg │ │ │ │ ├── 13.jpg │ │ │ │ ├── 14.jpg │ │ │ │ ├── 2.jpg │ │ │ │ ├── 3.jpg │ │ │ │ ├── 4.jpg │ │ │ │ ├── 5.jpg │ │ │ │ ├── 6.jpg │ │ │ │ ├── 7.jpg │ │ │ │ ├── 8.jpg │ │ │ │ ├── 9.jpg │ │ │ │ └── wunder_ecosystem.jpg │ │ │ ├── pages.csv │ │ │ └── users.csv │ │ ├── src │ │ │ ├── EventSubscriber │ │ │ │ └── WunderDemocontentRevalidateSubscriber.php │ │ │ └── Plugin │ │ │ │ └── migrate │ │ │ │ └── process │ │ │ │ ├── MenuLinkIconAttribute.php │ │ │ │ └── NullAsArray.php │ │ ├── wunder_democontent.info.yml │ │ └── wunder_democontent.services.yml │ │ ├── wunder_next │ │ ├── composer.json │ │ ├── drush.services.yml │ │ ├── src │ │ │ ├── Commands │ │ │ │ └── WunderNextCommands.php │ │ │ └── Plugin │ │ │ │ └── Validation │ │ │ │ └── Constraint │ │ │ │ ├── UniqueFrontpage.php │ │ │ │ └── UniqueFrontpageValidator.php │ │ ├── wunder_next.info.yml │ │ ├── wunder_next.module │ │ └── wunder_next.tokens.inc │ │ ├── wunder_search │ │ ├── src │ │ │ ├── IndexerUserSession.php │ │ │ └── Plugin │ │ │ │ ├── ElasticsearchIndex │ │ │ │ └── MultilingualContentIndex.php │ │ │ │ └── Normalizer │ │ │ │ └── NodeNormalizer.php │ │ ├── wunder_search.info.yml │ │ └── wunder_search.services.yml │ │ └── wunder_sitemap │ │ ├── src │ │ └── SitemapExporter.php │ │ ├── wunder_sitemap.info.yml │ │ ├── wunder_sitemap.module │ │ └── wunder_sitemap.services.yml │ ├── profiles │ └── custom │ │ └── basic │ │ ├── basic.info.yml │ │ └── config │ │ └── install │ │ ├── block.block.bartik_account_menu.yml │ │ ├── block.block.bartik_branding.yml │ │ ├── block.block.bartik_breadcrumbs.yml │ │ ├── block.block.bartik_content.yml │ │ ├── block.block.bartik_footer.yml │ │ ├── block.block.bartik_local_actions.yml │ │ ├── block.block.bartik_local_tasks.yml │ │ ├── block.block.bartik_main_menu.yml │ │ ├── block.block.bartik_messages.yml │ │ ├── block.block.bartik_page_title.yml │ │ ├── block.block.seven_breadcrumbs.yml │ │ ├── block.block.seven_content.yml │ │ ├── block.block.seven_local_actions.yml │ │ ├── block.block.seven_messages.yml │ │ ├── block.block.seven_page_title.yml │ │ ├── block.block.seven_primary_local_tasks.yml │ │ ├── block.block.seven_secondary_local_tasks.yml │ │ ├── core.entity_form_display.user.user.default.yml │ │ ├── core.entity_view_display.user.user.default.yml │ │ ├── editor.editor.basic_html.yml │ │ ├── editor.editor.full_html.yml │ │ ├── filter.format.basic_html.yml │ │ ├── filter.format.full_html.yml │ │ ├── filter.format.restricted_html.yml │ │ ├── node.settings.yml │ │ ├── system.cron.yml │ │ ├── system.site.yml │ │ ├── system.theme.yml │ │ ├── user.role.administrator.yml │ │ ├── user.role.anonymous.yml │ │ ├── user.role.authenticated.yml │ │ └── user.settings.yml │ └── sites │ ├── default │ └── settings.php │ └── development.services.yml ├── next ├── .dockerignore ├── .env.local.example ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .graphqlrc.yml ├── .prettierrc ├── .storybook │ ├── main.ts │ ├── manager.ts │ ├── next-intl.ts │ ├── preview.tsx │ └── theme.ts ├── .vscode │ ├── extensions.json │ └── settings.json ├── cache-handler.mjs ├── codegen-access-token.ts ├── codegen.ts ├── components.json ├── cypress.config.ts ├── cypress │ ├── e2e │ │ └── template.cy.ts │ ├── fixtures │ │ └── example.json │ └── support │ │ ├── commands.ts │ │ ├── e2e.ts │ │ └── utils.ts ├── messages │ ├── en.json │ ├── fi.json │ └── sv.json ├── next-env.d.ts ├── next.config.mjs ├── package-lock.json ├── package.json ├── postcss.config.js ├── public │ └── profile.png ├── src │ ├── app │ │ ├── [locale] │ │ │ ├── (dynamic) │ │ │ │ └── [...slug] │ │ │ │ │ ├── error.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ ├── not-found.tsx │ │ │ │ │ └── page.tsx │ │ │ ├── (static) │ │ │ │ ├── all-articles │ │ │ │ │ ├── _components │ │ │ │ │ │ ├── articles-list-item.tsx │ │ │ │ │ │ └── articles-pagination.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── auth │ │ │ │ │ ├── login │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── register │ │ │ │ │ │ └── page.tsx │ │ │ │ ├── dashboard │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── webforms │ │ │ │ │ │ └── [webformName] │ │ │ │ │ │ └── [webformSubmissionUuid] │ │ │ │ │ │ └── page.tsx │ │ │ │ ├── error.tsx │ │ │ │ ├── layout.tsx │ │ │ │ ├── nodepreview │ │ │ │ │ └── page.tsx │ │ │ │ ├── not-found.tsx │ │ │ │ ├── page.tsx │ │ │ │ └── search │ │ │ │ │ └── page.tsx │ │ │ └── layout.tsx │ │ ├── _actions │ │ │ ├── contact.ts │ │ │ └── register.ts │ │ ├── api │ │ │ ├── auth │ │ │ │ └── [...nextauth] │ │ │ │ │ └── route.ts │ │ │ ├── disable-draft │ │ │ │ └── route.ts │ │ │ ├── draft │ │ │ │ └── route.ts │ │ │ ├── health │ │ │ │ └── route.ts │ │ │ ├── revalidate │ │ │ │ └── route.ts │ │ │ └── search │ │ │ │ └── route.ts │ │ ├── favicon.ico │ │ ├── robots.txt │ │ └── sitemap.ts │ ├── auth.ts │ ├── components │ │ ├── article │ │ │ ├── article-teaser.tsx │ │ │ ├── article-teasers.tsx │ │ │ └── articles-listing.tsx │ │ ├── auth-gate-client.tsx │ │ ├── auth-gate-server.tsx │ │ ├── contact-list.tsx │ │ ├── draft-alert-client.tsx │ │ ├── draft-alert.tsx │ │ ├── error-page.tsx │ │ ├── footer │ │ │ ├── footer.tsx │ │ │ └── social-share.tsx │ │ ├── formatted-text.tsx │ │ ├── forms │ │ │ ├── contact-form.tsx │ │ │ ├── error-required.tsx │ │ │ ├── login-form.tsx │ │ │ └── register-form.tsx │ │ ├── header │ │ │ ├── header.tsx │ │ │ ├── language-switcher.tsx │ │ │ ├── theme-toggler.tsx │ │ │ └── user-menu.tsx │ │ ├── heading--page.tsx │ │ ├── heading--paragraph.tsx │ │ ├── loading-spinner.tsx │ │ ├── logo-strip.tsx │ │ ├── main-menu │ │ │ ├── main-menu.components.tsx │ │ │ ├── main-menu.module.css │ │ │ ├── main-menu.tsx │ │ │ └── main-menu.utils.ts │ │ ├── media │ │ │ ├── index.tsx │ │ │ ├── media--document.tsx │ │ │ ├── media--image.tsx │ │ │ └── media--video.tsx │ │ ├── node │ │ │ ├── index.tsx │ │ │ ├── node--article.tsx │ │ │ ├── node--frontpage.tsx │ │ │ └── node--page.tsx │ │ ├── not-found-page.tsx │ │ ├── page-layout.tsx │ │ ├── pagination.tsx │ │ ├── paragraph │ │ │ ├── index.tsx │ │ │ ├── paragraph--accordion--one-column.tsx │ │ │ ├── paragraph--accordion--two-columns.tsx │ │ │ ├── paragraph--accordion.tsx │ │ │ ├── paragraph--file-attachments.tsx │ │ │ ├── paragraph--hero.tsx │ │ │ ├── paragraph--image.tsx │ │ │ ├── paragraph--liftup-article.tsx │ │ │ ├── paragraph--links.tsx │ │ │ ├── paragraph--listing-articles.tsx │ │ │ ├── paragraph--text.tsx │ │ │ └── paragraph--video.tsx │ │ ├── query-client-provider.tsx │ │ ├── theme-provider.tsx │ │ └── ui │ │ │ ├── accordion.tsx │ │ │ ├── arrow-link-button.tsx │ │ │ ├── badge.tsx │ │ │ ├── button.tsx │ │ │ ├── card.tsx │ │ │ ├── checkbox.tsx │ │ │ ├── dialog.tsx │ │ │ ├── dropdown-menu.tsx │ │ │ ├── form.tsx │ │ │ ├── input.tsx │ │ │ ├── label.tsx │ │ │ ├── logout-button.tsx │ │ │ ├── separator.tsx │ │ │ ├── skip-to-content-link.tsx │ │ │ ├── sonner.tsx │ │ │ ├── status-message.tsx │ │ │ ├── table.tsx │ │ │ └── textarea.tsx │ ├── env.ts │ ├── i18n │ │ ├── request.ts │ │ └── routing.ts │ ├── instrumentation.ts │ ├── lib │ │ ├── auth │ │ │ ├── get-auth.ts │ │ │ └── redirect-expired-login.ts │ │ ├── constants.ts │ │ ├── contexts │ │ │ ├── language-links-context.tsx │ │ │ └── language-links.ts │ │ ├── drupal │ │ │ ├── drupal-client.ts │ │ │ ├── generate-node-metadata.ts │ │ │ ├── get-article-teasers.ts │ │ │ ├── get-articles.ts │ │ │ ├── get-menus.ts │ │ │ ├── get-node-metadata.ts │ │ │ ├── get-node-static-params.ts │ │ │ └── get-node.ts │ │ ├── graphql │ │ │ ├── fragments │ │ │ │ ├── fields.ts │ │ │ │ ├── media.ts │ │ │ │ ├── nodes.ts │ │ │ │ ├── paragraphs.ts │ │ │ │ └── users.ts │ │ │ ├── queries.ts │ │ │ └── utils.ts │ │ ├── hooks │ │ │ ├── use-effect-once.ts │ │ │ ├── use-event-listener.ts │ │ │ └── use-on-click-outside.ts │ │ ├── utils.ts │ │ └── zod │ │ │ ├── contact-form.ts │ │ │ ├── login-form.ts │ │ │ ├── register-form.ts │ │ │ ├── webform-submission-list.ts │ │ │ └── webform-submission.ts │ ├── middleware.ts │ ├── stories │ │ ├── badge.stories.tsx │ │ ├── button.stories.tsx │ │ ├── checkbox.stories.tsx │ │ ├── dialog.stories.tsx │ │ ├── input.stories.tsx │ │ ├── separator.stories.tsx │ │ ├── status-message.stories.tsx │ │ └── textarea.stories.tsx │ ├── styles │ │ ├── fonts.tsx │ │ ├── globals.css │ │ └── icons │ │ │ ├── _icons-readme.md │ │ │ ├── accessibility.svg │ │ │ ├── account-circle.svg │ │ │ ├── add-photo.svg │ │ │ ├── arrow-ascend.svg │ │ │ ├── arrow-down.svg │ │ │ ├── block.svg │ │ │ ├── bookmark-filled.svg │ │ │ ├── bookmark.svg │ │ │ ├── calendar.svg │ │ │ ├── camera.svg │ │ │ ├── cart.svg │ │ │ ├── checkmark.svg │ │ │ ├── chevron-down.svg │ │ │ ├── clock.svg │ │ │ ├── close.svg │ │ │ ├── code.svg │ │ │ ├── copy.svg │ │ │ ├── dark_mode.svg │ │ │ ├── desktop.svg │ │ │ ├── download.svg │ │ │ ├── drupal-icon.svg │ │ │ ├── error.svg │ │ │ ├── external.svg │ │ │ ├── facebook.svg │ │ │ ├── filter.svg │ │ │ ├── folder.svg │ │ │ ├── fullscreen.svg │ │ │ ├── heart-filled.svg │ │ │ ├── heart.svg │ │ │ ├── help.svg │ │ │ ├── home.svg │ │ │ ├── image.svg │ │ │ ├── instagram.svg │ │ │ ├── lando-logo.svg │ │ │ ├── language.svg │ │ │ ├── laptop.svg │ │ │ ├── lightbulb.svg │ │ │ ├── link-off.svg │ │ │ ├── link.svg │ │ │ ├── linkedin.svg │ │ │ ├── list.svg │ │ │ ├── location-arrow.svg │ │ │ ├── location.svg │ │ │ ├── login.svg │ │ │ ├── logout.svg │ │ │ ├── mail.svg │ │ │ ├── menu.svg │ │ │ ├── message.svg │ │ │ ├── minus.svg │ │ │ ├── nextjs-logo.svg │ │ │ ├── notifications.svg │ │ │ ├── paper-clip.svg │ │ │ ├── payment.svg │ │ │ ├── pdf.svg │ │ │ ├── pencil.svg │ │ │ ├── phone.svg │ │ │ ├── pin.svg │ │ │ ├── play.svg │ │ │ ├── plus.svg │ │ │ ├── qr.svg │ │ │ ├── quote.svg │ │ │ ├── react-icon.svg │ │ │ ├── refresh.svg │ │ │ ├── rss_feed.svg │ │ │ ├── search.svg │ │ │ ├── settings.svg │ │ │ ├── share.svg │ │ │ ├── star-filled.svg │ │ │ ├── star.svg │ │ │ ├── sync.svg │ │ │ ├── tailwindcss.svg │ │ │ ├── text-doc.svg │ │ │ ├── text_decrease.svg │ │ │ ├── text_increase.svg │ │ │ ├── thumb_down.svg │ │ │ ├── thumb_up.svg │ │ │ ├── tiktok.svg │ │ │ ├── trash.svg │ │ │ ├── twitter.svg │ │ │ ├── upload.svg │ │ │ ├── visibility-off.svg │ │ │ ├── visibility.svg │ │ │ ├── warning.svg │ │ │ ├── wunder-carrot.svg │ │ │ ├── wunder.svg │ │ │ ├── youtube.svg │ │ │ ├── zoom_in.svg │ │ │ └── zoom_out.svg │ └── types │ │ ├── graphql.ts │ │ ├── next-auth.d.ts │ │ ├── next-intl.d.ts │ │ └── server-only.d.ts ├── tailwind.config.js └── tsconfig.json ├── setup-ddev.sh ├── setup-lando.sh └── silta ├── elasticsearch.Dockerfile ├── nginx.Dockerfile ├── node.Dockerfile ├── php.Dockerfile ├── secrets.example.yml ├── shell.Dockerfile ├── silta-main.yml ├── silta-next-main.yml ├── silta-next.yml ├── silta-prod.yml ├── silta-storybook.yml └── silta.yml /.ddev/addon-metadata/elasticsearch/manifest.yaml: -------------------------------------------------------------------------------- 1 | name: elasticsearch 2 | repository: ddev/ddev-elasticsearch 3 | version: v0.3.2 4 | install_date: "2024-06-07T20:45:48+03:00" 5 | project_files: 6 | - elasticsearch/ 7 | - docker-compose.elasticsearch.yaml 8 | global_files: [] 9 | removal_actions: [] 10 | -------------------------------------------------------------------------------- /.ddev/addon-metadata/redis/manifest.yaml: -------------------------------------------------------------------------------- 1 | name: redis 2 | repository: ddev/ddev-redis-7 3 | version: v2.7.1 4 | install_date: "2024-07-31T21:58:58+03:00" 5 | project_files: 6 | - commands/redis/redis 7 | - commands/redis/redis-flush 8 | - redis/redis.conf 9 | - redis/advanced.conf 10 | - redis/append.conf 11 | - redis/general.conf 12 | - redis/io.conf 13 | - redis/memory.conf 14 | - redis/network.conf 15 | - redis/security.conf 16 | - redis/snapshots.conf 17 | - docker-compose.redis.yaml 18 | global_files: [] 19 | removal_actions: [] 20 | -------------------------------------------------------------------------------- /.ddev/commands/redis/redis: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #ddev-generated 3 | ## Description: Run redis-cli inside the redis container 4 | ## Usage: redis [flags] [args] 5 | ## Example: "redis KEYS *" or "ddev redis-cli INFO" or "ddev redis-cli --version" 6 | 7 | redis-cli -p 6379 -h redis -a redis --no-auth-warning "$@" 8 | -------------------------------------------------------------------------------- /.ddev/commands/redis/redis-flush: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #ddev-generated 3 | ## Description: Run redis-cli inside the redis container 4 | ## Usage: redis-flush 5 | ## Example: "redis-flush" 6 | 7 | redis-cli -a redis --no-auth-warning FLUSHALL ASYNC 8 | -------------------------------------------------------------------------------- /.ddev/commands/web/generate-oauth-keys.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ## Description: Helper script to generate oath keys as part of the next drupal starterkit setup. 4 | ## Usage: generate-oauth-keys 5 | ## Example: "ddev generate-oauth-keys" 6 | 7 | cd drupal/oauth 8 | pwd 9 | openssl genrsa -out private.key 2048 10 | openssl rsa -in private.key -pubout > public.key 11 | chmod 600 public.key 12 | -------------------------------------------------------------------------------- /.ddev/docker-compose.elasticsearch_extras.yaml: -------------------------------------------------------------------------------- 1 | #ddev-generated 2 | services: 3 | elasticsearch: 4 | environment: 5 | http.cors.enabled: "true" 6 | http.cors.allow-origin: "'*'" 7 | # Disable authentication in local development 8 | xpack.security.enabled: "false" 9 | xpack.security.enrollment.enabled: "false" -------------------------------------------------------------------------------- /.ddev/docker-compose.elasticvue.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | elasticvue: 3 | image: "cars10/elasticvue:1.0.4" 4 | #command: /docker-entrypoint.sh nginx -g 'daemon off;' 5 | container_name: ddev-${DDEV_SITENAME}-elasticvue 6 | labels: 7 | com.ddev.site-name: ${DDEV_SITENAME} 8 | com.ddev.approot: ${DDEV_APPROOT} 9 | environment: 10 | - 'ELASTICVUE_CLUSTERS=[{"name": "dev cluster", "uri": "http://${DDEV_SITENAME}.ddev.site:9200/", "password": "", "user": ""}]' 11 | - VIRTUAL_HOST=$DDEV_HOSTNAME 12 | - HTTP_EXPOSE=9005:8080 13 | web: 14 | links: 15 | - elasticvue:elasticvue 16 | - elasticsearch:elasticsearch -------------------------------------------------------------------------------- /.ddev/redis/redis.conf: -------------------------------------------------------------------------------- 1 | # #ddev-generated 2 | ################################## INCLUDES ################################### 3 | 4 | # Network 5 | include /etc/redis/conf/network.conf 6 | 7 | # General 8 | include /etc/redis/conf/general.conf 9 | 10 | # Snapshots 11 | include /etc/redis/conf/snapshots.conf 12 | 13 | # Security 14 | include /etc/redis/conf/security.conf 15 | 16 | # Memory management 17 | include /etc/redis/conf/memory.conf 18 | 19 | # CPU management 20 | include /etc/redis/conf/io.conf 21 | 22 | # Append mode 23 | include /etc/redis/conf/append.conf 24 | 25 | # Advanced config 26 | include /etc/redis/conf/advanced.conf 27 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore file for the Drupal container. 2 | **/*.md 3 | **/CHANGELOG* 4 | **/README* 5 | **/LICENSE* 6 | .circleci/* 7 | phpcs.xml 8 | **/*.sql 9 | **/*.gz 10 | **/*.zip 11 | web/core/**/tests 12 | web/modules/contrib/**/tests 13 | vendor/**/Tests 14 | **/node_modules 15 | **/.git 16 | web/sites/**/files 17 | web/.dockerignore 18 | Dockerfile 19 | composer.lock 20 | silta/silta*.yml 21 | -------------------------------------------------------------------------------- /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # .git-blame-ignore-revs 2 | 3 | # For an explanation of what this file does, see: 4 | # https://docs.github.com/en/repositories/working-with-files/using-files/viewing-a-file#ignore-commits-in-the-blame-view 5 | 6 | # Format json/md/yml files with prettier 7 | dc0358b348ee27f2d3330b799c429aee15292fee 8 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: composer 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "03:00" 8 | open-pull-requests-limit: 10 9 | - package-ecosystem: npm 10 | directory: "/" 11 | schedule: 12 | interval: daily 13 | time: "03:00" 14 | open-pull-requests-limit: 10 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .editorconfig 2 | 3 | # Ignore potential database dumps: 4 | *.sql.* 5 | *.sql 6 | 7 | # Ignore files generated by PhpStorm 8 | .idea 9 | 10 | # Ignore files generated by OS 11 | .DS_Store 12 | 13 | # Ignore .env files as they are personal 14 | .env* 15 | 16 | # Ignore node modules 17 | node_modules 18 | 19 | # Ignore start.sh script status file 20 | .last_successful_command_ddev 21 | .last_successful_command_lando 22 | 23 | # Ignore Lando data volumes 24 | /.lando/data-* 25 | 26 | # Unencrypted secrets 27 | /silta/secrets*.yml 28 | # ... except the example secrets 29 | !/silta/secrets.example.yml 30 | 31 | Makefile -------------------------------------------------------------------------------- /.lando/.env: -------------------------------------------------------------------------------- 1 | # Inject additional environment variables into every Lando service 2 | # @see: https://docs.lando.dev/config/env.html#environment-files 3 | DB_NAME=drupal10 4 | DB_USER=drupal10 5 | DB_PASS=drupal10 6 | DB_HOST=database -------------------------------------------------------------------------------- /.lando/generate_oauth_keys.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 4 | # Helper script to generate oath keys as part of the next drupal starterkit setup. 5 | # 6 | # Usage: 7 | # lando generate-oauth-keys 8 | # 9 | 10 | openssl genrsa -out private.key 2048 11 | openssl rsa -in private.key -pubout > public.key 12 | chmod 600 public.key 13 | -------------------------------------------------------------------------------- /.lando/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | # @see: https://www.drupal.org/docs/getting-started/system-requirements/setting-the-mysql-transaction-isolation-level 3 | transaction_isolation="READ-COMMITTED" 4 | -------------------------------------------------------------------------------- /.lando/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | 3 | ; Xdebug settings required for PhpStorm. 4 | xdebug.start_with_request = yes 5 | -------------------------------------------------------------------------------- /drupal/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | *.min.js 4 | *.bundle.js 5 | -------------------------------------------------------------------------------- /drupal/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["airbnb", "prettier", "plugin:prettier/recommended"], 3 | "plugins": ["prettier"], 4 | "root": true, 5 | "env": { 6 | "es6": true, 7 | "browser": true, 8 | "jest": true 9 | }, 10 | "globals": { 11 | "Drupal": true 12 | }, 13 | "rules": { 14 | "strict": "off", 15 | "prettier/prettier": "error" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /drupal/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } 5 | -------------------------------------------------------------------------------- /drupal/.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard", "stylelint-config-prettier"], 3 | "plugins": ["stylelint-prettier"], 4 | "rules": { 5 | "at-rule-no-unknown": [ 6 | true, 7 | { 8 | "ignoreAtRules": [ 9 | "include", 10 | "mixin", 11 | "extend", 12 | "if", 13 | "else", 14 | "each", 15 | "content", 16 | "import", 17 | "function", 18 | "return" 19 | ] 20 | } 21 | ], 22 | "no-descending-specificity": null, 23 | "function-calc-no-invalid": null, 24 | "prettier/prettier": true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /drupal/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["dbaeumer.vscode-eslint", "stylelint.vscode-stylelint"] 3 | } 4 | -------------------------------------------------------------------------------- /drupal/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Listen for XDebug (9003)", 6 | "type": "php", 7 | "request": "launch", 8 | "port": 9003, 9 | "log": true, 10 | "pathMappings": { 11 | "/app/": "${workspaceFolder}/" 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /drupal/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.codeActionsOnSave": { 3 | "source.fixAll.eslint": true, 4 | "source.fixAll.stylelint": true 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /drupal/drush/README.md: -------------------------------------------------------------------------------- 1 | This directory contains commands, configuration and site aliases for Drush. See https://packagist.org/search/?type=drupal-drush for a directory of Drush commands installable via Composer. 2 | -------------------------------------------------------------------------------- /drupal/drush/drush.yml: -------------------------------------------------------------------------------- 1 | # 2 | # A Drush configuration file 3 | # 4 | # Docs at https://github.com/drush-ops/drush/blob/master/examples/example.drush.yml 5 | # 6 | # Edit or remove this file as needed. 7 | -------------------------------------------------------------------------------- /drupal/load.environment.php: -------------------------------------------------------------------------------- 1 | safeLoad(); 21 | -------------------------------------------------------------------------------- /drupal/oauth/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore everything in this directory 2 | * 3 | # Except this file 4 | !.gitignore 5 | -------------------------------------------------------------------------------- /drupal/phpstan.neon: -------------------------------------------------------------------------------- 1 | parameters: 2 | # See: https://phpstan.org/config-reference#rule-level 3 | level: 5 4 | customRulesetUsed: true 5 | reportUnmatchedIgnoredErrors: false 6 | # Ignore phpstan-drupal extension's rules. 7 | ignoreErrors: 8 | - '#\Drupal calls should be avoided in classes, use dependency injection instead#' 9 | - '#Plugin definitions cannot be altered.#' 10 | - '#Missing cache backend declaration for performance.#' 11 | - '#Plugin manager has cache backend specified but does not declare cache tags.#' 12 | - '#Unsafe usage of new static\(\)#' 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/README.md: -------------------------------------------------------------------------------- 1 | ### Wunder base setup recipe 2 | 3 | This recipe is meant as a replacement of the default installation profile, and it provides a subset 4 | of its functionality. 5 | 6 | ### Manual Installation instructions 7 | 8 | The recipe can be installed using these commands: 9 | 10 | 1. `lando install-recipe wunder_base` 11 | 2. `lando drush cex -y` <- export your configuration 12 | 3. commit the configuration 13 | 14 | ### Testing on an empty site 15 | 16 | (Caution, this command will re-install the site) 17 | 18 | ```shell 19 | lando drush si -y && lando install-recipe wunder_base && lando drush uli 20 | ``` 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/admin_toolbar.settings.yml: -------------------------------------------------------------------------------- 1 | _core: 2 | default_config_hash: jvTSppzcgH5wnzBhX5xnAExcp2I1CzkQ_aky65XNfYI 3 | menu_depth: 4 4 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/block.block.claro_breadcrumbs.yml: -------------------------------------------------------------------------------- 1 | uuid: 490c150d-3204-403e-8b8a-2aa221cd9f00 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - system 7 | theme: 8 | - claro 9 | _core: 10 | default_config_hash: NjcxOBrPOiK5-38t56DwFBDVY4yer7YSlbRWXFuHe7A 11 | id: claro_breadcrumbs 12 | theme: claro 13 | region: breadcrumb 14 | weight: 0 15 | provider: null 16 | plugin: system_breadcrumb_block 17 | settings: 18 | id: system_breadcrumb_block 19 | label: Breadcrumbs 20 | label_display: '0' 21 | provider: system 22 | visibility: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/block.block.claro_content.yml: -------------------------------------------------------------------------------- 1 | uuid: 9827a189-a743-4c44-a40f-6d82c9d1d241 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - system 7 | theme: 8 | - claro 9 | _core: 10 | default_config_hash: a0Yyx1GeyKarZ4T_yXQBR_ZFKnXiFLtxAb6gWLd8nr0 11 | id: claro_content 12 | theme: claro 13 | region: content 14 | weight: 0 15 | provider: null 16 | plugin: system_main_block 17 | settings: 18 | id: system_main_block 19 | label: 'Main page content' 20 | label_display: '0' 21 | provider: system 22 | visibility: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/block.block.claro_help.yml: -------------------------------------------------------------------------------- 1 | uuid: c5d09da3-035e-4304-8c4d-1787efcfa835 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - help 7 | theme: 8 | - claro 9 | _core: 10 | default_config_hash: jccFSSVqV0WCDb6NtML1VWAWTtDbZ-zn5YgTRMgMrIM 11 | id: claro_help 12 | theme: claro 13 | region: help 14 | weight: 0 15 | provider: null 16 | plugin: help_block 17 | settings: 18 | id: help_block 19 | label: Help 20 | label_display: '0' 21 | provider: help 22 | visibility: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/block.block.claro_local_actions.yml: -------------------------------------------------------------------------------- 1 | uuid: ac6e8620-7375-43a7-9025-482260a2a7db 2 | langcode: en 3 | status: true 4 | dependencies: 5 | theme: 6 | - claro 7 | _core: 8 | default_config_hash: CdXfDmRgAvms7EQovxxWPdYi0GitxeRbVtScYK16ZH0 9 | id: claro_local_actions 10 | theme: claro 11 | region: content 12 | weight: -10 13 | provider: null 14 | plugin: local_actions_block 15 | settings: 16 | id: local_actions_block 17 | label: 'Primary admin actions' 18 | label_display: '0' 19 | provider: core 20 | visibility: { } 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/block.block.claro_messages.yml: -------------------------------------------------------------------------------- 1 | uuid: fd49976e-3881-43f7-a145-1efc01d5ced6 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - system 7 | theme: 8 | - claro 9 | _core: 10 | default_config_hash: '-Ac3ISpIT0PQ-whzD7_dw0SdKi6dAbRFNWdSjOiVDqg' 11 | id: claro_messages 12 | theme: claro 13 | region: highlighted 14 | weight: 0 15 | provider: null 16 | plugin: system_messages_block 17 | settings: 18 | id: system_messages_block 19 | label: 'Status messages' 20 | label_display: '0' 21 | provider: system 22 | visibility: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/block.block.claro_page_title.yml: -------------------------------------------------------------------------------- 1 | uuid: 73bcd198-2d1c-4304-86a6-a3b25fb726eb 2 | langcode: en 3 | status: true 4 | dependencies: 5 | theme: 6 | - claro 7 | _core: 8 | default_config_hash: fNwDdW063tk_ktzSWzZVeQS9wzvLooVO280BQ9WrsIs 9 | id: claro_page_title 10 | theme: claro 11 | region: header 12 | weight: -30 13 | provider: null 14 | plugin: page_title_block 15 | settings: 16 | id: page_title_block 17 | label: 'Page title' 18 | label_display: '0' 19 | provider: core 20 | visibility: { } 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/block.block.claro_primary_local_tasks.yml: -------------------------------------------------------------------------------- 1 | uuid: 288fda34-5e01-4a75-93ba-c4dc489ae1f3 2 | langcode: en 3 | status: true 4 | dependencies: 5 | theme: 6 | - claro 7 | _core: 8 | default_config_hash: ACjBZI5shAMiiUpsz-inLYVXDqNNXRnSzAWV3kV_8Hw 9 | id: claro_primary_local_tasks 10 | theme: claro 11 | region: header 12 | weight: 0 13 | provider: null 14 | plugin: local_tasks_block 15 | settings: 16 | id: local_tasks_block 17 | label: 'Primary tabs' 18 | label_display: '0' 19 | provider: core 20 | primary: true 21 | secondary: false 22 | visibility: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/block.block.claro_secondary_local_tasks.yml: -------------------------------------------------------------------------------- 1 | uuid: f304c895-6656-47da-8684-d70ea06470fc 2 | langcode: en 3 | status: true 4 | dependencies: 5 | theme: 6 | - claro 7 | _core: 8 | default_config_hash: 2L0geP-ixCbCkEpW6BVF6H7vDUZN4ea07_Y9CociQm4 9 | id: claro_secondary_local_tasks 10 | theme: claro 11 | region: pre_content 12 | weight: 0 13 | provider: null 14 | plugin: local_tasks_block 15 | settings: 16 | id: local_tasks_block 17 | label: 'Secondary tabs' 18 | label_display: '0' 19 | provider: core 20 | primary: false 21 | secondary: true 22 | visibility: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/core.entity_view_mode.taxonomy_term.full.yml: -------------------------------------------------------------------------------- 1 | uuid: 14399fca-f7f6-4d6b-a7fa-f9c05001bab4 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - taxonomy 7 | _core: 8 | default_config_hash: '-PPKjsNQPvoIDjOuUAvlLocYD976MNjb9Zpgyz5_BWE' 9 | id: taxonomy_term.full 10 | label: 'Taxonomy term page' 11 | targetEntityType: taxonomy_term 12 | cache: true 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/core.entity_view_mode.taxonomy_term.token.yml: -------------------------------------------------------------------------------- 1 | uuid: b7be2319-664c-45fc-b4fd-6f53ef7b8e0e 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - taxonomy 7 | id: taxonomy_term.token 8 | label: Token 9 | targetEntityType: taxonomy_term 10 | cache: true 11 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/field.field.node.article.body.yml: -------------------------------------------------------------------------------- 1 | uuid: 97266e62-c999-4024-86a9-9ffb01e79e47 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.node.body 7 | - node.type.article 8 | module: 9 | - text 10 | _core: 11 | default_config_hash: IjZnOLWk1Pjq3WRg2pLSA1ERh7Po7izCq_p6UztZr2c 12 | id: node.article.body 13 | field_name: body 14 | entity_type: node 15 | bundle: article 16 | label: Body 17 | description: '' 18 | required: false 19 | translatable: true 20 | default_value: { } 21 | default_value_callback: '' 22 | settings: 23 | display_summary: true 24 | required_summary: false 25 | field_type: text_with_summary 26 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/field.field.node.article.field_excerpt.yml: -------------------------------------------------------------------------------- 1 | uuid: 052f4da5-8393-4b87-9141-7faca4df897f 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.node.field_excerpt 7 | - node.type.article 8 | id: node.article.field_excerpt 9 | field_name: field_excerpt 10 | entity_type: node 11 | bundle: article 12 | label: Excerpt 13 | description: 'Add an excerpt for this piece of content. It will also be used for search results and HTML meta tags.' 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: string_long 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/field.storage.node.field_excerpt.yml: -------------------------------------------------------------------------------- 1 | uuid: acd87da4-0666-45f0-b733-3bf72c43d6b5 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - node 7 | id: node.field_excerpt 8 | field_name: field_excerpt 9 | entity_type: node 10 | type: string_long 11 | settings: 12 | case_sensitive: false 13 | module: core 14 | locked: false 15 | cardinality: 1 16 | translatable: true 17 | indexes: { } 18 | persist_with_no_fields: false 19 | custom_storage: false 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/field.storage.node.field_tags.yml: -------------------------------------------------------------------------------- 1 | uuid: 70478878-fb1f-4e70-bdf9-13811ebc446c 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - node 7 | - taxonomy 8 | _core: 9 | default_config_hash: WpOE_bs8Bs_HY2ns7n2r__de-xno0-Bxkqep5-MsHAs 10 | id: node.field_tags 11 | field_name: field_tags 12 | entity_type: node 13 | type: entity_reference 14 | settings: 15 | target_type: taxonomy_term 16 | module: core 17 | locked: false 18 | cardinality: -1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/image.settings.yml: -------------------------------------------------------------------------------- 1 | _core: 2 | default_config_hash: k-yDFHbqNfpe-Srg4sdCSqaosCl2D8uwyEY5esF8gEw 3 | preview_image: core/modules/image/sample.png 4 | allow_insecure_derivatives: false 5 | suppress_itok_output: false 6 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/image.style.large.yml: -------------------------------------------------------------------------------- 1 | uuid: 0c66c87c-2dfb-4104-8297-039f59928907 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: J2n0RpFzS0-bgSyxjs6rSdgxB1rb-bTAgqywNx_964M 7 | name: large 8 | label: 'Large (480×480)' 9 | effects: 10 | ddd73aa7-4bd6-4c85-b600-bdf2b1628d1d: 11 | uuid: ddd73aa7-4bd6-4c85-b600-bdf2b1628d1d 12 | id: image_scale 13 | weight: 0 14 | data: 15 | width: 480 16 | height: 480 17 | upscale: false 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/image.style.medium.yml: -------------------------------------------------------------------------------- 1 | uuid: 3ebdcdb4-8094-4cb1-9a94-b4552d1d3d35 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: Y9NmnZHQq20ASSyTNA6JnwtWrJJiSajOehGDtmUFdM0 7 | name: medium 8 | label: 'Medium (220×220)' 9 | effects: 10 | bddf0d06-42f9-4c75-a700-a33cafa25ea0: 11 | uuid: bddf0d06-42f9-4c75-a700-a33cafa25ea0 12 | id: image_scale 13 | weight: 0 14 | data: 15 | width: 220 16 | height: 220 17 | upscale: false 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/image.style.thumbnail.yml: -------------------------------------------------------------------------------- 1 | uuid: e1bcc8ab-a680-401b-946d-4bc1f040f779 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: cCiWdBHgLwj5omG35lsKc4LkW4MBdmcctkVop4ol5x0 7 | name: thumbnail 8 | label: 'Thumbnail (100×100)' 9 | effects: 10 | 1cfec298-8620-4749-b100-ccb6c4500779: 11 | uuid: 1cfec298-8620-4749-b100-ccb6c4500779 12 | id: image_scale 13 | weight: 0 14 | data: 15 | width: 100 16 | height: 100 17 | upscale: false 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/image.style.wide.yml: -------------------------------------------------------------------------------- 1 | uuid: 822f1e6d-bde0-4764-aef6-ab92f54ab314 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: LswCVLg8z4Zk1u6pV1Dpj1qUj5YY2CQ7_ojx7bJQ8qk 7 | name: wide 8 | label: 'Wide (1090)' 9 | effects: 10 | 09959c15-59ce-4f6d-90df-e2d7cf32bce5: 11 | uuid: 09959c15-59ce-4f6d-90df-e2d7cf32bce5 12 | id: image_scale 13 | weight: 1 14 | data: 15 | width: 1090 16 | height: null 17 | upscale: false 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/menu_link_attributes.config.yml: -------------------------------------------------------------------------------- 1 | attributes: 2 | icon: 3 | label: 'Choose an icon for this menu item' 4 | description: '' 5 | options: 6 | facebook: Facebook 7 | twitter: Twitter 8 | linkedin: Linkedin 9 | wunder: Wunder 10 | default_value: '' 11 | container_class: 12 | label: 'Container class(es)' 13 | description: 'CSS class for the menu list item (<li>). Separate multiple classes by space.' 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/metatag.metatag_defaults.403.yml: -------------------------------------------------------------------------------- 1 | uuid: 22799a05-fa50-46ac-8c95-643eaa668eb2 2 | langcode: en 3 | status: false 4 | dependencies: { } 5 | _core: 6 | default_config_hash: K7OMlOdIhg8uFIfEC9CAEwzFYgyblCiYMhGvtpbf9Ts 7 | id: '403' 8 | label: '403 access denied' 9 | tags: 10 | canonical_url: '[site:url]' 11 | robots: noindex 12 | shortlink: '[site:url]' 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/metatag.metatag_defaults.404.yml: -------------------------------------------------------------------------------- 1 | uuid: 0d43fd91-c913-43e1-b622-0c61eb61b8f5 2 | langcode: en 3 | status: false 4 | dependencies: { } 5 | _core: 6 | default_config_hash: X1umqYNIhsvd6TRId4XearF-kSebLxnZpcHYEjDNGfc 7 | id: '404' 8 | label: '404 page not found' 9 | tags: 10 | canonical_url: '[site:url]' 11 | shortlink: '[site:url]' 12 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/metatag.metatag_defaults.front.yml: -------------------------------------------------------------------------------- 1 | uuid: 912c646d-55a3-4378-8dc4-7ba56c2e7269 2 | langcode: en 3 | status: false 4 | dependencies: { } 5 | _core: 6 | default_config_hash: xWFX2NtQrFSkLvpXLuOIHPJmLKASiuNhTfy5NMaBnfU 7 | id: front 8 | label: 'Front page' 9 | tags: 10 | canonical_url: '[site:url]' 11 | shortlink: '[site:url]' 12 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/metatag.metatag_defaults.global.yml: -------------------------------------------------------------------------------- 1 | uuid: e92068f8-611f-4c7b-9370-0b8100720dcc 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: aUHtGz2Gcten8Ps8emaEO2FHihZ5qr4Ee_--55ODYpo 7 | id: global 8 | label: Global 9 | tags: 10 | title: '[current-page:title]' 11 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/metatag.metatag_defaults.node.yml: -------------------------------------------------------------------------------- 1 | uuid: 0ebd516d-8fef-4bbd-a884-dc619d3133b7 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: z5PLbR0eq823gLc77VNBW8Kxc7USBUHKkd93e_fEJTU 7 | id: node 8 | label: Content 9 | tags: 10 | description: '[node:field_excerpt]' 11 | image_src: '[node:field_image:entity:url]' 12 | title: '[node:title]' 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/metatag.metatag_defaults.taxonomy_term.yml: -------------------------------------------------------------------------------- 1 | uuid: 6d67d5d1-b329-4d2f-a59d-64d89b67e004 2 | langcode: en 3 | status: false 4 | dependencies: { } 5 | _core: 6 | default_config_hash: An43A4r21VtlloBrdPNbqhOaxeHKblzV-ITLf-3T5qg 7 | id: taxonomy_term 8 | label: 'Taxonomy term' 9 | tags: 10 | canonical_url: '[term:url]' 11 | description: '[term:description]' 12 | title: '[term:name] | [site:name]' 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/metatag.metatag_defaults.user.yml: -------------------------------------------------------------------------------- 1 | uuid: 7722b49d-40db-4bc8-9282-aa019bcb356a 2 | langcode: en 3 | status: false 4 | dependencies: { } 5 | _core: 6 | default_config_hash: 5t5AajnOur5KB0soURQ97Rmj8xOk4M2aizO9XREFB9w 7 | id: user 8 | label: User 9 | tags: 10 | canonical_url: '[user:url]' 11 | description: '[site:name]' 12 | title: '[user:display-name] | [site:name]' 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/metatag.settings.yml: -------------------------------------------------------------------------------- 1 | entity_type_groups: { } 2 | tag_trim_method: beforeValue 3 | use_maxlength: true 4 | tag_trim_maxlength: { } 5 | tag_scroll_max_height: '' 6 | tag_trim_end: '|.,-:;/+&([{"''' 7 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/node.type.article.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - menu_ui 6 | third_party_settings: 7 | menu_ui: 8 | available_menus: 9 | - main 10 | parent: 'main:' 11 | _core: 12 | default_config_hash: 1RGmPcLRpUZ2mwPXa8OJKAo6aw89jJGiPKuVhUc6rTs 13 | name: Article 14 | type: article 15 | description: 'Use articles for time-sensitive content like news, press releases or blog posts.' 16 | help: null 17 | new_revision: true 18 | preview_mode: 1 19 | display_submitted: false 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/system.action.taxonomy_term_publish_action.yml: -------------------------------------------------------------------------------- 1 | uuid: 94198aa8-e007-4242-9147-2cea179de578 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - taxonomy 7 | _core: 8 | default_config_hash: DoVt_VGgVLcDD4XmVbSFzr0K17SJy9imFiYusKkJBgY 9 | id: taxonomy_term_publish_action 10 | label: 'Publish taxonomy term' 11 | type: taxonomy_term 12 | plugin: 'entity:publish_action:taxonomy_term' 13 | configuration: { } 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/system.action.taxonomy_term_unpublish_action.yml: -------------------------------------------------------------------------------- 1 | uuid: c84a3812-2d2f-4c9b-9ebe-5c77174a18ae 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - taxonomy 7 | _core: 8 | default_config_hash: z2sNRM3ECa7FPCGnSNje_9SmZJQgwhD_6fG_L4Mr8zI 9 | id: taxonomy_term_unpublish_action 10 | label: 'Unpublish taxonomy term' 11 | type: taxonomy_term 12 | plugin: 'entity:unpublish_action:taxonomy_term' 13 | configuration: { } 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/system.action.user_remove_role_action.administrator.yml: -------------------------------------------------------------------------------- 1 | uuid: ae14e711-7c2b-4ee3-8071-1d28dff4e0cb 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - user.role.administrator 7 | module: 8 | - user 9 | id: user_remove_role_action.administrator 10 | label: 'Remove the Administrator role from the selected user(s)' 11 | type: user 12 | plugin: user_remove_role_action 13 | configuration: 14 | rid: administrator 15 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/taxonomy.settings.yml: -------------------------------------------------------------------------------- 1 | _core: 2 | default_config_hash: zKpaWT6cJc1tVQQaTqatGELaCqU_oyRym6zTl27Yias 3 | maintain_index_table: true 4 | override_selector: false 5 | terms_per_page_admin: 100 6 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/taxonomy.vocabulary.tags.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | name: Tags 5 | vid: tags 6 | description: 'Use tags to group articles on similar topics into categories.' 7 | weight: 0 8 | new_revision: false 9 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_base/config/user.role.administrator.yml: -------------------------------------------------------------------------------- 1 | uuid: 0893bf59-e286-4544-b66a-daf55ad7577a 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: OeKGIkmZA_c-t6QLH81WNQx8gDCc1MRmxaTuQgxBByU 7 | id: administrator 8 | label: Administrator 9 | weight: 3 10 | is_admin: true 11 | permissions: { } 12 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drupal_recipe/wunder_languages", 3 | "description": "Basic language setup", 4 | "type": "drupal-recipe", 5 | "require": { 6 | "drupal/core": "^9.4" 7 | }, 8 | "license": "GPL-2.0-or-later" 9 | } 10 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/config/language.content_settings.menu_link_content.menu_link_content.yml: -------------------------------------------------------------------------------- 1 | uuid: 4468b15a-d92b-4100-80fd-d40484d54d7b 2 | langcode: fi 3 | status: true 4 | dependencies: 5 | module: 6 | - content_translation 7 | - menu_link_content 8 | third_party_settings: 9 | content_translation: 10 | enabled: true 11 | bundle_settings: 12 | untranslatable_fields_hide: '0' 13 | id: menu_link_content.menu_link_content 14 | target_entity_type_id: menu_link_content 15 | target_bundle: menu_link_content 16 | default_langcode: site_default 17 | language_alterable: true 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/config/language.content_settings.node.article.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - node.type.article 6 | module: 7 | - content_translation 8 | third_party_settings: 9 | content_translation: 10 | enabled: true 11 | bundle_settings: 12 | untranslatable_fields_hide: '0' 13 | _core: 14 | default_config_hash: TygDHz2rL3_C5lgC4F1vhgM4G2NMyMcI_Q2i3vPqRiU 15 | id: node.article 16 | target_entity_type_id: node 17 | target_bundle: article 18 | default_langcode: site_default 19 | language_alterable: true 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/config/language.entity.fi.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: fi 5 | label: Finnish 6 | direction: ltr 7 | weight: 1 8 | locked: false 9 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/config/language.entity.sv.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: sv 5 | label: Swedish 6 | direction: ltr 7 | weight: 2 8 | locked: false 9 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/config/language.mappings.yml: -------------------------------------------------------------------------------- 1 | map: 2 | 'no': nb 3 | pt: pt-pt 4 | zh: zh-hans 5 | zh-tw: zh-hant 6 | zh-hk: zh-hant 7 | zh-mo: zh-hant 8 | zh-cht: zh-hant 9 | zh-cn: zh-hans 10 | zh-sg: zh-hans 11 | zh-chs: zh-hans 12 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/config/language.negotiation.yml: -------------------------------------------------------------------------------- 1 | session: 2 | parameter: language 3 | url: 4 | source: path_prefix 5 | prefixes: 6 | en: en 7 | fi: fi 8 | sv: sv 9 | domains: 10 | en: '' 11 | fi: '' 12 | sv: '' 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/config/locale.settings.yml: -------------------------------------------------------------------------------- 1 | cache_strings: true 2 | translate_english: false 3 | javascript: 4 | directory: languages 5 | translation: 6 | use_source: remote_and_local 7 | default_filename: '%project-%version.%language.po' 8 | default_server_pattern: 'https://ftp.drupal.org/files/translations/%core/%project/%project-%version.%language.po' 9 | overwrite_customized: false 10 | overwrite_not_customized: true 11 | update_interval_days: 0 12 | path: sites/default/files/translations 13 | import_enabled: true 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_languages/recipe.yml: -------------------------------------------------------------------------------- 1 | # A recipe that sets up the basic language setup for a site. 2 | name: 'Wunder languages' 3 | description: "A recipe to set up basic language setup for a site." 4 | type: 'Configuration' 5 | recipes: 6 | - wunder_base 7 | install: 8 | - language 9 | - config_translation 10 | - content_translation 11 | - locale 12 | - file 13 | - tour 14 | config: 15 | import: 16 | language: '*' 17 | config_translation: '*' 18 | content_translation: '*' 19 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drupal_recipe/wunder_media", 3 | "description": "Basic setup for the media module with translations", 4 | "type": "drupal-recipe", 5 | "require": { 6 | "drupal/core": "^9.4" 7 | }, 8 | "license": "GPL-2.0-or-later" 9 | } 10 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.audio.changed.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.audio 6 | id: media.audio.changed 7 | field_name: changed 8 | entity_type: media 9 | bundle: audio 10 | label: Changed 11 | description: 'The time the media item was last edited.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: '' 16 | settings: { } 17 | field_type: changed 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.audio.created.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.audio 6 | id: media.audio.created 7 | field_name: created 8 | entity_type: media 9 | bundle: audio 10 | label: 'Authored on' 11 | description: 'The time the media item was created.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getRequestTime' 16 | settings: { } 17 | field_type: created 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.audio.name.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.audio 6 | id: media.audio.name 7 | field_name: name 8 | entity_type: media 9 | bundle: audio 10 | label: Name 11 | description: '' 12 | required: true 13 | translatable: true 14 | default_value: 15 | - 16 | value: '' 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: string 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.audio.path.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.audio 6 | module: 7 | - path 8 | id: media.audio.path 9 | field_name: path 10 | entity_type: media 11 | bundle: audio 12 | label: 'URL alias' 13 | description: '' 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: path 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.audio.status.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.audio 6 | id: media.audio.status 7 | field_name: status 8 | entity_type: media 9 | bundle: audio 10 | label: Published 11 | description: '' 12 | required: false 13 | translatable: false 14 | default_value: 15 | - 16 | value: 1 17 | default_value_callback: '' 18 | settings: 19 | on_label: 'On' 20 | off_label: 'Off' 21 | field_type: boolean 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.audio.uid.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.audio 6 | id: media.audio.uid 7 | field_name: uid 8 | entity_type: media 9 | bundle: audio 10 | label: 'Authored by' 11 | description: 'The user ID of the author.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getDefaultEntityOwner' 16 | settings: 17 | handler: default 18 | handler_settings: { } 19 | field_type: entity_reference 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.document.changed.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.document 6 | id: media.document.changed 7 | field_name: changed 8 | entity_type: media 9 | bundle: document 10 | label: Changed 11 | description: 'The time the media item was last edited.' 12 | required: false 13 | translatable: true 14 | default_value: { } 15 | default_value_callback: '' 16 | settings: { } 17 | field_type: changed 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.document.created.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.document 6 | id: media.document.created 7 | field_name: created 8 | entity_type: media 9 | bundle: document 10 | label: 'Authored on' 11 | description: 'The time the media item was created.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getRequestTime' 16 | settings: { } 17 | field_type: created 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.document.path.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.document 6 | module: 7 | - path 8 | id: media.document.path 9 | field_name: path 10 | entity_type: media 11 | bundle: document 12 | label: 'URL alias' 13 | description: '' 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: path 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.document.status.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.document 6 | id: media.document.status 7 | field_name: status 8 | entity_type: media 9 | bundle: document 10 | label: Published 11 | description: '' 12 | required: false 13 | translatable: false 14 | default_value: 15 | - 16 | value: 1 17 | default_value_callback: '' 18 | settings: 19 | on_label: 'On' 20 | off_label: 'Off' 21 | field_type: boolean 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.document.uid.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.document 6 | id: media.document.uid 7 | field_name: uid 8 | entity_type: media 9 | bundle: document 10 | label: 'Authored by' 11 | description: 'The user ID of the author.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getDefaultEntityOwner' 16 | settings: 17 | handler: default 18 | handler_settings: { } 19 | field_type: entity_reference 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.image.changed.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.image 6 | id: media.image.changed 7 | field_name: changed 8 | entity_type: media 9 | bundle: image 10 | label: Changed 11 | description: 'The time the media item was last edited.' 12 | required: false 13 | translatable: true 14 | default_value: { } 15 | default_value_callback: '' 16 | settings: { } 17 | field_type: changed 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.image.created.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.image 6 | id: media.image.created 7 | field_name: created 8 | entity_type: media 9 | bundle: image 10 | label: 'Authored on' 11 | description: 'The time the media item was created.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getRequestTime' 16 | settings: { } 17 | field_type: created 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.image.path.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.image 6 | module: 7 | - path 8 | id: media.image.path 9 | field_name: path 10 | entity_type: media 11 | bundle: image 12 | label: 'URL alias' 13 | description: '' 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: path 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.image.status.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.image 6 | id: media.image.status 7 | field_name: status 8 | entity_type: media 9 | bundle: image 10 | label: Published 11 | description: '' 12 | required: false 13 | translatable: false 14 | default_value: 15 | - 16 | value: 1 17 | default_value_callback: '' 18 | settings: 19 | on_label: 'On' 20 | off_label: 'Off' 21 | field_type: boolean 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.image.uid.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.image 6 | id: media.image.uid 7 | field_name: uid 8 | entity_type: media 9 | bundle: image 10 | label: 'Authored by' 11 | description: 'The user ID of the author.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getDefaultEntityOwner' 16 | settings: 17 | handler: default 18 | handler_settings: { } 19 | field_type: entity_reference 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.remote_video.changed.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.remote_video 6 | id: media.remote_video.changed 7 | field_name: changed 8 | entity_type: media 9 | bundle: remote_video 10 | label: Changed 11 | description: 'The time the media item was last edited.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: '' 16 | settings: { } 17 | field_type: changed 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.remote_video.created.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.remote_video 6 | id: media.remote_video.created 7 | field_name: created 8 | entity_type: media 9 | bundle: remote_video 10 | label: 'Authored on' 11 | description: 'The time the media item was created.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getRequestTime' 16 | settings: { } 17 | field_type: created 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.remote_video.name.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.remote_video 6 | id: media.remote_video.name 7 | field_name: name 8 | entity_type: media 9 | bundle: remote_video 10 | label: Name 11 | description: '' 12 | required: true 13 | translatable: true 14 | default_value: 15 | - 16 | value: '' 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: string 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.remote_video.path.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.remote_video 6 | module: 7 | - path 8 | id: media.remote_video.path 9 | field_name: path 10 | entity_type: media 11 | bundle: remote_video 12 | label: 'URL alias' 13 | description: '' 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: path 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.remote_video.status.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.remote_video 6 | id: media.remote_video.status 7 | field_name: status 8 | entity_type: media 9 | bundle: remote_video 10 | label: Published 11 | description: '' 12 | required: false 13 | translatable: false 14 | default_value: 15 | - 16 | value: 1 17 | default_value_callback: '' 18 | settings: 19 | on_label: 'On' 20 | off_label: 'Off' 21 | field_type: boolean 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.remote_video.uid.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.remote_video 6 | id: media.remote_video.uid 7 | field_name: uid 8 | entity_type: media 9 | bundle: remote_video 10 | label: 'Authored by' 11 | description: 'The user ID of the author.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getDefaultEntityOwner' 16 | settings: 17 | handler: default 18 | handler_settings: { } 19 | field_type: entity_reference 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.video.changed.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.video 6 | id: media.video.changed 7 | field_name: changed 8 | entity_type: media 9 | bundle: video 10 | label: Changed 11 | description: 'The time the media item was last edited.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: '' 16 | settings: { } 17 | field_type: changed 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.video.created.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.video 6 | id: media.video.created 7 | field_name: created 8 | entity_type: media 9 | bundle: video 10 | label: 'Authored on' 11 | description: 'The time the media item was created.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getRequestTime' 16 | settings: { } 17 | field_type: created 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.video.path.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.video 6 | module: 7 | - path 8 | id: media.video.path 9 | field_name: path 10 | entity_type: media 11 | bundle: video 12 | label: 'URL alias' 13 | description: '' 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: path 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.video.status.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.video 6 | id: media.video.status 7 | field_name: status 8 | entity_type: media 9 | bundle: video 10 | label: Published 11 | description: '' 12 | required: false 13 | translatable: false 14 | default_value: 15 | - 16 | value: 1 17 | default_value_callback: '' 18 | settings: 19 | on_label: 'On' 20 | off_label: 'Off' 21 | field_type: boolean 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.base_field_override.media.video.uid.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.video 6 | id: media.video.uid 7 | field_name: uid 8 | entity_type: media 9 | bundle: video 10 | label: 'Authored by' 11 | description: 'The user ID of the author.' 12 | required: false 13 | translatable: false 14 | default_value: { } 15 | default_value_callback: 'Drupal\media\Entity\Media::getDefaultEntityOwner' 16 | settings: 17 | handler: default 18 | handler_settings: { } 19 | field_type: entity_reference 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.entity_form_mode.media.media_library.yml: -------------------------------------------------------------------------------- 1 | uuid: 47907c20-0436-4e6e-9074-e1019686986c 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - media 7 | enforced: 8 | module: 9 | - media_library 10 | _core: 11 | default_config_hash: Tdhz-aDHfDoV1Ul9umtItxGTrjkFzoNAkDw8FWXjYA0 12 | id: media.media_library 13 | label: 'Media library' 14 | targetEntityType: media 15 | cache: true 16 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/core.entity_view_mode.media.media_library.yml: -------------------------------------------------------------------------------- 1 | uuid: 3bab7bd6-665e-4a0f-b9ff-3c6ebc6b85c3 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - media 7 | enforced: 8 | module: 9 | - media_library 10 | _core: 11 | default_config_hash: Tdhz-aDHfDoV1Ul9umtItxGTrjkFzoNAkDw8FWXjYA0 12 | id: media.media_library 13 | label: 'Media library' 14 | targetEntityType: media 15 | cache: true 16 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/field.field.media.remote_video.field_media_oembed_video.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - field.storage.media.field_media_oembed_video 6 | - media.type.remote_video 7 | id: media.remote_video.field_media_oembed_video 8 | field_name: field_media_oembed_video 9 | entity_type: media 10 | bundle: remote_video 11 | label: 'Video URL' 12 | description: '' 13 | required: true 14 | translatable: true 15 | default_value: { } 16 | default_value_callback: '' 17 | settings: { } 18 | field_type: string 19 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/field.storage.media.field_media_audio_file.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - file 6 | - media 7 | id: media.field_media_audio_file 8 | field_name: field_media_audio_file 9 | entity_type: media 10 | type: file 11 | settings: 12 | target_type: file 13 | display_field: false 14 | display_default: false 15 | uri_scheme: public 16 | module: file 17 | locked: false 18 | cardinality: 1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/field.storage.media.field_media_document.yml: -------------------------------------------------------------------------------- 1 | uuid: 99b6ddfc-7261-4379-afea-b59ac9d857f6 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - file 7 | - media 8 | enforced: 9 | module: 10 | - media 11 | id: media.field_media_document 12 | field_name: field_media_document 13 | entity_type: media 14 | type: file 15 | settings: 16 | target_type: file 17 | display_field: false 18 | display_default: false 19 | uri_scheme: public 20 | module: file 21 | locked: false 22 | cardinality: 1 23 | translatable: true 24 | indexes: { } 25 | persist_with_no_fields: false 26 | custom_storage: false 27 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/field.storage.media.field_media_oembed_video.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - media 6 | id: media.field_media_oembed_video 7 | field_name: field_media_oembed_video 8 | entity_type: media 9 | type: string 10 | settings: 11 | max_length: 255 12 | case_sensitive: false 13 | is_ascii: false 14 | module: core 15 | locked: false 16 | cardinality: 1 17 | translatable: true 18 | indexes: { } 19 | persist_with_no_fields: false 20 | custom_storage: false 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/field.storage.media.field_media_video_file.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - file 6 | - media 7 | id: media.field_media_video_file 8 | field_name: field_media_video_file 9 | entity_type: media 10 | type: file 11 | settings: 12 | target_type: file 13 | display_field: false 14 | display_default: false 15 | uri_scheme: public 16 | module: file 17 | locked: false 18 | cardinality: 1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/image.style.media_library.yml: -------------------------------------------------------------------------------- 1 | uuid: 15d237c3-c75b-44c6-88eb-28cfaca14bb0 2 | langcode: en 3 | status: true 4 | dependencies: 5 | enforced: 6 | module: 7 | - media_library 8 | _core: 9 | default_config_hash: 7qJqToD1OQLAyeswpmg7M0LRxQlw1URQkJDWUJCnmR8 10 | name: media_library 11 | label: 'Media Library thumbnail (220×220)' 12 | effects: 13 | 75b076a8-1234-4b42-85db-bf377c4d8d5f: 14 | uuid: 75b076a8-1234-4b42-85db-bf377c4d8d5f 15 | id: image_scale 16 | weight: 0 17 | data: 18 | width: 220 19 | height: 220 20 | upscale: false 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/language.content_settings.media.audio.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.audio 6 | module: 7 | - content_translation 8 | third_party_settings: 9 | content_translation: 10 | enabled: true 11 | bundle_settings: 12 | untranslatable_fields_hide: '0' 13 | id: media.audio 14 | target_entity_type_id: media 15 | target_bundle: audio 16 | default_langcode: site_default 17 | language_alterable: true 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/language.content_settings.media.document.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.document 6 | module: 7 | - content_translation 8 | third_party_settings: 9 | content_translation: 10 | enabled: true 11 | bundle_settings: 12 | untranslatable_fields_hide: '0' 13 | id: media.document 14 | target_entity_type_id: media 15 | target_bundle: document 16 | default_langcode: site_default 17 | language_alterable: true 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/language.content_settings.media.image.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.image 6 | module: 7 | - content_translation 8 | third_party_settings: 9 | content_translation: 10 | enabled: true 11 | bundle_settings: 12 | untranslatable_fields_hide: '0' 13 | id: media.image 14 | target_entity_type_id: media 15 | target_bundle: image 16 | default_langcode: site_default 17 | language_alterable: true 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/language.content_settings.media.remote_video.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.remote_video 6 | module: 7 | - content_translation 8 | third_party_settings: 9 | content_translation: 10 | enabled: true 11 | bundle_settings: 12 | untranslatable_fields_hide: '0' 13 | id: media.remote_video 14 | target_entity_type_id: media 15 | target_bundle: remote_video 16 | default_langcode: site_default 17 | language_alterable: true 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/language.content_settings.media.video.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - media.type.video 6 | module: 7 | - content_translation 8 | third_party_settings: 9 | content_translation: 10 | enabled: true 11 | bundle_settings: 12 | untranslatable_fields_hide: '0' 13 | id: media.video 14 | target_entity_type_id: media 15 | target_bundle: video 16 | default_langcode: site_default 17 | language_alterable: true 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/media.settings.yml: -------------------------------------------------------------------------------- 1 | icon_base_uri: 'public://media-icons/generic' 2 | iframe_domain: '' 3 | oembed_providers_url: 'https://oembed.com/providers.json' 4 | standalone_url: false 5 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/media.type.audio.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: audio 5 | label: Audio 6 | description: 'A locally hosted audio file.' 7 | source: audio_file 8 | queue_thumbnail_downloads: false 9 | new_revision: true 10 | source_configuration: 11 | source_field: field_media_audio_file 12 | field_map: 13 | name: name 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/media.type.document.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: document 5 | label: Document 6 | description: 'An uploaded file or document, such as a PDF.' 7 | source: file 8 | queue_thumbnail_downloads: false 9 | new_revision: true 10 | source_configuration: 11 | source_field: field_media_document 12 | field_map: 13 | name: name 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/media.type.image.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: image 5 | label: Image 6 | description: 'Use local images for reusable media.' 7 | source: image 8 | queue_thumbnail_downloads: false 9 | new_revision: true 10 | source_configuration: 11 | source_field: field_media_image 12 | field_map: 13 | name: name 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/media.type.remote_video.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: remote_video 5 | label: 'Remote video' 6 | description: 'A remotely hosted video from YouTube or Vimeo.' 7 | source: 'oembed:video' 8 | queue_thumbnail_downloads: false 9 | new_revision: true 10 | source_configuration: 11 | source_field: field_media_oembed_video 12 | thumbnails_directory: 'public://oembed_thumbnails/[date:custom:Y-m]' 13 | providers: 14 | - YouTube 15 | - Vimeo 16 | field_map: 17 | title: name 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/media.type.video.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: video 5 | label: Video 6 | description: 'A locally hosted video file.' 7 | source: video_file 8 | queue_thumbnail_downloads: false 9 | new_revision: true 10 | source_configuration: 11 | source_field: field_media_video_file 12 | field_map: 13 | name: name 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_media/config/media_library.settings.yml: -------------------------------------------------------------------------------- 1 | _core: 2 | default_config_hash: _3gQsCnZELUjUUqHk8SSh8bXnx7TZwN95vctAeVJG60 3 | advanced_ui: false 4 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/README.md: -------------------------------------------------------------------------------- 1 | ### Wunder Next setup recipe 2 | 3 | ### Manual Installation instructions 4 | 5 | The recipe can be installed using these commands: 6 | 7 | 1. `lando install-recipe wunder_next_setup` 8 | 2. `lando drush cex -y` <- export your configuration 9 | 3. commit the configuration 10 | 11 | ### Testing on an empty site 12 | 13 | (Caution, this command will re-install the site) 14 | 15 | ```shell 16 | lando drush si -y && lando install-recipe wunder_next_setup && lando drush uli 17 | ``` 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/graphql.graphql_servers.graphql_compose_server.yml: -------------------------------------------------------------------------------- 1 | uuid: 6bafc5e2-9925-4d14-a55f-c17d58ce497d 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: T3HZBFRHojWkC3xLaOnnmqy-alQmFemc-xsfb1OWc3k 7 | name: graphql_compose_server 8 | label: 'GraphQL Compose - Server' 9 | schema: graphql_compose 10 | schema_configuration: 11 | graphql_compose: 12 | enabled: true 13 | persisted_queries_settings: { } 14 | endpoint: /graphql 15 | debug_flag: 0 16 | caching: true 17 | batching: true 18 | disable_introspection: false 19 | query_depth: null 20 | query_complexity: null 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/graphql.settings.yml: -------------------------------------------------------------------------------- 1 | dataproducer_populate_default_values: false 2 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/next.next_entity_type_config.node.article.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: node.article 5 | site_resolver: site_selector 6 | configuration: 7 | sites: 8 | frontend: frontend 9 | field_name: { } 10 | revalidator: path 11 | revalidator_configuration: 12 | revalidate_page: true 13 | additional_paths: "/\r\n/fi\r\n/en\r\n/sv\r\n/all-articles\r\n/fi/all-articles\r\n/sv/all-articles" 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/next.next_entity_type_config.node.frontpage.yml: -------------------------------------------------------------------------------- 1 | uuid: 8772fee2-6539-43ad-bfbe-0932ee183285 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | id: node.frontpage 6 | site_resolver: site_selector 7 | configuration: 8 | sites: 9 | frontend: frontend 10 | revalidator: path 11 | revalidator_configuration: 12 | revalidate_page: true 13 | additional_paths: "/\r\n/fi\r\n/en\r\n/sv" 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/next.next_entity_type_config.node.landing_page.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: node.page 5 | site_resolver: site_selector 6 | configuration: 7 | sites: 8 | frontend: frontend 9 | field_name: { } 10 | revalidator: path 11 | revalidator_configuration: 12 | revalidate_page: true 13 | additional_paths: '' 14 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/next.next_site.frontend.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: frontend 5 | label: 'Next.js frontend' 6 | base_url: 'http://localhost:3000' 7 | preview_url: 'http://localhost:3000/api/draft' 8 | preview_secret: null 9 | revalidate_url: 'http://localhost:3000/api/revalidate' 10 | revalidate_secret: null 11 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/next.settings.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | site_previewer: iframe 3 | site_previewer_configuration: 4 | width: 100% 5 | sync_route: false 6 | sync_route_skip_routes: '' 7 | preview_url_generator: simple_oauth 8 | preview_url_generator_configuration: 9 | secret_expiration: 120 10 | debug: false 11 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/pathauto.pattern.article.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - node 6 | id: article 7 | label: Article 8 | type: 'canonical_entities:node' 9 | pattern: 'articles/[node:title]' 10 | selection_criteria: 11 | a9b68e06-b00d-415a-8216-9f2c6eb0e4ba: 12 | id: 'entity_bundle:node' 13 | negate: false 14 | uuid: a9b68e06-b00d-415a-8216-9f2c6eb0e4ba 15 | context_mapping: 16 | node: node 17 | bundles: 18 | article: article 19 | selection_logic: and 20 | weight: -5 21 | relationships: { } 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/redirect.settings.yml: -------------------------------------------------------------------------------- 1 | auto_redirect: true 2 | default_status_code: 301 3 | passthrough_querystring: true 4 | warning: false 5 | ignore_admin_path: false 6 | access_check: false 7 | route_normalizer_enabled: true 8 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/registration_role.setting.yml: -------------------------------------------------------------------------------- 1 | role_to_select: 2 | frontend_login: frontend_login 3 | registration_mode: user 4 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/rest.resource.user_registration.yml: -------------------------------------------------------------------------------- 1 | uuid: dc97a2e7-8c4d-4490-a843-7f3fe946f2a7 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - serialization 7 | - simple_oauth 8 | - user 9 | id: user_registration 10 | plugin_id: user_registration 11 | granularity: resource 12 | configuration: 13 | methods: 14 | - POST 15 | formats: 16 | - json 17 | authentication: 18 | - oauth2 19 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/rest.resource.webform_rest_complete_submission.yml: -------------------------------------------------------------------------------- 1 | uuid: a3c0b743-cd75-4166-8b44-66616e6915a0 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - serialization 7 | - simple_oauth 8 | - user 9 | - webform_rest 10 | id: webform_rest_complete_submission 11 | plugin_id: webform_rest_complete_submission 12 | granularity: resource 13 | configuration: 14 | methods: 15 | - GET 16 | formats: 17 | - json 18 | authentication: 19 | - oauth2 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/rest.resource.webform_rest_submit.yml: -------------------------------------------------------------------------------- 1 | uuid: 08aacdcc-267d-4020-9272-833b05ab5ab5 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - serialization 7 | - simple_oauth 8 | - webform_rest 9 | id: webform_rest_submit 10 | plugin_id: webform_rest_submit 11 | granularity: resource 12 | configuration: 13 | methods: 14 | - POST 15 | formats: 16 | - json 17 | authentication: 18 | - oauth2 19 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/simple_oauth.settings.yml: -------------------------------------------------------------------------------- 1 | access_token_expiration: 432000 2 | authorization_code_expiration: 432000 3 | refresh_token_expiration: 1209600 4 | token_cron_batch_size: 0 5 | public_key: ../oauth/public.key 6 | private_key: ../oauth/private.key 7 | remember_clients: true 8 | use_implicit: false 9 | disable_openid_connect: false 10 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/user.role.frontend_login.yml: -------------------------------------------------------------------------------- 1 | uuid: a5fcc86f-03e6-4553-9b19-d80ac853cad5 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - rest.resource.webform_rest_complete_submission 7 | - rest.resource.webform_rest_submit 8 | module: 9 | - rest 10 | - webform 11 | _core: 12 | default_config_hash: PuY_dim2YD9Lz-_MokKp_UhLIVY1z_VOwA1w5upSfIA 13 | id: frontend_login 14 | label: 'Frontend login user' 15 | weight: 6 16 | is_admin: null 17 | permissions: 18 | - 'restful get webform_rest_complete_submission' 19 | - 'restful post webform_rest_submit' 20 | - 'view own webform submission' 21 | 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/user.role.next_api_role.yml: -------------------------------------------------------------------------------- 1 | uuid: cdde3d87-907c-4a64-bede-812b1583a0be 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - graphql 7 | - media 8 | - node 9 | - subrequests 10 | - graphql_compose 11 | - graphql_compose_preview 12 | id: next_api_role 13 | label: 'API Previewer' 14 | weight: 4 15 | is_admin: null 16 | permissions: 17 | - 'access user profiles' 18 | - 'bypass graphql access' 19 | - 'bypass node access' 20 | - 'execute graphql_compose_server arbitrary graphql requests' 21 | - 'issue subrequests' 22 | - 'view all media revisions' 23 | - 'view all revisions' 24 | - 'view graphql_compose_preview entity' 25 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_next_setup/config/user.role.next_api_viewer_role.yml: -------------------------------------------------------------------------------- 1 | uuid: f96e1f7b-4228-421c-8fca-442935315073 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - graphql 7 | - subrequests 8 | id: next_api_viewer_role 9 | label: 'API Viewer' 10 | weight: 7 11 | is_admin: null 12 | permissions: 13 | - 'execute graphql_compose_server arbitrary graphql requests' 14 | - 'issue subrequests' 15 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drupal_recipe/wunder_pages", 3 | "description": "Wunder articles section example recipe", 4 | "type": "drupal-recipe", 5 | "require": { 6 | "drupal/core": "^9.4", 7 | "drupal/pathauto": "^1.11", 8 | "drupal/paragraphs": "^1.15" 9 | }, 10 | "license": "GPL-2.0-or-later" 11 | } 12 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.base_field_override.node.frontpage.promote.yml: -------------------------------------------------------------------------------- 1 | uuid: 0cfed645-1ed6-4dca-9fea-faf7b0096c58 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - node.type.frontpage 7 | id: node.frontpage.promote 8 | field_name: promote 9 | entity_type: node 10 | bundle: frontpage 11 | label: 'Promoted to front page' 12 | description: '' 13 | required: false 14 | translatable: true 15 | default_value: 16 | - 17 | value: 0 18 | default_value_callback: '' 19 | settings: 20 | on_label: 'On' 21 | off_label: 'Off' 22 | field_type: boolean 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.base_field_override.paragraph.formatted_text.created.yml: -------------------------------------------------------------------------------- 1 | uuid: c79f51e6-4dde-453f-97a7-836724a34fd7 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.formatted_text 7 | id: paragraph.formatted_text.created 8 | field_name: created 9 | entity_type: paragraph 10 | bundle: formatted_text 11 | label: 'Authored on' 12 | description: 'The time that the Paragraph was created.' 13 | required: false 14 | translatable: false 15 | default_value: { } 16 | default_value_callback: '' 17 | settings: { } 18 | field_type: created 19 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.base_field_override.paragraph.formatted_text.status.yml: -------------------------------------------------------------------------------- 1 | uuid: fcce6937-beb7-4b18-93ca-7cd48d890dc7 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.formatted_text 7 | id: paragraph.formatted_text.status 8 | field_name: status 9 | entity_type: paragraph 10 | bundle: formatted_text 11 | label: Published 12 | description: '' 13 | required: false 14 | translatable: true 15 | default_value: 16 | - 17 | value: 1 18 | default_value_callback: '' 19 | settings: 20 | on_label: 'On' 21 | off_label: 'Off' 22 | field_type: boolean 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.base_field_override.paragraph.image.created.yml: -------------------------------------------------------------------------------- 1 | uuid: 2a95b405-4dbf-4108-8e7a-dd3c7a277dc8 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.image 7 | id: paragraph.image.created 8 | field_name: created 9 | entity_type: paragraph 10 | bundle: image 11 | label: 'Authored on' 12 | description: 'The time that the Paragraph was created.' 13 | required: false 14 | translatable: false 15 | default_value: { } 16 | default_value_callback: '' 17 | settings: { } 18 | field_type: created 19 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.base_field_override.paragraph.image.status.yml: -------------------------------------------------------------------------------- 1 | uuid: 8770e226-3a13-4771-b20b-0c6f1ab140b1 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.image 7 | id: paragraph.image.status 8 | field_name: status 9 | entity_type: paragraph 10 | bundle: image 11 | label: Published 12 | description: '' 13 | required: false 14 | translatable: true 15 | default_value: 16 | - 17 | value: 1 18 | default_value_callback: '' 19 | settings: 20 | on_label: 'On' 21 | off_label: 'Off' 22 | field_type: boolean 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.base_field_override.paragraph.video.created.yml: -------------------------------------------------------------------------------- 1 | uuid: 23b5b72f-4b47-4872-8977-be20dc613c3c 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.video 7 | id: paragraph.video.created 8 | field_name: created 9 | entity_type: paragraph 10 | bundle: video 11 | label: 'Authored on' 12 | description: 'The time that the Paragraph was created.' 13 | required: false 14 | translatable: false 15 | default_value: { } 16 | default_value_callback: '' 17 | settings: { } 18 | field_type: created 19 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.base_field_override.paragraph.video.status.yml: -------------------------------------------------------------------------------- 1 | uuid: 2c164421-b5cf-4175-9e5c-0376861638b7 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.video 7 | id: paragraph.video.status 8 | field_name: status 9 | entity_type: paragraph 10 | bundle: video 11 | label: Published 12 | description: '' 13 | required: false 14 | translatable: true 15 | default_value: 16 | - 17 | value: 1 18 | default_value_callback: '' 19 | settings: 20 | on_label: 'On' 21 | off_label: 'Off' 22 | field_type: boolean 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.entity_form_display.paragraph.image.default.yml: -------------------------------------------------------------------------------- 1 | uuid: 1242f020-0fea-41c7-9e8b-9e950cf3f13b 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.field.paragraph.image.field_image 7 | - paragraphs.paragraphs_type.image 8 | module: 9 | - media_library 10 | id: paragraph.image.default 11 | targetEntityType: paragraph 12 | bundle: image 13 | mode: default 14 | content: 15 | field_image: 16 | type: media_library_widget 17 | weight: 1 18 | region: content 19 | settings: 20 | media_types: { } 21 | third_party_settings: { } 22 | hidden: 23 | created: true 24 | status: true 25 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.entity_form_display.paragraph.links.default.yml: -------------------------------------------------------------------------------- 1 | uuid: 23bced58-4188-44ef-8824-4c6e22d7b956 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.field.paragraph.links.field_links 7 | - paragraphs.paragraphs_type.links 8 | module: 9 | - link 10 | id: paragraph.links.default 11 | targetEntityType: paragraph 12 | bundle: links 13 | mode: default 14 | content: 15 | field_links: 16 | type: link_default 17 | weight: 0 18 | region: content 19 | settings: 20 | placeholder_url: '' 21 | placeholder_title: '' 22 | third_party_settings: { } 23 | hidden: 24 | created: true 25 | status: true 26 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.entity_form_display.paragraph.video.default.yml: -------------------------------------------------------------------------------- 1 | uuid: 9aded2f4-ea94-4fbc-9cf6-63a4b01c0920 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.field.paragraph.video.field_video 7 | - paragraphs.paragraphs_type.video 8 | module: 9 | - media_library 10 | id: paragraph.video.default 11 | targetEntityType: paragraph 12 | bundle: video 13 | mode: default 14 | content: 15 | field_video: 16 | type: media_library_widget 17 | weight: 0 18 | region: content 19 | settings: 20 | media_types: { } 21 | third_party_settings: { } 22 | hidden: 23 | created: true 24 | status: true 25 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.entity_view_display.paragraph.formatted_text.default.yml: -------------------------------------------------------------------------------- 1 | uuid: 8e1db294-ec78-47af-9d67-e73f3937865f 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.field.paragraph.formatted_text.field_formatted_text 7 | - paragraphs.paragraphs_type.formatted_text 8 | module: 9 | - text 10 | id: paragraph.formatted_text.default 11 | targetEntityType: paragraph 12 | bundle: formatted_text 13 | mode: default 14 | content: 15 | field_formatted_text: 16 | type: text_default 17 | label: hidden 18 | settings: { } 19 | third_party_settings: { } 20 | weight: 0 21 | region: content 22 | hidden: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.entity_view_display.paragraph.image.default.yml: -------------------------------------------------------------------------------- 1 | uuid: 30ef22d8-f55e-4c82-92b8-4061f2119c13 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.field.paragraph.image.field_image 7 | - paragraphs.paragraphs_type.image 8 | id: paragraph.image.default 9 | targetEntityType: paragraph 10 | bundle: image 11 | mode: default 12 | content: 13 | field_image: 14 | type: entity_reference_entity_view 15 | label: hidden 16 | settings: 17 | view_mode: default 18 | link: false 19 | third_party_settings: { } 20 | weight: 0 21 | region: content 22 | hidden: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.entity_view_display.paragraph.links.default.yml: -------------------------------------------------------------------------------- 1 | uuid: 8ca3dcfd-5482-4a74-8ded-d0ea01fa1bcf 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.field.paragraph.links.field_links 7 | - paragraphs.paragraphs_type.links 8 | module: 9 | - link 10 | id: paragraph.links.default 11 | targetEntityType: paragraph 12 | bundle: links 13 | mode: default 14 | content: 15 | field_links: 16 | type: link 17 | label: above 18 | settings: 19 | trim_length: 80 20 | url_only: false 21 | url_plain: false 22 | rel: '' 23 | target: '' 24 | third_party_settings: { } 25 | weight: 0 26 | region: content 27 | hidden: { } 28 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/core.entity_view_display.paragraph.video.default.yml: -------------------------------------------------------------------------------- 1 | uuid: ba7880bf-f523-42f1-a7d0-d3d42c2511d4 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.field.paragraph.video.field_video 7 | - paragraphs.paragraphs_type.video 8 | id: paragraph.video.default 9 | targetEntityType: paragraph 10 | bundle: video 11 | mode: default 12 | content: 13 | field_video: 14 | type: entity_reference_entity_view 15 | label: hidden 16 | settings: 17 | view_mode: default 18 | link: false 19 | third_party_settings: { } 20 | weight: 0 21 | region: content 22 | hidden: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.node.frontpage.field_excerpt.yml: -------------------------------------------------------------------------------- 1 | uuid: 239e4b0e-fc34-41b2-8602-3fd833c6ee5d 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.node.field_excerpt 7 | - node.type.frontpage 8 | id: node.frontpage.field_excerpt 9 | field_name: field_excerpt 10 | entity_type: node 11 | bundle: frontpage 12 | label: Excerpt 13 | description: "Add an excerpt for this piece of content. It will also be used for search results and HTML meta tags." 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: string_long 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.node.page.field_excerpt.yml: -------------------------------------------------------------------------------- 1 | uuid: 9e655c6e-20c9-4ff1-9b74-331b3c7d9595 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.node.field_excerpt 7 | - node.type.page 8 | id: node.page.field_excerpt 9 | field_name: field_excerpt 10 | entity_type: node 11 | bundle: page 12 | label: Excerpt 13 | description: 'Add an excerpt for this piece of content. It will also be used for search results and HTML meta tags.' 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: string_long 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.accordion.field_heading.yml: -------------------------------------------------------------------------------- 1 | uuid: 64ba8cf9-9dd5-403b-898d-a9988c773134 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_heading 7 | - paragraphs.paragraphs_type.accordion 8 | _core: 9 | default_config_hash: 1a5xkcQfDV4o96h32CxJE7KUxF8rd3G6Cqr0nAIAUHo 10 | id: paragraph.accordion.field_heading 11 | field_name: field_heading 12 | entity_type: paragraph 13 | bundle: accordion 14 | label: Heading 15 | description: 'Heading for the whole accordion' 16 | required: false 17 | translatable: true 18 | default_value: { } 19 | default_value_callback: '' 20 | settings: { } 21 | field_type: string 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.accordion_item.field_heading.yml: -------------------------------------------------------------------------------- 1 | uuid: d59a22a7-904c-47ea-bccf-839269f4f69f 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_heading 7 | - paragraphs.paragraphs_type.accordion_item 8 | _core: 9 | default_config_hash: vpP513v1wsemBvPi7XnOPol9caLnWTBZq6-JMvagAcM 10 | id: paragraph.accordion_item.field_heading 11 | field_name: field_heading 12 | entity_type: paragraph 13 | bundle: accordion_item 14 | label: Heading 15 | description: '' 16 | required: true 17 | translatable: true 18 | default_value: { } 19 | default_value_callback: '' 20 | settings: { } 21 | field_type: string 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.file_attachments.field_formatted_text.yml: -------------------------------------------------------------------------------- 1 | uuid: 5a107576-77ee-4c49-be74-15f7c2ec4b26 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_formatted_text 7 | - paragraphs.paragraphs_type.file_attachments 8 | module: 9 | - text 10 | id: paragraph.file_attachments.field_formatted_text 11 | field_name: field_formatted_text 12 | entity_type: paragraph 13 | bundle: file_attachments 14 | label: 'Formatted text' 15 | description: '' 16 | required: false 17 | translatable: true 18 | default_value: { } 19 | default_value_callback: '' 20 | settings: 21 | allowed_formats: { } 22 | field_type: text_long 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.file_attachments.field_heading.yml: -------------------------------------------------------------------------------- 1 | uuid: f605ddd7-a35b-457b-9c14-a2cd2f12ec45 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_heading 7 | - paragraphs.paragraphs_type.file_attachments 8 | id: paragraph.file_attachments.field_heading 9 | field_name: field_heading 10 | entity_type: paragraph 11 | bundle: file_attachments 12 | label: Heading 13 | description: '' 14 | required: false 15 | translatable: true 16 | default_value: { } 17 | default_value_callback: '' 18 | settings: { } 19 | field_type: string 20 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.formatted_text.field_heading.yml: -------------------------------------------------------------------------------- 1 | uuid: 4cc4148f-743d-4bf6-a8c9-b8a913672d1d 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_heading 7 | - paragraphs.paragraphs_type.formatted_text 8 | _core: 9 | default_config_hash: enS3l96gdyeW8gjclo2gHL_7lDAO_k8AMuTcF2AgDmI 10 | id: paragraph.formatted_text.field_heading 11 | field_name: field_heading 12 | entity_type: paragraph 13 | bundle: formatted_text 14 | label: Heading 15 | description: '' 16 | required: false 17 | translatable: true 18 | default_value: { } 19 | default_value_callback: '' 20 | settings: { } 21 | field_type: string 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.hero.field_heading.yml: -------------------------------------------------------------------------------- 1 | uuid: 989d5fca-488b-4e92-8a4a-7105a4b16327 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_heading 7 | - paragraphs.paragraphs_type.hero 8 | _core: 9 | default_config_hash: 6si3U9M0f2mKpuPWJr56ymuwC3uaE9MjxDeYG_TbLpc 10 | id: paragraph.hero.field_heading 11 | field_name: field_heading 12 | entity_type: paragraph 13 | bundle: hero 14 | label: Heading 15 | description: '' 16 | required: true 17 | translatable: true 18 | default_value: { } 19 | default_value_callback: '' 20 | settings: { } 21 | field_type: string 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.liftups_articles.field_heading.yml: -------------------------------------------------------------------------------- 1 | uuid: 422b2735-f213-4d8e-a64f-555ac411cd93 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_heading 7 | - paragraphs.paragraphs_type.liftups_articles 8 | _core: 9 | default_config_hash: dyH2H4fP1tIZvMsJR8qnbtxhJOxNWaY9g4ksfIFLRUM 10 | id: paragraph.liftups_articles.field_heading 11 | field_name: field_heading 12 | entity_type: paragraph 13 | bundle: liftups_articles 14 | label: Heading 15 | description: '' 16 | required: false 17 | translatable: true 18 | default_value: { } 19 | default_value_callback: '' 20 | settings: { } 21 | field_type: string 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.links.field_links.yml: -------------------------------------------------------------------------------- 1 | uuid: 48722a2c-9456-4a94-9b54-f5acaa347931 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_links 7 | - paragraphs.paragraphs_type.links 8 | module: 9 | - link 10 | _core: 11 | default_config_hash: x4C4dYqdHN-ysRjMkFyxmaw4tlGbUxDP4a730JfYHw8 12 | id: paragraph.links.field_links 13 | field_name: field_links 14 | entity_type: paragraph 15 | bundle: links 16 | label: Links 17 | description: 'Add a list of links.' 18 | required: true 19 | translatable: true 20 | default_value: { } 21 | default_value_callback: '' 22 | settings: 23 | title: 2 24 | link_type: 17 25 | field_type: link 26 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.field.paragraph.listing_articles.field_heading.yml: -------------------------------------------------------------------------------- 1 | uuid: 565786b0-1cf6-4913-bfbd-a87c790183a8 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - field.storage.paragraph.field_heading 7 | - paragraphs.paragraphs_type.listing_articles 8 | _core: 9 | default_config_hash: F_qBfLw5BYVh4pwqCJ3eE0cdwrCOCyZZb8AUSRcgmyQ 10 | id: paragraph.listing_articles.field_heading 11 | field_name: field_heading 12 | entity_type: paragraph 13 | bundle: listing_articles 14 | label: Heading 15 | description: '' 16 | required: true 17 | translatable: true 18 | default_value: { } 19 | default_value_callback: '' 20 | settings: { } 21 | field_type: string 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.node.field_content_elements.yml: -------------------------------------------------------------------------------- 1 | uuid: 0a86c604-6827-4896-8680-a2fc7919f942 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - entity_reference_revisions 7 | - node 8 | - paragraphs 9 | _core: 10 | default_config_hash: U09rTtwKK4i4pcDXDHgLZ4jFs8WEx8raG0I-5qjDuzo 11 | id: node.field_content_elements 12 | field_name: field_content_elements 13 | entity_type: node 14 | type: entity_reference_revisions 15 | settings: 16 | target_type: paragraph 17 | module: entity_reference_revisions 18 | locked: false 19 | cardinality: -1 20 | translatable: true 21 | indexes: { } 22 | persist_with_no_fields: false 23 | custom_storage: false 24 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_accordion_items.yml: -------------------------------------------------------------------------------- 1 | uuid: 0189e4c1-cca9-4e93-8a75-326d07cd546e 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - entity_reference_revisions 7 | - paragraphs 8 | _core: 9 | default_config_hash: '-QiW6-Ytz0hB97ypVPeBUDHCvQaVjjXciIaMmiQHreE' 10 | id: paragraph.field_accordion_items 11 | field_name: field_accordion_items 12 | entity_type: paragraph 13 | type: entity_reference_revisions 14 | settings: 15 | target_type: paragraph 16 | module: entity_reference_revisions 17 | locked: false 18 | cardinality: -1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_articles.yml: -------------------------------------------------------------------------------- 1 | uuid: ec96f0fd-0d78-4199-b409-0de2b30ff223 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - node 7 | - paragraphs 8 | _core: 9 | default_config_hash: XeIGj4XN5VO1DSAti4_BQPEYpQKnd56v_TZzEKqzr9U 10 | id: paragraph.field_articles 11 | field_name: field_articles 12 | entity_type: paragraph 13 | type: entity_reference 14 | settings: 15 | target_type: node 16 | module: core 17 | locked: false 18 | cardinality: -1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_content_elements.yml: -------------------------------------------------------------------------------- 1 | uuid: c753530b-4be8-446b-9724-ffb665bfc2dd 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - entity_reference_revisions 7 | - paragraphs 8 | _core: 9 | default_config_hash: XbKqsUCkYuJR9ScCH2IbBPzAjvgbpnlxNlmwbO4tT1k 10 | id: paragraph.field_content_elements 11 | field_name: field_content_elements 12 | entity_type: paragraph 13 | type: entity_reference_revisions 14 | settings: 15 | target_type: paragraph 16 | module: entity_reference_revisions 17 | locked: false 18 | cardinality: -1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_file_attachments.yml: -------------------------------------------------------------------------------- 1 | uuid: 2ad132d1-f210-4b4e-b277-bb3b3aad9a00 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - media 7 | - paragraphs 8 | _core: 9 | default_config_hash: mm8msxn4qrIY5b9SvPkehVDaKRBDpCHNFrHYGKaWNSc 10 | id: paragraph.field_file_attachments 11 | field_name: field_file_attachments 12 | entity_type: paragraph 13 | type: entity_reference 14 | settings: 15 | target_type: media 16 | module: core 17 | locked: false 18 | cardinality: -1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_formatted_text.yml: -------------------------------------------------------------------------------- 1 | uuid: 3acb7d01-7ee7-4bf7-9107-dbee7879c766 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - paragraphs 7 | - text 8 | _core: 9 | default_config_hash: UIPDM4aLrUSMpuzUItwgEjSCDX_8ntiqC3elZQTo-2A 10 | id: paragraph.field_formatted_text 11 | field_name: field_formatted_text 12 | entity_type: paragraph 13 | type: text_long 14 | settings: { } 15 | module: text 16 | locked: false 17 | cardinality: 1 18 | translatable: true 19 | indexes: { } 20 | persist_with_no_fields: false 21 | custom_storage: false 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_heading.yml: -------------------------------------------------------------------------------- 1 | uuid: 9cbd27f0-d0f6-4196-8e8c-70cd00071a80 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - paragraphs 7 | _core: 8 | default_config_hash: _Ji4JZ_-X4TimrFyAlQHPUz9tBkawTUc0Q5Lgt0QcPg 9 | id: paragraph.field_heading 10 | field_name: field_heading 11 | entity_type: paragraph 12 | type: string 13 | settings: 14 | max_length: 255 15 | case_sensitive: false 16 | is_ascii: false 17 | module: core 18 | locked: false 19 | cardinality: 1 20 | translatable: true 21 | indexes: { } 22 | persist_with_no_fields: false 23 | custom_storage: false 24 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_image.yml: -------------------------------------------------------------------------------- 1 | uuid: 48eba4f4-2f16-45ee-a1c1-d230725aac6c 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - media 7 | - paragraphs 8 | _core: 9 | default_config_hash: 94SBNQAFyVPtLvi_-Gc0YCTpcTn5sET0VypYImzo7dU 10 | id: paragraph.field_image 11 | field_name: field_image 12 | entity_type: paragraph 13 | type: entity_reference 14 | settings: 15 | target_type: media 16 | module: core 17 | locked: false 18 | cardinality: 1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_limit.yml: -------------------------------------------------------------------------------- 1 | uuid: 5680914e-1619-455f-839d-e95351e298f9 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - paragraphs 7 | _core: 8 | default_config_hash: oyVbb0v5AWQ3uafi4qivCi11AvmZgnKRqlI2wmPnrw0 9 | id: paragraph.field_limit 10 | field_name: field_limit 11 | entity_type: paragraph 12 | type: integer 13 | settings: 14 | unsigned: false 15 | size: normal 16 | module: core 17 | locked: false 18 | cardinality: 1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_links.yml: -------------------------------------------------------------------------------- 1 | uuid: fb979ee7-b04e-45d5-9314-a50b30a4529d 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - link 7 | - paragraphs 8 | _core: 9 | default_config_hash: aKWmB2zEYg9ZSRhg_7w9qV7TAAlJax0qc2rfwmuwYRg 10 | id: paragraph.field_links 11 | field_name: field_links 12 | entity_type: paragraph 13 | type: link 14 | settings: { } 15 | module: link 16 | locked: false 17 | cardinality: -1 18 | translatable: true 19 | indexes: { } 20 | persist_with_no_fields: false 21 | custom_storage: false 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_primary_link.yml: -------------------------------------------------------------------------------- 1 | uuid: d53a4a17-d14d-4675-a287-be50a6698b39 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - link 7 | - paragraphs 8 | _core: 9 | default_config_hash: mXIfM0NQEkPqDmBnPqRpuDEPQfOjW1P3pNereq1ccu8 10 | id: paragraph.field_primary_link 11 | field_name: field_primary_link 12 | entity_type: paragraph 13 | type: link 14 | settings: { } 15 | module: link 16 | locked: false 17 | cardinality: 1 18 | translatable: true 19 | indexes: { } 20 | persist_with_no_fields: false 21 | custom_storage: false 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_secondary_link.yml: -------------------------------------------------------------------------------- 1 | uuid: 856da778-a323-4eda-9abc-9d0a9455bb77 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - link 7 | - paragraphs 8 | _core: 9 | default_config_hash: csiJkhAXsw-GbISJXsuSVpHRYfbX8RCHfie1eVoK3m4 10 | id: paragraph.field_secondary_link 11 | field_name: field_secondary_link 12 | entity_type: paragraph 13 | type: link 14 | settings: { } 15 | module: link 16 | locked: false 17 | cardinality: 1 18 | translatable: true 19 | indexes: { } 20 | persist_with_no_fields: false 21 | custom_storage: false 22 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/field.storage.paragraph.field_video.yml: -------------------------------------------------------------------------------- 1 | uuid: c0b8d41e-7529-4614-a524-7c52806e6bc8 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - media 7 | - paragraphs 8 | _core: 9 | default_config_hash: p0ySbyjKrmqVtWHBzQmsYjpSPHxZO7MQ-eYLCtu7I7o 10 | id: paragraph.field_video 11 | field_name: field_video 12 | entity_type: paragraph 13 | type: entity_reference 14 | settings: 15 | target_type: media 16 | module: core 17 | locked: false 18 | cardinality: 1 19 | translatable: true 20 | indexes: { } 21 | persist_with_no_fields: false 22 | custom_storage: false 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.node.frontpage.yml: -------------------------------------------------------------------------------- 1 | uuid: 36ab812e-5d33-48b1-beb6-2179eaba8923 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - node.type.frontpage 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | id: node.frontpage 13 | target_entity_type_id: node 14 | target_bundle: frontpage 15 | default_langcode: site_default 16 | language_alterable: true 17 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.node.page.yml: -------------------------------------------------------------------------------- 1 | uuid: ddabed6b-659d-4f69-989e-cc0d0dab5f09 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - node.type.page 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | _core: 13 | default_config_hash: IhXOwqln4U2C9r2InVGdfHsLBmKC4nqad5fGdXP2oAA 14 | id: node.page 15 | target_entity_type_id: node 16 | target_bundle: page 17 | default_langcode: site_default 18 | language_alterable: true 19 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.accordion.yml: -------------------------------------------------------------------------------- 1 | uuid: b5ed45b1-87bc-47d6-aecf-861f042e08d0 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.accordion 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: EoDQy4iOxbU7ARIQjLirV40tX8SKF1xANLIqVFVvmvM 16 | id: paragraph.accordion 17 | target_entity_type_id: paragraph 18 | target_bundle: accordion 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.accordion_item.yml: -------------------------------------------------------------------------------- 1 | uuid: 4b184756-191c-4126-8bdd-8db7e303cda5 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.accordion_item 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: Gz4lVayFRU3hDJjMk5BhjAFE6a2_HIoW6zeWjs5j-70 16 | id: paragraph.accordion_item 17 | target_entity_type_id: paragraph 18 | target_bundle: accordion_item 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.file_attachments.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - paragraphs.paragraphs_type.file_attachments 6 | module: 7 | - content_translation 8 | third_party_settings: 9 | content_translation: 10 | enabled: true 11 | bundle_settings: 12 | untranslatable_fields_hide: '0' 13 | id: paragraph.file_attachments 14 | target_entity_type_id: paragraph 15 | target_bundle: file_attachments 16 | default_langcode: site_default 17 | language_alterable: true 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.formatted_text.yml: -------------------------------------------------------------------------------- 1 | uuid: 7a20f8a0-1537-4a46-9f7e-d8c953d0c676 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.formatted_text 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: 3RyZyCUWgF4gReLD7g6UMTYnnQPCwVfnZQKm2LnPljI 16 | id: paragraph.formatted_text 17 | target_entity_type_id: paragraph 18 | target_bundle: formatted_text 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.hero.yml: -------------------------------------------------------------------------------- 1 | uuid: a7bfda2f-1fb5-4d56-8a41-8e3c8a1b7743 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.hero 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: mUSYI4sXTZd8FrP1L8L5hKA42---S4pUS5DLRMl0B80 16 | id: paragraph.hero 17 | target_entity_type_id: paragraph 18 | target_bundle: hero 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.image.yml: -------------------------------------------------------------------------------- 1 | uuid: ee12db3c-a047-47c5-85e1-ed711878939a 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.image 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: McMpqJYUwSvME90P-Vev6iysra7p_VwsdOZKx4qH93o 16 | id: paragraph.image 17 | target_entity_type_id: paragraph 18 | target_bundle: image 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.liftups_articles.yml: -------------------------------------------------------------------------------- 1 | uuid: 5c8fc480-626f-4e7e-a0e3-e44cd055805c 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.liftups_articles 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: PVrZfIN4fllBafCmvt592Jpw4wUs6g5jxvhOSu_CmjA 16 | id: paragraph.liftups_articles 17 | target_entity_type_id: paragraph 18 | target_bundle: liftups_articles 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.links.yml: -------------------------------------------------------------------------------- 1 | uuid: 3d543b63-d303-4104-9520-4ff92525adfb 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.links 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: VxK_HuGEMH5gDdEMlqHVUtArqU1oBBgCUJXTV5knHbg 16 | id: paragraph.links 17 | target_entity_type_id: paragraph 18 | target_bundle: links 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.listing_articles.yml: -------------------------------------------------------------------------------- 1 | uuid: 6b2b7a2e-72af-4609-a660-1a980fbd50de 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.listing_articles 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: TbPHAtQE04qEO2ef_KJNdtT3y-7iMdO73NHoPiKT4ko 16 | id: paragraph.listing_articles 17 | target_entity_type_id: paragraph 18 | target_bundle: listing_articles 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/language.content_settings.paragraph.video.yml: -------------------------------------------------------------------------------- 1 | uuid: 37ae8e73-9067-43a9-90fd-5028e0901408 2 | langcode: en 3 | status: true 4 | dependencies: 5 | config: 6 | - paragraphs.paragraphs_type.video 7 | module: 8 | - content_translation 9 | third_party_settings: 10 | content_translation: 11 | enabled: true 12 | bundle_settings: 13 | untranslatable_fields_hide: '0' 14 | _core: 15 | default_config_hash: m9eArFd4e2nUr05lbSZg802ofbY5XGaSik9rgNh2uaQ 16 | id: paragraph.video 17 | target_entity_type_id: paragraph 18 | target_bundle: video 19 | default_langcode: site_default 20 | language_alterable: true 21 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/node.type.frontpage.yml: -------------------------------------------------------------------------------- 1 | uuid: 49a18379-7818-4fa6-b340-567777a70405 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - menu_ui 7 | third_party_settings: 8 | menu_ui: 9 | available_menus: { } 10 | parent: '' 11 | name: Frontpage 12 | type: frontpage 13 | description: 'Represents the frontpage of the site. Only one content of this type can be created.' 14 | help: null 15 | new_revision: true 16 | preview_mode: 1 17 | display_submitted: false 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/node.type.page.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - menu_ui 6 | third_party_settings: 7 | menu_ui: 8 | available_menus: 9 | - main 10 | parent: 'main:' 11 | name: Page 12 | type: page 13 | description: 'Page content type. Contains paragraphs.' 14 | help: null 15 | new_revision: true 16 | preview_mode: 1 17 | display_submitted: false 18 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.accordion.yml: -------------------------------------------------------------------------------- 1 | uuid: 24033ee5-155f-4706-b7f0-ef7ac1fe13cd 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: _dVRUvMOuZVqiJg6ugpSNPmU8sxjrE_pxmxWOMDB5nE 7 | id: accordion 8 | label: Accordion 9 | icon_uuid: null 10 | icon_default: null 11 | description: 'This paragraph type holds an accordion.' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.accordion_item.yml: -------------------------------------------------------------------------------- 1 | uuid: 04dcd5da-e671-4e78-8378-be0011722dc0 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: _o2EKgpsUbRcBk2u643sXLJhuKWSn_zkKITo4TeyXXY 7 | id: accordion_item 8 | label: 'Accordion item' 9 | icon_uuid: null 10 | icon_default: null 11 | description: 'This paragraph holds an accordion item, with a title and other paragraphs as content.' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.file_attachments.yml: -------------------------------------------------------------------------------- 1 | uuid: 0f16bbc6-d5d0-48c9-a69b-d7339267bb25 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: Oj8r5wt8ovhV9umOnvgnL6W60D_jJ2-VGfBbn9Iu2z0 7 | id: file_attachments 8 | label: 'File attachments' 9 | icon_uuid: null 10 | icon_default: null 11 | description: '' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.formatted_text.yml: -------------------------------------------------------------------------------- 1 | uuid: e2c0af9b-4e0b-4cab-924e-d87f4333145b 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: 9eXFYWV_FJ6xheSxmqOi6OmNib39RV6hLfsjvg-5ZCg 7 | id: formatted_text 8 | label: 'Formatted text' 9 | icon_uuid: null 10 | icon_default: null 11 | description: 'A paragraph containing formatted text' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.hero.yml: -------------------------------------------------------------------------------- 1 | uuid: 917bafb0-8a1b-4932-8af9-e957ff1822ba 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: 2Tyfxhp5-BliXJ3d3N3Zztx0_s_-O2dakusJ_qe5VEs 7 | id: hero 8 | label: Hero 9 | icon_uuid: null 10 | icon_default: null 11 | description: '' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.image.yml: -------------------------------------------------------------------------------- 1 | uuid: 0c607596-b968-41ac-8624-c327df401cd9 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: 3PyWZ9HCK2tStsXHS3nIYPhW-z0m0e5m6LLMwoeW3sA 7 | id: image 8 | label: Image 9 | icon_uuid: null 10 | icon_default: null 11 | description: 'A paragraph containing an image.' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.liftups_articles.yml: -------------------------------------------------------------------------------- 1 | uuid: 83ca5205-a332-4cd2-a90c-9d30358a69d0 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | id: liftups_articles 6 | label: 'Liftups: articles' 7 | icon_uuid: null 8 | icon_default: null 9 | description: 'A paragraph used to display a hand-picked list of articles.' 10 | behavior_plugins: { } 11 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.links.yml: -------------------------------------------------------------------------------- 1 | uuid: f796b11e-aa74-4bcd-ad8c-db3b2bbd8894 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: ZWkRRJsLWKJAHdeluZ5tlq9zUJk2ql-ABnpSZsnuyA0 7 | id: links 8 | label: Links 9 | icon_uuid: null 10 | icon_default: null 11 | description: 'a paragraph type containing a list of links.' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.listing_articles.yml: -------------------------------------------------------------------------------- 1 | uuid: 27969c04-2b7c-4b1c-a0b7-2fba36bc01e7 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: kXuPuzGEPfBMbvvZJswx7p4gsOHiEDwFX_V_hicEYkE 7 | id: listing_articles 8 | label: 'Listing: articles' 9 | icon_uuid: null 10 | icon_default: null 11 | description: 'Renders a listing of articles in the frontend.' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.paragraphs_type.video.yml: -------------------------------------------------------------------------------- 1 | uuid: edcfa9e8-d529-4626-bdd5-64e4399ee080 2 | langcode: en 3 | status: true 4 | dependencies: { } 5 | _core: 6 | default_config_hash: FXQAevpvVeRREsSS3A52NH7DPqByQbj_C9x9ffWZavU 7 | id: video 8 | label: Video 9 | icon_uuid: null 10 | icon_default: null 11 | description: 'Paragraph containing a video' 12 | behavior_plugins: { } 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/paragraphs.settings.yml: -------------------------------------------------------------------------------- 1 | show_unpublished: true 2 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/pathauto.pattern.frontpage.yml: -------------------------------------------------------------------------------- 1 | uuid: 42918896-bedc-43ca-84a9-4af202957cc1 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - node 7 | id: frontpage 8 | label: frontpage 9 | type: 'canonical_entities:node' 10 | pattern: '/frontpage-[language:langcode]' 11 | selection_criteria: 12 | 9b7d0d83-0421-493f-ab79-80d62a55ea7f: 13 | id: 'entity_bundle:node' 14 | negate: false 15 | uuid: 9b7d0d83-0421-493f-ab79-80d62a55ea7f 16 | context_mapping: 17 | node: node 18 | bundles: 19 | frontpage: frontpage 20 | selection_logic: and 21 | weight: -5 22 | relationships: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_pages/config/pathauto.pattern.page.yml: -------------------------------------------------------------------------------- 1 | uuid: 8eb13e2d-3baa-4f38-8027-1d24e8bf6a74 2 | langcode: en 3 | status: true 4 | dependencies: 5 | module: 6 | - node 7 | id: page 8 | label: 'Page' 9 | type: 'canonical_entities:node' 10 | pattern: '[node:title]' 11 | selection_criteria: 12 | 61e9cd38-e513-4d12-a581-1974b469fa10: 13 | id: 'entity_bundle:node' 14 | negate: false 15 | uuid: 61e9cd38-e513-4d12-a581-1974b469fa10 16 | context_mapping: 17 | node: node 18 | bundles: 19 | page: page 20 | selection_logic: and 21 | weight: -5 22 | relationships: { } 23 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_roles/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drupal_recipe/wunder_roles", 3 | "description": "Wunder roles example recipe", 4 | "type": "drupal-recipe", 5 | "require": { 6 | "drupal/core": "^9.4" 7 | }, 8 | "license": "GPL-2.0-or-later" 9 | } 10 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_roles/config/user.role.wunder_content_editor.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - node 6 | - path 7 | - system 8 | - toolbar 9 | id: wunder_content_editor 10 | label: 'Wunder content editor' 11 | weight: 5 12 | is_admin: null 13 | permissions: 14 | - 'access administration pages' 15 | - 'access content overview' 16 | - 'access toolbar' 17 | - 'administer url aliases' 18 | - 'create url aliases' 19 | - 'delete all revisions' 20 | - 'revert all revisions' 21 | - 'view all revisions' 22 | - 'view own unpublished content' 23 | - 'view the administration theme' 24 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_roles/recipe.yml: -------------------------------------------------------------------------------- 1 | # An example recipe that shows the creation of a user role. 2 | name: 'Wunder role' 3 | description: "An example recipe showing the creation of a user role with basic permissions." 4 | type: 'User' 5 | recipes: 6 | - wunder_base 7 | install: 8 | - user 9 | - node 10 | - path 11 | - system 12 | - toolbar 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_search/config/elasticsearch_helper.settings.yml: -------------------------------------------------------------------------------- 1 | scheme: http 2 | hosts: 3 | - 4 | host: localhost 5 | port: '9200' 6 | authentication: 7 | method: '' 8 | configuration: { } 9 | ssl: 10 | certificate: '' 11 | skip_verification: false 12 | defer_indexing: false 13 | -------------------------------------------------------------------------------- /drupal/recipes/wunder_search/recipe.yml: -------------------------------------------------------------------------------- 1 | name: 'Wunder search' 2 | description: "Enable search integration with elasticsearch" 3 | type: 'Search' 4 | recipes: 5 | - wunder_base 6 | install: 7 | - elasticsearch_helper 8 | - wunder_search 9 | config: 10 | import: 11 | elasticsearch_helper: '*' 12 | -------------------------------------------------------------------------------- /drupal/web/.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore file for the nginx container. 2 | **/*.md 3 | **/CHANGELOG* 4 | **/README* 5 | **/LICENSE* 6 | **/*.sql 7 | **/*.gz 8 | **/*.zip 9 | **/node_modules 10 | **/.git 11 | **/*.php 12 | **/*.module 13 | **/*.install 14 | **/*.yml 15 | core/**/tests 16 | modules/contrib/**/tests 17 | sites/**/files 18 | Dockerfile -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/migrations/users.yml: -------------------------------------------------------------------------------- 1 | id: users 2 | label: Demo users 3 | migration_group: demo_content 4 | source: 5 | plugin: csv 6 | path: modules/custom/wunder_democontent/sources/users.csv 7 | ids: [ id ] 8 | constants: 9 | status: 1 10 | process: 11 | name: name 12 | mail: mail 13 | pass: password 14 | status: constants/status 15 | roles: 16 | plugin: explode 17 | delimiter: '|' 18 | source: roles 19 | 20 | destination: 21 | plugin: entity:user -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example1.pdf -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example2.pdf -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example3.pdf -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example4.pdf -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example5.pdf -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/attachments/Pdf-file-example6.pdf -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/1.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/10.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/11.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/12.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/13.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/14.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/2.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/3.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/4.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/5.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/6.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/7.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/8.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/9.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/images/wunder_ecosystem.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/drupal/web/modules/custom/wunder_democontent/sources/images/wunder_ecosystem.jpg -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/sources/users.csv: -------------------------------------------------------------------------------- 1 | id,name,mail,password,roles,comment 2 | 1,testuser1,testuser1@example.com,$2y$10$PRG1RDaigGcjk5u.OFwqpObIOCREkYfS7KDpT43TlBvxgaWofSPra,frontend_login,the password is 'test' 3 | 2,testuser2,testuser2@example.com,$2y$10$PRG1RDaigGcjk5u.OFwqpObIOCREkYfS7KDpT43TlBvxgaWofSPra,frontend_login,the password is 'test' -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/wunder_democontent.info.yml: -------------------------------------------------------------------------------- 1 | name: 'Wunder next-drupal-starterkit template demo content' 2 | type: module 3 | description: 'Module containing migrations to populate a website with content matching the next-drupal-starterkit template.' 4 | core_version_requirement: ^9 || ^10 5 | dependencies: 6 | - migrate:migrate 7 | - migrate_plus:migrate_plus 8 | - migrate_source_csv:migrate_source_csv 9 | - migrate_tools:migrate_tools 10 | -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_democontent/wunder_democontent.services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | wunder_democontent.event_subscriber: 3 | class: Drupal\wunder_democontent\EventSubscriber\WunderDemocontentRevalidateSubscriber 4 | arguments: ['@logger.channel.wunder_democontent', '@state'] 5 | tags: 6 | - { name: event_subscriber } 7 | logger.channel.wunder_democontent: 8 | class: Drupal\Core\Logger\LoggerChannel 9 | factory: logger.factory:get 10 | arguments: ['wunder_democontent'] -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_next/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "org/wunder_next", 3 | "type": "drupal-drush", 4 | "extra": { 5 | "drush": { 6 | "services": { 7 | "drush.services.yml": "^11" 8 | } 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_next/drush.services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | wunder_next.commands: 3 | class: \Drupal\wunder_next\Commands\WunderNextCommands 4 | tags: 5 | - { name: drush.command } 6 | -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_next/src/Plugin/Validation/Constraint/UniqueFrontpage.php: -------------------------------------------------------------------------------- 1 | exportSitemapToFile('default', 'public://sitemap.xml'); 15 | } 16 | -------------------------------------------------------------------------------- /drupal/web/modules/custom/wunder_sitemap/wunder_sitemap.services.yml: -------------------------------------------------------------------------------- 1 | services: 2 | logger.channel.wunder_sitemap: 3 | parent: logger.channel_base 4 | arguments: ['wunder_sitemap'] 5 | wunder_sitemap.exporter: 6 | class: Drupal\wunder_sitemap\SitemapExporter 7 | arguments: ['@logger.channel.wunder_sitemap', '@simple_sitemap.generator', '@file.repository', '@file.usage'] 8 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/basic.info.yml: -------------------------------------------------------------------------------- 1 | name: Basic 2 | type: profile 3 | description: 'Install with commonly used features pre-configured.' 4 | version: 9 5 | core_version_requirement: ^9 6 | install: 7 | - admin_toolbar_tools 8 | - node 9 | - block 10 | - breakpoint 11 | - ckeditor 12 | - config 13 | - contextual 14 | - menu_link_content 15 | - datetime 16 | - editor 17 | - image 18 | - menu_ui 19 | - options 20 | - path 21 | - page_cache 22 | - dynamic_page_cache 23 | - big_pipe 24 | - taxonomy 25 | - dblog 26 | - toolbar 27 | - field_ui 28 | - file 29 | - views 30 | - views_ui 31 | - simplei 32 | themes: 33 | - bartik 34 | - seven 35 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_account_menu.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - system.menu.account 6 | module: 7 | - system 8 | theme: 9 | - bartik 10 | id: bartik_account_menu 11 | theme: bartik 12 | region: secondary_menu 13 | weight: 0 14 | provider: null 15 | plugin: 'system_menu_block:account' 16 | settings: 17 | id: 'system_menu_block:account' 18 | label: 'User account menu' 19 | provider: system 20 | label_display: '0' 21 | level: 1 22 | depth: 1 23 | expand_all_items: false 24 | visibility: { } 25 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_branding.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - system 6 | theme: 7 | - bartik 8 | id: bartik_branding 9 | theme: bartik 10 | region: header 11 | weight: 0 12 | provider: null 13 | plugin: system_branding_block 14 | settings: 15 | id: system_branding_block 16 | label: 'Site branding' 17 | provider: system 18 | label_display: '0' 19 | use_site_logo: true 20 | use_site_name: true 21 | use_site_slogan: true 22 | visibility: { } 23 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_breadcrumbs.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - system 6 | theme: 7 | - bartik 8 | id: bartik_breadcrumbs 9 | theme: bartik 10 | region: breadcrumb 11 | weight: 0 12 | provider: null 13 | plugin: system_breadcrumb_block 14 | settings: 15 | id: system_breadcrumb_block 16 | label: Breadcrumbs 17 | provider: system 18 | label_display: '0' 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_content.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - system 6 | theme: 7 | - bartik 8 | id: bartik_content 9 | theme: bartik 10 | region: content 11 | weight: 0 12 | provider: null 13 | plugin: system_main_block 14 | settings: 15 | id: system_main_block 16 | label: 'Main page content' 17 | provider: system 18 | label_display: '0' 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_footer.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - system.menu.footer 6 | module: 7 | - system 8 | theme: 9 | - bartik 10 | id: bartik_footer 11 | theme: bartik 12 | region: footer_fifth 13 | weight: 0 14 | provider: null 15 | plugin: 'system_menu_block:footer' 16 | settings: 17 | id: 'system_menu_block:footer' 18 | label: 'Footer menu' 19 | provider: system 20 | label_display: '0' 21 | level: 1 22 | depth: 0 23 | expand_all_items: false 24 | visibility: { } 25 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_local_actions.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | theme: 5 | - bartik 6 | id: bartik_local_actions 7 | theme: bartik 8 | region: content 9 | weight: -20 10 | provider: null 11 | plugin: local_actions_block 12 | settings: 13 | id: local_actions_block 14 | label: 'Primary admin actions' 15 | provider: core 16 | label_display: '0' 17 | visibility: { } 18 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_local_tasks.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | theme: 5 | - bartik 6 | id: bartik_local_tasks 7 | theme: bartik 8 | region: content 9 | weight: -40 10 | provider: null 11 | plugin: local_tasks_block 12 | settings: 13 | id: local_tasks_block 14 | label: Tabs 15 | provider: core 16 | label_display: '0' 17 | primary: true 18 | secondary: true 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_main_menu.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | config: 5 | - system.menu.main 6 | module: 7 | - system 8 | theme: 9 | - bartik 10 | id: bartik_main_menu 11 | theme: bartik 12 | region: primary_menu 13 | weight: 0 14 | provider: null 15 | plugin: 'system_menu_block:main' 16 | settings: 17 | id: 'system_menu_block:main' 18 | label: 'Main navigation' 19 | provider: system 20 | label_display: '0' 21 | level: 1 22 | depth: 1 23 | expand_all_items: false 24 | visibility: { } 25 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_messages.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - system 6 | theme: 7 | - bartik 8 | id: bartik_messages 9 | theme: bartik 10 | region: highlighted 11 | weight: 0 12 | provider: null 13 | plugin: system_messages_block 14 | settings: 15 | id: system_messages_block 16 | label: 'Status messages' 17 | provider: system 18 | label_display: '0' 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.bartik_page_title.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | theme: 5 | - bartik 6 | id: bartik_page_title 7 | theme: bartik 8 | region: content 9 | weight: -50 10 | provider: null 11 | plugin: page_title_block 12 | settings: 13 | id: page_title_block 14 | label: 'Page title' 15 | provider: core 16 | label_display: '0' 17 | visibility: { } 18 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.seven_breadcrumbs.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - system 6 | theme: 7 | - seven 8 | id: seven_breadcrumbs 9 | theme: seven 10 | region: breadcrumb 11 | weight: 0 12 | provider: null 13 | plugin: system_breadcrumb_block 14 | settings: 15 | id: system_breadcrumb_block 16 | label: Breadcrumbs 17 | provider: system 18 | label_display: '0' 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.seven_content.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - system 6 | theme: 7 | - seven 8 | id: seven_content 9 | theme: seven 10 | region: content 11 | weight: 0 12 | provider: null 13 | plugin: system_main_block 14 | settings: 15 | id: system_main_block 16 | label: 'Main page content' 17 | provider: system 18 | label_display: '0' 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.seven_local_actions.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | theme: 5 | - seven 6 | id: seven_local_actions 7 | theme: seven 8 | region: content 9 | weight: -10 10 | provider: null 11 | plugin: local_actions_block 12 | settings: 13 | id: local_actions_block 14 | label: 'Primary admin actions' 15 | provider: core 16 | label_display: '0' 17 | visibility: { } 18 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.seven_messages.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - system 6 | theme: 7 | - seven 8 | id: seven_messages 9 | theme: seven 10 | region: highlighted 11 | weight: 0 12 | provider: null 13 | plugin: system_messages_block 14 | settings: 15 | id: system_messages_block 16 | label: 'Status messages' 17 | provider: system 18 | label_display: '0' 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.seven_page_title.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | theme: 5 | - seven 6 | id: seven_page_title 7 | theme: seven 8 | region: header 9 | weight: -30 10 | provider: null 11 | plugin: page_title_block 12 | settings: 13 | id: page_title_block 14 | label: 'Page title' 15 | provider: core 16 | label_display: '0' 17 | visibility: { } 18 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.seven_primary_local_tasks.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | theme: 5 | - seven 6 | id: seven_primary_local_tasks 7 | theme: seven 8 | region: header 9 | weight: 0 10 | provider: null 11 | plugin: local_tasks_block 12 | settings: 13 | id: local_tasks_block 14 | label: 'Primary tabs' 15 | provider: core 16 | label_display: '0' 17 | primary: true 18 | secondary: false 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/block.block.seven_secondary_local_tasks.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | theme: 5 | - seven 6 | id: seven_secondary_local_tasks 7 | theme: seven 8 | region: pre_content 9 | weight: 0 10 | provider: null 11 | plugin: local_tasks_block 12 | settings: 13 | id: local_tasks_block 14 | label: 'Secondary tabs' 15 | provider: core 16 | label_display: '0' 17 | primary: false 18 | secondary: true 19 | visibility: { } 20 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/core.entity_form_display.user.user.default.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - user 6 | id: user.user.default 7 | targetEntityType: user 8 | bundle: user 9 | mode: default 10 | content: 11 | account: 12 | weight: -10 13 | region: content 14 | contact: 15 | weight: 5 16 | region: content 17 | language: 18 | weight: 0 19 | region: content 20 | timezone: 21 | weight: 6 22 | region: content 23 | hidden: { } 24 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/core.entity_view_display.user.user.default.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: 4 | module: 5 | - user 6 | id: user.user.default 7 | targetEntityType: user 8 | bundle: user 9 | mode: default 10 | content: 11 | member_for: 12 | weight: 5 13 | region: content 14 | hidden: { } 15 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/node.settings.yml: -------------------------------------------------------------------------------- 1 | use_admin_theme: true 2 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/system.cron.yml: -------------------------------------------------------------------------------- 1 | threshold: 2 | requirements_warning: 172800 3 | requirements_error: 1209600 4 | logging: 1 5 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/system.site.yml: -------------------------------------------------------------------------------- 1 | uuid: '' 2 | name: '' 3 | mail: '' 4 | slogan: '' 5 | page: 6 | 403: '' 7 | 404: '' 8 | front: /node 9 | admin_compact_mode: false 10 | weight_select_max: 100 11 | langcode: en 12 | default_langcode: en 13 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/system.theme.yml: -------------------------------------------------------------------------------- 1 | admin: seven 2 | default: bartik 3 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/user.role.administrator.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: administrator 5 | label: Administrator 6 | weight: 2 7 | is_admin: true 8 | permissions: { } 9 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/user.role.anonymous.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: anonymous 5 | label: 'Anonymous user' 6 | weight: 0 7 | is_admin: false 8 | permissions: 9 | - 'access content' 10 | - 'use text format restricted_html' 11 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/user.role.authenticated.yml: -------------------------------------------------------------------------------- 1 | langcode: en 2 | status: true 3 | dependencies: { } 4 | id: authenticated 5 | label: 'Authenticated user' 6 | weight: 1 7 | is_admin: false 8 | permissions: 9 | - 'access content' 10 | - 'use text format basic_html' 11 | -------------------------------------------------------------------------------- /drupal/web/profiles/custom/basic/config/install/user.settings.yml: -------------------------------------------------------------------------------- 1 | anonymous: Anonymous 2 | verify_mail: true 3 | notify: 4 | cancel_confirm: true 5 | password_reset: true 6 | status_activated: true 7 | status_blocked: false 8 | status_canceled: false 9 | register_admin_created: true 10 | register_no_approval_required: true 11 | register_pending_approval: true 12 | register: visitors_admin_approval 13 | cancel_method: user_cancel_block 14 | password_reset_timeout: 86400 15 | password_strength: true 16 | langcode: en 17 | -------------------------------------------------------------------------------- /drupal/web/sites/development.services.yml: -------------------------------------------------------------------------------- 1 | # Local development services. 2 | parameters: 3 | http.response.debug_cacheability_headers: true 4 | twig.config: 5 | debug: true 6 | auto_reload: true 7 | services: 8 | cache.backend.null: 9 | class: Drupal\Core\Cache\NullBackendFactory 10 | -------------------------------------------------------------------------------- /next/.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore file for the Next container 2 | .graphqlrc.yml 3 | .vscode -------------------------------------------------------------------------------- /next/.env.local.example: -------------------------------------------------------------------------------- 1 | ## 2 | # This file contains env variables that are not generally required, 3 | # but can be useful for development and debugging. 4 | # 5 | # To use something in this file: 6 | # 1. Create a file .env.local with the same content as this one. 7 | # 2. Uncomment the variables you want to enable. 8 | ## 9 | 10 | # Disable telemetry: 11 | # NEXT_TELEMETRY_DISABLED=1 12 | 13 | # Skip ESLint and TypeScript checks: 14 | # NEXT_BUILD_SKIP_CHECKS=1 15 | -------------------------------------------------------------------------------- /next/.eslintignore: -------------------------------------------------------------------------------- 1 | storybook-static 2 | node_modules 3 | .next 4 | /src/lib/gql -------------------------------------------------------------------------------- /next/.graphqlrc.yml: -------------------------------------------------------------------------------- 1 | # This file exposes the graphql schema and documents to the graphql.vscode-graphql and other compatible IDE extensions 2 | schema: "./src/lib/graphql/schema.graphql" 3 | documents: "src/lib/graphql/**/*.{js,ts,jsx,tsx}" 4 | -------------------------------------------------------------------------------- /next/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "prettier-plugin-tailwindcss" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /next/.storybook/manager.ts: -------------------------------------------------------------------------------- 1 | import { addons } from "@storybook/manager-api"; 2 | import theme from "./theme"; 3 | 4 | addons.setConfig({ 5 | theme, 6 | }); 7 | -------------------------------------------------------------------------------- /next/.storybook/next-intl.ts: -------------------------------------------------------------------------------- 1 | import en from "../messages/en.json"; 2 | import fi from "../messages/fi.json"; 3 | import sv from "../messages/sv.json"; 4 | 5 | const messagesByLocale: Record = { en, fi, sv }; 6 | 7 | const nextIntl = { 8 | defaultLocale: "en", 9 | messagesByLocale, 10 | }; 11 | 12 | export default nextIntl; 13 | -------------------------------------------------------------------------------- /next/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "dbaeumer.vscode-eslint", 4 | "esbenp.prettier-vscode", 5 | "stylelint.vscode-stylelint", 6 | "bradlc.vscode-tailwindcss", 7 | "graphql.vscode-graphql", 8 | "graphql.vscode-graphql-syntax" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /next/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | // explicitly tell eslint extension to watch typescript files for linting errors 3 | "eslint.validate": ["typescript", "typescriptreact"], 4 | "editor.codeActionsOnSave": { 5 | "source.fixAll.eslint": "explicit", 6 | "source.fixAll.stylelint": "explicit" 7 | }, 8 | // Tailwind intellisense also in strings 9 | "editor.quickSuggestions": { 10 | "strings": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /next/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "src/styles/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /next/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "cypress"; 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | setupNodeEvents(_on, _config) { 6 | // implement node event listeners here 7 | }, 8 | }, 9 | env: { 10 | MAILPIT_URL: "http://mail.lndo.site", 11 | FRONTEND_URL: "https://frontend.lndo.site", 12 | BACKEND_URL: "https://backend.lndo.site", 13 | }, 14 | }); 15 | -------------------------------------------------------------------------------- /next/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /next/cypress/support/utils.ts: -------------------------------------------------------------------------------- 1 | export function extractLinkFromString(str: string): string | null { 2 | // Regular expression to match URLs 3 | const urlRegex: RegExp = /(https?:\/\/[^\s]+)/g; 4 | 5 | // Find matches 6 | const matches: RegExpMatchArray | null = str.match(urlRegex); 7 | 8 | // Return the first match or null if no match is found 9 | return matches ? matches[0] : null; 10 | } 11 | -------------------------------------------------------------------------------- /next/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. 6 | -------------------------------------------------------------------------------- /next/postcss.config.js: -------------------------------------------------------------------------------- 1 | // If you want to use other PostCSS plugins, see the following: 2 | // https://tailwindcss.com/docs/using-with-preprocessors 3 | module.exports = { 4 | plugins: { 5 | "tailwindcss/nesting": {}, 6 | tailwindcss: {}, 7 | autoprefixer: {}, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /next/public/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/next/public/profile.png -------------------------------------------------------------------------------- /next/src/app/[locale]/(dynamic)/[...slug]/error.tsx: -------------------------------------------------------------------------------- 1 | "use client"; // Error components must be Client Components 2 | 3 | import ErrorPage from "@/components/error-page"; 4 | 5 | export default function Error({ 6 | error, 7 | }: { 8 | error: Error & { digest?: string }; 9 | }) { 10 | // useEffect(() => { 11 | // // Log the error to an error reporting service 12 | // }, [error]); 13 | 14 | return ; 15 | } 16 | -------------------------------------------------------------------------------- /next/src/app/[locale]/(dynamic)/[...slug]/not-found.tsx: -------------------------------------------------------------------------------- 1 | import NotFoundPage from "@/components/not-found-page"; 2 | 3 | export default function NotFound() { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /next/src/app/[locale]/(static)/auth/login/page.tsx: -------------------------------------------------------------------------------- 1 | import { Metadata } from "next"; 2 | import { getTranslations, setRequestLocale } from "next-intl/server"; 3 | import { Suspense } from "react"; 4 | 5 | import LoginForm from "@/components/forms/login-form"; 6 | 7 | export async function generateMetadata(): Promise { 8 | const t = await getTranslations(); 9 | return { 10 | title: t("log-in"), 11 | }; 12 | } 13 | 14 | export default function LoginPage({ 15 | params: { locale }, 16 | }: { 17 | params: { locale: string }; 18 | }) { 19 | setRequestLocale(locale); 20 | 21 | return ( 22 | 23 | 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /next/src/app/[locale]/(static)/auth/register/page.tsx: -------------------------------------------------------------------------------- 1 | import { Metadata } from "next"; 2 | import { getTranslations, setRequestLocale } from "next-intl/server"; 3 | 4 | import RegisterForm from "@/components/forms/register-form"; 5 | 6 | export async function generateMetadata(): Promise { 7 | const t = await getTranslations(); 8 | return { 9 | title: t("register"), 10 | }; 11 | } 12 | 13 | export default function RegisterPage({ 14 | params: { locale }, 15 | }: { 16 | params: { locale: string }; 17 | }) { 18 | setRequestLocale(locale); 19 | 20 | return ; 21 | } 22 | -------------------------------------------------------------------------------- /next/src/app/[locale]/(static)/error.tsx: -------------------------------------------------------------------------------- 1 | "use client"; // Error components must be Client Components 2 | 3 | import ErrorPage from "@/components/error-page"; 4 | 5 | export default function Error({ 6 | error, 7 | }: { 8 | error: Error & { digest?: string }; 9 | }) { 10 | // useEffect(() => { 11 | // // Log the error to an error reporting service 12 | // console.error(error); 13 | // }, [error]); 14 | 15 | return ; 16 | } 17 | -------------------------------------------------------------------------------- /next/src/app/[locale]/(static)/layout.tsx: -------------------------------------------------------------------------------- 1 | import { setRequestLocale } from "next-intl/server"; 2 | 3 | import PageLayout from "@/components/page-layout"; 4 | 5 | export default function StaticLayout({ 6 | children, 7 | params: { locale }, 8 | }: { 9 | children: React.ReactNode; 10 | params: { locale: string }; 11 | }) { 12 | setRequestLocale(locale); 13 | 14 | return {children}; 15 | } 16 | -------------------------------------------------------------------------------- /next/src/app/[locale]/(static)/not-found.tsx: -------------------------------------------------------------------------------- 1 | import NotFoundPage from "@/components/not-found-page"; 2 | 3 | export default function NotFound() { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /next/src/app/api/auth/[...nextauth]/route.ts: -------------------------------------------------------------------------------- 1 | export { GET, POST } from "@/auth"; 2 | -------------------------------------------------------------------------------- /next/src/app/api/disable-draft/route.ts: -------------------------------------------------------------------------------- 1 | import { redirect } from "next/navigation"; 2 | import type { NextRequest } from "next/server"; 3 | import { disableDraftMode } from "next-drupal/draft"; 4 | 5 | // disable draft mode and redirect to the callback path from the query parameter 6 | // eslint-disable-next-line @typescript-eslint/require-await 7 | export async function GET(request: NextRequest) { 8 | const { searchParams } = new URL(request.url); 9 | const callbackPath = searchParams.get("callbackPath"); 10 | 11 | await disableDraftMode(); 12 | redirect(callbackPath ?? "/"); 13 | } 14 | -------------------------------------------------------------------------------- /next/src/app/api/draft/route.ts: -------------------------------------------------------------------------------- 1 | import type { NextRequest } from "next/server"; 2 | import { enableDraftMode } from "next-drupal/draft"; 3 | 4 | import { drupalClientPreviewer } from "@/lib/drupal/drupal-client"; 5 | 6 | export async function GET(request: NextRequest) { 7 | return enableDraftMode(request, drupalClientPreviewer); 8 | } 9 | -------------------------------------------------------------------------------- /next/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wunderio/next-drupal-starterkit/3f820d8757dd779220e5feffca5f44a6b3b555f4/next/src/app/favicon.ico -------------------------------------------------------------------------------- /next/src/app/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | 4 | Sitemap: https://frontend.lndo.site/sitemap.xml -------------------------------------------------------------------------------- /next/src/components/forms/error-required.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslations } from "next-intl"; 2 | 3 | import { TranslationKey } from "@/types/next-intl"; 4 | 5 | export function ErrorRequired({ 6 | fieldTranslatedLabelKey, 7 | }: { 8 | fieldTranslatedLabelKey: TranslationKey; 9 | }) { 10 | const t = useTranslations(); 11 | const translatedFieldLabel = t(fieldTranslatedLabelKey); 12 | 13 | return ( 14 | 15 | {t("field-is-required", { field: translatedFieldLabel })} 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /next/src/components/heading--page.tsx: -------------------------------------------------------------------------------- 1 | export function HeadingPage({ children }: { children: JSX.Element | string }) { 2 | return ( 3 |

{children}

4 | ); 5 | } 6 | -------------------------------------------------------------------------------- /next/src/components/heading--paragraph.tsx: -------------------------------------------------------------------------------- 1 | export function HeadingParagraph({ children }: { children: string }) { 2 | return ( 3 |

{children}

4 | ); 5 | } 6 | -------------------------------------------------------------------------------- /next/src/components/main-menu/main-menu.module.css: -------------------------------------------------------------------------------- 1 | /* Overwrite @radix-ui/react-navigation-menu's inline style on list parent */ 2 | .mainMenu [data-orientation="horizontal"] > :only-child { 3 | position: initial !important; 4 | } 5 | 6 | .mainMenu :focus-visible { 7 | @apply ring-inset ring-offset-0; 8 | } 9 | -------------------------------------------------------------------------------- /next/src/components/node/node--frontpage.tsx: -------------------------------------------------------------------------------- 1 | import { Paragraph } from "@/components/paragraph"; 2 | import type { FragmentParagraphUnionFragment } from "@/lib/gql/graphql"; 3 | import type { FrontpageType } from "@/types/graphql"; 4 | 5 | export function NodeFrontpage({ page }: { page: FrontpageType }) { 6 | return ( 7 |
8 | {page.contentElements?.map( 9 | (paragraph: FragmentParagraphUnionFragment) => ( 10 | 11 | ), 12 | )} 13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /next/src/components/node/node--page.tsx: -------------------------------------------------------------------------------- 1 | import { Paragraph } from "@/components/paragraph"; 2 | import type { FragmentParagraphUnionFragment } from "@/lib/gql/graphql"; 3 | import type { PageType } from "@/types/graphql"; 4 | 5 | export function NodePage({ page }: { page: PageType }) { 6 | return ( 7 |
8 | {page.contentElements?.map( 9 | (paragraph: FragmentParagraphUnionFragment) => ( 10 | 11 | ), 12 | )} 13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /next/src/components/not-found-page.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslations } from "next-intl"; 2 | 3 | import { HeadingPage } from "@/components/heading--page"; 4 | 5 | import { LinkWithLocale } from "@/i18n/routing"; 6 | 7 | export default function NotFoundPage() { 8 | const t = useTranslations("Not-Found"); 9 | 10 | return ( 11 | <> 12 | {t("title")} 13 |

14 | {t("content")}{" "} 15 | 16 | {t("back-to-homepage")} 17 | 18 |

19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /next/src/components/paragraph/paragraph--image.tsx: -------------------------------------------------------------------------------- 1 | import { Media } from "@/components/media"; 2 | import type { FragmentParagraphImageFragment } from "@/lib/gql/graphql"; 3 | 4 | export function ParagraphImage({ 5 | paragraph, 6 | }: { 7 | paragraph: FragmentParagraphImageFragment; 8 | }) { 9 | return ( 10 |
11 | 12 |
13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /next/src/components/paragraph/paragraph--liftup-article.tsx: -------------------------------------------------------------------------------- 1 | import { ArticleTeasers } from "@/components/article/article-teasers"; 2 | import type { FragmentParagraphLiftupArticleFragment } from "@/lib/gql/graphql"; 3 | 4 | export function ParagraphLiftupArticle({ 5 | paragraph, 6 | }: { 7 | paragraph: FragmentParagraphLiftupArticleFragment; 8 | }) { 9 | return ( 10 |
11 | 15 |
16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /next/src/components/paragraph/paragraph--video.tsx: -------------------------------------------------------------------------------- 1 | import { Media } from "@/components/media"; 2 | import type { FragmentParagraphVideoFragment } from "@/lib/gql/graphql"; 3 | 4 | export function ParagraphVideo({ 5 | paragraph, 6 | }: { 7 | paragraph: FragmentParagraphVideoFragment; 8 | }) { 9 | return ( 10 |
11 | 12 |
13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /next/src/components/theme-provider.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { 4 | ThemeProvider as NextThemesProvider, 5 | type ThemeProviderProps, 6 | } from "next-themes"; 7 | import * as React from "react"; 8 | 9 | export function ThemeProvider({ children, ...props }: ThemeProviderProps) { 10 | return {children}; 11 | } 12 | -------------------------------------------------------------------------------- /next/src/components/ui/logout-button.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { signOut } from "next-auth/react"; 4 | 5 | interface LogoutButtonProps { 6 | children?: React.ReactNode; 7 | } 8 | 9 | export const LogoutButton = ({ children }: LogoutButtonProps) => { 10 | const onClick = () => { 11 | void signOut(); 12 | }; 13 | 14 | return ( 15 | 21 | {children} 22 | 23 | ); 24 | }; 25 | -------------------------------------------------------------------------------- /next/src/components/ui/skip-to-content-link.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import React from "react"; 3 | 4 | interface ContentLinkProps { 5 | href: string; 6 | children: React.ReactNode; 7 | } 8 | 9 | export function SkipToContentLink({ href, children }: ContentLinkProps) { 10 | return ( 11 | 16 | {children} 17 | 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /next/src/i18n/request.ts: -------------------------------------------------------------------------------- 1 | import { getRequestConfig } from "next-intl/server"; 2 | 3 | import { routing } from "./routing"; 4 | 5 | export default getRequestConfig(async ({ requestLocale }) => { 6 | let locale = await requestLocale; 7 | 8 | // Ensure that the incoming locale is valid 9 | if ( 10 | !locale || 11 | !routing.locales.includes(locale as (typeof routing.locales)[number]) 12 | ) { 13 | locale = routing.defaultLocale; 14 | } 15 | 16 | return { 17 | locale, 18 | messages: (await import(`../../messages/${locale}.json`)).default, 19 | }; 20 | }); 21 | -------------------------------------------------------------------------------- /next/src/lib/auth/get-auth.ts: -------------------------------------------------------------------------------- 1 | import { cache } from "react"; 2 | 3 | import { auth } from "@/auth"; 4 | 5 | export const getAuth = cache(async () => { 6 | const session = await auth(); 7 | 8 | if (!session) { 9 | return null; 10 | } 11 | 12 | return session; 13 | }); 14 | -------------------------------------------------------------------------------- /next/src/lib/auth/redirect-expired-login.ts: -------------------------------------------------------------------------------- 1 | import type { Redirect } from "next"; 2 | 3 | export function redirectExpiredSessionToLoginPage( 4 | locale: string, 5 | callbackUrl: string, 6 | ) { 7 | const redirect: Redirect = { 8 | destination: `/${locale}/auth/login?logout=true&callbackUrl=${encodeURIComponent( 9 | callbackUrl, 10 | )}`, 11 | permanent: false, 12 | }; 13 | 14 | return { redirect }; 15 | } 16 | -------------------------------------------------------------------------------- /next/src/lib/constants.ts: -------------------------------------------------------------------------------- 1 | export const REVALIDATE_SHORT = 10; // 10 seconds 2 | 3 | // If you use Redis caching and you change this value, you should also change the constant with the same name in the cache handler. 4 | export const REVALIDATE_LONG = 600; // 10 minutes 5 | -------------------------------------------------------------------------------- /next/src/lib/graphql/fragments/users.ts: -------------------------------------------------------------------------------- 1 | import { graphql } from "@/lib/gql"; 2 | 3 | export const FRAGMENT_USER = graphql(` 4 | fragment FragmentUser on User { 5 | name 6 | mail 7 | } 8 | `); 9 | -------------------------------------------------------------------------------- /next/src/lib/graphql/utils.ts: -------------------------------------------------------------------------------- 1 | import { GetNodeByPathQuery } from "@/lib/gql/graphql"; 2 | 3 | export const extractEntityFromRouteQueryResult = (data: GetNodeByPathQuery) => 4 | data?.route?.__typename == "RouteInternal" && data.route.entity; 5 | 6 | export const extractRedirectFromRouteQueryResult = (data: GetNodeByPathQuery) => 7 | data?.route?.__typename == "RouteRedirect" && data.route; 8 | -------------------------------------------------------------------------------- /next/src/lib/hooks/use-effect-once.ts: -------------------------------------------------------------------------------- 1 | import { EffectCallback, useEffect } from "react"; 2 | 3 | /** 4 | * Runs an effect only once, on mount. 5 | */ 6 | export function useEffectOnce(effect: EffectCallback) { 7 | // eslint-disable-next-line react-hooks/exhaustive-deps 8 | useEffect(effect, []); 9 | } 10 | -------------------------------------------------------------------------------- /next/src/lib/zod/contact-form.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const contactFormSchema = z.object({ 4 | name: z.string().min(2, { 5 | message: "Username must be at least 2 characters.", 6 | }), 7 | email: z.string().email(), 8 | subject: z.string().min(2, { 9 | message: "Subject must be at least 2 characters.", 10 | }), 11 | message: z.string().min(10, { 12 | message: "Message must be at least 10 characters.", 13 | }), 14 | }); 15 | 16 | export type ContactFormInputs = z.infer; 17 | -------------------------------------------------------------------------------- /next/src/lib/zod/login-form.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const loginFormSchema = z.object({ 4 | username: z.string(), 5 | password: z.string(), 6 | }); 7 | 8 | export type LoginFormInputs = z.infer; 9 | -------------------------------------------------------------------------------- /next/src/lib/zod/register-form.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const registerFormSchema = z.object({ 4 | name: z.string().min(2, { 5 | message: "Username must be at least 2 characters.", 6 | }), 7 | email: z.string().email(), 8 | }); 9 | 10 | export type RegisterFormInputs = z.infer; 11 | -------------------------------------------------------------------------------- /next/src/stories/separator.stories.tsx: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from "@storybook/react"; 2 | 3 | import { Separator } from "@/components/ui/separator"; 4 | 5 | const meta: Meta = { 6 | title: "Library/Separator", 7 | component: Separator, 8 | }; 9 | 10 | export default meta; 11 | type Story = StoryObj; 12 | 13 | export const Example: Story = {}; 14 | 15 | export const ExampleWithContext: Story = { 16 | name: "Example with context", 17 | render: () => ( 18 |
19 |
Example text above separator
20 | 21 |
Example text below separator
22 |
23 | ), 24 | }; 25 | -------------------------------------------------------------------------------- /next/src/styles/fonts.tsx: -------------------------------------------------------------------------------- 1 | import { Inter, Overpass } from "next/font/google"; 2 | 3 | export const inter = Inter({ 4 | subsets: ["latin"], 5 | variable: "--font-inter", 6 | }); 7 | 8 | export const overpass = Overpass({ 9 | subsets: ["latin"], 10 | variable: "--font-overpass", 11 | }); 12 | -------------------------------------------------------------------------------- /next/src/styles/icons/accessibility.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/account-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/add-photo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/arrow-ascend.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/arrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/block.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/bookmark-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/camera.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/checkmark.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/chevron-down.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/close.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/code.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/copy.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/desktop.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/download.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/error.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/external.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/facebook.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/fullscreen.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/heart-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/heart.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/help.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/home.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/image.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/laptop.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/link-off.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/link.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/linkedin.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/list.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/location-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/location.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/login.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/logout.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/mail.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/notifications.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/payment.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/phone.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/pin.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/qr.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/quote.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/react-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | React Logo 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /next/src/styles/icons/refresh.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/search.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/star-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/star.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/sync.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/text_decrease.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/text_increase.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/thumb_down.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/thumb_up.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/tiktok.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/upload.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/warning.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/youtube.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/zoom_in.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/styles/icons/zoom_out.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /next/src/types/next-auth.d.ts: -------------------------------------------------------------------------------- 1 | import { DefaultSession } from "next-auth"; 2 | 3 | declare module "next-auth" { 4 | interface SessionUser { 5 | user: DefaultSession["user"]; 6 | } 7 | 8 | interface Session extends SessionUser { 9 | accessToken?: unknown; 10 | error?: unknown; 11 | } 12 | 13 | interface User extends SessionUser { 14 | role: string; 15 | access_token: string; 16 | expires_in: number; 17 | refresh_token: string; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /next/src/types/next-intl.d.ts: -------------------------------------------------------------------------------- 1 | import en from "../../messages/en.json"; 2 | 3 | type Messages = typeof en; 4 | export type TranslationKey = MessageKeys; 5 | 6 | declare global { 7 | // Use type safe message keys with `next-intl` 8 | type IntlMessages = Messages; 9 | } 10 | -------------------------------------------------------------------------------- /next/src/types/server-only.d.ts: -------------------------------------------------------------------------------- 1 | declare module "server-only"; 2 | -------------------------------------------------------------------------------- /silta/elasticsearch.Dockerfile: -------------------------------------------------------------------------------- 1 | # Keep ES version in sync with .lando.yml 2 | ARG ES_VERSION=8.10.2 3 | FROM docker.elastic.co/elasticsearch/elasticsearch:${ES_VERSION} 4 | ARG ES_VERSION 5 | 6 | USER root 7 | 8 | RUN elasticsearch-plugin install analysis-icu 9 | 10 | USER elasticsearch 11 | -------------------------------------------------------------------------------- /silta/nginx.Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile for the Nginx container. 2 | FROM wunderio/silta-nginx:1.26-v1 3 | 4 | COPY . /app/web 5 | -------------------------------------------------------------------------------- /silta/php.Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile for the PHP container. 2 | FROM wunderio/silta-php-fpm:8.3-fpm-v1 3 | 4 | COPY --chown=www-data:www-data . /app 5 | 6 | USER www-data -------------------------------------------------------------------------------- /silta/shell.Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile for the Shell container. 2 | FROM wunderio/silta-php-shell:php8.3-v1 3 | 4 | COPY --chown=www-data:www-data . /app 5 | -------------------------------------------------------------------------------- /silta/silta-main.yml: -------------------------------------------------------------------------------- 1 | referenceData: 2 | updateAfterDeployment: false 3 | 4 | php: 5 | env: 6 | WUNDER_NEXT_FRONTEND_URL: https://next-drupal-starterkit.dev.wdr.io 7 | -------------------------------------------------------------------------------- /silta/silta-next-main.yml: -------------------------------------------------------------------------------- 1 | # Values in this file override the default values of our helm chart. 2 | # 3 | # See https://github.com/wunderio/charts/blob/master/frontend/values.yaml 4 | # for all possible options. 5 | # 6 | # 7 | exposeDomains: 8 | main-site: 9 | hostname: next-drupal-starterkit.dev.wdr.io 10 | 11 | services: 12 | node: 13 | env: 14 | NEXT_PUBLIC_FRONTEND_URL: https://next-drupal-starterkit.dev.wdr.io 15 | AUTH_URL: https://next-drupal-starterkit.dev.wdr.io 16 | 17 | nginx: 18 | basicauth: 19 | enabled: false 20 | -------------------------------------------------------------------------------- /silta/silta-storybook.yml: -------------------------------------------------------------------------------- 1 | # nginx: 2 | # basicauth: 3 | # enabled: true 4 | # credentials: 5 | # username: silta 6 | # password: demo 7 | # noauthips: 8 | # wunder-vpn: 194.89.156.118/32 9 | # extraConfig: | 10 | # include mime.types; 11 | # types { 12 | # # Base Silta config uses "application/octet-stream" for .mjs. 13 | # # Browsers will refuse to run any JS files served with such mimetype. 14 | # # Setting mimetype to "text/javascript" will make it work. 15 | # text/javascript mjs; 16 | # } 17 | --------------------------------------------------------------------------------