@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.
- package/CHANGELOG.md +3 -2
- package/dist/packages/angular-renderer/CHANGELOG.md +21 -0
- package/dist/packages/angular-renderer/package.json +7 -6
- package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.d.ts +2 -0
- package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.js +11 -0
- package/dist/packages/angular-renderer/src/adapters/web/experience-adapter.service.js.map +1 -1
- package/dist/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.js.map +1 -1
- package/dist/packages/angular-renderer/src/components/primitives/chip/chip.component.js.map +1 -1
- package/dist/packages/angular-renderer/src/components/primitives/switch/switch.component.js.map +1 -1
- package/dist/packages/angular-renderer/src/devtools/devtools-bridge.js +2 -0
- package/dist/packages/angular-renderer/src/devtools/devtools-bridge.js.map +1 -1
- package/dist/packages/angular-renderer/src/index.d.ts +1 -0
- package/dist/packages/angular-renderer/src/index.js +1 -0
- package/dist/packages/angular-renderer/src/index.js.map +1 -1
- package/dist/packages/angular-renderer/src/lib/primitives.provider.js +26 -20
- package/dist/packages/angular-renderer/src/lib/primitives.provider.js.map +1 -1
- package/dist/packages/cli/CHANGELOG.md +8 -0
- package/dist/packages/cli/package.json +2 -2
- package/dist/packages/cli/package.json.bak +2 -2
- package/dist/packages/core/CHANGELOG.md +14 -0
- package/dist/packages/core/package.json +2 -2
- package/dist/packages/core/package.json.bak +2 -2
- package/dist/packages/design-tokens/CHANGELOG.md +8 -0
- package/dist/packages/design-tokens/package.json +1 -1
- package/dist/packages/playground/browser/{chunk-iSLqhP12.js → chunk-B1z-uVFi.js} +1 -1
- package/dist/packages/playground/browser/{chunk-BxusNwwt.js → chunk-BGZXpmBQ.js} +1 -1
- package/dist/packages/playground/browser/{chunk-B0HlAWSR.js → chunk-ByrswSrM.js} +1 -1
- package/dist/packages/playground/browser/{chunk-rK1aqCb7.js → chunk-CFbPXTNr.js} +1 -1
- package/dist/packages/playground/browser/{chunk-Dd9ht4SU.js → chunk-CSecAR9q.js} +1 -1
- package/dist/packages/playground/browser/{chunk-BkTn1FbH.js → chunk-D-8Zr5zg.js} +1 -1
- package/dist/packages/playground/browser/{chunk-DbylCYBP.js → chunk-D2kcCG-o.js} +1 -1
- package/dist/packages/playground/browser/{chunk-zg5PqW0l.js → chunk-DQx5lQqG.js} +1 -1
- package/dist/packages/playground/browser/{chunk-DXxUFvGw.js → chunk-Dac2dp5T.js} +1 -1
- package/dist/packages/playground/browser/{chunk-CXHFI87Z.js → chunk-DiZkmwKl.js} +1 -1
- package/dist/packages/playground/browser/{chunk-BI1AmKI_.js → chunk-DwU-a89u.js} +1 -1
- package/dist/packages/playground/browser/{chunk-D2bm1B8y.js → chunk-JF8ksHJn.js} +1 -1
- package/dist/packages/playground/browser/{chunk-ZeGfaGFy.js → chunk-_TRKH8kG.js} +1 -1
- package/dist/packages/playground/browser/{chunk-DT7GQcHj.js → chunk-e5kB8V0v.js} +1 -1
- package/dist/packages/playground/browser/{chunk-94bHXqp1.js → chunk-zJLityDb.js} +1 -1
- package/dist/packages/playground/browser/index.html +1 -1
- package/dist/packages/playground/browser/main-33XWGVNC.js +731 -0
- package/eslint.config.js +2 -1
- package/generate_prompts.ps1 +10 -0
- package/package.json +3 -2
- package/packages/angular-renderer/CHANGELOG.md +21 -0
- package/packages/angular-renderer/package.json +7 -6
- package/packages/angular-renderer/playwright/.cache/assets/adapter-iYml3Kk6.js +121 -0
- package/packages/angular-renderer/playwright/.cache/assets/adapter-iYml3Kk6.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/breadcrumbs.component-DqZwZwH1.js +200 -0
- package/packages/angular-renderer/playwright/.cache/assets/breadcrumbs.component-DqZwZwH1.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/button.component-Dnc1mP3D.js +112 -0
- package/packages/angular-renderer/playwright/.cache/assets/button.component-Dnc1mP3D.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/card.component-0WWaDbUV.js +180 -0
- package/packages/angular-renderer/playwright/.cache/assets/card.component-0WWaDbUV.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/checkbox.component-JGpevUFG.js +150 -0
- package/packages/angular-renderer/playwright/.cache/assets/checkbox.component-JGpevUFG.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/chip.component-DHGk3h8k.js +121 -0
- package/packages/angular-renderer/playwright/.cache/assets/chip.component-DHGk3h8k.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/data-grid.component-DDZZ4enP.js +352 -0
- package/packages/angular-renderer/playwright/.cache/assets/data-grid.component-DDZZ4enP.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/experience-adapter.service-CJxHLpWN.js +38 -0
- package/packages/angular-renderer/playwright/.cache/assets/experience-adapter.service-CJxHLpWN.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/form-field.component-DZA0NfB7.js +184 -0
- package/packages/angular-renderer/playwright/.cache/assets/form-field.component-DZA0NfB7.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/hbox.component-D5YHn6Vu.js +125 -0
- package/packages/angular-renderer/playwright/.cache/assets/hbox.component-D5YHn6Vu.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/index-DRoHZv2r.js +92806 -0
- package/packages/angular-renderer/playwright/.cache/assets/index-DRoHZv2r.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/label.component-DDKtYvrS.js +105 -0
- package/packages/angular-renderer/playwright/.cache/assets/label.component-DDKtYvrS.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/list.component-DSP5wzI4.js +195 -0
- package/packages/angular-renderer/playwright/.cache/assets/list.component-DSP5wzI4.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/radio-group.component-BzVciXZu.js +171 -0
- package/packages/angular-renderer/playwright/.cache/assets/radio-group.component-BzVciXZu.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/select.component-BC_aoLNt.js +180 -0
- package/packages/angular-renderer/playwright/.cache/assets/select.component-BC_aoLNt.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/sidebar.component-CY_vKSCu.js +217 -0
- package/packages/angular-renderer/playwright/.cache/assets/sidebar.component-CY_vKSCu.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/switch.component-BtfhJxLp.js +144 -0
- package/packages/angular-renderer/playwright/.cache/assets/switch.component-BtfhJxLp.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/tabs.component-DGcKkhH_.js +218 -0
- package/packages/angular-renderer/playwright/.cache/assets/tabs.component-DGcKkhH_.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/text-input.component-IyHHKpW-.js +121 -0
- package/packages/angular-renderer/playwright/.cache/assets/text-input.component-IyHHKpW-.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/textarea.component-Bpvh81yV.js +141 -0
- package/packages/angular-renderer/playwright/.cache/assets/textarea.component-Bpvh81yV.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/assets/vbox.component-DRe59FUF.js +127 -0
- package/packages/angular-renderer/playwright/.cache/assets/vbox.component-DRe59FUF.js.map +1 -0
- package/packages/angular-renderer/playwright/.cache/index.html +11 -0
- package/packages/angular-renderer/playwright/.cache/metainfo.json +5416 -0
- package/packages/angular-renderer/playwright/index.html +11 -0
- package/packages/angular-renderer/playwright/index.ts +1 -0
- package/packages/angular-renderer/playwright-ct.config.ts +13 -3
- package/packages/angular-renderer/src/adapters/web/experience-adapter.service.ts +15 -1
- package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.pw.ts +37 -0
- package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.ts +0 -1
- package/packages/angular-renderer/src/components/primitives/button/button.component.pw.ts +17 -4
- package/packages/angular-renderer/src/components/primitives/card/card.component.pw.ts +32 -0
- package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.pw.ts +38 -0
- package/packages/angular-renderer/src/components/primitives/chip/chip.component.pw.ts +56 -0
- package/packages/angular-renderer/src/components/primitives/chip/chip.component.ts +1 -1
- package/packages/angular-renderer/src/components/primitives/data-grid/data-grid.component.pw.ts +37 -0
- package/packages/angular-renderer/src/components/primitives/form-field/form-field.component.pw.ts +38 -0
- package/packages/angular-renderer/src/components/primitives/hbox/hbox.component.pw.ts +32 -0
- package/packages/angular-renderer/src/components/primitives/label/label.component.pw.ts +32 -0
- package/packages/angular-renderer/src/components/primitives/list/list.component.pw.ts +37 -0
- package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.pw.ts +38 -0
- package/packages/angular-renderer/src/components/primitives/select/select.component.pw.ts +32 -0
- package/packages/angular-renderer/src/components/primitives/sidebar/sidebar.component.pw.ts +37 -0
- package/packages/angular-renderer/src/components/primitives/switch/switch.component.pw.ts +62 -0
- package/packages/angular-renderer/src/components/primitives/switch/switch.component.ts +1 -1
- package/packages/angular-renderer/src/components/primitives/tabs/tabs.component.pw.ts +37 -0
- package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.pw.ts +16 -7
- package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.pw.ts +38 -0
- package/packages/angular-renderer/src/components/primitives/vbox/vbox.component.pw.ts +17 -4
- package/packages/angular-renderer/src/devtools/devtools-bridge.ts +2 -0
- package/packages/angular-renderer/src/index.ts +1 -0
- package/packages/angular-renderer/src/lib/primitives.provider.ts +29 -21
- package/packages/cli/CHANGELOG.md +8 -0
- package/packages/cli/package.json +2 -2
- package/packages/core/CHANGELOG.md +14 -0
- package/packages/core/package.json +2 -2
- package/packages/design-tokens/CHANGELOG.md +8 -0
- package/packages/design-tokens/package.json +1 -1
- package/packages/devtools/CHANGELOG.md +8 -0
- package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/deps___vitest_vm__/_metadata.json +3 -3
- package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/packages/devtools/package.json +1 -1
- package/packages/playground/CHANGELOG.md +14 -0
- package/packages/playground/netlify.toml +6 -0
- package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/deps___vitest_vm__/_metadata.json +3 -3
- package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/packages/playground/package.json +3 -3
- package/packages/playground/src/app/app.config.ts +6 -1
- package/packages/playground/src/preview/preview-root.component.ts +173 -12
- package/dist/packages/playground/browser/main-BBGOLU74.js +0 -711
- 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.
|
|
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
|
|
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.
|
|
4
|
-
"private":
|
|
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.
|
|
10
|
-
"@origo/design-tokens": "0.0.
|
|
9
|
+
"@origo/core": "0.0.39",
|
|
10
|
+
"@origo/design-tokens": "0.0.39",
|
|
11
11
|
"tslib": "^2.3.0",
|
|
12
|
-
"@
|
|
13
|
-
"
|
|
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
|
package/packages/angular-renderer/playwright/.cache/assets/breadcrumbs.component-DqZwZwH1.js.map
ADDED
|
@@ -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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"}
|