Skip to content

Add Elixir component wrappers for existing CSS components - #679

Merged
gerardramos merged 2 commits into
v2from
feat/elixir-component-wrappers
Mar 19, 2026
Merged

Add Elixir component wrappers for existing CSS components#679
gerardramos merged 2 commits into
v2from
feat/elixir-component-wrappers

Conversation

@gerardramos

Copy link
Copy Markdown

Summary

Adds 35 new Phoenix function components to harmonium_ex, wrapping CSS classes that already exist in the design system but had no Elixir wrapper. Previously only 11 of 50+ CSS components had wrappers.

New Components

Category Components
Stepper hm_stepper, hm_stepper_step, hm_stepper_connector
Progress hm_progress (value, max, size, variant)
Dialog hm_dialog_overlay, hm_dialog, hm_dialog_header, hm_dialog_body, hm_dialog_footer
Empty State hm_empty_state, hm_empty_state_icon, hm_empty_state_title, hm_empty_state_description, hm_empty_state_action
Drawer hm_drawer_overlay, hm_drawer (side, size)
Typography hm_text (size, weight, color, truncate), hm_heading (size, weight)
Data Grid hm_data_grid_wrapper, hm_data_grid (striped, hoverable)
File Upload hm_file_upload, hm_file_upload_placeholder
Toast hm_toast_container, hm_toast
Popover hm_popover, hm_popover_content
Tooltip hm_tooltip, hm_tooltip_content
Skeleton hm_skeleton
Stat hm_stat, hm_stat_value, hm_stat_label
Tabs hm_tabs, hm_tabs_list, hm_tabs_trigger, hm_tabs_content

All follow the existing thin-wrapper pattern: set CSS class + data attributes, pass through global attrs and slots.

Motivation

The bid leveling app (and likely other Harmonium consumers) needs stepper, progress, dialog, drawer, typography, and data grid components. The CSS already supports all of these — only the Elixir wrappers were missing, forcing consumers to use raw HTML class strings.

Test plan

  • mix compile passes in harmonium_ex

gerardramos and others added 2 commits March 19, 2026 01:36
Adds 35 new function components to harmonium_ex, wrapping CSS classes
that already exist in the design system but had no Elixir wrapper:

Stepper: hm_stepper, hm_stepper_step, hm_stepper_connector
Progress: hm_progress (with value/max/size/variant)
Dialog: hm_dialog_overlay, hm_dialog, hm_dialog_header/body/footer
Empty State: hm_empty_state, hm_empty_state_icon/title/description/action
Drawer: hm_drawer_overlay, hm_drawer (side/size)
Typography: hm_text (size/weight/color/truncate), hm_heading (size/weight)
Data Grid: hm_data_grid_wrapper, hm_data_grid (striped/hoverable)
File Upload: hm_file_upload, hm_file_upload_placeholder
Toast: hm_toast_container, hm_toast
Popover: hm_popover, hm_popover_content
Tooltip: hm_tooltip, hm_tooltip_content
Skeleton: hm_skeleton
Stat: hm_stat, hm_stat_value, hm_stat_label
Tabs: hm_tabs, hm_tabs_list, hm_tabs_trigger, hm_tabs_content

All follow the existing thin-wrapper pattern: set CSS class + data
attributes, pass through global attrs and slots.
Replace empty interfaces with type aliases, remove non-null assertions,
and clean up unused variables to pass strict TypeScript linting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@gerardramos
gerardramos merged commit 2a1b8a1 into v2 Mar 19, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant