- Text input: Set disabled color on read-only field with inset style.
- Checkbox group and Radio group: Show required marker in legend.
- Action menu and Select menu: Added attribute
offset_x
to define the absolute offset for the menu on the horizontal axis. - Header: added attributes
variant="base"
to create a light colored header, andis_compact
for a smaller vertical height. - Updated upstream Primer Design System libraries. This update includes a number of changes to modified CSS Custom Properties.
- Updated upstream dependency
@primer/css
to21.5.0
. - Added
@primer/view-components
version0.34.0
. This is the Rails version of Primer Design, which is the most developed so far. - Updated Octicon icons to version
v19.12.0
.
- Updated upstream dependency
- Added support for right-to-left languages.
- Added support for
@scope
, allowing PrimerLive to be used alongside other CSS libraries. See usage instructions in Installation. - Added documentation Styling. This contains notes about styling with custom CSS and pre-made classes, reusing styled components and support for right-to-left languages.
Standalone form_control
as wrapper is soft-deprecated.
The use of form_control
as wrapper component around a form input component was causing compatibility issues with displaying validation messages. Since input components should be able to display a validation message even when not wrapped inside a form_control
, it became difficult to distinguish between a validation messages originating from the form_control
and one originating from the nested input.
With the introduction of checkbox_group
and radio_group
in version 0.5, there has been less need for a standalone form control wrapper.
Overall, moving form_control
to the background and using it only as an internal component resolves a range of problems.
See "Updating to 0.9" below.
form_group
was soft-deprecated in 0.5.0 and has been removed, along with component attributesform_group
andis_form_group
.
- Checkbox group and Radio group: Restored display of validation message.
- Textarea: Set correct success color when displaying success feedback.
There have 2 ways to create a form control: as a wrapper, and as an input attribute. If you've been using form_control
as wrapper around inputs, change:
<.form :let={f} for={@changeset}>
<.form_control form={f} field={:first_name} for="first-name">
<.text_input form={f} field={:first_name} id="first-name" />
</.form_control>
</.form>
to
<.form :let={f} for={@changeset}>
<.text_input form={f} field={:first_name} id="first-name" is_form_control />
</.form>
If you are using CSS Custom Properties from the Primer Design System, these may need to be updated. Verify the current available options in primer-live.css.
This refactoring builds on the Phoenix.LiveView.JS
API - taking example from CoreComponent
's modal component. These changes reduce reliance on additional JavaScript, improve alignment with standard practice, and include accessibility improvements.
Overview:
See component documentation for further details:
- Dialogs, drawers and menus can now be shown conditionally, for example on a
live_action
route:
<.dialog
:if={@live_action == :create}
is_show
id="new-post-dialog"
on_cancel={JS.patch(~p"/posts")}
>
...
</.dialog>
- Added
PrimerLive.StatefulConditionComponent
. - Dialog state is now preserved on form updates.
- Added attribute
focus_after_closing_selector
, mirroring the (renamed)focus_after_opening_selector
. - Added attribute
on_cancel
. - Added attribute
transition_duration
. - Added attribute
show_state
to persist dialogs, drawers and menus across different LiveViews. - Added
backdrop_tint
with values "dark" (default) and "light". The latter (combined withbackdrop_strength="strong"
) (see below) creates a backdrop that is similar to the CoreComponent's modal. - Added focus trap.
See for update instructions: "Updating to 0.8" below.
- Prompt functions
show
andhide
are replaced withopen_dialog
,close_dialog
andcancel_dialog
. - Replaced attribute
prompt_options
for status callbacks withstatus_callback_selector
that sends status events to the component, so that state changes can be used in Elixir code. - Removed attribute
phx_click_touch
in favor of usingstatus_callback_selector
, because closing can be initiated in several ways, not only through backdrop clicks, and we can't assume that the event handler always hosts the dialog/drawer as well. - Renamed attribute
focus_first
tofocus_after_opening_selector
. Focus on the first interactive element is now default; withfocus_after_opening_selector
a specific element can be appointed. - Removed attrs
form
andfield
from all prompt components. - Added separate
z-index
settings for menus, so that the menu panel (and optional backdrop) are closer to the page, allowing them to be covered by other elements such as top bars. Using az-index
of100
for a top bar ensures that it sits in between menus and dialogs/drawers. - Replaced backdrop attributes
is_dark_backdrop
,is_medium_backdrop
andis_light_backdrop
withbackdrop_strength
and values"strong"
,"medium"
and"light"
. - Menus and dialogs can now be closed with Escape by default.
The box component now supports streams:
<.box stream={@streams.clients} id="clients">
<:row :let={{_dom_id, data}}>
<%= data.name %>
</:row>
</.box>
This includes a breaking change: let
is now reserved for stream data, so the callback data no longer contains classes
.
Slots now accept these "all-purpose" event attributes:
phx-click
phx-target
phx-value-item
Components:
box
: slotrow
breadcrumb
: slotitem
dialog
: slotrow
dropdown
: slotitem
filter_list
: slotitem
header
: slotitem
menu
: slotitem
select_menu
: slotitem
side_nav
: slotitem
subnav_links
: slotitem
tabnav
: slotitem
truncate
: slotitem
underline_nav
: slotitem
Example with tabnav
:
<:item
:for={%{label: label, id: tab_id} <- @tabs}
is_selected={id == @selected_tab}
phx-click="set_tab"
phx-value-item={tab_id}
>
...
def handle_event(
"set_tab", %{"item" => tab_id}, socket) do
...
The form group created by checkbox_group and radio_group is now automatically wrapped in a fieldset. The label
attribute generates a legend
element.
This update to version 19.11.0
includes around 50 additions. See primer-live.org/octicon for a visual list.
- Added ARIA tags
aria-haspopup
andaria-owns
. - DOM ids are reformatted to a DOM-safe ID string.
-
Replace
Promp.show
andPrompt.hide
:-
For example:
onclick="Prompt.show('#my-dialog')" onclick="Prompt.hide('#my-dialog')"
-
Becomes:
phx-click={open_dialog("my-dialog")} phx-click={close_dialog("my-dialog")}
-
-
Replace backdrop darkness attributes:
is_dark_backdrop
becomesbackdrop_strength="strong"
is_medium_backdrop
becomesbackdrop_strength="medium"
is_light_backdrop
becomesbackdrop_strength="light"
-
Attribute
is_escapable
can be removed because this is now the default. If the component should not be removed using Escape, useis_escapable={false}
.
-
Form state: the previous method to preserve state, using "a fictitious and unique field name" can be removed.
- Remove
form
andfield
from menu and dialog component attributes.
- Remove
-
Because
focus_first
(without a selector) is now the default, nothing needs to be changed when using this attribute.- If in existing code a selector value is used, rename the attribute to
focus_after_opening_selector
.
- If in existing code a selector value is used, rename the attribute to
-
Replace
prompt_options
andphx_click_touch
withstatus_callback_selector
. There's no simple way to replaceprompt_options
, because passing JavaScript functions is no longer supported. A solution could be very similar to the previousphx_click_touch
method. See Status callbacks for an example. -
If you use
checkbox_group
orradio_group
inside afieldset
, remove the fieldset as it is now redundant. -
If you are using
box
with a:let
callback:-
Previous:
<:row :let={classes}> <.link href="/" class={classes.link}>Home</.link> </:row>
-
Becomes:
<:row> <.link href="/" class="Box-row-link">Home</.link> </:row>
-
- Fixes support for Ash 3. Thanks @ademenev!
- Internal improvements
- Added dialog attr
is_show_on_mount
. - Downgraded dependency @primer/css to 21.0.7 due to regressions.
Updated dependencies:
phoenix_ecto
to4.5
phoenix_html
to4.1
- Added
phoenix_html_helpers
- Added
phoenix_live_view
to0.20
@primer/css
to21.2.2
Removed support for Ash Framework due to incompatible dependencies.
Reverted dependency @primer/css
to 21.0.9
because of an excessively increased file size in later versions.
- Class attrs now support class notation from Surface. Thanks @tunchamroeun!
- Component
pagination
: added class entry for "current_page" which now can receive a custom class.
- Pagination: fixes the calculation when a gap between page numbers should be shown.
- Pagination: added
role
and improved ARIA labels.
Bug fixes:
- Fixes reading the required state of input fields.
Added support for forms created with Ash Framework. See test/frameworks/ash/form_test.exs for an example.
Fixed a bug where the required marker would always be displayed, regardless of the field's required state.
Downgraded phoenix_live_view
version to 0.19
; both 0.19
and 0.20
should be compatible.
Added JS and CSS exports for Prompt functionality only. This is useful when you want to use menu/dialog/drawer behavior without Primer Design CSS. See the installation documentation for details.
- Component
avatar_pair
: renamedparent_child_avatar
toavatar_pair
. - Components
action_menu
andselect_menu
: renamedis_right_aligned
tois_aligned_end
(added RTL support). - Component
spinner
: renamedgap_color
tohighlight_color
.
toggle_switch
: Toggle switch is used to immediately toggle a setting on or off.
avatar
: Added attris_round
.avatar_pair
: Improved styling: support display inside flex container, add inner border to child avatar.button
- Improved dimensions according to Primer Style specs, including placing a trailing icon.
- Added attr
is_aligned_start
. Aligns contents to the start (at the left in left-to-right languages), while the dropdown caret (if any) is placed at the far end.
spinner
: Updated to latest Primer Style design.
Form elements have been revamped and aligned with the most recent form element documentation at Primer Style.
For all listed deprecations below: existing syntax will keep working, but log warnings will inform about the deprecation.
form_group
is replaced byform_control
(andis_form_group
is replaced byis_form_control
). When updating your code:- You may need to add styling to correct the missing whitespace at top and bottom, because class "form-group" (which is also added when using attrs
form_group
andis_form_group
) contains a top and bottom margin. - Without a form group, text inputs (as well as selects) will be given a default width by the browser and will probably be displayed smaller than they currently are.
- You may need to add styling to correct the missing whitespace at top and bottom, because class "form-group" (which is also added when using attrs
- The horizontal "tab-row" layout of
radio_group
is not mentioned in the Primer Design specification, while "Radio group" is (with vertical layout).- The current
radio_group
has been renamed toradio_tabs
. - The new component
radio_group
uses a vertical layout.
- The current
checkbox
andradio_button
slothint
has been renamed tocaption
.button_group
slotbutton
is replaced bybutton
components as children.- For consistency, attr
is_full
has been renamed tois_full_width
(inalert
andheader
slot:item
).
- Added component
checkbox_group
. - Added convenience component
checkbox_in_group
for checkboxes inside acheckbox_group
. - Added component
radio_group
(with vertical layout). - Added attr
caption
to show hint message below the form fields.- Implemented for
select
,text_input
andtextarea
. - Implemented for
checkbox_group
andradio_group
to show a hint below the group label.
- Implemented for
- Added a required marker to
form_control
,checkbox_group
andradio_group
. The form control label will show a required marker if the field is required.- Added
is_required?
toFieldState
, so it can also be queried invalidation_message
andcaption
callbacks.
- Added
- Added disabled state to
form_control
:- With components
select
,text_input
andtextarea
: the attributedisabled
is automatically passed toform_control
. - When using component
form_control
on its own: set explicitly with attris_disabled
.
- With components
- Form element width variation attrs
is_short
andis_shorter
. These are no longer supported by Primer System. form_control
classbody
: this extra div is removed to simplify the styling of validation states.
- The open state of menus and dialogs can now be maintained when used inside forms.
- Improved validation message logic.
- Updated components:
theme_menu_options
: added attrupdate_theme_event
: the event name to be called for updating the theme.radio_group
: added to slotradio_button
the attrlabel
to set a custom label.
- Updated
@primer/css
to21.0.7
.
- Removed functions related to using session for theme state - see
PrimerLive.Theme
for alternatives. Removed:ThemeSessionController
ThemeEvent
- Theme hook
- IDs of checkboxes and radio buttons have been updated to only include valid characters.
- For all menu components, including 'dialog' and 'drawer': passing prompt options to the
toggle
slot is replaced by passingprompt_options
to the main component. - In the
drawer
component, replace the subcomponentdrawer_content
with the slotbody
.- This allows the focus wrap ID to be derived from the drawer's 'id' attribute, similar to how it is done for 'dialog'.
- When using the previous syntax, a warning message will be shown in the shell.
- The HTML structure and some of the CSS classes of
action_menu
,dropdown_menu
andselect_menu
have changed. Instead of<details>
and<summary>
elements, the open state is now controlled with<input type="checkbox">
and<label>
. - HTML attributes are sorted alphabetically.
Replaced underscores in HTML element attributes with dashes because Phoenix LiveView 0.19 no longer does automatic substitution.
Updated components:
select
: attrprompt
is ignored whenis_multiple
is also used. This preventsPhoenix.HTML.Form.multiple_select
from raising an error.
Breaking change: action_list_item
now always renders a checkbox group, also when is_multiple_select
is set on the list items. This change makes handling form data in events more consistent: the data will always consist of a list of checkbox values.
Fixes a bug introduced in 0.2.6
where single select action_list_item
s did not get unique ids.
- Fixes a bug where
FormHelpers.field_state
did not handle forms without a changeset. - Updated components:
text_input
: added attrsname
andvalue
checkbox
: add attrschecked
,checked_value
,hidden_input
- Update
@primer/css
to21.0.0
.
Updated components:
action_menu
andselect_menu
:- Added
prompt
slot attroptions
to pass Prompt options. This enables (for example) to postpone submitting a form in the menu by callingsubmit
event in the Prompt functionswillHide
ordidHide
.
- Added
- Fixes a bug where variables in error messages where not interpolated.
- Update to
phoenix_html
3.3.x
- Clarified
layout
attributes to change the rendered order of slots. - Improve field name and id generation.
- Use checkboxes and radio buttons in action lists.
Updated component:
checkbox
:- Added attr
is_multiple
: When creating a list of checkboxes. Appends[]
to the input name so that a list of values is passed to the form events. - Added attr
is_omit_label
: Omits any label.
- Added attr
Updated component:
text_input
:- Moved attr
is_trailing_action_divider
to slottrailing_action
asis_divider
- Added attr
is_visible_with_value
to slottrailing_action
to only show the trailing action when the input has a value. Use this cor example to show a clear button only when the input has a value to clear.
- Moved attr
The rework includes styles from Primer ViewComponents. The form styles from this flavor of Primer is more mature than the generally used Primer CSS.
Updated components:
text_input
:- Added attr
is_monospace
- Added slots
leading_visual
andtrailing_action
- Added attr
is_trailing_action_divider
- Inputs inside a form group no longer have a background color by default; use
is_contrast
to set it explicitly - Removed validation message for hidden inputs
- Added attr
textarea
:- Added attr
is_monospace
- Use
is_contrast
to explicitly set a contrasting background color
- Added attr
checkbox
andradio_button
- Have a clearer (more colorful) appearance
- Changed the HTML structure
radio_group
- For consistency, added input styling from Primer ViewComponents radio button (keeping the initial size)
select
:- Added wrapper HTML element
- Added attr
is_monospace
- Added attr
is_large
- Added attr
is_short
- Added attr
is_shorter
- Added attr
is_full_width
- Improved styling for multiple select
subnav
with search field:- Added attr
is_wrap
to wrap child elements - Improved CSS for small screens
- Added attr
Added component:
input_validation_message
- can be used as standalone message component for inputs where the position of the validation feedback is not so obvious, for example lists of checkboxes or radio buttons
Additional:
- Added styling for input elements inside a disabled fieldset
JavaScript and CSS dependencies (from npm library primer-live
) are now incorporated in the Elixir package. The installation instructions are slightly simplified (see the documentation) and are recommended for a fresh setup. The previous installation method works just fine for existing projects.
Added anchor link attributes to button
to create a link that looks like a button.
Removed Octicon builder template files from distribution.
- Updated
octicons
dependency to17.10.1
- Code quality refactoring
- Documentation updates
Added:
theme_menu_options
to create a theme menuTheme.html_attributes
to set theme attributes on elements- Theme functions for persistent theme data in the session
Fixes an issue where validation messages did not show.
Added:
theme
Updated:
- Prevent attribute open on select menu
Added:
styled_html
Updated:
- Removed requirement for Elixir version
Updated:
- Added
is_small
fortabnav
items
Updated:
oticon
icons
Added:
drawer
Bug fix:
- Improve
action_menu
on mobile
Added:
action_menu
Bug fix:
action_link_item
: pass class tolink
slot.
First release.