Update to LV 1.0 (#2883)

This commit is contained in:
Jonatan Kłosko 2024-12-04 10:37:17 +01:00 committed by GitHub
parent 47425897c8
commit 5ae61ed776
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
73 changed files with 297 additions and 299 deletions

View file

@ -58,7 +58,7 @@ defmodule LivebookWeb.AppComponents do
~H"""
<span class="flex items-center space-x-2">
<.status_indicator variant={@variant} />
<span :if={@text}><%= @text %></span>
<span :if={@text}>{@text}</span>
</span>
"""
end

View file

@ -89,10 +89,10 @@ defmodule LivebookWeb.Confirm do
data-el-confirm-form
>
<h3 class="text-2xl font-semibold text-gray-800">
<%= @title %>
{@title}
</h3>
<p class="mt-8 text-gray-700">
<%= @description %>
{@description}
</p>
<div :if={@options != []} class="mt-8">
<h3 class="mb-2 text-lg font-semibold text-gray-800">
@ -125,7 +125,7 @@ defmodule LivebookWeb.Confirm do
</.button>
<.button color={if(@danger, do: "red", else: "blue")} type="submit">
<.remix_icon :if={@confirm_icon} icon={@confirm_icon} />
<span><%= @confirm_text %></span>
<span>{@confirm_text}</span>
</.button>
</div>
</div>

View file

@ -127,7 +127,7 @@ defmodule LivebookWeb.CoreComponents do
phx-no-format
><%= @message %></div>
<%= if @inner_block != [] do %>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
<% end %>
</div>
"""
@ -213,7 +213,7 @@ defmodule LivebookWeb.CoreComponents do
<span class="text-sm">(esc)</span>
<.remix_icon icon="close-line" class="text-2xl" />
</button>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</.focus_wrap>
</div>
</div>
@ -308,7 +308,7 @@ defmodule LivebookWeb.CoreComponents do
phx-window-keydown={hide_menu(@id)}
phx-key="escape"
>
<%= render_slot(@toggle) %>
{render_slot(@toggle)}
</div>
<div id={"#{@id}-overlay"} class="fixed z-[90] inset-0 hidden" phx-click-away={hide_menu(@id)}>
</div>
@ -328,7 +328,7 @@ defmodule LivebookWeb.CoreComponents do
id={"#{@id}-content-inner"}
class="rounded-lg bg-white flex flex-col py-2 shadow-[0_15px_99px_-0px_rgba(12,24,41,0.15)]"
>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</div>
</menu>
</div>
@ -435,10 +435,10 @@ defmodule LivebookWeb.CoreComponents do
def submenu(assigns) do
~H"""
<div class="group relative">
<%= render_slot(@primary) %>
{render_slot(@primary)}
<div class="absolute -top-2 right-0 translate-x-full pl-2 hidden group-hover:flex group-focus-within:flex">
<menu class="relative mt-0 z-[100] rounded-lg bg-white flex flex-col py-2 shadow-[0_15px_99px_-0px_rgba(12,24,41,0.15)]">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</menu>
</div>
</div>
@ -461,7 +461,7 @@ defmodule LivebookWeb.CoreComponents do
menu_item_class(@variant),
@disabled && "pointer-events-none opacity-50"
]}>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</li>
"""
end
@ -542,7 +542,7 @@ defmodule LivebookWeb.CoreComponents do
~H"""
<div>
<div class="flex justify-between items-center">
<span class="text-sm text-gray-700 font-semibold"><%= @title %></span>
<span class="text-sm text-gray-700 font-semibold">{@title}</span>
<div class="flex justify-end space-x-2">
<span class="tooltip left" data-tooltip="Copy source">
<.icon_button
@ -584,14 +584,14 @@ defmodule LivebookWeb.CoreComponents do
~H"""
<div class={["flex flex-col space-y-1", @class]}>
<span class="text-sm text-gray-500">
<%= @label %>
{@label}
</span>
<span class={[
"text-gray-800 text-sm font-semibold",
@one_line &&
"whitespace-nowrap overflow-hidden text-ellipsis hover:text-clip hover:overflow-auto hover:tiny-scrollbar"
]}>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</span>
</div>
"""
@ -629,7 +629,7 @@ defmodule LivebookWeb.CoreComponents do
disabled={@disabled}
{@rest}
>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</button>
"""
end
@ -691,9 +691,9 @@ defmodule LivebookWeb.CoreComponents do
</div>
<div class="grow flex items-center justify-between">
<div class="text-gray-600">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</div>
<%= render_slot(@actions) %>
{render_slot(@actions)}
</div>
</div>
"""
@ -749,8 +749,8 @@ defmodule LivebookWeb.CoreComponents do
def listing(%{items: [_]} = assigns) do
~H"""
<%= render_slot(@item, hd(@items)) %>
<%= render_slot(@singular_suffix) %>
{render_slot(@item, hd(@items))}
{render_slot(@singular_suffix)}
"""
end
@ -761,10 +761,10 @@ defmodule LivebookWeb.CoreComponents do
~H"""
<%= for item <- @leading do %>
<%= render_slot(@item, item) %>,
{render_slot(@item, item)},
<% end %>
<%= render_slot(@item, @second_to_last) %> and <%= render_slot(@item, @last) %>
<%= render_slot(@plural_suffix) %>
{render_slot(@item, @second_to_last)} and {render_slot(@item, @last)}
{render_slot(@plural_suffix)}
"""
end
@ -805,7 +805,7 @@ defmodule LivebookWeb.CoreComponents do
<thead class="text-sm text-left font-semibold leading-6 text-gray-900">
<tr>
<th :for={col <- @col} class="py-3.5 pl-4 pr-3 sm:pl-6">
<%= col[:label] %>
{col[:label]}
</th>
<th :if={@action != []} class="py-3.5 pl-3 pr-5 text-right sm:pr-7">
<span>Actions</span>
@ -824,13 +824,13 @@ defmodule LivebookWeb.CoreComponents do
class={["relative p-0", @row_click && "hover:cursor-pointer"]}
>
<div class="relative block p-4 sm:px-6">
<%= render_slot(col, @row_item.(row)) %>
{render_slot(col, @row_item.(row))}
</div>
</td>
<td :if={@action != []} class="relative p-0">
<div class="relative whitespace-nowrap py-4 pl-3 pr-4 sm:pr-6 flex justify-end items-center">
<span :for={action <- @action} class="ml-4">
<%= render_slot(action, @row_item.(row)) %>
{render_slot(action, @row_item.(row))}
</span>
</div>
</td>
@ -867,7 +867,7 @@ defmodule LivebookWeb.CoreComponents do
is_map_key(assigns.rest, :navigate) do
~H"""
<.link class={[button_classes(@small, @disabled, @color, @outlined), @class]} {@rest}>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</.link>
"""
end
@ -879,7 +879,7 @@ defmodule LivebookWeb.CoreComponents do
disabled={@disabled}
{@rest}
>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</button>
"""
end
@ -941,7 +941,7 @@ defmodule LivebookWeb.CoreComponents do
is_map_key(assigns.rest, :navigate) do
~H"""
<.link class={[icon_button_classes(@small, @disabled), @class]} {@rest}>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</.link>
"""
end
@ -949,7 +949,7 @@ defmodule LivebookWeb.CoreComponents do
def icon_button(assigns) do
~H"""
<button class={[icon_button_classes(@small, @disabled), @class]} disabled={@disabled} {@rest}>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</button>
"""
end
@ -1007,13 +1007,13 @@ defmodule LivebookWeb.CoreComponents do
}
>
<span class="font-medium">
<%= tab.label %>
{tab.label}
</span>
</button>
</div>
<div :for={tab <- @tab} data-tab={tab.id} class={@default == tab.id || "hidden"}>
<%= render_slot(tab) %>
{render_slot(tab)}
</div>
</div>
"""

View file

@ -237,7 +237,7 @@ defmodule LivebookWeb.FormComponents do
<div>
<div class="flex items-center gap-1 sm:gap-3 justify-between">
<span :if={@label} class="text-gray-700 flex gap-1 items-center">
<%= @label %>
{@label}
<.help :if={@help} text={@help} />
</span>
<label class={[
@ -264,7 +264,7 @@ defmodule LivebookWeb.FormComponents do
</div>
</label>
</div>
<.error :for={msg <- @errors}><%= msg %></.error>
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end
@ -312,11 +312,11 @@ defmodule LivebookWeb.FormComponents do
</svg>
</div>
<span :if={@label} class={["text-gray-700 flex gap-1 items-center", @small && "text-sm"]}>
<%= @label %>
{@label}
<.help :if={@help} text={@help} />
</span>
</label>
<.error :for={msg <- @errors}><%= msg %></.error>
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end
@ -341,7 +341,7 @@ defmodule LivebookWeb.FormComponents do
~H"""
<div>
<.label :if={@label} for={@id} help={@help}><%= @label %></.label>
<.label :if={@label} for={@id} help={@help}>{@label}</.label>
<div class="flex gap-4 text-gray-600">
<label :for={{value, description} <- @options} class="flex items-center gap-2 cursor-pointer">
<input
@ -355,10 +355,10 @@ defmodule LivebookWeb.FormComponents do
<div class="w-5 h-5 flex items-center justify-center border border-gray-300 peer-checked:border-blue-600 text-white peer-checked:text-blue-600 bg-white rounded-full">
<div class="w-3 h-3 rounded-full bg-current"></div>
</div>
<span><%= description %></span>
<span>{description}</span>
</label>
</div>
<.error :for={msg <- @errors}><%= msg %></.error>
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end
@ -385,7 +385,7 @@ defmodule LivebookWeb.FormComponents do
~H"""
<div>
<.label :if={@label} for={@id} help={@help}><%= @label %></.label>
<.label :if={@label} for={@id} help={@help}>{@label}</.label>
<div class="flex">
<label
:for={{value, description} <- @options}
@ -407,10 +407,10 @@ defmodule LivebookWeb.FormComponents do
checked={to_string(@value) == value}
{@rest}
/>
<span><%= description %></span>
<span>{description}</span>
</label>
</div>
<.error :for={msg <- @errors}><%= msg %></.error>
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end
@ -436,7 +436,7 @@ defmodule LivebookWeb.FormComponents do
<div class="flex border bg-gray-50 rounded-lg space-x-4 items-center">
<div id={"#{@id}-picker"} class="flex w-full" phx-hook="EmojiPicker">
<div class="grow p-1 pl-3">
<span id={"#{@id}-preview"} data-emoji-preview><%= @value %></span>
<span id={"#{@id}-preview"} data-emoji-preview>{@value}</span>
</div>
<button
id={"#{@id}-button"}
@ -496,10 +496,10 @@ defmodule LivebookWeb.FormComponents do
]}
{@rest}
>
<option :if={@prompt} value=""><%= @prompt %></option>
<option :if={@prompt} value="">{@prompt}</option>
<%!-- TODO: we use to_string to normalize nil and "", remove
this once fixed upstream https://github.com/phoenixframework/phoenix_html/issues/444 --%>
<%= Phoenix.HTML.Form.options_for_select(@options, to_string(@value)) %>
{Phoenix.HTML.Form.options_for_select(@options, to_string(@value))}
</select>
<div class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-500">
<.remix_icon icon="arrow-down-s-line" />
@ -542,9 +542,9 @@ defmodule LivebookWeb.FormComponents do
defp field_wrapper(assigns) do
~H"""
<div>
<.label :if={@label} for={@id} help={@help}><%= @label %></.label>
<%= render_slot(@inner_block) %>
<.error :for={msg <- @errors}><%= msg %></.error>
<.label :if={@label} for={@id} help={@help}>{@label}</.label>
{render_slot(@inner_block)}
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end
@ -559,7 +559,7 @@ defmodule LivebookWeb.FormComponents do
def label(assigns) do
~H"""
<label for={@for} class="mb-1 flex items-center gap-1 text-sm text-gray-800 font-medium">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
<.help :if={@help} text={@help} />
</label>
"""
@ -573,7 +573,7 @@ defmodule LivebookWeb.FormComponents do
def error(assigns) do
~H"""
<p class="mt-0.5 text-red-600 text-sm">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</p>
"""
end
@ -627,7 +627,7 @@ defmodule LivebookWeb.FormComponents do
~H"""
<div>
<.live_file_input upload={@upload} class="hidden" />
<.label><%= @label %></.label>
<.label>{@label}</.label>
<div :for={entry <- @upload.entries} class="flex flex-col gap-1">
<.file_entry entry={entry} on_clear={@on_clear} />
</div>
@ -654,7 +654,7 @@ defmodule LivebookWeb.FormComponents do
~H"""
<div class="flex flex-col gap-0.5">
<div class="flex items-center justify-between gap-1 text-gray-700">
<span><%= @name || @entry.client_name %></span>
<span>{@name || @entry.client_name}</span>
<button
type="button"
class="text-gray-500 hover:text-gray-900"
@ -666,7 +666,7 @@ defmodule LivebookWeb.FormComponents do
</button>
<span class="flex-grow"></span>
<span :if={@entry.preflighted?} class="text-sm font-medium">
<%= @entry.progress %>%
{@entry.progress}%
</span>
</div>
<div :if={@entry.preflighted?} class="w-full h-2 rounded-lg bg-blue-200">

View file

@ -39,7 +39,7 @@ defmodule LivebookWeb.LayoutComponents do
<div>
<%= if @topbar_action do %>
<%= render_slot(@topbar_action) %>
{render_slot(@topbar_action)}
<% else %>
<div class="text-gray-400 hover:text-gray-600 focus:text-gray-600">
<.link navigate={~p"/"} class="flex items-center" aria-label="go to home">
@ -50,7 +50,7 @@ defmodule LivebookWeb.LayoutComponents do
<% end %>
</div>
</div>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</div>
</div>
@ -94,7 +94,7 @@ defmodule LivebookWeb.LayoutComponents do
</span>
</.link>
<span class="text-gray-300 text-xs font-normal font-sans mx-2.5 pt-3 cursor-default">
v<%= Livebook.Config.app_version() %>
v{Livebook.Config.app_version()}
</span>
</div>
<.sidebar_link title="Home" icon="home-6-line" to={~p"/"} current={@current_page} />
@ -139,7 +139,7 @@ defmodule LivebookWeb.LayoutComponents do
/>
</div>
<span class="text-sm text-gray-400 font-medium group-hover:text-white">
<%= @current_user.name %>
{@current_user.name}
</span>
</button>
</div>
@ -160,7 +160,7 @@ defmodule LivebookWeb.LayoutComponents do
>
<.remix_icon icon={@icon} class="text-lg leading-6 w-[56px] flex justify-center" />
<span class="text-sm font-medium">
<%= @title %>
{@title}
</span>
</.link>
"""
@ -179,11 +179,11 @@ defmodule LivebookWeb.LayoutComponents do
>
<div class="text-lg leading-6 w-[56px] flex justify-center">
<span class="relative">
<%= @hub.emoji %>
{@hub.emoji}
</span>
</div>
<span class="text-sm font-medium">
<%= @hub.name %>
{@hub.name}
</span>
</.link>
"""
@ -194,7 +194,7 @@ defmodule LivebookWeb.LayoutComponents do
<.link {hub_connection_link_opts(@hub, @to, @current)}>
<div class="text-lg leading-6 w-[56px] flex justify-center">
<span class="relative">
<%= @hub.emoji %>
{@hub.emoji}
<div class={[
"absolute w-[10px] h-[10px] border-gray-900 border-2 rounded-full right-0 bottom-0",
@ -203,7 +203,7 @@ defmodule LivebookWeb.LayoutComponents do
</span>
</div>
<span class="text-sm font-medium">
<%= @hub.name %>
{@hub.name}
</span>
</.link>
"""
@ -286,9 +286,9 @@ defmodule LivebookWeb.LayoutComponents do
</div>
<h1 class="text-2xl text-gray-800 font-medium">
<%= if @inner_block != [] do %>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
<% else %>
<%= @text %>
{@text}
<% end %>
</h1>
</div>
@ -304,7 +304,7 @@ defmodule LivebookWeb.LayoutComponents do
def topbar(assigns) do
~H"""
<div class={["px-2 py-2 text-sm text-center", topbar_class(@variant)]}>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</div>
"""
end

View file

@ -1,3 +1,3 @@
<main role="main" class="grow flex flex-col h-screen">
<%= @inner_content %>
{@inner_content}
</main>

View file

@ -1,6 +1,6 @@
<main role="main" class="grow flex flex-col h-screen">
<.flash_group flash={@flash} />
<%= @inner_content %>
{@inner_content}
</main>
<.confirm_root confirm_state={@confirm_state} />

View file

@ -8,7 +8,7 @@
<link rel="icon" type="image/svg+xml" href={~p"/favicons/favicon.svg"} />
<link rel="alternate icon" type="image/png" href={~p"/favicons/favicon.png"} />
<.live_title>
<%= assigns[:page_title] || "Livebook" %>
{assigns[:page_title] || "Livebook"}
</.live_title>
<link phx-track-static rel="stylesheet" href={~p"/assets/app.css"} />
<script>
@ -26,6 +26,6 @@
data-feature-flags={Livebook.Config.enabled_feature_flags() |> Enum.join(",")}
data-within-iframe={Livebook.Config.within_iframe?()}
>
<%= @inner_content %>
{@inner_content}
</body>
</html>

View file

@ -20,9 +20,9 @@ defmodule LivebookWeb.NotebookComponents do
/>
</div>
<div class="px-6 py-4 bg-gray-100 rounded-b-2xl grow">
<span class="text-gray-800 font-semibold"><%= @notebook_info.title %></span>
<span class="text-gray-800 font-semibold">{@notebook_info.title}</span>
<p class="mt-2 text-sm text-gray-600">
<%= @notebook_info.details.description %>
{@notebook_info.details.description}
</p>
</div>
</.link>

View file

@ -21,7 +21,7 @@ defmodule LivebookWeb.UserComponents do
aria-hidden="true"
>
<div class={["text-gray-100 font-semibold", @text_class]}>
<%= avatar_text(@user.name) %>
{avatar_text(@user.name)}
</div>
</div>
"""

View file

@ -64,7 +64,7 @@
autofocus
/>
<span :for={error <- @errors} class="mt-1 text-red-600 text-sm">
<%= translate_error(error) %>
{translate_error(error)}
</span>
</div>
<button

View file

@ -43,7 +43,7 @@ defmodule LivebookWeb.ErrorHTML do
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/svg+xml" href={~p"/favicons/favicon.svg"} />
<link rel="alternate icon" type="image/png" href={~p"/favicons/favicon.png"} />
<title><%= @status %> - Livebook</title>
<title>{@status} - Livebook</title>
<link rel="stylesheet" href={~p"/assets/app.css"} />
</head>
<body>
@ -53,10 +53,10 @@ defmodule LivebookWeb.ErrorHTML do
<img src={~p"/images/logo.png"} height="128" width="128" alt="livebook" />
</a>
<div class="text-2xl text-gray-50">
<%= @title %>
{@title}
</div>
<div :if={@details} class="text-lg text-gray-50">
<%= @details %>
{@details}
</div>
</div>
</div>

View file

@ -50,7 +50,7 @@ defmodule LivebookWeb.AppAuthLive do
autofocus
/>
<span :for={error <- @errors} class="mt-1 text-red-600 text-sm">
<%= translate_error(error) %>
{translate_error(error)}
</span>
</div>
<.button type="submit">

View file

@ -40,7 +40,7 @@ defmodule LivebookWeb.AppLive do
</div>
<div class="flex items-center pb-4 mb-2 space-x-4 border-b border-gray-200 pr-20 md:pr-0">
<h1 class="text-3xl font-semibold text-gray-800">
<%= @app.notebook_name %>
{@app.notebook_name}
</h1>
</div>
<div class="pt-4 flex flex-col space-y-16">
@ -52,7 +52,7 @@ defmodule LivebookWeb.AppLive do
<.modal id="sessions-modal" show width="big" patch={~p"/apps"}>
<div class="flex flex-col space-y-3">
<h3 class="text-2xl font-semibold text-gray-800">
<%= @app.notebook_name %>
{@app.notebook_name}
</h3>
<p class="text-gray-700">
<%= if @app_settings.show_existing_sessions do %>
@ -76,10 +76,9 @@ defmodule LivebookWeb.AppLive do
<span>
Started
<span :if={app_session.started_by}>
by
<span class="font-semibold"><%= app_session.started_by.name || "Anonymous" %></span>
by <span class="font-semibold">{app_session.started_by.name || "Anonymous"}</span>
</span>
<%= LivebookWeb.HTMLHelpers.format_datetime_relatively(app_session.created_at) %> ago
{LivebookWeb.HTMLHelpers.format_datetime_relatively(app_session.created_at)} ago
</span>
<div class="mr-0.5 flex">
<.app_status status={app_session.app_status} show_label={false} />

View file

@ -145,7 +145,7 @@ defmodule LivebookWeb.AppSessionLive do
<div data-el-js-view-iframes phx-update="ignore" id="js-view-iframes"></div>
<div class="flex items-center pb-4 mb-2 space-x-4 border-b border-gray-200 pr-20 md:pr-0">
<h1 class="text-3xl font-semibold text-gray-800">
<%= @data_view.notebook_name %>
{@data_view.notebook_name}
</h1>
</div>
<div class="pt-4 flex flex-col gap-6">

View file

@ -64,7 +64,7 @@ defmodule LivebookWeb.AppsDashboardLive do
class="flex items-center justify-between mb-2 hover:cursor-pointer"
>
<span class="text-gray-800 font-medium text-xl break-all">
<%= "/" <> app.slug %>
{"/" <> app.slug}
</span>
<div class="flex items-center gap-2">
<.app_group_tag app_spec={app.app_spec} />
@ -81,7 +81,7 @@ defmodule LivebookWeb.AppsDashboardLive do
<div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-[minmax(0,_2fr)_minmax(0,_2fr)_minmax(0,_1fr)_minmax(0,_1fr)_minmax(0,_1fr)] gap-4">
<div class="break-words">
<.labeled_text label="Name">
<%= app.notebook_name %>
{app.notebook_name}
<span
:if={not app.public?}
class="!inline tooltip top"
@ -94,18 +94,18 @@ defmodule LivebookWeb.AppsDashboardLive do
<div class="break-all">
<.labeled_text label="URL">
<a href={~p"/apps/#{app.slug}"}>
<%= ~p"/apps/#{app.slug}" %>
{~p"/apps/#{app.slug}"}
</a>
</.labeled_text>
</div>
<div>
<.labeled_text label="Latest version" one_line>
v<%= app.version %>
v{app.version}
</.labeled_text>
</div>
<div>
<.labeled_text label="Session type" one_line>
<%= if(app.multi_session, do: "Multi", else: "Single") %>
{if(app.multi_session, do: "Multi", else: "Single")}
</.labeled_text>
</div>
<div class="flex flex-col md:flex-row md:items-center justify-start lg:justify-end">
@ -144,13 +144,13 @@ defmodule LivebookWeb.AppsDashboardLive do
</a>
</:col>
<:col :let={app_session} label="Uptime">
<%= LivebookWeb.HTMLHelpers.format_datetime_relatively(app_session.created_at) %>
{LivebookWeb.HTMLHelpers.format_datetime_relatively(app_session.created_at)}
</:col>
<:col :let={app_session} label="Version">
v<%= app_session.version %>
v{app_session.version}
</:col>
<:col :let={app_session} label="Clients">
<%= app_session.client_count %>
{app_session.client_count}
</:col>
<:actions :let={app_session}>
<span class="tooltip left" data-tooltip="Open">
@ -277,7 +277,7 @@ defmodule LivebookWeb.AppsDashboardLive do
align_to_class(col[:align])
]}
>
<%= col[:label] %>
{col[:label]}
</div>
</div>
<div :for={row <- @rows} class="whitespace-nowrap px-2 hover:bg-gray-50 hover:rounded-md">
@ -289,10 +289,10 @@ defmodule LivebookWeb.AppsDashboardLive do
align_to_class(col[:align])
]}
>
<%= render_slot(col, row) %>
{render_slot(col, row)}
</div>
<div class="py-2 flex flex-row items-center justify-end gap-2">
<%= render_slot(@actions, row) %>
{render_slot(@actions, row)}
</div>
</div>
</div>

View file

@ -42,7 +42,7 @@ defmodule LivebookWeb.AppsLive do
navigate={~p"/apps/#{app.slug}"}
class="px-4 py-3 border border-gray-200 rounded-xl text-gray-800 pointer hover:bg-gray-50 flex items-center justify-between"
>
<span class="font-semibold"><%= app.notebook_name %></span>
<span class="font-semibold">{app.notebook_name}</span>
<.remix_icon :if={not app.public?} icon="lock-password-line" />
</.link>
</div>
@ -69,7 +69,7 @@ defmodule LivebookWeb.AppsLive do
</li>
<li>
Save the notebook to the
<span class="font-medium"><%= Livebook.Config.apps_path() %></span>
<span class="font-medium">{Livebook.Config.apps_path()}</span>
folder
</li>
<li>

View file

@ -150,12 +150,12 @@ defmodule LivebookWeb.FileSelectComponent do
</.menu_item>
</.menu>
<div :if={@inner_block}>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</div>
</div>
<div class="flex flex-col space-y-2">
<div :if={@error_message} class="error-box flex justify-between items-center">
<span><%= @error_message %></span>
<span>{@error_message}</span>
<button phx-click="clear_error" phx-target={@myself}>
<.remix_icon icon="delete-bin-6-line" class="text-lg align-middle" />
</button>
@ -218,7 +218,7 @@ defmodule LivebookWeb.FileSelectComponent do
>
<div :for={file <- @uploads.folder.entries} class="p-2 flex gap-2 items-center">
<.spinner />
<span class="font-medium text-gray-500"><%= file.client_name %></span>
<span class="font-medium text-gray-500">{file.client_name}</span>
<div class="grow" />
<.icon_button type="button" phx-click="clear-file" phx-target={@myself} tabindex="-1">
<.remix_icon icon="close-line" />
@ -301,7 +301,7 @@ defmodule LivebookWeb.FileSelectComponent do
aria-label="switch file storage"
disabled={@file_system_select_disabled}
>
<span><%= file_system_name(@file.file_system_module) %></span>
<span>{file_system_name(@file.file_system_module)}</span>
<div class="pl-0.5 flex items-center">
<.remix_icon icon="arrow-down-s-line" class="text-lg leading-none" />
</div>
@ -312,7 +312,7 @@ defmodule LivebookWeb.FileSelectComponent do
<.menu_item variant="selected">
<button id={"#{@id}-file-system-#{file_system.id}"} role="menuitem">
<.file_system_icon file_system={file_system} />
<span><%= file_system_label(file_system) %></span>
<span>{file_system_label(file_system)}</span>
</button>
</.menu_item>
<% else %>
@ -325,7 +325,7 @@ defmodule LivebookWeb.FileSelectComponent do
phx-value-id={file_system.id}
>
<.file_system_icon file_system={file_system} />
<span><%= file_system_label(file_system) %></span>
<span>{file_system_label(file_system)}</span>
</button>
</.menu_item>
<% end %>
@ -407,10 +407,10 @@ defmodule LivebookWeb.FileSelectComponent do
if(@file_info.is_running, do: "text-green-400", else: "text-gray-900")
]}
>
<%= @file_info.highlighted %>
{@file_info.highlighted}
</span>
<span class="overflow-hidden text-ellipsis">
<%= @file_info.unhighlighted %>
{@file_info.unhighlighted}
</span>
</span>
</button>
@ -452,7 +452,7 @@ defmodule LivebookWeb.FileSelectComponent do
class="col-span-full text-sm text-medium text-gray-500 flex flex-col items-center gap-1"
>
<.remix_icon icon="more-line" class="text-lg" />
<%= @length - visible_files_limit() %> more files (search to see)
{@length - visible_files_limit()} more files (search to see)
</div>
"""
end

View file

@ -161,7 +161,7 @@ defmodule LivebookWeb.HomeLive do
~H"""
<LayoutComponents.topbar>
<span>
Livebook v<%= @version %> available!
Livebook v{@version} available!
<%= if @instructions_url do %>
Check out the news on
<a

View file

@ -38,7 +38,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
<form id="bulk-action-form" phx-submit="bulk_action" phx-target={@myself}>
<div class="mb-4 flex items-center md:items-end justify-between">
<h2 class="uppercase font-semibold text-gray-500 text-sm md:text-base">
Running sessions (<%= length(@sessions) %>)
Running sessions ({length(@sessions)})
</h2>
<div class="flex items-center gap-4">
<div class="flex gap-2 w-48 justify-end">
@ -54,7 +54,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
type="button"
aria-label={"order by - currently ordered by #{order_by_label(@order_by)}"}
>
<span><%= order_by_label(@order_by) %></span>
<span>{order_by_label(@order_by)}</span>
<.remix_icon icon="arrow-down-s-line" class="text-base leading-none" />
</.button>
</:toggle>
@ -71,7 +71,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
}
>
<.remix_icon icon={order_by_icon(order_by)} />
<span><%= order_by_label(order_by) %></span>
<span>{order_by_label(order_by)}</span>
</button>
</.menu_item>
</.menu>
@ -132,20 +132,20 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
navigate={~p"/sessions/#{session.id}"}
class="font-semibold text-gray-800 hover:text-gray-900"
>
<%= session.notebook_name %>
{session.notebook_name}
</.link>
<div class="text-gray-600 text-sm">
<%= if session.file, do: session.file.path, else: "No file" %>
{if session.file, do: session.file.path, else: "No file"}
</div>
<div class="mt-2 text-gray-600 text-sm flex flex-row items-center">
<%= if uses_memory?(session.memory_usage) do %>
<div class="h-3 w-3 mr-1 rounded-full bg-green-500"></div>
<span class="pr-4"><%= format_bytes(session.memory_usage.runtime.total) %></span>
<span class="pr-4">{format_bytes(session.memory_usage.runtime.total)}</span>
<% else %>
<div class="h-3 w-3 mr-1 rounded-full bg-gray-300"></div>
<span class="pr-4">0 MB</span>
<% end %>
Created <%= format_creation_date(session.created_at) %>
Created {format_creation_date(session.created_at)}
</div>
</div>
<.menu id={"session-#{session.id}-menu"}>
@ -242,8 +242,8 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
</svg>
<div class="hidden sm:flex md:hidden lg:flex">
<span class="px-2 py-1 text-sm text-gray-500 font-medium">
<%= format_bytes(@used) %> / <%= format_bytes(@total) %>
<span class="sr-only"><%= @percentage %> percent used</span>
{format_bytes(@used)} / {format_bytes(@total)}
<span class="sr-only">{@percentage} percent used</span>
</span>
</div>
</span>
@ -389,15 +389,15 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
}
description = ~H"""
Are you sure you want to close <%= pluralize(@session_count, "session", "sessions") %>?
Are you sure you want to close {pluralize(@session_count, "session", "sessions")}?
<%= if @non_persisted_count > 0 do %>
<br />
<span class="font-medium">Important:</span>
<%= pluralize(
{pluralize(
@non_persisted_count,
"notebook is not persisted and its content may be lost.",
"notebooks are not persisted and their content may be lost."
) %>
)}
<% end %>
"""

View file

@ -60,7 +60,7 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
~H"""
<div>
<LayoutComponents.topbar :if={Provider.connection_status(@hub)} variant="warning">
<%= Provider.connection_status(@hub) %>
{Provider.connection_status(@hub)}
</LayoutComponents.topbar>
<div class="p-4 md:px-12 md:py-7 max-w-screen-md mx-auto">
@ -70,14 +70,14 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
<div class="flex gap-2 items-center">
<div class="flex justify-center">
<span class="relative">
<%= @hub.hub_emoji %>
{@hub.hub_emoji}
<div class={[
"absolute w-[10px] h-[10px] border-white border-2 rounded-full right-0 bottom-1",
if(@hub_metadata.connected?, do: "bg-green-400", else: "bg-red-400")
]} />
</span>
</div>
<%= @hub.hub_name %>
{@hub.hub_name}
<span class="bg-green-100 text-green-800 text-xs px-2.5 py-0.5 rounded cursor-default">
Livebook Teams
</span>

View file

@ -37,7 +37,7 @@ defmodule LivebookWeb.Hub.FileSystemFormComponent do
~H"""
<div class="flex flex-col space-y-5">
<h3 class="text-2xl font-semibold text-gray-800">
<%= @title %>
{@title}
</h3>
<p class="text-gray-700">
Configure an AWS S3 bucket as a Livebook file storage.
@ -45,7 +45,7 @@ defmodule LivebookWeb.Hub.FileSystemFormComponent do
those work as well.
</p>
<div :if={@error_message} class="error-box">
<%= @error_message %>
{@error_message}
</div>
<.form
:let={f}
@ -90,7 +90,7 @@ defmodule LivebookWeb.Hub.FileSystemFormComponent do
<div class="flex space-x-2">
<.button type="submit" disabled={not @changeset.valid?}>
<.remix_icon icon={@button.icon} />
<span class="font-normal"><%= @button.label %></span>
<span class="font-normal">{@button.label}</span>
</.button>
<.button color="gray" outlined patch={@return_to}>
Cancel

View file

@ -17,8 +17,8 @@ defmodule LivebookWeb.Hub.FileSystemListComponent do
class="flex items-center justify-between border border-gray-200 rounded-lg p-4"
>
<div class="flex items-center space-x-12">
<.labeled_text label="Type"><%= type(file_system) %></.labeled_text>
<.labeled_text label="Bucket URL"><%= name(file_system) %></.labeled_text>
<.labeled_text label="Type">{type(file_system)}</.labeled_text>
<.labeled_text label="Bucket URL">{name(file_system)}</.labeled_text>
</div>
<div class="flex items-center space-x-2">
<.menu id={"hub-file-system-#{file_system.id}-menu"}>

View file

@ -107,14 +107,14 @@ defmodule LivebookWeb.Hub.NewLive do
<div>
<.button :if={!@requested_code} phx-disable-with="Loading...">
<%= @button_label %>
{@button_label}
</.button>
</div>
<div class="invisible"></div>
<div :if={@requested_code} class="flex flex-col rounded-xl bg-gray-50 px-10 py-6 mt-10">
<div class="flex flex-col items-center rounded-xl bg-gray-50">
<span class="text-base font-semibold text-center text-gray-900">
<%= @request_code_info %>
{@request_code_info}
</span>
<div class="text-center mt-4 text-gray-700">
<span class="text-sm">
@ -195,7 +195,7 @@ defmodule LivebookWeb.Hub.NewLive do
]}
/>
<span class="truncate text-sm font-medium">
<%= @title %>
{@title}
</span>
</div>
</button>

View file

@ -33,13 +33,13 @@ defmodule LivebookWeb.Hub.SecretFormComponent do
~H"""
<div class="flex flex-col space-y-5">
<h3 class="text-2xl font-semibold text-gray-800">
<%= @title %>
{@title}
</h3>
<p class="text-gray-700">
A notebook can read the secret value as a LB_ prefixed environment variable.
</p>
<div :if={@error_message} class="error-box">
<%= @error_message %>
{@error_message}
</div>
<div class="flex flex-columns gap-4">
<.form
@ -77,7 +77,7 @@ defmodule LivebookWeb.Hub.SecretFormComponent do
<div class="flex space-x-2">
<.button type="submit" disabled={not @changeset.valid?}>
<.remix_icon icon={@button.icon} />
<span class="font-normal"><%= @button.label %></span>
<span class="font-normal">{@button.label}</span>
</.button>
<.button color="gray" outlined patch={@return_to}>
Cancel

View file

@ -15,7 +15,7 @@ defmodule LivebookWeb.Hub.SecretListComponent do
</.no_entries>
<div :if={@secrets != []}>
<.table rows={@secrets} id={@id}>
<:col :let={secret} label="Name"><%= secret.name %></:col>
<:col :let={secret} label="Name">{secret.name}</:col>
<:action :let={secret}>
<span class="tooltip left" data-tooltip="Edit">
<.icon_button

View file

@ -52,7 +52,7 @@ defmodule LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent do
<div :if={@messages != []} class="flex flex-col gap-2">
<.message_box :for={{kind, message} <- @messages} kind={kind}>
<%= raw(message) %>
{raw(message)}
</.message_box>
</div>

View file

@ -30,7 +30,7 @@ defmodule LivebookWeb.Hub.Teams.DeploymentGroupComponent do
<div class="flex justify-between items-start">
<div>
<div class="flex gap-2 items-center text-gray-700">
<h3 class="font-semibold"><%= @deployment_group.name %></h3>
<h3 class="font-semibold">{@deployment_group.name}</h3>
<%= if @deployment_group.mode == :online do %>
<div class="bg-green-100 text-green-800 text-xs px-2.5 py-0.5 rounded cursor-default">
Online
@ -47,7 +47,7 @@ defmodule LivebookWeb.Hub.Teams.DeploymentGroupComponent do
class="text-xs font-medium text-blue-600 mt-1"
target="_blank"
>
<%= DeploymentGroup.url_without_scheme(@deployment_group) %>
{DeploymentGroup.url_without_scheme(@deployment_group)}
</.link>
</div>
<.link
@ -62,7 +62,7 @@ defmodule LivebookWeb.Hub.Teams.DeploymentGroupComponent do
<div :if={@deployment_group.mode == :online} class="flex flex-col lg:flex-row justify-center">
<.labeled_text class="grow mt-6 lg:border-l border-gray-200 lg:pl-4" label="App servers">
<span class="text-lg font-normal" aria-label="app servers">
<%= @agents_count %>
{@agents_count}
</span>
<.link
patch={~p"/hub/#{@hub.id}/groups/#{@deployment_group.id}/agents/new"}
@ -73,7 +73,7 @@ defmodule LivebookWeb.Hub.Teams.DeploymentGroupComponent do
</.labeled_text>
<.labeled_text class="grow mt-6 lg:border-l border-gray-200 lg:pl-4" label="Apps deployed">
<span class="text-lg font-normal" aria-label="apps deployed">
<%= @app_deployments_count %>
{@app_deployments_count}
</span>
<.link
patch={~p"/hub/#{@hub.id}/groups/#{@deployment_group.id}/apps/new"}
@ -87,7 +87,7 @@ defmodule LivebookWeb.Hub.Teams.DeploymentGroupComponent do
label="Environment variables"
>
<span class="text-lg font-normal" aria-label="environment variables">
<%= @environment_variables_count %>
{@environment_variables_count}
</span>
<.link
href={

View file

@ -43,7 +43,7 @@ defmodule LivebookWeb.Hub.Teams.DeploymentGroupFormComponent do
Add deployment group
</h3>
<div :if={@error_message} class="error-box">
<%= @error_message %>
{@error_message}
</div>
<div class="flex flex-columns gap-4">
<.form
@ -145,10 +145,10 @@ defmodule LivebookWeb.Hub.Teams.DeploymentGroupFormComponent do
<span class="flex flex-1">
<span class="flex flex-col">
<span class="block text-sm font-medium text-gray-900">
<%= @title %>
{@title}
</span>
<span class="mt-1 flex items-center text-sm text-gray-700">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</span>
</span>
</span>

View file

@ -44,10 +44,10 @@ defmodule LivebookWeb.LearnLive do
<img src={learn_img_src(@lead_notebook_info.details.cover)} width="100" alt="livebook" />
<div>
<h3 class="text-xl text-gray-50 font-semibold">
<%= @lead_notebook_info.title %>
{@lead_notebook_info.title}
</h3>
<p class="mt-2 text-sm text-gray-300">
<%= @lead_notebook_info.details.description %>
{@lead_notebook_info.details.description}
</p>
<div class="mt-4">
<.button patch={~p"/learn/notebooks/#{@lead_notebook_info.slug}"}>
@ -76,13 +76,13 @@ defmodule LivebookWeb.LearnLive do
<img src={learn_img_src(@group_info.cover)} width="100" />
<div>
<div class="inline-flex px-2 py-0.5 bg-gray-200 rounded-3xl text-gray-700 text-xs font-medium">
<%= length(@group_info.notebook_infos) %> notebooks
{length(@group_info.notebook_infos)} notebooks
</div>
<h3 class="mt-1 text-xl text-gray-800 font-semibold">
<%= @group_info.title %>
{@group_info.title}
</h3>
<p class="mt-2 text-gray-700">
<%= @group_info.description %>
{@group_info.description}
</p>
</div>
</div>
@ -93,10 +93,10 @@ defmodule LivebookWeb.LearnLive do
class="py-3 flex flex-row items-center space-x-5 border-b border-gray-200 last:border-b-0"
>
<div class="text-lg text-gray-400 font-semibold">
<%= number |> Integer.to_string() |> String.pad_leading(2, "0") %>
{number |> Integer.to_string() |> String.pad_leading(2, "0")}
</div>
<div class="grow text-gray-800 font-semibold">
<%= notebook_info.title %>
{notebook_info.title}
</div>
<.button color="gray" outlined navigate={~p"/learn/notebooks/#{notebook_info.slug}"}>
<.remix_icon icon="play-circle-line" /> Open

View file

@ -17,14 +17,14 @@ defmodule LivebookWeb.NotebookCardsComponent do
<div class="flex items-center justify-between">
<span class="tooltip top" data-tooltip={info.file.path}>
<span class="text-gray-800 font-medium">
<%= info.name %>
{info.name}
</span>
</span>
<%= @card_icon && render_slot(@card_icon, {info, idx}) %>
{@card_icon && render_slot(@card_icon, {info, idx})}
</div>
<div class="mt-1 flex-grow text-gray-600 text-sm">
<%= @added_at_label %>
<%= LivebookWeb.HTMLHelpers.format_datetime_relatively(info.added_at) %> ago
{@added_at_label}
{LivebookWeb.HTMLHelpers.format_datetime_relatively(info.added_at)} ago
</div>
<div class="mt-2 flex space-x-6">
<%= if session = session_by_file(info.file, @sessions) do %>

View file

@ -37,7 +37,7 @@ defmodule LivebookWeb.OpenLive.UrlComponent do
~H"""
<div class="flex-col space-y-5">
<div :if={@error_message} class="error-box">
<%= @error_message %>
{@error_message}
</div>
<p class="text-gray-700" id="import-from-url">
Paste the URL to a .livemd file, to a GitHub file, or to a Gist.

View file

@ -17,14 +17,14 @@ defmodule LivebookWeb.Output do
def output(assigns) do
~H"""
<div id={@id} class="max-w-full" data-el-output data-border={border?(@output)}>
<%= render_output(@output, %{
{render_output(@output, %{
id: "#{@id}-output",
session_id: @session_id,
session_pid: @session_pid,
input_views: @input_views,
client_id: @client_id,
cell_id: @cell_id
}) %>
})}
</div>
"""
end
@ -266,14 +266,14 @@ defmodule LivebookWeb.Output do
<div class="flex items-center justify-between gap-2" style="color: var(--ansi-color-red);">
<div class="flex space-x-2 font-editor">
<.remix_icon icon="close-circle-line" />
<span>Missing secret <%= inspect(@secret_name) %></span>
<span>Missing secret {inspect(@secret_name)}</span>
</div>
<.button color="gray" patch={~p"/sessions/#{@session_id}/secrets?secret_name=#{@secret_name}"}>
Add secret
</.button>
</div>
<div class="border-t border-gray-200 -mx-4" />
<%= render_formatted_error_message(@id, @message) %>
{render_formatted_error_message(@id, @message)}
</div>
"""
end
@ -294,7 +294,7 @@ defmodule LivebookWeb.Output do
<div class="flex items-center justify-between gap-2" style="color: var(--ansi-color-red);">
<div class="flex space-x-2 font-editor">
<.remix_icon icon="close-circle-line" />
<span>Forbidden access to file <%= inspect(@file_entry_name) %></span>
<span>Forbidden access to file {inspect(@file_entry_name)}</span>
</div>
<.button
color="gray"
@ -304,7 +304,7 @@ defmodule LivebookWeb.Output do
</.button>
</div>
<div class="border-t border-gray-200 -mx-4" />
<%= render_formatted_error_message(@id, @message) %>
{render_formatted_error_message(@id, @message)}
</div>
"""
end
@ -324,7 +324,7 @@ defmodule LivebookWeb.Output do
end
]}>
<div>
<%= @message %>
{@message}
</div>
<button
class={[
@ -369,7 +369,7 @@ defmodule LivebookWeb.Output do
</.button>
</div>
<div class="border-t border-gray-200 -mx-4" />
<%= render_formatted_error_message(@id, @message) %>
{render_formatted_error_message(@id, @message)}
</div>
"""
else

View file

@ -38,7 +38,7 @@ defmodule LivebookWeb.Output.ControlComponent do
~H"""
<div class="flex">
<.button color="gray" type="button" phx-click={JS.push("button_click", target: @myself)}>
<%= @control.attrs.label %>
{@control.attrs.label}
</.button>
</div>
"""
@ -62,7 +62,7 @@ defmodule LivebookWeb.Output.ControlComponent do
def render(assigns) do
~H"""
<div class="text-red-600">
Unknown control type <%= @control.attrs.type %>
Unknown control type {@control.attrs.type}
</div>
"""
end

View file

@ -48,7 +48,7 @@ defmodule LivebookWeb.Output.ControlFormComponent do
/>
<div :if={@control.attrs.submit}>
<.button type="button" phx-click="submit" phx-target={@myself}>
<%= @control.attrs.submit %>
{@control.attrs.submit}
</.button>
</div>
</div>

View file

@ -50,7 +50,7 @@ defmodule LivebookWeb.Output.FileInputComponent do
>
<div class="flex justify-center text-gray-500">
<%= if @value do %>
<%= @value.client_name %>
{@value.client_name}
<% else %>
Click to select a file or drag a local file here
<% end %>
@ -64,7 +64,7 @@ defmodule LivebookWeb.Output.FileInputComponent do
:for={msg <- LivebookWeb.HTMLHelpers.upload_error_messages(@uploads.file)}
class="mt-0.5 text-red-600 text-sm"
>
<%= msg %>
{msg}
</p>
</form>
"""

View file

@ -175,7 +175,7 @@ defmodule LivebookWeb.Output.InputComponent do
defp input_output(%{attrs: %{type: :range}} = assigns) do
~H"""
<div class="flex items-center space-x-2">
<div><%= @attrs.min %></div>
<div>{@attrs.min}</div>
<input
type="range"
data-el-input
@ -191,7 +191,7 @@ defmodule LivebookWeb.Output.InputComponent do
max={@attrs.max}
step={@attrs.step}
/>
<div><%= @attrs.max %></div>
<div>{@attrs.max}</div>
</div>
"""
end
@ -290,7 +290,7 @@ defmodule LivebookWeb.Output.InputComponent do
defp input_output(assigns) do
~H"""
<div class="text-red-600">
Unknown input type <%= @input.attrs.type %>
Unknown input type {@input.attrs.type}
</div>
"""
end
@ -303,7 +303,7 @@ defmodule LivebookWeb.Output.InputComponent do
~H"""
<.label help={@help}>
<div class="flex items-center justify-between gap-1">
<span><%= @label %></span>
<span>{@label}</span>
<span :if={@changed} class="cursor-pointer tooltip top" data-tooltip="This input has changed.">
<.remix_icon icon="error-warning-line text-gray-500" />
</span>

View file

@ -50,7 +50,7 @@ defmodule LivebookWeb.Output.TabsComponent do
|> JS.remove_class("hidden", to: ~s/##{@id} [data-tab-content="#{output_idx}"]/)
}
>
<%= label %>
{label}
</button>
</div>
<div id={"#{@id}-tab-contents"} phx-update="stream">

View file

@ -744,12 +744,12 @@ defmodule LivebookWeb.SessionLive do
description = ~H"""
<div>
File <span class="font-semibold"><%= @name %></span>
File <span class="font-semibold">{@name}</span>
points to an absolute path, do you want the notebook to access it?
</div>
<div class="mt-4 flex flex-col gap-2 border border-gray-200 rounded-lg p-4">
<.labeled_text label="Path"><%= @file.path %></.labeled_text>
<.labeled_text label="File system"><%= @file_system_label %></.labeled_text>
<.labeled_text label="Path">{@file.path}</.labeled_text>
<.labeled_text label="File system">{@file_system_label}</.labeled_text>
</div>
"""
@ -1625,9 +1625,9 @@ defmodule LivebookWeb.SessionLive do
assigns = %{packages: packages, target_name: target_name, target_type: target_type}
description = ~H"""
The <span class="font-semibold"><%= @target_name %></span> <%= @target_type %> requires the
The <span class="font-semibold">{@target_name}</span> {@target_type} requires the
<.listing items={@packages}>
<:item :let={package}><code><%= package.name %></code></:item>
<:item :let={package}><code>{package.name}</code></:item>
<:singular_suffix>package. Do you want to add it as a dependency and restart?</:singular_suffix>
<:plural_suffix>packages. Do you want to add them as dependencies and restart?</:plural_suffix>
</.listing>

View file

@ -46,7 +46,7 @@ defmodule LivebookWeb.SessionLive.AddFileEntryFileComponent do
~H"""
<div class="flex flex-col">
<div :if={@error_message} class="mb-6 error-box">
<%= @error_message %>
{@error_message}
</div>
<div class="h-80" role="region" aria-label="file storage">
<.live_component

View file

@ -37,7 +37,7 @@ defmodule LivebookWeb.SessionLive.AddFileEntryUploadComponent do
<div>
<div :if={upload_error_messages(@uploads.file) != []} class="mb-6 flex flex-col gap-2">
<div :for={message <- upload_error_messages(@uploads.file)} class="error-box">
<%= message %>
{message}
</div>
</div>
<div class="mb-6">

View file

@ -27,7 +27,7 @@ defmodule LivebookWeb.SessionLive.AddFileEntryUrlComponent do
~H"""
<div>
<div :if={@error_message} class="mb-6 error-box">
<%= @error_message %>
{@error_message}
</div>
<.form
:let={f}

View file

@ -124,8 +124,8 @@ defmodule LivebookWeb.SessionLive.AppDockerComponent do
<p class="text-gray-700">
<.label>Workspace</.label>
<span>
<span class="text-lg"><%= @hub.hub_emoji %></span>
<span><%= @hub.hub_name %></span>
<span class="text-lg">{@hub.hub_emoji}</span>
<span>{@hub.hub_name}</span>
</span>
</p>
<%= if @deployment_groups do %>
@ -167,7 +167,7 @@ defmodule LivebookWeb.SessionLive.AppDockerComponent do
<div :if={@messages != []} class="flex flex-col gap-2">
<.message_box :for={{kind, message} <- @messages} kind={kind}>
<%= raw(message) %>
{raw(message)}
</.message_box>
</div>

View file

@ -36,11 +36,11 @@ defmodule LivebookWeb.SessionLive.AppInfoComponent do
<div class="flex flex-col space-y-3">
<.labeled_text label="Slug" one_line>
<%= @settings.slug || "?" %>
{@settings.slug || "?"}
</.labeled_text>
<.labeled_text label="Session type" one_line>
<%= if @settings.multi_session, do: "Multi", else: "Single" %>
{if @settings.multi_session, do: "Multi", else: "Single"}
</.labeled_text>
<.labeled_text label="Access" one_line>
@ -101,12 +101,12 @@ defmodule LivebookWeb.SessionLive.AppInfoComponent do
<div :if={@app} class="flex flex-col space-y-3">
<.labeled_text label="URL" one_line>
<a href={~p"/apps/#{@app.slug}"}>
<%= ~p"/apps/#{@app.slug}" %>
{~p"/apps/#{@app.slug}"}
</a>
</.labeled_text>
<.labeled_text :if={@app.multi_session} label="Latest version" one_line>
v<%= @app.version %>
v{@app.version}
</.labeled_text>
<div :if={@app.sessions != []}>
@ -162,7 +162,7 @@ defmodule LivebookWeb.SessionLive.AppInfoComponent do
</a>
</.labeled_text>
<.labeled_text label="Version" class="grow">
v<%= app_session.version %>
v{app_session.version}
</.labeled_text>
</div>
<div class="border-t border-gray-200 px-3 py-1 flex space-x-2">

View file

@ -134,7 +134,7 @@ defmodule LivebookWeb.SessionLive.AppSettingsComponent do
</div>
<div class="mt-8 flex space-x-2">
<.button disabled={not @changeset.valid?}>
<%= if @context == "preview", do: "Launch", else: "Save" %>
{if @context == "preview", do: "Launch", else: "Save"}
</.button>
<.button color="gray" outlined type="reset" name="reset">

View file

@ -61,7 +61,7 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
App deployment with Livebook Teams
</h3>
<h4 :if={subtitle = subtitle(@action)} class="text-gray-600">
<.remix_icon icon="corner-down-right-line" /> <%= subtitle %>
<.remix_icon icon="corner-down-right-line" /> {subtitle}
</h4>
</div>
@ -293,8 +293,8 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
defp workspace(assigns) do
~H"""
<span class="font-medium">
<span class="text-lg"><%= @hub.hub_emoji %></span>
<span><%= @hub.hub_name %></span>
<span class="text-lg">{@hub.hub_emoji}</span>
<span>{@hub.hub_name}</span>
</span>
"""
end
@ -324,16 +324,16 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
<div class="flex justify-between items-center">
<div class="flex gap-2 items-center text-gray-700">
<h3 class="text-sm">
<span class="font-semibold"><%= @deployment_group.name %></span>
<span :if={url = @deployment_group.url}>(<%= url %>)</span>
<span class="font-semibold">{@deployment_group.name}</span>
<span :if={url = @deployment_group.url}>({url})</span>
</h3>
</div>
<div class="flex gap-2">
<div class="text-sm text-gray-700 border-l border-gray-300 pl-2">
App servers: <%= @num_agents[@deployment_group.id] || 0 %>
App servers: {@num_agents[@deployment_group.id] || 0}
</div>
<div class="text-sm text-gray-700 border-l border-gray-300 pl-2">
Apps deployed: <%= @num_app_deployments[@deployment_group.id] || 0 %>
Apps deployed: {@num_app_deployments[@deployment_group.id] || 0}
</div>
</div>
</div>
@ -351,22 +351,22 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
target="_blank"
class="text-blue-600 font-medium"
>
/<%= @app_deployment.slug %>
/{@app_deployment.slug}
</.link>
<% else %>
<span>
/<%= @app_deployment.slug %>
/{@app_deployment.slug}
</span>
<% end %>
</.labeled_text>
<.labeled_text label="Title">
<%= @app_deployment.title %>
{@app_deployment.title}
</.labeled_text>
<.labeled_text label="Deployed by">
<%= @app_deployment.deployed_by %>
{@app_deployment.deployed_by}
</.labeled_text>
<.labeled_text label="Deployed">
<%= LivebookWeb.HTMLHelpers.format_datetime_relatively(@app_deployment.deployed_at) %> ago
{LivebookWeb.HTMLHelpers.format_datetime_relatively(@app_deployment.deployed_at)} ago
</.labeled_text>
</div>
"""

View file

@ -59,7 +59,7 @@ defmodule LivebookWeb.SessionLive.AttachedRuntimeComponent do
<p class="text-gray-700">
Connect the session to an already running node
and evaluate code in the context of that node.
The node must run Elixir <%= Livebook.Runtime.Attached.elixir_version_requirement() %>.
The node must run Elixir {Livebook.Runtime.Attached.elixir_version_requirement()}.
Make sure to give the node a name and a cookie, for example:
</p>
<div class="text-gray-700 markdown">
@ -83,7 +83,7 @@ defmodule LivebookWeb.SessionLive.AttachedRuntimeComponent do
<.text_field field={f[:cookie]} label="Cookie" placeholder="mycookie" />
</div>
<.button type="submit" disabled={@runtime_status == :connecting or not @changeset.valid?}>
<%= label(@changeset, @runtime_status) %>
{label(@changeset, @runtime_status)}
</.button>
</.form>
</div>

View file

@ -93,16 +93,16 @@ defmodule LivebookWeb.SessionLive.BinComponent do
<.cell_icon cell_type={Cell.type(cell)} language={Map.get(cell, :language)} />
<p class="ml-1 text-sm text-gray-700 self-center">
<span class="font-semibold">
<%= Cell.type(cell) |> Atom.to_string() |> String.capitalize() %>
{Cell.type(cell) |> Atom.to_string() |> String.capitalize()}
</span>
cell
deleted from <span class="font-semibold"><%= entry.section_name %></span>
deleted from <span class="font-semibold">{entry.section_name}</span>
section
</p>
</div>
<div class="flex justify-end space-x-2">
<span class="text-sm text-gray-500">
<%= LivebookWeb.HTMLHelpers.format_datetime_relatively(entry.deleted_at) %> ago
{LivebookWeb.HTMLHelpers.format_datetime_relatively(entry.deleted_at)} ago
</span>
</div>
</div>

View file

@ -49,7 +49,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
data-p-smart-cell-js-view-ref={hook_prop(smart_cell_js_view_ref(@cell_view))}
data-p-allowed-uri-schemes={hook_prop(@allowed_uri_schemes)}
>
<%= render_cell(assigns) %>
{render_cell(assigns)}
</div>
"""
end
@ -295,7 +295,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
~H"""
<div class="mb-1 flex items-center justify-between">
<div class="relative z-20 flex items-center justify-end space-x-2" data-el-actions data-primary>
<%= render_slot(@primary) %>
{render_slot(@primary)}
</div>
<div
class="relative z-20 flex items-center justify-end md:space-x-2"
@ -303,7 +303,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
aria-label="cell actions"
data-el-actions
>
<%= render_slot(@secondary) %>
{render_slot(@secondary)}
</div>
</div>
"""
@ -316,7 +316,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
<div class="flex relative focus-visible:outline-none" data-el-cell-body tabindex="0">
<div class="w-1 h-full rounded-lg absolute top-0 -left-3" data-el-cell-focus-indicator></div>
<div class="w-full">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</div>
</div>
"""
@ -645,7 +645,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
~H"""
<div :if={@doctest_summary.failures_count > 0} class="pt-2" id={"doctest-summary-#{@cell_id}"}>
<div class="error-box py-3">
<%= doctest_summary_message(@doctest_summary) %>
{doctest_summary_message(@doctest_summary)}
</div>
</div>
"""
@ -780,7 +780,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
<div class={[@tooltip && "tooltip", "bottom distant-medium"]} data-tooltip={@tooltip}>
<div class="flex items-center space-x-1">
<div class="flex text-[11px]" data-el-cell-status>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
<span :if={@change_indicator} data-el-change-indicator>*</span>
</div>
<.status_indicator variant={@variant} />

View file

@ -30,7 +30,7 @@ defmodule LivebookWeb.SessionLive.EmbeddedRuntimeComponent do
may interfere with code from another notebook.
</p>
<.button phx-click="init" phx-target={@myself} disabled={@runtime_status == :connecting}>
<%= label(@runtime, @runtime_status) %>
{label(@runtime, @runtime_status)}
</.button>
</div>
"""

View file

@ -20,7 +20,7 @@ defmodule LivebookWeb.SessionLive.ExportElixirComponent do
<div class="flex flex-col space-y-1">
<div class="flex justify-between items-center">
<span class="text-sm text-gray-700 font-semibold">
<%= Session.file_name_for_download(@session) <> ".exs" %>
{Session.file_name_for_download(@session) <> ".exs"}
</span>
<div class="flex justify-end space-x-2">
<span class="tooltip left" data-tooltip="Copy source">

View file

@ -39,7 +39,7 @@ defmodule LivebookWeb.SessionLive.ExportLiveMarkdownComponent do
<div class="flex flex-col space-y-1">
<div class="flex justify-between items-center">
<span class="text-sm text-gray-700 font-semibold">
<%= Session.file_name_for_download(@session) <> ".livemd" %>
{Session.file_name_for_download(@session) <> ".livemd"}
</span>
<div class="flex justify-end space-x-2">
<span class="tooltip left" data-tooltip="Copy source">

View file

@ -105,7 +105,7 @@ defmodule LivebookWeb.SessionLive.FilesListComponent do
phx-click={JS.push("review_file_entry_access", value: %{name: file_entry.name})}
>
<.remix_icon icon="alert-line" class="text-lg align-middle mr-2" />
<span class="break-all"><%= file_entry.name %></span>
<span class="break-all">{file_entry.name}</span>
</button>
<% else %>
<div
@ -118,7 +118,7 @@ defmodule LivebookWeb.SessionLive.FilesListComponent do
icon={file_entry_icon(file_entry, @session)}
class="text-lg align-middle mr-2"
/>
<span class="break-all"><%= file_entry.name %></span>
<span class="break-all">{file_entry.name}</span>
</div>
<% end %>
<%= if file_entry.name in @transferring_file_entry_names do %>

View file

@ -150,7 +150,7 @@ defmodule LivebookWeb.SessionLive.FlyRuntimeComponent do
volume_errors(@volume_id, @volumes, @region) != []
}
>
<%= label(@app_name, @runtime, @runtime_status) %>
{label(@app_name, @runtime, @runtime_status)}
</.button>
<.button
:if={@runtime_status == :connecting}
@ -170,7 +170,7 @@ defmodule LivebookWeb.SessionLive.FlyRuntimeComponent do
<.message_box kind="info">
<div class="flex items-center gap-2">
<.spinner />
<span>Step: <%= @runtime_connect_info %></span>
<span>Step: {@runtime_connect_info}</span>
</div>
</.message_box>
</div>
@ -234,7 +234,7 @@ defmodule LivebookWeb.SessionLive.FlyRuntimeComponent do
<.message_box kind="info">
<div class="flex items-center justify-between">
<div>
App <span class="font-semibold"><%= @app_name %></span> does not exist yet.
App <span class="font-semibold">{@app_name}</span> does not exist yet.
</div>
<.button phx-click="create_app" phx-target={@myself}>
Create
@ -419,7 +419,7 @@ defmodule LivebookWeb.SessionLive.FlyRuntimeComponent do
type="submit"
disabled={not @volume_action.changeset.valid? or @volume_action.status == :inflight}
>
<%= if(@volume_action.status == :inflight, do: "Creating...", else: "Create") %>
{if(@volume_action.status == :inflight, do: "Creating...", else: "Create")}
</.button>
<.button
type="button"

View file

@ -35,7 +35,7 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
phx-value-section_id={@section_id}
phx-value-cell_id={@cell_id}
>
+ <%= @default_language |> Atom.to_string() |> String.capitalize() %>
+ {@default_language |> Atom.to_string() |> String.capitalize()}
</div>
<div class="-mr-1 pl-1 flex items-center border-l border-gray-200 group-hover:border-gray-300 group-focus:border-gray-300">
<.remix_icon icon="arrow-down-s-line" class="text-lg leading-none" />
@ -197,7 +197,7 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
end
]}
>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</button>
"""
end
@ -208,7 +208,7 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
<:primary>
<button role="menuitem">
<.remix_icon icon={@definition.icon} />
<span><%= @definition.name %></span>
<span>{@definition.name}</span>
</button>
</:primary>
<.menu_item :for={{variant, idx} <- Enum.with_index(@definition.variants)}>
@ -216,7 +216,7 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
role="menuitem"
phx-click={on_example_snippet_click(@definition, idx, @section_id, @cell_id)}
>
<span><%= variant.name %></span>
<span>{variant.name}</span>
</button>
</.menu_item>
</.submenu>
@ -230,7 +230,7 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
phx-click={on_example_snippet_click(@definition, 0, @section_id, @cell_id)}
>
<.remix_icon icon={@definition.icon} />
<span><%= @definition.name %></span>
<span>{@definition.name}</span>
</button>
"""
end
@ -240,7 +240,7 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
<.submenu>
<:primary>
<button role="menuitem">
<span><%= @definition.name %></span>
<span>{@definition.name}</span>
</button>
</:primary>
<.menu_item :for={{preset, idx} <- Enum.with_index(@definition.requirement_presets)}>
@ -248,7 +248,7 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
role="menuitem"
phx-click={on_smart_cell_click(@definition, idx, @section_id, @cell_id)}
>
<span><%= preset.name %></span>
<span>{preset.name}</span>
</button>
</.menu_item>
</.submenu>
@ -258,7 +258,7 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
defp smart_cell_insert_button(assigns) do
~H"""
<button role="menuitem" phx-click={on_smart_cell_click(@definition, @section_id, @cell_id)}>
<span><%= @definition.name %></span>
<span>{@definition.name}</span>
</button>
"""
end

View file

@ -18,7 +18,7 @@ defmodule LivebookWeb.SessionLive.InsertFileComponent do
phx-click={JS.push("insert_file_action", value: %{idx: idx})}
>
<span>
<%= handler.definition.description %>
{handler.definition.description}
</span>
</div>
</div>

View file

@ -40,7 +40,7 @@ defmodule LivebookWeb.SessionLive.InsertImageComponent do
</h3>
<div :if={upload_error_messages(@uploads.image) != []} class="flex flex-col gap-2">
<div :for={message <- upload_error_messages(@uploads.image)} class="error-box">
<%= message %>
{message}
</div>
</div>
<div :for={entry <- @uploads.image.entries}>

View file

@ -214,7 +214,7 @@ defmodule LivebookWeb.SessionLive.K8sRuntimeComponent do
<div :if={@rbac.status == :ok} class="mt-8">
<div class="flex gap-2">
<.button phx-click="init" phx-target={@myself} disabled={@runtime_status == :connecting}>
<%= label(@namespace, @runtime, @runtime_status) %>
{label(@namespace, @runtime, @runtime_status)}
</.button>
<.button
:if={@runtime_status == :connecting}
@ -234,7 +234,7 @@ defmodule LivebookWeb.SessionLive.K8sRuntimeComponent do
<.message_box kind="info">
<div class="flex items-center gap-2">
<.spinner />
<span>Step: <%= @runtime_connect_info %></span>
<span>Step: {@runtime_connect_info}</span>
</div>
</.message_box>
</div>
@ -317,7 +317,7 @@ defmodule LivebookWeb.SessionLive.K8sRuntimeComponent do
disabled={@pvc_action.status == :inflight}
>
<.remix_icon icon="delete-bin-6-line" class="align-middle mr-1" />
<%= if @pvc_action[:type] == :delete, do: "Delete", else: "Deleting..." %>
{if @pvc_action[:type] == :delete, do: "Delete", else: "Deleting..."}
</button>
<button
class="text-gray-600 font-medium text-sm"
@ -358,7 +358,7 @@ defmodule LivebookWeb.SessionLive.K8sRuntimeComponent do
type="submit"
disabled={not @pvc_action.changeset.valid? or @pvc_action.status == :inflight}
>
<%= if(@pvc_action.status == :inflight, do: "Creating...", else: "Create") %>
{if(@pvc_action.status == :inflight, do: "Creating...", else: "Create")}
</.button>
<.button
type="button"
@ -417,8 +417,8 @@ defmodule LivebookWeb.SessionLive.K8sRuntimeComponent do
~H"""
<div class="flex items-center justify-between">
<div>
Authenticated user has no permission to <span class="font-semibold"><%= @verb %></span>
<code><%= @path %></code>
Authenticated user has no permission to <span class="font-semibold">{@verb}</span>
<code>{@path}</code>
<span :if={@namespace}> in namespace <code><%= @namespace %></code> (or the namespace doesn't exist)</span>.
</div>
</div>
@ -429,7 +429,7 @@ defmodule LivebookWeb.SessionLive.K8sRuntimeComponent do
assigns = assign(assigns, :message, message)
~H"""
<div><%= @message %></div>
<div>{@message}</div>
"""
end

View file

@ -46,7 +46,7 @@ defmodule LivebookWeb.SessionLive.PackageSearchLive do
<%= cond do %>
<% @error_message -> %>
<div class="error-box">
<%= @error_message %>
{@error_message}
</div>
<% @packages == [] -> %>
<div class="flex h-full items-center justify-center text-gray-600">
@ -67,14 +67,14 @@ defmodule LivebookWeb.SessionLive.PackageSearchLive do
<div class="flex-grow p-2 flex flex-col text-sm">
<div class="flex text-gray-700">
<%= if @package[:url] do %>
<a class="font-semibold" href={@package[:url]} target="_blank"><%= @package.name %></a>
<a class="font-semibold" href={@package[:url]} target="_blank">{@package.name}</a>
<% else %>
<span class="font-semibold"><%= @package.name %></span>
<span class="font-semibold">{@package.name}</span>
<% end %>
<span class="ml-1"><%= @package.version %></span>
<span class="ml-1">{@package.version}</span>
</div>
<div class="text-gray-600">
<%= @package.description %>
{@package.description}
</div>
</div>
<div class="ml-2">

View file

@ -83,7 +83,7 @@ defmodule LivebookWeb.SessionLive.PersistenceComponent do
<div>
<.label>File</.label>
<div class="whitespace-nowrap text-gray-700 leading-4">
<%= normalize_file(@draft_file).path %>
{normalize_file(@draft_file).path}
</div>
</div>
<form

View file

@ -126,12 +126,12 @@ defmodule LivebookWeb.SessionLive.Render do
</.modal>
<.modal :if={@live_action == :app_teams} id="app-teams-modal" show width="big" patch={@self_path}>
<%= live_render(@socket, LivebookWeb.SessionLive.AppTeamsLive,
{live_render(@socket, LivebookWeb.SessionLive.AppTeamsLive,
id: "app-teams",
session: %{
"session_pid" => @session.pid
}
) %>
)}
</.modal>
<.modal
@ -266,13 +266,13 @@ defmodule LivebookWeb.SessionLive.Render do
width="medium"
patch={@self_path}
>
<%= live_render(@socket, LivebookWeb.SessionLive.PackageSearchLive,
{live_render(@socket, LivebookWeb.SessionLive.PackageSearchLive,
id: "package-search",
session: %{
"session_pid" => @session.pid,
"runtime" => @data_view.runtime
}
) %>
)}
</.modal>
<.modal
@ -500,7 +500,7 @@ defmodule LivebookWeb.SessionLive.Render do
data-section-id={section_item.id}
>
<.remix_icon icon="h-2" class="text-lg font-normal leading-none opacity-50" />
<span><%= section_item.name %></span>
<span>{section_item.name}</span>
<%!--
Note: the container has overflow-y auto, so we cannot set overflow-x visible,
consequently we show the tooltip wrapped to a fixed number of characters
@ -532,7 +532,7 @@ defmodule LivebookWeb.SessionLive.Render do
>
<.remix_icon icon="braces-line" class="font-normal opacity-50" />
<span class="font-mono break-all text-left">
<%= definition.label %>
{definition.label}
</span>
</button>
</li>
@ -576,7 +576,7 @@ defmodule LivebookWeb.SessionLive.Render do
</h3>
<span class="flex items-center px-2 py-1 space-x-2 text-sm bg-gray-200 rounded-lg">
<span class="inline-flex w-3 h-3 bg-green-600 rounded-full"></span>
<span><%= length(@data_view.clients) %> connected</span>
<span>{length(@data_view.clients)} connected</span>
</span>
</div>
<div class="flex flex-col mt-5 space-y-4">
@ -594,8 +594,8 @@ defmodule LivebookWeb.SessionLive.Render do
>
<.user_avatar user={user} class="shrink-0 h-7 w-7" text_class="text-xs" />
<span class="text-left">
<%= user.name || "Anonymous" %>
<%= if(client_id == @client_id, do: "(you)") %>
{user.name || "Anonymous"}
{if(client_id == @client_id, do: "(you)")}
</span>
</button>
<%= if client_id == @client_id do %>
@ -654,7 +654,7 @@ defmodule LivebookWeb.SessionLive.Render do
<div class="flex flex-col mt-2">
<div class="flex flex-col space-y-3">
<.labeled_text :for={{label, value} <- @data_view.runtime_metadata} label={label} one_line>
<%= value %>
{value}
</.labeled_text>
</div>
<div class="mt-4 grid grid-cols-2 gap-2">
@ -690,7 +690,7 @@ defmodule LivebookWeb.SessionLive.Render do
<.message_box kind="info">
<div class="flex items-center gap-2">
<.spinner />
<span>Step: <%= @data_view.runtime_connect_info %></span>
<span>Step: {@data_view.runtime_connect_info}</span>
</div>
</.message_box>
</div>
@ -728,9 +728,9 @@ defmodule LivebookWeb.SessionLive.Render do
<.runtime_memory_info memory_usage={@memory_usage} />
<% else %>
<p class="text-sm text-gray-800">
<%= format_bytes(@memory_usage.system.free) %> available out of <%= format_bytes(
{format_bytes(@memory_usage.system.free)} available out of {format_bytes(
@memory_usage.system.total
) %>
)}
</p>
<% end %>
</div>
@ -757,12 +757,12 @@ defmodule LivebookWeb.SessionLive.Render do
<div class="flex flex-col">
<div :for={{type, memory} <- @runtime_memory} class="flex flex-row items-center">
<span class={["w-4 h-4 mr-2 rounded", memory_color(type)]}></span>
<span class="capitalize text-gray-700"><%= type %></span>
<span class="text-gray-500 ml-auto"><%= memory.unit %></span>
<span class="capitalize text-gray-700">{type}</span>
<span class="text-gray-500 ml-auto">{memory.unit}</span>
</div>
</div>
<div class="flex rounded justify-center py-0.5 text-sm text-gray-800 bg-gray-200">
Total: <%= format_bytes(@memory_usage.runtime.total) %>
Total: {format_bytes(@memory_usage.runtime.total)}
</div>
</div>
"""
@ -794,7 +794,7 @@ defmodule LivebookWeb.SessionLive.Render do
<span class="text-sm text-gray-500 font-semibold uppercase">
Connected nodes
<%= if @runtime_connected_nodes != [] do %>
(<%= length(@runtime_connected_nodes) %>)
({length(@runtime_connected_nodes)})
<% end %>
</span>
<%= if @runtime_connected_nodes == [] do %>
@ -812,7 +812,7 @@ defmodule LivebookWeb.SessionLive.Render do
"flex-grow text-sm text-gray-700 text-medium whitespace-nowrap text-ellipsis overflow-hidden",
"group-hover:overflow-visible group-hover:whitespace-normal group-hover:break-all"
]}>
<%= node %>
{node}
</div>
<span class="tooltip left" data-tooltip="Disconnect">
<.icon_button phx-click="runtime_disconnect_node" phx-value-node={node} small>
@ -1322,8 +1322,8 @@ defmodule LivebookWeb.SessionLive.Render do
aria-label={@data_view.hub.hub_name}
>
<span>Using</span>
<span class="pl-1"><%= @data_view.hub.hub_emoji %></span>
<span><%= @data_view.hub.hub_name %></span>
<span class="pl-1">{@data_view.hub.hub_emoji}</span>
<span>{@data_view.hub.hub_name}</span>
<.remix_icon icon="arrow-down-s-line" class="-ml-1" />
<span>workspace</span>
</div>
@ -1335,8 +1335,8 @@ defmodule LivebookWeb.SessionLive.Render do
aria-label={hub.name}
role="menuitem"
>
<%= hub.emoji %>
<span class="ml-2"><%= hub.name %></span>
{hub.emoji}
<span class="ml-2">{hub.name}</span>
</button>
</.menu_item>
<.menu_item>

View file

@ -89,7 +89,7 @@ defmodule LivebookWeb.SessionLive.RuntimeComponent do
class="error-box scroll-mt-4"
phx-mounted={JS.dispatch("lb:scroll_into_view", detail: %{behavior: "instant"})}
>
<%= @error_message %>
{@error_message}
</div>
<div>
<.live_component

View file

@ -79,7 +79,7 @@ defmodule LivebookWeb.SessionLive.SaveRuntimeConfigComponent do
role="menuitem"
phx-click={JS.push("load_config", value: %{name: name}, target: @myself)}
>
<%= name %>
{name}
</button>
</.menu_item>
</.menu>
@ -114,7 +114,7 @@ defmodule LivebookWeb.SessionLive.SaveRuntimeConfigComponent do
</div>
<div class="mt-6 flex gap-2">
<.button type="submit" disabled={not @save_config.changeset.valid? or @save_config.inflight}>
<%= if(@save_config.inflight, do: "Saving...", else: "Save") %>
{if(@save_config.inflight, do: "Saving...", else: "Save")}
</.button>
<.button
color="gray"
@ -133,8 +133,8 @@ defmodule LivebookWeb.SessionLive.SaveRuntimeConfigComponent do
defp workspace(assigns) do
~H"""
<span class="font-medium">
<span class="text-lg"><%= @hub.hub_emoji %></span>
<span><%= @hub.hub_name %></span>
<span class="text-lg">{@hub.hub_emoji}</span>
<span>{@hub.hub_name}</span>
</span>
"""
end

View file

@ -39,7 +39,7 @@ defmodule LivebookWeb.SessionLive.SecretsComponent do
~H"""
<div class="flex flex-col space-y-5">
<h3 class="text-2xl font-semibold text-gray-800">
<%= @title %>
{@title}
</h3>
<p class="text-gray-700">
The notebook can read the secret value as a LB_ prefixed environment variable.
@ -161,7 +161,7 @@ defmodule LivebookWeb.SessionLive.SecretsComponent do
phx-value-hub={@hub?}
phx-target={@target}
>
<%= @secret_name %>
{@secret_name}
<span class={[
"inline-flex items-center font-sans rounded-full px-2.5 py-0.5 text-xs font-medium bg-gray-100",
if @active do
@ -178,7 +178,7 @@ defmodule LivebookWeb.SessionLive.SecretsComponent do
>
<circle cx="4" cy="4" r="3" />
</svg>
<%= @stored %>
{@stored}
</span>
</div>
"""
@ -196,9 +196,8 @@ defmodule LivebookWeb.SessionLive.SecretsComponent do
class="align-middle text-2xl flex text-gray-100 rounded-lg py-2"
/>
<span class="ml-2 text-sm font-normal text-gray-100">
There is a secret named
<span class="font-semibold text-white"><%= @secret.name %></span>
in the <%= hub_label(@hub) %> workspace. Allow this notebook to access it?
There is a secret named <span class="font-semibold text-white">{@secret.name}</span>
in the {hub_label(@hub)} workspace. Allow this notebook to access it?
</span>
</div>
<.button

View file

@ -46,7 +46,7 @@ defmodule LivebookWeb.SessionLive.SecretsListComponent do
<div class="mt-16">
<h3 class="uppercase text-sm font-semibold text-gray-500">
<%= @hub.hub_emoji %> <%= @hub.hub_name %> secrets
{@hub.hub_emoji} {@hub.hub_name} secrets
</h3>
<span class="text-sm text-gray-500">
<%= if @hub_secrets == [] do %>
@ -82,7 +82,7 @@ defmodule LivebookWeb.SessionLive.SecretsListComponent do
|> JS.toggle_class("bg-gray-100", to: "#session-secret-#{@secret.name}")
}
>
<%= @secret.name %>
{@secret.name}
</span>
<div
class="flex justify-between items-center my-1 hidden"
@ -132,7 +132,7 @@ defmodule LivebookWeb.SessionLive.SecretsListComponent do
|> JS.toggle_class("bg-gray-100", to: "##{@id}")
}
>
<%= @secret.name %>
{@secret.name}
</span>
<span
class="mr-2 tooltip bottom-left"

View file

@ -128,7 +128,7 @@ defmodule LivebookWeb.SessionLive.SectionComponent do
</div>
<.branching_menu section_view={@section_view} scope="subheading" position="bottom-left">
<div class="text-sm leading-none cursor-pointer">
from <%= @section_view.parent.name %>
from {@section_view.parent.name}
</div>
</.branching_menu>
</h3>
@ -137,7 +137,7 @@ defmodule LivebookWeb.SessionLive.SectionComponent do
class="mt-2 text-sm text-gray-500 cursor-default select-none"
data-el-section-subheadline-collapsed
>
<%= LivebookWeb.HTMLHelpers.pluralize(length(@section_view.cell_views), "cell", "cells") %> collapsed
{LivebookWeb.HTMLHelpers.pluralize(length(@section_view.cell_views), "cell", "cells")} collapsed
</h3>
<div class="container" data-el-section-content>
<div class="flex flex-col space-y-1">
@ -199,7 +199,7 @@ defmodule LivebookWeb.SessionLive.SectionComponent do
disabled={@disabled}
>
<:toggle>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</:toggle>
<%= if @section_view.parent do %>
<.menu_item>
@ -226,7 +226,7 @@ defmodule LivebookWeb.SessionLive.SectionComponent do
icon="arrow-right-s-line"
class={[(@section_view.parent && @section_view.parent.id == parent.id) || "invisible"]}
/>
<span><%= parent.name %></span>
<span>{parent.name}</span>
</button>
</.menu_item>
</.menu>

View file

@ -226,10 +226,10 @@ defmodule LivebookWeb.SessionLive.ShortcutsComponent do
~H"""
<div class="flex flex-col space-y-3">
<h3 class="text-lg font-medium text-gray-900">
<%= @title %>
{@title}
</h3>
<div :if={@description} class="text-gray-700">
<%= @description %>
{@description}
</div>
<div class="flex flex-col lg:flex-row lg:space-x-4">
<div class="lg:grow">
@ -252,7 +252,7 @@ defmodule LivebookWeb.SessionLive.ShortcutsComponent do
<.shortcut shortcut={shortcut} platform={@platform} />
</td>
<td class="lg:whitespace-nowrap">
<%= shortcut.desc %>
{shortcut.desc}
</td>
</tr>
</tbody>
@ -279,7 +279,7 @@ defmodule LivebookWeb.SessionLive.ShortcutsComponent do
<%= if element == :joiner do %>
<.remix_icon icon="add-line" class="text-lg text-gray-600" />
<% else %>
<kbd><%= element %></kbd>
<kbd>{element}</kbd>
<% end %>
<% end %>
</div>

View file

@ -83,7 +83,7 @@ defmodule LivebookWeb.SessionLive.StandaloneRuntimeComponent do
</div>
</div>
<.button type="submit" disabled={@runtime_status == :connecting or not @changeset.valid?}>
<%= label(@changeset, @runtime_status) %>
{label(@changeset, @runtime_status)}
</.button>
</.form>
</div>

View file

@ -53,17 +53,17 @@ defmodule LivebookWeb.SettingsLive do
<.labeled_text :if={app_name = Livebook.Config.app_service_name()} label="Application">
<%= if app_url = Livebook.Config.app_service_url() do %>
<a href={app_url} class="underline hover:no-underline" target="_blank">
<%= app_name %>
{app_name}
</a>
<% else %>
<%= app_name %>
{app_name}
<% end %>
</.labeled_text>
<.labeled_text label="Livebook">
v<%= Livebook.Config.app_version() %>
v{Livebook.Config.app_version()}
</.labeled_text>
<.labeled_text label="Elixir">
v<%= System.version() %>
v{System.version()}
</.labeled_text>
</div>

View file

@ -26,10 +26,10 @@ defmodule LivebookWeb.SettingsLive.EnvVarComponent do
~H"""
<div class="flex flex-col space-y-5">
<h3 class="text-2xl font-semibold text-gray-800">
<%= if @operation == :new, do: "Add environment variable", else: "Edit environment variable" %>
{if @operation == :new, do: "Add environment variable", else: "Edit environment variable"}
</h3>
<p class="text-gray-700">
<%= @headline %>
{@headline}
</p>
<.form
:let={f}

View file

@ -16,7 +16,7 @@ defmodule LivebookWeb.SettingsLive.EnvVarsComponent do
</.no_entries>
<div :if={@env_vars != []}>
<.table id="env-var-table" rows={@env_vars}>
<:col :let={env_var} label="Name"><%= env_var.name %></:col>
<:col :let={env_var} label="Name">{env_var.name}</:col>
<:action :let={env_var}>
<span class="tooltip left" data-tooltip="Edit">
<.icon_button

View file

@ -104,9 +104,9 @@ defmodule Livebook.MixProject do
defp deps do
[
{:phoenix, "~> 1.7.8"},
{:phoenix_live_view, "~> 1.0.0-rc.0"},
{:phoenix_live_view, "~> 1.0.0"},
{:phoenix_html, "~> 4.0"},
{:phoenix_live_dashboard, "~> 0.8.4-rc.0"},
{:phoenix_live_dashboard, "~> 0.8.4"},
{:telemetry_metrics, "~> 1.0"},
{:telemetry_poller, "~> 1.0"},
{:jason, "~> 1.0"},

View file

@ -34,9 +34,9 @@
"phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.6.3", "f686701b0499a07f2e3b122d84d52ff8a31f5def386e03706c916f6feddf69ef", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "909502956916a657a197f94cc1206d9a65247538de8a5e186f7537c895d95764"},
"phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.4-rc.0", "3af26124c9bea60253db50360912cb59668580ede2e702e7324536fb9d1cb523", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0-rc", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "66885624771f1a59f5b0ed6c24cbcec70fb2544356cb8085fd85320e6593720a"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.5", "d5f44d7dbd7cfacaa617b70c5a14b2b598d6f93b9caa8e350c51d56cd4350a9b", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "1d73920515554d7d6c548aee0bf10a4780568b029d042eccb336db29ea0dad70"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"},
"phoenix_live_view": {:hex, :phoenix_live_view, "1.0.0-rc.7", "d2abca526422adea88896769529addb6443390b1d4f1ff9cbe694312d8875fb2", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b82a4575f6f3eb5b97922ec6874b0c52b3ca0cc5dcb4b14ddc478cbfa135dd01"},
"phoenix_live_view": {:hex, :phoenix_live_view, "1.0.0", "3a10dfce8f87b2ad4dc65de0732fc2a11e670b2779a19e8d3281f4619a85bce4", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "254caef0028765965ca6bd104cc7d68dcc7d57cc42912bef92f6b03047251d99"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
"plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},