|
1702 | 1702 | } |
1703 | 1703 | ] |
1704 | 1704 | }, |
| 1705 | + "message": { |
| 1706 | + "name": "Message", |
| 1707 | + "description": "A chat message layout that pairs an avatar with bubbles, headers, and footers. Built on top of Avatar and Bubble.", |
| 1708 | + "files": [ |
| 1709 | + { |
| 1710 | + "path": "message.rb", |
| 1711 | + "content": "# frozen_string_literal: true\n\nmodule RubyUI\n class Message < Base\n def initialize(align: :start, **attrs)\n @align = align\n super(**attrs)\n end\n\n def view_template(&)\n div(**attrs, &)\n end\n\n private\n\n def default_attrs\n {\n data: {slot: \"message\", align: @align},\n class: \"group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse\"\n }\n end\n end\nend\n" |
| 1712 | + }, |
| 1713 | + { |
| 1714 | + "path": "message_avatar.rb", |
| 1715 | + "content": "# frozen_string_literal: true\n\nmodule RubyUI\n class MessageAvatar < Base\n def view_template(&)\n div(**attrs, &)\n end\n\n private\n\n def default_attrs\n {\n data: {slot: \"message-avatar\"},\n class: \"flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8\"\n }\n end\n end\nend\n" |
| 1716 | + }, |
| 1717 | + { |
| 1718 | + "path": "message_content.rb", |
| 1719 | + "content": "# frozen_string_literal: true\n\nmodule RubyUI\n class MessageContent < Base\n def view_template(&)\n div(**attrs, &)\n end\n\n private\n\n def default_attrs\n {\n data: {slot: \"message-content\"},\n class: \"flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:[&>[data-slot]]:self-end\"\n }\n end\n end\nend\n" |
| 1720 | + }, |
| 1721 | + { |
| 1722 | + "path": "message_footer.rb", |
| 1723 | + "content": "# frozen_string_literal: true\n\nmodule RubyUI\n class MessageFooter < Base\n def view_template(&)\n div(**attrs, &)\n end\n\n private\n\n def default_attrs\n {\n data: {slot: \"message-footer\"},\n class: \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-data-[align=end]/message:justify-end group-has-data-[variant=ghost]/message:px-0\"\n }\n end\n end\nend\n" |
| 1724 | + }, |
| 1725 | + { |
| 1726 | + "path": "message_group.rb", |
| 1727 | + "content": "# frozen_string_literal: true\n\nmodule RubyUI\n class MessageGroup < Base\n def view_template(&)\n div(**attrs, &)\n end\n\n private\n\n def default_attrs\n {\n data: {slot: \"message-group\"},\n class: \"flex min-w-0 flex-col gap-2\"\n }\n end\n end\nend\n" |
| 1728 | + }, |
| 1729 | + { |
| 1730 | + "path": "message_header.rb", |
| 1731 | + "content": "# frozen_string_literal: true\n\nmodule RubyUI\n class MessageHeader < Base\n def view_template(&)\n div(**attrs, &)\n end\n\n private\n\n def default_attrs\n {\n data: {slot: \"message-header\"},\n class: \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0\"\n }\n end\n end\nend\n" |
| 1732 | + } |
| 1733 | + ], |
| 1734 | + "dependencies": { |
| 1735 | + "components": [ |
| 1736 | + "Avatar", |
| 1737 | + "Bubble" |
| 1738 | + ], |
| 1739 | + "js_packages": [], |
| 1740 | + "gems": [] |
| 1741 | + }, |
| 1742 | + "install_command": "rails g ruby_ui:component Message", |
| 1743 | + "docs_markdown": "# Message\n\nA chat message layout that pairs an avatar with bubbles, headers, and footers. Built on top of Avatar and Bubble.\n\n## Usage\n\n### Conversation\n\n```ruby\ndiv(class: \"flex flex-col gap-6\") do\n Message(align: :end) do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/joeldrapper.png\", alt: \"@me\")\n AvatarFallback { \"ME\" }\n end\n end\n MessageContent do\n Bubble do\n BubbleContent { \"Deploying to prod real quick.\" }\n end\n end\n end\n\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n Bubble(variant: :muted) do\n BubbleContent { \"It's 4:55 PM. On a Friday.\" }\n end\n end\n end\n\n Message(align: :end) do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/joeldrapper.png\", alt: \"@me\")\n AvatarFallback { \"ME\" }\n end\n end\n MessageContent do\n Bubble do\n BubbleContent { \"It's a one-line change.\" }\n end\n MessageFooter { \"Delivered\" }\n end\n end\n\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n BubbleGroup do\n Bubble(variant: :muted) do\n BubbleContent { \"It's always a one-line change 😭.\" }\n end\n Bubble(variant: :muted) do\n BubbleContent { \"Alright, let me take a look.\" }\n BubbleReactions(role: \"img\", aria_label: \"Reaction: thumbs up\") do\n span { \"👍\" }\n end\n end\n end\n end\n end\nend\n```\n\n## With header\n\n### Header and footer\n\n```ruby\nMessage do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@oliver\")\n AvatarFallback { \"OL\" }\n end\n end\n MessageContent do\n MessageHeader { \"Oliver\" }\n Bubble(variant: :muted) do\n BubbleContent { \"Pushed the fix, can you review?\" }\n end\n MessageFooter { \"9:41 AM\" }\n end\nend\n```\n\n## Alignment\n\n### Sender and receiver\n\n```ruby\ndiv(class: \"flex flex-col gap-6\") do\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n Bubble(variant: :muted) { BubbleContent { \"Aligned to the start.\" } }\n end\n end\n Message(align: :end) do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/joeldrapper.png\", alt: \"@me\")\n AvatarFallback { \"ME\" }\n end\n end\n MessageContent do\n Bubble { BubbleContent { \"Aligned to the end.\" } }\n end\n end\nend\n```\n\n## Group\n\n### Message group\n\n```ruby\nMessageGroup do\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n Bubble(variant: :muted) { BubbleContent { \"First message.\" } }\n end\n end\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n Bubble(variant: :muted) { BubbleContent { \"Second, tighter spacing.\" } }\n end\n end\nend\n```", |
| 1744 | + "examples": [ |
| 1745 | + { |
| 1746 | + "title": "Conversation", |
| 1747 | + "code": "div(class: \"flex flex-col gap-6\") do\n Message(align: :end) do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/joeldrapper.png\", alt: \"@me\")\n AvatarFallback { \"ME\" }\n end\n end\n MessageContent do\n Bubble do\n BubbleContent { \"Deploying to prod real quick.\" }\n end\n end\n end\n\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n Bubble(variant: :muted) do\n BubbleContent { \"It's 4:55 PM. On a Friday.\" }\n end\n end\n end\n\n Message(align: :end) do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/joeldrapper.png\", alt: \"@me\")\n AvatarFallback { \"ME\" }\n end\n end\n MessageContent do\n Bubble do\n BubbleContent { \"It's a one-line change.\" }\n end\n MessageFooter { \"Delivered\" }\n end\n end\n\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n BubbleGroup do\n Bubble(variant: :muted) do\n BubbleContent { \"It's always a one-line change 😭.\" }\n end\n Bubble(variant: :muted) do\n BubbleContent { \"Alright, let me take a look.\" }\n BubbleReactions(role: \"img\", aria_label: \"Reaction: thumbs up\") do\n span { \"👍\" }\n end\n end\n end\n end\n end\nend\n", |
| 1748 | + "language": "ruby" |
| 1749 | + }, |
| 1750 | + { |
| 1751 | + "title": "Header and footer", |
| 1752 | + "code": "Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@oliver\")\n AvatarFallback { \"OL\" }\n end\n end\n MessageContent do\n MessageHeader { \"Oliver\" }\n Bubble(variant: :muted) do\n BubbleContent { \"Pushed the fix, can you review?\" }\n end\n MessageFooter { \"9:41 AM\" }\n end\nend\n", |
| 1753 | + "language": "ruby" |
| 1754 | + }, |
| 1755 | + { |
| 1756 | + "title": "Sender and receiver", |
| 1757 | + "code": "div(class: \"flex flex-col gap-6\") do\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n Bubble(variant: :muted) { BubbleContent { \"Aligned to the start.\" } }\n end\n end\n Message(align: :end) do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/joeldrapper.png\", alt: \"@me\")\n AvatarFallback { \"ME\" }\n end\n end\n MessageContent do\n Bubble { BubbleContent { \"Aligned to the end.\" } }\n end\n end\nend\n", |
| 1758 | + "language": "ruby" |
| 1759 | + }, |
| 1760 | + { |
| 1761 | + "title": "Message group", |
| 1762 | + "code": "MessageGroup do\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n Bubble(variant: :muted) { BubbleContent { \"First message.\" } }\n end\n end\n Message do\n MessageAvatar do\n Avatar(size: :sm) do\n AvatarImage(src: \"https://github.com/shadcn.png\", alt: \"@rabbit\")\n AvatarFallback { \"R\" }\n end\n end\n MessageContent do\n Bubble(variant: :muted) { BubbleContent { \"Second, tighter spacing.\" } }\n end\n end\nend\n", |
| 1763 | + "language": "ruby" |
| 1764 | + } |
| 1765 | + ] |
| 1766 | + }, |
1705 | 1767 | "native_select": { |
1706 | 1768 | "name": "NativeSelect", |
1707 | 1769 | "description": "A styled native HTML select element with consistent design system integration.", |
|
0 commit comments