From a1207538474474bbba832a245aa30c39a6c83591 Mon Sep 17 00:00:00 2001 From: femsci Date: Fri, 17 Nov 2023 18:59:49 +0100 Subject: [PATCH] spookie skel & premise --- .editorconfig | 364 ++++++++++++++++++ .gitignore | 4 + Cargo.lock | 169 ++++++++ Cargo.toml | 2 + Nyanlabs.Umogen.sln | 50 +++ README.md | 28 ++ build.sh | 5 + global.json | 5 + .../Nyanlabs.Umogen.Core.csproj | 9 + src/Nyanlabs.Umogen.Server/App.razor | 12 + .../Data/WeatherForecast.cs | 12 + .../Data/WeatherForecastService.cs | 19 + .../Nyanlabs.Umogen.Server.csproj | 13 + src/Nyanlabs.Umogen.Server/Pages/Error.cshtml | 42 ++ .../Pages/Error.cshtml.cs | 26 ++ src/Nyanlabs.Umogen.Server/Pages/Index.razor | 5 + src/Nyanlabs.Umogen.Server/Pages/_Host.cshtml | 36 ++ src/Nyanlabs.Umogen.Server/Program.cs | 30 ++ .../Properties/launchSettings.json | 37 ++ .../Shared/MainLayout.razor | 11 + .../Shared/MainLayout.razor.css | 73 ++++ src/Nyanlabs.Umogen.Server/_Imports.razor | 10 + .../appsettings.Development.json | 9 + src/Nyanlabs.Umogen.Server/appsettings.json | 9 + .../wwwroot/css/site.css | 74 ++++ .../wwwroot/favicon.ico | Bin 0 -> 51262 bytes .../Nyanlabs.Umogen.CoreTests/GlobalUsings.cs | 1 + .../Nyanlabs.Umogen.CoreTests.csproj | 29 ++ test/Nyanlabs.Umogen.WebTests/GlobalUsings.cs | 1 + .../Nyanlabs.Umogen.WebTests.csproj | 30 ++ 30 files changed, 1115 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 Nyanlabs.Umogen.sln create mode 100644 README.md create mode 100755 build.sh create mode 100644 global.json create mode 100644 src/Nyanlabs.Umogen.Core/Nyanlabs.Umogen.Core.csproj create mode 100644 src/Nyanlabs.Umogen.Server/App.razor create mode 100644 src/Nyanlabs.Umogen.Server/Data/WeatherForecast.cs create mode 100644 src/Nyanlabs.Umogen.Server/Data/WeatherForecastService.cs create mode 100644 src/Nyanlabs.Umogen.Server/Nyanlabs.Umogen.Server.csproj create mode 100644 src/Nyanlabs.Umogen.Server/Pages/Error.cshtml create mode 100644 src/Nyanlabs.Umogen.Server/Pages/Error.cshtml.cs create mode 100644 src/Nyanlabs.Umogen.Server/Pages/Index.razor create mode 100644 src/Nyanlabs.Umogen.Server/Pages/_Host.cshtml create mode 100644 src/Nyanlabs.Umogen.Server/Program.cs create mode 100644 src/Nyanlabs.Umogen.Server/Properties/launchSettings.json create mode 100644 src/Nyanlabs.Umogen.Server/Shared/MainLayout.razor create mode 100644 src/Nyanlabs.Umogen.Server/Shared/MainLayout.razor.css create mode 100644 src/Nyanlabs.Umogen.Server/_Imports.razor create mode 100644 src/Nyanlabs.Umogen.Server/appsettings.Development.json create mode 100644 src/Nyanlabs.Umogen.Server/appsettings.json create mode 100644 src/Nyanlabs.Umogen.Server/wwwroot/css/site.css create mode 100644 src/Nyanlabs.Umogen.Server/wwwroot/favicon.ico create mode 100644 test/Nyanlabs.Umogen.CoreTests/GlobalUsings.cs create mode 100644 test/Nyanlabs.Umogen.CoreTests/Nyanlabs.Umogen.CoreTests.csproj create mode 100644 test/Nyanlabs.Umogen.WebTests/GlobalUsings.cs create mode 100644 test/Nyanlabs.Umogen.WebTests/Nyanlabs.Umogen.WebTests.csproj diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4a9952c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,364 @@ +root = true + +# All files +[*] +indent_style = space + +# Xml files +[*.xml] +indent_size = 2 + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +tab_width = 4 + +# New line preferences +end_of_line = crlf +insert_final_newline = false + +#### .NET Coding Conventions #### +[*.{cs,vb}] + +# Organize usings +dotnet_separate_import_directive_groups = true +dotnet_sort_system_directives_first = true +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_property = false:silent + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +# Expression-level preferences +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion + +# Field preferences +dotnet_style_readonly_field = true:warning + +# Parameter preferences +dotnet_code_quality_unused_parameters = all:suggestion + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +#### C# Coding Conventions #### +[*.cs] + +# var preferences +csharp_style_var_elsewhere = false:silent +csharp_style_var_for_built_in_types = false:silent +csharp_style_var_when_type_is_apparent = false:silent + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:suggestion +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_prefer_not_pattern = true:suggestion +csharp_style_prefer_pattern_matching = true:silent +csharp_style_prefer_switch_expression = true:suggestion + +# Null-checking preferences +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_prefer_static_local_function = true:warning +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent + +# Code-block preferences +csharp_prefer_braces = true:silent +csharp_prefer_simple_using_statement = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:silent + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Naming styles #### +[*.{cs,vb}] + +# Naming rules + +dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.symbols = types_and_namespaces +dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.interfaces_should_be_ipascalcase.severity = suggestion +dotnet_naming_rule.interfaces_should_be_ipascalcase.symbols = interfaces +dotnet_naming_rule.interfaces_should_be_ipascalcase.style = ipascalcase + +dotnet_naming_rule.type_parameters_should_be_tpascalcase.severity = suggestion +dotnet_naming_rule.type_parameters_should_be_tpascalcase.symbols = type_parameters +dotnet_naming_rule.type_parameters_should_be_tpascalcase.style = tpascalcase + +dotnet_naming_rule.methods_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.methods_should_be_pascalcase.symbols = methods +dotnet_naming_rule.methods_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.properties_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.properties_should_be_pascalcase.symbols = properties +dotnet_naming_rule.properties_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.events_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.events_should_be_pascalcase.symbols = events +dotnet_naming_rule.events_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.local_variables_should_be_camelcase.severity = suggestion +dotnet_naming_rule.local_variables_should_be_camelcase.symbols = local_variables +dotnet_naming_rule.local_variables_should_be_camelcase.style = camelcase + +dotnet_naming_rule.local_constants_should_be_camelcase.severity = suggestion +dotnet_naming_rule.local_constants_should_be_camelcase.symbols = local_constants +dotnet_naming_rule.local_constants_should_be_camelcase.style = camelcase + +dotnet_naming_rule.parameters_should_be_camelcase.severity = suggestion +dotnet_naming_rule.parameters_should_be_camelcase.symbols = parameters +dotnet_naming_rule.parameters_should_be_camelcase.style = camelcase + +dotnet_naming_rule.public_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.public_fields_should_be_pascalcase.symbols = public_fields +dotnet_naming_rule.public_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.private_fields_should_be__camelcase.severity = suggestion +dotnet_naming_rule.private_fields_should_be__camelcase.symbols = private_fields +dotnet_naming_rule.private_fields_should_be__camelcase.style = _camelcase + +dotnet_naming_rule.private_static_fields_should_be_s_camelcase.severity = suggestion +dotnet_naming_rule.private_static_fields_should_be_s_camelcase.symbols = private_static_fields +dotnet_naming_rule.private_static_fields_should_be_s_camelcase.style = s_camelcase + +dotnet_naming_rule.public_constant_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.public_constant_fields_should_be_pascalcase.symbols = public_constant_fields +dotnet_naming_rule.public_constant_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.private_constant_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.private_constant_fields_should_be_pascalcase.symbols = private_constant_fields +dotnet_naming_rule.private_constant_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.symbols = public_static_readonly_fields +dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.symbols = private_static_readonly_fields +dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.enums_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.enums_should_be_pascalcase.symbols = enums +dotnet_naming_rule.enums_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.local_functions_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.local_functions_should_be_pascalcase.symbols = local_functions +dotnet_naming_rule.local_functions_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.non_field_members_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascalcase.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascalcase.style = pascalcase + +# Symbol specifications + +dotnet_naming_symbols.interfaces.applicable_kinds = interface +dotnet_naming_symbols.interfaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interfaces.required_modifiers = + +dotnet_naming_symbols.enums.applicable_kinds = enum +dotnet_naming_symbols.enums.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.enums.required_modifiers = + +dotnet_naming_symbols.events.applicable_kinds = event +dotnet_naming_symbols.events.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.events.required_modifiers = + +dotnet_naming_symbols.methods.applicable_kinds = method +dotnet_naming_symbols.methods.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.methods.required_modifiers = + +dotnet_naming_symbols.properties.applicable_kinds = property +dotnet_naming_symbols.properties.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.properties.required_modifiers = + +dotnet_naming_symbols.public_fields.applicable_kinds = field +dotnet_naming_symbols.public_fields.applicable_accessibilities = public, internal +dotnet_naming_symbols.public_fields.required_modifiers = + +dotnet_naming_symbols.private_fields.applicable_kinds = field +dotnet_naming_symbols.private_fields.applicable_accessibilities = private, protected, protected_internal, private_protected +dotnet_naming_symbols.private_fields.required_modifiers = + +dotnet_naming_symbols.private_static_fields.applicable_kinds = field +dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private, protected, protected_internal, private_protected +dotnet_naming_symbols.private_static_fields.required_modifiers = static + +dotnet_naming_symbols.types_and_namespaces.applicable_kinds = namespace, class, struct, interface, enum +dotnet_naming_symbols.types_and_namespaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types_and_namespaces.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +dotnet_naming_symbols.type_parameters.applicable_kinds = namespace +dotnet_naming_symbols.type_parameters.applicable_accessibilities = * +dotnet_naming_symbols.type_parameters.required_modifiers = + +dotnet_naming_symbols.private_constant_fields.applicable_kinds = field +dotnet_naming_symbols.private_constant_fields.applicable_accessibilities = private, protected, protected_internal, private_protected +dotnet_naming_symbols.private_constant_fields.required_modifiers = const + +dotnet_naming_symbols.local_variables.applicable_kinds = local +dotnet_naming_symbols.local_variables.applicable_accessibilities = local +dotnet_naming_symbols.local_variables.required_modifiers = + +dotnet_naming_symbols.local_constants.applicable_kinds = local +dotnet_naming_symbols.local_constants.applicable_accessibilities = local +dotnet_naming_symbols.local_constants.required_modifiers = const + +dotnet_naming_symbols.parameters.applicable_kinds = parameter +dotnet_naming_symbols.parameters.applicable_accessibilities = * +dotnet_naming_symbols.parameters.required_modifiers = + +dotnet_naming_symbols.public_constant_fields.applicable_kinds = field +dotnet_naming_symbols.public_constant_fields.applicable_accessibilities = public, internal +dotnet_naming_symbols.public_constant_fields.required_modifiers = const + +dotnet_naming_symbols.public_static_readonly_fields.applicable_kinds = field +dotnet_naming_symbols.public_static_readonly_fields.applicable_accessibilities = public, internal +dotnet_naming_symbols.public_static_readonly_fields.required_modifiers = readonly, static + +dotnet_naming_symbols.private_static_readonly_fields.applicable_kinds = field +dotnet_naming_symbols.private_static_readonly_fields.applicable_accessibilities = private, protected, protected_internal, private_protected +dotnet_naming_symbols.private_static_readonly_fields.required_modifiers = readonly, static + +dotnet_naming_symbols.local_functions.applicable_kinds = local_function +dotnet_naming_symbols.local_functions.applicable_accessibilities = * +dotnet_naming_symbols.local_functions.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascalcase.required_prefix = +dotnet_naming_style.pascalcase.required_suffix = +dotnet_naming_style.pascalcase.word_separator = +dotnet_naming_style.pascalcase.capitalization = pascal_case + +dotnet_naming_style.ipascalcase.required_prefix = I +dotnet_naming_style.ipascalcase.required_suffix = +dotnet_naming_style.ipascalcase.word_separator = +dotnet_naming_style.ipascalcase.capitalization = pascal_case + +dotnet_naming_style.tpascalcase.required_prefix = T +dotnet_naming_style.tpascalcase.required_suffix = +dotnet_naming_style.tpascalcase.word_separator = +dotnet_naming_style.tpascalcase.capitalization = pascal_case + +dotnet_naming_style._camelcase.required_prefix = _ +dotnet_naming_style._camelcase.required_suffix = +dotnet_naming_style._camelcase.word_separator = +dotnet_naming_style._camelcase.capitalization = camel_case + +dotnet_naming_style.camelcase.required_prefix = +dotnet_naming_style.camelcase.required_suffix = +dotnet_naming_style.camelcase.word_separator = +dotnet_naming_style.camelcase.capitalization = camel_case + +dotnet_naming_style.s_camelcase.required_prefix = s_ +dotnet_naming_style.s_camelcase.required_suffix = +dotnet_naming_style.s_camelcase.word_separator = +dotnet_naming_style.s_camelcase.capitalization = camel_case + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a35653 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +**/bin/ +**/obj/ +**/target/ +/build diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..41ceb20 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,169 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anstream" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "clap" +version = "4.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "umogen-cli" +version = "0.1.0" +dependencies = [ + "clap", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ff80d6b --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,2 @@ +[workspace] +members = ["src/umogen-cli/"] diff --git a/Nyanlabs.Umogen.sln b/Nyanlabs.Umogen.sln new file mode 100644 index 0000000..e873f0e --- /dev/null +++ b/Nyanlabs.Umogen.sln @@ -0,0 +1,50 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D6FABF3A-C5D7-424F-A47E-778EB63D9F4E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nyanlabs.Umogen.Core", "src\Nyanlabs.Umogen.Core\Nyanlabs.Umogen.Core.csproj", "{065CCDC1-81C1-48F6-AF1F-FFA4EF2C7394}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nyanlabs.Umogen.Server", "src\Nyanlabs.Umogen.Server\Nyanlabs.Umogen.Server.csproj", "{DF9C1462-7706-4B41-A31D-43CDE5F0EE94}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{E1BA015C-490E-4337-8C24-529D1C768004}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nyanlabs.Umogen.CoreTests", "test\Nyanlabs.Umogen.CoreTests\Nyanlabs.Umogen.CoreTests.csproj", "{AF4A6B38-48FE-43A9-8827-E6D4E7047CEF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nyanlabs.Umogen.WebTests", "test\Nyanlabs.Umogen.WebTests\Nyanlabs.Umogen.WebTests.csproj", "{06CF074D-0EA0-451A-B5D6-FA08F673882C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {065CCDC1-81C1-48F6-AF1F-FFA4EF2C7394}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {065CCDC1-81C1-48F6-AF1F-FFA4EF2C7394}.Debug|Any CPU.Build.0 = Debug|Any CPU + {065CCDC1-81C1-48F6-AF1F-FFA4EF2C7394}.Release|Any CPU.ActiveCfg = Release|Any CPU + {065CCDC1-81C1-48F6-AF1F-FFA4EF2C7394}.Release|Any CPU.Build.0 = Release|Any CPU + {DF9C1462-7706-4B41-A31D-43CDE5F0EE94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF9C1462-7706-4B41-A31D-43CDE5F0EE94}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF9C1462-7706-4B41-A31D-43CDE5F0EE94}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF9C1462-7706-4B41-A31D-43CDE5F0EE94}.Release|Any CPU.Build.0 = Release|Any CPU + {AF4A6B38-48FE-43A9-8827-E6D4E7047CEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF4A6B38-48FE-43A9-8827-E6D4E7047CEF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF4A6B38-48FE-43A9-8827-E6D4E7047CEF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF4A6B38-48FE-43A9-8827-E6D4E7047CEF}.Release|Any CPU.Build.0 = Release|Any CPU + {06CF074D-0EA0-451A-B5D6-FA08F673882C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06CF074D-0EA0-451A-B5D6-FA08F673882C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06CF074D-0EA0-451A-B5D6-FA08F673882C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06CF074D-0EA0-451A-B5D6-FA08F673882C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {065CCDC1-81C1-48F6-AF1F-FFA4EF2C7394} = {D6FABF3A-C5D7-424F-A47E-778EB63D9F4E} + {DF9C1462-7706-4B41-A31D-43CDE5F0EE94} = {D6FABF3A-C5D7-424F-A47E-778EB63D9F4E} + {AF4A6B38-48FE-43A9-8827-E6D4E7047CEF} = {E1BA015C-490E-4337-8C24-529D1C768004} + {06CF074D-0EA0-451A-B5D6-FA08F673882C} = {E1BA015C-490E-4337-8C24-529D1C768004} + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md new file mode 100644 index 0000000..5bb8b81 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# umogen + +An AI powered document generator. + +## Premise + +This project aims to leverage large language models in order to decrease the effort of handwriting various Polish legal contracts. This iteration will focus on employment and service contracts, namely: contract of employment and civic-law contracts which are the primary contracts used to employ workers. Moreover, civic-law contracts can be utilized to exchange services. + +## Contract types + +- **contract of employment (umowa o pracę)**: this is the most strict form of an employment contract; a fully-featured form which tackles employment-specific matters and emplaces both the employer and the employee with particular rights and responsibilities. +- **contract of mandate (umowa zlecenie)**: a rather lax civic-law contract which focuses around a contractor carrying out a service for a principal. Must be formed around a service. +- **contract for assignment (umowa o dzieło)**: a form of contract which differs from the above one by focusing on the effect of work rather than the process of it. + +## Tech stack + +The core utilizes .NET 8, while the front-end uses ASP.NET Core with Blazor Server. The CLI is written in rust. + +No project has been hurt with javascript or [even more with] n-node js. + +- **Umogen.Core**: C#, .NET 8, +- **Umogen.Server**: C#, .NET 8, Blazor Server +- **umogen-cli**: Rust, clap + +## Features + +- [ ] meow +- [ ] mew diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..16b2602 --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +dotnet build +cargo build + diff --git a/global.json b/global.json new file mode 100644 index 0000000..114cc3a --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "8.0.100" + } +} diff --git a/src/Nyanlabs.Umogen.Core/Nyanlabs.Umogen.Core.csproj b/src/Nyanlabs.Umogen.Core/Nyanlabs.Umogen.Core.csproj new file mode 100644 index 0000000..bb23fb7 --- /dev/null +++ b/src/Nyanlabs.Umogen.Core/Nyanlabs.Umogen.Core.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/src/Nyanlabs.Umogen.Server/App.razor b/src/Nyanlabs.Umogen.Server/App.razor new file mode 100644 index 0000000..6fd3ed1 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/App.razor @@ -0,0 +1,12 @@ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
diff --git a/src/Nyanlabs.Umogen.Server/Data/WeatherForecast.cs b/src/Nyanlabs.Umogen.Server/Data/WeatherForecast.cs new file mode 100644 index 0000000..0a45384 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Data/WeatherForecast.cs @@ -0,0 +1,12 @@ +namespace Nyanlabs.Umogen.Server.Data; + +public class WeatherForecast +{ + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } +} diff --git a/src/Nyanlabs.Umogen.Server/Data/WeatherForecastService.cs b/src/Nyanlabs.Umogen.Server/Data/WeatherForecastService.cs new file mode 100644 index 0000000..eea977f --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Data/WeatherForecastService.cs @@ -0,0 +1,19 @@ +namespace Nyanlabs.Umogen.Server.Data; + +public class WeatherForecastService +{ + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + public Task GetForecastAsync(DateOnly startDate) + { + return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = startDate.AddDays(index), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }).ToArray()); + } +} diff --git a/src/Nyanlabs.Umogen.Server/Nyanlabs.Umogen.Server.csproj b/src/Nyanlabs.Umogen.Server/Nyanlabs.Umogen.Server.csproj new file mode 100644 index 0000000..7295c13 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Nyanlabs.Umogen.Server.csproj @@ -0,0 +1,13 @@ + + + + + + + + net8.0 + enable + enable + + + diff --git a/src/Nyanlabs.Umogen.Server/Pages/Error.cshtml b/src/Nyanlabs.Umogen.Server/Pages/Error.cshtml new file mode 100644 index 0000000..2598dec --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Pages/Error.cshtml @@ -0,0 +1,42 @@ +@page +@model Nyanlabs.Umogen.Server.Pages.ErrorModel + + + + + + + + Error + + + + + +
+
+

Error.

+

An error occurred while processing your request.

+ + @if (Model.ShowRequestId) + { +

+ Request ID: @Model.RequestId +

+ } + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+
+
+ + + diff --git a/src/Nyanlabs.Umogen.Server/Pages/Error.cshtml.cs b/src/Nyanlabs.Umogen.Server/Pages/Error.cshtml.cs new file mode 100644 index 0000000..7c4d7c9 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Pages/Error.cshtml.cs @@ -0,0 +1,26 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace Nyanlabs.Umogen.Server.Pages; + +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +[IgnoreAntiforgeryToken] +public class ErrorModel : PageModel +{ + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + private readonly ILogger _logger; + + public ErrorModel(ILogger logger) + { + _logger = logger; + } + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } +} diff --git a/src/Nyanlabs.Umogen.Server/Pages/Index.razor b/src/Nyanlabs.Umogen.Server/Pages/Index.razor new file mode 100644 index 0000000..d90107f --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Pages/Index.razor @@ -0,0 +1,5 @@ +@page "/" + +Index + +

Hello, meowmeow~

diff --git a/src/Nyanlabs.Umogen.Server/Pages/_Host.cshtml b/src/Nyanlabs.Umogen.Server/Pages/_Host.cshtml new file mode 100644 index 0000000..a90635d --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Pages/_Host.cshtml @@ -0,0 +1,36 @@ +@page "/" +@using Microsoft.AspNetCore.Components.Web +@namespace Nyanlabs.Umogen.Server.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + + + + + + + + + + + +
+ + An error has occurred. This application may no longer respond until reloaded. + + + An unhandled exception has occurred. See browser dev tools for details. + + Reload + 🗙 +
+ + + + + diff --git a/src/Nyanlabs.Umogen.Server/Program.cs b/src/Nyanlabs.Umogen.Server/Program.cs new file mode 100644 index 0000000..10ec015 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Program.cs @@ -0,0 +1,30 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using Nyanlabs.Umogen.Server.Data; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddRazorPages(); +builder.Services.AddServerSideBlazor(); +builder.Services.AddSingleton(); + +var app = builder.Build(); + +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); + +app.UseStaticFiles(); + +app.UseRouting(); + +app.MapBlazorHub(); +app.MapFallbackToPage("/_Host"); + +app.Run(); diff --git a/src/Nyanlabs.Umogen.Server/Properties/launchSettings.json b/src/Nyanlabs.Umogen.Server/Properties/launchSettings.json new file mode 100644 index 0000000..19c4480 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Properties/launchSettings.json @@ -0,0 +1,37 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:9181", + "sslPort": 44392 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5214", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7029;http://localhost:5214", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/Nyanlabs.Umogen.Server/Shared/MainLayout.razor b/src/Nyanlabs.Umogen.Server/Shared/MainLayout.razor new file mode 100644 index 0000000..af0239c --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Shared/MainLayout.razor @@ -0,0 +1,11 @@ +@inherits LayoutComponentBase + +umogen + +
+
+
+ @Body +
+
+
diff --git a/src/Nyanlabs.Umogen.Server/Shared/MainLayout.razor.css b/src/Nyanlabs.Umogen.Server/Shared/MainLayout.razor.css new file mode 100644 index 0000000..f539b54 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/Shared/MainLayout.razor.css @@ -0,0 +1,73 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + +.top-row ::deep a, +.top-row .btn-link { + white-space: nowrap; + margin-left: 1.5rem; +} + +.top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; +} + +@media (max-width: 640.98px) { + .top-row:not(.auth) { + display: none; + } + + .top-row.auth { + justify-content: space-between; + } + + .top-row a, + .top-row .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row, + article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/src/Nyanlabs.Umogen.Server/_Imports.razor b/src/Nyanlabs.Umogen.Server/_Imports.razor new file mode 100644 index 0000000..ecf640f --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/_Imports.razor @@ -0,0 +1,10 @@ +@using System.Net.Http +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using Nyanlabs.Umogen.Server +@using Nyanlabs.Umogen.Server.Shared diff --git a/src/Nyanlabs.Umogen.Server/appsettings.Development.json b/src/Nyanlabs.Umogen.Server/appsettings.Development.json new file mode 100644 index 0000000..770d3e9 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/Nyanlabs.Umogen.Server/appsettings.json b/src/Nyanlabs.Umogen.Server/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/Nyanlabs.Umogen.Server/wwwroot/css/site.css b/src/Nyanlabs.Umogen.Server/wwwroot/css/site.css new file mode 100644 index 0000000..78abcbd --- /dev/null +++ b/src/Nyanlabs.Umogen.Server/wwwroot/css/site.css @@ -0,0 +1,74 @@ +html, +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, +.btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, +.btn:active:focus, +.btn-link.nav-link:focus, +.form-control:focus, +.form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type="checkbox"]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) + no-repeat 1rem/1.8rem, + #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + +.blazor-error-boundary::after { + content: "An error has occurred."; +} diff --git a/src/Nyanlabs.Umogen.Server/wwwroot/favicon.ico b/src/Nyanlabs.Umogen.Server/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d3dfbfa4b824906cb0247f075eb336c77c16a5a4 GIT binary patch literal 51262 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 + + + net8.0 + enable + enable + + false + true + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/test/Nyanlabs.Umogen.WebTests/GlobalUsings.cs b/test/Nyanlabs.Umogen.WebTests/GlobalUsings.cs new file mode 100644 index 0000000..8c927eb --- /dev/null +++ b/test/Nyanlabs.Umogen.WebTests/GlobalUsings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/test/Nyanlabs.Umogen.WebTests/Nyanlabs.Umogen.WebTests.csproj b/test/Nyanlabs.Umogen.WebTests/Nyanlabs.Umogen.WebTests.csproj new file mode 100644 index 0000000..97184e5 --- /dev/null +++ b/test/Nyanlabs.Umogen.WebTests/Nyanlabs.Umogen.WebTests.csproj @@ -0,0 +1,30 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + +