@origostudio/origo-design 0.0.37 → 0.0.39

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 (137) hide show
  1. package/CHANGELOG.md +3 -2
  2. package/dist/packages/angular-renderer/CHANGELOG.md +21 -0
  3. package/dist/packages/angular-renderer/package.json +7 -6
  4. package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.d.ts +2 -0
  5. package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.js +11 -0
  6. package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.js.map +1 -1
  7. package/dist/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.js.map +1 -1
  8. package/dist/packages/angular-renderer/src/components/primitives/chip/chip.component.js.map +1 -1
  9. package/dist/packages/angular-renderer/src/components/primitives/switch/switch.component.js.map +1 -1
  10. package/dist/packages/angular-renderer/src/devtools/devtools-bridge.js +2 -0
  11. package/dist/packages/angular-renderer/src/devtools/devtools-bridge.js.map +1 -1
  12. package/dist/packages/angular-renderer/src/index.d.ts +1 -0
  13. package/dist/packages/angular-renderer/src/index.js +1 -0
  14. package/dist/packages/angular-renderer/src/index.js.map +1 -1
  15. package/dist/packages/angular-renderer/src/lib/primitives.provider.js +26 -20
  16. package/dist/packages/angular-renderer/src/lib/primitives.provider.js.map +1 -1
  17. package/dist/packages/cli/CHANGELOG.md +8 -0
  18. package/dist/packages/cli/package.json +2 -2
  19. package/dist/packages/cli/package.json.bak +2 -2
  20. package/dist/packages/core/CHANGELOG.md +14 -0
  21. package/dist/packages/core/package.json +2 -2
  22. package/dist/packages/core/package.json.bak +2 -2
  23. package/dist/packages/design-tokens/CHANGELOG.md +8 -0
  24. package/dist/packages/design-tokens/package.json +1 -1
  25. package/dist/packages/playground/browser/{chunk-iSLqhP12.js → chunk-B1z-uVFi.js} +1 -1
  26. package/dist/packages/playground/browser/{chunk-BxusNwwt.js → chunk-BGZXpmBQ.js} +1 -1
  27. package/dist/packages/playground/browser/{chunk-B0HlAWSR.js → chunk-ByrswSrM.js} +1 -1
  28. package/dist/packages/playground/browser/{chunk-rK1aqCb7.js → chunk-CFbPXTNr.js} +1 -1
  29. package/dist/packages/playground/browser/{chunk-Dd9ht4SU.js → chunk-CSecAR9q.js} +1 -1
  30. package/dist/packages/playground/browser/{chunk-BkTn1FbH.js → chunk-D-8Zr5zg.js} +1 -1
  31. package/dist/packages/playground/browser/{chunk-DbylCYBP.js → chunk-D2kcCG-o.js} +1 -1
  32. package/dist/packages/playground/browser/{chunk-zg5PqW0l.js → chunk-DQx5lQqG.js} +1 -1
  33. package/dist/packages/playground/browser/{chunk-DXxUFvGw.js → chunk-Dac2dp5T.js} +1 -1
  34. package/dist/packages/playground/browser/{chunk-CXHFI87Z.js → chunk-DiZkmwKl.js} +1 -1
  35. package/dist/packages/playground/browser/{chunk-BI1AmKI_.js → chunk-DwU-a89u.js} +1 -1
  36. package/dist/packages/playground/browser/{chunk-D2bm1B8y.js → chunk-JF8ksHJn.js} +1 -1
  37. package/dist/packages/playground/browser/{chunk-ZeGfaGFy.js → chunk-_TRKH8kG.js} +1 -1
  38. package/dist/packages/playground/browser/{chunk-DT7GQcHj.js → chunk-e5kB8V0v.js} +1 -1
  39. package/dist/packages/playground/browser/{chunk-94bHXqp1.js → chunk-zJLityDb.js} +1 -1
  40. package/dist/packages/playground/browser/index.html +1 -1
  41. package/dist/packages/playground/browser/main-33XWGVNC.js +731 -0
  42. package/eslint.config.js +2 -1
  43. package/generate_prompts.ps1 +10 -0
  44. package/package.json +3 -2
  45. package/packages/angular-renderer/CHANGELOG.md +21 -0
  46. package/packages/angular-renderer/package.json +7 -6
  47. package/packages/angular-renderer/playwright/.cache/assets/adapter-iYml3Kk6.js +121 -0
  48. package/packages/angular-renderer/playwright/.cache/assets/adapter-iYml3Kk6.js.map +1 -0
  49. package/packages/angular-renderer/playwright/.cache/assets/breadcrumbs.component-DqZwZwH1.js +200 -0
  50. package/packages/angular-renderer/playwright/.cache/assets/breadcrumbs.component-DqZwZwH1.js.map +1 -0
  51. package/packages/angular-renderer/playwright/.cache/assets/button.component-Dnc1mP3D.js +112 -0
  52. package/packages/angular-renderer/playwright/.cache/assets/button.component-Dnc1mP3D.js.map +1 -0
  53. package/packages/angular-renderer/playwright/.cache/assets/card.component-0WWaDbUV.js +180 -0
  54. package/packages/angular-renderer/playwright/.cache/assets/card.component-0WWaDbUV.js.map +1 -0
  55. package/packages/angular-renderer/playwright/.cache/assets/checkbox.component-JGpevUFG.js +150 -0
  56. package/packages/angular-renderer/playwright/.cache/assets/checkbox.component-JGpevUFG.js.map +1 -0
  57. package/packages/angular-renderer/playwright/.cache/assets/chip.component-DHGk3h8k.js +121 -0
  58. package/packages/angular-renderer/playwright/.cache/assets/chip.component-DHGk3h8k.js.map +1 -0
  59. package/packages/angular-renderer/playwright/.cache/assets/data-grid.component-DDZZ4enP.js +352 -0
  60. package/packages/angular-renderer/playwright/.cache/assets/data-grid.component-DDZZ4enP.js.map +1 -0
  61. package/packages/angular-renderer/playwright/.cache/assets/experience-adapter.service-CJxHLpWN.js +38 -0
  62. package/packages/angular-renderer/playwright/.cache/assets/experience-adapter.service-CJxHLpWN.js.map +1 -0
  63. package/packages/angular-renderer/playwright/.cache/assets/form-field.component-DZA0NfB7.js +184 -0
  64. package/packages/angular-renderer/playwright/.cache/assets/form-field.component-DZA0NfB7.js.map +1 -0
  65. package/packages/angular-renderer/playwright/.cache/assets/hbox.component-D5YHn6Vu.js +125 -0
  66. package/packages/angular-renderer/playwright/.cache/assets/hbox.component-D5YHn6Vu.js.map +1 -0
  67. package/packages/angular-renderer/playwright/.cache/assets/index-DRoHZv2r.js +92806 -0
  68. package/packages/angular-renderer/playwright/.cache/assets/index-DRoHZv2r.js.map +1 -0
  69. package/packages/angular-renderer/playwright/.cache/assets/label.component-DDKtYvrS.js +105 -0
  70. package/packages/angular-renderer/playwright/.cache/assets/label.component-DDKtYvrS.js.map +1 -0
  71. package/packages/angular-renderer/playwright/.cache/assets/list.component-DSP5wzI4.js +195 -0
  72. package/packages/angular-renderer/playwright/.cache/assets/list.component-DSP5wzI4.js.map +1 -0
  73. package/packages/angular-renderer/playwright/.cache/assets/radio-group.component-BzVciXZu.js +171 -0
  74. package/packages/angular-renderer/playwright/.cache/assets/radio-group.component-BzVciXZu.js.map +1 -0
  75. package/packages/angular-renderer/playwright/.cache/assets/select.component-BC_aoLNt.js +180 -0
  76. package/packages/angular-renderer/playwright/.cache/assets/select.component-BC_aoLNt.js.map +1 -0
  77. package/packages/angular-renderer/playwright/.cache/assets/sidebar.component-CY_vKSCu.js +217 -0
  78. package/packages/angular-renderer/playwright/.cache/assets/sidebar.component-CY_vKSCu.js.map +1 -0
  79. package/packages/angular-renderer/playwright/.cache/assets/switch.component-BtfhJxLp.js +144 -0
  80. package/packages/angular-renderer/playwright/.cache/assets/switch.component-BtfhJxLp.js.map +1 -0
  81. package/packages/angular-renderer/playwright/.cache/assets/tabs.component-DGcKkhH_.js +218 -0
  82. package/packages/angular-renderer/playwright/.cache/assets/tabs.component-DGcKkhH_.js.map +1 -0
  83. package/packages/angular-renderer/playwright/.cache/assets/text-input.component-IyHHKpW-.js +121 -0
  84. package/packages/angular-renderer/playwright/.cache/assets/text-input.component-IyHHKpW-.js.map +1 -0
  85. package/packages/angular-renderer/playwright/.cache/assets/textarea.component-Bpvh81yV.js +141 -0
  86. package/packages/angular-renderer/playwright/.cache/assets/textarea.component-Bpvh81yV.js.map +1 -0
  87. package/packages/angular-renderer/playwright/.cache/assets/vbox.component-DRe59FUF.js +127 -0
  88. package/packages/angular-renderer/playwright/.cache/assets/vbox.component-DRe59FUF.js.map +1 -0
  89. package/packages/angular-renderer/playwright/.cache/index.html +11 -0
  90. package/packages/angular-renderer/playwright/.cache/metainfo.json +5416 -0
  91. package/packages/angular-renderer/playwright/index.html +11 -0
  92. package/packages/angular-renderer/playwright/index.ts +1 -0
  93. package/packages/angular-renderer/playwright-ct.config.ts +13 -3
  94. package/packages/angular-renderer/src/adapters/web/experience-adapter.service.ts +15 -1
  95. package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.pw.ts +37 -0
  96. package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.ts +0 -1
  97. package/packages/angular-renderer/src/components/primitives/button/button.component.pw.ts +17 -4
  98. package/packages/angular-renderer/src/components/primitives/card/card.component.pw.ts +32 -0
  99. package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.pw.ts +38 -0
  100. package/packages/angular-renderer/src/components/primitives/chip/chip.component.pw.ts +56 -0
  101. package/packages/angular-renderer/src/components/primitives/chip/chip.component.ts +1 -1
  102. package/packages/angular-renderer/src/components/primitives/data-grid/data-grid.component.pw.ts +37 -0
  103. package/packages/angular-renderer/src/components/primitives/form-field/form-field.component.pw.ts +38 -0
  104. package/packages/angular-renderer/src/components/primitives/hbox/hbox.component.pw.ts +32 -0
  105. package/packages/angular-renderer/src/components/primitives/label/label.component.pw.ts +32 -0
  106. package/packages/angular-renderer/src/components/primitives/list/list.component.pw.ts +37 -0
  107. package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.pw.ts +38 -0
  108. package/packages/angular-renderer/src/components/primitives/select/select.component.pw.ts +32 -0
  109. package/packages/angular-renderer/src/components/primitives/sidebar/sidebar.component.pw.ts +37 -0
  110. package/packages/angular-renderer/src/components/primitives/switch/switch.component.pw.ts +62 -0
  111. package/packages/angular-renderer/src/components/primitives/switch/switch.component.ts +1 -1
  112. package/packages/angular-renderer/src/components/primitives/tabs/tabs.component.pw.ts +37 -0
  113. package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.pw.ts +16 -7
  114. package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.pw.ts +38 -0
  115. package/packages/angular-renderer/src/components/primitives/vbox/vbox.component.pw.ts +17 -4
  116. package/packages/angular-renderer/src/devtools/devtools-bridge.ts +2 -0
  117. package/packages/angular-renderer/src/index.ts +1 -0
  118. package/packages/angular-renderer/src/lib/primitives.provider.ts +29 -21
  119. package/packages/cli/CHANGELOG.md +8 -0
  120. package/packages/cli/package.json +2 -2
  121. package/packages/core/CHANGELOG.md +14 -0
  122. package/packages/core/package.json +2 -2
  123. package/packages/design-tokens/CHANGELOG.md +8 -0
  124. package/packages/design-tokens/package.json +1 -1
  125. package/packages/devtools/CHANGELOG.md +8 -0
  126. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/deps___vitest_vm__/_metadata.json +3 -3
  127. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  128. package/packages/devtools/package.json +1 -1
  129. package/packages/playground/CHANGELOG.md +14 -0
  130. package/packages/playground/netlify.toml +6 -0
  131. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/deps___vitest_vm__/_metadata.json +3 -3
  132. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  133. package/packages/playground/package.json +3 -3
  134. package/packages/playground/src/app/app.config.ts +6 -1
  135. package/packages/playground/src/preview/preview-root.component.ts +173 -12
  136. package/dist/packages/playground/browser/main-BBGOLU74.js +0 -711
  137. package/packages/angular-renderer/src/components/primitives/primitives.a11y.pw.ts +0 -382
package/eslint.config.js CHANGED
@@ -13,6 +13,7 @@ module.exports = [
13
13
  '**/_bmad-output',
14
14
  '**/_bmad',
15
15
  '**/.agent',
16
+ '**/.cache',
16
17
  'tools/spikes/**/worker.bundle.js',
17
18
  ],
18
19
  },
@@ -23,7 +24,7 @@ module.exports = [
23
24
  'error',
24
25
  {
25
26
  enforceBuildableLibDependency: true,
26
- allow: [],
27
+ allow: ['@sand4rt/experimental-ct-angular'],
27
28
  depConstraints: [
28
29
  {
29
30
  sourceTag: 'type:app',
@@ -0,0 +1,10 @@
1
+ $diff = Get-Content diff_mod.patch -Raw
2
+
3
+ $bh = "Invoke the `bmad-review-adversarial-general` skill on this diff:`n`n$diff"
4
+ Set-Content -Path _bmad-output\implementation-artifacts\bmad-review-blind-hunter.md -Value $bh
5
+
6
+ $ech = "Invoke the `bmad-review-edge-case-hunter` skill on this diff:`n`n$diff"
7
+ Set-Content -Path _bmad-output\implementation-artifacts\bmad-review-edge-case-hunter.md -Value $ech
8
+
9
+ $aa = "You are an Acceptance Auditor. Review the provided diff against `_bmad-output/implementation-artifacts/stories/retro-9-a11y-rtl-knowledge-transfer.md` and any loaded context docs. Check for: violations of acceptance criteria, deviations from spec intent, missing implementation of specified behavior, contradictions between spec constraints and actual code. Output findings as a Markdown list. Each finding: one-line title, which AC/constraint it violates, and evidence from the diff.`n`nDiff:`n$diff"
10
+ Set-Content -Path _bmad-output\implementation-artifacts\bmad-review-acceptance-auditor.md -Value $aa
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/origo-design",
3
- "version": "0.0.37",
3
+ "version": "0.0.39",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -65,7 +65,8 @@
65
65
  "@nx/vite": "23.1.0",
66
66
  "@nx/web": "23.1.0",
67
67
  "@nx/workspace": "23.1.0",
68
- "@playwright/test": "^1.36.0",
68
+ "@jscutlery/playwright-ct-angular": "^0.10.10",
69
+ "@playwright/test": "^1.62.1",
69
70
  "@schematics/angular": "22.0.9",
70
71
  "@swc/helpers": "~0.5.18",
71
72
  "@types/chrome": "^0.2.9",
@@ -1,3 +1,24 @@
1
+ ## 0.0.39 (2026-09-29)
2
+
3
+ ### 🚀 Features
4
+
5
+ - add GitHub Actions release workflow and package configurations for core and angular-renderer ([d80abc7](https://github.com/OrigoStudio/origo-design/commit/d80abc7))
6
+
7
+ ### ❤️ Thank You
8
+
9
+ - Hardik Patel @hardikpatelse
10
+
11
+ ## 0.0.38 (2026-09-28)
12
+
13
+ ### 🚀 Features
14
+
15
+ - playwright component testing ([909c8de](https://github.com/OrigoStudio/origo-design/commit/909c8de))
16
+ - integrate Epic 9 primitives into playground application config and preview root component ([9775c0b](https://github.com/OrigoStudio/origo-design/commit/9775c0b))
17
+
18
+ ### ❤️ Thank You
19
+
20
+ - Hardik Patel @hardikpatelse
21
+
1
22
  ## 0.0.37 (2026-09-24)
2
23
 
3
24
  ### 🚀 Features
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "angular-renderer",
3
- "version": "0.0.37",
4
- "private": true,
3
+ "version": "0.0.39",
4
+ "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "dependencies": {
9
- "@origo/core": "0.0.37",
10
- "@origo/design-tokens": "0.0.37",
9
+ "@origo/core": "0.0.39",
10
+ "@origo/design-tokens": "0.0.39",
11
11
  "tslib": "^2.3.0",
12
- "@axe-core/playwright": "^4.13.0",
13
- "@playwright/test": "^1.36.0"
12
+ "@analogjs/vite-plugin-angular": "^2.7.1",
13
+ "zone.js": "^0.16.3",
14
+ "@axe-core/playwright": "^4.13.0"
14
15
  },
15
16
  "peerDependencies": {
16
17
  "@angular/common": ">=18.0.0",
@@ -0,0 +1,121 @@
1
+ import { U as __defineInjectable } from './index-DRoHZv2r.js';
2
+
3
+ function deepClone(obj) {
4
+ if (obj === null || typeof obj !== 'object') {
5
+ return obj;
6
+ }
7
+ if (Array.isArray(obj)) {
8
+ return obj.map(item => deepClone(item));
9
+ }
10
+ const cloned = {};
11
+ const typedObj = obj;
12
+ for (const key in typedObj) {
13
+ if (Object.prototype.hasOwnProperty.call(typedObj, key)) {
14
+ cloned[key] = deepClone(typedObj[key]);
15
+ }
16
+ }
17
+ return cloned;
18
+ }
19
+ /**
20
+ * Validates and coerces runtime properties against a basic schema to ensure
21
+ * primitive components do not crash when given malformed BADL ast properties.
22
+ */
23
+ function coerceContractProps(props, schema, strict = false) {
24
+ if (!props || typeof props !== 'object' || Array.isArray(props)) {
25
+ return {};
26
+ }
27
+ const result = {};
28
+ const inputProps = props;
29
+ if (!schema) {
30
+ if (strict) {
31
+ throw new Error('strict mode requires a schema');
32
+ }
33
+ for (const [key, val] of Object.entries(inputProps)) {
34
+ result[key] = deepClone(val);
35
+ }
36
+ return result;
37
+ }
38
+ for (const [key, value] of Object.entries(inputProps)) {
39
+ if (key.startsWith('aria-') || key.startsWith('data-')) {
40
+ result[key] = deepClone(value);
41
+ continue;
42
+ }
43
+ if (!schema[key]) {
44
+ if (!strict) {
45
+ result[key] = deepClone(value);
46
+ }
47
+ continue;
48
+ }
49
+ const expectedType = schema[key];
50
+ if (value === undefined || value === null) {
51
+ continue;
52
+ }
53
+ if (expectedType === 'string') {
54
+ result[key] = String(value);
55
+ } else if (expectedType === 'number') {
56
+ if (value === '' || typeof value === 'boolean') {
57
+ if (strict) throw new Error(`Invalid number for prop '${key}'`);
58
+ continue;
59
+ }
60
+ const num = Number(value);
61
+ if (isNaN(num)) {
62
+ if (strict) throw new Error(`Invalid number for prop '${key}': ${value}`);
63
+ } else {
64
+ result[key] = num;
65
+ }
66
+ } else if (expectedType === 'boolean') {
67
+ if (value === '') {
68
+ result[key] = true;
69
+ } else if (typeof value === 'string') {
70
+ const lower = value.toLowerCase();
71
+ result[key] = !(lower === 'false' || lower === '0' || lower === 'off');
72
+ } else {
73
+ result[key] = Boolean(value);
74
+ }
75
+ } else if (expectedType === 'array') {
76
+ const arr = Array.isArray(value) ? value : [value];
77
+ result[key] = deepClone(arr);
78
+ } else if (expectedType === 'object') {
79
+ if (Array.isArray(value)) {
80
+ if (strict) throw new Error(`Invalid object for prop '${key}'`);
81
+ continue;
82
+ }
83
+ const obj = typeof value === 'object' && value !== null ? value : {};
84
+ result[key] = deepClone(obj);
85
+ } else {
86
+ result[key] = deepClone(value);
87
+ }
88
+ }
89
+ return result;
90
+ }
91
+ class AdapterPipelineService {
92
+ prepareNode(node, schema, strict = false, visited = new Set()) {
93
+ if (visited.has(node.id)) {
94
+ return { id: node.id, type: node.type, props: {} };
95
+ }
96
+ visited.add(node.id);
97
+ // Translate the raw Canonical ASTNode into a stateless InteractionContract
98
+ const contract = {
99
+ id: node.id,
100
+ type: node.type,
101
+ props: coerceContractProps(node.props, schema, strict),
102
+ };
103
+ if (node.children) {
104
+ contract.children = node.children.map(child =>
105
+ this.prepareNode(child, undefined, strict, visited)
106
+ );
107
+ }
108
+ return contract;
109
+ }
110
+ static ɵfac = function AdapterPipelineService_Factory(__ngFactoryType__) {
111
+ return new (__ngFactoryType__ || AdapterPipelineService)();
112
+ };
113
+ static ɵprov = /*@__PURE__*/ __defineInjectable({
114
+ token: AdapterPipelineService,
115
+ factory: AdapterPipelineService.ɵfac,
116
+ providedIn: 'root',
117
+ });
118
+ }
119
+
120
+ export { coerceContractProps as c };
121
+ //# sourceMappingURL=adapter-iYml3Kk6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-iYml3Kk6.js","sources":["../../../src/adapters/web/adapter.ts"],"sourcesContent":["import { Injectable, ViewContainerRef, Signal, InputSignal } from '@angular/core';\nimport { ASTNode, InteractionContract } from '@origo/core';\n\nexport interface ContainerComponent {\n viewContainerRef?: ViewContainerRef | Signal<ViewContainerRef>;\n vc?: ViewContainerRef | Signal<ViewContainerRef>;\n}\n\nexport interface OrigoAdapter<TProps = Record<string, unknown>> {\n /**\n * The core interaction contract driving this adapter.\n */\n contract: InputSignal<InteractionContract<TProps>>;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as unknown as T;\n }\n const cloned = {} as Record<string, unknown>;\n const typedObj = obj as Record<string, unknown>;\n for (const key in typedObj) {\n if (Object.prototype.hasOwnProperty.call(typedObj, key)) {\n cloned[key] = deepClone(typedObj[key]) as unknown;\n }\n }\n return cloned as unknown as T;\n}\n\n/**\n * Validates and coerces runtime properties against a basic schema to ensure\n * primitive components do not crash when given malformed BADL ast properties.\n */\nexport function coerceContractProps<T>(\n props: unknown,\n schema?: Record<string, 'string' | 'number' | 'boolean' | 'array' | 'object'>,\n strict = false\n): T {\n if (!props || typeof props !== 'object' || Array.isArray(props)) {\n return {} as T;\n }\n\n const result: Record<string, unknown> = {};\n const inputProps = props as Record<string, unknown>;\n\n if (!schema) {\n if (strict) {\n throw new Error('strict mode requires a schema');\n }\n for (const [key, val] of Object.entries(inputProps)) {\n result[key] = deepClone(val);\n }\n return result as T;\n }\n\n for (const [key, value] of Object.entries(inputProps)) {\n if (key.startsWith('aria-') || key.startsWith('data-')) {\n result[key] = deepClone(value);\n continue;\n }\n\n if (!schema[key]) {\n if (!strict) {\n result[key] = deepClone(value);\n }\n continue;\n }\n\n const expectedType = schema[key];\n if (value === undefined || value === null) {\n continue;\n }\n\n if (expectedType === 'string') {\n result[key] = String(value);\n } else if (expectedType === 'number') {\n if (value === '' || typeof value === 'boolean') {\n if (strict) throw new Error(`Invalid number for prop '${key}'`);\n continue;\n }\n const num = Number(value);\n if (isNaN(num)) {\n if (strict) throw new Error(`Invalid number for prop '${key}': ${value}`);\n } else {\n result[key] = num;\n }\n } else if (expectedType === 'boolean') {\n if (value === '') {\n result[key] = true;\n } else if (typeof value === 'string') {\n const lower = value.toLowerCase();\n result[key] = !(lower === 'false' || lower === '0' || lower === 'off');\n } else {\n result[key] = Boolean(value);\n }\n } else if (expectedType === 'array') {\n const arr = Array.isArray(value) ? value : [value];\n result[key] = deepClone(arr);\n } else if (expectedType === 'object') {\n if (Array.isArray(value)) {\n if (strict) throw new Error(`Invalid object for prop '${key}'`);\n continue;\n }\n const obj = typeof value === 'object' && value !== null ? value : {};\n result[key] = deepClone(obj);\n } else {\n result[key] = deepClone(value);\n }\n }\n\n return result as T;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AdapterPipelineService {\n prepareNode(\n node: ASTNode,\n schema?: Record<string, 'string' | 'number' | 'boolean' | 'array' | 'object'>,\n strict = false,\n visited = new Set<string>()\n ): InteractionContract {\n if (visited.has(node.id)) {\n return { id: node.id, type: node.type, props: {} };\n }\n visited.add(node.id);\n\n // Translate the raw Canonical ASTNode into a stateless InteractionContract\n const contract: InteractionContract = {\n id: node.id,\n type: node.type,\n props: coerceContractProps(node.props, schema, strict),\n };\n\n if (node.children) {\n contract.children = node.children.map(child =>\n this.prepareNode(child, undefined, strict, visited)\n );\n }\n\n return contract;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ import {
2
+ ɵ as __getCurrentView,
3
+ a as __domElementStart,
4
+ b as __domListener,
5
+ c as __restoreView,
6
+ d as __nextContext,
7
+ e as __resetView,
8
+ f as __text,
9
+ g as __domElementEnd,
10
+ h as __advance,
11
+ i as __textInterpolate,
12
+ j as __classProp,
13
+ k as __attribute,
14
+ l as __conditionalCreate,
15
+ m as __conditional,
16
+ n as input,
17
+ o as inject,
18
+ D as DomSanitizer,
19
+ p as computed,
20
+ q as __defineComponent,
21
+ r as __repeaterCreate,
22
+ s as __repeaterTrackByIndex,
23
+ t as __repeater,
24
+ } from './index-DRoHZv2r.js';
25
+ import { W as WebExperienceAdapterService } from './experience-adapter.service-CJxHLpWN.js';
26
+
27
+ function BreadcrumbsComponent_For_2_Conditional_1_Template(rf, ctx) {
28
+ if (rf & 1) {
29
+ const _r1 = __getCurrentView();
30
+ __domElementStart(0, 'a', 5);
31
+ __domListener(
32
+ 'click',
33
+ function BreadcrumbsComponent_For_2_Conditional_1_Template_a_click_0_listener($event) {
34
+ __restoreView(_r1);
35
+ const ctx_r1 = __nextContext();
36
+ const item_r3 = ctx_r1.$implicit;
37
+ const ɵ$index_3_r4 = ctx_r1.$index;
38
+ const ɵ$count_3_r5 = ctx_r1.$count;
39
+ const ctx_r5 = __nextContext();
40
+ return __resetView(ctx_r5.onItemClick($event, item_r3, ɵ$index_3_r4 === ɵ$count_3_r5 - 1));
41
+ }
42
+ );
43
+ __domElementStart(1, 'span');
44
+ __text(2);
45
+ __domElementEnd()();
46
+ }
47
+ if (rf & 2) {
48
+ const item_r3 = __nextContext().$implicit;
49
+ __advance(2);
50
+ __textInterpolate(item_r3.label);
51
+ }
52
+ }
53
+ function BreadcrumbsComponent_For_2_Conditional_2_Template(rf, ctx) {
54
+ if (rf & 1) {
55
+ __domElementStart(0, 'span');
56
+ __text(1);
57
+ __domElementEnd();
58
+ }
59
+ if (rf & 2) {
60
+ const ctx_r1 = __nextContext();
61
+ const item_r3 = ctx_r1.$implicit;
62
+ const ɵ$index_3_r4 = ctx_r1.$index;
63
+ const ɵ$count_3_r5 = ctx_r1.$count;
64
+ __classProp('origo-breadcrumbs__current', ɵ$index_3_r4 === ɵ$count_3_r5 - 1);
65
+ __attribute('aria-current', ɵ$index_3_r4 === ɵ$count_3_r5 - 1 ? 'page' : null);
66
+ __advance();
67
+ __textInterpolate(item_r3.label);
68
+ }
69
+ }
70
+ function BreadcrumbsComponent_For_2_Conditional_3_Template(rf, ctx) {
71
+ if (rf & 1) {
72
+ __domElementStart(0, 'span', 4);
73
+ __text(1, '/');
74
+ __domElementEnd();
75
+ }
76
+ }
77
+ function BreadcrumbsComponent_For_2_Template(rf, ctx) {
78
+ if (rf & 1) {
79
+ __domElementStart(0, 'li', 1);
80
+ __conditionalCreate(1, BreadcrumbsComponent_For_2_Conditional_1_Template, 3, 1, 'a', 2)(
81
+ 2,
82
+ BreadcrumbsComponent_For_2_Conditional_2_Template,
83
+ 2,
84
+ 4,
85
+ 'span',
86
+ 3
87
+ );
88
+ __conditionalCreate(3, BreadcrumbsComponent_For_2_Conditional_3_Template, 2, 0, 'span', 4);
89
+ __domElementEnd();
90
+ }
91
+ if (rf & 2) {
92
+ const item_r3 = ctx.$implicit;
93
+ const ɵ$index_3_r4 = ctx.$index;
94
+ const ɵ$count_3_r5 = ctx.$count;
95
+ __advance();
96
+ __conditional(!(ɵ$index_3_r4 === ɵ$count_3_r5 - 1) && item_r3.outcomeRef ? 1 : 2);
97
+ __advance(2);
98
+ __conditional(!(ɵ$index_3_r4 === ɵ$count_3_r5 - 1) ? 3 : -1);
99
+ }
100
+ }
101
+ class BreadcrumbsComponent {
102
+ static contractSchema = {
103
+ items: 'array',
104
+ };
105
+ static strictContract = false;
106
+ contract = input.required(
107
+ ...(false ? [{ debugName: 'contract' }] : /* istanbul ignore next */ [])
108
+ );
109
+ experienceAdapter = inject(WebExperienceAdapterService);
110
+ sanitizer = inject(DomSanitizer);
111
+ computedAriaLabel = computed(
112
+ () => {
113
+ const label = this.contract().props?.['aria-label'];
114
+ return label !== void 0 && label !== null ? String(label) : 'Breadcrumbs';
115
+ },
116
+ ...(false ? [{ debugName: 'computedAriaLabel' }] : /* istanbul ignore next */ [])
117
+ );
118
+ computedAriaDescribedBy = computed(
119
+ () => {
120
+ const desc = this.contract().props?.['aria-describedby'];
121
+ return desc !== void 0 && desc !== null ? String(desc) : void 0;
122
+ },
123
+ ...(false ? [{ debugName: 'computedAriaDescribedBy' }] : /* istanbul ignore next */ [])
124
+ );
125
+ computedItems = computed(
126
+ () => {
127
+ const items = this.contract().props?.items;
128
+ if (!Array.isArray(items)) return [];
129
+ return items
130
+ .filter(item => item != null && item.label != null)
131
+ .map(item => {
132
+ return {
133
+ label: String(item.label),
134
+ outcomeRef: item.outcomeRef ? String(item.outcomeRef) : void 0,
135
+ };
136
+ });
137
+ },
138
+ ...(false ? [{ debugName: 'computedItems' }] : /* istanbul ignore next */ [])
139
+ );
140
+ onItemClick(event, item, isLast) {
141
+ if (isLast || !item.outcomeRef) {
142
+ event.preventDefault();
143
+ return;
144
+ }
145
+ this.experienceAdapter.updateState(this.contract().id, 'activeOutcome', item.outcomeRef);
146
+ }
147
+ static ɵfac = function BreadcrumbsComponent_Factory(__ngFactoryType__) {
148
+ return new (__ngFactoryType__ || BreadcrumbsComponent)();
149
+ };
150
+ static ɵcmp = /* @__PURE__ */ __defineComponent({
151
+ type: BreadcrumbsComponent,
152
+ selectors: [['origo-breadcrumbs']],
153
+ hostAttrs: ['role', 'navigation'],
154
+ hostVars: 5,
155
+ hostBindings: function BreadcrumbsComponent_HostBindings(rf, ctx) {
156
+ if (rf & 2) {
157
+ __attribute('data-testid', ctx.contract().id)('aria-label', ctx.computedAriaLabel())(
158
+ 'aria-describedby',
159
+ ctx.computedAriaDescribedBy()
160
+ );
161
+ __classProp('origo-breadcrumbs', true);
162
+ }
163
+ },
164
+ inputs: { contract: [1, 'contract'] },
165
+ decls: 3,
166
+ vars: 0,
167
+ consts: [
168
+ [1, 'origo-breadcrumbs__list'],
169
+ [1, 'origo-breadcrumbs__item'],
170
+ ['href', 'javascript:void(0)', 1, 'origo-breadcrumbs__link'],
171
+ [3, 'origo-breadcrumbs__current'],
172
+ ['aria-hidden', 'true', 1, 'origo-breadcrumbs__separator'],
173
+ ['href', 'javascript:void(0)', 1, 'origo-breadcrumbs__link', 3, 'click'],
174
+ ],
175
+ template: function BreadcrumbsComponent_Template(rf, ctx) {
176
+ if (rf & 1) {
177
+ __domElementStart(0, 'ol', 0);
178
+ __repeaterCreate(
179
+ 1,
180
+ BreadcrumbsComponent_For_2_Template,
181
+ 4,
182
+ 2,
183
+ 'li',
184
+ 1,
185
+ __repeaterTrackByIndex
186
+ );
187
+ __domElementEnd();
188
+ }
189
+ if (rf & 2) {
190
+ __advance();
191
+ __repeater(ctx.computedItems());
192
+ }
193
+ },
194
+ encapsulation: 3,
195
+ });
196
+ }
197
+ /* @__PURE__ */ (() => {})();
198
+
199
+ export { BreadcrumbsComponent };
200
+ //# sourceMappingURL=breadcrumbs.component-DqZwZwH1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.component-DqZwZwH1.js","sources":["../../../src/components/primitives/breadcrumbs/breadcrumbs.component.ts"],"sourcesContent":["import {\n Component,\n input,\n ChangeDetectionStrategy,\n computed,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { InteractionContract } from '@origo/core';\nimport { OrigoAdapter } from '../../../adapters/web/adapter';\nimport { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';\n\nexport interface BreadcrumbItem {\n label: string;\n outcomeRef?: string;\n}\n\nexport interface BreadcrumbsProps {\n items?: Array<BreadcrumbItem>;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\n@Component({\n selector: 'origo-breadcrumbs',\n standalone: true,\n templateUrl: './breadcrumbs.component.html',\n styleUrls: ['./breadcrumbs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n host: {\n '[class.origo-breadcrumbs]': 'true',\n '[attr.data-testid]': 'contract().id',\n '[attr.aria-label]': 'computedAriaLabel()',\n '[attr.aria-describedby]': 'computedAriaDescribedBy()',\n role: 'navigation',\n },\n})\nexport class BreadcrumbsComponent implements OrigoAdapter<BreadcrumbsProps> {\n static readonly contractSchema = {\n items: 'array',\n };\n static readonly strictContract = false;\n\n contract = input.required<InteractionContract<BreadcrumbsProps>>();\n\n private experienceAdapter = inject(WebExperienceAdapterService);\n private sanitizer = inject(DomSanitizer);\n\n computedAriaLabel = computed(() => {\n const label = this.contract().props?.['aria-label'];\n return label !== undefined && label !== null ? String(label) : 'Breadcrumbs';\n });\n\n computedAriaDescribedBy = computed(() => {\n const desc = this.contract().props?.['aria-describedby'];\n return desc !== undefined && desc !== null ? String(desc) : undefined;\n });\n\n computedItems = computed(() => {\n const items = this.contract().props?.items;\n if (!Array.isArray(items)) return [];\n\n return items\n .filter(item => item != null && item.label != null)\n .map(item => {\n return {\n label: String(item.label),\n outcomeRef: item.outcomeRef ? String(item.outcomeRef) : undefined,\n };\n });\n });\n\n onItemClick(event: Event, item: BreadcrumbItem, isLast: boolean) {\n if (isLast || !item.outcomeRef) {\n event.preventDefault();\n return;\n }\n\n this.experienceAdapter.updateState(this.contract().id, 'activeOutcome', item.outcomeRef);\n }\n}\n"],"names":["i0.ɵɵgetCurrentView","i0.ɵɵdomElementStart","i0.ɵɵdomListener","i0.ɵɵrestoreView","i0.ɵɵnextContext","i0.ɵɵresetView","i0.ɵɵtext","i0.ɵɵdomElementEnd","i0.ɵɵadvance","i0.ɵɵtextInterpolate","i0.ɵɵclassProp","i0.ɵɵconditionalCreate","i0.ɵɵconditional"],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import {
2
+ n as input,
3
+ p as computed,
4
+ u as output,
5
+ o as inject,
6
+ q as __defineComponent,
7
+ a as __domElementStart,
8
+ b as __domListener,
9
+ f as __text,
10
+ g as __domElementEnd,
11
+ v as __domProperty,
12
+ k as __attribute,
13
+ h as __advance,
14
+ w as __textInterpolate1,
15
+ j as __classProp,
16
+ } from './index-DRoHZv2r.js';
17
+ import { W as WebExperienceAdapterService } from './experience-adapter.service-CJxHLpWN.js';
18
+
19
+ class ButtonComponent {
20
+ static contractSchema = {
21
+ label: 'string',
22
+ disabled: 'boolean',
23
+ type: 'string',
24
+ };
25
+ static strictContract = false;
26
+ contract = input.required(
27
+ ...(false ? [{ debugName: 'contract' }] : /* istanbul ignore next */ [])
28
+ );
29
+ computedLabel = computed(
30
+ () => this.contract().props?.label ?? 'Button',
31
+ ...(false ? [{ debugName: 'computedLabel' }] : /* istanbul ignore next */ [])
32
+ );
33
+ computedDisabled = computed(
34
+ () => !!this.contract().props?.disabled,
35
+ ...(false ? [{ debugName: 'computedDisabled' }] : /* istanbul ignore next */ [])
36
+ );
37
+ computedType = computed(
38
+ () => {
39
+ const type = this.contract().props?.type;
40
+ return type === 'button' || type === 'submit' || type === 'reset' ? type : 'button';
41
+ },
42
+ ...(false ? [{ debugName: 'computedType' }] : /* istanbul ignore next */ [])
43
+ );
44
+ computedAriaLabel = computed(
45
+ () => {
46
+ const label = this.contract().props?.['aria-label'];
47
+ return label !== void 0 && label !== null && String(label).trim() !== ''
48
+ ? String(label)
49
+ : void 0;
50
+ },
51
+ ...(false ? [{ debugName: 'computedAriaLabel' }] : /* istanbul ignore next */ [])
52
+ );
53
+ computedAriaDescribedBy = computed(
54
+ () => {
55
+ const desc = this.contract().props?.['aria-describedby'];
56
+ return desc !== void 0 && desc !== null && String(desc).trim() !== '' ? String(desc) : void 0;
57
+ },
58
+ ...(false ? [{ debugName: 'computedAriaDescribedBy' }] : /* istanbul ignore next */ [])
59
+ );
60
+ action = output();
61
+ experienceAdapter = inject(WebExperienceAdapterService);
62
+ onClick() {
63
+ if (this.computedDisabled()) return;
64
+ const id = this.contract().id;
65
+ if (!id) return;
66
+ this.experienceAdapter.dispatchCapability(id, 'click');
67
+ this.action.emit();
68
+ }
69
+ static ɵfac = function ButtonComponent_Factory(__ngFactoryType__) {
70
+ return new (__ngFactoryType__ || ButtonComponent)();
71
+ };
72
+ static ɵcmp = /* @__PURE__ */ __defineComponent({
73
+ type: ButtonComponent,
74
+ selectors: [['origo-button']],
75
+ hostVars: 3,
76
+ hostBindings: function ButtonComponent_HostBindings(rf, ctx) {
77
+ if (rf & 2) {
78
+ __attribute('data-testid', ctx.contract().id ?? '');
79
+ __classProp('origo-button', true);
80
+ }
81
+ },
82
+ inputs: { contract: [1, 'contract'] },
83
+ outputs: { action: 'action' },
84
+ decls: 2,
85
+ vars: 5,
86
+ consts: [[3, 'click', 'type', 'disabled']],
87
+ template: function ButtonComponent_Template(rf, ctx) {
88
+ if (rf & 1) {
89
+ __domElementStart(0, 'button', 0);
90
+ __domListener('click', function ButtonComponent_Template_button_click_0_listener() {
91
+ return ctx.onClick();
92
+ });
93
+ __text(1);
94
+ __domElementEnd();
95
+ }
96
+ if (rf & 2) {
97
+ __domProperty('type', ctx.computedType())('disabled', ctx.computedDisabled());
98
+ __attribute('aria-label', ctx.computedAriaLabel())(
99
+ 'aria-describedby',
100
+ ctx.computedAriaDescribedBy()
101
+ );
102
+ __advance();
103
+ __textInterpolate1(' ', ctx.computedLabel(), '\n');
104
+ }
105
+ },
106
+ encapsulation: 3,
107
+ });
108
+ }
109
+ /* @__PURE__ */ (() => {})();
110
+
111
+ export { ButtonComponent };
112
+ //# sourceMappingURL=button.component-Dnc1mP3D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.component-Dnc1mP3D.js","sources":["../../../src/components/primitives/button/button.component.ts"],"sourcesContent":["import {\n Component,\n input,\n output,\n ChangeDetectionStrategy,\n computed,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { InteractionContract } from '@origo/core';\nimport { OrigoAdapter } from '../../../adapters/web/adapter';\nimport { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';\n\nexport interface ButtonProps {\n label?: string;\n disabled?: boolean;\n type?: 'button' | 'submit' | 'reset';\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\n@Component({\n selector: 'origo-button',\n standalone: true,\n templateUrl: './button.component.html',\n styleUrls: ['./button.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n host: {\n '[class.origo-button]': 'true',\n '[attr.data-testid]': 'contract().id ?? \"\"',\n },\n})\nexport class ButtonComponent implements OrigoAdapter<ButtonProps> {\n static readonly contractSchema = {\n label: 'string',\n disabled: 'boolean',\n type: 'string',\n };\n static readonly strictContract = false;\n\n contract = input.required<InteractionContract<ButtonProps>>();\n\n computedLabel = computed(() => this.contract().props?.label ?? 'Button');\n computedDisabled = computed(() => !!this.contract().props?.disabled);\n computedType = computed(() => {\n const type = this.contract().props?.type;\n return type === 'button' || type === 'submit' || type === 'reset' ? type : 'button';\n });\n computedAriaLabel = computed(() => {\n const label = this.contract().props?.['aria-label'];\n return label !== undefined && label !== null && String(label).trim() !== ''\n ? String(label)\n : undefined;\n });\n computedAriaDescribedBy = computed(() => {\n const desc = this.contract().props?.['aria-describedby'];\n return desc !== undefined && desc !== null && String(desc).trim() !== ''\n ? String(desc)\n : undefined;\n });\n\n action = output<void>();\n\n private experienceAdapter = inject(WebExperienceAdapterService);\n\n onClick() {\n if (this.computedDisabled()) return;\n\n const id = this.contract().id;\n if (!id) return;\n\n this.experienceAdapter.dispatchCapability(id, 'click');\n this.action.emit();\n }\n}\n"],"names":["i0.ɵɵdefineComponent","i0.ɵɵattribute","i0.ɵɵclassProp","i0.ɵɵdomListener","i0.ɵɵtext"],"mappings":"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"}