@echelon-foundry/design-system 0.4.1 → 0.5.0-main.231.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.
Files changed (97) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/all.css +27 -0
  3. package/dist/build-metrics.json +166 -2
  4. package/dist/components.css +27 -0
  5. package/dist/icons/add.svg +1 -0
  6. package/dist/icons/agent.svg +1 -0
  7. package/dist/icons/arrow-left.svg +1 -0
  8. package/dist/icons/arrow-right.svg +1 -0
  9. package/dist/icons/bell.svg +1 -0
  10. package/dist/icons/bug.svg +1 -0
  11. package/dist/icons/calendar.svg +1 -0
  12. package/dist/icons/chart.svg +1 -0
  13. package/dist/icons/chevron-down.svg +1 -0
  14. package/dist/icons/chevron-up.svg +1 -0
  15. package/dist/icons/clock.svg +1 -0
  16. package/dist/icons/close.svg +1 -0
  17. package/dist/icons/code.svg +1 -0
  18. package/dist/icons/copy.svg +1 -0
  19. package/dist/icons/database.svg +1 -0
  20. package/dist/icons/download.svg +1 -0
  21. package/dist/icons/edit.svg +1 -0
  22. package/dist/icons/external-link.svg +1 -0
  23. package/dist/icons/file.svg +1 -0
  24. package/dist/icons/filter.svg +1 -0
  25. package/dist/icons/folder.svg +1 -0
  26. package/dist/icons/home.svg +1 -0
  27. package/dist/icons/html/add.html +1 -0
  28. package/dist/icons/html/agent.html +1 -0
  29. package/dist/icons/html/arrow-left.html +1 -0
  30. package/dist/icons/html/arrow-right.html +1 -0
  31. package/dist/icons/html/bell.html +1 -0
  32. package/dist/icons/html/bug.html +1 -0
  33. package/dist/icons/html/calendar.html +1 -0
  34. package/dist/icons/html/chart.html +1 -0
  35. package/dist/icons/html/chevron-down.html +1 -0
  36. package/dist/icons/html/chevron-up.html +1 -0
  37. package/dist/icons/html/clock.html +1 -0
  38. package/dist/icons/html/close.html +1 -0
  39. package/dist/icons/html/code.html +1 -0
  40. package/dist/icons/html/copy.html +1 -0
  41. package/dist/icons/html/database.html +1 -0
  42. package/dist/icons/html/download.html +1 -0
  43. package/dist/icons/html/edit.html +1 -0
  44. package/dist/icons/html/external-link.html +1 -0
  45. package/dist/icons/html/file.html +1 -0
  46. package/dist/icons/html/filter.html +1 -0
  47. package/dist/icons/html/folder.html +1 -0
  48. package/dist/icons/html/home.html +1 -0
  49. package/dist/icons/html/lock.html +1 -0
  50. package/dist/icons/html/menu.html +1 -0
  51. package/dist/icons/html/more-horizontal.html +1 -0
  52. package/dist/icons/html/print.html +1 -0
  53. package/dist/icons/html/refresh.html +1 -0
  54. package/dist/icons/html/save.html +1 -0
  55. package/dist/icons/html/search.html +1 -0
  56. package/dist/icons/html/server.html +1 -0
  57. package/dist/icons/html/settings.html +1 -0
  58. package/dist/icons/html/shield.html +1 -0
  59. package/dist/icons/html/sort.html +1 -0
  60. package/dist/icons/html/success.html +1 -0
  61. package/dist/icons/html/trash.html +1 -0
  62. package/dist/icons/html/upload.html +1 -0
  63. package/dist/icons/html/user.html +1 -0
  64. package/dist/icons/html/users.html +1 -0
  65. package/dist/icons/html/warning.html +1 -0
  66. package/dist/icons/html/workflow.html +1 -0
  67. package/dist/icons/lock.svg +1 -0
  68. package/dist/icons/menu.svg +1 -0
  69. package/dist/icons/more-horizontal.svg +1 -0
  70. package/dist/icons/print.svg +1 -0
  71. package/dist/icons/refresh.svg +1 -0
  72. package/dist/icons/registry.json +527 -0
  73. package/dist/icons/save.svg +1 -0
  74. package/dist/icons/search.svg +1 -0
  75. package/dist/icons/server.svg +1 -0
  76. package/dist/icons/settings.svg +1 -0
  77. package/dist/icons/shield.svg +1 -0
  78. package/dist/icons/sort.svg +1 -0
  79. package/dist/icons/success.svg +1 -0
  80. package/dist/icons/trash.svg +1 -0
  81. package/dist/icons/upload.svg +1 -0
  82. package/dist/icons/user.svg +1 -0
  83. package/dist/icons/users.svg +1 -0
  84. package/dist/icons/warning.svg +1 -0
  85. package/dist/icons/workflow.svg +1 -0
  86. package/dist/marketing/forma-all.css +28 -1
  87. package/dist/marketing/forma-echelon-marketing.css +1 -1
  88. package/dist/marketing/forma-marketing-theme-echelon.css +1 -1
  89. package/dist/marketing/forma-marketing.css +1 -1
  90. package/dist/marketing/forma-marketing.manifest.json +7 -7
  91. package/dist/marketing/forma-marketing.sha256 +4 -4
  92. package/dist/patterns/icon.html +1 -0
  93. package/docs/ICONS.md +51 -0
  94. package/figma/component-contracts.json +10 -0
  95. package/package.json +12 -7
  96. package/patterns/icon.html +1 -0
  97. package/schemas/icon-registry.schema.json +173 -0
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "forma": "0.4.1",
3
+ "forma": "0.5.0",
4
4
  "bundle": "echelon-marketing",
5
5
  "description": "Forma presentation artifacts for Echelon marketing sites. Every artifact is a single self-contained CSS file with no imports or relative URLs.",
6
- "releaseTag": "v0.4.1",
6
+ "releaseTag": "v0.5.0",
7
7
  "artifacts": [
8
8
  {
9
9
  "file": "forma-marketing.css",
10
10
  "description": "Brand-neutral marketing layer: core tokens, role defaults, Forma foundations, marketing foundations, components, and layouts.",
11
11
  "bytes": 78117,
12
- "sha256": "28874da37c70ac0f820a73d7a39e2e44a9fcc04df3ed213e424a9f3271a65c03",
12
+ "sha256": "9c84f0b5693e6583d4129ecc4603ed0e723b342463642d1663ba4200426ac41b",
13
13
  "sources": [
14
14
  "dist/tokens.css",
15
15
  "src/marketing/roles.css",
@@ -23,7 +23,7 @@
23
23
  "file": "forma-marketing-theme-echelon.css",
24
24
  "description": "Echelon Marketing Theme: compiled theme tokens and theme hooks. Load after forma-marketing.css.",
25
25
  "bytes": 6295,
26
- "sha256": "01deabdbc7fc522c56e261657e62a06b084876b920a117da6e78e81b5ae952ef",
26
+ "sha256": "2475da7fd4c4236024f0ffd7205044ee8f00556df069da0cb8b24209f491c0d3",
27
27
  "sources": [
28
28
  "build/marketing/echelon-marketing.tokens.css",
29
29
  "themes/echelon/marketing.css"
@@ -33,7 +33,7 @@
33
33
  "file": "forma-echelon-marketing.css",
34
34
  "description": "Single-file Echelon marketing presentation: forma-marketing.css followed by the Echelon theme. Most sites load only this file.",
35
35
  "bytes": 84257,
36
- "sha256": "bf6be3078b577d013fa9eacd50a9dcf71afba73382cf82b41c3069502d2b7212",
36
+ "sha256": "93d9172547f4a59a06cd42592c6f32df5b46032a7039abc9f88de907229e44ef",
37
37
  "sources": [
38
38
  "artifact:forma-marketing.css",
39
39
  "artifact:forma-marketing-theme-echelon.css"
@@ -42,8 +42,8 @@
42
42
  {
43
43
  "file": "forma-all.css",
44
44
  "description": "Complete Forma surface (application components, assessment, and marketing layers) for sites that also present Forma application patterns such as data grids or status lozenges.",
45
- "bytes": 316730,
46
- "sha256": "84dd284067615b97e29ebaba34de54daf6204a3d99cabdc59e6f786b44ad35e3",
45
+ "bytes": 317382,
46
+ "sha256": "e338a6b0b392a4114f91c6ce9fface0284a403b0d7b2c7851640d2702565c62d",
47
47
  "sources": [
48
48
  "dist/all.css"
49
49
  ]
@@ -1,4 +1,4 @@
1
- 28874da37c70ac0f820a73d7a39e2e44a9fcc04df3ed213e424a9f3271a65c03 forma-marketing.css
2
- 01deabdbc7fc522c56e261657e62a06b084876b920a117da6e78e81b5ae952ef forma-marketing-theme-echelon.css
3
- bf6be3078b577d013fa9eacd50a9dcf71afba73382cf82b41c3069502d2b7212 forma-echelon-marketing.css
4
- 84dd284067615b97e29ebaba34de54daf6204a3d99cabdc59e6f786b44ad35e3 forma-all.css
1
+ 9c84f0b5693e6583d4129ecc4603ed0e723b342463642d1663ba4200426ac41b forma-marketing.css
2
+ 2475da7fd4c4236024f0ffd7205044ee8f00556df069da0cb8b24209f491c0d3 forma-marketing-theme-echelon.css
3
+ 93d9172547f4a59a06cd42592c6f32df5b46032a7039abc9f88de907229e44ef forma-echelon-marketing.css
4
+ e338a6b0b392a4114f91c6ce9fface0284a403b0d7b2c7851640d2702565c62d forma-all.css
@@ -0,0 +1 @@
1
+ <ef-icon class="ef-component-tag"><span class="ef-icon" data-ef-icon="search"><svg xmlns="http://www.w3.org/2000/svg" class="ef-icon__svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="10.3" cy="10.3" r="6.2"/><path d="M15 15L20.5 20.5"/></svg></span></ef-icon>
package/docs/ICONS.md ADDED
@@ -0,0 +1,51 @@
1
+ # Forma icons (foundation preview)
2
+
3
+ The icon registry is in `icons/registry.json`, validated by `schemas/icon-registry.schema.json` and compiled by `tools/icons/build.mjs`. It now contains forty first-party outline icons, including the eight foundation icons: add, agent, close, edit, search, success, warning and workflow. The compiler and public catalog are implemented, but Forma Studio/Folio consumer integration and independent visual review remain open.
4
+
5
+ ## Build and validate
6
+
7
+ ```sh
8
+ npm run icons:check
9
+ npm run build
10
+ npm pack --dry-run
11
+ ```
12
+
13
+ The documentation site also publishes a complete categorized, copyable gallery at `/icons/` and one page per icon at `/icons/<name>/`. Each icon page shows the construction on the 24-unit grid, the meaning and when to use or avoid it, the reviewed sizes (16, 20, 24, 32 and 48px), the icon in every colour role including the inverse surface, forced-colour and print behaviour, seven copyable configurations (button with text, icon-only button, inline text, custom size, custom colour, meaningful image, decorative image), the package paths, the downloadable SVG, the release version and digest, an accessibility checklist and related icons. Page guidance lives in `catalog/icons.mjs`; geometry always comes from the compiled registry. The normal Forma build generates:
14
+
15
+ - `dist/icons/<name>.svg`: static SVG for `<img>`, CSS or print use
16
+ - `dist/icons/html/<name>.html`: pre-rendered decorative inline SVG with inert `<ef-icon>` authoring tag and `.ef-icon` presentation span
17
+ - `dist/icons/registry.json`: metadata for static galleries, consumers and tools, stamped with `formaVersion` (the producing package release) and each icon's `svgSha256` so a consumer can verify that bundled geometry matches its pinned release
18
+
19
+ The icon assets are part of the versioned `@echelon-foundry/design-system` tarball; the wildcard export path is `@echelon-foundry/design-system/icons/<name>.svg` and `.../icons/html/<name>.html`. Nothing fetches a CDN and no runtime JavaScript is required.
20
+
21
+ ## HTML usage
22
+
23
+ Use the *generated* HTML snippet from `dist/icons/html/search.html`, rather than hand-copying path geometry. For an application button, put that snippet inside a real button that also carries an accessible name:
24
+
25
+ ```html
26
+ <button type="button" aria-label="Search">
27
+ <!-- paste the version-pinned, generated decorative search snippet here -->
28
+ </button>
29
+ ```
30
+
31
+ Static image alternative, when the icon conveys meaning by itself:
32
+
33
+ ```html
34
+ <img src="/assets/forma/icons/workflow.svg" alt="Workflow" width="24" height="24">
35
+ ```
36
+
37
+ Use `alt=""` on an image that is purely decorative. The generated *inline HTML* SVG is intentionally `aria-hidden="true"`; never depend on it to label a button or convey status. A meaningful standalone inline SVG requires an explicit application-authored `role="img"` and a correct accessible name. Icon names are not translated accessible labels.
38
+
39
+ Default size is `1.25em`. Set `--ef-icon-size: 1rem` or `2rem` on an icon's presentation span or ancestor. Icons inherit text color through `currentColor`; brands and skins must not rewrite the geometry. Avoid assigning only color or icons to communicate success, failure or warning.
40
+
41
+ ## Contribution rules
42
+
43
+ 1. Choose a stable lower-kebab-case ID and an appropriate semantic category.
44
+ 2. Add the icon's guidance (meaning, use for, avoid, example accessible name, related icons) to `catalog/icons.mjs`. The site build fails if any registry icon has no guidance or a related icon does not exist.
45
+ 3. Submit new source geometry in the registry (24-unit grid, 1.8-unit strokes, round caps and joins).
46
+ 4. Mark original art as `origin: original`. Third-party assets are currently disallowed by the compiler until provenance/source/license extension and review are implemented.
47
+ 5. Run `npm run icons:check`, `npm run build`, `npm run site:check` and `npm run release:check`.
48
+ 6. Review at 16, 20, 24, 32 CSS px; light/dark/brand; forced colors; 320px layout; and print.
49
+ 7. Never edit the generated `dist/icons` files, add scripts/filters/external hrefs, or make icons interactive themselves.
50
+
51
+ See `requirements/ICON-SYSTEM.md` and `docs/decisions/ADR-2026-10-07-icon-foundation.md`. Additional work items own production catalog integration, comprehensive browser visual/a11y tests, Forma Studio and Folio consumers, and the next icon batch.
@@ -730,6 +730,16 @@
730
730
  "status": "requires-published-figma-component"
731
731
  }
732
732
  },
733
+ {
734
+ "id": "icon",
735
+ "figmaName": "Forma / Icon",
736
+ "source": "patterns/icon.html",
737
+ "codeConnect": {
738
+ "id": "Forma/icon",
739
+ "nodeUrl": null,
740
+ "status": "requires-published-figma-component"
741
+ }
742
+ },
733
743
  {
734
744
  "id": "identifier",
735
745
  "figmaName": "Forma / Identifier",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@echelon-foundry/design-system",
3
- "version": "0.4.1",
3
+ "version": "0.5.0-main.231.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Zero-runtime HTML and CSS design system for Echelon Foundry applications.",
@@ -28,7 +28,9 @@
28
28
  "./workflow/forma-workflow.schema.json": "./schemas/workflow/1.0/forma-workflow.schema.json",
29
29
  "./contracts/workflow-capabilities.json": "./contracts/workflow-capabilities.json",
30
30
  "./workflow/examples/*": "./examples/workflows/forma/workflows/*",
31
- "./contracts/machine-operability.json": "./contracts/machine-operability.json"
31
+ "./contracts/machine-operability.json": "./contracts/machine-operability.json",
32
+ "./icons/registry.schema.json": "./schemas/icon-registry.schema.json",
33
+ "./icons/*": "./dist/icons/*"
32
34
  },
33
35
  "files": [
34
36
  "dist",
@@ -45,7 +47,9 @@
45
47
  "examples/workflows/fixtures.json",
46
48
  "docs/workflow",
47
49
  "contracts/machine-operability.json",
48
- "CHANGELOG.md"
50
+ "CHANGELOG.md",
51
+ "schemas/icon-registry.schema.json",
52
+ "docs/ICONS.md"
49
53
  ],
50
54
  "scripts": {
51
55
  "clean": "node tools/clean.mjs",
@@ -58,9 +62,9 @@
58
62
  "test:runtime": "node --test tests/zero-runtime.test.mjs",
59
63
  "motion:audit": "node tools/motion-audit.mjs",
60
64
  "test:motion": "node --test tests/motion-audit.test.mjs tests/motion-gate.test.mjs && node tools/motion-audit.mjs --strict",
61
- "check": "npm run build && npm run test:tokens && npm run test:brands && npm run test:runtime && npm run test:motion && npm run test:marketing && npm run test:character-grid && npm run test:figma && npm run test:css && npm run test:package && npm run workflow:test && npm run workflow:build && npm run test:workflow-package && npm run test:browser",
65
+ "check": "npm run build && npm run icons:check && npm run test:tokens && npm run test:brands && npm run test:runtime && npm run test:motion && npm run test:marketing && npm run test:character-grid && npm run test:figma && npm run test:css && npm run test:package && npm run workflow:test && npm run workflow:build && npm run test:workflow-package && npm run test:browser",
62
66
  "site:build": "npm run build && node tools/build-site.mjs",
63
- "site:test": "node --test tests/site-build.test.mjs tests/catalog-coverage.test.mjs",
67
+ "site:test": "node --test tests/site-build.test.mjs tests/catalog-coverage.test.mjs tests/icon-docs.test.mjs",
64
68
  "site:check": "npm run site:build && npm run catalog:check && npm run site:test && npm run site:mobile",
65
69
  "site:mobile": "playwright test --config=playwright.site.config.mjs",
66
70
  "pack:verify": "npm run build && npm pack --dry-run",
@@ -75,7 +79,7 @@
75
79
  "test:marketing": "node --test tests/marketing-tokens.test.mjs tests/marketing-distribution.test.mjs tests/marketing-structure.test.mjs tests/site-css-policy.test.mjs",
76
80
  "example:install": "mkdir -p build/example && cp examples/echelon-marketing-site/forma.lock build/example/forma.lock && bash actions/install-presentation/install.sh --lock build/example/forma.lock --source dist/marketing --update --output examples/echelon-marketing-site/assets/forma",
77
81
  "policy:check": "dotnet run --project tools/SiteCssPolicy/SiteCssPolicy.fsproj --",
78
- "release:check": "npm run build && npm run test:tokens && npm run test:brands && npm run test:runtime && npm run test:motion && npm run test:marketing && npm run test:character-grid && npm run test:css && npm run test:package && npm run test:machine && playwright test tests/browser/marketing.spec.mjs && npm run site:check",
82
+ "release:check": "npm run build && npm run icons:check && npm run test:tokens && npm run test:brands && npm run test:runtime && npm run test:motion && npm run test:marketing && npm run test:character-grid && npm run test:css && npm run test:package && npm run test:machine && playwright test tests/browser/marketing.spec.mjs && npm run site:check",
79
83
  "test:figma": "node --test tests/figma-contract.test.mjs",
80
84
  "catalog:check": "node tools/catalog/validate.mjs && node tools/catalog/inventory.mjs --check",
81
85
  "catalog:inventory": "node tools/catalog/inventory.mjs",
@@ -85,7 +89,8 @@
85
89
  "test:workflow-package": "node --test tests/workflow-package.test.mjs",
86
90
  "test:workflow-browser": "playwright test tests/browser/workflow-static.spec.mjs tests/browser/workflow-embed.spec.mjs",
87
91
  "workflow:check": "npm run workflow:test && npm run workflow:build && npm run test:workflow-package && npm run test:workflow-browser",
88
- "test:machine": "playwright test tests/browser/machine-operability.spec.mjs"
92
+ "test:machine": "playwright test tests/browser/machine-operability.spec.mjs",
93
+ "icons:check": "node --test tests/icons.test.mjs"
89
94
  },
90
95
  "devDependencies": {
91
96
  "@axe-core/playwright": "4.13.0",
@@ -0,0 +1 @@
1
+ <ef-icon class="ef-component-tag"><span class="ef-icon" data-ef-icon="search"><svg xmlns="http://www.w3.org/2000/svg" class="ef-icon__svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="10.3" cy="10.3" r="6.2"/><path d="M15 15L20.5 20.5"/></svg></span></ef-icon>
@@ -0,0 +1,173 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://forma.echelonfoundry.com/schemas/icon-registry.schema.json",
4
+ "title": "Forma icon registry v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "grid",
10
+ "strokeWidth",
11
+ "linecap",
12
+ "linejoin",
13
+ "icons"
14
+ ],
15
+ "properties": {
16
+ "schemaVersion": {
17
+ "const": 1
18
+ },
19
+ "grid": {
20
+ "const": 24
21
+ },
22
+ "strokeWidth": {
23
+ "const": 1.8
24
+ },
25
+ "linecap": {
26
+ "const": "round"
27
+ },
28
+ "linejoin": {
29
+ "const": "round"
30
+ },
31
+ "icons": {
32
+ "type": "array",
33
+ "minItems": 1,
34
+ "items": {
35
+ "$ref": "#/$defs/icon"
36
+ }
37
+ }
38
+ },
39
+ "$defs": {
40
+ "icon": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": [
44
+ "name",
45
+ "category",
46
+ "label",
47
+ "keywords",
48
+ "origin",
49
+ "shapes"
50
+ ],
51
+ "properties": {
52
+ "name": {
53
+ "type": "string",
54
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
55
+ },
56
+ "category": {
57
+ "enum": [
58
+ "actions",
59
+ "navigation",
60
+ "status",
61
+ "workflow",
62
+ "diagnostics",
63
+ "documents",
64
+ "agents"
65
+ ]
66
+ },
67
+ "label": {
68
+ "type": "string",
69
+ "minLength": 1,
70
+ "maxLength": 80
71
+ },
72
+ "keywords": {
73
+ "type": "array",
74
+ "uniqueItems": true,
75
+ "items": {
76
+ "type": "string",
77
+ "minLength": 1,
78
+ "maxLength": 40
79
+ }
80
+ },
81
+ "origin": {
82
+ "const": "original"
83
+ },
84
+ "shapes": {
85
+ "type": "array",
86
+ "minItems": 1,
87
+ "maxItems": 32,
88
+ "items": {
89
+ "oneOf": [
90
+ {
91
+ "type": "object",
92
+ "additionalProperties": false,
93
+ "required": [
94
+ "element",
95
+ "d"
96
+ ],
97
+ "properties": {
98
+ "element": {
99
+ "const": "path"
100
+ },
101
+ "d": {
102
+ "type": "string",
103
+ "minLength": 1,
104
+ "maxLength": 1200
105
+ }
106
+ }
107
+ },
108
+ {
109
+ "type": "object",
110
+ "additionalProperties": false,
111
+ "required": [
112
+ "element",
113
+ "cx",
114
+ "cy",
115
+ "r"
116
+ ],
117
+ "properties": {
118
+ "element": {
119
+ "const": "circle"
120
+ },
121
+ "cx": {
122
+ "type": "number"
123
+ },
124
+ "cy": {
125
+ "type": "number"
126
+ },
127
+ "r": {
128
+ "type": "number",
129
+ "exclusiveMinimum": 0
130
+ }
131
+ }
132
+ },
133
+ {
134
+ "type": "object",
135
+ "additionalProperties": false,
136
+ "required": [
137
+ "element",
138
+ "x",
139
+ "y",
140
+ "width",
141
+ "height"
142
+ ],
143
+ "properties": {
144
+ "element": {
145
+ "const": "rect"
146
+ },
147
+ "x": {
148
+ "type": "number"
149
+ },
150
+ "y": {
151
+ "type": "number"
152
+ },
153
+ "width": {
154
+ "type": "number",
155
+ "exclusiveMinimum": 0
156
+ },
157
+ "height": {
158
+ "type": "number",
159
+ "exclusiveMinimum": 0
160
+ },
161
+ "rx": {
162
+ "type": "number",
163
+ "minimum": 0
164
+ }
165
+ }
166
+ }
167
+ ]
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ }