@oim-media/spec 0.0.0-stage → 1.27.9

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 (131) hide show
  1. package/BINARY_SPEC.md +190 -0
  2. package/CANONICAL_SPEC.md +409 -0
  3. package/LICENSE +55 -0
  4. package/NOTICE +6 -0
  5. package/README.md +445 -2
  6. package/action-cases.json +13 -0
  7. package/artistic-text-cases.json +690 -0
  8. package/canonical-cases.json +6 -0
  9. package/keyframe-cases.json +32 -0
  10. package/keys.json +22 -0
  11. package/marks-cases.json +34 -0
  12. package/package.json +46 -3
  13. package/pattern-cases.json +552 -0
  14. package/schema/oim.schema.json +2920 -0
  15. package/schema/ovm.schema.json +2701 -0
  16. package/text-effect-cases.json +835 -0
  17. package/tools/parity-core.mjs +122 -0
  18. package/tools/parity.mjs +86 -0
  19. package/vectors/README.md +103 -0
  20. package/vectors/accessibility.expected.json +67 -0
  21. package/vectors/accessibility.oim.png +0 -0
  22. package/vectors/artistic-text.expected.json +84 -0
  23. package/vectors/artistic-text.oim.png +0 -0
  24. package/vectors/asymmetric-borders.expected.json +29 -0
  25. package/vectors/asymmetric-borders.oim.png +0 -0
  26. package/vectors/background-pattern-order.expected.json +95 -0
  27. package/vectors/background-pattern-order.oim.png +0 -0
  28. package/vectors/basic-text.expected.json +29 -0
  29. package/vectors/basic-text.oim.png +0 -0
  30. package/vectors/color-blending-opacity.expected.json +47 -0
  31. package/vectors/color-blending-opacity.oim.png +0 -0
  32. package/vectors/crop.expected.json +32 -0
  33. package/vectors/crop.oim.png +0 -0
  34. package/vectors/embedded-font-woff.expected.json +57 -0
  35. package/vectors/embedded-font-woff.oim.png +0 -0
  36. package/vectors/extreme-aspect-ratios.expected.json +29 -0
  37. package/vectors/extreme-aspect-ratios.oim.png +0 -0
  38. package/vectors/filter-effects.expected.json +33 -0
  39. package/vectors/filter-effects.oim.png +0 -0
  40. package/vectors/flip.expected.json +47 -0
  41. package/vectors/flip.oim.png +0 -0
  42. package/vectors/frame-shapes.expected.json +73 -0
  43. package/vectors/frame-shapes.oim.png +0 -0
  44. package/vectors/full-monty-composite.expected.json +96 -0
  45. package/vectors/full-monty-composite.oim.png +0 -0
  46. package/vectors/golden/accessibility.web.png +0 -0
  47. package/vectors/golden/artistic-text.web.png +0 -0
  48. package/vectors/golden/asymmetric-borders.web.png +0 -0
  49. package/vectors/golden/background-pattern-order.web.png +0 -0
  50. package/vectors/golden/basic-text.web.png +0 -0
  51. package/vectors/golden/color-blending-opacity.web.png +0 -0
  52. package/vectors/golden/crop.web.png +0 -0
  53. package/vectors/golden/embedded-font-woff.web.png +0 -0
  54. package/vectors/golden/exceptions.json +3 -0
  55. package/vectors/golden/extreme-aspect-ratios.web.png +0 -0
  56. package/vectors/golden/filter-effects.web.png +0 -0
  57. package/vectors/golden/flip.web.png +0 -0
  58. package/vectors/golden/frame-shapes.web.png +0 -0
  59. package/vectors/golden/full-monty-composite.web.png +0 -0
  60. package/vectors/golden/groups-and-parallax.web.png +0 -0
  61. package/vectors/golden/image-fill.web.png +0 -0
  62. package/vectors/golden/interactive-chained-actions.web.png +0 -0
  63. package/vectors/golden/interactive-hover.web.png +0 -0
  64. package/vectors/golden/interactive.web.png +0 -0
  65. package/vectors/golden/layer-blur.web.png +0 -0
  66. package/vectors/golden/layer-grain.web.png +0 -0
  67. package/vectors/golden/layer-ordering-zindex.web.png +0 -0
  68. package/vectors/golden/legacy-text-chunk.web.png +0 -0
  69. package/vectors/golden/media-filters.web.png +0 -0
  70. package/vectors/golden/multi-container-layout.web.png +0 -0
  71. package/vectors/golden/multilang-cjk-rtl.web.png +0 -0
  72. package/vectors/golden/nested-groups.web.png +0 -0
  73. package/vectors/golden/palettes.web.png +0 -0
  74. package/vectors/golden/parallax-infinite.web.png +0 -0
  75. package/vectors/golden/pattern-color-roles.web.png +0 -0
  76. package/vectors/golden/reedit-english.web.png +0 -0
  77. package/vectors/golden/reveal-and-play.web.png +0 -0
  78. package/vectors/golden/shadow-effects.web.png +0 -0
  79. package/vectors/golden/shape-shadows.web.png +0 -0
  80. package/vectors/golden/strokes-and-borders.web.png +0 -0
  81. package/vectors/golden/text-runs-precalculated.web.png +0 -0
  82. package/vectors/golden/transparent-background.web.png +0 -0
  83. package/vectors/golden/typography-styling.web.png +0 -0
  84. package/vectors/groups-and-parallax.expected.json +90 -0
  85. package/vectors/groups-and-parallax.oim.png +0 -0
  86. package/vectors/image-fill.expected.json +54 -0
  87. package/vectors/image-fill.oim.png +0 -0
  88. package/vectors/interactive-chained-actions.expected.json +77 -0
  89. package/vectors/interactive-chained-actions.oim.png +0 -0
  90. package/vectors/interactive-hover.expected.json +36 -0
  91. package/vectors/interactive-hover.oim.png +0 -0
  92. package/vectors/interactive.expected.json +121 -0
  93. package/vectors/interactive.oim.png +0 -0
  94. package/vectors/layer-blur.expected.json +48 -0
  95. package/vectors/layer-blur.oim.png +0 -0
  96. package/vectors/layer-grain.expected.json +52 -0
  97. package/vectors/layer-grain.oim.png +0 -0
  98. package/vectors/layer-ordering-zindex.expected.json +62 -0
  99. package/vectors/layer-ordering-zindex.oim.png +0 -0
  100. package/vectors/legacy-text-chunk.expected.json +29 -0
  101. package/vectors/legacy-text-chunk.oim.png +0 -0
  102. package/vectors/media-filters.expected.json +50 -0
  103. package/vectors/media-filters.oim.png +0 -0
  104. package/vectors/multi-container-layout.expected.json +45 -0
  105. package/vectors/multi-container-layout.oim.png +0 -0
  106. package/vectors/multilang-cjk-rtl.expected.json +30 -0
  107. package/vectors/multilang-cjk-rtl.oim.png +0 -0
  108. package/vectors/nested-groups.expected.json +68 -0
  109. package/vectors/nested-groups.oim.png +0 -0
  110. package/vectors/palettes.expected.json +57 -0
  111. package/vectors/palettes.oim.png +0 -0
  112. package/vectors/parallax-infinite.expected.json +39 -0
  113. package/vectors/parallax-infinite.oim.png +0 -0
  114. package/vectors/pattern-color-roles.expected.json +68 -0
  115. package/vectors/pattern-color-roles.oim.png +0 -0
  116. package/vectors/reedit-english.expected.json +45 -0
  117. package/vectors/reedit-english.oim.png +0 -0
  118. package/vectors/reveal-and-play.expected.json +107 -0
  119. package/vectors/reveal-and-play.oim.png +0 -0
  120. package/vectors/shadow-effects.expected.json +34 -0
  121. package/vectors/shadow-effects.oim.png +0 -0
  122. package/vectors/shape-shadows.expected.json +62 -0
  123. package/vectors/shape-shadows.oim.png +0 -0
  124. package/vectors/strokes-and-borders.expected.json +31 -0
  125. package/vectors/strokes-and-borders.oim.png +0 -0
  126. package/vectors/text-runs-precalculated.expected.json +46 -0
  127. package/vectors/text-runs-precalculated.oim.png +0 -0
  128. package/vectors/transparent-background.expected.json +30 -0
  129. package/vectors/transparent-background.oim.png +0 -0
  130. package/vectors/typography-styling.expected.json +34 -0
  131. package/vectors/typography-styling.oim.png +0 -0
@@ -0,0 +1,32 @@
1
+ [
2
+ { "name": "linear translate", "duration": 2,
3
+ "keyframes": [{ "t": 0, "x": 0 }, { "t": 2, "x": 100 }],
4
+ "samples": [{ "time": 0, "expect": { "x": 0, "y": 0, "r": 0, "s": 1, "o": 1, "b": 0 } }, { "time": 1, "expect": { "x": 50 } }, { "time": 2, "expect": { "x": 100 } }] },
5
+ { "name": "ease-in on the left frame", "duration": 1,
6
+ "keyframes": [{ "t": 0, "x": 0, "e": "ease-in" }, { "t": 1, "x": 100 }],
7
+ "samples": [{ "time": 0.5, "expect": { "x": 31.5357 } }] },
8
+ { "name": "bezier tuple equals ease-in-out", "duration": 1,
9
+ "keyframes": [{ "t": 0, "r": 0, "e": [0.42, 0, 0.58, 1] }, { "t": 1, "r": 360 }],
10
+ "samples": [{ "time": 0.25, "expect": { "r": 46.4983 } }, { "time": 0.5, "expect": { "r": 180 } }] },
11
+ { "name": "steps(1, end) holds the left value", "duration": 1,
12
+ "keyframes": [{ "t": 0, "s": 1, "e": "steps(1, end)" }, { "t": 1, "s": 2 }],
13
+ "samples": [{ "time": 0.99, "expect": { "s": 1 } }, { "time": 1, "expect": { "s": 2 } }] },
14
+ { "name": "first frame after 0 starts from the base", "duration": 4,
15
+ "keyframes": [{ "t": 2, "y": 40 }, { "t": 4, "y": 80 }],
16
+ "samples": [{ "time": 1, "expect": { "y": 20 } }, { "time": 3, "expect": { "y": 60 } }] },
17
+ { "name": "last frame before the end holds to the base", "duration": 4,
18
+ "keyframes": [{ "t": 0, "x": 10 }, { "t": 2, "x": 30 }],
19
+ "samples": [{ "time": 3, "expect": { "x": 15 } }] },
20
+ { "name": "opacity only in some frames", "duration": 2,
21
+ "keyframes": [{ "t": 0, "x": 0 }, { "t": 1, "x": 10, "o": 0 }, { "t": 2, "x": 20 }],
22
+ "samples": [{ "time": 0.5, "expect": { "o": 0.5, "x": 5 } }, { "time": 1.5, "expect": { "o": 0.5 } }] },
23
+ { "name": "opacity above 1 is returned unclamped", "duration": 1,
24
+ "keyframes": [{ "t": 0, "o": 1.5 }, { "t": 1, "o": 0.5 }],
25
+ "samples": [{ "time": 0, "expect": { "o": 1.5 } }, { "time": 0.5, "expect": { "o": 1 } }] },
26
+ { "name": "blur interpolates from none", "duration": 1,
27
+ "keyframes": [{ "t": 0 }, { "t": 1, "b": 8 }],
28
+ "samples": [{ "time": 0.5, "expect": { "b": 4 } }] },
29
+ { "name": "time past the duration clamps", "duration": 1,
30
+ "keyframes": [{ "t": 0, "x": 0 }, { "t": 1, "x": 5 }],
31
+ "samples": [{ "time": 7, "expect": { "x": 5 } }] }
32
+ ]
package/keys.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "keys": [
3
+ {
4
+ "kid": "v1",
5
+ "jwk": {
6
+ "kty": "EC",
7
+ "crv": "P-256",
8
+ "x": "5Qavr4M_npVognquI5k5D9K8wcXBXM9Z0mZHjqyehAs",
9
+ "y": "oh7rz5Q7SlZT_ms2buyOw0bPX77QsXimc0X92Ymj2_o"
10
+ }
11
+ },
12
+ {
13
+ "kid": "v2",
14
+ "jwk": {
15
+ "kty": "EC",
16
+ "crv": "P-256",
17
+ "x": "pRSLtFHe9p8sR8jyqP5eoaBGbHdJgjjrdClda2lNp4A",
18
+ "y": "oopYYhgja8m2iAlSMPigeWw-F72KJLNCRFQzlyWdt2I"
19
+ }
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,34 @@
1
+ [
2
+ { "name": "two marks", "text": "a {hl}b{/hl} c {u}d{/u}", "known": ["hl", "u"], "valid": true,
3
+ "runs": [{ "text": "a " }, { "text": "b", "mark": "hl" }, { "text": " c " }, { "text": "d", "mark": "u" }], "plain": "a b c d" },
4
+ { "name": "escaped braces", "text": "x {{hl}} y }}", "known": ["hl"], "valid": true,
5
+ "runs": [{ "text": "x {hl} y }" }], "plain": "x {hl} y }" },
6
+ { "name": "escaped braces inside a mark", "text": "{hl}a {{b}}{/hl}", "known": ["hl"], "valid": true,
7
+ "runs": [{ "text": "a {b}", "mark": "hl" }], "plain": "a {b}" },
8
+ { "name": "unknown name is text", "text": "a {xx}b{/xx}", "known": ["hl"], "valid": false,
9
+ "runs": [{ "text": "a {xx}b{/xx}" }], "plain": "a {xx}b{/xx}" },
10
+ { "name": "unclosed runs to the end", "text": "a {hl}b c", "known": ["hl"], "valid": false,
11
+ "runs": [{ "text": "a " }, { "text": "b c", "mark": "hl" }], "plain": "a b c" },
12
+ { "name": "nested is not allowed", "text": "{hl}a {u}b{/u}{/hl}", "known": ["hl", "u"], "valid": false,
13
+ "runs": [{ "text": "a {u}b{/u}", "mark": "hl" }] },
14
+ { "name": "nested, and the inner one is the only one closed", "text": "{hl}a {u}b{/u}", "known": ["hl", "u"], "valid": false },
15
+ { "name": "overlapping is not allowed", "text": "{hl}a {u}b{/hl}c{/u}", "known": ["hl", "u"], "valid": false },
16
+ { "name": "close without open", "text": "a{/hl}b", "known": ["hl"], "valid": false,
17
+ "runs": [{ "text": "a{/hl}b" }], "plain": "a{/hl}b" },
18
+ { "name": "lone closing brace", "text": "a } b", "known": [], "valid": false },
19
+ { "name": "lone opening brace", "text": "a { b", "known": [], "valid": false },
20
+ { "name": "empty", "text": "", "known": ["hl"], "valid": true, "runs": [], "plain": "" },
21
+ { "name": "mark spans a line break", "text": "a {hl}b\nc{/hl} d", "known": ["hl"], "valid": true,
22
+ "runs": [{ "text": "a " }, { "text": "b\nc", "mark": "hl" }, { "text": " d" }], "plain": "a b\nc d" },
23
+ { "name": "es", "text": "Te irás. {hl}No te llevarás nada.{/hl}", "known": ["hl"], "valid": true, "plain": "Te irás. No te llevarás nada." },
24
+ { "name": "en", "text": "You will leave. {hl}You will take nothing.{/hl}", "known": ["hl"], "valid": true },
25
+ { "name": "pt", "text": "Você partirá. {hl}Não levará nada.{/hl}", "known": ["hl"], "valid": true },
26
+ { "name": "fr", "text": "Tu partiras. {hl}Tu n'emporteras rien.{/hl}", "known": ["hl"], "valid": true },
27
+ { "name": "de", "text": "Du wirst gehen. {hl}Du nimmst nichts mit.{/hl}", "known": ["hl"], "valid": true },
28
+ { "name": "it", "text": "Te ne andrai. {hl}Non porterai nulla.{/hl}", "known": ["hl"], "valid": true },
29
+ { "name": "ru", "text": "Ты уйдёшь. {hl}Ты ничего не возьмёшь.{/hl}", "known": ["hl"], "valid": true },
30
+ { "name": "ko", "text": "당신은 떠날 것입니다. {hl}아무것도 가져가지 못합니다.{/hl}", "known": ["hl"], "valid": true },
31
+ { "name": "ja", "text": "あなたは去る。{hl}何も持っていけない。{/hl}", "known": ["hl"], "valid": true, "plain": "あなたは去る。何も持っていけない。" },
32
+ { "name": "ar", "text": "سترحل. {hl}لن تأخذ شيئًا.{/hl}", "known": ["hl"], "valid": true },
33
+ { "name": "tr", "text": "Gideceksin. {hl}Hiçbir şey götüremezsin.{/hl}", "known": ["hl"], "valid": true }
34
+ ]
package/package.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
2
  "name": "@oim-media/spec",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.27.9",
4
+ "description": "OIM format contract: JSON Schema, normative specification and conformance vectors that every OIM player must pass.",
5
+ "keywords": [
6
+ "oim",
7
+ "specification",
8
+ "json-schema",
9
+ "conformance"
10
+ ],
11
+ "author": "Xue Studios LLC",
12
+ "homepage": "https://oim.media",
13
+ "license": "Apache-2.0",
14
+ "files": [
15
+ "schema",
16
+ "vectors",
17
+ "BINARY_SPEC.md",
18
+ "CANONICAL_SPEC.md",
19
+ "README.md",
20
+ "marks-cases.json",
21
+ "canonical-cases.json",
22
+ "keyframe-cases.json",
23
+ "action-cases.json",
24
+ "pattern-cases.json",
25
+ "text-effect-cases.json",
26
+ "artistic-text-cases.json",
27
+ "keys.json",
28
+ "tools/parity.mjs",
29
+ "tools/parity-core.mjs",
30
+ "LICENSE",
31
+ "NOTICE"
32
+ ],
33
+ "publishConfig": {
34
+ "access": "public",
35
+ "provenance": true
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/oim-media/oim.git",
40
+ "directory": "packages/spec"
41
+ },
42
+ "devDependencies": {
43
+ "playwright": "1.64.1"
44
+ },
45
+ "scripts": {
46
+ "parity": "node tools/parity.mjs",
47
+ "goldens": "node tools/render-web-goldens.mjs vectors/golden"
48
+ }
6
49
  }
@@ -0,0 +1,552 @@
1
+ [
2
+ {
3
+ "name": "dots default",
4
+ "options": {
5
+ "type": "dots",
6
+ "bgColor": "transparent",
7
+ "fgColor": "#a3e635"
8
+ },
9
+ "figures": [
10
+ {
11
+ "x": 31.640579509257805,
12
+ "y": 7.428994520732886,
13
+ "scale": 0.6920285136174243,
14
+ "rotation": 170.4699269194316,
15
+ "color": "#a3e635"
16
+ },
17
+ {
18
+ "x": 31.640579509257805,
19
+ "y": 167.42899452073289,
20
+ "scale": 0.6920285136174243,
21
+ "rotation": 170.4699269194316,
22
+ "color": "#a3e635"
23
+ },
24
+ {
25
+ "x": 66.33642863971545,
26
+ "y": 18.070434694736832,
27
+ "scale": 0.6577488694741078,
28
+ "rotation": 5.1143061896721065,
29
+ "color": "#a3e635"
30
+ },
31
+ {
32
+ "x": 66.33642863971545,
33
+ "y": 178.07043469473683,
34
+ "scale": 0.6577488694741078,
35
+ "rotation": 5.1143061896721065,
36
+ "color": "#a3e635"
37
+ },
38
+ {
39
+ "x": 109.76741233931534,
40
+ "y": 18.541620610449172,
41
+ "scale": 0.8005249221274426,
42
+ "rotation": 39.9007896312105,
43
+ "color": "#a3e635"
44
+ },
45
+ {
46
+ "x": 109.76741233931534,
47
+ "y": 178.54162061044917,
48
+ "scale": 0.8005249221274426,
49
+ "rotation": 39.9007896312105,
50
+ "color": "#a3e635"
51
+ },
52
+ {
53
+ "x": 135.44124805252977,
54
+ "y": 29.048064944900034,
55
+ "scale": 0.6388916346963924,
56
+ "rotation": 155.41787448912146,
57
+ "color": "#a3e635"
58
+ },
59
+ {
60
+ "x": -24.558751947470228,
61
+ "y": 29.048064944900034,
62
+ "scale": 0.6388916346963924,
63
+ "rotation": 155.41787448912146,
64
+ "color": "#a3e635"
65
+ },
66
+ {
67
+ "x": 135.44124805252977,
68
+ "y": 189.04806494490003,
69
+ "scale": 0.6388916346963924,
70
+ "rotation": 155.41787448912146,
71
+ "color": "#a3e635"
72
+ },
73
+ {
74
+ "x": -24.558751947470228,
75
+ "y": 189.04806494490003,
76
+ "scale": 0.6388916346963924,
77
+ "rotation": 155.41787448912146,
78
+ "color": "#a3e635"
79
+ },
80
+ {
81
+ "x": 27.79208616323558,
82
+ "y": 45.80822399319004,
83
+ "scale": 0.6648510960512795,
84
+ "rotation": 116.97459686547518,
85
+ "color": "#a3e635"
86
+ },
87
+ {
88
+ "x": 187.79208616323558,
89
+ "y": 45.80822399319004,
90
+ "scale": 0.6648510960512795,
91
+ "rotation": 116.97459686547518,
92
+ "color": "#a3e635"
93
+ },
94
+ {
95
+ "x": 55.59525430009671,
96
+ "y": 48.40194172647443,
97
+ "scale": 0.7348329003376421,
98
+ "rotation": 125.03035020359675,
99
+ "color": "#a3e635"
100
+ },
101
+ {
102
+ "x": 98.72296230819302,
103
+ "y": 54.827481292159064,
104
+ "scale": 0.6521889974637816,
105
+ "rotation": 159.44239994838426,
106
+ "color": "#a3e635"
107
+ },
108
+ {
109
+ "x": 152.43389150462463,
110
+ "y": 45.82020972134444,
111
+ "scale": 0.6787853330095459,
112
+ "rotation": 58.77671187692613,
113
+ "color": "#a3e635"
114
+ },
115
+ {
116
+ "x": -7.566108495375374,
117
+ "y": 45.82020972134444,
118
+ "scale": 0.6787853330095459,
119
+ "rotation": 58.77671187692613,
120
+ "color": "#a3e635"
121
+ },
122
+ {
123
+ "x": 30.809794775996124,
124
+ "y": 97.61341099198034,
125
+ "scale": 0.8570516260750083,
126
+ "rotation": 135.39938071882716,
127
+ "color": "#a3e635"
128
+ },
129
+ {
130
+ "x": 69.62441246831077,
131
+ "y": 98.38527114625776,
132
+ "scale": 0.690812400623176,
133
+ "rotation": 159.19684622977002,
134
+ "color": "#a3e635"
135
+ },
136
+ {
137
+ "x": 107.39151739458521,
138
+ "y": 114.48871916454664,
139
+ "scale": 0.6880793327637549,
140
+ "rotation": 99.48596844626081,
141
+ "color": "#a3e635"
142
+ },
143
+ {
144
+ "x": 129.12592895549096,
145
+ "y": 88.23589647521658,
146
+ "scale": 0.6450845512657111,
147
+ "rotation": 122.43057033945661,
148
+ "color": "#a3e635"
149
+ },
150
+ {
151
+ "x": 26.88496599791506,
152
+ "y": 129.93122335778025,
153
+ "scale": 0.8605701509223764,
154
+ "rotation": 159.44330657702267,
155
+ "color": "#a3e635"
156
+ },
157
+ {
158
+ "x": 186.88496599791506,
159
+ "y": 129.93122335778025,
160
+ "scale": 0.8605701509223764,
161
+ "rotation": 159.44330657702267,
162
+ "color": "#a3e635"
163
+ },
164
+ {
165
+ "x": 52.996544667421404,
166
+ "y": 129.08992587577814,
167
+ "scale": 0.8001457246818746,
168
+ "rotation": 4.0112881603999995,
169
+ "color": "#a3e635"
170
+ },
171
+ {
172
+ "x": 94.27632498640378,
173
+ "y": 131.7893722154986,
174
+ "scale": 0.8118124868190535,
175
+ "rotation": 108.86179830676156,
176
+ "color": "#a3e635"
177
+ },
178
+ {
179
+ "x": 94.27632498640378,
180
+ "y": -28.210627784501412,
181
+ "scale": 0.8118124868190535,
182
+ "rotation": 108.86179830676156,
183
+ "color": "#a3e635"
184
+ }
185
+ ]
186
+ },
187
+ {
188
+ "name": "stars scaled, few, dispersed",
189
+ "options": {
190
+ "type": "stars",
191
+ "bgColor": "#000000",
192
+ "fgColor": "#ffffff",
193
+ "scale": 1.5,
194
+ "count": 5,
195
+ "dispersion": 0.9
196
+ },
197
+ "figures": [
198
+ {
199
+ "x": 54.6040574888854,
200
+ "y": 5,
201
+ "scale": 0.9084769867670457,
202
+ "rotation": 306.8458684549769,
203
+ "color": "#ffffff"
204
+ },
205
+ {
206
+ "x": 54.6040574888854,
207
+ "y": 165,
208
+ "scale": 0.9084769867670457,
209
+ "rotation": 306.8458684549769,
210
+ "color": "#ffffff"
211
+ },
212
+ {
213
+ "x": 95.20742873531708,
214
+ "y": 22.035709934035065,
215
+ "scale": 0.8159219475800911,
216
+ "rotation": 9.205751141409792,
217
+ "color": "#ffffff"
218
+ },
219
+ {
220
+ "x": 95.20742873531708,
221
+ "y": 182.03570993403505,
222
+ "scale": 0.8159219475800911,
223
+ "rotation": 9.205751141409792,
224
+ "color": "#ffffff"
225
+ },
226
+ {
227
+ "x": 155,
228
+ "y": 23.16655613174468,
229
+ "scale": 1.2014172897440951,
230
+ "rotation": 71.8214213361789,
231
+ "color": "#ffffff"
232
+ },
233
+ {
234
+ "x": -5,
235
+ "y": 23.16655613174468,
236
+ "scale": 1.2014172897440951,
237
+ "rotation": 71.8214213361789,
238
+ "color": "#ffffff"
239
+ },
240
+ {
241
+ "x": 155,
242
+ "y": 183.16655613174467,
243
+ "scale": 1.2014172897440951,
244
+ "rotation": 71.8214213361789,
245
+ "color": "#ffffff"
246
+ },
247
+ {
248
+ "x": -5,
249
+ "y": 183.16655613174467,
250
+ "scale": 1.2014172897440951,
251
+ "rotation": 71.8214213361789,
252
+ "color": "#ffffff"
253
+ },
254
+ {
255
+ "x": 15.72566199273812,
256
+ "y": 101.71535586776008,
257
+ "scale": 0.7650074136802597,
258
+ "rotation": 279.7521740804186,
259
+ "color": "#ffffff"
260
+ },
261
+ {
262
+ "x": 175.7256619927381,
263
+ "y": 101.71535586776008,
264
+ "scale": 0.7650074136802597,
265
+ "rotation": 279.7521740804186,
266
+ "color": "#ffffff"
267
+ },
268
+ {
269
+ "x": 98.7010067917654,
270
+ "y": 45.93973758365609,
271
+ "scale": 0.8350979593384545,
272
+ "rotation": 210.55427435785532,
273
+ "color": "#ffffff"
274
+ }
275
+ ]
276
+ },
277
+ {
278
+ "name": "two figures, two colours",
279
+ "options": {
280
+ "type": "clouds",
281
+ "bgColor": "transparent",
282
+ "fgColor": "#111111",
283
+ "svgs": [
284
+ "heart",
285
+ "waves"
286
+ ],
287
+ "colors": [
288
+ "#ff0000",
289
+ "#00ff00"
290
+ ],
291
+ "sizes": [
292
+ 1,
293
+ 0.5
294
+ ]
295
+ },
296
+ "figures": [
297
+ {
298
+ "x": 31.640579509257805,
299
+ "y": 7.428994520732886,
300
+ "scale": 0.6920285136174243,
301
+ "rotation": 170.4699269194316,
302
+ "color": "#ff0000"
303
+ },
304
+ {
305
+ "x": 31.640579509257805,
306
+ "y": 167.42899452073289,
307
+ "scale": 0.6920285136174243,
308
+ "rotation": 170.4699269194316,
309
+ "color": "#ff0000"
310
+ },
311
+ {
312
+ "x": 66.33642863971545,
313
+ "y": 18.070434694736832,
314
+ "scale": 0.3288744347370539,
315
+ "rotation": 5.1143061896721065,
316
+ "color": "#00ff00"
317
+ },
318
+ {
319
+ "x": 66.33642863971545,
320
+ "y": 178.07043469473683,
321
+ "scale": 0.3288744347370539,
322
+ "rotation": 5.1143061896721065,
323
+ "color": "#00ff00"
324
+ },
325
+ {
326
+ "x": 109.76741233931534,
327
+ "y": 18.541620610449172,
328
+ "scale": 0.8005249221274426,
329
+ "rotation": 39.9007896312105,
330
+ "color": "#ff0000"
331
+ },
332
+ {
333
+ "x": 109.76741233931534,
334
+ "y": 178.54162061044917,
335
+ "scale": 0.8005249221274426,
336
+ "rotation": 39.9007896312105,
337
+ "color": "#ff0000"
338
+ },
339
+ {
340
+ "x": 135.44124805252977,
341
+ "y": 29.048064944900034,
342
+ "scale": 0.3194458173481962,
343
+ "rotation": 155.41787448912146,
344
+ "color": "#00ff00"
345
+ },
346
+ {
347
+ "x": -24.558751947470228,
348
+ "y": 29.048064944900034,
349
+ "scale": 0.3194458173481962,
350
+ "rotation": 155.41787448912146,
351
+ "color": "#00ff00"
352
+ },
353
+ {
354
+ "x": 135.44124805252977,
355
+ "y": 189.04806494490003,
356
+ "scale": 0.3194458173481962,
357
+ "rotation": 155.41787448912146,
358
+ "color": "#00ff00"
359
+ },
360
+ {
361
+ "x": -24.558751947470228,
362
+ "y": 189.04806494490003,
363
+ "scale": 0.3194458173481962,
364
+ "rotation": 155.41787448912146,
365
+ "color": "#00ff00"
366
+ },
367
+ {
368
+ "x": 27.79208616323558,
369
+ "y": 45.80822399319004,
370
+ "scale": 0.6648510960512795,
371
+ "rotation": 116.97459686547518,
372
+ "color": "#ff0000"
373
+ },
374
+ {
375
+ "x": 187.79208616323558,
376
+ "y": 45.80822399319004,
377
+ "scale": 0.6648510960512795,
378
+ "rotation": 116.97459686547518,
379
+ "color": "#ff0000"
380
+ },
381
+ {
382
+ "x": 55.59525430009671,
383
+ "y": 48.40194172647443,
384
+ "scale": 0.3674164501688211,
385
+ "rotation": 125.03035020359675,
386
+ "color": "#00ff00"
387
+ },
388
+ {
389
+ "x": 98.72296230819302,
390
+ "y": 54.827481292159064,
391
+ "scale": 0.6521889974637816,
392
+ "rotation": 159.44239994838426,
393
+ "color": "#ff0000"
394
+ },
395
+ {
396
+ "x": 152.43389150462463,
397
+ "y": 45.82020972134444,
398
+ "scale": 0.33939266650477296,
399
+ "rotation": 58.77671187692613,
400
+ "color": "#00ff00"
401
+ },
402
+ {
403
+ "x": -7.566108495375374,
404
+ "y": 45.82020972134444,
405
+ "scale": 0.33939266650477296,
406
+ "rotation": 58.77671187692613,
407
+ "color": "#00ff00"
408
+ },
409
+ {
410
+ "x": 30.809794775996124,
411
+ "y": 97.61341099198034,
412
+ "scale": 0.8570516260750083,
413
+ "rotation": 135.39938071882716,
414
+ "color": "#ff0000"
415
+ },
416
+ {
417
+ "x": 69.62441246831077,
418
+ "y": 98.38527114625776,
419
+ "scale": 0.345406200311588,
420
+ "rotation": 159.19684622977002,
421
+ "color": "#00ff00"
422
+ },
423
+ {
424
+ "x": 107.39151739458521,
425
+ "y": 114.48871916454664,
426
+ "scale": 0.6880793327637549,
427
+ "rotation": 99.48596844626081,
428
+ "color": "#ff0000"
429
+ },
430
+ {
431
+ "x": 129.12592895549096,
432
+ "y": 88.23589647521658,
433
+ "scale": 0.32254227563285554,
434
+ "rotation": 122.43057033945661,
435
+ "color": "#00ff00"
436
+ },
437
+ {
438
+ "x": 26.88496599791506,
439
+ "y": 129.93122335778025,
440
+ "scale": 0.8605701509223764,
441
+ "rotation": 159.44330657702267,
442
+ "color": "#ff0000"
443
+ },
444
+ {
445
+ "x": 186.88496599791506,
446
+ "y": 129.93122335778025,
447
+ "scale": 0.8605701509223764,
448
+ "rotation": 159.44330657702267,
449
+ "color": "#ff0000"
450
+ },
451
+ {
452
+ "x": 52.996544667421404,
453
+ "y": 129.08992587577814,
454
+ "scale": 0.4000728623409373,
455
+ "rotation": 4.0112881603999995,
456
+ "color": "#00ff00"
457
+ },
458
+ {
459
+ "x": 94.27632498640378,
460
+ "y": 131.7893722154986,
461
+ "scale": 0.8118124868190535,
462
+ "rotation": 108.86179830676156,
463
+ "color": "#ff0000"
464
+ },
465
+ {
466
+ "x": 94.27632498640378,
467
+ "y": -28.210627784501412,
468
+ "scale": 0.8118124868190535,
469
+ "rotation": 108.86179830676156,
470
+ "color": "#ff0000"
471
+ }
472
+ ]
473
+ },
474
+ {
475
+ "name": "per-figure counts",
476
+ "options": {
477
+ "type": "dots",
478
+ "bgColor": "transparent",
479
+ "fgColor": "#111111",
480
+ "svgs": [
481
+ "dots",
482
+ "bolt"
483
+ ],
484
+ "counts": [
485
+ 4,
486
+ 2
487
+ ],
488
+ "dispersions": [
489
+ 0,
490
+ 1
491
+ ]
492
+ },
493
+ "figures": [
494
+ {
495
+ "x": 40,
496
+ "y": 40,
497
+ "scale": 0.8,
498
+ "rotation": 0,
499
+ "color": "#111111"
500
+ },
501
+ {
502
+ "x": 120,
503
+ "y": 40,
504
+ "scale": 0.8,
505
+ "rotation": 0,
506
+ "color": "#111111"
507
+ },
508
+ {
509
+ "x": 40,
510
+ "y": 120,
511
+ "scale": 0.8,
512
+ "rotation": 0,
513
+ "color": "#111111"
514
+ },
515
+ {
516
+ "x": 120,
517
+ "y": 120,
518
+ "scale": 0.8,
519
+ "rotation": 0,
520
+ "color": "#111111"
521
+ },
522
+ {
523
+ "x": 38.49449291089513,
524
+ "y": 5,
525
+ "scale": 0.46665190606800033,
526
+ "rotation": 303.0068084979939,
527
+ "color": "#111111"
528
+ },
529
+ {
530
+ "x": 38.49449291089513,
531
+ "y": 165,
532
+ "scale": 0.46665190606800033,
533
+ "rotation": 303.0068084979939,
534
+ "color": "#111111"
535
+ },
536
+ {
537
+ "x": 129.47295370373467,
538
+ "y": 5,
539
+ "scale": 0.93044666232895,
540
+ "rotation": 310.7663523314113,
541
+ "color": "#111111"
542
+ },
543
+ {
544
+ "x": 129.47295370373467,
545
+ "y": 165,
546
+ "scale": 0.93044666232895,
547
+ "rotation": 310.7663523314113,
548
+ "color": "#111111"
549
+ }
550
+ ]
551
+ }
552
+ ]