onejs-core 0.3.5

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 (63) hide show
  1. package/.gitattributes +2 -0
  2. package/.github/workflows/jsr.yml +19 -0
  3. package/.prettierrc +5 -0
  4. package/3rdparty/preact/LICENSE +21 -0
  5. package/3rdparty/preact/clone-element.ts +45 -0
  6. package/3rdparty/preact/compat/Children.ts +21 -0
  7. package/3rdparty/preact/compat/forwardRef.ts +49 -0
  8. package/3rdparty/preact/compat/index.ts +3 -0
  9. package/3rdparty/preact/compat/memo.ts +34 -0
  10. package/3rdparty/preact/compat/util.ts +38 -0
  11. package/3rdparty/preact/component.ts +235 -0
  12. package/3rdparty/preact/constants.ts +3 -0
  13. package/3rdparty/preact/create-context.ts +71 -0
  14. package/3rdparty/preact/create-element.ts +98 -0
  15. package/3rdparty/preact/diff/catch-error.ts +40 -0
  16. package/3rdparty/preact/diff/children.ts +355 -0
  17. package/3rdparty/preact/diff/index.ts +563 -0
  18. package/3rdparty/preact/diff/props.ts +174 -0
  19. package/3rdparty/preact/hooks/index.ts +536 -0
  20. package/3rdparty/preact/hooks/internal.d.ts +85 -0
  21. package/3rdparty/preact/hooks.d.ts +145 -0
  22. package/3rdparty/preact/index.ts +13 -0
  23. package/3rdparty/preact/internal.d.ts +155 -0
  24. package/3rdparty/preact/jsx-runtime/index.ts +80 -0
  25. package/3rdparty/preact/jsx.d.ts +1008 -0
  26. package/3rdparty/preact/options.ts +16 -0
  27. package/3rdparty/preact/preact.d.ts +317 -0
  28. package/3rdparty/preact/render.ts +76 -0
  29. package/3rdparty/preact/signals/index.ts +443 -0
  30. package/3rdparty/preact/signals/internal.d.ts +36 -0
  31. package/3rdparty/preact/signals-core/index.ts +663 -0
  32. package/3rdparty/preact/style.d.ts +205 -0
  33. package/3rdparty/preact/util.ts +29 -0
  34. package/@DO_NOT_CHANGE.txt +3 -0
  35. package/README.md +33 -0
  36. package/definitions/app.d.ts +52048 -0
  37. package/definitions/augments.d.ts +16 -0
  38. package/definitions/globals.d.ts +34 -0
  39. package/definitions/index.d.ts +9 -0
  40. package/definitions/jsx.d.ts +517 -0
  41. package/definitions/modules.d.ts +29 -0
  42. package/definitions/onejs.d.ts +164 -0
  43. package/definitions/preact.jsx.d.ts +7 -0
  44. package/definitions/proto-overrides.d.ts +13 -0
  45. package/definitions/puerts.d.ts +31 -0
  46. package/definitions/unity-engine.d.ts +23 -0
  47. package/hooks/eventful.ts +56 -0
  48. package/import-transform.mjs +42 -0
  49. package/index.ts +44 -0
  50. package/jsr.json +10 -0
  51. package/onejs-tw-config.cjs +188 -0
  52. package/package.json +9 -0
  53. package/preloads/inject.ts +44 -0
  54. package/styling/index.tsx +80 -0
  55. package/styling/utils/generateAlphabeticName.ts +21 -0
  56. package/styling/utils/generateComponentId.ts +6 -0
  57. package/styling/utils/hash.ts +46 -0
  58. package/switch.cjs +185 -0
  59. package/uss-transform-plugin.cjs +83 -0
  60. package/utils/color-palettes.ts +3 -0
  61. package/utils/color-parser.ts +249 -0
  62. package/utils/float-parser.ts +31 -0
  63. package/utils/index.ts +12 -0
@@ -0,0 +1,80 @@
1
+ import { h } from "preact"
2
+ import flatten from "css-flatten"
3
+ import { forwardRef } from "preact/compat"
4
+ import generateComponentId from "./utils/generateComponentId"
5
+
6
+ export function hashAndAddRuntimeUSS(style: string) {
7
+ let compId = generateComponentId(style)
8
+ style = `.${compId} {${style}}`
9
+ style = flatten(style)
10
+ document.addRuntimeUSS(style)
11
+
12
+ return compId
13
+ }
14
+
15
+ function _processTemplate(props, strings: TemplateStringsArray, values: any[]) {
16
+ // ref: https://medium.com/styled-components/how-styled-components-works-618a69970421
17
+ let style = values.reduce((result, expr, index) => {
18
+ let value = typeof expr === "function" ? expr(props) : expr
19
+ if (typeof value === "function")
20
+ value = value(props)
21
+
22
+ return result + (value ? value : "") + strings[index + 1]
23
+ }, strings[0])
24
+ return style as string
25
+ }
26
+
27
+ export function styled<T extends keyof h.JSX.IntrinsicElements>(Tag: T | ((props?) => h.JSX.Element)) {
28
+ const AnyTag = Tag as any
29
+
30
+ const tag = function (strings: TemplateStringsArray, ...values) {
31
+ return forwardRef((props, ref) => {
32
+ let style = _processTemplate(props, strings, values)
33
+ let compId = hashAndAddRuntimeUSS(style)
34
+ return <AnyTag ref={ref} class={compId} {...props}></AnyTag>
35
+ }) as (props: h.JSX.IntrinsicElements[T], ref: any) => h.JSX.Element
36
+ }
37
+
38
+ tag.attrs = (func: (props: any) => ({})) => {
39
+ return function (strings: TemplateStringsArray, ...values) {
40
+ return (props) => {
41
+ let defaultProps = func(props)
42
+ let condensedProps = Object.assign({}, defaultProps, props)
43
+ let style = _processTemplate(condensedProps, strings, values)
44
+ let compId = hashAndAddRuntimeUSS(style)
45
+
46
+ return <AnyTag class={compId} {...condensedProps}></AnyTag>
47
+ }
48
+ }
49
+ }
50
+
51
+ return tag
52
+ }
53
+
54
+ styled.div = styled("div")
55
+ styled.button = styled("button")
56
+ styled.textfield = styled("textfield")
57
+
58
+ export const uss = function (strings: TemplateStringsArray, ...values) {
59
+ return (props) => {
60
+ return _processTemplate(props, strings, values)
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Similar to the Emotion api, this function takes a template string and returns
66
+ * a class name that can be used to style an element.
67
+ * @param strings
68
+ * @param values
69
+ * @returns
70
+ */
71
+ export const emo = function (strings: TemplateStringsArray, ...values: any[]): string {
72
+ let style = values.reduce((result, expr, index) => {
73
+ const value = expr
74
+ return result + (value ? value : "") + strings[index + 1]
75
+ }, strings[0])
76
+
77
+ return hashAndAddRuntimeUSS(style)
78
+ }
79
+
80
+ export type CompType<T,K> = (props: K | T, ref: any) => h.JSX.Element
@@ -0,0 +1,21 @@
1
+ const AD_REPLACER_R = /(a)(d)/gi
2
+
3
+ /* This is the "capacity" of our alphabet i.e. 2x26 for all letters plus their capitalised
4
+ * counterparts */
5
+ const charsLength = 52
6
+
7
+ /* start at 75 for 'a' until 'z' (25) and then start at 65 for capitalised letters */
8
+ const getAlphabeticChar = (code: number) => String.fromCharCode(code + (code > 25 ? 39 : 97));
9
+
10
+ /* input a number, usually a hash and convert it to base-52 */
11
+ export default function generateAlphabeticName(code: number) {
12
+ let name = ''
13
+ let x
14
+
15
+ /* get a char and divide by alphabet-length */
16
+ for (x = Math.abs(code); x > charsLength; x = (x / charsLength) | 0) {
17
+ name = getAlphabeticChar(x % charsLength) + name
18
+ }
19
+
20
+ return (getAlphabeticChar(x % charsLength) + name).replace(AD_REPLACER_R, '$1-$2')
21
+ }
@@ -0,0 +1,6 @@
1
+ import generateAlphabeticName from './generateAlphabeticName'
2
+ import { hash } from './hash'
3
+
4
+ export default function generateComponentId(str: string) {
5
+ return generateAlphabeticName(hash(str) >>> 0)
6
+ }
@@ -0,0 +1,46 @@
1
+ export const SEED = 5381;
2
+
3
+ // When we have separate strings it's useful to run a progressive
4
+ // version of djb2 where we pretend that we're still looping over
5
+ // the same string
6
+ export const phash = (h: number, x: string) => {
7
+ let i = x.length;
8
+
9
+ while (i) {
10
+ h = (h * 33) ^ x.charCodeAt(--i);
11
+ }
12
+
13
+ return h;
14
+ };
15
+
16
+ // This is a djb2 hashing function
17
+ export const hash = (x: string) => {
18
+ return phash(SEED, x);
19
+ };
20
+
21
+ const AD_REPLACER_R = /(a)(d)/gi
22
+
23
+ /* This is the "capacity" of our alphabet i.e. 2x26 for all letters plus their capitalised
24
+ * counterparts */
25
+ const charsLength = 52
26
+
27
+ /* start at 75 for 'a' until 'z' (25) and then start at 65 for capitalised letters */
28
+ const getAlphabeticChar = (code: number) => String.fromCharCode(code + (code > 25 ? 39 : 97));
29
+
30
+ /* input a number, usually a hash and convert it to base-52 */
31
+ export function generateAlphabeticName(code: number) {
32
+ let name = ''
33
+ let x
34
+
35
+ /* get a char and divide by alphabet-length */
36
+ for (x = Math.abs(code); x > charsLength; x = (x / charsLength) | 0) {
37
+ name = getAlphabeticChar(x % charsLength) + name
38
+ }
39
+
40
+ return (getAlphabeticChar(x % charsLength) + name).replace(AD_REPLACER_R, '$1-$2')
41
+ }
42
+
43
+ export default function generateComponentId(str: string) {
44
+ return generateAlphabeticName(hash(str) >>> 0)
45
+ }
46
+
package/switch.cjs ADDED
@@ -0,0 +1,185 @@
1
+ const fs = require('fs')
2
+ const tar = require('tar')
3
+ const url = require('url')
4
+ const path = require('path')
5
+ const fse = require('fs-extra')
6
+ const { rimraf } = require('rimraf')
7
+
8
+ const fsp = fs.promises
9
+
10
+ const backends = [
11
+ { name: "QuickJS", tgzUrl: "https://github.com/Tencent/puerts/releases/download/Unity_v2.1.0/PuerTS_Quickjs_2.1.0.tgz" },
12
+ { name: "V8", tgzUrl: "https://github.com/Tencent/puerts/releases/download/Unity_v2.1.0/PuerTS_V8_2.1.0.tgz" },
13
+ { name: "NodeJS", tgzUrl: "https://github.com/Tencent/puerts/releases/download/Unity_v2.1.0/PuerTS_Nodejs_2.1.0.tgz" }
14
+ ]
15
+
16
+ const args = process.argv.slice(2)
17
+
18
+ if (args.length > 0 && args[0].toLowerCase() == "clear") {
19
+ for (const backend of backends) {
20
+ const filename = getFilenameFromUrl(backend.tgzUrl)
21
+ const outputDir = "./tmp"
22
+ const downloadedPath = path.join(outputDir, filename)
23
+ if (fs.existsSync(downloadedPath)) {
24
+ fs.unlinkSync(downloadedPath)
25
+ console.log(`Deleted ${downloadedPath}`)
26
+ }
27
+ }
28
+ } else if (args.length > 0 && ["quickjs", "v8", "nodejs"].includes(args[0].toLowerCase())) {
29
+ const backend = backends.find(b => b.name.toLowerCase() === args[0])
30
+ const outputDir = "./tmp"
31
+ Process(backend, outputDir)
32
+ } else {
33
+ console.log("Usage: npm run switch <quickjs|v8|nodejs|clear>\n")
34
+ console.log(" quickjs: Switch to QuickJS backend")
35
+ console.log(" v8: Switch to V8 backend")
36
+ console.log(" nodejs: Switch to NodeJS backend")
37
+ console.log(" clear: Clear all downloaded .tgz files\n")
38
+ }
39
+
40
+ async function Process(backend, outputDir) {
41
+ try {
42
+ // Download
43
+ const downloadedPath = await downloadFile(backend.tgzUrl, outputDir)
44
+
45
+ // Extraction
46
+ const upmDir = path.join(outputDir, "upm")
47
+ if (fs.existsSync(upmDir)) {
48
+ await rimraf(upmDir)
49
+ }
50
+ await extractTgz(downloadedPath, outputDir)
51
+
52
+ // Safe keep asmdef files
53
+ const onejsDir = getOneJSUnityDir()
54
+ const a = path.join(onejsDir, 'Puerts/Editor/com.tencent.puerts.core.Editor.asmdef')
55
+ const b = path.join(upmDir, 'Editor/com.tencent.puerts.core.Editor.asmdef')
56
+ const c = path.join(onejsDir, 'Puerts/Runtime/com.tencent.puerts.core.asmdef')
57
+ const d = path.join(upmDir, 'Runtime/com.tencent.puerts.core.asmdef')
58
+ await fse.copy(a, b)
59
+ await fse.copy(c, d)
60
+
61
+ // Replace OneJS/Puerts with the new one
62
+ const puertsDir = path.join(onejsDir, "Puerts")
63
+ if (await deleteDirectorySafely(puertsDir)) {
64
+ await fse.copy(upmDir, puertsDir)
65
+ console.log(`Switched to ${backend.name} successfully.`)
66
+ } else {
67
+ console.error("Failed to delete old Puerts directory. Please make sure Unity Editor is not running as it may be using the files. (We cannot reliably replace native plugins while Unity Editor is using them)")
68
+ }
69
+ } catch (err) {
70
+ console.error(`Error: ${err.message}`)
71
+ }
72
+ }
73
+
74
+ // --- Support Functions ---
75
+
76
+ function getOneJSUnityDir() {
77
+ var packageJsonPath = path.join(__dirname, '../package.json')
78
+ var json = require(packageJsonPath)
79
+ return json.onejs.unityPackagePath
80
+ }
81
+
82
+ function ensureDirectoryExistence(filePath) {
83
+ const dirname = path.dirname(filePath);
84
+ if (fs.existsSync(dirname)) {
85
+ return true;
86
+ }
87
+ fs.mkdirSync(dirname, { recursive: true });
88
+ }
89
+
90
+ function getFilenameFromUrl(fileUrl) {
91
+ const parsedUrl = url.parse(fileUrl);
92
+ return path.basename(parsedUrl.pathname);
93
+ }
94
+
95
+ async function downloadFile(fileUrl, outputDir) {
96
+ const filename = getFilenameFromUrl(fileUrl);
97
+ const outputLocationPath = path.join(outputDir, filename);
98
+
99
+ ensureDirectoryExistence(outputLocationPath);
100
+
101
+ // Check if the file already exists
102
+ if (fs.existsSync(outputLocationPath)) {
103
+ console.log(`Local .tgz found: ${outputLocationPath}`);
104
+ return outputLocationPath;
105
+ }
106
+
107
+ console.log(`Downloading ${filename}`);
108
+ const response = await fetch(fileUrl);
109
+
110
+ if (!response.ok) {
111
+ throw new Error(`Failed to fetch ${fileUrl}: ${response.statusText}`);
112
+ }
113
+
114
+ const fileStream = fs.createWriteStream(outputLocationPath);
115
+ for await (const chunk of response.body) {
116
+ fileStream.write(chunk);
117
+ }
118
+
119
+ fileStream.end();
120
+ fileStream.on('finish', () => {
121
+ console.log(`Download completed: ${outputLocationPath}`);
122
+ });
123
+
124
+ return new Promise((resolve, reject) => {
125
+ fileStream.on('close', () => resolve(outputLocationPath));
126
+ fileStream.on('error', reject);
127
+ });
128
+ }
129
+
130
+ async function extractTgz(filePath, outputDir) {
131
+ await tar.x({
132
+ file: filePath,
133
+ cwd: outputDir,
134
+ })
135
+ console.log(`Extraction completed.`);
136
+ }
137
+
138
+
139
+
140
+ async function checkFileInUse(file) {
141
+ try {
142
+ const handle = await fsp.open(file, 'r+');
143
+ await handle.close();
144
+ } catch (err) {
145
+ if (err.code === 'EBUSY' || err.code === 'EPERM' || err.code === 'EACCES') {
146
+ console.error('File is in use by another program or access is denied:', err);
147
+ return false;
148
+ } else {
149
+ console.error('Cannot access file:', err);
150
+ return false;
151
+ }
152
+ }
153
+ return true;
154
+ }
155
+
156
+ async function checkAllDeletable(currentPath) {
157
+ try {
158
+ const stats = await fsp.stat(currentPath);
159
+
160
+ if (stats.isDirectory()) {
161
+ const files = await fsp.readdir(currentPath);
162
+
163
+ for (const file of files) {
164
+ const deletable = await checkAllDeletable(path.join(currentPath, file));
165
+ if (!deletable) {
166
+ return false;
167
+ }
168
+ }
169
+ return true;
170
+ } else {
171
+ return await checkFileInUse(currentPath);
172
+ }
173
+ } catch (err) {
174
+ console.log(`Error accessing: ${currentPath}, ${err}`);
175
+ return false;
176
+ }
177
+ }
178
+
179
+ async function deleteDirectorySafely(dirPath) {
180
+ if (await checkAllDeletable(dirPath)) {
181
+ await rimraf(dirPath)
182
+ return true
183
+ }
184
+ return false
185
+ }
@@ -0,0 +1,83 @@
1
+ module.exports = () => {
2
+ const screenBreakpoints = {
3
+ 'sm': 640,
4
+ 'md': 768,
5
+ 'lg': 1024,
6
+ 'xl': 1280,
7
+ '2xl': 1536,
8
+ };
9
+ return {
10
+ postcssPlugin: 'uss-transform',
11
+ Once(root, { result }) {
12
+ root.walkRules((rule) => {
13
+ // Transform class selectors
14
+ rule.selectors = rule.selectors.map(selector =>
15
+ "." + selector.slice(1).replace(/(\\\.|\\#|\\%|\\:|\\\/|\\\[|\\\]|\\\(|\\\)|\\2c)/g, match => {
16
+ switch (match) {
17
+ case '\\.': return '_d_';
18
+ case '\\#': return '_n_';
19
+ case '\\%': return '_p_';
20
+ case '\\:': return '_c_';
21
+ case '\\/': return '_s_';
22
+ case '\\[': return '_lb_';
23
+ case '\\]': return '_rb_';
24
+ case '\\(': return '_lp_';
25
+ case '\\)': return '_rp_';
26
+ case '\\2c': return '_cm_';
27
+ default: return match;
28
+ }
29
+ })
30
+ );
31
+ });
32
+
33
+ // RGB to RGBA conversion
34
+ root.walkDecls(decl => {
35
+ if (decl.value.includes('rgb(')) {
36
+ decl.value = decl.value.replace(/rgb\((.*?) \/\s*(.*?)\)/g, 'rgba($1 $2)');
37
+ }
38
+ });
39
+
40
+ // Handle hexadecimal colors with alpha value to RGBA conversion
41
+ root.walkDecls(decl => {
42
+ decl.value = decl.value.replace(/: #([A-Fa-f0-9]{8})/g, (match, hex) => {
43
+ const r = parseInt(hex.slice(0, 2), 16);
44
+ const g = parseInt(hex.slice(2, 4), 16);
45
+ const b = parseInt(hex.slice(4, 6), 16);
46
+ const a = parseInt(hex.slice(6, 8), 16) / 255;
47
+ return `: rgba(${r}, ${g}, ${b}, ${a})`;
48
+ });
49
+ });
50
+
51
+ // Media queries transformation
52
+ root.walkAtRules('media', atRule => {
53
+ // Extract the min-width value from the media query
54
+ const minWidthMatch = atRule.params.match(/min-width:\s*(\d+)px/);
55
+ if (minWidthMatch) {
56
+ const minWidthValue = parseInt(minWidthMatch[1], 10);
57
+
58
+ // Determine the correct breakpoint
59
+ let appliedBreakpointName = null;
60
+ Object.entries(screenBreakpoints).forEach(([name, value]) => {
61
+ if (minWidthValue >= value) {
62
+ appliedBreakpointName = name;
63
+ }
64
+ });
65
+
66
+ if (appliedBreakpointName) {
67
+ const className = `.onejs-media-${appliedBreakpointName}`;
68
+
69
+ // Prepend the class to each rule inside this media query
70
+ atRule.walkRules(rule => {
71
+ rule.selectors = rule.selectors.map(selector => `${className} ${selector}`);
72
+ });
73
+
74
+ // Remove the @media rule by replacing it with its contents
75
+ atRule.replaceWith(atRule.nodes);
76
+ }
77
+ }
78
+ });
79
+ }
80
+ };
81
+ };
82
+
83
+ module.exports.postcss = true;
@@ -0,0 +1,3 @@
1
+ let palettes = [["#69d2e7", "#a7dbd8", "#e0e4cc", "#f38630", "#fa6900"], ["#fe4365", "#fc9d9a", "#f9cdad", "#c8c8a9", "#83af9b"], ["#ecd078", "#d95b43", "#c02942", "#542437", "#53777a"], ["#556270", "#4ecdc4", "#c7f464", "#ff6b6b", "#c44d58"], ["#774f38", "#e08e79", "#f1d4af", "#ece5ce", "#c5e0dc"], ["#e8ddcb", "#cdb380", "#036564", "#033649", "#031634"], ["#490a3d", "#bd1550", "#e97f02", "#f8ca00", "#8a9b0f"], ["#594f4f", "#547980", "#45ada8", "#9de0ad", "#e5fcc2"], ["#00a0b0", "#6a4a3c", "#cc333f", "#eb6841", "#edc951"], ["#e94e77", "#d68189", "#c6a49a", "#c6e5d9", "#f4ead5"], ["#3fb8af", "#7fc7af", "#dad8a7", "#ff9e9d", "#ff3d7f"], ["#d9ceb2", "#948c75", "#d5ded9", "#7a6a53", "#99b2b7"], ["#ffffff", "#cbe86b", "#f2e9e1", "#1c140d", "#cbe86b"], ["#efffcd", "#dce9be", "#555152", "#2e2633", "#99173c"], ["#343838", "#005f6b", "#008c9e", "#00b4cc", "#00dffc"], ["#413e4a", "#73626e", "#b38184", "#f0b49e", "#f7e4be"], ["#ff4e50", "#fc913a", "#f9d423", "#ede574", "#e1f5c4"], ["#99b898", "#fecea8", "#ff847c", "#e84a5f", "#2a363b"], ["#655643", "#80bca3", "#f6f7bd", "#e6ac27", "#bf4d28"], ["#00a8c6", "#40c0cb", "#f9f2e7", "#aee239", "#8fbe00"], ["#351330", "#424254", "#64908a", "#e8caa4", "#cc2a41"], ["#554236", "#f77825", "#d3ce3d", "#f1efa5", "#60b99a"], ["#5d4157", "#838689", "#a8caba", "#cad7b2", "#ebe3aa"], ["#8c2318", "#5e8c6a", "#88a65e", "#bfb35a", "#f2c45a"], ["#fad089", "#ff9c5b", "#f5634a", "#ed303c", "#3b8183"], ["#ff4242", "#f4fad2", "#d4ee5e", "#e1edb9", "#f0f2eb"], ["#f8b195", "#f67280", "#c06c84", "#6c5b7b", "#355c7d"], ["#d1e751", "#ffffff", "#000000", "#4dbce9", "#26ade4"], ["#1b676b", "#519548", "#88c425", "#bef202", "#eafde6"], ["#5e412f", "#fcebb6", "#78c0a8", "#f07818", "#f0a830"], ["#bcbdac", "#cfbe27", "#f27435", "#f02475", "#3b2d38"], ["#452632", "#91204d", "#e4844a", "#e8bf56", "#e2f7ce"], ["#eee6ab", "#c5bc8e", "#696758", "#45484b", "#36393b"], ["#f0d8a8", "#3d1c00", "#86b8b1", "#f2d694", "#fa2a00"], ["#2a044a", "#0b2e59", "#0d6759", "#7ab317", "#a0c55f"], ["#f04155", "#ff823a", "#f2f26f", "#fff7bd", "#95cfb7"], ["#b9d7d9", "#668284", "#2a2829", "#493736", "#7b3b3b"], ["#bbbb88", "#ccc68d", "#eedd99", "#eec290", "#eeaa88"], ["#b3cc57", "#ecf081", "#ffbe40", "#ef746f", "#ab3e5b"], ["#a3a948", "#edb92e", "#f85931", "#ce1836", "#009989"], ["#300030", "#480048", "#601848", "#c04848", "#f07241"], ["#67917a", "#170409", "#b8af03", "#ccbf82", "#e33258"], ["#aab3ab", "#c4cbb7", "#ebefc9", "#eee0b7", "#e8caaf"], ["#e8d5b7", "#0e2430", "#fc3a51", "#f5b349", "#e8d5b9"], ["#ab526b", "#bca297", "#c5ceae", "#f0e2a4", "#f4ebc3"], ["#607848", "#789048", "#c0d860", "#f0f0d8", "#604848"], ["#b6d8c0", "#c8d9bf", "#dadabd", "#ecdbbc", "#fedcba"], ["#a8e6ce", "#dcedc2", "#ffd3b5", "#ffaaa6", "#ff8c94"], ["#3e4147", "#fffedf", "#dfba69", "#5a2e2e", "#2a2c31"], ["#fc354c", "#29221f", "#13747d", "#0abfbc", "#fcf7c5"], ["#cc0c39", "#e6781e", "#c8cf02", "#f8fcc1", "#1693a7"], ["#1c2130", "#028f76", "#b3e099", "#ffeaad", "#d14334"], ["#a7c5bd", "#e5ddcb", "#eb7b59", "#cf4647", "#524656"], ["#dad6ca", "#1bb0ce", "#4f8699", "#6a5e72", "#563444"], ["#5c323e", "#a82743", "#e15e32", "#c0d23e", "#e5f04c"], ["#edebe6", "#d6e1c7", "#94c7b6", "#403b33", "#d3643b"], ["#fdf1cc", "#c6d6b8", "#987f69", "#e3ad40", "#fcd036"], ["#230f2b", "#f21d41", "#ebebbc", "#bce3c5", "#82b3ae"], ["#b9d3b0", "#81bda4", "#b28774", "#f88f79", "#f6aa93"], ["#3a111c", "#574951", "#83988e", "#bcdea5", "#e6f9bc"], ["#5e3929", "#cd8c52", "#b7d1a3", "#dee8be", "#fcf7d3"], ["#1c0113", "#6b0103", "#a30006", "#c21a01", "#f03c02"], ["#000000", "#9f111b", "#b11623", "#292c37", "#cccccc"], ["#382f32", "#ffeaf2", "#fcd9e5", "#fbc5d8", "#f1396d"], ["#e3dfba", "#c8d6bf", "#93ccc6", "#6cbdb5", "#1a1f1e"], ["#f6f6f6", "#e8e8e8", "#333333", "#990100", "#b90504"], ["#1b325f", "#9cc4e4", "#e9f2f9", "#3a89c9", "#f26c4f"], ["#a1dbb2", "#fee5ad", "#faca66", "#f7a541", "#f45d4c"], ["#c1b398", "#605951", "#fbeec2", "#61a6ab", "#accec0"], ["#5e9fa3", "#dcd1b4", "#fab87f", "#f87e7b", "#b05574"], ["#951f2b", "#f5f4d7", "#e0dfb1", "#a5a36c", "#535233"], ["#8dccad", "#988864", "#fea6a2", "#f9d6ac", "#ffe9af"], ["#2d2d29", "#215a6d", "#3ca2a2", "#92c7a3", "#dfece6"], ["#413d3d", "#040004", "#c8ff00", "#fa023c", "#4b000f"], ["#eff3cd", "#b2d5ba", "#61ada0", "#248f8d", "#605063"], ["#ffefd3", "#fffee4", "#d0ecea", "#9fd6d2", "#8b7a5e"], ["#cfffdd", "#b4dec1", "#5c5863", "#a85163", "#ff1f4c"], ["#9dc9ac", "#fffec7", "#f56218", "#ff9d2e", "#919167"], ["#4e395d", "#827085", "#8ebe94", "#ccfc8e", "#dc5b3e"], ["#a8a7a7", "#cc527a", "#e8175d", "#474747", "#363636"], ["#f8edd1", "#d88a8a", "#474843", "#9d9d93", "#c5cfc6"], ["#046d8b", "#309292", "#2fb8ac", "#93a42a", "#ecbe13"], ["#f38a8a", "#55443d", "#a0cab5", "#cde9ca", "#f1edd0"], ["#a70267", "#f10c49", "#fb6b41", "#f6d86b", "#339194"], ["#ff003c", "#ff8a00", "#fabe28", "#88c100", "#00c176"], ["#ffedbf", "#f7803c", "#f54828", "#2e0d23", "#f8e4c1"], ["#4e4d4a", "#353432", "#94ba65", "#2790b0", "#2b4e72"], ["#0ca5b0", "#4e3f30", "#fefeeb", "#f8f4e4", "#a5b3aa"], ["#4d3b3b", "#de6262", "#ffb88c", "#ffd0b3", "#f5e0d3"], ["#fffbb7", "#a6f6af", "#66b6ab", "#5b7c8d", "#4f2958"], ["#edf6ee", "#d1c089", "#b3204d", "#412e28", "#151101"], ["#9d7e79", "#ccac95", "#9a947c", "#748b83", "#5b756c"], ["#fcfef5", "#e9ffe1", "#cdcfb7", "#d6e6c3", "#fafbe3"], ["#9cddc8", "#bfd8ad", "#ddd9ab", "#f7af63", "#633d2e"], ["#30261c", "#403831", "#36544f", "#1f5f61", "#0b8185"], ["#aaff00", "#ffaa00", "#ff00aa", "#aa00ff", "#00aaff"], ["#d1313d", "#e5625c", "#f9bf76", "#8eb2c5", "#615375"], ["#ffe181", "#eee9e5", "#fad3b2", "#ffba7f", "#ff9c97"], ["#73c8a9", "#dee1b6", "#e1b866", "#bd5532", "#373b44"], ["#805841", "#dcf7f3", "#fffcdd", "#ffd8d8", "#f5a2a2"]]
2
+
3
+ export { palettes }