feat(runtime): native platform backends and UI vessels onto main

This commit is contained in:
2026-07-01 11:21:23 -05:00
parent 59cea116c5
commit 688b8508fb
123 changed files with 70937 additions and 99 deletions
@@ -0,0 +1,397 @@
___args_json
___channel_close
___channel_new
___channel_recv
___channel_send
___channel_try_recv
___env_get
___exec
___exec_bg
___exit_program
___float_to_str
___fs_exists
___fs_list_raw
___fs_mkdir
___fs_read
___fs_write
___fs_write_bytes
___http_conn_fd
___http_do
___http_do_map
___http_do_map_to_file
___http_response
___http_serve
___http_serve_v2
___http_sse_close
___http_sse_open
___http_sse_send
___int_to_str
___json_array_get
___json_array_get_string
___json_array_len
___json_get
___json_get_raw
___json_parse_map
___json_set
___json_stringify_val
___mutex_lock
___mutex_new
___mutex_unlock
___print
___print_raw
___println
___read_n
___readline
___sha256_hex
___state_del
___state_get
___state_keys
___state_set
___str_alloc
___str_char_at
___str_cmp
___str_concat_raw
___str_len
___str_ncmp
___str_set_char
___str_slice_raw
___str_to_float
___str_to_int
___thread_create
___thread_join
___url_decode
___url_encode
___uuid_v4
_aead_decrypt
_aead_encrypt
_append
_args
_base64_decode
_base64_encode
_base64url_decode
_base64url_encode
_bool_to_str
_bytes_to_str
_cal_cycle_phase
_cal_format
_cal_in
_cal_to_instant
_config
_cycle_calendar
_decimal_round
_duration_millis
_duration_nanos
_duration_seconds
_duration_to_millis
_duration_to_nanos
_duration_to_seconds
_earth_calendar
_earth_calendar_default
_el_abs
_el_arena_pop
_el_arena_push
_el_base64_encode_n
_el_cgi_init
_el_duration_add
_el_duration_div
_el_duration_eq
_el_duration_from_nanos
_el_duration_ge
_el_duration_gt
_el_duration_le
_el_duration_lt
_el_duration_ne
_el_duration_scale
_el_duration_sub
_el_get_field
_el_html_sanitize
_el_instant_add_dur
_el_instant_diff
_el_instant_eq
_el_instant_ge
_el_instant_gt
_el_instant_le
_el_instant_lt
_el_instant_ne
_el_instant_sub_dur
_el_list_append
_el_list_clone
_el_list_empty
_el_list_get
_el_list_len
_el_list_new
_el_local_date_add_dur
_el_local_date_eq
_el_local_date_lt
_el_local_time_add_dur
_el_map_get
_el_map_new
_el_map_set
_el_max
_el_mem_check
_el_min
_el_now_instant
_el_release
_el_request_end
_el_request_start
_el_retain
_el_runtime_init_args
_el_runtime_register_handler
_el_runtime_register_handler_v2
_el_sha256_bytes_n
_el_sleep_duration
_el_str_concat
_engram_activate
_engram_activate_json
_engram_add_layer
_engram_apply_decay_json
_engram_compile_layered_json
_engram_connect
_engram_edge_between
_engram_edge_count
_engram_forget
_engram_get_node
_engram_get_node_json
_engram_list_layers
_engram_list_layers_json
_engram_load
_engram_neighbors
_engram_neighbors_filtered
_engram_neighbors_json
_engram_node
_engram_node_count
_engram_node_full
_engram_node_layered
_engram_query_range
_engram_remove_layer
_engram_save
_engram_scan_nodes
_engram_scan_nodes_by_type_json
_engram_scan_nodes_json
_engram_search
_engram_search_json
_engram_stats_json
_engram_strengthen
_env
_exec
_exec_bg
_exec_capture
_exec_command
_exit_program
_float_to_int
_float_to_str
_format_float
_fs_exists
_fs_list
_fs_list_json
_fs_mkdir
_fs_read
_fs_write
_fs_write_bytes
_get
_getpid_now
_hash_sha256
_hmac_sha256_bytes
_hmac_sha256_hex
_html_escape
_html_raw
_http_delete
_http_get
_http_get_engram
_http_get_to_file
_http_get_with_headers
_http_patch
_http_post
_http_post_engram
_http_post_form_auth
_http_post_json
_http_post_json_with_headers
_http_post_to_file
_http_post_with_headers
_http_response
_http_serve
_http_serve_v2
_http_set_handler
_http_set_handler_v2
_in_calendar
_instant_from_iso8601
_instant_to_iso8601
_instant_to_unix_millis
_instant_to_unix_seconds
_int_to_float
_int_to_str
_is_alphanumeric
_is_digit
_is_letter
_is_lowercase
_is_punctuation
_is_uppercase
_is_whitespace
_json_array_get
_json_array_get_string
_json_array_len
_json_array_push
_json_build_array
_json_build_object
_json_escape_string
_json_get
_json_get_bool
_json_get_float
_json_get_int
_json_get_raw
_json_get_string
_json_parse
_json_set
_json_stringify
_len
_list_get
_list_join
_list_len
_list_push
_list_push_front
_list_range
_llm_call
_llm_call_agentic
_llm_call_system
_llm_models
_llm_register_tool
_llm_vision
_local_date
_local_date_day
_local_date_month
_local_date_year
_local_datetime
_local_time
_local_time_hour
_local_time_minute
_local_time_nanos
_local_time_second
_log_info
_log_warn
_map_get
_map_set
_mars_calendar
_math_cos
_math_ln
_math_log
_math_pi
_math_sin
_math_sqrt
_native_int_to_str
_native_list_append
_native_list_clone
_native_list_empty
_native_list_get
_native_list_len
_native_str_to_int
_native_string_chars
_no_cycle_calendar
_now
_now_in
_now_millis
_now_ns
_parse_int
_pq_hybrid_handshake
_pq_hybrid_keygen
_pq_kem_decaps
_pq_kem_encaps
_pq_kem_keygen
_pq_keygen_signature
_pq_sign
_pq_verify
_print
_println
_readline
_relative_calendar
_rhythm_and
_rhythm_cycle_phase
_rhythm_cycle_start
_rhythm_duration
_rhythm_event
_rhythm_matches
_rhythm_next_after
_rhythm_or
_rhythm_session_start
_rhythm_weekday
_rhythm_weekly_at
_sha256_bytes
_sha256_hex
_sha3_256_hex
_sleep_ms
_sleep_secs
_state_del
_state_get
_state_get_or
_state_has
_state_keys
_state_set
_stdout_restore
_stdout_to_file
_str_char_at
_str_char_code
_str_concat
_str_contains
_str_count
_str_count_bytes
_str_count_chars
_str_count_digits
_str_count_letters
_str_count_lines
_str_count_words
_str_ends_with
_str_eq
_str_find_chars
_str_format
_str_index_of
_str_index_of_all
_str_join
_str_last_index_of
_str_len
_str_lower
_str_lstrip
_str_pad_left
_str_pad_right
_str_repeat
_str_replace
_str_reverse
_str_rstrip
_str_slice
_str_split
_str_split_chars
_str_split_lines
_str_split_n
_str_starts_with
_str_strip_chars
_str_strip_prefix
_str_strip_suffix
_str_to_bytes
_str_to_float
_str_to_int
_str_to_lower
_str_to_upper
_str_trim
_str_upper
_time_add
_time_diff
_time_format
_time_from_parts
_time_now
_time_now_ms
_time_now_utc
_time_to_parts
_ttl_cache_age
_ttl_cache_get
_ttl_cache_set
_unix_millis
_unix_seconds
_unix_timestamp
_unix_timestamp_ms
_url_decode
_url_encode
_uuid_new
_uuid_v4
_zone
_zone_local
_zone_offset
_zone_utc
_zoned
@@ -0,0 +1,340 @@
___channel_close
___channel_new
___channel_recv
___channel_send
___channel_try_recv
___http_do_map
___http_do_map_to_file
___print_raw
___read_n
_aead_decrypt
_aead_encrypt
_append
_args
_base64_decode
_base64_encode
_base64url_decode
_base64url_encode
_bool_to_str
_bytes_to_str
_cal_cycle_phase
_cal_format
_cal_in
_cal_to_instant
_config
_cycle_calendar
_decimal_round
_duration_millis
_duration_nanos
_duration_seconds
_duration_to_millis
_duration_to_nanos
_duration_to_seconds
_earth_calendar
_earth_calendar_default
_el_abs
_el_arena_pop
_el_arena_push
_el_base64_encode_n
_el_cgi_init
_el_duration_add
_el_duration_div
_el_duration_eq
_el_duration_from_nanos
_el_duration_ge
_el_duration_gt
_el_duration_le
_el_duration_lt
_el_duration_ne
_el_duration_scale
_el_duration_sub
_el_get_field
_el_html_sanitize
_el_instant_add_dur
_el_instant_diff
_el_instant_eq
_el_instant_ge
_el_instant_gt
_el_instant_le
_el_instant_lt
_el_instant_ne
_el_instant_sub_dur
_el_list_append
_el_list_clone
_el_list_empty
_el_list_get
_el_list_len
_el_list_new
_el_local_date_add_dur
_el_local_date_eq
_el_local_date_lt
_el_local_time_add_dur
_el_map_get
_el_map_new
_el_map_set
_el_max
_el_mem_check
_el_min
_el_now_instant
_el_release
_el_retain
_el_runtime_init_args
_el_runtime_register_handler
_el_runtime_register_handler_v2
_el_sha256_bytes_n
_el_sleep_duration
_el_str_concat
_engram_activate
_engram_activate_json
_engram_add_layer
_engram_apply_decay_json
_engram_compile_layered_json
_engram_connect
_engram_edge_between
_engram_edge_count
_engram_forget
_engram_get_node
_engram_get_node_json
_engram_list_layers
_engram_list_layers_json
_engram_load
_engram_neighbors
_engram_neighbors_filtered
_engram_neighbors_json
_engram_node
_engram_node_count
_engram_node_full
_engram_node_layered
_engram_query_range
_engram_remove_layer
_engram_save
_engram_scan_nodes
_engram_scan_nodes_by_type_json
_engram_scan_nodes_json
_engram_search
_engram_search_json
_engram_stats_json
_engram_strengthen
_env
_exec
_exec_bg
_exec_capture
_exec_command
_exit_program
_float_to_int
_float_to_str
_format_float
_fs_exists
_fs_list
_fs_list_json
_fs_mkdir
_fs_read
_fs_write
_fs_write_bytes
_get
_getpid_now
_hash_sha256
_hmac_sha256_bytes
_hmac_sha256_hex
_html_escape
_html_raw
_http_delete
_http_get
_http_get_engram
_http_get_to_file
_http_get_with_headers
_http_patch
_http_post
_http_post_engram
_http_post_form_auth
_http_post_json
_http_post_json_with_headers
_http_post_to_file
_http_post_with_headers
_http_response
_http_serve
_http_serve_v2
_http_set_handler
_http_set_handler_v2
_in_calendar
_instant_from_iso8601
_instant_to_iso8601
_instant_to_unix_millis
_instant_to_unix_seconds
_int_to_float
_int_to_str
_is_alphanumeric
_is_digit
_is_letter
_is_lowercase
_is_punctuation
_is_uppercase
_is_whitespace
_json_array_get
_json_array_get_string
_json_array_len
_json_array_push
_json_build_array
_json_build_object
_json_escape_string
_json_get
_json_get_bool
_json_get_float
_json_get_int
_json_get_raw
_json_get_string
_json_parse
_json_set
_json_stringify
_len
_list_get
_list_join
_list_len
_list_push
_list_push_front
_list_range
_llm_call
_llm_call_agentic
_llm_call_system
_llm_models
_llm_register_tool
_llm_vision
_local_date
_local_date_day
_local_date_month
_local_date_year
_local_datetime
_local_time
_local_time_hour
_local_time_minute
_local_time_nanos
_local_time_second
_log_info
_log_warn
_map_get
_map_set
_mars_calendar
_math_cos
_math_ln
_math_log
_math_pi
_math_sin
_math_sqrt
_native_int_to_str
_native_list_append
_native_list_clone
_native_list_empty
_native_list_get
_native_list_len
_native_str_to_int
_native_string_chars
_no_cycle_calendar
_now
_now_in
_now_millis
_now_ns
_parse_int
_pq_hybrid_handshake
_pq_hybrid_keygen
_pq_kem_decaps
_pq_kem_encaps
_pq_kem_keygen
_pq_keygen_signature
_pq_sign
_pq_verify
_print
_println
_readline
_relative_calendar
_rhythm_and
_rhythm_cycle_phase
_rhythm_cycle_start
_rhythm_duration
_rhythm_event
_rhythm_matches
_rhythm_next_after
_rhythm_or
_rhythm_session_start
_rhythm_weekday
_rhythm_weekly_at
_sha256_bytes
_sha256_hex
_sha3_256_hex
_sleep_ms
_sleep_secs
_state_del
_state_get
_state_get_or
_state_has
_state_keys
_state_set
_stdout_restore
_stdout_to_file
_str_char_at
_str_char_code
_str_concat
_str_contains
_str_count
_str_count_bytes
_str_count_chars
_str_count_digits
_str_count_letters
_str_count_lines
_str_count_words
_str_ends_with
_str_eq
_str_find_chars
_str_format
_str_index_of
_str_index_of_all
_str_join
_str_last_index_of
_str_len
_str_lower
_str_lstrip
_str_pad_left
_str_pad_right
_str_repeat
_str_replace
_str_reverse
_str_rstrip
_str_slice
_str_split
_str_split_chars
_str_split_lines
_str_split_n
_str_starts_with
_str_strip_chars
_str_strip_prefix
_str_strip_suffix
_str_to_bytes
_str_to_float
_str_to_int
_str_to_lower
_str_to_upper
_str_trim
_str_upper
_time_add
_time_diff
_time_format
_time_from_parts
_time_now
_time_now_ms
_time_now_utc
_time_to_parts
_ttl_cache_age
_ttl_cache_get
_ttl_cache_set
_unix_millis
_unix_seconds
_unix_timestamp
_unix_timestamp_ms
_url_decode
_url_encode
_uuid_new
_uuid_v4
_zone
_zone_local
_zone_offset
_zone_utc
_zoned
@@ -0,0 +1,137 @@
___args_json
___button_create
___cos_f
___engram_activate
___engram_activate_json
___engram_add_layer
___engram_compile_layered_json
___engram_connect
___engram_edge_between
___engram_edge_count
___engram_forget
___engram_get_node
___engram_get_node_json
___engram_list_layers
___engram_list_layers_json
___engram_load
___engram_neighbors
___engram_neighbors_filtered
___engram_neighbors_json
___engram_node
___engram_node_count
___engram_node_full
___engram_node_layered
___engram_remove_layer
___engram_save
___engram_scan_nodes
___engram_scan_nodes_by_type_json
___engram_scan_nodes_json
___engram_search
___engram_search_json
___engram_stats_json
___engram_strengthen
___env_get
___exec
___exec_bg
___exit_program
___float_to_str
___fs_exists
___fs_list_raw
___fs_mkdir
___fs_read
___fs_write
___fs_write_bytes
___hstack_create
___html_sanitize
___http_conn_fd
___http_do
___http_do_to_file
___http_response
___http_serve
___http_serve_v2
___http_sse_close
___http_sse_open
___http_sse_send
___image_create
___int_to_str
___json_array_get
___json_array_get_string
___json_array_len
___json_get
___json_get_bool
___json_get_float
___json_get_int
___json_get_raw
___json_get_string
___json_parse
___json_parse_map
___json_set
___json_stringify
___json_stringify_val
___label_create
___ln_f
___log_f
___manifest_read
___mutex_lock
___mutex_new
___mutex_unlock
___native_init
___native_run_loop
___pi_f
___print
___println
___readline
___scroll_create
___sha256_hex
___sin_f
___sleep_ms
___sqrt_f
___state_del
___state_get
___state_keys
___state_set
___str_alloc
___str_char_at
___str_cmp
___str_concat_raw
___str_len
___str_ncmp
___str_set_char
___str_slice_raw
___str_to_float
___str_to_int
___text_area_create
___text_field_create
___thread_create
___thread_join
___time_now_ns
___url_decode
___url_encode
___uuid_v4
___vstack_create
___widget_add_child
___widget_destroy
___widget_get_text
___widget_on_change
___widget_on_click
___widget_on_submit
___widget_remove_child
___widget_set_bg_color
___widget_set_color
___widget_set_corner_radius
___widget_set_disabled
___widget_set_flex
___widget_set_font
___widget_set_height
___widget_set_hidden
___widget_set_padding
___widget_set_text
___widget_set_width
___window_create
___window_set_title
___window_show
___zstack_create
_el_request_end
_el_request_start
_el_seed_init_args
_el_seed_set_http_conn_fd
@@ -0,0 +1,55 @@
_button
_color_hex_a
_color_hex_b
_color_hex_g
_color_hex_r
_hex_channel
_hex_nibble
_hstack
_image
_label
_manifest_height
_manifest_min_height
_manifest_min_width
_manifest_read
_manifest_title
_manifest_width
_native_init
_native_run_loop
_scroll
_style_button_primary
_style_label_body
_style_label_heading
_style_label_muted
_style_surface
_text_area
_text_field
_vstack
_vstack_tight
_widget_add_child
_widget_destroy
_widget_get_text
_widget_on_change
_widget_on_click
_widget_on_submit
_widget_remove_child
_widget_set_bg_color
_widget_set_bg_color_hex
_widget_set_color
_widget_set_color_hex
_widget_set_corner_radius
_widget_set_disabled
_widget_set_flex
_widget_set_font
_widget_set_height
_widget_set_hidden
_widget_set_padding
_widget_set_padding_all
_widget_set_padding_xy
_widget_set_text
_widget_set_width
_window_create
_window_from_manifest
_window_set_title
_window_show
_zstack
Binary file not shown.
@@ -0,0 +1,459 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t native_init(void);
el_val_t native_run_loop(void);
el_val_t manifest_read(el_val_t path);
el_val_t manifest_title(el_val_t m);
el_val_t manifest_width(el_val_t m);
el_val_t manifest_height(el_val_t m);
el_val_t manifest_min_width(el_val_t m);
el_val_t manifest_min_height(el_val_t m);
el_val_t window_create(el_val_t title, el_val_t width, el_val_t height, el_val_t min_width, el_val_t min_height);
el_val_t window_from_manifest(el_val_t manifest_path);
el_val_t window_show(el_val_t handle);
el_val_t window_set_title(el_val_t handle, el_val_t title);
el_val_t vstack(el_val_t spacing);
el_val_t vstack_tight(void);
el_val_t hstack(el_val_t spacing);
el_val_t zstack(void);
el_val_t scroll(void);
el_val_t label(el_val_t text);
el_val_t button(el_val_t label);
el_val_t text_field(el_val_t placeholder);
el_val_t text_area(el_val_t placeholder);
el_val_t image(el_val_t path_or_name);
el_val_t widget_set_text(el_val_t handle, el_val_t text);
el_val_t widget_get_text(el_val_t handle);
el_val_t widget_set_color(el_val_t handle, el_val_t r, el_val_t g, el_val_t b, el_val_t a);
el_val_t widget_set_bg_color(el_val_t handle, el_val_t r, el_val_t g, el_val_t b, el_val_t a);
el_val_t widget_set_font(el_val_t handle, el_val_t family, el_val_t size, el_val_t bold);
el_val_t widget_set_padding(el_val_t handle, el_val_t top, el_val_t right, el_val_t bottom, el_val_t left);
el_val_t widget_set_padding_all(el_val_t handle, el_val_t p);
el_val_t widget_set_padding_xy(el_val_t handle, el_val_t px, el_val_t py);
el_val_t widget_set_width(el_val_t handle, el_val_t width);
el_val_t widget_set_height(el_val_t handle, el_val_t height);
el_val_t widget_set_flex(el_val_t handle, el_val_t flex);
el_val_t widget_set_corner_radius(el_val_t handle, el_val_t radius);
el_val_t widget_set_disabled(el_val_t handle, el_val_t disabled);
el_val_t widget_set_hidden(el_val_t handle, el_val_t hidden);
el_val_t widget_add_child(el_val_t parent, el_val_t child);
el_val_t widget_remove_child(el_val_t parent, el_val_t child);
el_val_t widget_destroy(el_val_t handle);
el_val_t widget_on_click(el_val_t handle, el_val_t fn_name);
el_val_t widget_on_change(el_val_t handle, el_val_t fn_name);
el_val_t widget_on_submit(el_val_t handle, el_val_t fn_name);
el_val_t hex_channel(el_val_t s, el_val_t offset);
el_val_t hex_nibble(el_val_t c);
el_val_t color_hex_r(el_val_t hex);
el_val_t color_hex_g(el_val_t hex);
el_val_t color_hex_b(el_val_t hex);
el_val_t color_hex_a(el_val_t hex);
el_val_t widget_set_color_hex(el_val_t handle, el_val_t hex);
el_val_t widget_set_bg_color_hex(el_val_t handle, el_val_t hex);
el_val_t style_surface(el_val_t handle);
el_val_t style_button_primary(el_val_t handle);
el_val_t style_label_body(el_val_t handle);
el_val_t style_label_heading(el_val_t handle);
el_val_t style_label_muted(el_val_t handle);
el_val_t TOKEN_PRIMARY;
el_val_t TOKEN_ON_PRIMARY;
el_val_t TOKEN_BACKGROUND;
el_val_t TOKEN_ON_BG;
el_val_t TOKEN_SURFACE;
el_val_t TOKEN_ON_SURFACE;
el_val_t TOKEN_OUTLINE;
el_val_t TOKEN_ERROR;
el_val_t native_init(void) {
__native_init();
return 0;
}
el_val_t native_run_loop(void) {
__native_run_loop();
return 0;
}
el_val_t manifest_read(el_val_t path) {
return __manifest_read(path);
return 0;
}
el_val_t manifest_title(el_val_t m) {
return json_get_string(m, EL_STR("title"));
return 0;
}
el_val_t manifest_width(el_val_t m) {
return json_get_int(m, EL_STR("width"));
return 0;
}
el_val_t manifest_height(el_val_t m) {
return json_get_int(m, EL_STR("height"));
return 0;
}
el_val_t manifest_min_width(el_val_t m) {
return json_get_int(m, EL_STR("min_width"));
return 0;
}
el_val_t manifest_min_height(el_val_t m) {
return json_get_int(m, EL_STR("min_height"));
return 0;
}
el_val_t window_create(el_val_t title, el_val_t width, el_val_t height, el_val_t min_width, el_val_t min_height) {
return __window_create(title, width, height, min_width, min_height);
return 0;
}
el_val_t window_from_manifest(el_val_t manifest_path) {
el_val_t m = manifest_read(manifest_path);
el_val_t title = manifest_title(m);
el_val_t w = manifest_width(m);
el_val_t h = manifest_height(m);
el_val_t mw = manifest_min_width(m);
el_val_t mh = manifest_min_height(m);
el_val_t safe_w = ({ el_val_t _if_result_1 = 0; if ((w > 0)) { _if_result_1 = (w); } else { _if_result_1 = (1200); } _if_result_1; });
el_val_t safe_h = ({ el_val_t _if_result_2 = 0; if ((h > 0)) { _if_result_2 = (h); } else { _if_result_2 = (800); } _if_result_2; });
el_val_t safe_mw = ({ el_val_t _if_result_3 = 0; if ((mw > 0)) { _if_result_3 = (mw); } else { _if_result_3 = (600); } _if_result_3; });
el_val_t safe_mh = ({ el_val_t _if_result_4 = 0; if ((mh > 0)) { _if_result_4 = (mh); } else { _if_result_4 = (400); } _if_result_4; });
el_val_t safe_t = ({ el_val_t _if_result_5 = 0; if ((str_len(title) > 0)) { _if_result_5 = (title); } else { _if_result_5 = (EL_STR("App")); } _if_result_5; });
return window_create(safe_t, safe_w, safe_h, safe_mw, safe_mh);
return 0;
}
el_val_t window_show(el_val_t handle) {
__window_show(handle);
return 0;
}
el_val_t window_set_title(el_val_t handle, el_val_t title) {
__window_set_title(handle, title);
return 0;
}
el_val_t vstack(el_val_t spacing) {
return __vstack_create(spacing);
return 0;
}
el_val_t vstack_tight(void) {
return __vstack_create(0);
return 0;
}
el_val_t hstack(el_val_t spacing) {
return __hstack_create(spacing);
return 0;
}
el_val_t zstack(void) {
return __zstack_create();
return 0;
}
el_val_t scroll(void) {
return __scroll_create();
return 0;
}
el_val_t label(el_val_t text) {
return __label_create(text);
return 0;
}
el_val_t button(el_val_t label) {
return __button_create(label);
return 0;
}
el_val_t text_field(el_val_t placeholder) {
return __text_field_create(placeholder);
return 0;
}
el_val_t text_area(el_val_t placeholder) {
return __text_area_create(placeholder);
return 0;
}
el_val_t image(el_val_t path_or_name) {
return __image_create(path_or_name);
return 0;
}
el_val_t widget_set_text(el_val_t handle, el_val_t text) {
__widget_set_text(handle, text);
return 0;
}
el_val_t widget_get_text(el_val_t handle) {
return __widget_get_text(handle);
return 0;
}
el_val_t widget_set_color(el_val_t handle, el_val_t r, el_val_t g, el_val_t b, el_val_t a) {
__widget_set_color(handle, r, g, b, a);
return 0;
}
el_val_t widget_set_bg_color(el_val_t handle, el_val_t r, el_val_t g, el_val_t b, el_val_t a) {
__widget_set_bg_color(handle, r, g, b, a);
return 0;
}
el_val_t widget_set_font(el_val_t handle, el_val_t family, el_val_t size, el_val_t bold) {
el_val_t bold_int = ({ el_val_t _if_result_6 = 0; if (bold) { _if_result_6 = (1); } else { _if_result_6 = (0); } _if_result_6; });
__widget_set_font(handle, family, size, bold_int);
return 0;
}
el_val_t widget_set_padding(el_val_t handle, el_val_t top, el_val_t right, el_val_t bottom, el_val_t left) {
__widget_set_padding(handle, top, right, bottom, left);
return 0;
}
el_val_t widget_set_padding_all(el_val_t handle, el_val_t p) {
__widget_set_padding(handle, p, p, p, p);
return 0;
}
el_val_t widget_set_padding_xy(el_val_t handle, el_val_t px, el_val_t py) {
__widget_set_padding(handle, py, px, py, px);
return 0;
}
el_val_t widget_set_width(el_val_t handle, el_val_t width) {
__widget_set_width(handle, width);
return 0;
}
el_val_t widget_set_height(el_val_t handle, el_val_t height) {
__widget_set_height(handle, height);
return 0;
}
el_val_t widget_set_flex(el_val_t handle, el_val_t flex) {
__widget_set_flex(handle, flex);
return 0;
}
el_val_t widget_set_corner_radius(el_val_t handle, el_val_t radius) {
__widget_set_corner_radius(handle, radius);
return 0;
}
el_val_t widget_set_disabled(el_val_t handle, el_val_t disabled) {
el_val_t d = ({ el_val_t _if_result_7 = 0; if (disabled) { _if_result_7 = (1); } else { _if_result_7 = (0); } _if_result_7; });
__widget_set_disabled(handle, d);
return 0;
}
el_val_t widget_set_hidden(el_val_t handle, el_val_t hidden) {
el_val_t h = ({ el_val_t _if_result_8 = 0; if (hidden) { _if_result_8 = (1); } else { _if_result_8 = (0); } _if_result_8; });
__widget_set_hidden(handle, h);
return 0;
}
el_val_t widget_add_child(el_val_t parent, el_val_t child) {
__widget_add_child(parent, child);
return 0;
}
el_val_t widget_remove_child(el_val_t parent, el_val_t child) {
__widget_remove_child(parent, child);
return 0;
}
el_val_t widget_destroy(el_val_t handle) {
__widget_destroy(handle);
return 0;
}
el_val_t widget_on_click(el_val_t handle, el_val_t fn_name) {
__widget_on_click(handle, fn_name);
return 0;
}
el_val_t widget_on_change(el_val_t handle, el_val_t fn_name) {
__widget_on_change(handle, fn_name);
return 0;
}
el_val_t widget_on_submit(el_val_t handle, el_val_t fn_name) {
__widget_on_submit(handle, fn_name);
return 0;
}
el_val_t hex_channel(el_val_t s, el_val_t offset) {
el_val_t hi = str_slice(s, offset, (offset + 1));
el_val_t lo = str_slice(s, (offset + 1), (offset + 2));
el_val_t h = hex_nibble(hi);
el_val_t l = hex_nibble(lo);
return ((h * 16) + l);
return 0;
}
el_val_t hex_nibble(el_val_t c) {
if (str_eq(c, EL_STR("0"))) {
return 0;
}
if (str_eq(c, EL_STR("1"))) {
return 1;
}
if (str_eq(c, EL_STR("2"))) {
return 2;
}
if (str_eq(c, EL_STR("3"))) {
return 3;
}
if (str_eq(c, EL_STR("4"))) {
return 4;
}
if (str_eq(c, EL_STR("5"))) {
return 5;
}
if (str_eq(c, EL_STR("6"))) {
return 6;
}
if (str_eq(c, EL_STR("7"))) {
return 7;
}
if (str_eq(c, EL_STR("8"))) {
return 8;
}
if (str_eq(c, EL_STR("9"))) {
return 9;
}
if (str_eq(c, EL_STR("a"))) {
return 10;
}
if (str_eq(c, EL_STR("b"))) {
return 11;
}
if (str_eq(c, EL_STR("c"))) {
return 12;
}
if (str_eq(c, EL_STR("d"))) {
return 13;
}
if (str_eq(c, EL_STR("e"))) {
return 14;
}
if (str_eq(c, EL_STR("f"))) {
return 15;
}
if (str_eq(c, EL_STR("A"))) {
return 10;
}
if (str_eq(c, EL_STR("B"))) {
return 11;
}
if (str_eq(c, EL_STR("C"))) {
return 12;
}
if (str_eq(c, EL_STR("D"))) {
return 13;
}
if (str_eq(c, EL_STR("E"))) {
return 14;
}
if (str_eq(c, EL_STR("F"))) {
return 15;
}
return 0;
return 0;
}
el_val_t color_hex_r(el_val_t hex) {
el_val_t s = ({ el_val_t _if_result_9 = 0; if (str_starts_with(hex, EL_STR("#"))) { _if_result_9 = (str_slice(hex, 1, str_len(hex))); } else { _if_result_9 = (hex); } _if_result_9; });
el_val_t v = hex_channel(s, 0);
return float_div(int_to_float(v), el_from_float(255.0));
return 0;
}
el_val_t color_hex_g(el_val_t hex) {
el_val_t s = ({ el_val_t _if_result_10 = 0; if (str_starts_with(hex, EL_STR("#"))) { _if_result_10 = (str_slice(hex, 1, str_len(hex))); } else { _if_result_10 = (hex); } _if_result_10; });
el_val_t v = hex_channel(s, 2);
return float_div(int_to_float(v), el_from_float(255.0));
return 0;
}
el_val_t color_hex_b(el_val_t hex) {
el_val_t s = ({ el_val_t _if_result_11 = 0; if (str_starts_with(hex, EL_STR("#"))) { _if_result_11 = (str_slice(hex, 1, str_len(hex))); } else { _if_result_11 = (hex); } _if_result_11; });
el_val_t v = hex_channel(s, 4);
return float_div(int_to_float(v), el_from_float(255.0));
return 0;
}
el_val_t color_hex_a(el_val_t hex) {
el_val_t s = ({ el_val_t _if_result_12 = 0; if (str_starts_with(hex, EL_STR("#"))) { _if_result_12 = (str_slice(hex, 1, str_len(hex))); } else { _if_result_12 = (hex); } _if_result_12; });
if (str_len(s) < 8) {
return el_from_float(1.0);
}
el_val_t v = hex_channel(s, 6);
return float_div(int_to_float(v), el_from_float(255.0));
return 0;
}
el_val_t widget_set_color_hex(el_val_t handle, el_val_t hex) {
widget_set_color(handle, color_hex_r(hex), color_hex_g(hex), color_hex_b(hex), color_hex_a(hex));
return 0;
}
el_val_t widget_set_bg_color_hex(el_val_t handle, el_val_t hex) {
widget_set_bg_color(handle, color_hex_r(hex), color_hex_g(hex), color_hex_b(hex), color_hex_a(hex));
return 0;
}
el_val_t style_surface(el_val_t handle) {
widget_set_bg_color_hex(handle, TOKEN_SURFACE);
widget_set_corner_radius(handle, 8);
return 0;
}
el_val_t style_button_primary(el_val_t handle) {
widget_set_bg_color_hex(handle, TOKEN_PRIMARY);
widget_set_color_hex(handle, TOKEN_ON_PRIMARY);
widget_set_corner_radius(handle, 8);
widget_set_padding_xy(handle, 16, 8);
return 0;
}
el_val_t style_label_body(el_val_t handle) {
widget_set_color_hex(handle, TOKEN_ON_BG);
widget_set_font(handle, EL_STR("system"), 14, 0);
return 0;
}
el_val_t style_label_heading(el_val_t handle) {
widget_set_color_hex(handle, TOKEN_ON_BG);
widget_set_font(handle, EL_STR("system"), 20, 1);
return 0;
}
el_val_t style_label_muted(el_val_t handle) {
widget_set_color_hex(handle, TOKEN_OUTLINE);
widget_set_font(handle, EL_STR("system"), 12, 0);
return 0;
}
int main(int _argc, char** _argv) {
el_runtime_init_args(_argc, _argv);
TOKEN_PRIMARY = EL_STR("#60a5fa");
TOKEN_ON_PRIMARY = EL_STR("#0f172a");
TOKEN_BACKGROUND = EL_STR("#0f172a");
TOKEN_ON_BG = EL_STR("#f8fafc");
TOKEN_SURFACE = EL_STR("#1e293b");
TOKEN_ON_SURFACE = EL_STR("#f8fafc");
TOKEN_OUTLINE = EL_STR("#475569");
TOKEN_ERROR = EL_STR("#f87171");
return 0;
}
@@ -0,0 +1,69 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t native_init(void);
el_val_t native_run_loop(void);
el_val_t manifest_read(el_val_t path);
el_val_t manifest_title(el_val_t m);
el_val_t manifest_width(el_val_t m);
el_val_t manifest_height(el_val_t m);
el_val_t manifest_min_width(el_val_t m);
el_val_t manifest_min_height(el_val_t m);
el_val_t window_create(el_val_t title, el_val_t width, el_val_t height, el_val_t min_width, el_val_t min_height);
el_val_t window_from_manifest(el_val_t manifest_path);
el_val_t window_show(el_val_t handle);
el_val_t window_set_title(el_val_t handle, el_val_t title);
el_val_t vstack(el_val_t spacing);
el_val_t vstack_tight(void);
el_val_t hstack(el_val_t spacing);
el_val_t zstack(void);
el_val_t scroll(void);
el_val_t label(el_val_t text);
el_val_t button(el_val_t label);
el_val_t text_field(el_val_t placeholder);
el_val_t text_area(el_val_t placeholder);
el_val_t image(el_val_t path_or_name);
el_val_t widget_set_text(el_val_t handle, el_val_t text);
el_val_t widget_get_text(el_val_t handle);
el_val_t widget_set_color(el_val_t handle, el_val_t r, el_val_t g, el_val_t b, el_val_t a);
el_val_t widget_set_bg_color(el_val_t handle, el_val_t r, el_val_t g, el_val_t b, el_val_t a);
el_val_t widget_set_font(el_val_t handle, el_val_t family, el_val_t size, el_val_t bold);
el_val_t widget_set_padding(el_val_t handle, el_val_t top, el_val_t right, el_val_t bottom, el_val_t left);
el_val_t widget_set_padding_all(el_val_t handle, el_val_t p);
el_val_t widget_set_padding_xy(el_val_t handle, el_val_t px, el_val_t py);
el_val_t widget_set_width(el_val_t handle, el_val_t width);
el_val_t widget_set_height(el_val_t handle, el_val_t height);
el_val_t widget_set_flex(el_val_t handle, el_val_t flex);
el_val_t widget_set_corner_radius(el_val_t handle, el_val_t radius);
el_val_t widget_set_disabled(el_val_t handle, el_val_t disabled);
el_val_t widget_set_hidden(el_val_t handle, el_val_t hidden);
el_val_t widget_add_child(el_val_t parent, el_val_t child);
el_val_t widget_remove_child(el_val_t parent, el_val_t child);
el_val_t widget_destroy(el_val_t handle);
el_val_t widget_on_click(el_val_t handle, el_val_t fn_name);
el_val_t widget_on_change(el_val_t handle, el_val_t fn_name);
el_val_t widget_on_submit(el_val_t handle, el_val_t fn_name);
el_val_t hex_channel(el_val_t s, el_val_t offset);
el_val_t hex_nibble(el_val_t c);
el_val_t color_hex_r(el_val_t hex);
el_val_t color_hex_g(el_val_t hex);
el_val_t color_hex_b(el_val_t hex);
el_val_t color_hex_a(el_val_t hex);
el_val_t widget_set_color_hex(el_val_t handle, el_val_t hex);
el_val_t widget_set_bg_color_hex(el_val_t handle, el_val_t hex);
el_val_t style_surface(el_val_t handle);
el_val_t style_button_primary(el_val_t handle);
el_val_t style_label_body(el_val_t handle);
el_val_t style_label_heading(el_val_t handle);
el_val_t style_label_muted(el_val_t handle);
el_val_t TOKEN_PRIMARY;
el_val_t TOKEN_ON_PRIMARY;
el_val_t TOKEN_BACKGROUND;
el_val_t TOKEN_ON_BG;
el_val_t TOKEN_SURFACE;
el_val_t TOKEN_ON_SURFACE;
el_val_t TOKEN_OUTLINE;
el_val_t TOKEN_ERROR;
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,123 @@
#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t on_greet_click(el_val_t widget, el_val_t data);
el_val_t on_counter_click(el_val_t widget, el_val_t data);
el_val_t on_name_change(el_val_t widget, el_val_t data);
el_val_t app_build(el_val_t window);
el_val_t g_window;
el_val_t g_label;
el_val_t g_input;
el_val_t g_button;
el_val_t g_counter;
el_val_t g_counter_lbl;
el_val_t manifest_env;
el_val_t manifest_path;
el_val_t win;
el_val_t g_window;
el_val_t on_greet_click(el_val_t widget, el_val_t data) {
el_val_t name = widget_get_text(g_input);
el_val_t greeting = ({ el_val_t _if_result_1 = 0; if ((str_len(name) > 0)) { _if_result_1 = (el_str_concat(el_str_concat(EL_STR("Hello, "), name), EL_STR("!"))); } else { _if_result_1 = (EL_STR("Hello, World!")); } _if_result_1; });
widget_set_text(g_label, greeting);
return 0;
}
el_val_t on_counter_click(el_val_t widget, el_val_t data) {
el_val_t g_counter = (g_counter + 1);
widget_set_text(g_counter_lbl, el_str_concat(EL_STR("Clicks: "), int_to_str(g_counter)));
return 0;
}
el_val_t on_name_change(el_val_t widget, el_val_t data) {
el_val_t has_text = (str_len(data) > 0);
widget_set_disabled(g_button, !has_text);
return 0;
}
el_val_t app_build(el_val_t window) {
el_val_t root = vstack(0);
widget_set_padding_all(root, 24);
widget_set_bg_color_hex(root, EL_STR("#0f172a"));
widget_set_flex(root, 1);
el_val_t title = label(EL_STR("el-native \xe2\x80\x94 native widget demo"));
style_label_heading(title);
widget_add_child(root, title);
el_val_t gap1 = label(EL_STR(""));
widget_set_height(gap1, 16);
widget_add_child(root, gap1);
el_val_t subtitle = label(EL_STR("AppKit controls from el code, no ObjC in the app layer."));
style_label_muted(subtitle);
widget_add_child(root, subtitle);
el_val_t gap2 = label(EL_STR(""));
widget_set_height(gap2, 24);
widget_add_child(root, gap2);
el_val_t input_row = hstack(8);
el_val_t name_label = label(EL_STR("Name:"));
style_label_body(name_label);
widget_set_width(name_label, 60);
el_val_t input = text_field(EL_STR("Enter your name\xe2\x80\xa6"));
style_label_body(input);
widget_set_flex(input, 1);
widget_on_change(input, EL_STR("on_name_change"));
el_val_t g_input = input;
el_val_t greet_btn = button(EL_STR("Greet"));
style_button_primary(greet_btn);
widget_set_disabled(greet_btn, 1);
widget_on_click(greet_btn, EL_STR("on_greet_click"));
el_val_t g_button = greet_btn;
widget_add_child(input_row, name_label);
widget_add_child(input_row, input);
widget_add_child(input_row, greet_btn);
widget_add_child(root, input_row);
el_val_t gap3 = label(EL_STR(""));
widget_set_height(gap3, 12);
widget_add_child(root, gap3);
el_val_t greeting = label(EL_STR("Waiting for name\xe2\x80\xa6"));
style_label_body(greeting);
widget_set_color_hex(greeting, EL_STR("#60a5fa"));
widget_set_font(greeting, EL_STR("system"), 16, 1);
el_val_t g_label = greeting;
widget_add_child(root, greeting);
el_val_t gap4 = label(EL_STR(""));
widget_set_height(gap4, 24);
widget_add_child(root, gap4);
el_val_t counter_row = hstack(12);
el_val_t counter_lbl = label(EL_STR("Clicks: 0"));
style_label_body(counter_lbl);
el_val_t g_counter_lbl = counter_lbl;
el_val_t counter_btn = button(EL_STR("Click me"));
style_button_primary(counter_btn);
widget_on_click(counter_btn, EL_STR("on_counter_click"));
widget_add_child(counter_row, counter_lbl);
widget_add_child(counter_row, counter_btn);
widget_add_child(root, counter_row);
widget_add_child(window, root);
return 0;
}
int main(int _argc, char** _argv) {
el_runtime_init_args(_argc, _argv);
g_window = (-1);
g_label = (-1);
g_input = (-1);
g_button = (-1);
g_counter = 0;
g_counter_lbl = (-1);
native_init();
manifest_env = env(EL_STR("EL_MANIFEST"));
manifest_path = ({ el_val_t _if_result_2 = 0; if ((str_len(manifest_env) > 0)) { _if_result_2 = (manifest_env); } else { _if_result_2 = (EL_STR("manifest.el")); } _if_result_2; });
win = window_from_manifest(manifest_path);
g_window = win;
if (win < 0) {
println(EL_STR("Error: failed to create window. Is EL_TARGET_MACOS defined?"));
exit_program(1);
}
app_build(win);
window_show(win);
native_run_loop();
return 0;
}
Binary file not shown.