# Content Types Configuration Defaults and Helpers # # Provides shared default values and helper functions for content type creation. # Reduces duplication by providing common patterns. let contracts = import "contracts.ncl" in { # Base content features with sensible defaults # Use this as foundation via merge operator (&) # Note: | default = allows overriding via merge base_features = { style_mode | default = "row", use_feature | default = false, use_categories | default = true, use_tags | default = true, use_emojis | default = false, default_page_size | default = 12, page_size_options | default = [6, 12, 24], show_page_info | default = true, pagination_style | default = "numbered", }, # Base content kind with common defaults base_content_kind = { enabled | default = true, is_default | default = false, specialized | default = false, }, # Helper function: Create a basic content type with minimal required fields # # Usage: # make_content_kind "blog" "blog" # & { features = { style_css = "blog-content", cta_view = "BlogCTAView" } } # # Parameters: # kind_name: Content type name (e.g., "blog", "recipes") # dir_name: Directory name where content is stored # # Returns: ContentKind record with defaults + required fields make_content_kind | String -> String -> Dyn = fun kind_name dir_name => base_content_kind & { name = kind_name, directory = dir_name, features = base_features & { style_css | default = "%{kind_name}-content", cta_view | default = "DefaultCTAView", }, }, # Helper function: Create a blog-style content type # # Blog characteristics: # - Row layout # - Featured content # - Categories and tags # - Emojis enabled # - Smaller page sizes # # Usage: # make_blog_type "blog" "blog" "BlogCTAView" # # Parameters: # kind_name: Content type name # dir_name: Directory name # cta_view_name: CTA view component name # # Returns: ContentKind configured for blog-style content make_blog_type | String -> String -> String -> Dyn = fun kind_name dir_name cta_view_name => make_content_kind kind_name dir_name & { features = base_features & { style_mode = "row", style_css = "%{kind_name}-content", use_feature = true, use_emojis = true, cta_view = cta_view_name, default_page_size = 8, page_size_options = [5, 8, 12, 20], }, }, # Helper function: Create a grid-style content type (recipes, portfolio, etc.) # # Grid characteristics: # - Grid layout # - No featured content typically # - Categories (may or may not use tags) # - Larger page sizes # # Usage: # make_grid_type "recipes" "recipes" "RecipesCTAView" # & { features.use_emojis = true } # # Parameters: # kind_name: Content type name # dir_name: Directory name # cta_view_name: CTA view component name # # Returns: ContentKind configured for grid-style content make_grid_type | String -> String -> String -> Dyn = fun kind_name dir_name cta_view_name => make_content_kind kind_name dir_name & { features = base_features & { style_mode = "grid", style_css = "%{kind_name}-content", use_feature | default = false, cta_view = cta_view_name, default_page_size = 12, page_size_options = [6, 12, 18, 24], }, }, # Helper function: Create a tutorial/course content type # # Tutorial characteristics: # - Row layout # - Featured content # - Shows difficulty, duration, prerequisites # - Categories and tags # # Usage: # make_tutorial_type "tutorials" "tutorials" "TutorialsCTAView" # # Parameters: # kind_name: Content type name # dir_name: Directory name # cta_view_name: CTA view component name # # Returns: ContentKind configured for tutorial content make_tutorial_type | String -> String -> String -> Dyn = fun kind_name dir_name cta_view_name => make_content_kind kind_name dir_name & { specialized = true, features = base_features & { style_mode = "row", style_css = "%{kind_name}-content", use_feature = true, cta_view = cta_view_name, show_difficulty = true, show_duration = true, show_prerequisites = true, }, }, # Helper function: Create the default/fallback content type # # Default content type is used when no specific type matches. # Typically has minimal features enabled. # # Usage: # make_default_content "content" "content" # # Parameters: # kind_name: Content type name (usually "content") # dir_name: Directory name # # Returns: ContentKind configured as default type make_default_content | String -> String -> Dyn = fun kind_name dir_name => make_content_kind kind_name dir_name & { is_default = true, features = base_features & { style_css = "default-content", cta_view = "DefaultCTAView", }, }, # Common style modes style_modes = { row = "row", grid = "grid", masonry = "masonry", list = "list", }, # Common pagination styles pagination_styles = { numbered = "numbered", simple = "simple", infinite = "infinite", load_more = "load_more", }, # Common page size presets page_sizes = { small = [5, 10, 15, 20], medium = [8, 12, 20, 30], large = [12, 24, 36, 48], cards = [6, 12, 18, 24], }, }