@origostudio/origo-design 0.0.53 → 0.0.55

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 (90) hide show
  1. package/CHANGELOG.md +4 -3
  2. package/dist/packages/angular-renderer/CHANGELOG.md +22 -0
  3. package/dist/packages/angular-renderer/package.json +9 -4
  4. package/dist/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.d.ts +17 -13
  5. package/dist/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.js +55 -20
  6. package/dist/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.js.map +1 -1
  7. package/dist/packages/angular-renderer/src/components/primitives/pagination/pagination.component.d.ts +64 -0
  8. package/dist/packages/angular-renderer/src/components/primitives/pagination/pagination.component.js +208 -0
  9. package/dist/packages/angular-renderer/src/components/primitives/pagination/pagination.component.js.map +1 -0
  10. package/dist/packages/angular-renderer/src/components/primitives/stepper/stepper.component.d.ts +65 -0
  11. package/dist/packages/angular-renderer/src/components/primitives/stepper/stepper.component.js +272 -0
  12. package/dist/packages/angular-renderer/src/components/primitives/stepper/stepper.component.js.map +1 -0
  13. package/dist/packages/angular-renderer/src/components/primitives/tabs/tabs.component.d.ts +24 -15
  14. package/dist/packages/angular-renderer/src/components/primitives/tabs/tabs.component.js +105 -45
  15. package/dist/packages/angular-renderer/src/components/primitives/tabs/tabs.component.js.map +1 -1
  16. package/dist/packages/angular-renderer/src/index.d.ts +5 -0
  17. package/dist/packages/angular-renderer/src/index.js +5 -0
  18. package/dist/packages/angular-renderer/src/index.js.map +1 -1
  19. package/dist/packages/angular-renderer/src/lib/overlay/overlay-ref.d.ts +40 -0
  20. package/dist/packages/angular-renderer/src/lib/overlay/overlay-ref.js +248 -0
  21. package/dist/packages/angular-renderer/src/lib/overlay/overlay-ref.js.map +1 -0
  22. package/dist/packages/angular-renderer/src/lib/overlay/overlay.models.d.ts +51 -0
  23. package/dist/packages/angular-renderer/src/lib/overlay/overlay.models.js +3 -0
  24. package/dist/packages/angular-renderer/src/lib/overlay/overlay.models.js.map +1 -0
  25. package/dist/packages/angular-renderer/src/lib/overlay/overlay.service.d.ts +12 -0
  26. package/dist/packages/angular-renderer/src/lib/overlay/overlay.service.js +211 -0
  27. package/dist/packages/angular-renderer/src/lib/overlay/overlay.service.js.map +1 -0
  28. package/dist/packages/angular-renderer/src/lib/primitives.provider.js +5 -0
  29. package/dist/packages/angular-renderer/src/lib/primitives.provider.js.map +1 -1
  30. package/dist/packages/cli/CHANGELOG.md +8 -0
  31. package/dist/packages/cli/package.json +2 -2
  32. package/dist/packages/cli/package.json.bak +2 -2
  33. package/dist/packages/core/CHANGELOG.md +8 -0
  34. package/dist/packages/core/package.json +1 -1
  35. package/dist/packages/core/package.json.bak +1 -1
  36. package/dist/packages/design-tokens/CHANGELOG.md +8 -0
  37. package/dist/packages/design-tokens/package.json +1 -1
  38. package/dist/packages/playground/browser/{chunk-CoyK3eaz.js → chunk-1qL4kcgA.js} +1 -1
  39. package/dist/packages/playground/browser/{chunk-DGFBCrz0.js → chunk-BrNyIaRu.js} +1 -1
  40. package/dist/packages/playground/browser/{chunk-BD3aW3fo.js → chunk-BtTuZVyy.js} +1 -1
  41. package/dist/packages/playground/browser/{chunk-CZYE6Vo5.js → chunk-COdU4TAE.js} +1 -1
  42. package/dist/packages/playground/browser/{chunk-D-gQXFhO.js → chunk-ChIFPhYz.js} +1 -1
  43. package/dist/packages/playground/browser/{chunk-CYa5xYdO.js → chunk-CkxX-6B-.js} +1 -1
  44. package/dist/packages/playground/browser/{chunk-kcBcpdDQ.js → chunk-CsaBv_7w.js} +1 -1
  45. package/dist/packages/playground/browser/{chunk-DoDHfFRC.js → chunk-DT7XZi8x.js} +1 -1
  46. package/dist/packages/playground/browser/{chunk-DjQs2rZT.js → chunk-DVT-phDq.js} +1 -1
  47. package/dist/packages/playground/browser/{chunk-DFUtHoSa.js → chunk-DYVZHQvW.js} +1 -1
  48. package/dist/packages/playground/browser/{chunk-OWSRr_rS.js → chunk-DYyPC2oE.js} +1 -1
  49. package/dist/packages/playground/browser/{chunk-BGrPMh-Q.js → chunk-DhQakfe5.js} +1 -1
  50. package/dist/packages/playground/browser/{chunk-Bb34YjCX.js → chunk-FZuwRWVL.js} +1 -1
  51. package/dist/packages/playground/browser/{chunk-Cxq4lcyl.js → chunk-x-oQTX69.js} +1 -1
  52. package/dist/packages/playground/browser/{chunk-K_6Vunnz.js → chunk-xkhVqkfX.js} +1 -1
  53. package/dist/packages/playground/browser/index.html +1 -1
  54. package/dist/packages/playground/browser/main-UNDFLKYI.js +889 -0
  55. package/package.json +3 -1
  56. package/packages/angular-renderer/CHANGELOG.md +22 -0
  57. package/packages/angular-renderer/package.json +9 -4
  58. package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.html +79 -14
  59. package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.scss +55 -9
  60. package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.ts +82 -22
  61. package/packages/angular-renderer/src/components/primitives/pagination/pagination.component.html +95 -0
  62. package/packages/angular-renderer/src/components/primitives/pagination/pagination.component.scss +109 -0
  63. package/packages/angular-renderer/src/components/primitives/pagination/pagination.component.ts +275 -0
  64. package/packages/angular-renderer/src/components/primitives/stepper/stepper.component.html +68 -0
  65. package/packages/angular-renderer/src/components/primitives/stepper/stepper.component.scss +167 -0
  66. package/packages/angular-renderer/src/components/primitives/stepper/stepper.component.ts +325 -0
  67. package/packages/angular-renderer/src/components/primitives/tabs/tabs.component.html +56 -24
  68. package/packages/angular-renderer/src/components/primitives/tabs/tabs.component.scss +115 -17
  69. package/packages/angular-renderer/src/components/primitives/tabs/tabs.component.ts +134 -42
  70. package/packages/angular-renderer/src/index.ts +5 -0
  71. package/packages/angular-renderer/src/lib/overlay/overlay-ref.ts +298 -0
  72. package/packages/angular-renderer/src/lib/overlay/overlay.models.ts +59 -0
  73. package/packages/angular-renderer/src/lib/overlay/overlay.service.ts +227 -0
  74. package/packages/angular-renderer/src/lib/primitives.provider.ts +5 -0
  75. package/packages/angular-renderer/src/styles/overlay.scss +117 -0
  76. package/packages/cli/CHANGELOG.md +8 -0
  77. package/packages/cli/package.json +2 -2
  78. package/packages/core/CHANGELOG.md +8 -0
  79. package/packages/core/package.json +1 -1
  80. package/packages/design-tokens/CHANGELOG.md +8 -0
  81. package/packages/design-tokens/package.json +1 -1
  82. package/packages/devtools/CHANGELOG.md +8 -0
  83. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/deps___vitest_vm__/_metadata.json +3 -3
  84. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  85. package/packages/devtools/package.json +3 -3
  86. package/packages/playground/CHANGELOG.md +8 -0
  87. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/deps___vitest_vm__/_metadata.json +3 -3
  88. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  89. package/packages/playground/package.json +3 -3
  90. package/dist/packages/playground/browser/main-ZTUYGW6H.js +0 -748
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/origo-design",
3
- "version": "0.0.53",
3
+ "version": "0.0.55",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,6 +15,7 @@
15
15
  "perf:benchmark": "ts-node tools/benchmarks/compare-baseline.ts",
16
16
  "perf:test": "ts-node tools/benchmarks/run-tests.ts",
17
17
  "spike:epic7": "node tools/spikes/epic7-worker-csp/build-spike.js",
18
+ "spike:overlay": "ts-node --project tsconfig.base.json tools/spikes/overlay-shadowdom/run-spike.ts",
18
19
  "prepare": "husky",
19
20
  "release": "nx release --skip-publish",
20
21
  "validate:registry": "ts-node --project tsconfig.base.json tools/test-registry/validate-registry.ts"
@@ -22,6 +23,7 @@
22
23
  "private": false,
23
24
  "dependencies": {
24
25
  "@angular/animations": "22.0.8",
26
+ "@angular/cdk": "22.0.7",
25
27
  "@angular/common": "22.0.8",
26
28
  "@angular/compiler": "22.0.8",
27
29
  "@angular/core": "22.0.8",
@@ -1,3 +1,25 @@
1
+ ## 0.0.55 (2026-10-13)
2
+
3
+ ### 🚀 Features
4
+
5
+ - implement navigation primitives including breadcrumbs, pagination, tabs, and stepper components ([7591e16](https://github.com/OrigoStudio/origo-design/commit/7591e16))
6
+ - add stepper, pagination, tabs, and breadcrumbs primitive components to angular-renderer ([915495f](https://github.com/OrigoStudio/origo-design/commit/915495f))
7
+
8
+ ### ❤️ Thank You
9
+
10
+ - Hardik Patel @hardikpatelse
11
+
12
+ ## 0.0.54 (2026-10-13)
13
+
14
+ ### 🚀 Features
15
+
16
+ - implement Angular overlay and portal architecture service for angular-renderer ([fe0c96a](https://github.com/OrigoStudio/origo-design/commit/fe0c96a))
17
+ - implement Angular overlay and portal architecture with Shadow DOM support ([954c255](https://github.com/OrigoStudio/origo-design/commit/954c255))
18
+
19
+ ### ❤️ Thank You
20
+
21
+ - Hardik Patel @hardikpatelse
22
+
1
23
  ## 0.0.53 (2026-10-09)
2
24
 
3
25
  ### 🚀 Features
@@ -1,24 +1,29 @@
1
1
  {
2
2
  "name": "@origostudio/angular-renderer",
3
- "version": "0.0.53",
3
+ "version": "0.0.55",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "dependencies": {
9
- "@origostudio/core": "0.0.53",
10
- "@origostudio/design-tokens": "0.0.53",
9
+ "@origostudio/core": "0.0.55",
10
+ "@origostudio/design-tokens": "0.0.55",
11
11
  "tslib": "^2.3.0",
12
12
  "@analogjs/vite-plugin-angular": "^2.7.1",
13
13
  "zone.js": "^0.16.3",
14
- "@axe-core/playwright": "^4.13.0"
14
+ "@axe-core/playwright": "^4.13.0",
15
+ "rxjs": "~7.8.0"
15
16
  },
16
17
  "peerDependencies": {
18
+ "@angular/cdk": ">=18.0.0",
17
19
  "@angular/common": ">=18.0.0",
18
20
  "@angular/core": ">=18.0.0",
19
21
  "@angular/forms": ">=18.0.0",
20
22
  "@angular/platform-browser": ">=18.0.0"
21
23
  },
24
+ "devDependencies": {
25
+ "@angular/cdk": "22.0.7"
26
+ },
22
27
  "repository": {
23
28
  "type": "git",
24
29
  "url": "https://github.com/OrigoStudio/origo-design.git"
@@ -1,24 +1,89 @@
1
1
  <ol class="origo-breadcrumbs__list">
2
+ @if (computedHome(); as homeItem) {
3
+ <li class="origo-breadcrumbs__item origo-breadcrumbs__item--home">
4
+ @if (computedItems().length > 0) {
5
+ @if (homeItem.url) {
6
+ <a
7
+ class="origo-breadcrumbs__link"
8
+ [attr.href]="homeItem.url"
9
+ [class.origo-breadcrumbs__link--disabled]="homeItem.disabled"
10
+ (click)="onItemClick($event, homeItem, false)"
11
+ >
12
+ @if (homeItem.icon) {
13
+ <span class="origo-breadcrumbs__icon" aria-hidden="true">{{ homeItem.icon }}</span>
14
+ }
15
+ <span>{{ homeItem.label }}</span>
16
+ </a>
17
+ } @else {
18
+ <button
19
+ type="button"
20
+ class="origo-breadcrumbs__link"
21
+ [disabled]="homeItem.disabled"
22
+ (click)="onItemClick($event, homeItem, false)"
23
+ >
24
+ @if (homeItem.icon) {
25
+ <span class="origo-breadcrumbs__icon" aria-hidden="true">{{ homeItem.icon }}</span>
26
+ }
27
+ <span>{{ homeItem.label }}</span>
28
+ </button>
29
+ }
30
+ <span class="origo-breadcrumbs__separator" aria-hidden="true">{{
31
+ computedSeparator()
32
+ }}</span>
33
+ } @else {
34
+ <span class="origo-breadcrumbs__current" [attr.aria-current]="'page'">
35
+ @if (homeItem.icon) {
36
+ <span class="origo-breadcrumbs__icon" aria-hidden="true">{{ homeItem.icon }}</span>
37
+ }
38
+ {{ homeItem.label }}
39
+ </span>
40
+ }
41
+ </li>
42
+ }
43
+
2
44
  @for (item of computedItems(); track $index; let last = $last) {
3
45
  <li class="origo-breadcrumbs__item">
4
- @if (!last && item.outcomeRef) {
5
- <a
6
- class="origo-breadcrumbs__link"
7
- href="javascript:void(0)"
8
- (click)="onItemClick($event, item, last)"
9
- >
10
- <span>{{ item.label }}</span>
11
- </a>
46
+ @if (!last) {
47
+ @if (item.url) {
48
+ <a
49
+ class="origo-breadcrumbs__link"
50
+ [attr.href]="item.url"
51
+ [class.origo-breadcrumbs__link--disabled]="item.disabled"
52
+ (click)="onItemClick($event, item, last)"
53
+ >
54
+ @if (item.icon) {
55
+ <span class="origo-breadcrumbs__icon" aria-hidden="true">{{ item.icon }}</span>
56
+ }
57
+ <span>{{ item.label }}</span>
58
+ </a>
59
+ } @else {
60
+ <button
61
+ type="button"
62
+ class="origo-breadcrumbs__link"
63
+ [disabled]="item.disabled"
64
+ (click)="onItemClick($event, item, last)"
65
+ >
66
+ @if (item.icon) {
67
+ <span class="origo-breadcrumbs__icon" aria-hidden="true">{{ item.icon }}</span>
68
+ }
69
+ <span>{{ item.label }}</span>
70
+ </button>
71
+ }
12
72
  } @else {
13
- <span
14
- [class.origo-breadcrumbs__current]="last"
15
- [attr.aria-current]="last ? 'page' : null"
16
- >{{ item.label }}</span
17
- >
73
+ <span class="origo-breadcrumbs__current" [attr.aria-current]="'page'">
74
+ @if (item.icon) {
75
+ <span class="origo-breadcrumbs__icon" aria-hidden="true">{{ item.icon }}</span>
76
+ }
77
+ {{ item.label }}
78
+ </span>
18
79
  }
80
+
19
81
  @if (!last) {
20
- <span class="origo-breadcrumbs__separator" aria-hidden="true">/</span>
82
+ <span class="origo-breadcrumbs__separator" aria-hidden="true">{{
83
+ computedSeparator()
84
+ }}</span>
21
85
  }
22
86
  </li>
23
87
  }
24
88
  </ol>
89
+ <ng-container #vc></ng-container>
@@ -1,5 +1,16 @@
1
1
  :host {
2
2
  display: block;
3
+ box-sizing: border-box;
4
+
5
+ *,
6
+ *::before,
7
+ *::after {
8
+ box-sizing: inherit;
9
+ }
10
+ }
11
+
12
+ :host([hidden]) {
13
+ display: none !important;
3
14
  }
4
15
 
5
16
  .origo-breadcrumbs__list {
@@ -9,33 +20,68 @@
9
20
  list-style: none;
10
21
  margin: 0;
11
22
  padding: 0;
12
- gap: var(--spacing-sm, 8px);
23
+ gap: var(--origo-spacing-sm);
13
24
  }
14
25
 
15
26
  .origo-breadcrumbs__item {
16
- display: flex;
27
+ display: inline-flex;
17
28
  align-items: center;
18
- font-size: 14px;
29
+ font-family: var(--origo-typography-body-font-family);
30
+ font-size: var(--origo-typography-button-font-size);
31
+ color: var(--origo-color-text-primary);
19
32
  }
20
33
 
21
34
  .origo-breadcrumbs__link {
22
- color: var(--color-primary, #1976d2);
35
+ display: inline-flex;
36
+ align-items: center;
37
+ gap: var(--origo-spacing-xs);
38
+ background: transparent;
39
+ border: none;
40
+ padding: 0;
41
+ margin: 0;
42
+ cursor: pointer;
43
+ font-family: inherit;
44
+ font-size: inherit;
45
+ color: var(--origo-color-brand-primary);
23
46
  text-decoration: none;
47
+ transition: color var(--origo-duration-fast) ease;
24
48
 
25
- &:hover,
26
- &:focus-visible {
49
+ &:hover:not(:disabled) {
50
+ color: var(--origo-color-brand-primary-hover);
27
51
  text-decoration: underline;
52
+ }
53
+
54
+ &:focus-visible {
55
+ outline: 2px solid var(--origo-color-focus);
28
56
  outline-offset: 2px;
29
57
  }
58
+
59
+ &:disabled,
60
+ &--disabled {
61
+ cursor: not-allowed;
62
+ color: var(--origo-color-text-disabled);
63
+ opacity: var(--origo-opacity-disabled);
64
+ pointer-events: none;
65
+ }
30
66
  }
31
67
 
32
68
  .origo-breadcrumbs__current {
33
- color: var(--color-text-secondary, #666666);
69
+ display: inline-flex;
70
+ align-items: center;
71
+ gap: var(--origo-spacing-xs);
72
+ color: var(--origo-color-text-muted);
34
73
  font-weight: 500;
35
74
  }
36
75
 
37
76
  .origo-breadcrumbs__separator {
38
- color: var(--color-text-hint, #999999);
39
- margin-inline-start: var(--spacing-sm, 8px);
77
+ display: inline-flex;
78
+ align-items: center;
79
+ color: var(--origo-color-text-muted);
80
+ margin-inline-start: var(--origo-spacing-sm);
40
81
  user-select: none;
41
82
  }
83
+
84
+ .origo-breadcrumbs__icon {
85
+ display: inline-flex;
86
+ align-items: center;
87
+ }
@@ -1,19 +1,28 @@
1
1
  import {
2
2
  Component,
3
3
  input,
4
+ output,
4
5
  ChangeDetectionStrategy,
5
6
  computed,
6
7
  ViewEncapsulation,
7
8
  inject,
9
+ viewChild,
10
+ ViewContainerRef,
8
11
  } from '@angular/core';
9
- import { DomSanitizer } from '@angular/platform-browser';
10
12
  import { InteractionContract } from '@origostudio/core';
11
- import { OrigoAdapter } from '../../../adapters/web/adapter';
13
+ import {
14
+ OrigoAdapter,
15
+ ContainerComponent as IContainerComponent,
16
+ coerceContractProps,
17
+ } from '../../../adapters/web/adapter';
12
18
  import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
13
19
 
14
20
  export interface BreadcrumbItem {
15
21
  label: string;
22
+ icon?: string;
16
23
  outcomeRef?: string;
24
+ url?: string;
25
+ disabled?: boolean;
17
26
  }
18
27
 
19
28
  export interface BreadcrumbsProps {
@@ -21,10 +30,28 @@ export interface BreadcrumbsProps {
21
30
  rules?: Record<string, unknown>;
22
31
  metadata?: Record<string, unknown>;
23
32
  items?: Array<BreadcrumbItem>;
33
+ home?: BreadcrumbItem;
34
+ separator?: string;
35
+ routerMode?: 'angular' | 'native' | 'state';
24
36
  'aria-label'?: string;
25
37
  'aria-describedby'?: string;
26
38
  }
27
39
 
40
+ export const BreadcrumbsContractSchema: Record<
41
+ keyof BreadcrumbsProps,
42
+ 'string' | 'number' | 'boolean' | 'array' | 'object'
43
+ > = {
44
+ permissions: 'object',
45
+ rules: 'object',
46
+ metadata: 'object',
47
+ items: 'array',
48
+ home: 'object',
49
+ separator: 'string',
50
+ routerMode: 'string',
51
+ 'aria-label': 'string',
52
+ 'aria-describedby': 'string',
53
+ };
54
+
28
55
  @Component({
29
56
  selector: 'origo-breadcrumbs',
30
57
  standalone: true,
@@ -40,50 +67,83 @@ export interface BreadcrumbsProps {
40
67
  role: 'navigation',
41
68
  },
42
69
  })
43
- export class BreadcrumbsComponent implements OrigoAdapter<BreadcrumbsProps> {
44
- static readonly contractSchema = {
45
- permissions: 'object',
46
- rules: 'object',
47
- metadata: 'object',
48
- items: 'array',
49
- };
70
+ export class BreadcrumbsComponent implements OrigoAdapter<BreadcrumbsProps>, IContainerComponent {
71
+ static readonly contractSchema = BreadcrumbsContractSchema;
50
72
  static readonly strictContract = false;
51
73
 
52
74
  contract = input.required<InteractionContract<BreadcrumbsProps>>();
75
+ vc = viewChild.required('vc', { read: ViewContainerRef });
76
+
77
+ itemClick = output<BreadcrumbItem>();
53
78
 
54
79
  private experienceAdapter = inject(WebExperienceAdapterService);
55
- private sanitizer = inject(DomSanitizer);
80
+
81
+ protected props = computed(() =>
82
+ coerceContractProps<BreadcrumbsProps>(this.contract().props, BreadcrumbsContractSchema)
83
+ );
56
84
 
57
85
  computedAriaLabel = computed(() => {
58
- const label = this.contract().props?.['aria-label'];
86
+ const label = this.props()['aria-label'];
59
87
  return label !== undefined && label !== null ? String(label) : 'Breadcrumbs';
60
88
  });
61
89
 
62
90
  computedAriaDescribedBy = computed(() => {
63
- const desc = this.contract().props?.['aria-describedby'];
91
+ const desc = this.props()['aria-describedby'];
64
92
  return desc !== undefined && desc !== null ? String(desc) : undefined;
65
93
  });
66
94
 
67
- computedItems = computed(() => {
68
- const items = this.contract().props?.items;
95
+ computedSeparator = computed(() => {
96
+ const sep = this.props().separator;
97
+ return typeof sep === 'string' && sep.trim().length > 0 ? sep : '/';
98
+ });
99
+
100
+ computedHome = computed<BreadcrumbItem | undefined>(() => {
101
+ const home = this.props().home;
102
+ if (!home || home.label == null) return undefined;
103
+
104
+ return {
105
+ label: String(home.label),
106
+ icon: home.icon ? String(home.icon) : undefined,
107
+ outcomeRef: home.outcomeRef ? String(home.outcomeRef) : undefined,
108
+ url: home.url ? String(home.url) : undefined,
109
+ disabled: !!home.disabled,
110
+ };
111
+ });
112
+
113
+ computedItems = computed<BreadcrumbItem[]>(() => {
114
+ const items = this.props().items;
69
115
  if (!Array.isArray(items)) return [];
70
116
 
71
117
  return items
72
118
  .filter(item => item != null && item.label != null)
73
- .map(item => {
74
- return {
75
- label: String(item.label),
76
- outcomeRef: item.outcomeRef ? String(item.outcomeRef) : undefined,
77
- };
78
- });
119
+ .map(item => ({
120
+ label: String(item.label),
121
+ icon: item.icon ? String(item.icon) : undefined,
122
+ outcomeRef: item.outcomeRef ? String(item.outcomeRef) : undefined,
123
+ url: item.url ? String(item.url) : undefined,
124
+ disabled: !!item.disabled,
125
+ }));
79
126
  });
80
127
 
81
128
  onItemClick(event: Event, item: BreadcrumbItem, isLast: boolean) {
82
- if (isLast || !item.outcomeRef) {
129
+ if (isLast || item.disabled) {
83
130
  event.preventDefault();
84
131
  return;
85
132
  }
86
133
 
87
- this.experienceAdapter.updateState(this.contract().id, 'activeOutcome', item.outcomeRef);
134
+ if (!item.url) {
135
+ event.preventDefault();
136
+ }
137
+
138
+ if (item.outcomeRef) {
139
+ this.experienceAdapter.updateState(this.contract().id, 'activeOutcome', item.outcomeRef);
140
+ }
141
+
142
+ const contractId = this.contract().id;
143
+ if (contractId) {
144
+ this.experienceAdapter.dispatchCapability(contractId, 'itemClick', item);
145
+ }
146
+
147
+ this.itemClick.emit(item);
88
148
  }
89
149
  }
@@ -0,0 +1,95 @@
1
+ <nav
2
+ class="origo-pagination__nav"
3
+ role="navigation"
4
+ [attr.aria-label]="computedAriaLabel()"
5
+ [attr.aria-describedby]="computedAriaDescribedBy()"
6
+ >
7
+ @if (computedShowFirstLastIcon()) {
8
+ <button
9
+ type="button"
10
+ class="origo-pagination__button origo-pagination__button--first"
11
+ [disabled]="computedDisabled() || isFirstPage()"
12
+ [attr.aria-disabled]="computedDisabled() || isFirstPage()"
13
+ aria-label="First Page"
14
+ (click)="onFirst()"
15
+ >
16
+ «
17
+ </button>
18
+ }
19
+
20
+ <button
21
+ type="button"
22
+ class="origo-pagination__button origo-pagination__button--prev"
23
+ [disabled]="computedDisabled() || isFirstPage()"
24
+ [attr.aria-disabled]="computedDisabled() || isFirstPage()"
25
+ aria-label="Previous Page"
26
+ (click)="onPrevious()"
27
+ >
28
+ ‹
29
+ </button>
30
+
31
+ @if (computedShowPageLinks()) {
32
+ <div class="origo-pagination__pages" role="group" aria-label="Page selection">
33
+ @for (p of visiblePageLinks(); track p) {
34
+ <button
35
+ type="button"
36
+ class="origo-pagination__button origo-pagination__page"
37
+ [class.origo-pagination__page--active]="p === pageIndex()"
38
+ [attr.aria-current]="p === pageIndex() ? 'page' : null"
39
+ [attr.aria-label]="'Page ' + (p + 1)"
40
+ [disabled]="computedDisabled()"
41
+ (click)="onPageSelect(p)"
42
+ >
43
+ {{ p + 1 }}
44
+ </button>
45
+ }
46
+ </div>
47
+ }
48
+
49
+ <button
50
+ type="button"
51
+ class="origo-pagination__button origo-pagination__button--next"
52
+ [disabled]="computedDisabled() || isLastPage()"
53
+ [attr.aria-disabled]="computedDisabled() || isLastPage()"
54
+ aria-label="Next Page"
55
+ (click)="onNext()"
56
+ >
57
+ ›
58
+ </button>
59
+
60
+ @if (computedShowFirstLastIcon()) {
61
+ <button
62
+ type="button"
63
+ class="origo-pagination__button origo-pagination__button--last"
64
+ [disabled]="computedDisabled() || isLastPage()"
65
+ [attr.aria-disabled]="computedDisabled() || isLastPage()"
66
+ aria-label="Last Page"
67
+ (click)="onLast()"
68
+ >
69
+ »
70
+ </button>
71
+ }
72
+
73
+ @if (computedRowsPerPageOptions().length > 0) {
74
+ <div class="origo-pagination__rows-container">
75
+ <label class="origo-pagination__rows-label" [attr.for]="'rows-select-' + contract().id">
76
+ Rows:
77
+ </label>
78
+ <select
79
+ [id]="'rows-select-' + contract().id"
80
+ class="origo-pagination__rows-select"
81
+ [disabled]="computedDisabled()"
82
+ [attr.aria-label]="'Rows per page'"
83
+ (change)="onRowsSelect($event)"
84
+ >
85
+ @for (opt of computedRowsPerPageOptions(); track opt) {
86
+ <option [value]="opt" [selected]="opt === computedRows()">
87
+ {{ opt }}
88
+ </option>
89
+ }
90
+ </select>
91
+ </div>
92
+ }
93
+
94
+ <ng-container #vc></ng-container>
95
+ </nav>
@@ -0,0 +1,109 @@
1
+ :host {
2
+ display: block;
3
+ box-sizing: border-box;
4
+
5
+ *,
6
+ *::before,
7
+ *::after {
8
+ box-sizing: inherit;
9
+ }
10
+ }
11
+
12
+ :host([hidden]) {
13
+ display: none !important;
14
+ }
15
+
16
+ .origo-pagination__nav {
17
+ display: flex;
18
+ flex-wrap: wrap;
19
+ align-items: center;
20
+ gap: var(--origo-spacing-xs);
21
+ padding-block: var(--origo-spacing-sm);
22
+ padding-inline: var(--origo-spacing-sm);
23
+ font-family: var(--origo-typography-body-font-family);
24
+ font-size: var(--origo-typography-button-font-size);
25
+ color: var(--origo-color-text-primary);
26
+ }
27
+
28
+ .origo-pagination__pages {
29
+ display: inline-flex;
30
+ align-items: center;
31
+ gap: var(--origo-spacing-xs);
32
+ }
33
+
34
+ .origo-pagination__button {
35
+ display: inline-flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ min-inline-size: var(--origo-spacing-xl);
39
+ min-block-size: var(--origo-spacing-xl);
40
+ padding-inline: var(--origo-spacing-xs);
41
+ padding-block: var(--origo-spacing-xs);
42
+ background-color: var(--origo-color-surface-default);
43
+ border: var(--origo-border-width-default) solid var(--origo-color-border-default);
44
+ border-radius: var(--origo-radius-sm);
45
+ color: var(--origo-color-text-primary);
46
+ font-family: inherit;
47
+ font-size: inherit;
48
+ cursor: pointer;
49
+ transition: all var(--origo-duration-fast) ease;
50
+
51
+ &:hover:not(:disabled) {
52
+ background-color: var(--origo-color-surface-subtle);
53
+ border-color: var(--origo-color-border-hover);
54
+ }
55
+
56
+ &:focus-visible {
57
+ outline: var(--origo-border-width-thick) solid var(--origo-color-focus);
58
+ outline-offset: 2px;
59
+ }
60
+
61
+ &:disabled {
62
+ cursor: not-allowed;
63
+ opacity: var(--origo-opacity-disabled);
64
+ color: var(--origo-color-text-disabled);
65
+ background-color: var(--origo-color-surface-disabled);
66
+ }
67
+
68
+ &.origo-pagination__page--active {
69
+ background-color: var(--origo-color-surface-primary);
70
+ border-color: var(--origo-color-surface-primary);
71
+ color: var(--origo-color-text-inverse);
72
+ font-weight: 600;
73
+ }
74
+ }
75
+
76
+ .origo-pagination__rows-container {
77
+ display: inline-flex;
78
+ align-items: center;
79
+ gap: var(--origo-spacing-xs);
80
+ margin-inline-start: var(--origo-spacing-md);
81
+ }
82
+
83
+ .origo-pagination__rows-label {
84
+ font-size: var(--origo-typography-button-font-size);
85
+ color: var(--origo-color-text-muted);
86
+ }
87
+
88
+ .origo-pagination__rows-select {
89
+ padding-inline: var(--origo-spacing-sm);
90
+ padding-block: var(--origo-spacing-xs);
91
+ border: var(--origo-border-width-default) solid var(--origo-color-border-default);
92
+ border-radius: var(--origo-radius-sm);
93
+ background-color: var(--origo-color-surface-default);
94
+ color: var(--origo-color-text-primary);
95
+ font-family: inherit;
96
+ font-size: inherit;
97
+ cursor: pointer;
98
+
99
+ &:focus-visible {
100
+ outline: var(--origo-border-width-thick) solid var(--origo-color-focus);
101
+ outline-offset: 2px;
102
+ }
103
+
104
+ &:disabled {
105
+ cursor: not-allowed;
106
+ opacity: var(--origo-opacity-disabled);
107
+ background-color: var(--origo-color-surface-disabled);
108
+ }
109
+ }