@origostudio/origo-design 0.0.47 → 0.0.49

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 (158) hide show
  1. package/CHANGELOG.md +4 -2
  2. package/apply-fixes.js +18 -0
  3. package/dist/packages/angular-renderer/CHANGELOG.md +22 -0
  4. package/dist/packages/angular-renderer/package.json +3 -3
  5. package/dist/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.d.ts +6 -0
  6. package/dist/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.js +3 -0
  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/button/button.component.d.ts +26 -0
  9. package/dist/packages/angular-renderer/src/components/primitives/button/button.component.js +29 -3
  10. package/dist/packages/angular-renderer/src/components/primitives/button/button.component.js.map +1 -1
  11. package/dist/packages/angular-renderer/src/components/primitives/button-group/button-group.component.d.ts +29 -0
  12. package/dist/packages/angular-renderer/src/components/primitives/button-group/button-group.component.js +76 -0
  13. package/dist/packages/angular-renderer/src/components/primitives/button-group/button-group.component.js.map +1 -0
  14. package/dist/packages/angular-renderer/src/components/primitives/card/card.component.d.ts +6 -0
  15. package/dist/packages/angular-renderer/src/components/primitives/card/card.component.js +3 -0
  16. package/dist/packages/angular-renderer/src/components/primitives/card/card.component.js.map +1 -1
  17. package/dist/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.d.ts +15 -0
  18. package/dist/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.js +9 -0
  19. package/dist/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.js.map +1 -1
  20. package/dist/packages/angular-renderer/src/components/primitives/chip/chip.component.d.ts +3 -0
  21. package/dist/packages/angular-renderer/src/components/primitives/chip/chip.component.js.map +1 -1
  22. package/dist/packages/angular-renderer/src/components/primitives/data-grid/data-grid.component.d.ts +6 -0
  23. package/dist/packages/angular-renderer/src/components/primitives/data-grid/data-grid.component.js +3 -0
  24. package/dist/packages/angular-renderer/src/components/primitives/data-grid/data-grid.component.js.map +1 -1
  25. package/dist/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.d.ts +41 -0
  26. package/dist/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.js +87 -0
  27. package/dist/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.js.map +1 -0
  28. package/dist/packages/angular-renderer/src/components/primitives/form-field/form-field.component.d.ts +6 -0
  29. package/dist/packages/angular-renderer/src/components/primitives/form-field/form-field.component.js +3 -0
  30. package/dist/packages/angular-renderer/src/components/primitives/form-field/form-field.component.js.map +1 -1
  31. package/dist/packages/angular-renderer/src/components/primitives/hbox/hbox.component.d.ts +6 -0
  32. package/dist/packages/angular-renderer/src/components/primitives/hbox/hbox.component.js +3 -0
  33. package/dist/packages/angular-renderer/src/components/primitives/hbox/hbox.component.js.map +1 -1
  34. package/dist/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.d.ts +44 -0
  35. package/dist/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.js +93 -0
  36. package/dist/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.js.map +1 -0
  37. package/dist/packages/angular-renderer/src/components/primitives/input-number/input-number.component.d.ts +46 -0
  38. package/dist/packages/angular-renderer/src/components/primitives/input-number/input-number.component.js +120 -0
  39. package/dist/packages/angular-renderer/src/components/primitives/input-number/input-number.component.js.map +1 -0
  40. package/dist/packages/angular-renderer/src/components/primitives/label/label.component.d.ts +6 -0
  41. package/dist/packages/angular-renderer/src/components/primitives/label/label.component.js +3 -0
  42. package/dist/packages/angular-renderer/src/components/primitives/label/label.component.js.map +1 -1
  43. package/dist/packages/angular-renderer/src/components/primitives/list/list.component.d.ts +6 -0
  44. package/dist/packages/angular-renderer/src/components/primitives/list/list.component.js +3 -0
  45. package/dist/packages/angular-renderer/src/components/primitives/list/list.component.js.map +1 -1
  46. package/dist/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.d.ts +15 -0
  47. package/dist/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.js +9 -0
  48. package/dist/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.js.map +1 -1
  49. package/dist/packages/angular-renderer/src/components/primitives/select/select.component.d.ts +6 -0
  50. package/dist/packages/angular-renderer/src/components/primitives/select/select.component.js +3 -0
  51. package/dist/packages/angular-renderer/src/components/primitives/select/select.component.js.map +1 -1
  52. package/dist/packages/angular-renderer/src/components/primitives/sidebar/sidebar.component.d.ts +6 -0
  53. package/dist/packages/angular-renderer/src/components/primitives/sidebar/sidebar.component.js +3 -0
  54. package/dist/packages/angular-renderer/src/components/primitives/sidebar/sidebar.component.js.map +1 -1
  55. package/dist/packages/angular-renderer/src/components/primitives/switch/switch.component.d.ts +9 -0
  56. package/dist/packages/angular-renderer/src/components/primitives/switch/switch.component.js +6 -0
  57. package/dist/packages/angular-renderer/src/components/primitives/switch/switch.component.js.map +1 -1
  58. package/dist/packages/angular-renderer/src/components/primitives/tabs/tabs.component.d.ts +6 -0
  59. package/dist/packages/angular-renderer/src/components/primitives/tabs/tabs.component.js +3 -0
  60. package/dist/packages/angular-renderer/src/components/primitives/tabs/tabs.component.js.map +1 -1
  61. package/dist/packages/angular-renderer/src/components/primitives/text-input/text-input.component.d.ts +28 -0
  62. package/dist/packages/angular-renderer/src/components/primitives/text-input/text-input.component.js +38 -2
  63. package/dist/packages/angular-renderer/src/components/primitives/text-input/text-input.component.js.map +1 -1
  64. package/dist/packages/angular-renderer/src/components/primitives/textarea/textarea.component.d.ts +26 -0
  65. package/dist/packages/angular-renderer/src/components/primitives/textarea/textarea.component.js +44 -0
  66. package/dist/packages/angular-renderer/src/components/primitives/textarea/textarea.component.js.map +1 -1
  67. package/dist/packages/angular-renderer/src/components/primitives/vbox/vbox.component.d.ts +6 -0
  68. package/dist/packages/angular-renderer/src/components/primitives/vbox/vbox.component.js +3 -0
  69. package/dist/packages/angular-renderer/src/components/primitives/vbox/vbox.component.js.map +1 -1
  70. package/dist/packages/angular-renderer/src/index.d.ts +4 -0
  71. package/dist/packages/angular-renderer/src/index.js +4 -0
  72. package/dist/packages/angular-renderer/src/index.js.map +1 -1
  73. package/dist/packages/angular-renderer/src/lib/primitives.provider.js +8 -0
  74. package/dist/packages/angular-renderer/src/lib/primitives.provider.js.map +1 -1
  75. package/dist/packages/cli/CHANGELOG.md +8 -0
  76. package/dist/packages/cli/package.json +2 -2
  77. package/dist/packages/cli/package.json.bak +2 -2
  78. package/dist/packages/core/CHANGELOG.md +8 -0
  79. package/dist/packages/core/package.json +1 -1
  80. package/dist/packages/core/package.json.bak +1 -1
  81. package/dist/packages/design-tokens/CHANGELOG.md +8 -0
  82. package/dist/packages/design-tokens/package.json +1 -1
  83. package/dist/packages/playground/browser/{chunk-DOh0X2ps.js → chunk-B8mwHWgW.js} +1 -1
  84. package/dist/packages/playground/browser/{chunk-M-QQ6mOa.js → chunk-B_swdRuc.js} +1 -1
  85. package/dist/packages/playground/browser/{chunk-KjK48aB_.js → chunk-BbeNQQ9Z.js} +1 -1
  86. package/dist/packages/playground/browser/{chunk-D8NS9RS7.js → chunk-BlCRDoSd.js} +1 -1
  87. package/dist/packages/playground/browser/{chunk-CoC5zYQK.js → chunk-C8l8Pst_.js} +1 -1
  88. package/dist/packages/playground/browser/{chunk-hQe37O_T.js → chunk-CCE_vAje.js} +1 -1
  89. package/dist/packages/playground/browser/{chunk-7aXhMYht.js → chunk-Cb2ALrKC.js} +1 -1
  90. package/dist/packages/playground/browser/{chunk-NvAbwArG.js → chunk-CpaI4VGh.js} +1 -1
  91. package/dist/packages/playground/browser/{chunk-Ds2pJNq1.js → chunk-DgLZ-dIi.js} +1 -1
  92. package/dist/packages/playground/browser/{chunk-Bnpjwr-7.js → chunk-DkxgAarv.js} +1 -1
  93. package/dist/packages/playground/browser/{chunk-Vi7LKue9.js → chunk-DoYDPF2-.js} +1 -1
  94. package/dist/packages/playground/browser/{chunk-DQXI3hQ7.js → chunk-G1sQXMvG.js} +1 -1
  95. package/dist/packages/playground/browser/{chunk-D8xCSUn8.js → chunk-XTbjIUbx.js} +1 -1
  96. package/dist/packages/playground/browser/{chunk-pi5vOCVu.js → chunk-lFsGUZ3A.js} +1 -1
  97. package/dist/packages/playground/browser/{chunk-iW-WwSbU.js → chunk-r4-UbXQJ.js} +1 -1
  98. package/dist/packages/playground/browser/index.html +1 -1
  99. package/dist/packages/playground/browser/main-D2PNGI4C.js +734 -0
  100. package/package.json +1 -1
  101. package/packages/angular-renderer/CHANGELOG.md +22 -0
  102. package/packages/angular-renderer/package.json +3 -3
  103. package/packages/angular-renderer/src/components/primitives/breadcrumbs/breadcrumbs.component.ts +6 -0
  104. package/packages/angular-renderer/src/components/primitives/button/button.component.html +16 -1
  105. package/packages/angular-renderer/src/components/primitives/button/button.component.ts +42 -3
  106. package/packages/angular-renderer/src/components/primitives/button-group/button-group.component.html +8 -0
  107. package/packages/angular-renderer/src/components/primitives/button-group/button-group.component.scss +18 -0
  108. package/packages/angular-renderer/src/components/primitives/button-group/button-group.component.ts +77 -0
  109. package/packages/angular-renderer/src/components/primitives/card/card.component.ts +6 -0
  110. package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.html +24 -15
  111. package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.scss +25 -9
  112. package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.ts +16 -0
  113. package/packages/angular-renderer/src/components/primitives/chip/chip.component.ts +3 -0
  114. package/packages/angular-renderer/src/components/primitives/data-grid/data-grid.component.ts +6 -0
  115. package/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.html +18 -0
  116. package/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.scss +47 -0
  117. package/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.ts +95 -0
  118. package/packages/angular-renderer/src/components/primitives/form-field/form-field.component.ts +6 -0
  119. package/packages/angular-renderer/src/components/primitives/hbox/hbox.component.ts +6 -0
  120. package/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.html +18 -0
  121. package/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.scss +34 -0
  122. package/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.ts +103 -0
  123. package/packages/angular-renderer/src/components/primitives/input-number/input-number.component.html +24 -0
  124. package/packages/angular-renderer/src/components/primitives/input-number/input-number.component.scss +80 -0
  125. package/packages/angular-renderer/src/components/primitives/input-number/input-number.component.ts +146 -0
  126. package/packages/angular-renderer/src/components/primitives/label/label.component.ts +6 -0
  127. package/packages/angular-renderer/src/components/primitives/list/list.component.ts +6 -0
  128. package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.html +11 -1
  129. package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.scss +20 -9
  130. package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.ts +16 -0
  131. package/packages/angular-renderer/src/components/primitives/select/select.component.ts +6 -0
  132. package/packages/angular-renderer/src/components/primitives/sidebar/sidebar.component.ts +6 -0
  133. package/packages/angular-renderer/src/components/primitives/switch/switch.component.html +24 -15
  134. package/packages/angular-renderer/src/components/primitives/switch/switch.component.scss +40 -22
  135. package/packages/angular-renderer/src/components/primitives/switch/switch.component.ts +13 -0
  136. package/packages/angular-renderer/src/components/primitives/tabs/tabs.component.ts +6 -0
  137. package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.html +21 -10
  138. package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.scss +44 -18
  139. package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.ts +48 -2
  140. package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.html +22 -12
  141. package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.scss +61 -23
  142. package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.ts +58 -0
  143. package/packages/angular-renderer/src/components/primitives/vbox/vbox.component.ts +6 -0
  144. package/packages/angular-renderer/src/index.ts +4 -0
  145. package/packages/angular-renderer/src/lib/primitives.provider.ts +8 -0
  146. package/packages/cli/CHANGELOG.md +8 -0
  147. package/packages/cli/package.json +2 -2
  148. package/packages/core/CHANGELOG.md +8 -0
  149. package/packages/core/package.json +1 -1
  150. package/packages/design-tokens/CHANGELOG.md +8 -0
  151. package/packages/design-tokens/package.json +1 -1
  152. package/packages/devtools/CHANGELOG.md +8 -0
  153. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  154. package/packages/devtools/package.json +3 -3
  155. package/packages/playground/CHANGELOG.md +8 -0
  156. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  157. package/packages/playground/package.json +3 -3
  158. package/dist/packages/playground/browser/main-HYTU6AQS.js +0 -731
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/origo-design",
3
- "version": "0.0.47",
3
+ "version": "0.0.49",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,3 +1,25 @@
1
+ ## 0.0.49 (2026-10-08)
2
+
3
+ ### 🚀 Features
4
+
5
+ - add angular renderer primitives and component implementations ([e751643](https://github.com/OrigoStudio/origo-design/commit/e751643))
6
+ - add primitive components and corresponding test suites for angular-renderer package ([d02c3d1](https://github.com/OrigoStudio/origo-design/commit/d02c3d1))
7
+
8
+ ### ❤️ Thank You
9
+
10
+ - Hardik Patel @hardikpatelse
11
+
12
+ ## 0.0.48 (2026-10-07)
13
+
14
+ ### 🚀 Features
15
+
16
+ - add core primitives, buttons, and review artifacts for Angular renderer ([f0cbc46](https://github.com/OrigoStudio/origo-design/commit/f0cbc46))
17
+ - add core button and action primitive components to angular-renderer ([2f7d926](https://github.com/OrigoStudio/origo-design/commit/2f7d926))
18
+
19
+ ### ❤️ Thank You
20
+
21
+ - Hardik Patel @hardikpatelse
22
+
1
23
  ## 0.0.47 (2026-10-07)
2
24
 
3
25
  This was a version bump only for angular-renderer to align it with other projects, there were no code changes.
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@origostudio/angular-renderer",
3
- "version": "0.0.47",
3
+ "version": "0.0.49",
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.47",
10
- "@origostudio/design-tokens": "0.0.47",
9
+ "@origostudio/core": "0.0.49",
10
+ "@origostudio/design-tokens": "0.0.49",
11
11
  "tslib": "^2.3.0",
12
12
  "@analogjs/vite-plugin-angular": "^2.7.1",
13
13
  "zone.js": "^0.16.3",
@@ -17,6 +17,9 @@ export interface BreadcrumbItem {
17
17
  }
18
18
 
19
19
  export interface BreadcrumbsProps {
20
+ permissions?: Record<string, string>;
21
+ rules?: Record<string, unknown>;
22
+ metadata?: Record<string, unknown>;
20
23
  items?: Array<BreadcrumbItem>;
21
24
  'aria-label'?: string;
22
25
  'aria-describedby'?: string;
@@ -39,6 +42,9 @@ export interface BreadcrumbsProps {
39
42
  })
40
43
  export class BreadcrumbsComponent implements OrigoAdapter<BreadcrumbsProps> {
41
44
  static readonly contractSchema = {
45
+ permissions: 'object',
46
+ rules: 'object',
47
+ metadata: 'object',
42
48
  items: 'array',
43
49
  };
44
50
  static readonly strictContract = false;
@@ -3,7 +3,22 @@
3
3
  [disabled]="computedDisabled()"
4
4
  [attr.aria-label]="computedAriaLabel()"
5
5
  [attr.aria-describedby]="computedAriaDescribedBy()"
6
+ [attr.aria-busy]="computedLoading() ? 'true' : null"
6
7
  (click)="onClick()"
7
8
  >
8
- {{ computedLabel() }}
9
+ @if (computedLoading()) {
10
+ <span class="origo-spinner"></span>
11
+ }
12
+ @if (computedIcon() && computedIconPosition() !== 'right') {
13
+ <span [class]="'origo-icon origo-icon-' + computedIcon()"></span>
14
+ }
15
+ <span class="origo-button-label">{{ computedLabel() }}</span>
16
+ @if (computedBadge()) {
17
+ <span [class]="'origo-badge origo-badge-' + computedBadgeSeverity()">{{
18
+ computedBadge()
19
+ }}</span>
20
+ }
21
+ @if (computedIcon() && computedIconPosition() === 'right') {
22
+ <span [class]="'origo-icon origo-icon-' + computedIcon()"></span>
23
+ }
9
24
  </button>
@@ -12,11 +12,21 @@ import { OrigoAdapter } from '../../../adapters/web/adapter';
12
12
  import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
13
13
 
14
14
  export interface ButtonProps {
15
+ permissions?: Record<string, string>;
16
+ rules?: Record<string, unknown>;
17
+ metadata?: Record<string, unknown>;
15
18
  label?: string;
16
19
  disabled?: boolean;
17
20
  type?: 'button' | 'submit' | 'reset';
18
21
  'aria-label'?: string;
19
22
  'aria-describedby'?: string;
23
+ loading?: boolean;
24
+ severity?: string;
25
+ variant?: string;
26
+ icon?: string;
27
+ iconPosition?: string;
28
+ badge?: string;
29
+ badgeSeverity?: string;
20
30
  }
21
31
 
22
32
  @Component({
@@ -27,22 +37,51 @@ export interface ButtonProps {
27
37
  changeDetection: ChangeDetectionStrategy.OnPush,
28
38
  encapsulation: ViewEncapsulation.ShadowDom,
29
39
  host: {
30
- '[class.origo-button]': 'true',
40
+ '[class]': 'computedHostClasses()',
31
41
  '[attr.data-testid]': 'contract().id ?? ""',
32
42
  },
33
43
  })
34
44
  export class ButtonComponent implements OrigoAdapter<ButtonProps> {
35
45
  static readonly contractSchema = {
46
+ permissions: 'object',
47
+ rules: 'object',
48
+ metadata: 'object',
36
49
  label: 'string',
37
50
  disabled: 'boolean',
38
51
  type: 'string',
52
+ loading: 'boolean',
53
+ severity: 'string',
54
+ variant: 'string',
55
+ icon: 'string',
56
+ iconPosition: 'string',
57
+ badge: 'string',
58
+ badgeSeverity: 'string',
39
59
  };
40
60
  static readonly strictContract = false;
41
61
 
42
62
  contract = input.required<InteractionContract<ButtonProps>>();
43
63
 
44
64
  computedLabel = computed(() => this.contract().props?.label ?? 'Button');
45
- computedDisabled = computed(() => !!this.contract().props?.disabled);
65
+ computedLoading = computed(() => !!this.contract().props?.loading);
66
+ computedDisabled = computed(() => {
67
+ const props = this.contract().props;
68
+ const rulesDisable =
69
+ props?.rules?.['disable'] === true || props?.permissions?.['allow'] === 'false';
70
+ return !!props?.disabled || this.computedLoading() || rulesDisable;
71
+ });
72
+
73
+ computedIcon = computed(() => this.contract().props?.icon);
74
+ computedIconPosition = computed(() => this.contract().props?.iconPosition ?? 'left');
75
+ computedBadge = computed(() => this.contract().props?.badge);
76
+ computedBadgeSeverity = computed(() => this.contract().props?.badgeSeverity ?? 'info');
77
+
78
+ computedHostClasses = computed(() => {
79
+ const s = this.contract().props?.severity;
80
+ const v = this.contract().props?.variant;
81
+ return ['origo-button', s ? `origo-severity-${s}` : '', v ? `origo-variant-${v}` : '']
82
+ .filter(Boolean)
83
+ .join(' ');
84
+ });
46
85
  computedType = computed(() => {
47
86
  const type = this.contract().props?.type;
48
87
  return type === 'button' || type === 'submit' || type === 'reset' ? type : 'button';
@@ -65,7 +104,7 @@ export class ButtonComponent implements OrigoAdapter<ButtonProps> {
65
104
  private experienceAdapter = inject(WebExperienceAdapterService);
66
105
 
67
106
  onClick() {
68
- if (this.computedDisabled()) return;
107
+ if (this.computedDisabled() || this.computedLoading()) return;
69
108
 
70
109
  const id = this.contract().id;
71
110
  if (!id) return;
@@ -0,0 +1,8 @@
1
+ <div
2
+ class="origo-button-group-content"
3
+ role="group"
4
+ [attr.aria-label]="computedAriaLabel()"
5
+ [attr.aria-describedby]="computedAriaDescribedBy()"
6
+ >
7
+ <ng-content></ng-content>
8
+ </div>
@@ -0,0 +1,18 @@
1
+ :host {
2
+ display: inline-flex;
3
+ }
4
+ .origo-button-group-content {
5
+ display: flex;
6
+ flex-direction: row;
7
+ gap: var(--origo-spacing-container-padding);
8
+ }
9
+ :host(.origo-orientation-column) .origo-button-group-content {
10
+ flex-direction: column;
11
+ }
12
+ :host(.origo-attached) .origo-button-group-content {
13
+ gap: 0;
14
+ }
15
+ /* Note: attached styling across shadow DOM requires passing CSS custom properties to children, which relies on children consuming them. */
16
+ :host(.origo-attached) {
17
+ --origo-button-radius: 0;
18
+ }
@@ -0,0 +1,77 @@
1
+ import {
2
+ Component,
3
+ input,
4
+ ChangeDetectionStrategy,
5
+ computed,
6
+ ViewEncapsulation,
7
+ } from '@angular/core';
8
+ import { InteractionContract } from '@origostudio/core';
9
+ import { OrigoAdapter } from '../../../adapters/web/adapter';
10
+
11
+ export interface ButtonGroupProps {
12
+ permissions?: Record<string, string>;
13
+ rules?: Record<string, unknown>;
14
+ metadata?: Record<string, unknown>;
15
+ orientation?: 'row' | 'column';
16
+ attached?: boolean;
17
+ size?: 'small' | 'medium' | 'large';
18
+ 'aria-label'?: string;
19
+ 'aria-describedby'?: string;
20
+ }
21
+
22
+ @Component({
23
+ selector: 'origo-button-group',
24
+ standalone: true,
25
+ templateUrl: './button-group.component.html',
26
+ styleUrls: ['./button-group.component.scss'],
27
+ changeDetection: ChangeDetectionStrategy.OnPush,
28
+ encapsulation: ViewEncapsulation.ShadowDom,
29
+ host: {
30
+ '[class]': 'computedHostClasses()',
31
+ '[attr.data-testid]': 'contract().id ?? ""',
32
+ },
33
+ })
34
+ export class ButtonGroupComponent implements OrigoAdapter<ButtonGroupProps> {
35
+ static readonly contractSchema = {
36
+ permissions: 'object',
37
+ rules: 'object',
38
+ metadata: 'object',
39
+ orientation: 'string',
40
+ attached: 'boolean',
41
+ size: 'string',
42
+ 'aria-label': 'string',
43
+ 'aria-describedby': 'string',
44
+ };
45
+ static readonly strictContract = false;
46
+
47
+ contract = input.required<InteractionContract<ButtonGroupProps>>();
48
+
49
+ computedHostClasses = computed(() => {
50
+ const rawO = this.contract().props?.orientation;
51
+ const o = rawO === 'column' ? 'column' : 'row';
52
+ const attached = this.contract().props?.attached;
53
+ const rawSize = this.contract().props?.size;
54
+ const size = ['small', 'medium', 'large'].includes(rawSize as string) ? rawSize : undefined;
55
+ return [
56
+ 'origo-button-group',
57
+ `origo-orientation-${o}`,
58
+ attached ? 'origo-attached' : '',
59
+ size ? `origo-size-${size}` : '',
60
+ ]
61
+ .filter(Boolean)
62
+ .join(' ');
63
+ });
64
+
65
+ computedAriaLabel = computed(() => {
66
+ const label = this.contract().props?.['aria-label'];
67
+ return label !== undefined && label !== null && String(label).trim() !== ''
68
+ ? String(label)
69
+ : undefined;
70
+ });
71
+ computedAriaDescribedBy = computed(() => {
72
+ const desc = this.contract().props?.['aria-describedby'];
73
+ return desc !== undefined && desc !== null && String(desc).trim() !== ''
74
+ ? String(desc)
75
+ : undefined;
76
+ });
77
+ }
@@ -12,6 +12,9 @@ import { InteractionContract } from '@origostudio/core';
12
12
  import { OrigoAdapter } from '../../../adapters/web/adapter';
13
13
 
14
14
  export interface CardProps {
15
+ permissions?: Record<string, string>;
16
+ rules?: Record<string, unknown>;
17
+ metadata?: Record<string, unknown>;
15
18
  title?: string;
16
19
  subtitle?: string;
17
20
  imageUrl?: string;
@@ -36,6 +39,9 @@ export interface CardProps {
36
39
  })
37
40
  export class CardComponent implements OrigoAdapter<CardProps> {
38
41
  static readonly contractSchema = {
42
+ permissions: 'object',
43
+ rules: 'object',
44
+ metadata: 'object',
39
45
  title: 'string',
40
46
  subtitle: 'string',
41
47
  imageUrl: 'string',
@@ -1,16 +1,25 @@
1
- <label [for]="contract().id" [class.disabled]="computedDisabled()">
2
- <input
3
- type="checkbox"
4
- [id]="contract().id"
5
- [disabled]="computedDisabled()"
6
- [required]="computedRequired()"
7
- [attr.aria-label]="computedAriaLabel()"
8
- [attr.aria-describedby]="computedAriaDescribedBy()"
9
- (change)="onChange($event)"
10
- [checked]="checked()"
11
- />
12
- <span class="label-text">{{ computedLabel() }}</span>
13
- @if (computedRequired()) {
14
- <span class="required-indicator" aria-hidden="true">*</span>
1
+ <div class="origo-checkbox__wrapper">
2
+ <label [for]="contract().id" [class.disabled]="computedDisabled()">
3
+ <input
4
+ type="checkbox"
5
+ [id]="contract().id"
6
+ [disabled]="computedDisabled()"
7
+ [required]="computedRequired()"
8
+ [attr.aria-label]="computedAriaLabel()"
9
+ [attr.aria-describedby]="computedAriaDescribedBy()"
10
+ [attr.aria-invalid]="computedInvalid() ? 'true' : null"
11
+ (change)="onChange($event)"
12
+ [checked]="checked()"
13
+ />
14
+ <span class="label-text">{{ computedLabel() }}</span>
15
+ @if (computedRequired()) {
16
+ <span class="required-indicator" aria-hidden="true">*</span>
17
+ }
18
+ </label>
19
+ @if (computedErrorText()) {
20
+ <div class="origo-checkbox__error">{{ computedErrorText() }}</div>
15
21
  }
16
- </label>
22
+ @if (computedHelpText()) {
23
+ <div class="origo-checkbox__help">{{ computedHelpText() }}</div>
24
+ }
25
+ </div>
@@ -2,28 +2,33 @@
2
2
  display: block;
3
3
  }
4
4
 
5
+ .origo-checkbox__wrapper {
6
+ display: flex;
7
+ flex-direction: column;
8
+ }
9
+
5
10
  label {
6
11
  display: inline-flex;
7
12
  align-items: center;
8
- gap: var(--origo-spacing-container-padding, 8px);
13
+ gap: var(--origo-spacing-container-padding);
9
14
  cursor: pointer;
10
- font-family: var(--origo-typography-input-font-family, inherit);
11
- font-size: var(--origo-typography-input-font-size, 1rem);
12
- color: var(--origo-color-text-primary, #333);
15
+ font-family: var(--origo-typography-input-font-family);
16
+ font-size: var(--origo-typography-input-font-size);
17
+ color: var(--origo-color-text-primary);
13
18
 
14
19
  &.disabled {
15
- opacity: var(--origo-opacity-disabled, 0.5);
20
+ opacity: var(--origo-opacity-disabled);
16
21
  cursor: not-allowed;
17
22
  }
18
23
  }
19
24
 
20
25
  input[type='checkbox'] {
21
26
  margin: 0;
22
- accent-color: var(--origo-color-focus, #005fcc);
27
+ accent-color: var(--origo-color-focus);
23
28
 
24
29
  &:focus-visible {
25
- outline: 2px solid var(--origo-color-focus, #005fcc);
26
- outline-offset: 2px;
30
+ outline: var(--origo-border-width-thick) solid var(--origo-color-focus);
31
+ outline-offset: var(--origo-border-width-thick);
27
32
  }
28
33
 
29
34
  &:disabled {
@@ -32,5 +37,16 @@ input[type='checkbox'] {
32
37
  }
33
38
 
34
39
  .required-indicator {
35
- color: var(--origo-color-error, #d32f2f);
40
+ color: var(--origo-color-error);
41
+ }
42
+
43
+ .origo-checkbox__error {
44
+ color: var(--origo-color-text-danger);
45
+ font-size: var(--origo-typography-caption-font-size);
46
+ margin-top: var(--origo-spacing-xs);
47
+ }
48
+ .origo-checkbox__help {
49
+ color: var(--origo-color-text-muted);
50
+ font-size: var(--origo-typography-caption-font-size);
51
+ margin-top: var(--origo-spacing-xs);
36
52
  }
@@ -14,12 +14,18 @@ import { OrigoAdapter } from '../../../adapters/web/adapter';
14
14
  import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
15
15
 
16
16
  export interface CheckboxProps {
17
+ permissions?: Record<string, string>;
18
+ rules?: Record<string, unknown>;
19
+ metadata?: Record<string, unknown>;
17
20
  checked?: boolean;
18
21
  label?: string;
19
22
  disabled?: boolean;
20
23
  'aria-label'?: string;
21
24
  'aria-describedby'?: string;
22
25
  required?: boolean;
26
+ invalid?: boolean;
27
+ errorText?: string;
28
+ helpText?: string;
23
29
  }
24
30
 
25
31
  @Component({
@@ -36,10 +42,16 @@ export interface CheckboxProps {
36
42
  })
37
43
  export class CheckboxComponent implements OrigoAdapter<CheckboxProps> {
38
44
  static readonly contractSchema = {
45
+ permissions: 'object',
46
+ rules: 'object',
47
+ metadata: 'object',
39
48
  checked: 'boolean',
40
49
  label: 'string',
41
50
  disabled: 'boolean',
42
51
  required: 'boolean',
52
+ invalid: 'boolean',
53
+ errorText: 'string',
54
+ helpText: 'string',
43
55
  };
44
56
  static readonly strictContract = false;
45
57
 
@@ -62,6 +74,10 @@ export class CheckboxComponent implements OrigoAdapter<CheckboxProps> {
62
74
  : undefined;
63
75
  });
64
76
 
77
+ computedInvalid = computed(() => !!this.contract().props?.invalid);
78
+ computedErrorText = computed(() => this.contract().props?.errorText ?? '');
79
+ computedHelpText = computed(() => this.contract().props?.helpText ?? '');
80
+
65
81
  private experienceAdapter = inject(WebExperienceAdapterService);
66
82
 
67
83
  constructor() {
@@ -14,6 +14,9 @@ import { OrigoAdapter, coerceContractProps } from '../../../adapters/web/adapter
14
14
  import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
15
15
 
16
16
  export interface ChipProps {
17
+ permissions?: Record<string, string>;
18
+ rules?: Record<string, unknown>;
19
+ metadata?: Record<string, unknown>;
17
20
  selected?: boolean;
18
21
  label?: string;
19
22
  disabled?: boolean;
@@ -15,6 +15,9 @@ import { OrigoAdapter } from '../../../adapters/web/adapter';
15
15
  import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
16
16
 
17
17
  export interface DataGridProps {
18
+ permissions?: Record<string, string>;
19
+ rules?: Record<string, unknown>;
20
+ metadata?: Record<string, unknown>;
18
21
  columns?: Array<{ key: string; label: string; sortable?: boolean }>;
19
22
  rows?: Array<Record<string, unknown>>;
20
23
  pageSize?: number;
@@ -42,6 +45,9 @@ export interface DataGridProps {
42
45
  })
43
46
  export class DataGridComponent implements OrigoAdapter<DataGridProps> {
44
47
  static readonly contractSchema = {
48
+ permissions: 'object',
49
+ rules: 'object',
50
+ metadata: 'object',
45
51
  columns: 'array',
46
52
  rows: 'array',
47
53
  pageSize: 'number',
@@ -0,0 +1,18 @@
1
+ <button
2
+ type="button"
3
+ [disabled]="computedDisabled()"
4
+ [attr.aria-label]="computedAriaLabel()"
5
+ [attr.aria-describedby]="computedAriaDescribedBy()"
6
+ (click)="onClick()"
7
+ >
8
+ @if (computedLoading()) {
9
+ <span class="origo-spinner"></span>
10
+ } @else {
11
+ @if (computedIcon()) {
12
+ <span [class]="'origo-icon origo-icon-' + computedIcon()"></span>
13
+ }
14
+ }
15
+ @if (computedLabel()) {
16
+ <span class="origo-fab-label">{{ computedLabel() }}</span>
17
+ }
18
+ </button>
@@ -0,0 +1,47 @@
1
+ :host {
2
+ display: inline-flex;
3
+ position: fixed;
4
+ z-index: 1000;
5
+ }
6
+ :host(.origo-position-bottom-right) {
7
+ bottom: var(--origo-spacing-container-padding);
8
+ right: var(--origo-spacing-container-padding);
9
+ }
10
+ :host(.origo-position-bottom-left) {
11
+ bottom: var(--origo-spacing-container-padding);
12
+ left: var(--origo-spacing-container-padding);
13
+ }
14
+ button {
15
+ cursor: pointer;
16
+ background-color: var(--origo-color-surface-primary);
17
+ color: var(--origo-color-text-inverse);
18
+ border: none;
19
+ border-radius: var(--origo-radius-xl);
20
+ box-shadow: var(--origo-shadow-md);
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ gap: var(--origo-spacing-sm, 8px);
25
+ min-width: 48px;
26
+ min-height: 48px;
27
+ padding: 0 var(--origo-spacing-container-padding);
28
+ transition: var(--origo-transition-all);
29
+ }
30
+ button:empty {
31
+ padding: 0;
32
+ }
33
+ button:hover:not(:disabled) {
34
+ background-color: var(--origo-color-surface-primary-hover);
35
+ box-shadow: var(--origo-shadow-lg);
36
+ }
37
+ button:active:not(:disabled) {
38
+ background-color: var(--origo-color-surface-primary-active);
39
+ }
40
+ button:focus-visible {
41
+ outline: var(--origo-outline-width, 2px) solid var(--origo-color-focus);
42
+ outline-offset: var(--origo-outline-width, 2px);
43
+ }
44
+ button:disabled {
45
+ cursor: not-allowed;
46
+ opacity: var(--origo-opacity-disabled);
47
+ }
@@ -0,0 +1,95 @@
1
+ import {
2
+ Component,
3
+ input,
4
+ ChangeDetectionStrategy,
5
+ computed,
6
+ ViewEncapsulation,
7
+ inject,
8
+ } from '@angular/core';
9
+ import { InteractionContract } from '@origostudio/core';
10
+ import { OrigoAdapter } from '../../../adapters/web/adapter';
11
+ import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
12
+
13
+ export interface FabProps {
14
+ permissions?: Record<string, string>;
15
+ rules?: Record<string, unknown>;
16
+ metadata?: Record<string, unknown>;
17
+ icon?: string;
18
+ label?: string;
19
+ severity?: string;
20
+ loading?: boolean;
21
+ disabled?: boolean;
22
+ position?: 'bottom-right' | 'bottom-left';
23
+ 'aria-label'?: string;
24
+ 'aria-describedby'?: string;
25
+ }
26
+
27
+ @Component({
28
+ selector: 'origo-fab',
29
+ standalone: true,
30
+ templateUrl: './floating-action-button.component.html',
31
+ styleUrls: ['./floating-action-button.component.scss'],
32
+ changeDetection: ChangeDetectionStrategy.OnPush,
33
+ encapsulation: ViewEncapsulation.ShadowDom,
34
+ host: {
35
+ '[class]': 'computedHostClasses()',
36
+ '[attr.data-testid]': 'contract().id ?? ""',
37
+ },
38
+ })
39
+ export class FloatingActionButtonComponent implements OrigoAdapter<FabProps> {
40
+ static readonly contractSchema = {
41
+ permissions: 'object',
42
+ rules: 'object',
43
+ metadata: 'object',
44
+ icon: 'string',
45
+ label: 'string',
46
+ severity: 'string',
47
+ loading: 'boolean',
48
+ disabled: 'boolean',
49
+ position: 'string',
50
+ 'aria-label': 'string',
51
+ 'aria-describedby': 'string',
52
+ };
53
+ static readonly strictContract = false;
54
+
55
+ contract = input.required<InteractionContract<FabProps>>();
56
+
57
+ computedIcon = computed(() => this.contract().props?.icon ?? '');
58
+ computedLabel = computed(() => this.contract().props?.label ?? '');
59
+ computedLoading = computed(() => !!this.contract().props?.loading);
60
+ computedDisabled = computed(() => {
61
+ const props = this.contract().props;
62
+ const rulesDisable =
63
+ props?.rules?.['disable'] === true || props?.permissions?.['allow'] === 'false';
64
+ return !!props?.disabled || this.computedLoading() || rulesDisable;
65
+ });
66
+
67
+ computedAriaLabel = computed(() => {
68
+ const p = this.contract().props;
69
+ const v = p?.['aria-label'] || p?.label;
70
+ return v ? String(v) : undefined;
71
+ });
72
+
73
+ computedAriaDescribedBy = computed(() => {
74
+ const v = this.contract().props?.['aria-describedby'];
75
+ return v ? String(v) : undefined;
76
+ });
77
+
78
+ computedHostClasses = computed(() => {
79
+ const s = this.contract().props?.severity;
80
+ const rawP = this.contract().props?.position;
81
+ const p = ['bottom-left', 'bottom-right'].includes(rawP as string) ? rawP : 'bottom-right';
82
+ return ['origo-fab', s ? `origo-severity-${s}` : '', `origo-position-${p}`]
83
+ .filter(Boolean)
84
+ .join(' ');
85
+ });
86
+
87
+ private experienceAdapter = inject(WebExperienceAdapterService);
88
+
89
+ onClick() {
90
+ if (this.computedDisabled() || this.computedLoading()) return;
91
+ const id = this.contract().id;
92
+ if (!id) return;
93
+ this.experienceAdapter.dispatchCapability(id, 'click');
94
+ }
95
+ }
@@ -12,6 +12,9 @@ import { OrigoAdapter, ContainerComponent } from '../../../adapters/web/adapter'
12
12
  import { LabelComponent, LabelProps } from '../label/label.component';
13
13
 
14
14
  export interface FormFieldProps {
15
+ permissions?: Record<string, string>;
16
+ rules?: Record<string, unknown>;
17
+ metadata?: Record<string, unknown>;
15
18
  label?: string;
16
19
  error?: string;
17
20
  hint?: string;
@@ -39,6 +42,9 @@ export interface FormFieldProps {
39
42
  })
40
43
  export class FormFieldComponent implements OrigoAdapter<FormFieldProps>, ContainerComponent {
41
44
  static readonly contractSchema = {
45
+ permissions: 'object',
46
+ rules: 'object',
47
+ metadata: 'object',
42
48
  label: 'string',
43
49
  error: 'string',
44
50
  hint: 'string',