0.3.0
dropdown_item: a link item takestarget,rel,download,hreflang,referrerpolicyandreplace, so it can open in a new tab or download a file.drawer: the panel no longer carriestransform-gpu, so an open drawer is not a containing block forposition: fixed; a modal or confirm rendered inside a drawer now covers the viewport and stacks above it (it stays in the LiveView's DOM, so patches keep working).table_head:col,table_row:cellandtable_foot:cell: attributes they do not use (id,data-*,phx-*,aria-*,title) land on the<th>/<td>; the slots no longer warn about undeclared attributes.table_skeleton: covered by a test that its attributes (data-role,phx-*) reach the<table>.date_picker/datetime_picker/time_picker: a value that does not parse (not ISO, blank, out of range, not a string or date) renders as empty instead of raising;DatePicker.Shell.format/4returns""for it.tabs: a:tabwithpatch,navigateorhref(andreplace) renders as a<.link>witharia-current="page"when selected, for navigation tabs; a tab only getsaria-controlswhen a:panelwith its name exists.input::prefixand:suffixtakeinteractive(the box takes clicks, for a send or clear button) andclass.select: the@docexplains the native variant as the fixed-choice, non-searchable select.
0.2.0
- One-command installer:
mix igniter.install linea_uiadds the dependency and sets the app up, with the diff confirmed by the user.mix linea_ui.installis now an Igniter task (igniteris an optional dependency; without it the task keeps writing the skill and printing the setup lines). It imports the fonts and styles inapp.css(with@sourceforsource(none)), registersLineaHooksinapp.js, adds the fonts'Plug.Staticto the endpoint, addsuse LineaUI, avoid_conflicts: truetohtml_helpers/0, writes the Claude Code skill and theAGENTS.md/CLAUDE.mdpointer (creatingAGENTS.mdwhen neither exists). Idempotent. Flags:--hugeicons,--replace-daisyui,--no-skill. avoid_conflicts: truealso dropstheme_toggle, which Phoenix 1.8's generatedLayoutsdefines.table: hand-written tables. Withoutrows,table/1renders its inner block and newtable_head,table_body,table_row,table_cell,table_foot,table_empty,table_checkbox,table_expand_toggleandtable_detail_rowtake its look: per-row attributes andon_click, streams, colspans, a totals footer, an empty row that works with streams, detail rows, selection with an indeterminate select-all, sortable headers witharia-sort. The slot API gainsrow_class,row_attrs,sticky_header, a:footslot and a stream-aware:empty; selected rows are tinted with a primary bar.table_skeleton: placeholder rows in the table's look while it loads.data_table: passesrow_class,row_attrs,sticky_headerand:footthrough to the table.pagination:total_entries/page_sizeadd a "Showing 1–15 of 128" summary (text set bysummary) and work outtotal_pages;page_sizesadds a rows-per-page select pushingon_page_sizewith%{"page_size" => "30"}.number_input: a locale-aware numeric field (pt-BR1.234,56by default,en, or explicit separators) with fixed (decimals) or maximum (max_decimals) decimals,min/max/step, optionalsteppers,prefix/suffixboxes; it shows the formatted number and submits the machine value (1234.56) through a hidden input, and takes integers, floats, numeric strings andDecimals (LineaUI.NumberInputhook).autocomplete: a text input with suggestions in the Tom Select look: client filtering or server search (on_search, debounced,target,search_threshold, loading row),:optionslot, keyboard navigation,clearable,open_on_focus,free_text,display_value, and ano_resultstext with%{query}(LineaUI.Autocompletehook).select: the listbox'sidfalls back tonamebefore a generated one, andno_resultsreplaces%{query}with the search text.radio_groupandcheckbox_group:variant="card"(a bordered card per option with title, description, optional icon and count, ringed incolorwhen chosen) andvariant="chip"(pill chips with an optional count badge, the status filter of a list), over real radio/checkbox inputs; options may also be maps with:description,:count,:icon,:colorand:disabled, and the slots takecountandicon.tags_input: an option-picking mode:options,create={false},on_search(debounced bydebounce, sent totarget) andselected_optionsfor the labels of chosen values the current options no longer hold; chosen chips keep their labels across server searches. The free-text mode is unchanged.date_picker: a range submitted as two fields (start_field/end_fieldorstart_name/end_name),presetsunder the calendar (named periods computed fromtodayby the newdate_range_preset/3, or explicit{from, to}), andlocale="pt_BR"(month and weekday names,dd/mm/aaaa, "até"), withrange_separator;datetime_pickertakeslocaletoo.drawer: the design's sheet —title,descriptionand a:headerslot with a close button,:backand:actionsslots, a scrolling body (body_class), a:footerslot (end-aligned, top border, tinted bar),size(sm400px,md560px,lg760px,xl1080px, full width on phones),placement,lock_scroll. A bare drawer renders as before.- Overlay layers are CSS custom properties (
--linea-z-overlay,--linea-z-modal,--linea-z-popover,--linea-z-tooltip,--linea-z-toast) with today's values as defaults; drawers and modals stack in the order they open (a modal opened from a drawer is above it), and Esc or a backdrop click closes only the top one. toaster/toasts:kind(neutral info success warning error loading) with an icon,description,actions(event,%JS{}, link or dismiss), a toast with a knownidis replaced in place (loading, then the answer),update_toast/3,dismiss_toast/1,2,clear_toasts/0,1,send_toast/2with the title in the options,duration: :infinity,persist_errorson the toaster. Existing calls are unchanged.dropdown_submenu: a nested menu that opens to the side on hover, click or →, back with ← or Esc, flipping side when the screen has no room.scroll_area: a box with LineOne's thin scrollbar (6px, transparent track, thumb on hover), vertical, horizontal or both;scrollbar-smnow also styles Firefox, andscrollbar-alwayskeeps the thumb shown.glyph:info_circle,warning,check_circleanderror_circle.
0.1.1
- LICENSE and README: the design is credited to its author; the text no longer asks users for a license of the original kit.
0.1.0
First release.
- 47 Phoenix LiveView components reproducing the LineOne design: buttons, badges, tags, avatars, alerts, cards, progress, spinners, skeletons, tooltips, typography, breadcrumbs, tabs, steps, timeline, pagination, tables and data tables, treeview, menu list, carousel, charts (ApexCharts supplied by the app), accordion, collapse, modal, drawer, dropdown, popover, toasts (stacked, open under the pointer), clipboard, the application shell, and the form controls: input (with masks), input group, textarea, checkbox, radio, switch, range, select, tags input, date, date-time and time pickers, text editor and upload.
- Server-driven and client-driven state for every stateful component, events with a
target, streams for lists,LineaUI.open/close/togglefor overlays,field={@form[:name]}for form controls. - Two icon sets: LineOne's own glyphs (default) and Hugeicons Stroke Rounded
(
config :linea_ui, :icons, :hugeicons), plus<.icon>for any Hugeicons name. mix linea_ui.installandmix linea_ui.gen.skillwrite a Claude Code skill generated from the components' own attributes and docs.