coralite 0.3.0 → 0.4.1

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.
@@ -0,0 +1,45 @@
1
+ name: Test e2e
2
+
3
+ on:
4
+ - push
5
+ - pull_request
6
+
7
+ jobs:
8
+ test:
9
+ timeout-minutes: 60
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v4
15
+
16
+ - uses: pnpm/action-setup@v4
17
+ name: Install pnpm
18
+ with:
19
+ version: 9
20
+ run_install: false
21
+
22
+ - name: Install Node.js
23
+ uses: actions/setup-node@v4
24
+ with:
25
+ node-version: 22
26
+ cache: "pnpm"
27
+
28
+ - name: Install dependencies
29
+ run: pnpm install
30
+
31
+ - name: Build HTML from templates
32
+ run: pnpm run html
33
+
34
+ - name: Install Playwright Browser
35
+ run: pnpm exec playwright install firefox --with-deps
36
+
37
+ - name: Run Playwright tests
38
+ run: pnpm exec playwright test
39
+
40
+ - uses: actions/upload-artifact@v4
41
+ if: ${{ !cancelled() }}
42
+ with:
43
+ name: playwright-report
44
+ path: playwright-report/
45
+ retention-days: 30
package/README.md CHANGED
@@ -23,6 +23,19 @@ yarn add -D coralite
23
23
  pnpm add -D coralite
24
24
  ```
25
25
 
26
+ ## Requirements
27
+
28
+ Coralite uses **ECMAScript Modules** which requires to run Node.js with the **`--experimental-vm-modules`** option enabled.
29
+
30
+ ```bash
31
+ node --experimental-vm-modules node_modules/coralite/bin/coralite.js [options]
32
+ ```
33
+ or using NODE_OPTIONS
34
+
35
+ ```bash
36
+ NODE_OPTIONS=--experimental-vm-modules coralite [options]
37
+ ```
38
+
26
39
  ## Basic Syntax
27
40
 
28
41
  Coralite is executed using the following command:
@@ -37,14 +50,14 @@ Replace `[options]` with the desired flags and arguments.
37
50
 
38
51
  To generate a website using Coralite, you must provide three essential options:
39
52
 
40
- - **-c or --components**: The path to your components directory containing reusable UI elements (e.g., `-c ./src/components`).
53
+ - **-c or --templates**: The path to your templates directory containing reusable UI elements (e.g., `-c ./src/templates`).
41
54
  - **-p or --pages**: The path to your pages directory where static HTML files reside (e.g., `-p ./src/pages`).
42
55
  - **--output or -o**: The output directory for the generated site (e.g., `--output ./dist`).
43
56
 
44
57
  Here's an example of how these options might look:
45
58
 
46
59
  ```bash
47
- coralite --components ./src/components --pages ./src/pages --output ./dist
60
+ coralite --templates ./src/templates --pages ./src/pages --output ./dist
48
61
  ```
49
62
 
50
63
  ## Optional Options
@@ -54,5 +67,5 @@ coralite --components ./src/components --pages ./src/pages --output ./dist
54
67
  Run the CLI in dry-run mode to preview the actions that would be performed without actually generating the website. This is useful for debugging or when you want to check potential issues before committing changes:
55
68
 
56
69
  ```bash
57
- coralite --components ./src/components --pages ./src/pages --output ./dist --dry
70
+ coralite --templates ./src/templates --pages ./src/pages --output ./dist --dry
58
71
  ```
package/bin/coralite.js CHANGED
@@ -17,7 +17,7 @@ program
17
17
  .name(pkg.name)
18
18
  .description(pkg.description)
19
19
  .version(pkg.version)
20
- .requiredOption('-c, --components <path>', 'Path to components directory')
20
+ .requiredOption('-t, --templates <path>', 'Path to templates directory')
21
21
  .requiredOption('-p, --pages <path>', 'Path to pages directory')
22
22
  .requiredOption('-o, --output <path>', 'Output directory for the generated site')
23
23
  .option('-d, --dry', 'Run in dry-run mode')
@@ -28,13 +28,13 @@ program.on('error', (err) => {
28
28
  })
29
29
 
30
30
  const options = program.opts()
31
- const componentsPath = options.components
31
+ const templatesPath = options.templates
32
32
  const pagesPath = options.pages
33
33
  const outputDir = options.output
34
34
  const dryRun = options.dry
35
35
 
36
- const htmlComponents = await getHTML({
37
- path: componentsPath,
36
+ const htmlTemplates = await getHTML({
37
+ path: templatesPath,
38
38
  recursive: true
39
39
  })
40
40
  const htmlPages = await getHTML({
@@ -45,9 +45,9 @@ const htmlPages = await getHTML({
45
45
  /** @type {Object.<string, CoraliteModule>} */
46
46
  const coraliteModules = {}
47
47
 
48
- // create components
49
- for (let i = 0; i < htmlComponents.length; i++) {
50
- const html = htmlComponents[i]
48
+ // create templates
49
+ for (let i = 0; i < htmlTemplates.length; i++) {
50
+ const html = htmlTemplates[i]
51
51
  const coraliteModule = parseModule(html.content)
52
52
 
53
53
  coraliteModules[coraliteModule.id] = coraliteModule
@@ -57,7 +57,7 @@ for (let i = 0; i < htmlPages.length; i++) {
57
57
  const html = htmlPages[i]
58
58
  const document = parseHTMLDocument(html, {
59
59
  pages: pagesPath,
60
- components: componentsPath
60
+ templates: templatesPath
61
61
  })
62
62
 
63
63
  for (let i = 0; i < document.customElements.length; i++) {
@@ -70,9 +70,13 @@ for (let i = 0; i < htmlPages.length; i++) {
70
70
  document
71
71
  })
72
72
 
73
- // replace custom element with component
74
- customElement.parent.children.splice(customElement.parentChildIndex, 1, ...component.children)
75
- component.parent = customElement.parent
73
+ for (let i = 0; i < component.children.length; i++) {
74
+ // update component parent
75
+ component.children[i].parent = customElement.parent
76
+ }
77
+ const index = customElement.parent.children.indexOf(customElement, customElement.parentChildIndex)
78
+ // replace custom element with template
79
+ customElement.parent.children.splice(index, 1, ...component.children)
76
80
  }
77
81
 
78
82
  // render document
@@ -0,0 +1,116 @@
1
+ import stylisticJs from '@stylistic/eslint-plugin-js'
2
+ import stylisticPlus from '@stylistic/eslint-plugin-plus'
3
+
4
+ export default [
5
+ {
6
+ plugins: {
7
+ '@stylistic/js': stylisticJs,
8
+ '@stylistic/plus': stylisticPlus
9
+ },
10
+ rules: {
11
+ '@stylistic/plus/curly-newline': ['error', 'always'],
12
+ '@stylistic/js/indent': [
13
+ 'error', 2, {
14
+ SwitchCase: 1,
15
+ VariableDeclarator: 1,
16
+ outerIIFEBody: 1,
17
+ MemberExpression: 1,
18
+ FunctionExpression: {
19
+ body: 1,
20
+ parameters: 1
21
+ },
22
+ CallExpression: {
23
+ arguments: 1
24
+ },
25
+ ArrayExpression: 1,
26
+ ObjectExpression: 1,
27
+ ImportDeclaration: 1,
28
+ flatTernaryExpressions: true,
29
+ ignoreComments: false
30
+ }
31
+ ],
32
+ '@stylistic/js/object-curly-spacing': ['error', 'always'],
33
+ '@stylistic/js/object-property-newline': 'error',
34
+ '@stylistic/js/object-curly-newline': ['error', {
35
+ ObjectExpression: {
36
+ multiline: true,
37
+ consistent: true
38
+ },
39
+ ObjectPattern: {
40
+ multiline: true,
41
+ consistent: true
42
+ },
43
+ ImportDeclaration: {
44
+ multiline: true,
45
+ consistent: true
46
+ },
47
+ ExportDeclaration: {
48
+ multiline: true,
49
+ consistent: true
50
+ }
51
+ }],
52
+ '@stylistic/js/quote-props': ['error', 'as-needed'],
53
+ '@stylistic/js/space-before-function-paren': ['error', 'always'],
54
+ '@stylistic/js/function-call-spacing': ['error', 'never'],
55
+ '@stylistic/js/implicit-arrow-linebreak': ['error', 'beside'],
56
+ '@stylistic/js/eol-last': ['error', 'always'],
57
+ '@stylistic/js/brace-style': [
58
+ 'error', '1tbs', {
59
+ allowSingleLine: false
60
+ }
61
+ ],
62
+ '@stylistic/js/semi': ['error', 'never'],
63
+ '@stylistic/js/quotes': [
64
+ 'error', 'single', {
65
+ avoidEscape: true,
66
+ allowTemplateLiterals: true
67
+ }
68
+ ],
69
+ '@stylistic/js/comma-dangle': ['error', 'never'],
70
+ '@stylistic/js/comma-spacing': [
71
+ 'error', {
72
+ before: false,
73
+ after: true
74
+ }
75
+ ],
76
+ '@stylistic/js/comma-style': ['error', 'last'],
77
+ '@stylistic/js/array-bracket-spacing': ['error', 'never'],
78
+ '@stylistic/js/array-bracket-newline': ['error', 'consistent'],
79
+ '@stylistic/js/array-element-newline': ['error', 'consistent'],
80
+ '@stylistic/js/computed-property-spacing': ['error', 'never'],
81
+ '@stylistic/js/no-mixed-operators': [
82
+ 'error',
83
+ {
84
+ groups: [
85
+ [
86
+ '+', '-', '*', '/', '%', '**'
87
+ ],
88
+ [
89
+ '&', '|', '^', '~', '<<', '>>', '>>>'
90
+ ],
91
+ [
92
+ '==', '!=', '===', '!==', '>', '>=', '<', '<='
93
+ ],
94
+ ['&&', '||'],
95
+ ['in', 'instanceof']
96
+ ],
97
+ allowSamePrecedence: false
98
+ }
99
+ ],
100
+ '@stylistic/js/key-spacing': [
101
+ 'error', {
102
+ mode: 'strict'
103
+ }
104
+ ],
105
+ '@stylistic/js/no-trailing-spaces': 'error',
106
+ '@stylistic/js/no-multi-spaces': 'error',
107
+ '@stylistic/js/no-confusing-arrow': 'error'
108
+ }
109
+ },
110
+ {
111
+ ignores: [
112
+ '**/dist/',
113
+ '**/.history/'
114
+ ]
115
+ }
116
+ ]
@@ -3,7 +3,7 @@ import getHTML from './get-html.js'
3
3
  import { createComponent, parseHTMLMeta } from './parse.js'
4
4
 
5
5
  /**
6
- * @import { CoraliteTokenOptions, CoraliteModule, CoraliteDocument } from '#types'
6
+ * @import { CoraliteTokenOptions, CoraliteModule, CoraliteDocument, CoraliteModuleValues } from '#types'
7
7
  */
8
8
 
9
9
  /**
@@ -14,7 +14,7 @@ import { createComponent, parseHTMLMeta } from './parse.js'
14
14
  * @param {string} options.componentId - Unique identifier for the component
15
15
  * @param {boolean} [options.recursive] - Whether to recursively search subdirectories
16
16
  * @param {CoraliteTokenOptions} [options.tokens] - Token configuration options
17
- * @param {Object.<string, string>} values - Default token values
17
+ * @param {CoraliteModuleValues} values - Default token values
18
18
  * @param {Object.<string, CoraliteModule>} components - Available components library
19
19
  * @param {CoraliteDocument} document - Current document being processed
20
20
  *
package/lib/parse.js CHANGED
@@ -16,7 +16,8 @@ import { invalidCustomTags, validTags } from './tags.js'
16
16
  * CoraliteModuleSlotElement,
17
17
  * CoraliteDocumentTokens,
18
18
  * CoraliteDocumentRoot,
19
- * CoraliteAnyNode,
19
+ * CoraliteContentNode,
20
+ * CoraliteModuleValues,
20
21
  * } from '#types'
21
22
  */
22
23
 
@@ -42,7 +43,7 @@ const customElementTagTokenRegExp = /^[^-].*[-._a-z0-9\u00B7\u00C0-\u00D6\u00D8-
42
43
  *
43
44
  * const path = {
44
45
  * pages: 'path/to/pages',
45
- * components: 'path/to/components'
46
+ * templates: 'path/to/templates'
46
47
  * };
47
48
  *
48
49
  * const document = parseHTMLDocument(html, path);
@@ -57,6 +58,7 @@ export function parseHTMLDocument (html, path) {
57
58
  children: []
58
59
  }
59
60
  // stack to keep track of current element hierarchy
61
+ /** @type {CoraliteContentNode[]} */
60
62
  const stack = [root]
61
63
  const customElements = []
62
64
 
@@ -69,22 +71,28 @@ export function parseHTMLDocument (html, path) {
69
71
  })
70
72
  },
71
73
  onopentag (originalName, attributes) {
72
- createElement(originalName, attributes, customElements, stack)
74
+ const parent = stack[stack.length - 1]
75
+ const element = createElement(originalName, attributes, customElements, parent)
76
+
77
+ // push element to stack as it may have children
78
+ stack.push(element)
73
79
  },
74
80
  ontext (text) {
75
- if (text.trim()) {
76
- createTextNode(text, stack)
77
- }
81
+ const parent = stack[stack.length - 1]
82
+
83
+ createTextNode(text, parent)
78
84
  },
79
85
  onclosetag () {
80
86
  // remove current element from stack as we're done with its children
81
87
  stack.pop()
82
88
  },
83
89
  oncomment (data) {
84
- stack[stack.length - 1].children.push({
90
+ const parent = stack[stack.length - 1]
91
+
92
+ parent.children.push({
85
93
  type: 'comment',
86
94
  data,
87
- parent: stack[stack.length - 1]
95
+ parent
88
96
  })
89
97
  }
90
98
  })
@@ -129,7 +137,7 @@ export function parseHTMLDocument (html, path) {
129
137
  * @returns {Object.<string, CoraliteToken[]>}
130
138
  *
131
139
  * @example
132
- * ```javascript
140
+ * ```
133
141
  * // Example usage:
134
142
  * const html = `<meta name="title" content="Finding Nemo">`;
135
143
  * const meta = parseHTMLMeta(html);
@@ -222,6 +230,7 @@ export function parseModule (string) {
222
230
  children: []
223
231
  }
224
232
  // stack to keep track of current element hierarchy
233
+ /** @type {CoraliteContentNode[]} */
225
234
  const stack = [root]
226
235
  const customElements = []
227
236
  /** @type {Object.<string, Object.<string,CoraliteModuleSlotElement>>} */
@@ -236,9 +245,13 @@ export function parseModule (string) {
236
245
 
237
246
  const parser = new Parser({
238
247
  onopentag (originalName, attributes) {
239
- const element = createElement(originalName, attributes, customElements, stack)
248
+ const parent = stack[stack.length -1]
249
+ const element = createElement(originalName, attributes, customElements, parent)
240
250
  const attributeNames = Object.keys(attributes)
241
251
 
252
+ // push element to stack as it may have children
253
+ stack.push(element)
254
+
242
255
  // collect tokens
243
256
  if (attributeNames.length) {
244
257
  for (let i = 0; i < attributeNames.length; i++) {
@@ -300,8 +313,10 @@ export function parseModule (string) {
300
313
  }
301
314
  },
302
315
  ontext (text) {
316
+ const parent = stack[stack.length - 1]
317
+ const textNode = createTextNode(text, parent)
318
+
303
319
  if (text.trim()) {
304
- const textNode = createTextNode(text, stack)
305
320
  const tokens = getTokensFromString(text)
306
321
 
307
322
  // store tokens
@@ -340,23 +355,26 @@ export function parseModule (string) {
340
355
  for (let i = 0; i < root.children.length; i++) {
341
356
  const node = root.children[i]
342
357
 
343
- if (node.type === 'text') {
344
- continue
345
- }
358
+ if (node.type === 'tag') {
359
+ if (node.name === 'template') {
360
+ if (template) {
361
+ throw new Error('One template element is permitted')
362
+ }
346
363
 
347
- if (node.name === 'template') {
348
- if (template) {
349
- throw new Error('One template element is permitted')
350
- }
364
+ template = node
351
365
 
352
- template = node
366
+ } else if (node.name == 'script') {
367
+ if (node.attribs.type !== 'module') {
368
+ throw new Error('Script tag must contain the `type="module"` attribute')
369
+ }
370
+ const scriptString = node.children[0]
353
371
 
354
- } else if (node.name == 'script') {
355
- if (node.attribs.type !== 'module') {
356
- throw new Error('Script tag must contain the `type="module"` attribute')
357
- }
372
+ if (scriptString.type !== 'text') {
373
+ throw new Error('Script tag must contain text')
374
+ }
358
375
 
359
- script = node.children[0].data
376
+ script = scriptString.data
377
+ }
360
378
  }
361
379
  }
362
380
 
@@ -377,10 +395,9 @@ export function parseModule (string) {
377
395
  /**
378
396
  * @param {Object} options
379
397
  * @param {string} options.id - id - Unique identifier for the component
380
- * @param {Object.<string, (string | (CoraliteTextNode | CoraliteElement)[])>} options.values - Token values available for replacement
381
- * @param {Object.<string, CoraliteModuleSlotElement[]>} [options.customElementSlots = {}] - Custom slots and their configurations for the component
398
+ * @param {CoraliteModuleValues} options.values - Token values available for replacement
382
399
  * @param {Object.<string, CoraliteModule>} options.components - Mapping of component IDs to their module definitions
383
- * @param {CoraliteElement} options.element - Mapping of component IDs to their module definitions
400
+ * @param {CoraliteElement} [options.element] - Mapping of component IDs to their module definitions
384
401
  * @param {CoraliteDocument} options.document - Current document being processed
385
402
  * @returns {Promise<CoraliteElement>}
386
403
  *
@@ -392,11 +409,6 @@ export function parseModule (string) {
392
409
  * values: {
393
410
  * 'some-token': 'value-for-token'
394
411
  * },
395
- * customElementSlots: {
396
- * 'slot-name': [
397
- * { name: 'sub-slot', element: 'p' }
398
- * ]
399
- * },
400
412
  * components: {
401
413
  * 'my-component': {
402
414
  * id: 'my-component',
@@ -450,8 +462,10 @@ export async function createComponent ({
450
462
  }
451
463
  }
452
464
 
453
- // replace token with value
454
- item.element.attribs[item.name] = item.element.attribs[item.name].replace(token.content, value)
465
+ if (typeof value === 'string') {
466
+ // replace token with value
467
+ item.element.attribs[item.name] = item.element.attribs[item.name].replace(token.content, value)
468
+ }
455
469
  }
456
470
  }
457
471
 
@@ -478,8 +492,10 @@ export async function createComponent ({
478
492
  }
479
493
  }
480
494
 
481
- // replace token with value
482
- item.textNode.data = item.textNode.data.replace(token.content, value)
495
+ if (typeof value === 'string') {
496
+ // replace token with value
497
+ item.textNode.data = item.textNode.data.replace(token.content, value)
498
+ }
483
499
  }
484
500
  }
485
501
 
@@ -494,9 +510,13 @@ export async function createComponent ({
494
510
  const node = computedToken.node
495
511
  const value = values[computedToken.name]
496
512
 
497
- if (computedToken.type === 'attribute') {
513
+ if (
514
+ computedToken.type === 'attribute'
515
+ && node.type === 'tag'
516
+ && typeof value === 'string'
517
+ ) {
498
518
  node.attribs[computedToken.attribute] = node.attribs[computedToken.attribute].replace(computedToken.content, value)
499
- } else {
519
+ } else if (node.type === 'text') {
500
520
  if (Array.isArray(value)) {
501
521
  // inject nodes
502
522
  const textSplit = node.data.split(computedToken.content)
@@ -597,7 +617,7 @@ export async function createComponent ({
597
617
  * Parses a Coralite module script and compiles it into JavaScript.
598
618
  *
599
619
  * @param {CoraliteModule} component - The Coralite module to parse
600
- * @param {Object.<string, string>} values - Replacement tokens for the component
620
+ * @param {CoraliteModuleValues} values - Replacement tokens for the component
601
621
  * @param {Object.<string, CoraliteModule>} components - Mapping of other components that might be referenced
602
622
  * @param {CoraliteDocument} document - The current document being processed
603
623
  * @returns {Promise<Object.<string,(string|(CoraliteElement|CoraliteTextNode)[])>>}
@@ -746,11 +766,10 @@ function addMetadata (meta, name, content) {
746
766
  * @param {string} name
747
767
  * @param {Object.<string, string>} attributes
748
768
  * @param {CoraliteElement[]} customElements
749
- * @param {CoraliteAnyNode[]} stack
769
+ * @param {CoraliteElement | CoraliteDocumentRoot} parent
750
770
  */
751
- function createElement (name, attributes, customElements, stack) {
771
+ function createElement (name, attributes, customElements, parent) {
752
772
  const sanitisedName = name.toLowerCase()
753
- const parent = stack[stack.length - 1]
754
773
 
755
774
  /** @type {CoraliteElement} */
756
775
  const element = {
@@ -779,28 +798,27 @@ function createElement (name, attributes, customElements, stack) {
779
798
  // add element to its parent's children
780
799
  parent.children.push(element)
781
800
 
782
- // push element to stack as it may have children
783
- stack.push(element)
784
-
785
801
  return element
786
802
  }
787
803
 
788
804
  /**
789
- * @param {string} text
790
- * @param {CoraliteElement[]} stack
805
+ * @param {string} data - The text content to create a text node
806
+ * @param {CoraliteElement | CoraliteDocumentRoot} parent - parent node
791
807
  * @returns {CoraliteTextNode}
808
+ *
809
+ * @example
810
+ * const textNode = createTextNode('Hello World', parentNode);
792
811
  */
793
- function createTextNode (text, stack) {
794
- // store if contains data
795
- const parentIndex = stack.length - 1
812
+ function createTextNode (data, parent) {
813
+ /** @type {CoraliteTextNode} */
796
814
  const textNode = {
797
815
  type: 'text',
798
- data: text,
799
- parent: stack[parentIndex]
816
+ data,
817
+ parent
800
818
  }
801
819
 
802
- stack[parentIndex].children.push(textNode)
820
+ // @ts-ignore
821
+ parent.children.push(textNode)
803
822
 
804
823
  return textNode
805
824
  }
806
-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coralite",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "HTML modules static site generator",
5
5
  "main": "./lib/coralite.js",
6
6
  "type": "module",
@@ -28,7 +28,11 @@
28
28
  "format": "eslint --cache --fix .",
29
29
  "lint": "eslint --cache .",
30
30
  "test-unit": "node --test test/lib/*",
31
- "semantic-release": "semantic-release"
31
+ "test-e2e": "playwright test",
32
+ "test-e2e-report": "playwright show-report",
33
+ "test-e2e-ui": "playwright test --ui",
34
+ "html": "node --experimental-vm-modules bin/coralite.js -t tests/fixtures/templates -p tests/fixtures/pages -o dist",
35
+ "server": "sirv dist --dev --port 3000"
32
36
  },
33
37
  "bin": "bin/coralite.js",
34
38
  "imports": {
@@ -42,9 +46,11 @@
42
46
  "devDependencies": {
43
47
  "@commitlint/cli": "^19.6.1",
44
48
  "@commitlint/config-conventional": "^19.6.0",
49
+ "@playwright/test": "^1.50.0",
45
50
  "@stylistic/eslint-plugin-js": "^2.12.1",
46
51
  "@stylistic/eslint-plugin-plus": "^2.12.1",
47
- "@types/node": "^22.10.5"
52
+ "@types/node": "^22.10.5",
53
+ "sirv-cli": "^3.0.0"
48
54
  },
49
55
  "engines": {
50
56
  "node": ">=18"
@@ -0,0 +1,52 @@
1
+ // @ts-check
2
+ import { defineConfig, devices } from '@playwright/test'
3
+
4
+ /**
5
+ * Read environment variables from file.
6
+ * https://github.com/motdotla/dotenv
7
+ */
8
+ // import dotenv from 'dotenv';
9
+ // import path from 'path';
10
+ // dotenv.config({ path: path.resolve(__dirname, '.env') });
11
+
12
+ /**
13
+ * @see https://playwright.dev/docs/test-configuration
14
+ */
15
+ export default defineConfig({
16
+ testDir: './tests/e2e',
17
+ /* Run tests in files in parallel */
18
+ fullyParallel: true,
19
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
20
+ forbidOnly: !!process.env.CI,
21
+ /* Retry on CI only */
22
+ retries: process.env.CI ? 2 : 0,
23
+ /* Opt out of parallel tests on CI. */
24
+ workers: process.env.CI ? 1 : undefined,
25
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
26
+ reporter: 'html',
27
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
28
+ use: {
29
+ /* Base URL to use in actions like `await page.goto('/')`. */
30
+ baseURL: 'http://localhost:3000',
31
+
32
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
33
+ trace: 'on-first-retry'
34
+ },
35
+
36
+ /* Configure projects for major browsers */
37
+ projects: [
38
+ {
39
+ name: 'firefox',
40
+ use: { ...devices['Desktop Firefox'] }
41
+ }
42
+ ],
43
+
44
+ /* Run your local dev server before starting the tests */
45
+ webServer: {
46
+ command: 'pnpm run server',
47
+ url: 'http://localhost:3000',
48
+ reuseExistingServer: !process.env.CI,
49
+ timeout: 120000
50
+ }
51
+ })
52
+
@@ -0,0 +1,30 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ test('has title', async ({ page }) => {
4
+ await page.goto('/')
5
+
6
+ // Expect a title "to contain" a substring.
7
+ await expect(page).toHaveTitle(/Home page/)
8
+ })
9
+
10
+ test('has compiled coralite-header custom element', async ({ page }) => {
11
+ await page.goto('/')
12
+
13
+ // Check if the custom coralite-header element exists and contains the expected text
14
+ await expect(page.locator('body')).toMatchAriaSnapshot(`
15
+ - text: Hello
16
+ - banner: This is the mighty header
17
+ - text: world
18
+ `)
19
+ })
20
+
21
+ test('', async ({ page }) => {
22
+ await page.goto('/about.html')
23
+
24
+ await expect(page.locator('body')).toMatchAriaSnapshot(`
25
+ - text: Hello
26
+ - banner: This is the mighty header
27
+ - text: world
28
+ `)
29
+ })
30
+
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta name="title" content="About">
5
+ <title>About</title>
6
+ </head>
7
+ <body>
8
+ <coralite-layout>
9
+ test
10
+ </coralite-layout>
11
+ </body>
12
+ </html>
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Blog posts</title>
7
+ <coralite-head>
8
+ <meta slot="meta" name="name" content="coralite">
9
+ <meta slot="meta" name="description" content="look mum, no database!">
10
+ <span>default slot</span>
11
+ <span>default slot</span>
12
+ </coralite-head>
13
+ </head>
14
+ <body>
15
+ Hello
16
+
17
+ <coralite-header></coralite-header>
18
+ <coralite-posts path="blog"></coralite-posts>
19
+ world
20
+ </body>
21
+ </html>
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Document</title>
7
+ <meta name="title" content="Post 1">
8
+ <meta name="author" content="Nemo">
9
+ <meta name="image" content="image.png">
10
+ <meta name="image_alt" content="Photo of a cat">
11
+ <meta name="description" content="short description">
12
+ <meta name="published_time" content="2025-01-08T20:23:07.645Z">
13
+ </head>
14
+ <body>
15
+ Hello
16
+
17
+ <coralite-header></coralite-header>
18
+ <coralite-author name="Nemo" datetime="2025-01-08T20:23:07.645Z"></coralite-author>
19
+
20
+ world
21
+ </body>
22
+ </html>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Document</title>
7
+ <meta name="title" content="Post 2">
8
+ <meta name="author" content="Nemo">
9
+ <meta name="image" content="image.png">
10
+ <meta name="image_alt" content="Photo of a dog">
11
+ <meta name="description" content="short description">
12
+ <meta name="published_time" content="2025-01-09T20:23:07.645Z">
13
+ </head>
14
+ <body>
15
+ <coralite-header></coralite-header>
16
+ <coralite-author name="Nemo" datetime="2025-01-08T20:23:07.645Z"></coralite-author>
17
+ </body>
18
+ </html>
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Home page</title>
7
+ </head>
8
+ <body>
9
+ Hello
10
+
11
+ <coralite-header></coralite-header>
12
+
13
+ world
14
+ </body>
15
+ </html>
@@ -0,0 +1,24 @@
1
+ <template id="coralite-author">
2
+ <span>{{ name }}</span>
3
+ <time datetime="{{ datetime }}">
4
+ {{ localeDate }}
5
+ </time>
6
+ </template>
7
+
8
+ <script type="module">
9
+ import { defineComponent, tokens } from 'coralite'
10
+
11
+ export default defineComponent({
12
+ id: 'coralite-author',
13
+ tokens: {
14
+ localeDate () {
15
+ return new Date(tokens.datetime).toLocaleDateString('en-AU', {
16
+ weekday: 'short',
17
+ year: '2-digit',
18
+ month: 'short',
19
+ day: 'numeric'
20
+ })
21
+ }
22
+ }
23
+ })
24
+ </script>
@@ -0,0 +1,7 @@
1
+ <template id="coralite-head">
2
+ <slot name="meta">default meta</slot>
3
+ <slot name="css">default css</slot>
4
+ <slot name="script">default script</slot>
5
+ <slot name="empty"></slot>
6
+ <slot>default value</slot>
7
+ </template>
@@ -0,0 +1,5 @@
1
+ <template id="coralite-header">
2
+ <header>
3
+ This is the mighty header
4
+ </header>
5
+ </template>
@@ -0,0 +1,7 @@
1
+ <template id="coralite-post">
2
+ <h2>{{ title }}</h2>
3
+ <coralite-author name="{{ author }}" datetime="{{ published_time }}"></coralite-author>
4
+ <img src="{{ image }}" alt="{{ image_alt }}">
5
+ {{ description }}
6
+ <coralite-header></coralite-header>
7
+ </template>
@@ -0,0 +1,29 @@
1
+ <template id="coralite-posts">
2
+ {{ posts }}
3
+ </template>
4
+
5
+ <script type="module">
6
+ import { defineComponent, tokens, aggregate } from 'coralite'
7
+
8
+ export default defineComponent({
9
+ id: 'coralite-posts',
10
+ tokens: {
11
+ posts () {
12
+ return aggregate({
13
+ path: tokens.path,
14
+ componentId: 'coralite-post',
15
+ pages: 10,
16
+ sortBy: 'published_time',
17
+ tokens: {
18
+ aliases: {
19
+ datetime: ['published_time']
20
+ },
21
+ values: {
22
+ image: 'default.png'
23
+ }
24
+ }
25
+ })
26
+ }
27
+ }
28
+ })
29
+ </script>
@@ -0,0 +1,3 @@
1
+ <template id="coralite-title">
2
+ <h1>{{ title }}</h1>
3
+ </template>
@@ -0,0 +1,5 @@
1
+ <template id="coralite-layout">
2
+ <div>
3
+ <slot></slot>
4
+ </div>
5
+ </template>
@@ -0,0 +1,27 @@
1
+ import { deepStrictEqual, strictEqual } from 'node:assert'
2
+ import { describe, it } from 'node:test'
3
+ import { getTokensFromString } from '#lib'
4
+
5
+ describe('Get tokens from string', function () {
6
+ it('should extract name token', function () {
7
+ const string = `<template id="template1">Hello {{ name }}! Wassup? <code>import { red } from 'lib.js'</code></template>`
8
+ const tokens = getTokensFromString(string)
9
+
10
+ strictEqual(tokens.length, 1)
11
+ deepStrictEqual(tokens[0], {
12
+ name: 'name',
13
+ content: '{{ name }}'
14
+ })
15
+ })
16
+
17
+ it('should extract name token', function () {
18
+ const string = `<template id="template1">Hello {{ name }}! Wassup? <code>import { red } from 'lib.js'</code></template>`
19
+ const tokens = getTokensFromString(string)
20
+
21
+ strictEqual(tokens.length, 1)
22
+ deepStrictEqual(tokens[0], {
23
+ name: 'name',
24
+ content: '{{ name }}'
25
+ })
26
+ })
27
+ })
package/types/index.js CHANGED
@@ -6,10 +6,10 @@
6
6
  */
7
7
 
8
8
  /**
9
- * Represents the paths to Coralite pages and components within a project.
9
+ * Represents the paths to Coralite pages and templates within a project.
10
10
  * @typedef {Object} CoralitePath
11
11
  * @property {string} pages - The path to the root pages directory
12
- * @property {string} components - The path to the root components directory
12
+ * @property {string} templates - The path to the root templates directory
13
13
  */
14
14
 
15
15
  /**
@@ -18,6 +18,9 @@
18
18
  * @property {Object.<string, string[]>} [aliases] - Token aliases and their possible values
19
19
  */
20
20
 
21
+ /**
22
+ * @typedef {Object.<string, (string | (CoraliteTextNode | CoraliteElement)[])>} CoraliteModuleValues
23
+ */
21
24
 
22
25
  /**
23
26
  * @typedef {Object} CoraliteModule
@@ -50,9 +53,8 @@
50
53
 
51
54
  /**
52
55
  * @typedef {Object} CoraliteTextNodeToken
53
- * @property {'text'} type - Type of text node ('text')
54
- * @property {string} data - Text node raw data
55
- * @property {CoraliteElement} parent - Parent element of the text node
56
+ * @property {CoraliteTextNode} textNode - Text node that contains the token
57
+ * @property {CoraliteToken[]} tokens - Array of associated tokens
56
58
  */
57
59
 
58
60
  /**
@@ -67,8 +69,9 @@
67
69
  * @property {string} name - Tag name
68
70
  * @property {Object.<string, string>} attribs - Element attributes
69
71
  * @property {CoraliteAnyNode[]} children - Child nodes of the element
70
- * @property {CoraliteElement | CoraliteDocumentRoot} parent - Parent element
72
+ * @property {CoraliteContentNode} parent - Parent element
71
73
  * @property {number} [parentChildIndex] - Position in parent's child list
74
+ * @property {Object[]} [slots]
72
75
  */
73
76
 
74
77
 
@@ -76,11 +79,20 @@
76
79
  * @typedef {Object} CoraliteTextNode
77
80
  * @property {'text'} type - Text node type
78
81
  * @property {string} data - Additional attributes for the text node
79
- * @property {CoraliteElement} parent - Parent element of the text node
82
+ * @property {CoraliteContentNode} parent - Parent element of the text node
83
+ */
84
+
85
+ /**
86
+ * @typedef {Object} CoraliteComment
87
+ * @property {'comment'} type - Comment type
88
+ * @property {string} data - Additional attributes for the text node
89
+ * @property {CoraliteContentNode} parent - Parent element of the text node
80
90
  */
81
91
 
92
+
82
93
  /**
83
- * @typedef {CoraliteDirective | CoraliteElement | CoraliteTextNode} CoraliteAnyNode
94
+ * @typedef {CoraliteElement | CoraliteTextNode | CoraliteComment} CoraliteAnyNode
95
+ * @typedef {CoraliteElement | CoraliteDocumentRoot} CoraliteContentNode
84
96
  */
85
97
 
86
98
  /**
@@ -100,7 +112,7 @@
100
112
  /**
101
113
  * @typedef {Object} CoraliteDocumentRoot
102
114
  * @property {'root'} type - Node type
103
- * @property {CoraliteAnyNode[]} children - Document list
115
+ * @property {(CoraliteAnyNode | CoraliteDirective)[]} children - Document list
104
116
  */
105
117
 
106
118
  /**
@@ -109,6 +121,5 @@
109
121
  * @property {string} parentPath - Parent file path
110
122
  * @property {CoraliteDocumentRoot} root - Array of elements and text nodes in the document
111
123
  * @property {CoraliteElement[]} customElements - Custom elements defined in the document
112
- * @property {Object.<string, CoraliteSlotElement[]>} customElementSlots - Slots with their respective elements
113
124
  * @property {CoralitePath} path - Document's file path
114
125
  */
@@ -0,0 +1,57 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="210mm"
6
+ height="297mm"
7
+ viewBox="0 0 210 297"
8
+ version="1.1"
9
+ id="svg1"
10
+ xml:space="preserve"
11
+ inkscape:version="1.4 (1:1.4+202410161351+e7c3feb100)"
12
+ sodipodi:docname="logo.svg"
13
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
14
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
15
+ xmlns="http://www.w3.org/2000/svg"
16
+ xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
17
+ id="namedview1"
18
+ pagecolor="#505050"
19
+ bordercolor="#eeeeee"
20
+ borderopacity="1"
21
+ inkscape:showpageshadow="0"
22
+ inkscape:pageopacity="0"
23
+ inkscape:pagecheckerboard="0"
24
+ inkscape:deskcolor="#505050"
25
+ inkscape:document-units="mm"
26
+ inkscape:zoom="0.70710678"
27
+ inkscape:cx="1715.4411"
28
+ inkscape:cy="-318.90516"
29
+ inkscape:window-width="2560"
30
+ inkscape:window-height="1371"
31
+ inkscape:window-x="0"
32
+ inkscape:window-y="0"
33
+ inkscape:window-maximized="1"
34
+ inkscape:current-layer="layer1"
35
+ showguides="true"><sodipodi:guide
36
+ position="110.89681,253.6422"
37
+ orientation="1,0"
38
+ id="guide1"
39
+ inkscape:locked="false" /></sodipodi:namedview><defs
40
+ id="defs1" /><g
41
+ inkscape:label="Layer 1"
42
+ inkscape:groupmode="layer"
43
+ id="layer1"><path
44
+ style="fill:#000000"
45
+ d="m 298.57278,-42.548343 -1.57193,-0.95101 -8.46667,-4.82686 -8.46666,-4.82685 -7.54063,-4.25358 -7.54062,-4.25357 -9.92188,-5.54313 -9.92187,-5.54312 -0.83747,-0.7842 -0.83748,-0.7842 -0.29184,-1.08381 -0.29184,-1.08381 0.071,-34.349607 0.071,-34.34961 0.45352,-0.82838 0.45352,-0.82838 0.74506,-0.62683 0.74505,-0.62683 3.69622,-2.09811 3.69622,-2.09811 5.29166,-3.03444 5.29167,-3.03444 7.14375,-4.10268 7.14375,-4.10269 4.49791,-2.55913 4.49792,-2.55913 5.82083,-3.39734 5.82084,-3.39733 2.4974,-1.31786 1.40074,-2e-5 c 2.86306,1.50973 6.36082,3.41854 9.45889,5.21825 l 8.3388,4.84409 18.91771,10.78535 18.9177,10.78535 0.84627,0.80042 0.84627,0.80042 0.27821,1.29725 0.27821,1.29724 -0.006,33.91979 -0.006,33.919787 -0.49105,1.05833 -0.49104,1.05833 -0.89221,0.81561 -0.8922,0.8156 -10.05417,5.64853 -10.05417,5.64852 -17.05914,9.7416 -17.05915,9.7416 h -1.47725 -1.47725 z m -10.07626,-28.1711 c -4.18857,-0.51534 -7.77638,-1.17424 -10.84552,-2.53296 -2.92767,-1.2961 -5.36699,-3.24983 -8.06878,-5.47912 -0.94895,-0.89498 -1.34047,-3.57834 0.005,-4.97691 1.34533,-1.39856 3.76756,-1.16911 4.92419,-0.27754 l 4.37699,4.02218 c 3.86085,2.30005 8.30646,2.74342 12.6829,3.2415 1.12639,-0.19663 1.56927,-0.94448 1.32865,-2.24354 -1.88926,-1.88481 -3.92259,-3.6124 -5.93549,-5.3617 -2.95933,-2.86246 -6.11886,-5.27287 -9.85143,-7.02012 -7.50215,-0.56709 -13.13233,-2.0385 -18.58347,-6.33354 -0.63866,-0.58882 -0.58007,-2.610077 0.39438,-3.820617 0.97445,-1.21054 3.30629,-1.58259 4.48868,-0.94795 l 1.79605,1.30939 c 1.9763,1.476157 5.23436,3.310727 7.71354,2.827177 l 0.38902,-0.14928 c -0.2606,-1.02271 -0.97521,-1.785997 -1.54093,-2.645167 -0.51971,-0.82928 -1.27764,-1.60239 -2.1114,-2.20081 -0.83377,-0.59842 -1.64526,-0.90244 -2.5306,-1.25733 -1.85425,-0.84855 -3.2686,-1.87817 -4.85167,-3.70328 -1.58306,-1.82511 -3.05131,-4.5981 -4.30168,-7.08018 -0.75466,-3.36601 2.78893,-5.94414 5.70784,-3.02773 l 1.31327,2.46697 c 0.64344,1.68533 1.69338,2.86145 2.91215,4.12628 l 1.59888,1.65931 c 0.44025,0.17148 0.66734,0.0958 1.08174,-0.0661 0.84942,-1.81566 0.35088,-3.71933 0.0963,-5.60376 -0.0771,-0.72919 0.25197,-2.94957 2.76903,-3.2113 2.51706,-0.26173 4.13752,1.51643 3.83534,5.44163 -0.52005,8.56828 -0.26417,10.4647 2.97336,13.27877 0.74309,0.645897 2.30507,0.527127 2.8468,0.23536 0.54173,-0.29177 2.10712,-2.70109 2.10712,-2.70109 1.21222,-3.1555 1.37903,-10.89808 -0.65124,-12.90162 l -3.04271,-1.78178 -3.0427,-1.78178 c -9.66534,-5.24713 -18.86526,-11.36145 -28.69225,-16.30833 h -0.13983 -0.13984 v 28.70397 28.703977 l 0.99219,0.62357 0.99218,0.62357 4.8948,2.77803 4.89479,2.77804 10.71562,6.04275 10.71563,6.04275 7.40833,4.20767 7.40834,4.20767 0.26458,0.25535 0.26458,0.25534 0.0767,-7.35561 0.0767,-7.35562 c -0.57447,-4.95323 -5.68058,-5.29653 -9.71606,-5.70649 z m 40.98193,6.54806 24.01094,-13.71052 v -28.821247 -28.82126 h -0.15091 -0.15091 l -2.93408,1.62115 -2.93407,1.62114 -2.93429,1.71817 -2.93428,1.71817 -6.48229,3.70518 -6.4823,3.70518 -5.23307,3.04119 -5.23308,3.04118 -0.25377,0.47418 -0.25377,0.47417 c -0.26941,4.96868 -1.09667,9.64087 -3.47683,14.07358 -1.69223,3.712857 -5.30682,5.714467 -8.70147,7.705777 l -0.54736,1.02276 0.1514,5.10296 1.45693,1.08607 c 5.67445,-2.83566 1.54564,-1.93404 13.38272,-9.83269 3.07431,-2.97393 4.88489,-6.766477 5.93014,-10.879157 v -10.37529 c 0.13391,-1.41756 1.94903,-2.7093 3.40012,-2.69712 1.06101,0.009 3.43024,1.04801 3.22824,3.03314 l -0.34835,5.38821 0.90433,0.75053 c 3.33504,-1.51403 4.69062,-5.0797 6.26629,-8.16827 0.97075,-1.53729 2.7696,-1.71246 3.80687,-1.24363 1.04653,0.47303 2.57757,1.58139 2.12235,3.72429 -1.46348,3.32572 -3.24133,6.51266 -5.86172,9.07156 -1.73969,1.7013 -4.10964,2.52776 -6.25726,3.60737 -1.51107,1.38197 -2.53112,3.0008 -3.40807,4.838067 l 0.56672,0.90442 c 1.48661,0.28482 2.67301,-0.0267 4.02291,-0.66867 2.1239,-0.69205 3.44563,-2.465717 4.9658,-4.013347 1.26664,-1.11381 3.28221,-0.93637 4.3817,0.15604 1.01689,1.01035 2.22424,2.490017 0.51147,4.790587 -2.60642,2.57748 -5.8419,4.41711 -9.3084,5.57628 -3.03449,0.84327 -6.28531,0.66144 -9.41735,0.8293 -5.67408,2.56503 -10.77555,6.67564 -14.90465,11.3215 -0.12583,0.95067 0.60449,1.62337 1.10001,2.38125 8.33436,-0.31258 11.28603,-1.13059 17.53711,-7.21661 1.55169,-1.24954 2.98403,-0.69057 4.09457,0.23271 0.97058,0.80691 2.15291,2.67844 0.33502,5.13182 -3.0026,3.14278 -6.80257,5.16246 -10.87168,6.58737 -5.11102,1.61153 -5.75631,0.6512 -14.34832,2.58785 -1.45383,0.90224 -2.43548,2.05077 -3.28667,3.52477 l -0.0808,7.89358 -0.0808,7.89357 0.34535,-0.0884 0.34536,-0.0884 z m -31.15468,-22.09368 v -10.59474 -10.594737 c -1.21811,-0.809 -2.297,-1.551 -3.48536,-2.26664 -0.89719,-0.53464 -1.78527,-1.08465 -2.68586,-1.61357 -0.31275,3.34128 0.44282,6.84642 -0.80526,10.00488 -0.99294,3.487347 -3.6408,4.276487 -4.22057,7.307357 0.0134,1.23318 0.71869,1.80546 1.05187,2.12602 3.23777,2.84588 5.88297,5.14625 8.02851,6.61953 0.64135,0.29443 1.72516,-0.27102 2.11667,-0.9881 z m 12.43534,-24.938637 -2.70426,1.60096 -2.70427,1.60096 -0.54459,1.01758 v 5.74979 c 0.36869,0.71878 0.89171,0.93045 1.56908,0.635 3.24646,-2.5687 4.4255,-6.5793 4.38404,-10.60429 z m 42.46569,-31.82138 -0.004,-0.15227 -0.004,-0.15227 -48.10265,-27.64896 h -0.15409 -0.15408 l -0.012,31.08854 c 0,2.08154 -0.7647,3.48702 -3.13224,3.50919 -3.06395,-0.10276 -3.52357,-1.91844 -3.52357,-5.15623 0.0746,-6.60115 -0.0784,-12.80544 -0.0784,-29.43495 -14.16045,8.03959 -27.12211,15.92816 -48.02187,27.55611 v 0.17795 0.17794 c 0,-0.17794 51.72983,29.49604 51.44512,29.49604 h 0.28471 c -0.28471,0 51.45707,-29.46109 51.45707,-29.46109 z m -54.7635,25.88921 -0.006,-12.03019 c 0.34808,-1.15737 1.99053,-1.99921 3.36254,-1.9775 1.16883,0.0185 2.92444,1.15781 2.98746,2.7459 l -0.008,11.09643 c -0.95461,1.07394 -1.64367,1.8698 -3.02106,1.90043 -1.67841,0.0373 -2.14819,-0.64251 -3.31494,-1.73507 z m -12.52508,-6.92125 -0.31569,-1.24334 c -0.11483,-1.1976 -1.14333,-2.4324 -1.58426,-2.60131 -2.5898,-1.11888 -4.50207,-3.31215 -6.27131,-5.44384 0,0 -2.5337,-4.29153 -2.8068,-5.83127 -0.2731,-1.53974 -0.4918,-3.67807 1.29544,-4.69356 1.56481,-1.03909 3.09017,-0.40037 4.06329,0.59164 0.22935,0.2338 0.59072,0.63992 0.83322,1.54495 1.2604,3.99784 1.87196,5.21392 4.34289,7.53236 1.8928,0.47066 1.95147,-0.36269 2.18882,-1.16123 l -0.37803,-13.84185 c 0.2388,-1.11462 0.96833,-2.74078 3.19205,-2.77147 1.60472,-0.27199 2.55717,1.09367 3.33001,2.27321 l -0.0348,16.42737 c -0.008,0.49315 -0.14139,0.59992 -0.40939,1.60011 -1.21143,4.52112 -1.38432,4.48276 -1.14026,7.56628 l 0.18134,2.29125 -0.35232,1.11008 h -0.32455 -0.32455 z m 24.67877,2.48135 0.31631,-5.34968 -1.44627,-4.49792 -0.2227,-17.4625 c 0,-2.38787 1.9467,-3.22837 3.25251,-3.18388 1.60631,0.0547 3.21089,0.96188 3.21089,2.37032 l -0.35191,14.04273 c 0.0754,1.12281 0.71202,1.622 1.90993,1.49755 l 0.98333,-0.65074 c 2.46876,-1.7082 3.16023,-5.36831 4.04009,-8.1083 0.42784,-1.16565 2.38625,-1.71294 3.76761,-1.36012 1.30785,0.33406 2.72705,1.89604 2.32151,3.27907 -0.74484,3.03808 -2.10117,6.48213 -4.56128,9.26878 -0.92742,1.29941 -2.19183,2.10943 -3.47617,3.00939 -1.23785,0.67732 -2.07858,1.44717 -2.82604,2.58937 l -0.34385,2.15447 -0.49476,0.30898 -0.49476,0.30899 -2.31215,1.32576 -2.31214,1.32576 c -0.5695,0.24074 -0.88955,-0.0486 -0.96015,-0.86803 z"
46
+ id="path1"
47
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccsczccccccczcccczzczccccccczcszccccccccccccccccccccccccccccccccccccccccccccccsccccscccccccsccccccsccccccccccccccccccccccccccccccccccccccccccccsccsccccczcscccccccsccccccccccscccccsccccccccccc" /><text
48
+ xml:space="preserve"
49
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:83.8112px;line-height:2;font-family:'Edu AU VIC WA NT Pre';-inkscape-font-specification:'Edu AU VIC WA NT Pre Semi-Bold';text-align:center;text-decoration-color:#000000;letter-spacing:-0.402293px;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#000000;stroke-width:1.43066"
50
+ x="549.49823"
51
+ y="-72.142212"
52
+ id="text1"><tspan
53
+ sodipodi:role="line"
54
+ id="tspan1"
55
+ style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:'Edu AU VIC WA NT Pre';-inkscape-font-specification:'Edu AU VIC WA NT Pre Semi-Bold';stroke-width:1.43066"
56
+ x="549.29706"
57
+ y="-72.142212">Coralite</tspan></text></g></svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="479.0517mm"
6
+ height="138.19606mm"
7
+ viewBox="0 0 479.0517 138.19606"
8
+ version="1.1"
9
+ id="svg1"
10
+ xml:space="preserve"
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ xmlns:svg="http://www.w3.org/2000/svg"><defs
13
+ id="defs1" /><g
14
+ id="layer1"
15
+ transform="translate(-242.88389,179.7934)"><path
16
+ style="fill:#000000"
17
+ d="m 298.57278,-42.548343 -1.57193,-0.95101 -8.46667,-4.82686 -8.46666,-4.82685 -7.54063,-4.25358 -7.54062,-4.25357 -9.92188,-5.54313 -9.92187,-5.54312 -0.83747,-0.7842 -0.83748,-0.7842 -0.29184,-1.08381 -0.29184,-1.08381 0.071,-34.349607 0.071,-34.34961 0.45352,-0.82838 0.45352,-0.82838 0.74506,-0.62683 0.74505,-0.62683 3.69622,-2.09811 3.69622,-2.09811 5.29166,-3.03444 5.29167,-3.03444 7.14375,-4.10268 7.14375,-4.10269 4.49791,-2.55913 4.49792,-2.55913 5.82083,-3.39734 5.82084,-3.39733 2.4974,-1.31786 1.40074,-2e-5 c 2.86306,1.50973 6.36082,3.41854 9.45889,5.21825 l 8.3388,4.84409 18.91771,10.78535 18.9177,10.78535 0.84627,0.80042 0.84627,0.80042 0.27821,1.29725 0.27821,1.29724 -0.006,33.91979 -0.006,33.919787 -0.49105,1.05833 -0.49104,1.05833 -0.89221,0.81561 -0.8922,0.8156 -10.05417,5.64853 -10.05417,5.64852 -17.05914,9.7416 -17.05915,9.7416 h -1.47725 -1.47725 z m -10.07626,-28.1711 c -4.18857,-0.51534 -7.77638,-1.17424 -10.84552,-2.53296 -2.92767,-1.2961 -5.36699,-3.24983 -8.06878,-5.47912 -0.94895,-0.89498 -1.34047,-3.57834 0.005,-4.97691 1.34533,-1.39856 3.76756,-1.16911 4.92419,-0.27754 l 4.37699,4.02218 c 3.86085,2.30005 8.30646,2.74342 12.6829,3.2415 1.12639,-0.19663 1.56927,-0.94448 1.32865,-2.24354 -1.88926,-1.88481 -3.92259,-3.6124 -5.93549,-5.3617 -2.95933,-2.86246 -6.11886,-5.27287 -9.85143,-7.02012 -7.50215,-0.56709 -13.13233,-2.0385 -18.58347,-6.33354 -0.63866,-0.58882 -0.58007,-2.610077 0.39438,-3.820617 0.97445,-1.21054 3.30629,-1.58259 4.48868,-0.94795 l 1.79605,1.30939 c 1.9763,1.476157 5.23436,3.310727 7.71354,2.827177 l 0.38902,-0.14928 c -0.2606,-1.02271 -0.97521,-1.785997 -1.54093,-2.645167 -0.51971,-0.82928 -1.27764,-1.60239 -2.1114,-2.20081 -0.83377,-0.59842 -1.64526,-0.90244 -2.5306,-1.25733 -1.85425,-0.84855 -3.2686,-1.87817 -4.85167,-3.70328 -1.58306,-1.82511 -3.05131,-4.5981 -4.30168,-7.08018 -0.75466,-3.36601 2.78893,-5.94414 5.70784,-3.02773 l 1.31327,2.46697 c 0.64344,1.68533 1.69338,2.86145 2.91215,4.12628 l 1.59888,1.65931 c 0.44025,0.17148 0.66734,0.0958 1.08174,-0.0661 0.84942,-1.81566 0.35088,-3.71933 0.0963,-5.60376 -0.0771,-0.72919 0.25197,-2.94957 2.76903,-3.2113 2.51706,-0.26173 4.13752,1.51643 3.83534,5.44163 -0.52005,8.56828 -0.26417,10.4647 2.97336,13.27877 0.74309,0.645897 2.30507,0.527127 2.8468,0.23536 0.54173,-0.29177 2.10712,-2.70109 2.10712,-2.70109 1.21222,-3.1555 1.37903,-10.89808 -0.65124,-12.90162 l -3.04271,-1.78178 -3.0427,-1.78178 c -9.66534,-5.24713 -18.86526,-11.36145 -28.69225,-16.30833 h -0.13983 -0.13984 v 28.70397 28.703977 l 0.99219,0.62357 0.99218,0.62357 4.8948,2.77803 4.89479,2.77804 10.71562,6.04275 10.71563,6.04275 7.40833,4.20767 7.40834,4.20767 0.26458,0.25535 0.26458,0.25534 0.0767,-7.35561 0.0767,-7.35562 c -0.57447,-4.95323 -5.68058,-5.29653 -9.71606,-5.70649 z m 40.98193,6.54806 24.01094,-13.71052 v -28.821247 -28.82126 h -0.15091 -0.15091 l -2.93408,1.62115 -2.93407,1.62114 -2.93429,1.71817 -2.93428,1.71817 -6.48229,3.70518 -6.4823,3.70518 -5.23307,3.04119 -5.23308,3.04118 -0.25377,0.47418 -0.25377,0.47417 c -0.26941,4.96868 -1.09667,9.64087 -3.47683,14.07358 -1.69223,3.712857 -5.30682,5.714467 -8.70147,7.705777 l -0.54736,1.02276 0.1514,5.10296 1.45693,1.08607 c 5.67445,-2.83566 1.54564,-1.93404 13.38272,-9.83269 3.07431,-2.97393 4.88489,-6.766477 5.93014,-10.879157 v -10.37529 c 0.13391,-1.41756 1.94903,-2.7093 3.40012,-2.69712 1.06101,0.009 3.43024,1.04801 3.22824,3.03314 l -0.34835,5.38821 0.90433,0.75053 c 3.33504,-1.51403 4.69062,-5.0797 6.26629,-8.16827 0.97075,-1.53729 2.7696,-1.71246 3.80687,-1.24363 1.04653,0.47303 2.57757,1.58139 2.12235,3.72429 -1.46348,3.32572 -3.24133,6.51266 -5.86172,9.07156 -1.73969,1.7013 -4.10964,2.52776 -6.25726,3.60737 -1.51107,1.38197 -2.53112,3.0008 -3.40807,4.838067 l 0.56672,0.90442 c 1.48661,0.28482 2.67301,-0.0267 4.02291,-0.66867 2.1239,-0.69205 3.44563,-2.465717 4.9658,-4.013347 1.26664,-1.11381 3.28221,-0.93637 4.3817,0.15604 1.01689,1.01035 2.22424,2.490017 0.51147,4.790587 -2.60642,2.57748 -5.8419,4.41711 -9.3084,5.57628 -3.03449,0.84327 -6.28531,0.66144 -9.41735,0.8293 -5.67408,2.56503 -10.77555,6.67564 -14.90465,11.3215 -0.12583,0.95067 0.60449,1.62337 1.10001,2.38125 8.33436,-0.31258 11.28603,-1.13059 17.53711,-7.21661 1.55169,-1.24954 2.98403,-0.69057 4.09457,0.23271 0.97058,0.80691 2.15291,2.67844 0.33502,5.13182 -3.0026,3.14278 -6.80257,5.16246 -10.87168,6.58737 -5.11102,1.61153 -5.75631,0.6512 -14.34832,2.58785 -1.45383,0.90224 -2.43548,2.05077 -3.28667,3.52477 l -0.0808,7.89358 -0.0808,7.89357 0.34535,-0.0884 0.34536,-0.0884 z m -31.15468,-22.09368 v -10.59474 -10.594737 c -1.21811,-0.809 -2.297,-1.551 -3.48536,-2.26664 -0.89719,-0.53464 -1.78527,-1.08465 -2.68586,-1.61357 -0.31275,3.34128 0.44282,6.84642 -0.80526,10.00488 -0.99294,3.487347 -3.6408,4.276487 -4.22057,7.307357 0.0134,1.23318 0.71869,1.80546 1.05187,2.12602 3.23777,2.84588 5.88297,5.14625 8.02851,6.61953 0.64135,0.29443 1.72516,-0.27102 2.11667,-0.9881 z m 12.43534,-24.938637 -2.70426,1.60096 -2.70427,1.60096 -0.54459,1.01758 v 5.74979 c 0.36869,0.71878 0.89171,0.93045 1.56908,0.635 3.24646,-2.5687 4.4255,-6.5793 4.38404,-10.60429 z m 42.46569,-31.82138 -0.004,-0.15227 -0.004,-0.15227 -48.10265,-27.64896 h -0.15409 -0.15408 l -0.012,31.08854 c 0,2.08154 -0.7647,3.48702 -3.13224,3.50919 -3.06395,-0.10276 -3.52357,-1.91844 -3.52357,-5.15623 0.0746,-6.60115 -0.0784,-12.80544 -0.0784,-29.43495 -14.16045,8.03959 -27.12211,15.92816 -48.02187,27.55611 v 0.17795 0.17794 c 0,-0.17794 51.72983,29.49604 51.44512,29.49604 h 0.28471 c -0.28471,0 51.45707,-29.46109 51.45707,-29.46109 z m -54.7635,25.88921 -0.006,-12.03019 c 0.34808,-1.15737 1.99053,-1.99921 3.36254,-1.9775 1.16883,0.0185 2.92444,1.15781 2.98746,2.7459 l -0.008,11.09643 c -0.95461,1.07394 -1.64367,1.8698 -3.02106,1.90043 -1.67841,0.0373 -2.14819,-0.64251 -3.31494,-1.73507 z m -12.52508,-6.92125 -0.31569,-1.24334 c -0.11483,-1.1976 -1.14333,-2.4324 -1.58426,-2.60131 -2.5898,-1.11888 -4.50207,-3.31215 -6.27131,-5.44384 0,0 -2.5337,-4.29153 -2.8068,-5.83127 -0.2731,-1.53974 -0.4918,-3.67807 1.29544,-4.69356 1.56481,-1.03909 3.09017,-0.40037 4.06329,0.59164 0.22935,0.2338 0.59072,0.63992 0.83322,1.54495 1.2604,3.99784 1.87196,5.21392 4.34289,7.53236 1.8928,0.47066 1.95147,-0.36269 2.18882,-1.16123 l -0.37803,-13.84185 c 0.2388,-1.11462 0.96833,-2.74078 3.19205,-2.77147 1.60472,-0.27199 2.55717,1.09367 3.33001,2.27321 l -0.0348,16.42737 c -0.008,0.49315 -0.14139,0.59992 -0.40939,1.60011 -1.21143,4.52112 -1.38432,4.48276 -1.14026,7.56628 l 0.18134,2.29125 -0.35232,1.11008 h -0.32455 -0.32455 z m 24.67877,2.48135 0.31631,-5.34968 -1.44627,-4.49792 -0.2227,-17.4625 c 0,-2.38787 1.9467,-3.22837 3.25251,-3.18388 1.60631,0.0547 3.21089,0.96188 3.21089,2.37032 l -0.35191,14.04273 c 0.0754,1.12281 0.71202,1.622 1.90993,1.49755 l 0.98333,-0.65074 c 2.46876,-1.7082 3.16023,-5.36831 4.04009,-8.1083 0.42784,-1.16565 2.38625,-1.71294 3.76761,-1.36012 1.30785,0.33406 2.72705,1.89604 2.32151,3.27907 -0.74484,3.03808 -2.10117,6.48213 -4.56128,9.26878 -0.92742,1.29941 -2.19183,2.10943 -3.47617,3.00939 -1.23785,0.67732 -2.07858,1.44717 -2.82604,2.58937 l -0.34385,2.15447 -0.49476,0.30898 -0.49476,0.30899 -2.31215,1.32576 -2.31214,1.32576 c -0.5695,0.24074 -0.88955,-0.0486 -0.96015,-0.86803 z"
18
+ id="path1" /><path
19
+ d="m 408.49003,-72.100306 q -5.90869,0 -10.60212,-2.640053 -4.69343,-2.681959 -7.79444,-7.543008 -3.10102,-4.902956 -4.19056,-11.565946 -1.08955,-6.704897 0.33524,-14.750777 1.38289,-7.62681 3.60389,-14.03837 2.22099,-6.45346 5.40582,-11.48214 3.18482,-5.07057 7.37538,-8.63255 4.19056,-3.56198 9.47067,-5.40582 5.32201,-1.84385 11.77547,-1.84385 5.61535,0 10.64403,1.84385 5.02867,1.80194 9.764,6.24393 1.96957,1.76004 2.59815,3.93913 0.67049,2.13718 -1.04764,3.85531 -1.71813,1.71813 -3.89722,1.29908 -2.17909,-0.41906 -4.19056,-2.17909 -3.10102,-3.01721 -6.45346,-4.27438 -3.35245,-1.25716 -7.50111,-1.25716 -4.65152,0 -8.46493,1.5086 -3.7715,1.46669 -6.78871,4.27437 -2.97529,2.76577 -5.2801,6.7049 -2.2629,3.93912 -3.85532,8.84208 -1.59241,4.90295 -2.59814,10.64402 -1.00574,5.9925 -0.58668,10.937362 0.46096,4.902956 2.09528,8.506837 1.67622,3.603882 4.31627,5.573445 2.64006,1.927658 5.99251,1.927658 5.36391,0 10.39258,-2.514336 5.02868,-2.556242 9.00971,-6.830613 2.09528,-2.220997 3.64579,-3.059109 1.59241,-0.838112 2.97529,-0.838112 2.09528,0 3.18483,1.089546 1.13145,1.04764 1.17336,2.556241 0,1.424791 -0.83812,2.849581 -0.83811,1.382885 -3.0591,3.855316 -5.1963,5.699161 -12.23644,9.05161 -7.04014,3.352448 -14.37362,3.352448 z m 50.63872,0.419056 q -6.53727,0 -10.26687,-4.86105 -3.7296,-4.902955 -3.7296,-13.24217 0,-7.584914 2.38862,-13.15836 2.43052,-5.57344 6.78871,-8.59065 4.40009,-3.0172 10.30878,-3.0172 1.04764,0 2.43052,0.20953 1.42479,0.16762 2.76577,0.41905 1.34098,0.20953 2.09528,0.37715 0.25143,0 1.00573,0.16763 0.79621,0.12571 2.89149,0.50286 2.13719,0.37715 6.32775,1.21527 2.38862,0.50286 3.56197,1.88575 1.17336,1.38288 1.17336,3.14292 0,2.80767 -1.88575,4.19056 -1.88575,1.34098 -4.73534,1.13145 l -0.96382,-0.16762 q 0.16762,0.54477 0.25143,1.21526 0.0838,0.628584 0.0838,1.340979 0,5.489634 -1.67622,10.434495 -1.63432,4.902955 -4.4839,8.674459 -2.84958,3.771504 -6.57918,5.950595 -3.6877,2.179092 -7.75254,2.179092 z m 0.83811,-9.303044 q 2.64006,0 4.81915,-2.47243 2.22099,-2.514336 3.56197,-6.57918 1.34098,-4.106749 1.34098,-8.925893 0,-3.101013 -1.5505,-4.735333 -1.55051,-1.63432 -4.19056,-1.63432 -2.72387,0 -4.81915,1.92766 -2.05337,1.88575 -3.22673,5.405822 -1.13145,3.478165 -1.13145,8.255403 0,4.022938 1.38288,6.411557 1.42479,2.346714 3.81341,2.346714 z m 43.93391,8.842082 q -2.05338,0 -3.64579,-1.340979 -1.59241,-1.382885 -1.17336,-3.81341 l 3.93913,-22.419497 q 0.12572,-0.628582 0.0838,-1.299072 -0.0419,-0.7124 -0.20953,-1.29907 -0.16762,-0.58668 -0.46096,-0.96383 -0.29334,-0.37715 -0.7543,-0.37715 -1.00573,0 -1.63432,0.46096 -0.58668,0.46096 -1.04764,1.21526 l -1.59241,2.262902 q -0.83811,1.257168 -1.80194,2.09528 -0.92192,0.796207 -1.96956,0.796207 -1.71813,0 -3.10102,-1.04764 -1.34098,-1.089546 -1.34098,-3.268639 0,-1.00573 0.46096,-2.64005 0.46096,-1.67623 2.09528,-3.64579 2.55625,-3.22673 5.07058,-4.98676 2.55624,-1.76004 6.11822,-1.63432 2.80767,0.0419 5.19629,1.21526 2.43053,1.17336 4.02294,3.26864 1.63432,2.09528 1.96956,4.94486 3.22674,-4.77724 5.99251,-7.33348 2.76577,-2.55625 4.98676,-2.55625 1.92766,0 2.72387,0.75431 0.7962,0.71239 1.34098,1.46669 0.58667,0.7543 1.80194,0.7543 1.17335,0 2.38862,-0.7543 1.25716,-0.7543 1.88575,-1.21526 1.17335,-0.7543 2.89148,-0.83811 1.76004,-0.0838 3.14292,0.88002 1.38289,0.96382 1.38289,3.22673 0,1.59241 -0.79621,2.64005 -0.7543,1.00573 -1.84384,1.67622 -1.04764,0.62859 -2.01147,1.13145 -1.67623,0.92193 -3.81341,1.84385 -2.13719,0.92192 -3.52007,0.92192 -1.67623,0 -2.9753,-0.67049 -1.29907,-0.67049 -2.38862,-1.34097 -1.08955,-0.67049 -2.09528,-0.67049 -0.79621,0 -2.2629,1.29907 -1.4667,1.25717 -3.64579,4.232465 -2.17909,2.933392 -5.02867,8.00397 l -2.55624,14.541244 q -0.37715,2.220997 -2.17909,3.352448 -1.76004,1.131451 -3.64579,1.131451 z m 47.16058,0.544773 q -4.02294,0 -6.7049,-2.179091 -2.64005,-2.220997 -3.60388,-6.285841 -0.92192,-4.106749 0.0838,-9.680194 1.34098,-7.501102 4.52581,-12.948835 3.22673,-5.44772 7.83635,-8.42302 4.65152,-2.9753 10.22496,-2.9753 h 12.6974 q 2.55624,0 3.43626,1.67623 0.92192,1.63431 0.41906,4.35818 l -3.39436,19.905158 q -0.20953,1.215263 -0.29334,2.220997 -0.0419,1.005735 0.0419,1.760035 0.12571,0.754301 0.37715,1.215263 0.29334,0.419056 0.7543,0.419056 0.79621,0 1.5086,-0.460962 0.7124,-0.502867 1.25717,-1.257168 l 1.55051,-2.262902 q 0.83811,-1.257168 1.76003,-2.053375 0.96383,-0.838112 2.01147,-0.838112 1.76004,0 3.05911,1.089546 1.34098,1.04764 1.34098,3.226731 0,1.005735 -0.46096,2.681959 -0.41906,1.634318 -2.05338,3.645787 -2.51433,3.184826 -5.07058,4.902955 -2.51433,1.71813 -6.0344,1.71813 -4.73534,0 -7.20777,-3.352448 -2.47243,-3.352448 -2.89148,-8.171592 l 0.0419,-0.921924 q -2.64005,4.274372 -5.2382,7.165858 -2.59814,2.891487 -5.07057,4.358183 -2.47244,1.466696 -4.90296,1.466696 z m 2.84958,-9.261138 q 1.55051,0 3.98103,-2.598147 2.47243,-2.640053 5.32201,-7.543009 2.89149,-4.944861 5.65726,-11.859287 l 0.41906,-2.01147 h -5.53154 q -2.93339,0 -5.40583,1.88576 -2.47243,1.88575 -4.23246,5.280101 -1.76004,3.352448 -2.55624,7.920159 -0.67049,3.981032 0.0419,6.453462 0.7543,2.472431 2.30481,2.472431 z m 51.97971,8.716365 q -3.22673,0 -5.44773,-1.550507 -2.17909,-1.550507 -3.43626,-4.064844 -1.21526,-2.514336 -1.5505,-5.531539 -0.33525,-3.059109 0.16762,-6.076312 l 9.93163,-56.572566 q 0.41905,-2.22099 1.96956,-3.10101 1.55051,-0.92192 3.26864,-0.92192 2.22099,0 3.93912,1.38288 1.71813,1.38289 1.25717,3.93913 l -9.764,55.441108 q -0.25144,1.424791 -0.37715,2.681959 -0.0838,1.215262 0,2.09528 0.0838,0.880017 0.37715,1.382885 0.29333,0.502867 0.7543,0.502867 0.83811,0 1.5505,-0.460962 0.7124,-0.502867 1.21527,-1.257168 l 1.5505,-2.262902 q 0.83812,-1.257168 1.80194,-2.053375 0.96383,-0.838112 2.01147,-0.838112 1.71813,0 3.05911,1.089546 1.34098,1.04764 1.34098,3.226731 0,1.005735 -0.46096,2.681959 -0.41906,1.634318 -2.05337,3.645787 -2.55625,3.184826 -5.07058,4.902955 -2.51434,1.71813 -6.03441,1.71813 z m 31.69728,-50.286718 q -2.2629,0 -3.93913,-1.63432 -1.67622,-1.67623 -1.67622,-4.06485 0,-2.2629 1.63432,-3.93912 1.63432,-1.71813 3.98103,-1.71813 2.221,0 3.98103,1.63432 1.80194,1.59241 1.80194,4.02293 0,2.38862 -1.71813,4.06485 -1.67622,1.63432 -4.06484,1.63432 z m -1.76003,50.286718 q -3.18483,0 -5.40583,-1.508602 -2.17909,-1.508601 -3.43626,-3.981032 -1.25716,-2.514336 -1.63432,-5.489634 -0.33524,-3.017203 0.12572,-6.034406 l 3.64579,-20.366124 q 0.0838,-0.7543 0.67049,-1.84384 0.62858,-1.08955 1.92766,-1.88576 1.34098,-0.83811 3.56197,-0.83811 2.51434,0 3.6877,1.38289 1.17335,1.34098 0.7543,3.72959 l -3.52007,19.821354 q -0.33525,1.927658 -0.41906,3.436259 -0.0419,1.508602 0.20953,2.346714 0.29334,0.838112 0.92192,0.838112 0.83811,0 1.55051,-0.460962 0.71239,-0.502867 1.21526,-1.257168 l 1.55051,-2.262902 q 0.83811,-1.257168 1.80194,-2.053375 0.96383,-0.838112 2.01147,-0.838112 1.71813,0 3.05911,1.089546 1.34098,1.04764 1.34098,3.226731 0,1.005735 -0.46097,2.681959 -0.41905,1.634318 -2.05337,3.645787 -2.55624,3.184826 -5.07058,4.902955 -2.51433,1.71813 -6.0344,1.71813 z m 32.07454,0 q -3.18483,0 -5.40583,-1.508602 -2.17909,-1.508601 -3.47816,-3.939126 -1.25717,-2.472431 -1.63432,-5.447728 -0.33525,-2.975298 0.16762,-5.950596 l 2.80768,-16.091746 h -5.86679 q -2.59814,0 -3.93912,-1.25717 -1.34098,-1.25717 -1.34098,-3.22673 0,-1.96957 1.34098,-3.22674 1.34098,-1.29907 3.89722,-1.29907 h 7.5011 l 3.89722,-22.20997 q 0.33525,-1.84384 1.88575,-2.84958 1.59242,-1.04764 3.31055,-1.04764 1.46669,0 2.80767,0.46096 1.34098,0.46096 2.09528,1.55051 0.7543,1.04764 0.41906,2.89149 l -3.7296,21.20423 h 6.95633 q 2.64005,0 3.98103,1.29907 1.34098,1.25717 1.34098,3.22674 0,1.96956 -1.34098,3.22673 -1.34098,1.25717 -3.98103,1.25717 h -8.50684 l -2.89149,16.385085 q -0.25143,1.299074 -0.33524,2.430525 -0.0419,1.131452 0.0419,1.969564 0.0838,0.838112 0.33524,1.299073 0.25143,0.460962 0.7543,0.460962 0.83811,0 1.55051,-0.460962 0.71239,-0.502867 1.21526,-1.257168 l 1.59241,-2.262902 q 0.83812,-1.257168 1.76004,-2.053375 0.96383,-0.838112 1.96956,-0.838112 1.76004,0 3.10102,1.089546 1.34098,1.04764 1.34098,3.226731 0,1.005735 -0.46097,2.681959 -0.41905,1.634318 -2.09528,3.645787 -2.51433,3.184826 -5.07057,4.902955 -2.51434,1.71813 -5.9925,1.71813 z m 32.61939,0.754301 q -6.36966,0 -9.6802,-3.729599 -3.26864,-3.771504 -3.26864,-10.769739 0,-5.741068 1.92766,-10.937362 1.92766,-5.238199 5.1963,-9.303039 3.31054,-4.06485 7.5011,-6.36966 4.23247,-2.34671 8.84208,-2.34671 5.40582,0 8.12969,2.2629 2.76577,2.26291 2.76577,6.57918 0,2.01147 -0.92193,3.89722 -0.88001,1.88576 -2.59814,3.64579 -1.67623,1.760036 -4.02294,3.43626 -2.34671,1.634318 -5.2382,3.268637 -2.01147,1.173356 -5.02867,2.723864 -3.01721,1.508601 -6.16013,3.017203 0,0.712395 0.0838,1.340979 0.0838,0.586679 0.20952,1.131451 0.29334,1.299074 1.08955,2.220997 0.79621,0.880018 1.92766,0.880018 2.05337,0 4.10675,-1.089546 2.09528,-1.131451 3.72959,-3.14292 1.84385,-2.137185 3.81341,-2.723864 2.01147,-0.586678 3.60389,0.628584 0.7962,0.586679 1.29907,1.71813 0.54477,1.089545 0.29334,2.640053 -0.20953,1.508601 -1.71813,3.352448 -2.89149,3.52007 -7.12395,5.61535 -4.19056,2.053375 -8.75827,2.053375 z m -1.34098,-23.509043 q 1.29907,-0.670489 2.64005,-1.42479 1.34098,-0.754301 2.64005,-1.466696 2.47243,-1.42479 4.19056,-2.68196 1.71813,-1.29907 2.68196,-2.38862 0.96383,-1.13145 0.96383,-2.05337 0,-0.67049 -0.41906,-1.21526 -0.41905,-0.58668 -1.21526,-0.58668 -2.55624,0 -4.81914,1.5505 -2.221,1.50861 -3.93913,4.19056 -1.67622,2.640057 -2.72386,6.076316 z"
20
+ id="text1"
21
+ style="font-weight:600;font-size:83.8112px;line-height:2;font-family:'Edu AU VIC WA NT Pre';-inkscape-font-specification:'Edu AU VIC WA NT Pre Semi-Bold';text-align:center;letter-spacing:-0.402293px;text-anchor:middle;fill:#000000;stroke-width:1.43066"
22
+ aria-label="Coralite" /></g></svg>