@origostudio/origo-design 0.0.48 → 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 (151) hide show
  1. package/CHANGELOG.md +4 -5
  2. package/apply-fixes.js +18 -0
  3. package/dist/packages/angular-renderer/CHANGELOG.md +11 -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 +6 -6
  9. package/dist/packages/angular-renderer/src/components/primitives/button/button.component.js +4 -4
  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 +6 -0
  12. package/dist/packages/angular-renderer/src/components/primitives/button-group/button-group.component.js +3 -0
  13. package/dist/packages/angular-renderer/src/components/primitives/button-group/button-group.component.js.map +1 -1
  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 +6 -6
  26. package/dist/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.js +4 -4
  27. package/dist/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.js.map +1 -1
  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 +6 -6
  35. package/dist/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.js +4 -4
  36. package/dist/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.js.map +1 -1
  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 +1 -0
  71. package/dist/packages/angular-renderer/src/index.js +1 -0
  72. package/dist/packages/angular-renderer/src/index.js.map +1 -1
  73. package/dist/packages/angular-renderer/src/lib/primitives.provider.js +2 -0
  74. package/dist/packages/angular-renderer/src/lib/primitives.provider.js.map +1 -1
  75. package/dist/packages/cli/CHANGELOG.md +4 -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 +4 -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 +4 -0
  82. package/dist/packages/design-tokens/package.json +1 -1
  83. package/dist/packages/playground/browser/{chunk-CtaS4wCa.js → chunk-B8mwHWgW.js} +1 -1
  84. package/dist/packages/playground/browser/{chunk-CdNbNqNV.js → chunk-B_swdRuc.js} +1 -1
  85. package/dist/packages/playground/browser/{chunk-BQfPUVzZ.js → chunk-BbeNQQ9Z.js} +1 -1
  86. package/dist/packages/playground/browser/{chunk-ClmlG9ZJ.js → chunk-BlCRDoSd.js} +1 -1
  87. package/dist/packages/playground/browser/{chunk-DRRJiw3L.js → chunk-C8l8Pst_.js} +1 -1
  88. package/dist/packages/playground/browser/{chunk-CQQHYSEg.js → chunk-CCE_vAje.js} +1 -1
  89. package/dist/packages/playground/browser/{chunk-zkDXJCJr.js → chunk-Cb2ALrKC.js} +1 -1
  90. package/dist/packages/playground/browser/{chunk-4MD_GCgA.js → chunk-CpaI4VGh.js} +1 -1
  91. package/dist/packages/playground/browser/{chunk-ChP61sze.js → chunk-DgLZ-dIi.js} +1 -1
  92. package/dist/packages/playground/browser/{chunk-DvVvDpcg.js → chunk-DkxgAarv.js} +1 -1
  93. package/dist/packages/playground/browser/{chunk-COjGAm8R.js → chunk-DoYDPF2-.js} +1 -1
  94. package/dist/packages/playground/browser/{chunk-PT1eAqp3.js → chunk-G1sQXMvG.js} +1 -1
  95. package/dist/packages/playground/browser/{chunk-B8F7hD0p.js → chunk-XTbjIUbx.js} +1 -1
  96. package/dist/packages/playground/browser/{chunk-DyfobgsU.js → chunk-lFsGUZ3A.js} +1 -1
  97. package/dist/packages/playground/browser/{chunk-cI3o8oNy.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 +11 -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.ts +8 -7
  105. package/packages/angular-renderer/src/components/primitives/button-group/button-group.component.ts +6 -0
  106. package/packages/angular-renderer/src/components/primitives/card/card.component.ts +6 -0
  107. package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.html +24 -15
  108. package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.scss +25 -9
  109. package/packages/angular-renderer/src/components/primitives/checkbox/checkbox.component.ts +16 -0
  110. package/packages/angular-renderer/src/components/primitives/chip/chip.component.ts +3 -0
  111. package/packages/angular-renderer/src/components/primitives/data-grid/data-grid.component.ts +6 -0
  112. package/packages/angular-renderer/src/components/primitives/floating-action-button/floating-action-button.component.ts +8 -7
  113. package/packages/angular-renderer/src/components/primitives/form-field/form-field.component.ts +6 -0
  114. package/packages/angular-renderer/src/components/primitives/hbox/hbox.component.ts +6 -0
  115. package/packages/angular-renderer/src/components/primitives/icon-button/icon-button.component.ts +8 -7
  116. package/packages/angular-renderer/src/components/primitives/input-number/input-number.component.html +24 -0
  117. package/packages/angular-renderer/src/components/primitives/input-number/input-number.component.scss +80 -0
  118. package/packages/angular-renderer/src/components/primitives/input-number/input-number.component.ts +146 -0
  119. package/packages/angular-renderer/src/components/primitives/label/label.component.ts +6 -0
  120. package/packages/angular-renderer/src/components/primitives/list/list.component.ts +6 -0
  121. package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.html +11 -1
  122. package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.scss +20 -9
  123. package/packages/angular-renderer/src/components/primitives/radio-group/radio-group.component.ts +16 -0
  124. package/packages/angular-renderer/src/components/primitives/select/select.component.ts +6 -0
  125. package/packages/angular-renderer/src/components/primitives/sidebar/sidebar.component.ts +6 -0
  126. package/packages/angular-renderer/src/components/primitives/switch/switch.component.html +24 -15
  127. package/packages/angular-renderer/src/components/primitives/switch/switch.component.scss +40 -22
  128. package/packages/angular-renderer/src/components/primitives/switch/switch.component.ts +13 -0
  129. package/packages/angular-renderer/src/components/primitives/tabs/tabs.component.ts +6 -0
  130. package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.html +21 -10
  131. package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.scss +44 -18
  132. package/packages/angular-renderer/src/components/primitives/text-input/text-input.component.ts +48 -2
  133. package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.html +22 -12
  134. package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.scss +61 -23
  135. package/packages/angular-renderer/src/components/primitives/textarea/textarea.component.ts +58 -0
  136. package/packages/angular-renderer/src/components/primitives/vbox/vbox.component.ts +6 -0
  137. package/packages/angular-renderer/src/index.ts +1 -0
  138. package/packages/angular-renderer/src/lib/primitives.provider.ts +2 -0
  139. package/packages/cli/CHANGELOG.md +4 -0
  140. package/packages/cli/package.json +2 -2
  141. package/packages/core/CHANGELOG.md +4 -0
  142. package/packages/core/package.json +1 -1
  143. package/packages/design-tokens/CHANGELOG.md +4 -0
  144. package/packages/design-tokens/package.json +1 -1
  145. package/packages/devtools/CHANGELOG.md +4 -0
  146. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  147. package/packages/devtools/package.json +3 -3
  148. package/packages/playground/CHANGELOG.md +4 -0
  149. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  150. package/packages/playground/package.json +3 -3
  151. package/dist/packages/playground/browser/main-DTJJSNK4.js +0 -733
@@ -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',
@@ -24,3 +24,4 @@ export * from './components/primitives/sidebar/sidebar.component';
24
24
  export * from './components/primitives/tabs/tabs.component';
25
25
  export * from './components/primitives/breadcrumbs/breadcrumbs.component';
26
26
  export * from './adapters/web/experience-adapter.service';
27
+ export * from './components/primitives/input-number/input-number.component';
@@ -21,6 +21,7 @@ import { ChipComponent } from '../components/primitives/chip/chip.component';
21
21
  import { TextInputComponent } from '../components/primitives/text-input/text-input.component';
22
22
  import { ButtonComponent } from '../components/primitives/button/button.component';
23
23
  import { VBoxComponent } from '../components/primitives/vbox/vbox.component';
24
+ import { InputNumberComponent } from '../components/primitives/input-number/input-number.component';
24
25
 
25
26
  export function provideOrigo9Primitives(): EnvironmentProviders {
26
27
  const registryMap = new Map<string, unknown>([
@@ -46,6 +47,7 @@ export function provideOrigo9Primitives(): EnvironmentProviders {
46
47
  ['TextInput', TextInputComponent],
47
48
  ['Button', ButtonComponent],
48
49
  ['VBox', VBoxComponent],
50
+ ['InputNumber', InputNumberComponent],
49
51
  ['vbox', VBoxComponent], // For backward compatibility with 'vbox' in preview-root
50
52
  ]);
51
53
 
@@ -1,3 +1,7 @@
1
+ ## 0.0.49 (2026-10-08)
2
+
3
+ This was a version bump only for cli to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.48 (2026-10-07)
2
6
 
3
7
  This was a version bump only for cli to align it with other projects, there were no code changes.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/cli",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -9,7 +9,7 @@
9
9
  "origo": "./src/main.js"
10
10
  },
11
11
  "dependencies": {
12
- "@origostudio/core": "0.0.48",
12
+ "@origostudio/core": "0.0.49",
13
13
  "commander": "^15.0.0",
14
14
  "tslib": "^2.3.0"
15
15
  },
@@ -1,3 +1,7 @@
1
+ ## 0.0.49 (2026-10-08)
2
+
3
+ This was a version bump only for core to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.48 (2026-10-07)
2
6
 
3
7
  This was a version bump only for core to align it with other projects, there were no code changes.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/core",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1,3 +1,7 @@
1
+ ## 0.0.49 (2026-10-08)
2
+
3
+ This was a version bump only for design-tokens to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.48 (2026-10-07)
2
6
 
3
7
  This was a version bump only for design-tokens to align it with other projects, there were no code changes.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/design-tokens",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1,3 +1,7 @@
1
+ ## 0.0.49 (2026-10-08)
2
+
3
+ This was a version bump only for devtools to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.48 (2026-10-07)
2
6
 
3
7
  This was a version bump only for devtools to align it with other projects, there were no code changes.
@@ -1 +1 @@
1
- {"version":"4.1.11","results":[[":src/devtools-panel/app.component.spec.ts",{"duration":175.88274900000033,"failed":false}]]}
1
+ {"version":"4.1.11","results":[[":src/devtools-panel/app.component.spec.ts",{"duration":159.0430180000003,"failed":false}]]}
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@origostudio/devtools",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "type": "module",
5
5
  "dependencies": {
6
- "@origostudio/core": "0.0.48",
7
- "@origostudio/cli": "0.0.48",
6
+ "@origostudio/core": "0.0.49",
7
+ "@origostudio/cli": "0.0.49",
8
8
  "@angular/core": "18.1.0",
9
9
  "@angular/common": "18.1.0"
10
10
  },
@@ -1,3 +1,7 @@
1
+ ## 0.0.49 (2026-10-08)
2
+
3
+ This was a version bump only for playground to align it with other projects, there were no code changes.
4
+
1
5
  ## 0.0.48 (2026-10-07)
2
6
 
3
7
  This was a version bump only for playground to align it with other projects, there were no code changes.
@@ -1 +1 @@
1
- {"version":"4.1.11","results":[[":src/workers/compiler.worker.spec.ts",{"duration":3739.1939329999987,"failed":false}],[":src/editor/badl-editor.component.spec.ts",{"duration":464.2565289999984,"failed":false}],[":src/preview/preview-root.component.spec.ts",{"duration":428.31811200000084,"failed":false}],[":src/editor/schema-registry.spec.ts",{"duration":13.936109000002034,"failed":false}],[":src/preview/preview.service.spec.ts",{"duration":86.00780300000042,"failed":false}],[":src/app/app.component.spec.ts",{"duration":269.9306109999998,"failed":false}],[":src/preview/preview-pane.component.spec.ts",{"duration":161.74670799999876,"failed":false}]]}
1
+ {"version":"4.1.11","results":[[":src/editor/badl-editor.component.spec.ts",{"duration":355.58316600000035,"failed":false}],[":src/workers/compiler.worker.spec.ts",{"duration":3910.8276769999975,"failed":false}],[":src/preview/preview-root.component.spec.ts",{"duration":552.2895629999985,"failed":false}],[":src/editor/schema-registry.spec.ts",{"duration":23.031402000000526,"failed":false}],[":src/preview/preview.service.spec.ts",{"duration":53.45418900000004,"failed":false}],[":src/app/app.component.spec.ts",{"duration":232.5201330000018,"failed":false}],[":src/preview/preview-pane.component.spec.ts",{"duration":124.97693900000013,"failed":false}]]}
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@origostudio/playground",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "private": true,
5
5
  "dependencies": {
6
- "@origostudio/core": "0.0.48",
7
- "@origostudio/cli": "0.0.48"
6
+ "@origostudio/core": "0.0.49",
7
+ "@origostudio/cli": "0.0.49"
8
8
  },
9
9
  "peerDependencies": {
10
10
  "@angular/common": "^18.0.0",