@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
@@ -0,0 +1,352 @@
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
+ j as __classProp,
11
+ k as __attribute,
12
+ h as __advance,
13
+ w as __textInterpolate1,
14
+ C as __pipe,
15
+ i as __textInterpolate,
16
+ E as __pipeBind1,
17
+ r as __repeaterCreate,
18
+ t as __repeater,
19
+ v as __domProperty,
20
+ F as __textInterpolate2,
21
+ n as input,
22
+ o as inject,
23
+ D as DomSanitizer,
24
+ G as signal,
25
+ p as computed,
26
+ S as SecurityContext,
27
+ q as __defineComponent,
28
+ J as JsonPipe,
29
+ l as __conditionalCreate,
30
+ m as __conditional,
31
+ } from './index-DRoHZv2r.js';
32
+ import { W as WebExperienceAdapterService } from './experience-adapter.service-CJxHLpWN.js';
33
+
34
+ const _forTrack0 = ($index, $item) => $item.key;
35
+ const _forTrack1 = ($index, $item) => $item['id'] ?? $index;
36
+ function DataGridComponent_For_5_Template(rf, ctx) {
37
+ if (rf & 1) {
38
+ const _r1 = __getCurrentView();
39
+ __domElementStart(0, 'th', 4);
40
+ __domListener('click', function DataGridComponent_For_5_Template_th_click_0_listener() {
41
+ const col_r2 = __restoreView(_r1).$implicit;
42
+ const ctx_r2 = __nextContext();
43
+ return __resetView(col_r2.sortable ? ctx_r2.onSort(col_r2.key) : null);
44
+ })('keydown.enter', function DataGridComponent_For_5_Template_th_keydown_enter_0_listener() {
45
+ const col_r2 = __restoreView(_r1).$implicit;
46
+ const ctx_r2 = __nextContext();
47
+ return __resetView(col_r2.sortable ? ctx_r2.onSort(col_r2.key) : null);
48
+ })('keydown.space', function DataGridComponent_For_5_Template_th_keydown_space_0_listener() {
49
+ const col_r2 = __restoreView(_r1).$implicit;
50
+ const ctx_r2 = __nextContext();
51
+ return __resetView(col_r2.sortable ? ctx_r2.onSort(col_r2.key) : null);
52
+ });
53
+ __text(1);
54
+ __domElementEnd();
55
+ }
56
+ if (rf & 2) {
57
+ const col_r2 = ctx.$implicit;
58
+ const ctx_r2 = __nextContext();
59
+ __classProp('sortable', col_r2.sortable);
60
+ __attribute(
61
+ 'aria-sort',
62
+ col_r2.sortable && ctx_r2.currentSortKey() === col_r2.key
63
+ ? ctx_r2.sortDir() === 'asc'
64
+ ? 'ascending'
65
+ : 'descending'
66
+ : null
67
+ )('tabindex', col_r2.sortable ? 0 : null)('role', col_r2.sortable ? 'button' : null);
68
+ __advance();
69
+ __textInterpolate1(' ', col_r2.label, ' ');
70
+ }
71
+ }
72
+ function DataGridComponent_For_8_For_2_Template(rf, ctx) {
73
+ if (rf & 1) {
74
+ __domElementStart(0, 'td');
75
+ __text(1);
76
+ __pipe(2, 'json');
77
+ __domElementEnd();
78
+ }
79
+ if (rf & 2) {
80
+ const col_r10 = ctx.$implicit;
81
+ const row_r6 = __nextContext().$implicit;
82
+ const ctx_r2 = __nextContext();
83
+ __advance();
84
+ __textInterpolate(
85
+ ctx_r2.isObject(row_r6[col_r10.key])
86
+ ? __pipeBind1(2, 1, row_r6[col_r10.key])
87
+ : row_r6[col_r10.key]
88
+ );
89
+ }
90
+ }
91
+ function DataGridComponent_For_8_Template(rf, ctx) {
92
+ if (rf & 1) {
93
+ const _r4 = __getCurrentView();
94
+ __domElementStart(0, 'tr', 5);
95
+ __domListener('click', function DataGridComponent_For_8_Template_tr_click_0_listener() {
96
+ const ctx_r4 = __restoreView(_r4);
97
+ const row_r6 = ctx_r4.$implicit;
98
+ const $index_r7 = ctx_r4.$index;
99
+ const ctx_r2 = __nextContext();
100
+ return __resetView(
101
+ ctx_r2.onRowSelect(row_r6['id'] ?? row_r6['key'] ?? row_r6['_id'] ?? $index_r7)
102
+ );
103
+ })('keydown.enter', function DataGridComponent_For_8_Template_tr_keydown_enter_0_listener() {
104
+ const ctx_r7 = __restoreView(_r4);
105
+ const row_r6 = ctx_r7.$implicit;
106
+ const $index_r7 = ctx_r7.$index;
107
+ const ctx_r2 = __nextContext();
108
+ return __resetView(
109
+ ctx_r2.onRowSelect(row_r6['id'] ?? row_r6['key'] ?? row_r6['_id'] ?? $index_r7)
110
+ );
111
+ })('keydown.space', function DataGridComponent_For_8_Template_tr_keydown_space_0_listener() {
112
+ const ctx_r8 = __restoreView(_r4);
113
+ const row_r6 = ctx_r8.$implicit;
114
+ const $index_r7 = ctx_r8.$index;
115
+ const ctx_r2 = __nextContext();
116
+ return __resetView(
117
+ ctx_r2.onRowSelect(row_r6['id'] ?? row_r6['key'] ?? row_r6['_id'] ?? $index_r7)
118
+ );
119
+ });
120
+ __repeaterCreate(1, DataGridComponent_For_8_For_2_Template, 3, 3, 'td', null, _forTrack0);
121
+ __domElementEnd();
122
+ }
123
+ if (rf & 2) {
124
+ const ctx_r2 = __nextContext();
125
+ __advance();
126
+ __repeater(ctx_r2.computedColumns());
127
+ }
128
+ }
129
+ function DataGridComponent_Conditional_9_Template(rf, ctx) {
130
+ if (rf & 1) {
131
+ const _r11 = __getCurrentView();
132
+ __domElementStart(0, 'div', 3)(1, 'button', 6);
133
+ __domListener(
134
+ 'click',
135
+ function DataGridComponent_Conditional_9_Template_button_click_1_listener() {
136
+ __restoreView(_r11);
137
+ const ctx_r2 = __nextContext();
138
+ return __resetView(ctx_r2.onPageChange(ctx_r2.computedCurrentPage() - 1));
139
+ }
140
+ );
141
+ __text(2, ' Previous ');
142
+ __domElementEnd();
143
+ __domElementStart(3, 'span', 7);
144
+ __text(4);
145
+ __domElementEnd();
146
+ __domElementStart(5, 'button', 8);
147
+ __domListener(
148
+ 'click',
149
+ function DataGridComponent_Conditional_9_Template_button_click_5_listener() {
150
+ __restoreView(_r11);
151
+ const ctx_r2 = __nextContext();
152
+ return __resetView(ctx_r2.onPageChange(ctx_r2.computedCurrentPage() + 1));
153
+ }
154
+ );
155
+ __text(6, ' Next ');
156
+ __domElementEnd()();
157
+ }
158
+ if (rf & 2) {
159
+ const ctx_r2 = __nextContext();
160
+ __advance();
161
+ __domProperty('disabled', ctx_r2.computedCurrentPage() <= 1 || ctx_r2.computedDisabled());
162
+ __advance(3);
163
+ __textInterpolate2(
164
+ ' Page ',
165
+ ctx_r2.computedCurrentPage(),
166
+ ' of ',
167
+ ctx_r2.computedTotalPages(),
168
+ ' '
169
+ );
170
+ __advance();
171
+ __domProperty(
172
+ 'disabled',
173
+ ctx_r2.computedCurrentPage() >= ctx_r2.computedTotalPages() || ctx_r2.computedDisabled()
174
+ );
175
+ }
176
+ }
177
+ class DataGridComponent {
178
+ static contractSchema = {
179
+ columns: 'array',
180
+ rows: 'array',
181
+ pageSize: 'number',
182
+ currentPage: 'number',
183
+ totalRows: 'number',
184
+ disabled: 'boolean',
185
+ };
186
+ static strictContract = false;
187
+ contract = input.required(
188
+ ...(false ? [{ debugName: 'contract' }] : /* istanbul ignore next */ [])
189
+ );
190
+ experienceAdapter = inject(WebExperienceAdapterService);
191
+ sanitizer = inject(DomSanitizer);
192
+ // Track sort direction locally for toggling
193
+ sortDir = signal('asc', ...(false ? [{ debugName: 'sortDir' }] : /* istanbul ignore next */ []));
194
+ currentSortKey = signal(
195
+ null,
196
+ ...(false ? [{ debugName: 'currentSortKey' }] : /* istanbul ignore next */ [])
197
+ );
198
+ computedColumns = computed(
199
+ () => {
200
+ const cols = this.contract().props?.columns;
201
+ return Array.isArray(cols)
202
+ ? cols.filter(c => c != null && c.key != null && c.label != null)
203
+ : [];
204
+ },
205
+ ...(false ? [{ debugName: 'computedColumns' }] : /* istanbul ignore next */ [])
206
+ );
207
+ computedRows = computed(
208
+ () => {
209
+ const rows = this.contract().props?.rows;
210
+ if (!Array.isArray(rows)) return [];
211
+ const validRows = rows.filter(r => r != null);
212
+ const pageSize = this.contract().props?.pageSize;
213
+ let currentPage = this.contract().props?.currentPage;
214
+ if (typeof pageSize !== 'number' || pageSize <= 0) {
215
+ return validRows.slice(0, 100);
216
+ }
217
+ if (typeof currentPage !== 'number' || currentPage < 1) {
218
+ currentPage = 1;
219
+ }
220
+ const startIndex = (currentPage - 1) * pageSize;
221
+ return validRows.slice(startIndex, startIndex + pageSize);
222
+ },
223
+ ...(false ? [{ debugName: 'computedRows' }] : /* istanbul ignore next */ [])
224
+ );
225
+ computedTotalRows = computed(
226
+ () => {
227
+ const totalRows = this.contract().props?.totalRows;
228
+ if (typeof totalRows === 'number' && totalRows >= 0) return totalRows;
229
+ const rows = this.contract().props?.rows;
230
+ return Array.isArray(rows) ? rows.length : 0;
231
+ },
232
+ ...(false ? [{ debugName: 'computedTotalRows' }] : /* istanbul ignore next */ [])
233
+ );
234
+ computedCurrentPage = computed(
235
+ () => {
236
+ const cp = this.contract().props?.currentPage;
237
+ return typeof cp === 'number' && cp >= 1 ? cp : 1;
238
+ },
239
+ ...(false ? [{ debugName: 'computedCurrentPage' }] : /* istanbul ignore next */ [])
240
+ );
241
+ computedTotalPages = computed(
242
+ () => {
243
+ const pageSize = this.contract().props?.pageSize;
244
+ if (typeof pageSize !== 'number' || pageSize <= 0) return 1;
245
+ return Math.max(1, Math.ceil(this.computedTotalRows() / pageSize));
246
+ },
247
+ ...(false ? [{ debugName: 'computedTotalPages' }] : /* istanbul ignore next */ [])
248
+ );
249
+ computedDisabled = computed(
250
+ () => !!this.contract().props?.disabled,
251
+ ...(false ? [{ debugName: 'computedDisabled' }] : /* istanbul ignore next */ [])
252
+ );
253
+ computedAriaLabel = computed(
254
+ () => {
255
+ const label = this.contract().props?.['aria-label'];
256
+ return label !== void 0 && label !== null ? String(label) : void 0;
257
+ },
258
+ ...(false ? [{ debugName: 'computedAriaLabel' }] : /* istanbul ignore next */ [])
259
+ );
260
+ computedAriaDescribedBy = computed(
261
+ () => {
262
+ const desc = this.contract().props?.['aria-describedby'];
263
+ return desc !== void 0 && desc !== null ? String(desc) : void 0;
264
+ },
265
+ ...(false ? [{ debugName: 'computedAriaDescribedBy' }] : /* istanbul ignore next */ [])
266
+ );
267
+ onSort(key) {
268
+ if (this.computedDisabled()) return;
269
+ if (this.currentSortKey() === key) {
270
+ this.sortDir.update(d => (d === 'asc' ? 'desc' : 'asc'));
271
+ } else {
272
+ this.currentSortKey.set(key);
273
+ this.sortDir.set('desc');
274
+ }
275
+ this.experienceAdapter.updateState(this.contract().id, 'sortKey', key);
276
+ this.experienceAdapter.updateState(this.contract().id, 'sortDir', this.sortDir());
277
+ }
278
+ onPageChange(page) {
279
+ if (this.computedDisabled() || !Number.isInteger(page) || page < 1) return;
280
+ this.experienceAdapter.updateState(this.contract().id, 'currentPage', page);
281
+ }
282
+ onRowSelect(rowId) {
283
+ if (this.computedDisabled() || rowId == null) return;
284
+ const rawValue = String(rowId);
285
+ const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, rawValue);
286
+ const sanitizedValue =
287
+ sanitized != null && sanitized !== '' ? sanitized : rawValue.replace(/[<>]/g, '');
288
+ this.experienceAdapter.updateState(this.contract().id, 'selectedRow', sanitizedValue);
289
+ }
290
+ isObject(val) {
291
+ return typeof val === 'object' && val !== null;
292
+ }
293
+ static ɵfac = function DataGridComponent_Factory(__ngFactoryType__) {
294
+ return new (__ngFactoryType__ || DataGridComponent)();
295
+ };
296
+ static ɵcmp = /* @__PURE__ */ __defineComponent({
297
+ type: DataGridComponent,
298
+ selectors: [['origo-data-grid']],
299
+ hostVars: 5,
300
+ hostBindings: function DataGridComponent_HostBindings(rf, ctx) {
301
+ if (rf & 2) {
302
+ __attribute('data-testid', ctx.contract().id)('aria-label', ctx.computedAriaLabel())(
303
+ 'aria-describedby',
304
+ ctx.computedAriaDescribedBy()
305
+ );
306
+ __classProp('origo-data-grid', true);
307
+ }
308
+ },
309
+ inputs: { contract: [1, 'contract'] },
310
+ decls: 10,
311
+ vars: 4,
312
+ consts: [
313
+ [1, 'origo-data-grid-container'],
314
+ [3, 'sortable'],
315
+ ['tabindex', '0', 'role', 'button'],
316
+ [1, 'origo-data-grid-pagination'],
317
+ [3, 'click', 'keydown.enter', 'keydown.space'],
318
+ ['tabindex', '0', 'role', 'button', 3, 'click', 'keydown.enter', 'keydown.space'],
319
+ ['aria-label', 'Previous Page', 3, 'click', 'disabled'],
320
+ [1, 'page-info'],
321
+ ['aria-label', 'Next Page', 3, 'click', 'disabled'],
322
+ ],
323
+ template: function DataGridComponent_Template(rf, ctx) {
324
+ if (rf & 1) {
325
+ __domElementStart(0, 'div', 0)(1, 'table')(2, 'thead')(3, 'tr');
326
+ __repeaterCreate(4, DataGridComponent_For_5_Template, 2, 6, 'th', 1, _forTrack0);
327
+ __domElementEnd()();
328
+ __domElementStart(6, 'tbody');
329
+ __repeaterCreate(7, DataGridComponent_For_8_Template, 3, 0, 'tr', 2, _forTrack1);
330
+ __domElementEnd()();
331
+ __conditionalCreate(9, DataGridComponent_Conditional_9_Template, 7, 4, 'div', 3);
332
+ __domElementEnd();
333
+ }
334
+ if (rf & 2) {
335
+ __classProp('disabled', ctx.computedDisabled());
336
+ __attribute('aria-describedby', ctx.computedAriaDescribedBy());
337
+ __advance(4);
338
+ __repeater(ctx.computedColumns());
339
+ __advance(3);
340
+ __repeater(ctx.computedRows());
341
+ __advance(2);
342
+ __conditional(ctx.computedTotalRows() > 0 ? 9 : -1);
343
+ }
344
+ },
345
+ dependencies: [JsonPipe],
346
+ encapsulation: 3,
347
+ });
348
+ }
349
+ /* @__PURE__ */ (() => {})();
350
+
351
+ export { DataGridComponent };
352
+ //# sourceMappingURL=data-grid.component-DDZZ4enP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-grid.component-DDZZ4enP.js","sources":["../../../src/components/primitives/data-grid/data-grid.component.ts"],"sourcesContent":["import {\n Component,\n input,\n ChangeDetectionStrategy,\n computed,\n ViewEncapsulation,\n inject,\n SecurityContext,\n signal,\n} from '@angular/core';\nimport { JsonPipe } from '@angular/common';\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 DataGridProps {\n columns?: Array<{ key: string; label: string; sortable?: boolean }>;\n rows?: Array<Record<string, unknown>>;\n pageSize?: number;\n currentPage?: number;\n totalRows?: number;\n disabled?: boolean;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\n@Component({\n selector: 'origo-data-grid',\n standalone: true,\n imports: [JsonPipe],\n templateUrl: './data-grid.component.html',\n styleUrls: ['./data-grid.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n host: {\n '[class.origo-data-grid]': 'true',\n '[attr.data-testid]': 'contract().id',\n '[attr.aria-label]': 'computedAriaLabel()',\n '[attr.aria-describedby]': 'computedAriaDescribedBy()',\n },\n})\nexport class DataGridComponent implements OrigoAdapter<DataGridProps> {\n static readonly contractSchema = {\n columns: 'array',\n rows: 'array',\n pageSize: 'number',\n currentPage: 'number',\n totalRows: 'number',\n disabled: 'boolean',\n };\n static readonly strictContract = false;\n\n contract = input.required<InteractionContract<DataGridProps>>();\n\n private experienceAdapter = inject(WebExperienceAdapterService);\n private sanitizer = inject(DomSanitizer);\n\n // Track sort direction locally for toggling\n sortDir = signal<'asc' | 'desc'>('asc');\n currentSortKey = signal<string | null>(null);\n\n computedColumns = computed(() => {\n const cols = this.contract().props?.columns;\n return Array.isArray(cols)\n ? cols.filter(c => c != null && c.key != null && c.label != null)\n : [];\n });\n\n computedRows = computed(() => {\n const rows = this.contract().props?.rows;\n if (!Array.isArray(rows)) return [];\n const validRows = rows.filter(r => r != null);\n\n const pageSize = this.contract().props?.pageSize;\n let currentPage = this.contract().props?.currentPage;\n\n if (typeof pageSize !== 'number' || pageSize <= 0) {\n return validRows.slice(0, 100); // no pagination cap if pageSize is invalid, but cap at 100 to prevent huge rendering\n }\n\n if (typeof currentPage !== 'number' || currentPage < 1) {\n currentPage = 1;\n }\n\n const startIndex = (currentPage - 1) * pageSize;\n return validRows.slice(startIndex, startIndex + pageSize);\n });\n\n computedTotalRows = computed(() => {\n const totalRows = this.contract().props?.totalRows;\n if (typeof totalRows === 'number' && totalRows >= 0) return totalRows;\n const rows = this.contract().props?.rows;\n return Array.isArray(rows) ? rows.length : 0;\n });\n\n computedCurrentPage = computed(() => {\n const cp = this.contract().props?.currentPage;\n return typeof cp === 'number' && cp >= 1 ? cp : 1;\n });\n\n computedTotalPages = computed(() => {\n const pageSize = this.contract().props?.pageSize;\n if (typeof pageSize !== 'number' || pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(this.computedTotalRows() / pageSize));\n });\n\n computedDisabled = computed(() => !!this.contract().props?.disabled);\n\n computedAriaLabel = computed(() => {\n const label = this.contract().props?.['aria-label'];\n return label !== undefined && label !== null ? String(label) : undefined;\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 onSort(key: string) {\n if (this.computedDisabled()) return;\n\n if (this.currentSortKey() === key) {\n this.sortDir.update(d => (d === 'asc' ? 'desc' : 'asc'));\n } else {\n this.currentSortKey.set(key);\n this.sortDir.set('desc');\n }\n\n this.experienceAdapter.updateState(this.contract().id, 'sortKey', key);\n this.experienceAdapter.updateState(this.contract().id, 'sortDir', this.sortDir());\n }\n\n onPageChange(page: number) {\n if (this.computedDisabled() || !Number.isInteger(page) || page < 1) return;\n this.experienceAdapter.updateState(this.contract().id, 'currentPage', page);\n }\n\n onRowSelect(rowId: unknown) {\n if (this.computedDisabled() || rowId == null) return;\n\n const rawValue = String(rowId);\n const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, rawValue);\n const sanitizedValue =\n sanitized != null && sanitized !== '' ? sanitized : rawValue.replace(/[<>]/g, '');\n\n this.experienceAdapter.updateState(this.contract().id, 'selectedRow', sanitizedValue);\n }\n\n isObject(val: unknown): boolean {\n return typeof val === 'object' && val !== null;\n }\n}\n"],"names":["i0.ɵɵgetCurrentView","i0.ɵɵdomElementStart","i0.ɵɵdomListener","i0.ɵɵrestoreView","i0.ɵɵnextContext","i0.ɵɵresetView","i0.ɵɵtext","i0.ɵɵdomElementEnd","i0.ɵɵclassProp","i0.ɵɵattribute","i0.ɵɵadvance","i0.ɵɵpipe","i0.ɵɵtextInterpolate","i0.ɵɵpipeBind1","i0.ɵɵrepeater","i0.ɵɵdomProperty","i0.ɵɵtextInterpolate2"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { G as signal, U as __defineInjectable } from './index-DRoHZv2r.js';
2
+
3
+ class WebExperienceAdapterService {
4
+ _state = signal({}, ...(false ? [{ debugName: '_state' }] : /* istanbul ignore next */ []));
5
+ getState(nodeId, property) {
6
+ return this._state()[nodeId]?.[property];
7
+ }
8
+ dispatchCapability(nodeId, actionName, payload) {
9
+ console.debug(
10
+ `[ExperienceAdapter] Dispatched capability '${actionName}' for node '${nodeId}'`,
11
+ payload
12
+ );
13
+ }
14
+ updateState(nodeId, property, value) {
15
+ console.debug(
16
+ `[ExperienceAdapter] Updated state for node '${nodeId}', property '${property}'`,
17
+ value
18
+ );
19
+ this._state.update(state => ({
20
+ ...state,
21
+ [nodeId]: {
22
+ ...state[nodeId],
23
+ [property]: value,
24
+ },
25
+ }));
26
+ }
27
+ static ɵfac = function WebExperienceAdapterService_Factory(__ngFactoryType__) {
28
+ return new (__ngFactoryType__ || WebExperienceAdapterService)();
29
+ };
30
+ static ɵprov = /* @__PURE__ */ __defineInjectable({
31
+ token: WebExperienceAdapterService,
32
+ factory: WebExperienceAdapterService.ɵfac,
33
+ providedIn: 'root',
34
+ });
35
+ }
36
+
37
+ export { WebExperienceAdapterService as W };
38
+ //# sourceMappingURL=experience-adapter.service-CJxHLpWN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experience-adapter.service-CJxHLpWN.js","sources":["../../../src/adapters/web/experience-adapter.service.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class WebExperienceAdapterService {\n private _state = signal<Record<string, Record<string, unknown>>>({});\n\n getState(nodeId: string, property: string): unknown {\n return this._state()[nodeId]?.[property];\n }\n\n dispatchCapability(nodeId: string, actionName: string, payload?: unknown): void {\n // In Phase 1, this provides the stateless translation boundary (AD-15).\n // Real dispatching logic to the core BADL engine would be wired here.\n console.debug(\n `[ExperienceAdapter] Dispatched capability '${actionName}' for node '${nodeId}'`,\n payload\n );\n }\n\n updateState(nodeId: string, property: string, value: unknown): void {\n // In Phase 1, this provides the stateless translation boundary (AD-15).\n console.debug(\n `[ExperienceAdapter] Updated state for node '${nodeId}', property '${property}'`,\n value\n );\n\n this._state.update(state => ({\n ...state,\n [nodeId]: {\n ...state[nodeId],\n [property]: value,\n },\n }));\n }\n}\n"],"names":["i0.ɵɵdefineInjectable"],"mappings":";;AAGO,MAAM,2BAAA,CAA4B;AAAA,EAC/B,MAAA,GAAS,MAAA;AAAA,IAAkD,EAAA;AAAA,IAEnE,GAAA,KAAA,GAAyB,CAAA,EAAA,SAAA,EAA2B,UAAA,CAAA;AAAA;AAAA,MAAA;AAAA;AAAA,GAAA;AAAA,EAClD,QAAA,CAAO,QAAK,QAAA,EAAe;AAC7B,IAAA,OAAA,IAAA,CAAA,MAAA,EAAA,CAAA,MAAA,IAAA,QAAA,CAAA;AAAA,EAEA;AAAA,EAGE,kBAAA,CAAQ,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA;AAGR,IAAA,OAAA,CAAA,MAAA,CAAA,2CAAA,EAAA,UAAA,CAAA,YAAA,EAAA,MAAA,KAAA,OAAA,CAAA;AAAA,EACF;AAAA,EAEA,WAAA,CAAY,MAAA,EAAgB,QAAA,EAAkB,KAAA,EAAsB;AAGhE,IAAA,OAAA,CAAA,MAAA,CAAA,4CAAA,EAAqD,MAAgB,CAAA,aAAA,EAAQ,QAAA,KAAA,KAAA,CAAA;AAC7E,IAAA,IAAA,CAAA,MAAA,CAAA,OAAA,CAAA,KAAA,MAAA;AAAA,MACF,GAAA,KAAA;AAAA,MAEK,CAAA;QACA,GAAA,MAAA,MAAA,CAAA;AAAA,QACO,CAAA,QAAA,GAAA;AAAA;KAER;EAAY;AAAA,EAEhB,OAAE,IAAA,GAAA,SAAA,mCAAA,CAAA,iBAAA,EAAA;AAAA,IAAA,OAAA,KAAA,qBAAA,2BAAA,GAAA;AAAA,EAAA,CAAA;AAAA,EACJ,OAAA,KAAA,mBAAAA,kBAAA,CAAA,EAAA,KAAA,EAAA,2BAAA,EAAA,OAAA,EAAA,2BAAA,CAAA,IAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA;AACF;;"}
@@ -0,0 +1,184 @@
1
+ import {
2
+ H as __element,
3
+ d as __nextContext,
4
+ I as __property,
5
+ K as __elementStart,
6
+ f as __text,
7
+ L as __elementEnd,
8
+ h as __advance,
9
+ i as __textInterpolate,
10
+ n as input,
11
+ M as viewChild,
12
+ V as ViewContainerRef,
13
+ p as computed,
14
+ q as __defineComponent,
15
+ l as __conditionalCreate,
16
+ N as __elementContainer,
17
+ m as __conditional,
18
+ k as __attribute,
19
+ j as __classProp,
20
+ O as __viewQuerySignal,
21
+ P as __queryAdvance,
22
+ } from './index-DRoHZv2r.js';
23
+ import { LabelComponent } from './label.component-DDKtYvrS.js';
24
+
25
+ const _c0 = ['vc'];
26
+ function FormFieldComponent_Conditional_0_Template(rf, ctx) {
27
+ if (rf & 1) {
28
+ __element(0, 'origo-label', 1);
29
+ }
30
+ if (rf & 2) {
31
+ const ctx_r0 = __nextContext();
32
+ __property('contract', ctx_r0.labelContract());
33
+ }
34
+ }
35
+ function FormFieldComponent_Conditional_4_Template(rf, ctx) {
36
+ if (rf & 1) {
37
+ __elementStart(0, 'div', 3);
38
+ __text(1);
39
+ __elementEnd();
40
+ }
41
+ if (rf & 2) {
42
+ const ctx_r0 = __nextContext();
43
+ __advance();
44
+ __textInterpolate(ctx_r0.computedError());
45
+ }
46
+ }
47
+ function FormFieldComponent_Conditional_5_Template(rf, ctx) {
48
+ if (rf & 1) {
49
+ __elementStart(0, 'div', 4);
50
+ __text(1);
51
+ __elementEnd();
52
+ }
53
+ if (rf & 2) {
54
+ const ctx_r0 = __nextContext();
55
+ __advance();
56
+ __textInterpolate(ctx_r0.computedHint());
57
+ }
58
+ }
59
+ class FormFieldComponent {
60
+ static contractSchema = {
61
+ label: 'string',
62
+ error: 'string',
63
+ hint: 'string',
64
+ required: 'boolean',
65
+ };
66
+ static strictContract = false;
67
+ contract = input.required(
68
+ ...(false ? [{ debugName: 'contract' }] : /* istanbul ignore next */ [])
69
+ );
70
+ vc = viewChild.required('vc', {
71
+ ...(false ? { debugName: 'vc' } : /* istanbul ignore next */ {}),
72
+ read: ViewContainerRef,
73
+ });
74
+ computedLabel = computed(
75
+ () => this.contract().props?.label,
76
+ ...(false ? [{ debugName: 'computedLabel' }] : /* istanbul ignore next */ [])
77
+ );
78
+ computedError = computed(
79
+ () => this.contract().props?.error,
80
+ ...(false ? [{ debugName: 'computedError' }] : /* istanbul ignore next */ [])
81
+ );
82
+ computedHint = computed(
83
+ () => this.contract().props?.hint,
84
+ ...(false ? [{ debugName: 'computedHint' }] : /* istanbul ignore next */ [])
85
+ );
86
+ computedRequired = computed(
87
+ () => !!this.contract().props?.required,
88
+ ...(false ? [{ debugName: 'computedRequired' }] : /* istanbul ignore next */ [])
89
+ );
90
+ computedAriaLabel = computed(
91
+ () => {
92
+ const label = this.contract().props?.['aria-label'];
93
+ return label !== void 0 && label !== null && String(label).trim() !== ''
94
+ ? String(label)
95
+ : void 0;
96
+ },
97
+ ...(false ? [{ debugName: 'computedAriaLabel' }] : /* istanbul ignore next */ [])
98
+ );
99
+ computedAriaDescribedBy = computed(
100
+ () => {
101
+ const desc = this.contract().props?.['aria-describedby'];
102
+ return desc !== void 0 && desc !== null && String(desc).trim() !== '' ? String(desc) : void 0;
103
+ },
104
+ ...(false ? [{ debugName: 'computedAriaDescribedBy' }] : /* istanbul ignore next */ [])
105
+ );
106
+ labelContract = computed(
107
+ () => {
108
+ const parentId = this.contract().id;
109
+ const childId = this.contract().children?.[0]?.id;
110
+ return {
111
+ id: `${parentId}-label`,
112
+ type: 'Label',
113
+ props: {
114
+ text: this.computedLabel(),
115
+ required: this.computedRequired(),
116
+ for: childId,
117
+ },
118
+ };
119
+ },
120
+ ...(false ? [{ debugName: 'labelContract' }] : /* istanbul ignore next */ [])
121
+ );
122
+ static ɵfac = function FormFieldComponent_Factory(__ngFactoryType__) {
123
+ return new (__ngFactoryType__ || FormFieldComponent)();
124
+ };
125
+ static ɵcmp = /* @__PURE__ */ __defineComponent({
126
+ type: FormFieldComponent,
127
+ selectors: [['origo-form-field']],
128
+ viewQuery: function FormFieldComponent_Query(rf, ctx) {
129
+ if (rf & 1) {
130
+ __viewQuerySignal(ctx.vc, _c0, 5, ViewContainerRef);
131
+ }
132
+ if (rf & 2) {
133
+ __queryAdvance();
134
+ }
135
+ },
136
+ hostVars: 8,
137
+ hostBindings: function FormFieldComponent_HostBindings(rf, ctx) {
138
+ if (rf & 2) {
139
+ __attribute('data-testid', ctx.contract().id ?? '')(
140
+ 'role',
141
+ ctx.computedAriaLabel() ? 'group' : null
142
+ )('aria-label', ctx.computedAriaLabel())('aria-describedby', ctx.computedAriaDescribedBy());
143
+ __classProp('origo-form-field', true)('has-error', !!ctx.computedError());
144
+ }
145
+ },
146
+ inputs: { contract: [1, 'contract'] },
147
+ decls: 6,
148
+ vars: 2,
149
+ consts: [
150
+ ['vc', ''],
151
+ [3, 'contract'],
152
+ [1, 'form-field-control'],
153
+ ['role', 'alert', 1, 'form-field-error'],
154
+ [1, 'form-field-hint'],
155
+ ],
156
+ template: function FormFieldComponent_Template(rf, ctx) {
157
+ if (rf & 1) {
158
+ __conditionalCreate(0, FormFieldComponent_Conditional_0_Template, 1, 1, 'origo-label', 1);
159
+ __elementStart(1, 'div', 2);
160
+ __elementContainer(2, null, 0);
161
+ __elementEnd();
162
+ __conditionalCreate(4, FormFieldComponent_Conditional_4_Template, 2, 1, 'div', 3)(
163
+ 5,
164
+ FormFieldComponent_Conditional_5_Template,
165
+ 2,
166
+ 1,
167
+ 'div',
168
+ 4
169
+ );
170
+ }
171
+ if (rf & 2) {
172
+ __conditional(ctx.computedLabel() ? 0 : -1);
173
+ __advance(4);
174
+ __conditional(ctx.computedError() ? 4 : ctx.computedHint() ? 5 : -1);
175
+ }
176
+ },
177
+ dependencies: [LabelComponent],
178
+ encapsulation: 3,
179
+ });
180
+ }
181
+ /* @__PURE__ */ (() => {})();
182
+
183
+ export { FormFieldComponent };
184
+ //# sourceMappingURL=form-field.component-DZA0NfB7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field.component-DZA0NfB7.js","sources":["../../../src/components/primitives/form-field/form-field.component.ts"],"sourcesContent":["import {\n Component,\n input,\n viewChild,\n ViewContainerRef,\n ChangeDetectionStrategy,\n computed,\n ViewEncapsulation,\n} from '@angular/core';\nimport { InteractionContract } from '@origo/core';\nimport { OrigoAdapter, ContainerComponent } from '../../../adapters/web/adapter';\nimport { LabelComponent, LabelProps } from '../label/label.component';\n\nexport interface FormFieldProps {\n label?: string;\n error?: string;\n hint?: string;\n required?: boolean;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\n@Component({\n selector: 'origo-form-field',\n standalone: true,\n imports: [LabelComponent],\n templateUrl: './form-field.component.html',\n styleUrls: ['./form-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n host: {\n '[class.origo-form-field]': 'true',\n '[class.has-error]': '!!computedError()',\n '[attr.data-testid]': 'contract().id ?? \"\"',\n '[attr.role]': 'computedAriaLabel() ? \"group\" : null',\n '[attr.aria-label]': 'computedAriaLabel()',\n '[attr.aria-describedby]': 'computedAriaDescribedBy()',\n },\n})\nexport class FormFieldComponent implements OrigoAdapter<FormFieldProps>, ContainerComponent {\n static readonly contractSchema = {\n label: 'string',\n error: 'string',\n hint: 'string',\n required: 'boolean',\n };\n static readonly strictContract = false;\n\n contract = input.required<InteractionContract<FormFieldProps>>();\n\n vc = viewChild.required('vc', { read: ViewContainerRef });\n\n computedLabel = computed(() => this.contract().props?.label);\n computedError = computed(() => this.contract().props?.error);\n computedHint = computed(() => this.contract().props?.hint);\n computedRequired = computed(() => !!this.contract().props?.required);\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 labelContract = computed<InteractionContract<LabelProps>>(() => {\n const parentId = this.contract().id;\n const childId = this.contract().children?.[0]?.id;\n return {\n id: `${parentId}-label`,\n type: 'Label',\n props: {\n text: this.computedLabel(),\n required: this.computedRequired(),\n for: childId,\n },\n };\n });\n}\n"],"names":["i0.ɵɵelement","i0.ɵɵnextContext","i0.ɵɵproperty","i0.ɵɵelementStart","i0.ɵɵtext","i0.ɵɵelementEnd","i0.ɵɵadvance","i0.ɵɵtextInterpolate"],"mappings":"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"}