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
+397
View File
@@ -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
+340
View File
@@ -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
+137
View File
@@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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.