@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
@@ -2,65 +2,83 @@
2
2
  display: inline-block;
3
3
  }
4
4
 
5
+ .origo-switch__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, #333333);
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'][role='switch'] {
21
26
  appearance: none;
22
- width: var(--origo-switch-track-width, 40px);
23
- height: var(--origo-switch-track-height, 22px);
24
- background-color: var(--origo-color-surface-variant, #e0e0e0);
25
- border-radius: var(--origo-radius-switch-track, 11px);
27
+ width: var(--origo-switch-track-width);
28
+ height: var(--origo-switch-track-height);
29
+ background-color: var(--origo-color-surface-variant);
30
+ border-radius: var(--origo-radius-switch-track);
26
31
  position: relative;
27
32
  outline: none;
28
33
  cursor: pointer;
29
34
  margin: 0;
30
- transition: background-color 0.2s ease-in-out;
35
+ transition: background-color var(--origo-duration-fast) ease-in-out;
31
36
 
32
37
  &:hover:not(:disabled) {
33
- background-color: var(--origo-color-surface-variant-hover, #d0d0d0);
38
+ background-color: var(--origo-color-surface-variant-hover);
34
39
  }
35
40
 
36
41
  &::after {
37
42
  content: '';
38
43
  position: absolute;
39
- top: 2px;
40
- inset-inline-start: 2px;
41
- width: var(--origo-switch-thumb-size, 18px);
42
- height: var(--origo-switch-thumb-size, 18px);
43
- background-color: var(--origo-color-on-accent, #ffffff);
44
+ top: var(--origo-border-width-md);
45
+ inset-inline-start: var(--origo-border-width-md);
46
+ width: var(--origo-switch-thumb-size);
47
+ height: var(--origo-switch-thumb-size);
48
+ background-color: var(--origo-color-on-accent);
44
49
  border-radius: 50%;
45
50
  transition:
46
- inset-inline-start 0.2s ease-in-out,
47
- transform 0.2s ease-in-out;
51
+ inset-inline-start var(--origo-duration-fast) ease-in-out,
52
+ transform var(--origo-duration-fast) ease-in-out;
48
53
  }
49
54
 
50
55
  &:checked {
51
- background-color: var(--origo-color-accent, var(--origo-color-primary, #005fcc));
56
+ background-color: var(--origo-color-accent);
52
57
 
53
58
  &::after {
54
- inset-inline-start: calc(100% - var(--origo-switch-thumb-size, 18px) - 2px);
59
+ inset-inline-start: calc(
60
+ 100% - var(--origo-switch-thumb-size) - var(--origo-border-width-md)
61
+ );
55
62
  }
56
63
  }
57
64
 
58
65
  &:focus-visible {
59
- outline: 2px solid var(--origo-color-focus, #005fcc);
60
- outline-offset: 2px;
66
+ outline: var(--origo-border-width-thick) solid var(--origo-color-focus);
67
+ outline-offset: var(--origo-border-width-thick);
61
68
  }
62
69
 
63
70
  &:disabled {
64
71
  cursor: not-allowed;
65
72
  }
66
73
  }
74
+
75
+ .origo-switch__error {
76
+ color: var(--origo-color-text-danger);
77
+ font-size: var(--origo-typography-caption-font-size);
78
+ margin-top: var(--origo-spacing-xs);
79
+ }
80
+ .origo-switch__help {
81
+ color: var(--origo-color-text-muted);
82
+ font-size: var(--origo-typography-caption-font-size);
83
+ margin-top: var(--origo-spacing-xs);
84
+ }
@@ -14,11 +14,17 @@ import { OrigoAdapter, coerceContractProps } from '../../../adapters/web/adapter
14
14
  import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
15
15
 
16
16
  export interface SwitchProps {
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;
25
+ invalid?: boolean;
26
+ errorText?: string;
27
+ helpText?: string;
22
28
  }
23
29
 
24
30
  @Component({
@@ -41,6 +47,9 @@ export class SwitchComponent implements OrigoAdapter<SwitchProps> {
41
47
  checked: 'boolean',
42
48
  label: 'string',
43
49
  disabled: 'boolean',
50
+ invalid: 'boolean',
51
+ errorText: 'string',
52
+ helpText: 'string',
44
53
  };
45
54
  static readonly strictContract = false;
46
55
 
@@ -58,6 +67,10 @@ export class SwitchComponent implements OrigoAdapter<SwitchProps> {
58
67
  return v !== undefined && v !== null && String(v).trim() !== '' ? String(v) : undefined;
59
68
  });
60
69
 
70
+ computedInvalid = computed(() => !!this.contract().props?.invalid);
71
+ computedErrorText = computed(() => this.contract().props?.errorText ?? '');
72
+ computedHelpText = computed(() => this.contract().props?.helpText ?? '');
73
+
61
74
  private experienceAdapter = inject(WebExperienceAdapterService);
62
75
 
63
76
  constructor() {
@@ -22,6 +22,9 @@ export interface TabItem {
22
22
  }
23
23
 
24
24
  export interface TabsProps {
25
+ permissions?: Record<string, string>;
26
+ rules?: Record<string, unknown>;
27
+ metadata?: Record<string, unknown>;
25
28
  tabs?: Array<TabItem>;
26
29
  activeTab?: string;
27
30
  'aria-label'?: string;
@@ -42,6 +45,9 @@ export interface TabsProps {
42
45
  })
43
46
  export class TabsComponent implements OrigoAdapter<TabsProps> {
44
47
  static readonly contractSchema = {
48
+ permissions: 'object',
49
+ rules: 'object',
50
+ metadata: 'object',
45
51
  tabs: 'array',
46
52
  };
47
53
  static readonly strictContract = false;
@@ -1,10 +1,21 @@
1
- <input
2
- type="text"
3
- [value]="value()"
4
- (input)="onInput($event)"
5
- [placeholder]="computedPlaceholder()"
6
- [disabled]="computedDisabled()"
7
- [readonly]="computedReadonly()"
8
- [attr.aria-label]="computedAriaLabel()"
9
- [attr.aria-describedby]="computedAriaDescribedBy()"
10
- />
1
+ <div class="origo-text-input__wrapper">
2
+ <input
3
+ [attr.type]="computedType()"
4
+ [value]="value()"
5
+ (input)="onInput($event)"
6
+ (paste)="onPaste($event)"
7
+ [placeholder]="computedPlaceholder()"
8
+ [disabled]="computedDisabled()"
9
+ [readonly]="computedReadonly()"
10
+ [attr.aria-label]="computedAriaLabel()"
11
+ [attr.aria-describedby]="computedAriaDescribedBy()"
12
+ [attr.aria-invalid]="computedInvalid() ? 'true' : null"
13
+ [attr.aria-required]="computedRequired() ? 'true' : null"
14
+ />
15
+ </div>
16
+ @if (computedErrorText()) {
17
+ <div class="origo-text-input__error">{{ computedErrorText() }}</div>
18
+ }
19
+ @if (computedHelpText()) {
20
+ <div class="origo-text-input__help">{{ computedHelpText() }}</div>
21
+ }
@@ -1,42 +1,68 @@
1
1
  :host {
2
2
  display: inline-block;
3
3
  }
4
+ :host(.origo-text-input--fluid) {
5
+ display: block;
6
+ width: 100%;
7
+ }
8
+ .origo-text-input__wrapper {
9
+ display: flex;
10
+ flex-direction: column;
11
+ }
4
12
  input {
5
13
  box-sizing: border-box;
6
14
  width: 100%;
7
15
  background-color: var(--origo-color-surface-background);
8
16
  color: var(--origo-color-text-primary);
9
17
  padding: var(--origo-spacing-container-padding);
10
- border: var(--origo-border-width-default, 1px) solid var(--origo-color-border-default, #ccc);
11
- border-radius: var(--origo-radius-sm, 4px);
12
- box-shadow: var(--origo-shadow-sm, none);
13
- font-family: var(--origo-typography-input-font-family, inherit);
14
- font-size: var(--origo-typography-input-font-size, inherit);
15
- font-weight: var(--origo-typography-input-font-weight, inherit);
16
- line-height: var(--origo-typography-input-line-height, inherit);
17
- transition: all 0.2s ease-in-out;
18
+ border: var(--origo-border-width-default) solid var(--origo-color-border-default);
19
+ border-radius: var(--origo-radius-sm);
20
+ box-shadow: var(--origo-shadow-sm);
21
+ font-family: var(--origo-typography-input-font-family);
22
+ font-size: var(--origo-typography-input-font-size);
23
+ font-weight: var(--origo-typography-input-font-weight);
24
+ line-height: var(--origo-typography-input-line-height);
25
+ transition: all var(--origo-duration-fast) ease-in-out;
26
+ }
27
+ :host(.origo-text-input--filled) input {
28
+ background-color: var(--origo-color-surface-subtle);
29
+ border: none;
30
+ }
31
+ :host(.origo-text-input--text) input {
32
+ background-color: transparent;
33
+ border: none;
18
34
  }
19
35
  input::placeholder {
20
- color: var(--origo-color-text-muted, #777);
36
+ color: var(--origo-color-text-muted);
21
37
  }
22
38
  input:hover:not(:disabled):not([readonly]) {
23
- border-color: var(--origo-color-border-hover, #999);
39
+ border-color: var(--origo-color-border-hover);
24
40
  }
25
41
  input:active:not(:disabled):not([readonly]) {
26
- border-color: var(--origo-color-border-active, #666);
42
+ border-color: var(--origo-color-border-active);
27
43
  }
28
44
  input:focus,
29
45
  input:focus-visible {
30
- outline: 2px solid var(--origo-color-focus, #005fcc);
31
- outline-offset: -1px;
32
- border-color: var(--origo-color-focus, #005fcc);
46
+ outline: var(--origo-border-width-thick) solid var(--origo-color-focus);
47
+ outline-offset: var(--origo-border-offset-negative);
48
+ border-color: var(--origo-color-focus);
33
49
  }
34
50
  input:disabled {
35
51
  cursor: not-allowed;
36
- opacity: var(--origo-opacity-disabled, 0.5);
37
- background-color: var(--origo-color-surface-disabled, #eee);
38
- color: var(--origo-color-text-disabled, #999);
52
+ opacity: var(--origo-opacity-disabled);
53
+ background-color: var(--origo-color-surface-disabled);
54
+ color: var(--origo-color-text-disabled);
39
55
  }
40
56
  input[readonly] {
41
- background-color: var(--origo-color-surface-readonly, #f9f9f9);
57
+ background-color: var(--origo-color-surface-readonly);
58
+ }
59
+ .origo-text-input__error {
60
+ color: var(--origo-color-text-danger);
61
+ font-size: var(--origo-typography-caption-font-size);
62
+ margin-top: var(--origo-spacing-xs);
63
+ }
64
+ .origo-text-input__help {
65
+ color: var(--origo-color-text-muted);
66
+ font-size: var(--origo-typography-caption-font-size);
67
+ margin-top: var(--origo-spacing-xs);
42
68
  }
@@ -14,12 +14,22 @@ import { OrigoAdapter } from '../../../adapters/web/adapter';
14
14
  import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
15
15
 
16
16
  export interface TextInputProps {
17
+ permissions?: Record<string, string>;
18
+ rules?: Record<string, unknown>;
19
+ metadata?: Record<string, unknown>;
17
20
  value?: string;
18
21
  placeholder?: string;
19
22
  disabled?: boolean;
20
23
  readonly?: boolean;
21
24
  'aria-label'?: string;
22
25
  'aria-describedby'?: string;
26
+ variant?: 'outlined' | 'filled' | 'text';
27
+ fluid?: boolean;
28
+ required?: boolean;
29
+ invalid?: boolean;
30
+ errorText?: string;
31
+ helpText?: string;
32
+ type?: string;
23
33
  }
24
34
 
25
35
  @Component({
@@ -31,15 +41,29 @@ export interface TextInputProps {
31
41
  encapsulation: ViewEncapsulation.ShadowDom,
32
42
  host: {
33
43
  '[class.origo-text-input]': 'true',
34
- '[attr.data-testid]': 'contract().id ?? ""',
44
+ '[attr.data-testid]': 'contract().id',
45
+ '[class.origo-text-input--fluid]': 'computedFluid()',
46
+ '[class.origo-text-input--outlined]': 'computedVariant() === "outlined"',
47
+ '[class.origo-text-input--filled]': 'computedVariant() === "filled"',
48
+ '[class.origo-text-input--text]': 'computedVariant() === "text"',
35
49
  },
36
50
  })
37
51
  export class TextInputComponent implements OrigoAdapter<TextInputProps> {
38
52
  static readonly contractSchema = {
53
+ permissions: 'object',
54
+ rules: 'object',
55
+ metadata: 'object',
39
56
  value: 'string',
40
57
  placeholder: 'string',
41
58
  disabled: 'boolean',
42
59
  readonly: 'boolean',
60
+ variant: 'string',
61
+ fluid: 'boolean',
62
+ required: 'boolean',
63
+ invalid: 'boolean',
64
+ errorText: 'string',
65
+ helpText: 'string',
66
+ type: 'string',
43
67
  };
44
68
  static readonly strictContract = false;
45
69
 
@@ -62,6 +86,14 @@ export class TextInputComponent implements OrigoAdapter<TextInputProps> {
62
86
  : undefined;
63
87
  });
64
88
 
89
+ computedVariant = computed(() => this.contract().props?.variant ?? 'outlined');
90
+ computedFluid = computed(() => !!this.contract().props?.fluid);
91
+ computedRequired = computed(() => !!this.contract().props?.required);
92
+ computedInvalid = computed(() => !!this.contract().props?.invalid);
93
+ computedErrorText = computed(() => this.contract().props?.errorText ?? '');
94
+ computedHelpText = computed(() => this.contract().props?.helpText ?? '');
95
+ computedType = computed(() => this.contract().props?.type ?? 'text');
96
+
65
97
  private experienceAdapter = inject(WebExperienceAdapterService);
66
98
 
67
99
  constructor() {
@@ -75,7 +107,7 @@ export class TextInputComponent implements OrigoAdapter<TextInputProps> {
75
107
 
76
108
  onInput(event: Event) {
77
109
  const target = event.target as HTMLInputElement | null;
78
- if (!target) return;
110
+ if (!target || this.computedDisabled() || this.computedReadonly()) return;
79
111
 
80
112
  const rawValue = target.value;
81
113
  const sanitizedValue = String(rawValue);
@@ -87,4 +119,18 @@ export class TextInputComponent implements OrigoAdapter<TextInputProps> {
87
119
  this.value.set(sanitizedValue);
88
120
  this.experienceAdapter.updateState(this.contract().id, 'value', sanitizedValue);
89
121
  }
122
+
123
+ onPaste(event: ClipboardEvent) {
124
+ if (this.computedDisabled() || this.computedReadonly()) return;
125
+ event.preventDefault();
126
+ const plain = event.clipboardData?.getData('text/plain') ?? '';
127
+ const target = event.target as HTMLInputElement | null;
128
+ if (!target) return;
129
+ const start = target.selectionStart ?? target.value.length;
130
+ const end = target.selectionEnd ?? target.value.length;
131
+ const newValue = target.value.slice(0, start) + plain + target.value.slice(end);
132
+ target.value = newValue;
133
+ this.value.set(newValue);
134
+ this.experienceAdapter.updateState(this.contract().id, 'value', newValue);
135
+ }
90
136
  }
@@ -1,12 +1,22 @@
1
- <textarea
2
- [id]="contract().id"
3
- [disabled]="computedDisabled()"
4
- [readonly]="computedReadonly()"
5
- [required]="computedRequired()"
6
- [attr.placeholder]="computedPlaceholder()"
7
- [attr.rows]="computedRows()"
8
- [attr.aria-label]="computedAriaLabel()"
9
- [attr.aria-describedby]="computedAriaDescribedBy()"
10
- (input)="onInput($event)"
11
- [value]="value()"
12
- ></textarea>
1
+ <div class="origo-textarea__wrapper">
2
+ <textarea
3
+ [id]="contract().id"
4
+ [disabled]="computedDisabled()"
5
+ [readonly]="computedReadonly()"
6
+ [required]="computedRequired()"
7
+ [attr.placeholder]="computedPlaceholder()"
8
+ [attr.rows]="computedRows()"
9
+ [attr.aria-label]="computedAriaLabel()"
10
+ [attr.aria-describedby]="computedAriaDescribedBy()"
11
+ [attr.aria-invalid]="computedInvalid() ? 'true' : null"
12
+ (input)="onInput($event)"
13
+ (paste)="onPaste($event)"
14
+ [value]="value()"
15
+ ></textarea>
16
+ </div>
17
+ @if (computedErrorText()) {
18
+ <div class="origo-textarea__error">{{ computedErrorText() }}</div>
19
+ }
20
+ @if (computedHelpText()) {
21
+ <div class="origo-textarea__help">{{ computedHelpText() }}</div>
22
+ }
@@ -1,31 +1,69 @@
1
1
  :host {
2
2
  display: block;
3
3
  }
4
-
5
- textarea {
4
+ :host(.origo-textarea--fluid) {
6
5
  display: block;
7
6
  width: 100%;
8
- font-family: var(--origo-typography-input-font-family, inherit);
9
- font-size: var(--origo-typography-input-font-size, 1rem);
10
- color: var(--origo-color-text-primary, #333);
11
- background-color: var(--origo-color-surface-background, #fff);
12
- border: 1px solid var(--origo-color-border-default, #ccc);
13
- border-radius: var(--origo-radius-sm, 4px);
14
- padding: var(--origo-spacing-container-padding, 8px);
7
+ }
8
+ .origo-textarea__wrapper {
9
+ display: flex;
10
+ flex-direction: column;
11
+ }
12
+ textarea {
15
13
  box-sizing: border-box;
14
+ width: 100%;
16
15
  resize: vertical;
17
-
18
- &:focus {
19
- outline: 2px solid var(--origo-color-focus, #005fcc);
20
- outline-offset: 2px;
21
- }
22
-
23
- &:disabled {
24
- opacity: var(--origo-opacity-disabled, 0.5);
25
- cursor: not-allowed;
26
- }
27
-
28
- &[readonly] {
29
- background-color: var(--origo-color-surface-readonly, #f9f9f9);
30
- }
16
+ background-color: var(--origo-color-surface-background);
17
+ color: var(--origo-color-text-primary);
18
+ padding: var(--origo-spacing-container-padding);
19
+ border: var(--origo-border-width-default) solid var(--origo-color-border-default);
20
+ border-radius: var(--origo-radius-sm);
21
+ box-shadow: var(--origo-shadow-sm);
22
+ font-family: var(--origo-typography-input-font-family);
23
+ font-size: var(--origo-typography-input-font-size);
24
+ font-weight: var(--origo-typography-input-font-weight);
25
+ line-height: var(--origo-typography-input-line-height);
26
+ transition: all var(--origo-duration-fast) ease-in-out;
27
+ }
28
+ :host(.origo-textarea--filled) textarea {
29
+ background-color: var(--origo-color-surface-subtle);
30
+ border: none;
31
+ }
32
+ :host(.origo-textarea--text) textarea {
33
+ background-color: transparent;
34
+ border: none;
35
+ }
36
+ textarea::placeholder {
37
+ color: var(--origo-color-text-muted);
38
+ }
39
+ textarea:hover:not(:disabled):not([readonly]) {
40
+ border-color: var(--origo-color-border-hover);
41
+ }
42
+ textarea:active:not(:disabled):not([readonly]) {
43
+ border-color: var(--origo-color-border-active);
44
+ }
45
+ textarea:focus,
46
+ textarea:focus-visible {
47
+ outline: var(--origo-border-width-thick) solid var(--origo-color-focus);
48
+ outline-offset: var(--origo-border-offset-negative);
49
+ border-color: var(--origo-color-focus);
50
+ }
51
+ textarea:disabled {
52
+ cursor: not-allowed;
53
+ opacity: var(--origo-opacity-disabled);
54
+ background-color: var(--origo-color-surface-disabled);
55
+ color: var(--origo-color-text-disabled);
56
+ }
57
+ textarea[readonly] {
58
+ background-color: var(--origo-color-surface-readonly);
59
+ }
60
+ .origo-textarea__error {
61
+ color: var(--origo-color-text-danger);
62
+ font-size: var(--origo-typography-caption-font-size);
63
+ margin-top: var(--origo-spacing-xs);
64
+ }
65
+ .origo-textarea__help {
66
+ color: var(--origo-color-text-muted);
67
+ font-size: var(--origo-typography-caption-font-size);
68
+ margin-top: var(--origo-spacing-xs);
31
69
  }
@@ -9,13 +9,19 @@ import {
9
9
  effect,
10
10
  untracked,
11
11
  SecurityContext,
12
+ PLATFORM_ID,
12
13
  } from '@angular/core';
13
14
  import { DomSanitizer } from '@angular/platform-browser';
14
15
  import { InteractionContract } from '@origostudio/core';
16
+
17
+ import { isPlatformBrowser } from '@angular/common';
15
18
  import { OrigoAdapter } from '../../../adapters/web/adapter';
16
19
  import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
17
20
 
18
21
  export interface TextareaProps {
22
+ permissions?: Record<string, string>;
23
+ rules?: Record<string, unknown>;
24
+ metadata?: Record<string, unknown>;
19
25
  value?: string;
20
26
  placeholder?: string;
21
27
  rows?: number;
@@ -24,6 +30,12 @@ export interface TextareaProps {
24
30
  'aria-label'?: string;
25
31
  'aria-describedby'?: string;
26
32
  required?: boolean;
33
+ variant?: 'outlined' | 'filled' | 'text';
34
+ fluid?: boolean;
35
+ invalid?: boolean;
36
+ errorText?: string;
37
+ helpText?: string;
38
+ autoResize?: boolean;
27
39
  }
28
40
 
29
41
  @Component({
@@ -36,16 +48,29 @@ export interface TextareaProps {
36
48
  host: {
37
49
  '[class.origo-textarea]': 'true',
38
50
  '[attr.data-testid]': 'contract().id',
51
+ '[class.origo-textarea--fluid]': 'computedFluid()',
52
+ '[class.origo-textarea--outlined]': 'computedVariant() === "outlined"',
53
+ '[class.origo-textarea--filled]': 'computedVariant() === "filled"',
54
+ '[class.origo-textarea--text]': 'computedVariant() === "text"',
39
55
  },
40
56
  })
41
57
  export class TextareaComponent implements OrigoAdapter<TextareaProps> {
42
58
  static readonly contractSchema = {
59
+ permissions: 'object',
60
+ rules: 'object',
61
+ metadata: 'object',
43
62
  value: 'string',
44
63
  placeholder: 'string',
45
64
  rows: 'number',
46
65
  disabled: 'boolean',
47
66
  readonly: 'boolean',
48
67
  required: 'boolean',
68
+ variant: 'string',
69
+ fluid: 'boolean',
70
+ invalid: 'boolean',
71
+ errorText: 'string',
72
+ helpText: 'string',
73
+ autoResize: 'boolean',
49
74
  };
50
75
  static readonly strictContract = false;
51
76
 
@@ -69,8 +94,16 @@ export class TextareaComponent implements OrigoAdapter<TextareaProps> {
69
94
  return desc !== undefined && desc !== null ? String(desc) : undefined;
70
95
  });
71
96
 
97
+ computedVariant = computed(() => this.contract().props?.variant ?? 'outlined');
98
+ computedFluid = computed(() => !!this.contract().props?.fluid);
99
+ computedInvalid = computed(() => !!this.contract().props?.invalid);
100
+ computedErrorText = computed(() => this.contract().props?.errorText ?? '');
101
+ computedHelpText = computed(() => this.contract().props?.helpText ?? '');
102
+ computedAutoResize = computed(() => !!this.contract().props?.autoResize);
103
+
72
104
  private experienceAdapter = inject(WebExperienceAdapterService);
73
105
  private sanitizer = inject(DomSanitizer);
106
+ private platformId = inject(PLATFORM_ID);
74
107
 
75
108
  constructor() {
76
109
  effect(() => {
@@ -98,5 +131,30 @@ export class TextareaComponent implements OrigoAdapter<TextareaProps> {
98
131
 
99
132
  this.value.set(sanitizedValue);
100
133
  this.experienceAdapter.updateState(this.contract().id, 'value', sanitizedValue);
134
+
135
+ if (this.computedAutoResize() && isPlatformBrowser(this.platformId)) {
136
+ target.style.height = 'auto';
137
+ target.style.height = `${target.scrollHeight}px`;
138
+ }
139
+ }
140
+
141
+ onPaste(event: ClipboardEvent) {
142
+ if (this.computedDisabled() || this.computedReadonly()) return;
143
+ event.preventDefault();
144
+ const plain = event.clipboardData?.getData('text/plain') ?? '';
145
+ const target = event.target as HTMLTextAreaElement | null;
146
+ if (!target) return;
147
+ const start = target.selectionStart ?? target.value.length;
148
+ const end = target.selectionEnd ?? target.value.length;
149
+ const newValue = target.value.slice(0, start) + plain + target.value.slice(end);
150
+
151
+ target.value = newValue;
152
+ this.value.set(newValue);
153
+ this.experienceAdapter.updateState(this.contract().id, 'value', newValue);
154
+
155
+ if (this.computedAutoResize() && isPlatformBrowser(this.platformId)) {
156
+ target.style.height = 'auto';
157
+ target.style.height = `${target.scrollHeight}px`;
158
+ }
101
159
  }
102
160
  }
@@ -11,6 +11,9 @@ import { InteractionContract } from '@origostudio/core';
11
11
  import { OrigoAdapter, ContainerComponent } from '../../../adapters/web/adapter';
12
12
 
13
13
  export interface VBoxProps {
14
+ permissions?: Record<string, string>;
15
+ rules?: Record<string, unknown>;
16
+ metadata?: Record<string, unknown>;
14
17
  gap?: number | string;
15
18
  alignment?: 'start' | 'center' | 'end' | 'stretch';
16
19
  padding?: number | string;
@@ -38,6 +41,9 @@ export interface VBoxProps {
38
41
  })
39
42
  export class VBoxComponent implements OrigoAdapter<VBoxProps>, ContainerComponent {
40
43
  static readonly contractSchema = {
44
+ permissions: 'object',
45
+ rules: 'object',
46
+ metadata: 'object',
41
47
  gap: 'string',
42
48
  alignment: 'string',
43
49
  padding: 'string',
@@ -5,6 +5,9 @@ export * from './adapters/web/adapter';
5
5
  export * from './components/primitives/vbox/vbox.component';
6
6
  export * from './components/primitives/text-input/text-input.component';
7
7
  export * from './components/primitives/button/button.component';
8
+ export * from './components/primitives/icon-button/icon-button.component';
9
+ export * from './components/primitives/button-group/button-group.component';
10
+ export * from './components/primitives/floating-action-button/floating-action-button.component';
8
11
  export * from './devtools';
9
12
  export * from './components/primitives/select/select.component';
10
13
  export * from './components/primitives/checkbox/checkbox.component';
@@ -21,3 +24,4 @@ export * from './components/primitives/sidebar/sidebar.component';
21
24
  export * from './components/primitives/tabs/tabs.component';
22
25
  export * from './components/primitives/breadcrumbs/breadcrumbs.component';
23
26
  export * from './adapters/web/experience-adapter.service';
27
+ export * from './components/primitives/input-number/input-number.component';