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.
- checksums.yaml +4 -4
- data/solara/lib/.DS_Store +0 -0
- data/solara/lib/core/.DS_Store +0 -0
- data/solara/lib/core/brands/brand_onboarder.rb +1 -1
- data/solara/lib/core/brands/brand_switcher.rb +92 -1
- data/solara/lib/core/dashboard/brand/BrandDetail.js +34 -2
- data/solara/lib/core/dashboard/brand/BrandDetailController.js +27 -234
- data/solara/lib/core/dashboard/brand/BrandDetailModel.js +14 -5
- data/solara/lib/core/dashboard/brand/BrandDetailView.js +16 -200
- data/solara/lib/core/dashboard/brand/SectionsFormManager.js +293 -0
- data/solara/lib/core/dashboard/brand/brand.html +223 -174
- data/solara/lib/core/dashboard/brand/source/BrandLocalSource.js +2 -5
- data/solara/lib/core/dashboard/brand/source/BrandRemoteSource.js +36 -133
- data/solara/lib/core/dashboard/brands/Brands.js +31 -0
- data/solara/lib/core/dashboard/brands/BrandsController.js +0 -5
- data/solara/lib/core/dashboard/brands/BrandsView.js +2 -2
- data/solara/lib/core/dashboard/brands/brands.html +71 -52
- data/solara/lib/core/dashboard/component/AliasesBottomSheet.js +6 -6
- data/solara/lib/core/dashboard/component/BrandOptionsBottomSheet.js +4 -4
- data/solara/lib/core/dashboard/component/ConfirmationDialog.js +15 -10
- data/solara/lib/core/dashboard/component/EditJsonSheet.js +160 -0
- data/solara/lib/core/dashboard/component/MessageBottomSheet.js +5 -5
- data/solara/lib/core/dashboard/component/OnboardBrandBottomSheet.js +9 -3
- data/solara/lib/core/dashboard/handler/base_handler.rb +1 -0
- data/solara/lib/core/dashboard/handler/edit_section_handler.rb +1 -5
- data/solara/lib/core/dashboard/handler/onboard_brand_handler.rb +0 -15
- data/solara/lib/core/doctor/schema/brand_configurations.json +0 -8
- data/solara/lib/core/doctor/schema/platform/global/resources_manifest.json +30 -0
- data/solara/lib/core/doctor/schema/platform/json_manifest.json +39 -0
- data/solara/lib/core/doctor/validator/template/android_template_validation_config.yml +35 -1
- data/solara/lib/core/doctor/validator/template/flutter_template_validation_config.yml +30 -1
- data/solara/lib/core/doctor/validator/template/ios_template_validation_config.yml +35 -1
- data/solara/lib/core/doctor/validator/template/template_validator.rb +9 -9
- data/solara/lib/core/scripts/brand_config_manager.rb +1 -1
- data/solara/lib/core/scripts/brand_configurations_manager.rb +41 -0
- data/solara/lib/core/scripts/code_generator.rb +342 -118
- data/solara/lib/core/scripts/file_manager.rb +11 -15
- data/solara/lib/core/scripts/file_path.rb +21 -1
- data/solara/lib/core/scripts/gitignore_manager.rb +12 -6
- data/solara/lib/core/scripts/json_manifest_processor.rb +136 -0
- data/solara/lib/core/scripts/platform/ios/infoplist_string_catalog_manager.rb +11 -1
- data/solara/lib/core/scripts/resource_manifest_processor.rb +151 -0
- data/solara/lib/core/scripts/solara_status_manager.rb +1 -1
- data/solara/lib/core/scripts/theme_generator.rb +21 -242
- data/solara/lib/core/solara_configurator.rb +1 -1
- data/solara/lib/core/template/brands/global/resources_manifest.json +10 -0
- data/solara/lib/core/template/brands/json/Json-Manifest.md +59 -0
- data/solara/lib/core/template/brands/json/json_manifest.json +16 -0
- data/solara/lib/core/template/brands/shared/theme.json +213 -29
- data/solara/lib/core/template/config/android_template_config.json +50 -0
- data/solara/lib/core/template/config/flutter_template_config.json +35 -0
- data/solara/lib/core/template/config/ios_template_config.json +50 -0
- data/solara/lib/core/template/configurations.json +46 -0
- data/solara/lib/core/template/project_template_generator.rb +2 -0
- data/solara/lib/solara/version.rb +1 -1
- data/solara/lib/solara.rb +19 -0
- data/solara/lib/solara_manager.rb +21 -13
- metadata +13 -4
- data/solara/lib/core/dashboard/component/AddFieldSheet.js +0 -175
- 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
|
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
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
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
|
@@ -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
|
-
"
|
5
|
-
"
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
"
|
24
|
-
"
|
25
|
-
"
|
26
|
-
"
|
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
|
-
"
|
31
|
-
"
|
32
|
-
"
|
33
|
-
"
|
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
|
-
"
|
37
|
-
"
|
38
|
-
"
|
156
|
+
"none": 0,
|
157
|
+
"sm": 4,
|
158
|
+
"md": 8,
|
159
|
+
"lg": 12,
|
160
|
+
"full": 9999
|
39
161
|
},
|
40
162
|
"elevation": {
|
41
|
-
"none":
|
42
|
-
|
43
|
-
|
44
|
-
|
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": {
|