solara 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/solara/lib/.DS_Store +0 -0
  3. data/solara/lib/core/.DS_Store +0 -0
  4. data/solara/lib/core/brands/brand_onboarder.rb +1 -1
  5. data/solara/lib/core/brands/brand_switcher.rb +92 -1
  6. data/solara/lib/core/dashboard/brand/BrandDetail.js +34 -2
  7. data/solara/lib/core/dashboard/brand/BrandDetailController.js +27 -234
  8. data/solara/lib/core/dashboard/brand/BrandDetailModel.js +14 -5
  9. data/solara/lib/core/dashboard/brand/BrandDetailView.js +16 -200
  10. data/solara/lib/core/dashboard/brand/SectionsFormManager.js +293 -0
  11. data/solara/lib/core/dashboard/brand/brand.html +223 -174
  12. data/solara/lib/core/dashboard/brand/source/BrandLocalSource.js +2 -5
  13. data/solara/lib/core/dashboard/brand/source/BrandRemoteSource.js +36 -133
  14. data/solara/lib/core/dashboard/brands/Brands.js +31 -0
  15. data/solara/lib/core/dashboard/brands/BrandsController.js +0 -5
  16. data/solara/lib/core/dashboard/brands/BrandsView.js +2 -2
  17. data/solara/lib/core/dashboard/brands/brands.html +71 -52
  18. data/solara/lib/core/dashboard/component/AliasesBottomSheet.js +6 -6
  19. data/solara/lib/core/dashboard/component/BrandOptionsBottomSheet.js +4 -4
  20. data/solara/lib/core/dashboard/component/ConfirmationDialog.js +15 -10
  21. data/solara/lib/core/dashboard/component/EditJsonSheet.js +160 -0
  22. data/solara/lib/core/dashboard/component/MessageBottomSheet.js +5 -5
  23. data/solara/lib/core/dashboard/component/OnboardBrandBottomSheet.js +9 -3
  24. data/solara/lib/core/dashboard/handler/base_handler.rb +1 -0
  25. data/solara/lib/core/dashboard/handler/edit_section_handler.rb +1 -5
  26. data/solara/lib/core/dashboard/handler/onboard_brand_handler.rb +0 -15
  27. data/solara/lib/core/doctor/schema/brand_configurations.json +0 -8
  28. data/solara/lib/core/doctor/schema/platform/global/resources_manifest.json +30 -0
  29. data/solara/lib/core/doctor/schema/platform/json_manifest.json +39 -0
  30. data/solara/lib/core/doctor/validator/template/android_template_validation_config.yml +35 -1
  31. data/solara/lib/core/doctor/validator/template/flutter_template_validation_config.yml +30 -1
  32. data/solara/lib/core/doctor/validator/template/ios_template_validation_config.yml +35 -1
  33. data/solara/lib/core/doctor/validator/template/template_validator.rb +9 -9
  34. data/solara/lib/core/scripts/brand_config_manager.rb +1 -1
  35. data/solara/lib/core/scripts/brand_configurations_manager.rb +41 -0
  36. data/solara/lib/core/scripts/code_generator.rb +342 -118
  37. data/solara/lib/core/scripts/file_manager.rb +11 -15
  38. data/solara/lib/core/scripts/file_path.rb +21 -1
  39. data/solara/lib/core/scripts/gitignore_manager.rb +12 -6
  40. data/solara/lib/core/scripts/json_manifest_processor.rb +136 -0
  41. data/solara/lib/core/scripts/platform/ios/infoplist_string_catalog_manager.rb +11 -1
  42. data/solara/lib/core/scripts/resource_manifest_processor.rb +151 -0
  43. data/solara/lib/core/scripts/solara_status_manager.rb +1 -1
  44. data/solara/lib/core/scripts/theme_generator.rb +21 -242
  45. data/solara/lib/core/solara_configurator.rb +1 -1
  46. data/solara/lib/core/template/brands/global/resources_manifest.json +10 -0
  47. data/solara/lib/core/template/brands/json/Json-Manifest.md +59 -0
  48. data/solara/lib/core/template/brands/json/json_manifest.json +16 -0
  49. data/solara/lib/core/template/brands/shared/theme.json +213 -29
  50. data/solara/lib/core/template/config/android_template_config.json +50 -0
  51. data/solara/lib/core/template/config/flutter_template_config.json +35 -0
  52. data/solara/lib/core/template/config/ios_template_config.json +50 -0
  53. data/solara/lib/core/template/configurations.json +46 -0
  54. data/solara/lib/core/template/project_template_generator.rb +2 -0
  55. data/solara/lib/solara/version.rb +1 -1
  56. data/solara/lib/solara.rb +19 -0
  57. data/solara/lib/solara_manager.rb +21 -13
  58. metadata +13 -4
  59. data/solara/lib/core/dashboard/component/AddFieldSheet.js +0 -175
  60. data/solara/lib/core/dashboard/handler/brand_configurations_manager.rb +0 -73
@@ -1,253 +1,32 @@
1
1
  require 'json'
2
2
  require 'fileutils'
3
3
 
4
- class ThemeGeneratorManager
4
+ class ThemeGenerator
5
5
  def initialize(input_path)
6
6
  @input_path = input_path
7
7
  end
8
8
 
9
9
  def generate(language, output_path)
10
- case language.downcase
11
- when 'kotlin'
12
- generator = KotlinThemeGenerator.new(@input_path, output_path)
13
- when 'swift'
14
- generator = SwiftThemeGenerator.new(@input_path, output_path)
15
- when 'dart'
16
- generator = DartThemeGenerator.new(@input_path, output_path)
17
- else
18
- Solara.logger.fatal("Unsupported language: #{language}")
19
- return
20
- end
21
-
22
- generator.generate
23
- end
24
- end
25
-
26
- class ThemeGenerator
27
- def initialize(input_path, output_path)
28
- @theme = JSON.parse(File.read(input_path))
29
- @output_path = output_path
30
- end
31
-
32
- def write_to_file(code)
33
- FileUtils.mkdir_p(File.dirname(@output_path))
34
- File.write(@output_path, code)
35
- Solara.logger.debug("Generated theme file: #{@output_path}")
36
- end
37
- end
38
-
39
- class KotlinThemeGenerator < ThemeGenerator
40
- def generate
41
- code = "import android.graphics.Color\n\n"
42
- code += "object BrandTheme {\n"
43
- code += generate_colors
44
- code += generate_typography
45
- code += generate_spacing
46
- code += generate_border_radius
47
- code += generate_elevation
48
- code += "}"
49
- write_to_file(code)
50
- end
51
-
52
- private
53
-
54
- def generate_colors
55
- code = " object Colors {\n"
56
- @theme['colors'].each do |name, value|
57
- code += " val #{name} = Color.parseColor(\"#{value}\")\n"
58
- end
59
- code + " }\n\n"
60
- end
61
-
62
- def generate_typography
63
- code = " object Typography {\n"
64
- code += " object FontFamily {\n"
65
- @theme['typography']['fontFamily'].each do |name, value|
66
- code += " val #{name} = \"#{value}\"\n"
67
- end
68
- code += " }\n\n"
69
- code += " object FontSize {\n"
70
- @theme['typography']['fontSize'].each do |name, value|
71
- code += " val #{name} = #{value}\n"
72
- end
73
- code += " }\n"
74
- code + " }\n\n"
75
- end
76
-
77
- def generate_spacing
78
- code = " object Spacing {\n"
79
- @theme['spacing'].each do |name, value|
80
- code += " val #{name} = #{value}\n"
81
- end
82
- code + " }\n\n"
83
- end
84
-
85
- def generate_border_radius
86
- code = " object BorderRadius {\n"
87
- @theme['borderRadius'].each do |name, value|
88
- code += " val #{name} = #{value}\n"
89
- end
90
- code + " }\n\n"
91
- end
92
-
93
- def generate_elevation
94
- code = " object Elevation {\n"
95
- @theme['elevation'].each do |name, value|
96
- code += " val #{name} = #{value}\n"
97
- end
98
- code + " }\n"
99
- end
100
- end
101
-
102
- class SwiftThemeGenerator < ThemeGenerator
103
- def generate
104
- code = "import UIKit\n\n"
105
- code += "struct BrandTheme {\n"
106
- code += generate_colors
107
- code += generate_typography
108
- code += generate_spacing
109
- code += generate_border_radius
110
- code += generate_elevation
111
- code += "}\n\n"
112
- code += generate_colors_hex_extension
113
- write_to_file(code)
114
- end
115
-
116
- private
117
-
118
- def generate_colors
119
- code = " struct Colors {\n"
120
- @theme['colors'].each do |name, value|
121
- code += " static let #{name} = UIColor(hex: \"#{value}\")\n"
122
- end
123
- code + " }\n\n"
124
- end
125
-
126
- def generate_colors_hex_extension
127
- <<-SWIFT
128
- extension UIColor {
129
- convenience init(hex: String) {
130
- let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
131
- var int: UInt64 = 0
132
- Scanner(string: hex).scanHexInt64(&int)
133
- let a, r, g, b: UInt64
134
- switch hex.count {
135
- case 3: // RGB (12-bit)
136
- (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
137
- case 6: // RGB (24-bit)
138
- (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
139
- case 8: // ARGB (32-bit)
140
- (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
141
- default:
142
- (a, r, g, b) = (255, 255, 255, 0)
10
+ config_generator = CodeGenerator.new(
11
+ json: JSON.parse(File.read(@input_path)),
12
+ language: language,
13
+ parent_class_name: 'BrandTheme',
14
+ custom_types: {
15
+ "BrandThemeColorSchemes" => "BrandColorScheme",
16
+ "BrandThemeTypography" => "BrandTypography",
17
+ "BrandThemeSpacing" => "BrandSpacing",
18
+ "BrandThemeBorderRadius" => "BrandBorderRadius",
19
+ "BrandThemeElevation" => "BrandElevation",
20
+ "BrandThemeOpacity" => "BrandOpacity",
21
+ "BrandThemeAnimation" => "BrandAnimation",
22
+ "BrandThemeBreakpoints" => "BrandBreakpoints",
23
+ "BrandThemeColorSchemesLight" => "BrandLightColorScheme",
24
+ "BrandThemeColorSchemesDark" => "BrandDarkColorScheme",
143
25
  }
144
-
145
- self.init(
146
- red: CGFloat(r) / 255,
147
- green: CGFloat(g) / 255,
148
- blue: CGFloat(b) / 255,
149
- alpha: CGFloat(a) / 255
150
- )
151
- }
152
- }
153
- SWIFT
154
- end
155
-
156
- def generate_typography
157
- code = " struct Typography {\n"
158
- code += " struct FontFamily {\n"
159
- @theme['typography']['fontFamily'].each do |name, value|
160
- code += " static let #{name} = \"#{value}\"\n"
161
- end
162
- code += " }\n\n"
163
- code += " struct FontSize {\n"
164
- @theme['typography']['fontSize'].each do |name, value|
165
- code += " static let #{name}: CGFloat = #{value}\n"
166
- end
167
- code += " }\n"
168
- code + " }\n\n"
169
- end
170
-
171
- def generate_spacing
172
- code = " struct Spacing {\n"
173
- @theme['spacing'].each do |name, value|
174
- code += " static let #{name}: CGFloat = #{value}\n"
175
- end
176
- code + " }\n\n"
177
- end
178
-
179
- def generate_border_radius
180
- code = " struct BorderRadius {\n"
181
- @theme['borderRadius'].each do |name, value|
182
- code += " static let #{name}: CGFloat = #{value}\n"
183
- end
184
- code + " }\n\n"
185
- end
186
-
187
- def generate_elevation
188
- code = " struct Elevation {\n"
189
- @theme['elevation'].each do |name, value|
190
- code += " static let #{name}: CGFloat = #{value}\n"
191
- end
192
- code + " }\n"
26
+ )
27
+ content = config_generator.generate
28
+ FileManager.create_file_if_not_exist(output_path)
29
+ File.write(output_path, content)
30
+ Solara.logger.debug("Generated theme file: #{output_path}")
193
31
  end
194
32
  end
195
-
196
- class DartThemeGenerator < ThemeGenerator
197
- def generate
198
- code = "import 'package:flutter/material.dart';\n\n"
199
- code += generate_colors
200
- code += generate_typography
201
- code += generate_spacing
202
- code += generate_border_radius
203
- code += generate_elevation
204
- write_to_file(code)
205
- end
206
-
207
- private
208
-
209
- def generate_colors
210
- code = " class BrandColors {\n"
211
- @theme['colors'].each do |name, value|
212
- code += " static const Color #{name} = Color(0xFF#{value[1..-1]});\n"
213
- end
214
- code + " }\n\n"
215
- end
216
-
217
- def generate_typography
218
- code = " class FontFamily {\n"
219
- @theme['typography']['fontFamily'].each do |name, value|
220
- code += " static const String #{name} = '#{value}';\n"
221
- end
222
- code += " }\n\n"
223
- code += " class FontSize {\n"
224
- @theme['typography']['fontSize'].each do |name, value|
225
- code += " static const double #{name} = #{value};\n"
226
- end
227
- code + " }\n\n"
228
- end
229
-
230
- def generate_spacing
231
- code = " class Spacing {\n"
232
- @theme['spacing'].each do |name, value|
233
- code += " static const double #{name} = #{value};\n"
234
- end
235
- code + " }\n\n"
236
- end
237
-
238
- def generate_border_radius
239
- code = " class BorderRadius {\n"
240
- @theme['borderRadius'].each do |name, value|
241
- code += " static const double #{name} = #{value};\n"
242
- end
243
- code += " }\n\n"
244
- end
245
-
246
- def generate_elevation
247
- code = " class Elevation {\n"
248
- @theme['elevation'].each do |name, value|
249
- code += " static const double #{name} = #{value};\n"
250
- end
251
- code + " }\n"
252
- end
253
- end
@@ -7,7 +7,7 @@ class SolaraConfigurator
7
7
  end
8
8
 
9
9
  def start
10
- GitignoreManager.ignore
10
+ GitignoreManager.ignore_common_files
11
11
  AliasManager.new.start
12
12
  end
13
13
 
@@ -0,0 +1,10 @@
1
+ {
2
+ "description": "This file outlines the resources to be transferred from the brand source to the codebase during the switching process.",
3
+ "files": [
4
+ {
5
+ "source": "",
6
+ "destination": "",
7
+ "mandatory": true
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,59 @@
1
+ # JSON Structure and Usage
2
+
3
+ JSON manifest enables the generation of platform-specific code based on the provided JSON files. This enhancement
4
+ streamlines the development process and ensures better code organization for different platforms.
5
+
6
+ Each JSON file will be transformed into a class within the `solara_artifacts` directory.
7
+
8
+ You can place your JSON files in the following directories:
9
+
10
+ - `brands/BRAND/android/json`
11
+ - `brands/BRAND/ios/json`
12
+ - `brands/BRAND/flutter/json`
13
+ - `brands/global/json`
14
+
15
+ ## The Manifest File
16
+
17
+ Each directory contains a `json_manifest.json` file with the following structure:
18
+
19
+ ```json
20
+ {
21
+ "files": [
22
+ {
23
+ "fileName": "",
24
+ "generate": true,
25
+ "parentClassName": "",
26
+ "customClassNames": [
27
+ {
28
+ "originalName": "",
29
+ "customName": ""
30
+ }
31
+ ]
32
+ }
33
+ ]
34
+ }
35
+ ```
36
+
37
+ ### Property Descriptions
38
+
39
+ - **files**: An array containing objects that define the JSON files to be processed.
40
+
41
+ - **fileName**: The name of the JSON file. This should include the file extension (e.g., `config.json`).
42
+
43
+ - **generate**: An object that specifies whether to generate a class for the JSON file and the details for that
44
+ class.
45
+
46
+ - **enabled**: A boolean value that indicates if class generation is enabled for this file. If set to `true`, a
47
+ class will be created based on the JSON structure.
48
+
49
+ - **className**: The name of the class that will be generated from the JSON file. This is typically derived from
50
+ the `fileName`.
51
+
52
+ - **customClassNames**: An array of objects that allow you to specify custom names for generated classes.
53
+
54
+ - **generatedName**: The name of the class as it would be generated by default.
55
+
56
+ - **customName**: The custom name you want to assign to the generated class instead of the default
57
+ `generatedName`. This is useful for maintaining consistency or aligning with existing naming conventions
58
+ in your codebase.
59
+
@@ -0,0 +1,16 @@
1
+ {
2
+ "description": "This file specifies the JSON files that can be optionally generated for the target platform code.",
3
+ "files": [
4
+ {
5
+ "fileName": "",
6
+ "generate": true,
7
+ "parentClassName": "",
8
+ "customClassNames": [
9
+ {
10
+ "originalName": "",
11
+ "customName": ""
12
+ }
13
+ ]
14
+ }
15
+ ]
16
+ }
@@ -1,46 +1,230 @@
1
1
  {
2
2
  "name": "BrandTheme",
3
3
  "version": "1.0.0",
4
- "colors": {
5
- "primary": "#007AFF",
6
- "secondary": "#5AC8FA",
7
- "background": "#FFFFFF",
8
- "surface": "#F2F2F7",
9
- "error": "#FF3B30",
10
- "onPrimary": "#FFFFFF",
11
- "onSecondary": "#000000",
12
- "onBackground": "#000000",
13
- "onSurface": "#000000",
14
- "onError": "#FFFFFF"
4
+ "colorSchemes": {
5
+ "light": {
6
+ "primary": "#6750A4",
7
+ "onPrimary": "#FFFFFF",
8
+ "primaryContainer": "#EADDFF",
9
+ "onPrimaryContainer": "#21005D",
10
+ "secondary": "#625B71",
11
+ "onSecondary": "#FFFFFF",
12
+ "secondaryContainer": "#E8DEF8",
13
+ "onSecondaryContainer": "#1D192B",
14
+ "tertiary": "#7D5260",
15
+ "onTertiary": "#FFFFFF",
16
+ "tertiaryContainer": "#FFD8E4",
17
+ "onTertiaryContainer": "#31111D",
18
+ "error": "#B3261E",
19
+ "onError": "#FFFFFF",
20
+ "errorContainer": "#F9DEDC",
21
+ "onErrorContainer": "#410E0B",
22
+ "background": "#FFFBFE",
23
+ "onBackground": "#1C1B1F",
24
+ "surface": "#FFFBFE",
25
+ "onSurface": "#1C1B1F",
26
+ "surfaceVariant": "#E7E0EC",
27
+ "onSurfaceVariant": "#49454F",
28
+ "outline": "#79747E",
29
+ "outlineVariant": "#CAC4D0",
30
+ "shadow": "#000000",
31
+ "scrim": "#000000",
32
+ "inverseSurface": "#313033",
33
+ "inverseOnSurface": "#F4EFF4",
34
+ "inversePrimary": "#D0BCFF",
35
+ "surfaceDim": "#DED8E1",
36
+ "surfaceBright": "#FFFBFE",
37
+ "surfaceTint": "#F0F0F0",
38
+ "surfaceContainerLowest": "#FFFFFF",
39
+ "surfaceContainerLow": "#F7F2FA",
40
+ "surfaceContainer": "#F3EDF7",
41
+ "surfaceContainerHigh": "#ECE6F0",
42
+ "surfaceContainerHighest": "#E6E0E9",
43
+ "primaryFixed": "#6A5ACD",
44
+ "primaryFixedDim": "#5B4B9A",
45
+ "onPrimaryFixed": "#FFFFFF",
46
+ "onPrimaryFixedVariant": "#21005D",
47
+ "secondaryFixed": "#7A6A8A",
48
+ "secondaryFixedDim": "#6B5B71",
49
+ "onSecondaryFixed": "#FFFFFF",
50
+ "onSecondaryFixedVariant": "#2C2735",
51
+ "tertiaryFixed": "#DA6A76",
52
+ "tertiaryFixedDim": "#C65B65",
53
+ "onTertiaryFixed": "#FFFFFF",
54
+ "onTertiaryFixedVariant": "#492532",
55
+ "onInverseSurface": "#FFFFFF"
56
+ },
57
+ "dark": {
58
+ "primary": "#D0BCFF",
59
+ "onPrimary": "#381E72",
60
+ "primaryContainer": "#4F378B",
61
+ "onPrimaryContainer": "#EADDFF",
62
+ "secondary": "#CCC2DC",
63
+ "onSecondary": "#332D41",
64
+ "secondaryContainer": "#4A4458",
65
+ "onSecondaryContainer": "#E8DEF8",
66
+ "tertiary": "#EFB8C8",
67
+ "onTertiary": "#492532",
68
+ "tertiaryContainer": "#633B48",
69
+ "onTertiaryContainer": "#FFD8E4",
70
+ "error": "#F2B8B5",
71
+ "onError": "#601410",
72
+ "errorContainer": "#8C1D18",
73
+ "onErrorContainer": "#F9DEDC",
74
+ "background": "#1C1B1F",
75
+ "onBackground": "#E6E1E5",
76
+ "surface": "#1C1B1F",
77
+ "onSurface": "#E6E1E5",
78
+ "surfaceVariant": "#49454F",
79
+ "onSurfaceVariant": "#CAC4D0",
80
+ "outline": "#938F99",
81
+ "outlineVariant": "#49454F",
82
+ "shadow": "#000000",
83
+ "scrim": "#000000",
84
+ "inverseSurface": "#E6E1E5",
85
+ "inverseOnSurface": "#313033",
86
+ "inversePrimary": "#6750A4",
87
+ "surfaceDim": "#141218",
88
+ "surfaceBright": "#3B383E",
89
+ "surfaceTint": "#121212",
90
+ "surfaceContainerLowest": "#0F0D13",
91
+ "surfaceContainerLow": "#1D1B20",
92
+ "surfaceContainer": "#211F26",
93
+ "surfaceContainerHigh": "#2B2930",
94
+ "surfaceContainerHighest": "#36343B",
95
+ "primaryFixed": "#B0A4E0",
96
+ "primaryFixedDim": "#A08DBE",
97
+ "onPrimaryFixed": "#381E72",
98
+ "onPrimaryFixedVariant": "#EADDFF",
99
+ "secondaryFixed": "#A69DB3",
100
+ "secondaryFixedDim": "#8C8A94",
101
+ "onSecondaryFixed": "#332D41",
102
+ "onSecondaryFixedVariant": "#E8DEF8",
103
+ "tertiaryFixed": "#EFB8C8",
104
+ "tertiaryFixedDim": "#C65B65",
105
+ "onTertiaryFixed": "#492532",
106
+ "onTertiaryFixedVariant": "#FFD8E4",
107
+ "onInverseSurface": "#1C1B1F"
108
+ }
15
109
  },
16
110
  "typography": {
17
111
  "fontFamily": {
18
- "regular": "",
19
- "medium": "",
20
- "bold": ""
112
+ "regular": "Roboto, sans-serif",
113
+ "medium": "Roboto-Medium, sans-serif",
114
+ "bold": "Roboto-Bold, sans-serif"
21
115
  },
22
116
  "fontSize": {
23
- "small": 12,
24
- "medium": 16,
25
- "large": 20,
26
- "extraLarge": 24
117
+ "caption": 12,
118
+ "body1": 16,
119
+ "body2": 14,
120
+ "subtitle1": 16,
121
+ "subtitle2": 14,
122
+ "h6": 20,
123
+ "h5": 24,
124
+ "h4": 34,
125
+ "h3": 48,
126
+ "h2": 60,
127
+ "h1": 96
128
+ },
129
+ "fontWeight": {
130
+ "light": 300,
131
+ "regular": 400,
132
+ "medium": 500,
133
+ "bold": 700
134
+ },
135
+ "lineHeight": {
136
+ "tight": 1.2,
137
+ "normal": 1.5,
138
+ "relaxed": 1.8
139
+ },
140
+ "letterSpacing": {
141
+ "tight": -0.5,
142
+ "normal": 0,
143
+ "wide": 0.5
27
144
  }
28
145
  },
29
146
  "spacing": {
30
- "small": 8,
31
- "medium": 16,
32
- "large": 24,
33
- "extraLarge": 32
147
+ "xxs": 4,
148
+ "xs": 8,
149
+ "sm": 12,
150
+ "md": 16,
151
+ "lg": 24,
152
+ "xl": 32,
153
+ "xxl": 48
34
154
  },
35
155
  "borderRadius": {
36
- "small": 4,
37
- "medium": 8,
38
- "large": 12
156
+ "none": 0,
157
+ "sm": 4,
158
+ "md": 8,
159
+ "lg": 12,
160
+ "full": 9999
39
161
  },
40
162
  "elevation": {
41
- "none": 0,
42
- "low": 2,
43
- "medium": 4,
44
- "high": 8
163
+ "none": {
164
+ "shadowColor": "#000000",
165
+ "shadowOffset": {
166
+ "width": 0,
167
+ "height": 0
168
+ },
169
+ "shadowOpacity": 0,
170
+ "shadowRadius": 0,
171
+ "elevation": 0
172
+ },
173
+ "low": {
174
+ "shadowColor": "#000000",
175
+ "shadowOffset": {
176
+ "width": 0,
177
+ "height": 2
178
+ },
179
+ "shadowOpacity": 0.1,
180
+ "shadowRadius": 4,
181
+ "elevation": 2
182
+ },
183
+ "medium": {
184
+ "shadowColor": "#000000",
185
+ "shadowOffset": {
186
+ "width": 0,
187
+ "height": 4
188
+ },
189
+ "shadowOpacity": 0.15,
190
+ "shadowRadius": 8,
191
+ "elevation": 4
192
+ },
193
+ "high": {
194
+ "shadowColor": "#000000",
195
+ "shadowOffset": {
196
+ "width": 0,
197
+ "height": 8
198
+ },
199
+ "shadowOpacity": 0.2,
200
+ "shadowRadius": 16,
201
+ "elevation": 8
202
+ }
203
+ },
204
+ "opacity": {
205
+ "disabled": 0.38,
206
+ "hovered": 0.08,
207
+ "focused": 0.12,
208
+ "pressed": 0.16,
209
+ "dragged": 0.24
210
+ },
211
+ "animation": {
212
+ "duration": {
213
+ "short": 200,
214
+ "medium": 300,
215
+ "long": 400
216
+ },
217
+ "easing": {
218
+ "standard": "cubic-bezier(0.4, 0.0, 0.2, 1)",
219
+ "accelerate": "cubic-bezier(0.4, 0.0, 1, 1)",
220
+ "decelerate": "cubic-bezier(0.0, 0.0, 0.2, 1)"
221
+ }
222
+ },
223
+ "breakpoints": {
224
+ "xs": 0,
225
+ "sm": 600,
226
+ "md": 960,
227
+ "lg": 1280,
228
+ "xl": 1920
45
229
  }
46
230
  }
@@ -59,6 +59,56 @@
59
59
  "source": "shared/brand_config.json",
60
60
  "target": "shared/brand_config.json",
61
61
  "condition": "true"
62
+ },
63
+ {
64
+ "source": "json/",
65
+ "target": "android/json/",
66
+ "condition": "true"
67
+ },
68
+ {
69
+ "source": "json/",
70
+ "target": "ios/json/",
71
+ "condition": "true"
72
+ },
73
+ {
74
+ "source": "json/json_manifest.json",
75
+ "target": "android/json/",
76
+ "condition": "true"
77
+ },
78
+ {
79
+ "source": "json/json_manifest.json",
80
+ "target": "ios/json/",
81
+ "condition": "true"
82
+ },
83
+ {
84
+ "source": "json/Json-Manifest.md",
85
+ "target": "android/json/",
86
+ "condition": "true"
87
+ },
88
+ {
89
+ "source": "json/Json-Manifest.md",
90
+ "target": "ios/json/",
91
+ "condition": "true"
92
+ },
93
+ {
94
+ "source": "json/",
95
+ "target": "../../global/json",
96
+ "condition": "true"
97
+ },
98
+ {
99
+ "source": "json/json_manifest.json",
100
+ "target": "../../global/json",
101
+ "condition": "true"
102
+ },
103
+ {
104
+ "source": "json/Json-Manifest.md",
105
+ "target": "../../global/json",
106
+ "condition": "true"
107
+ },
108
+ {
109
+ "source": "global/resources_manifest.json",
110
+ "target": "../../global/resources_manifest.json",
111
+ "condition": "true"
62
112
  }
63
113
  ],
64
114
  "variables": {