|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +module RubyUI |
| 4 | + class ToastItem < Base |
| 5 | + ALERT_VARIANTS = %i[error].freeze |
| 6 | + |
| 7 | + def initialize( |
| 8 | + variant: :default, |
| 9 | + id: nil, |
| 10 | + duration: nil, |
| 11 | + dismissible: true, |
| 12 | + invert: false, |
| 13 | + on_dismiss: nil, |
| 14 | + on_auto_close: nil, |
| 15 | + **attrs |
| 16 | + ) |
| 17 | + @variant = variant.to_sym |
| 18 | + @id = id |
| 19 | + @duration = duration |
| 20 | + @dismissible = dismissible |
| 21 | + @invert = invert |
| 22 | + @on_dismiss = on_dismiss |
| 23 | + @on_auto_close = on_auto_close |
| 24 | + super(**attrs) |
| 25 | + end |
| 26 | + |
| 27 | + def view_template(&) |
| 28 | + li(**attrs, &) |
| 29 | + end |
| 30 | + |
| 31 | + private |
| 32 | + |
| 33 | + def default_attrs |
| 34 | + a = { |
| 35 | + role: ALERT_VARIANTS.include?(@variant) ? "alert" : "status", |
| 36 | + aria_atomic: "true", |
| 37 | + tabindex: "0", |
| 38 | + data: { |
| 39 | + variant: @variant.to_s, |
| 40 | + state: "pending", |
| 41 | + swipe: "none", |
| 42 | + controller: "ruby-ui--toast", |
| 43 | + ruby_ui__toast_dismissible_value: @dismissible.to_s, |
| 44 | + ruby_ui__toast_invert_value: @invert.to_s |
| 45 | + }, |
| 46 | + class: item_classes |
| 47 | + } |
| 48 | + a[:id] = @id if @id |
| 49 | + a[:data][:ruby_ui__toast_duration_value] = @duration.to_s if @duration |
| 50 | + a[:data][:ruby_ui__toast_on_dismiss_value] = @on_dismiss if @on_dismiss |
| 51 | + a[:data][:ruby_ui__toast_on_auto_close_value] = @on_auto_close if @on_auto_close |
| 52 | + a |
| 53 | + end |
| 54 | + |
| 55 | + def item_classes |
| 56 | + <<~CLASSES.tr("\n", " ").squeeze(" ").strip |
| 57 | + group/toast pointer-events-auto relative flex w-[356px] max-w-full items-center gap-3 |
| 58 | + overflow-hidden rounded-lg border bg-popover text-popover-foreground |
| 59 | + border-border p-4 pr-8 shadow-lg |
| 60 | + transition-all duration-200 ease-out |
| 61 | + will-change-transform |
| 62 | + translate-y-[var(--y-offset,0px)] scale-[var(--scale,1)] opacity-[var(--opacity,1)] |
| 63 | + data-[state=pending]:opacity-0 data-[state=pending]:translate-y-2 |
| 64 | + data-[state=open]:animate-in data-[state=open]:fade-in-0 |
| 65 | + data-[state=closing]:animate-out data-[state=closing]:fade-out-0 |
| 66 | + data-[swipe=move]:transition-none |
| 67 | + data-[swipe=cancel]:translate-x-0 |
| 68 | + data-[swipe=end]:translate-x-[var(--swipe-end-x,0)] |
| 69 | + data-[swipe=end]:translate-y-[var(--swipe-end-y,0)] |
| 70 | + data-[variant=success]:border-green-500/30 |
| 71 | + data-[variant=error]:border-red-500/30 |
| 72 | + data-[variant=warning]:border-yellow-500/30 |
| 73 | + data-[variant=info]:border-blue-500/30 |
| 74 | + CLASSES |
| 75 | + end |
| 76 | + end |
| 77 | +end |
0 commit comments