lib/joby_kit.ex

defmodule JobyKit do
  @moduledoc """
  An opinionated, agentic-first design-system kit for Phoenix + daisyUI apps.

  JobyKit ships:

  * A small `JobyKit.Manifest` behaviour for hosts to declare their UI
    component inventory.
  * A `JobyKit.PageComponent` function component that renders a discoverable,
    machine-readable design page from any manifest module.
  * A `JobyKit.ManifestController` that serves the same data as JSON for
    coding agents.
  * A daisyUI catalogue indexing every primitive in the substrate so the next
    person reaching for a tab strip / modal / dropdown / skeleton can confirm
    it already exists before reinventing it.
  * The contract content (decision tree, wrapper rules, taxonomy) — universal
    to every consumer, not host-specific.

  Hosts own their wrapper components (in `core_components.ex`), their manifest
  declaration, their preview functions, and their skin CSS. JobyKit provides
  the rendering surface and the contract.

  ## Minimal install

      defmodule MyAppWeb.DesignManifest do
        use JobyKit.Manifest

        category :core,
          label: "Core wrappers",
          description: "One wrapper per daisyUI primitive. Live in core_components."

        component MyAppWeb.CoreComponents, :button,
          category: :core,
          daisy_basis: "btn",
          summary: "Standard text button.",
          preview: &MyAppWeb.DesignPreviews.button/1
      end

  Then in `router.ex`:

      live "/design", MyAppWeb.DesignSystemLive, :index

      get "/design.json", JobyKit.ManifestController, :show,
        private: %{joby_kit_manifest: MyAppWeb.DesignManifest}

  And in your LiveView:

      def render(assigns), do: ~H\"\"\"
        <Layouts.app flash={@flash}>
          <JobyKit.PageComponent manifest={MyAppWeb.DesignManifest} />
        </Layouts.app>
      \"\"\"
  """
end