@origostudio/origo-design 0.0.50 → 0.0.52

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 (102) hide show
  1. package/CHANGELOG.md +6 -4
  2. package/dist/packages/angular-renderer/CHANGELOG.md +25 -0
  3. package/dist/packages/angular-renderer/package.json +3 -3
  4. package/dist/packages/angular-renderer/src/adapters/web/adapter.d.ts +2 -2
  5. package/dist/packages/angular-renderer/src/adapters/web/adapter.js.map +1 -1
  6. package/dist/packages/angular-renderer/src/components/primitives/card/card.component.d.ts +18 -2
  7. package/dist/packages/angular-renderer/src/components/primitives/card/card.component.js +41 -0
  8. package/dist/packages/angular-renderer/src/components/primitives/card/card.component.js.map +1 -1
  9. package/dist/packages/angular-renderer/src/components/primitives/container/container.component.d.ts +20 -0
  10. package/dist/packages/angular-renderer/src/components/primitives/container/container.component.js +54 -0
  11. package/dist/packages/angular-renderer/src/components/primitives/container/container.component.js.map +1 -0
  12. package/dist/packages/angular-renderer/src/components/primitives/date-picker/date-picker.component.d.ts +57 -0
  13. package/dist/packages/angular-renderer/src/components/primitives/date-picker/date-picker.component.js +257 -0
  14. package/dist/packages/angular-renderer/src/components/primitives/date-picker/date-picker.component.js.map +1 -0
  15. package/dist/packages/angular-renderer/src/components/primitives/date-range-picker/date-range-picker.component.d.ts +67 -0
  16. package/dist/packages/angular-renderer/src/components/primitives/date-range-picker/date-range-picker.component.js +299 -0
  17. package/dist/packages/angular-renderer/src/components/primitives/date-range-picker/date-range-picker.component.js.map +1 -0
  18. package/dist/packages/angular-renderer/src/components/primitives/divider/divider.component.d.ts +21 -0
  19. package/dist/packages/angular-renderer/src/components/primitives/divider/divider.component.js +86 -0
  20. package/dist/packages/angular-renderer/src/components/primitives/divider/divider.component.js.map +1 -0
  21. package/dist/packages/angular-renderer/src/components/primitives/grid/grid.component.d.ts +24 -0
  22. package/dist/packages/angular-renderer/src/components/primitives/grid/grid.component.js +111 -0
  23. package/dist/packages/angular-renderer/src/components/primitives/grid/grid.component.js.map +1 -0
  24. package/dist/packages/angular-renderer/src/components/primitives/stack/stack.component.d.ts +24 -0
  25. package/dist/packages/angular-renderer/src/components/primitives/stack/stack.component.js +101 -0
  26. package/dist/packages/angular-renderer/src/components/primitives/stack/stack.component.js.map +1 -0
  27. package/dist/packages/angular-renderer/src/components/primitives/time-picker/time-picker.component.d.ts +48 -0
  28. package/dist/packages/angular-renderer/src/components/primitives/time-picker/time-picker.component.js +214 -0
  29. package/dist/packages/angular-renderer/src/components/primitives/time-picker/time-picker.component.js.map +1 -0
  30. package/dist/packages/angular-renderer/src/index.d.ts +9 -1
  31. package/dist/packages/angular-renderer/src/index.js +11 -1
  32. package/dist/packages/angular-renderer/src/index.js.map +1 -1
  33. package/dist/packages/angular-renderer/src/lib/primitives.provider.js +14 -0
  34. package/dist/packages/angular-renderer/src/lib/primitives.provider.js.map +1 -1
  35. package/dist/packages/cli/CHANGELOG.md +8 -0
  36. package/dist/packages/cli/package.json +2 -2
  37. package/dist/packages/cli/package.json.bak +2 -2
  38. package/dist/packages/core/CHANGELOG.md +8 -0
  39. package/dist/packages/core/package.json +1 -1
  40. package/dist/packages/core/package.json.bak +1 -1
  41. package/dist/packages/design-tokens/CHANGELOG.md +8 -0
  42. package/dist/packages/design-tokens/package.json +1 -1
  43. package/dist/packages/playground/browser/{chunk-CcRAf-SI.js → chunk-BDJ6g_eZ.js} +1 -1
  44. package/dist/packages/playground/browser/{chunk-rUmdxUDA.js → chunk-BKu6N-zK.js} +1 -1
  45. package/dist/packages/playground/browser/{chunk-CeWsvybE.js → chunk-BRY4TA8M.js} +1 -1
  46. package/dist/packages/playground/browser/{chunk-CR9pdAu4.js → chunk-BdpxuY7o.js} +1 -1
  47. package/dist/packages/playground/browser/{chunk-BfTgubd-.js → chunk-C18SRlXx.js} +1 -1
  48. package/dist/packages/playground/browser/{chunk-C9TW72xp.js → chunk-ClEEX1ib.js} +1 -1
  49. package/dist/packages/playground/browser/{chunk-BDvJAz2Z.js → chunk-D8i35nMZ.js} +1 -1
  50. package/dist/packages/playground/browser/{chunk-DBaAs95p.js → chunk-DPJ2_PnQ.js} +1 -1
  51. package/dist/packages/playground/browser/{chunk--xdAQ9AM.js → chunk-DpG_PyU_.js} +1 -1
  52. package/dist/packages/playground/browser/{chunk-CCN2KoWz.js → chunk-FPNisYyW.js} +1 -1
  53. package/dist/packages/playground/browser/{chunk-CW1H0x80.js → chunk-IRlAEjxV.js} +1 -1
  54. package/dist/packages/playground/browser/{chunk-UVpCaxmD.js → chunk-MmjtX4PA.js} +1 -1
  55. package/dist/packages/playground/browser/{chunk-COiPNsUk.js → chunk-kBISgbOR.js} +1 -1
  56. package/dist/packages/playground/browser/{chunk-wSEtHeaq.js → chunk-kdIujLCE.js} +1 -1
  57. package/dist/packages/playground/browser/{chunk-DB3lTZW4.js → chunk-lkXWJECn.js} +1 -1
  58. package/dist/packages/playground/browser/index.html +1 -1
  59. package/dist/packages/playground/browser/main-CD73IVQX.js +744 -0
  60. package/package.json +1 -1
  61. package/packages/angular-renderer/CHANGELOG.md +25 -0
  62. package/packages/angular-renderer/package.json +3 -3
  63. package/packages/angular-renderer/src/adapters/web/adapter.ts +5 -2
  64. package/packages/angular-renderer/src/components/primitives/card/card.component.html +3 -1
  65. package/packages/angular-renderer/src/components/primitives/card/card.component.scss +40 -10
  66. package/packages/angular-renderer/src/components/primitives/card/card.component.ts +55 -2
  67. package/packages/angular-renderer/src/components/primitives/container/container.component.html +12 -0
  68. package/packages/angular-renderer/src/components/primitives/container/container.component.scss +9 -0
  69. package/packages/angular-renderer/src/components/primitives/container/container.component.ts +65 -0
  70. package/packages/angular-renderer/src/components/primitives/date-picker/date-picker.component.html +73 -0
  71. package/packages/angular-renderer/src/components/primitives/date-picker/date-picker.component.scss +77 -0
  72. package/packages/angular-renderer/src/components/primitives/date-picker/date-picker.component.ts +294 -0
  73. package/packages/angular-renderer/src/components/primitives/date-range-picker/date-range-picker.component.html +83 -0
  74. package/packages/angular-renderer/src/components/primitives/date-range-picker/date-range-picker.component.scss +92 -0
  75. package/packages/angular-renderer/src/components/primitives/date-range-picker/date-range-picker.component.ts +357 -0
  76. package/packages/angular-renderer/src/components/primitives/divider/divider.component.html +5 -0
  77. package/packages/angular-renderer/src/components/primitives/divider/divider.component.scss +60 -0
  78. package/packages/angular-renderer/src/components/primitives/divider/divider.component.ts +92 -0
  79. package/packages/angular-renderer/src/components/primitives/grid/grid.component.html +9 -0
  80. package/packages/angular-renderer/src/components/primitives/grid/grid.component.scss +51 -0
  81. package/packages/angular-renderer/src/components/primitives/grid/grid.component.ts +117 -0
  82. package/packages/angular-renderer/src/components/primitives/stack/stack.component.html +9 -0
  83. package/packages/angular-renderer/src/components/primitives/stack/stack.component.scss +44 -0
  84. package/packages/angular-renderer/src/components/primitives/stack/stack.component.ts +106 -0
  85. package/packages/angular-renderer/src/components/primitives/time-picker/time-picker.component.html +65 -0
  86. package/packages/angular-renderer/src/components/primitives/time-picker/time-picker.component.scss +65 -0
  87. package/packages/angular-renderer/src/components/primitives/time-picker/time-picker.component.ts +229 -0
  88. package/packages/angular-renderer/src/index.ts +9 -1
  89. package/packages/angular-renderer/src/lib/primitives.provider.ts +14 -0
  90. package/packages/cli/CHANGELOG.md +8 -0
  91. package/packages/cli/package.json +2 -2
  92. package/packages/core/CHANGELOG.md +8 -0
  93. package/packages/core/package.json +1 -1
  94. package/packages/design-tokens/CHANGELOG.md +8 -0
  95. package/packages/design-tokens/package.json +1 -1
  96. package/packages/devtools/CHANGELOG.md +8 -0
  97. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  98. package/packages/devtools/package.json +3 -3
  99. package/packages/playground/CHANGELOG.md +8 -0
  100. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  101. package/packages/playground/package.json +3 -3
  102. package/dist/packages/playground/browser/main-QKXZMSV7.js +0 -737
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@origostudio/origo-design",
3
- "version": "0.0.50",
3
+ "version": "0.0.52",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,3 +1,28 @@
1
+ ## 0.0.52 (2026-10-09)
2
+
3
+ ### 🚀 Features
4
+
5
+ - add divider component for angular renderer ([221ded8](https://github.com/OrigoStudio/origo-design/commit/221ded8))
6
+ - add application layout primitives and update card component implementation ([5153adc](https://github.com/OrigoStudio/origo-design/commit/5153adc))
7
+ - add CardComponent primitive and export it in angular-renderer ([2f62893](https://github.com/OrigoStudio/origo-design/commit/2f62893))
8
+ - **angular-renderer:** add new primitive components including card, container, divider, grid, and stack ([fd14eb4](https://github.com/OrigoStudio/origo-design/commit/fd14eb4))
9
+
10
+ ### ❤️ Thank You
11
+
12
+ - Hardik Patel @hardikpatelse
13
+
14
+ ## 0.0.51 (2026-10-08)
15
+
16
+ ### 🚀 Features
17
+
18
+ - add DatePickerComponent primitive for Angular renderer ([6746c8e](https://github.com/OrigoStudio/origo-design/commit/6746c8e))
19
+ - add date-picker, time-picker, and date-range-picker primitive components ([25530e1](https://github.com/OrigoStudio/origo-design/commit/25530e1))
20
+ - add date-picker, date-range-picker, and time-picker primitive components to angular renderer ([649dadc](https://github.com/OrigoStudio/origo-design/commit/649dadc))
21
+
22
+ ### ❤️ Thank You
23
+
24
+ - Hardik Patel @hardikpatelse
25
+
1
26
  ## 0.0.50 (2026-10-08)
2
27
 
3
28
  ### 🚀 Features
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@origostudio/angular-renderer",
3
- "version": "0.0.50",
3
+ "version": "0.0.52",
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.50",
10
- "@origostudio/design-tokens": "0.0.50",
9
+ "@origostudio/core": "0.0.52",
10
+ "@origostudio/design-tokens": "0.0.52",
11
11
  "tslib": "^2.3.0",
12
12
  "@analogjs/vite-plugin-angular": "^2.7.1",
13
13
  "zone.js": "^0.16.3",
@@ -2,8 +2,11 @@ import { Injectable, ViewContainerRef, Signal, InputSignal } from '@angular/core
2
2
  import { ASTNode, InteractionContract } from '@origostudio/core';
3
3
 
4
4
  export interface ContainerComponent {
5
- viewContainerRef?: ViewContainerRef | Signal<ViewContainerRef>;
6
- vc?: ViewContainerRef | Signal<ViewContainerRef>;
5
+ viewContainerRef?:
6
+ | ViewContainerRef
7
+ | Signal<ViewContainerRef>
8
+ | Signal<ViewContainerRef | undefined>;
9
+ vc?: ViewContainerRef | Signal<ViewContainerRef> | Signal<ViewContainerRef | undefined>;
7
10
  }
8
11
 
9
12
  export interface OrigoAdapter<TProps = Record<string, unknown>> {
@@ -5,7 +5,7 @@
5
5
  </div>
6
6
  }
7
7
 
8
- @if (computedTitle() !== undefined || computedSubtitle() !== undefined) {
8
+ @if (hasContent()) {
9
9
  <div class="origo-card-content">
10
10
  @if (computedTitle() !== undefined && computedTitle() !== '') {
11
11
  <div class="origo-card-title" role="heading" aria-level="3">{{ computedTitle() }}</div>
@@ -13,6 +13,8 @@
13
13
  @if (computedSubtitle() !== undefined && computedSubtitle() !== '') {
14
14
  <div class="origo-card-subtitle">{{ computedSubtitle() }}</div>
15
15
  }
16
+ <ng-container #vc></ng-container>
17
+ <ng-content></ng-content>
16
18
  </div>
17
19
  }
18
20
  </div>
@@ -3,14 +3,44 @@
3
3
  width: 100%;
4
4
  }
5
5
 
6
+ :host(.origo-card--elevation-sm) .origo-card-container {
7
+ box-shadow: var(--origo-shadow-sm);
8
+ }
9
+ :host(.origo-card--elevation-md) .origo-card-container {
10
+ box-shadow: var(--origo-shadow-md);
11
+ }
12
+ :host(.origo-card--elevation-lg) .origo-card-container {
13
+ box-shadow: var(--origo-shadow-lg);
14
+ }
15
+ :host(.origo-card--clickable) .origo-card-container {
16
+ cursor: pointer;
17
+ }
18
+ :host(.origo-card--hoverable) .origo-card-container:hover {
19
+ box-shadow: var(--origo-shadow-md);
20
+ }
21
+
6
22
  .origo-card-container {
7
23
  display: flex;
8
24
  flex-direction: column;
9
25
  width: 100%;
10
- border-radius: var(--origo-radius-sm, 4px);
11
- border: 1px solid var(--origo-color-border-default, #ccc);
12
- background-color: var(--origo-color-surface-background, #fff);
26
+ border-radius: var(--origo-radius-sm);
27
+ border: 1px solid var(--origo-color-border-default);
28
+ background-color: var(--origo-color-surface-background);
13
29
  overflow: hidden;
30
+ transition:
31
+ box-shadow var(--origo-transition-fast, 0.2s ease-in-out),
32
+ border-color var(--origo-transition-fast, 0.2s ease-in-out),
33
+ background-color var(--origo-transition-fast, 0.2s ease-in-out);
34
+ }
35
+
36
+ /* Variant Overrides */
37
+ :host(.origo-card--variant-outline) .origo-card-container {
38
+ background-color: transparent;
39
+ border-color: var(--origo-color-border-strong, #ccc);
40
+ }
41
+ :host(.origo-card--variant-ghost) .origo-card-container {
42
+ background-color: transparent;
43
+ border-color: transparent;
14
44
  }
15
45
 
16
46
  .origo-card-image {
@@ -27,21 +57,21 @@
27
57
  .origo-card-content {
28
58
  display: flex;
29
59
  flex-direction: column;
30
- padding-inline-start: var(--origo-spacing-container-padding, 16px);
31
- padding-inline-end: var(--origo-spacing-container-padding, 16px);
32
- padding-block: var(--origo-spacing-container-padding, 16px);
33
- gap: var(--origo-spacing-element-gap, 8px);
60
+ padding-inline-start: var(--origo-spacing-container-padding);
61
+ padding-inline-end: var(--origo-spacing-container-padding);
62
+ padding-block: var(--origo-spacing-container-padding);
63
+ gap: var(--origo-spacing-element-gap);
34
64
  text-align: start;
35
- color: var(--origo-color-text-primary, #333);
65
+ color: var(--origo-color-text-primary);
36
66
  font-family: var(--origo-typography-input-font-family, inherit);
37
67
  }
38
68
 
39
69
  .origo-card-title {
40
- font-size: calc(var(--origo-typography-input-font-size, 14px) * 1.25);
70
+ font-size: calc(var(--origo-typography-input-font-size) * 1.25);
41
71
  font-weight: 600;
42
72
  }
43
73
 
44
74
  .origo-card-subtitle {
45
- font-size: var(--origo-typography-input-font-size, 14px);
75
+ font-size: var(--origo-typography-input-font-size);
46
76
  opacity: 0.8;
47
77
  }
@@ -6,10 +6,12 @@ import {
6
6
  ViewEncapsulation,
7
7
  inject,
8
8
  SecurityContext,
9
+ viewChild,
10
+ ViewContainerRef,
9
11
  } from '@angular/core';
10
12
  import { DomSanitizer } from '@angular/platform-browser';
11
13
  import { InteractionContract } from '@origostudio/core';
12
- import { OrigoAdapter } from '../../../adapters/web/adapter';
14
+ import { OrigoAdapter, ContainerComponent } from '../../../adapters/web/adapter';
13
15
 
14
16
  export interface CardProps {
15
17
  permissions?: Record<string, string>;
@@ -21,6 +23,10 @@ export interface CardProps {
21
23
  imageAlt?: string;
22
24
  'aria-label'?: string;
23
25
  'aria-describedby'?: string;
26
+ elevation?: 'none' | 'sm' | 'md' | 'lg';
27
+ variant?: string;
28
+ clickable?: boolean;
29
+ hoverable?: boolean;
24
30
  }
25
31
 
26
32
  @Component({
@@ -35,9 +41,22 @@ export interface CardProps {
35
41
  '[attr.data-testid]': 'contract().id',
36
42
  '[attr.aria-label]': 'computedAriaLabel()',
37
43
  '[attr.aria-describedby]': 'computedAriaDescribedBy()',
44
+ '[attr.tabindex]': 'isClickable() ? "0" : null',
45
+ '[attr.role]': '"article"',
46
+ '(keydown.enter)': 'onKeydown($event)',
47
+ '(keydown.space)': 'onKeydown($event)',
48
+ '[class.origo-card--elevation-none]': 'computedElevation() === "none"',
49
+ '[class.origo-card--elevation-sm]': 'computedElevation() === "sm"',
50
+ '[class.origo-card--elevation-md]': 'computedElevation() === "md"',
51
+ '[class.origo-card--elevation-lg]': 'computedElevation() === "lg"',
52
+ '[class.origo-card--variant-solid]': 'computedVariant() === "solid"',
53
+ '[class.origo-card--variant-outline]': 'computedVariant() === "outline"',
54
+ '[class.origo-card--variant-ghost]': 'computedVariant() === "ghost"',
55
+ '[class.origo-card--hoverable]': 'isHoverable()',
56
+ '[class.origo-card--clickable]': 'isClickable()',
38
57
  },
39
58
  })
40
- export class CardComponent implements OrigoAdapter<CardProps> {
59
+ export class CardComponent implements OrigoAdapter<CardProps>, ContainerComponent {
41
60
  static readonly contractSchema = {
42
61
  permissions: 'object',
43
62
  rules: 'object',
@@ -46,10 +65,15 @@ export class CardComponent implements OrigoAdapter<CardProps> {
46
65
  subtitle: 'string',
47
66
  imageUrl: 'string',
48
67
  imageAlt: 'string',
68
+ elevation: 'string',
69
+ variant: 'string',
70
+ clickable: 'boolean',
71
+ hoverable: 'boolean',
49
72
  };
50
73
  static readonly strictContract = false;
51
74
 
52
75
  contract = input.required<InteractionContract<CardProps>>();
76
+ vc = viewChild('vc', { read: ViewContainerRef });
53
77
 
54
78
  private sanitizer = inject(DomSanitizer);
55
79
 
@@ -86,4 +110,33 @@ export class CardComponent implements OrigoAdapter<CardProps> {
86
110
  const desc = this.contract().props?.['aria-describedby'];
87
111
  return desc !== undefined && desc !== null ? String(desc) : undefined;
88
112
  });
113
+
114
+ computedElevation = computed(() => this.contract().props?.elevation || 'none');
115
+
116
+ computedVariant = computed(() => this.contract().props?.variant || 'solid');
117
+
118
+ hasContent = computed(() => {
119
+ const hasTitle = !!this.computedTitle();
120
+ const hasSubtitle = !!this.computedSubtitle();
121
+ const children = this.contract().children;
122
+ const hasChildren = children ? children.length > 0 : false;
123
+ return hasTitle || hasSubtitle || hasChildren;
124
+ });
125
+
126
+ isClickable = computed(() => {
127
+ const c = this.contract().props?.clickable;
128
+ return c === true || String(c) === 'true';
129
+ });
130
+
131
+ isHoverable = computed(() => {
132
+ const h = this.contract().props?.hoverable;
133
+ return h === true || String(h) === 'true';
134
+ });
135
+
136
+ onKeydown(event: Event) {
137
+ if (this.isClickable() && event.target === event.currentTarget) {
138
+ event.preventDefault();
139
+ (event.target as HTMLElement).click();
140
+ }
141
+ }
89
142
  }
@@ -0,0 +1,12 @@
1
+ <div
2
+ class="origo-container"
3
+ [class.origo-container--fluid]="props().fluid"
4
+ [style.max-width]="props().maxWidth || null"
5
+ [style.padding-inline]="paddingValue || null"
6
+ [style.padding-block]="paddingValue || null"
7
+ [attr.aria-label]="props()['aria-label'] || null"
8
+ [attr.aria-describedby]="props()['aria-describedby'] || null"
9
+ >
10
+ <ng-container #vc></ng-container>
11
+ <ng-content></ng-content>
12
+ </div>
@@ -0,0 +1,9 @@
1
+ .origo-container {
2
+ box-sizing: border-box;
3
+ width: 100%;
4
+ margin-inline: auto; // Centers horizontally if max-width is applied
5
+ }
6
+
7
+ .origo-container--fluid {
8
+ max-width: 100% !important;
9
+ }
@@ -0,0 +1,65 @@
1
+ import {
2
+ Component,
3
+ input,
4
+ viewChild,
5
+ ViewContainerRef,
6
+ computed,
7
+ ChangeDetectionStrategy,
8
+ ViewEncapsulation,
9
+ } from '@angular/core';
10
+ import { InteractionContract } from '@origostudio/core';
11
+ import {
12
+ OrigoAdapter,
13
+ ContainerComponent as IContainerComponent,
14
+ coerceContractProps,
15
+ } from '../../../adapters/web/adapter';
16
+
17
+ export interface ContainerProps {
18
+ fluid?: boolean;
19
+ maxWidth?: string;
20
+ padding?: string | number;
21
+ permissions?: Record<string, string>;
22
+ rules?: Record<string, unknown>;
23
+ metadata?: Record<string, unknown>;
24
+ 'aria-label'?: string;
25
+ 'aria-describedby'?: string;
26
+ }
27
+
28
+ const contractSchema: Record<
29
+ keyof ContainerProps,
30
+ 'string' | 'number' | 'boolean' | 'array' | 'object'
31
+ > = {
32
+ fluid: 'boolean',
33
+ maxWidth: 'string',
34
+ padding: 'string',
35
+ permissions: 'object',
36
+ rules: 'object',
37
+ metadata: 'object',
38
+ 'aria-label': 'string',
39
+ 'aria-describedby': 'string',
40
+ };
41
+
42
+ @Component({
43
+ selector: 'origo-container',
44
+ standalone: true,
45
+ templateUrl: './container.component.html',
46
+ styleUrl: './container.component.scss',
47
+ changeDetection: ChangeDetectionStrategy.OnPush,
48
+ encapsulation: ViewEncapsulation.ShadowDom,
49
+ })
50
+ export class ContainerComponent implements OrigoAdapter<ContainerProps>, IContainerComponent {
51
+ static readonly contractSchema = contractSchema;
52
+
53
+ contract = input.required<InteractionContract<ContainerProps>>();
54
+ vc = viewChild.required('vc', { read: ViewContainerRef });
55
+
56
+ protected props = computed(() =>
57
+ coerceContractProps<ContainerProps>(this.contract().props, contractSchema)
58
+ );
59
+
60
+ protected get paddingValue(): string {
61
+ const p = this.props().padding;
62
+ if (typeof p === 'number' || /^\d+$/.test(String(p))) return `${p}px`;
63
+ return (p as string) || '';
64
+ }
65
+ }
@@ -0,0 +1,73 @@
1
+ <div class="origo-date-picker-wrapper">
2
+ <input
3
+ type="text"
4
+ class="origo-date-picker__input"
5
+ readonly
6
+ inputmode="none"
7
+ [value]="displayValue()"
8
+ (click)="toggleCalendar()"
9
+ (keydown)="onInputKeyDown($event)"
10
+ [attr.aria-label]="computedAriaLabel()"
11
+ aria-haspopup="grid"
12
+ [attr.aria-expanded]="isOpen()"
13
+ />
14
+
15
+ @if (isOpen()) {
16
+ <div class="origo-date-picker__calendar" role="grid" aria-label="Calendar">
17
+ <div class="origo-date-picker__header">
18
+ <button type="button" (click)="prevMonth()" aria-label="Previous Month">&lt;</button>
19
+ <span aria-live="polite">{{ currentMonthYear() }}</span>
20
+ <button type="button" (click)="nextMonth()" aria-label="Next Month">&gt;</button>
21
+ </div>
22
+
23
+ <div role="row" class="origo-date-picker__weekdays">
24
+ @for (day of weekDays; track day) {
25
+ <div role="columnheader">{{ day }}</div>
26
+ }
27
+ </div>
28
+
29
+ <div class="origo-date-picker__days">
30
+ @for (week of calendarGrid(); track $index) {
31
+ <div role="row">
32
+ @for (day of week; track day.date.toISOString()) {
33
+ <div
34
+ role="gridcell"
35
+ [id]="
36
+ 'day-' +
37
+ day.date.getUTCFullYear() +
38
+ '-' +
39
+ day.date.getUTCMonth() +
40
+ '-' +
41
+ day.date.getUTCDate()
42
+ "
43
+ [class.origo-date-picker__day]="true"
44
+ [class.origo-date-picker__day--other-month]="!day.isCurrentMonth"
45
+ [class.origo-date-picker__day--selected]="isSelected(day.date)"
46
+ [class.origo-date-picker__day--disabled]="day.disabled"
47
+ [attr.aria-selected]="isSelected(day.date)"
48
+ [attr.aria-disabled]="day.disabled"
49
+ [attr.tabindex]="
50
+ isSelected(day.date) || (!hasSelection() && day.isToday)
51
+ ? 0
52
+ : day.isCurrentMonth && !hasSelection() && !day.disabled
53
+ ? 0
54
+ : -1
55
+ "
56
+ (click)="
57
+ selectDate(
58
+ day.date.getUTCFullYear(),
59
+ day.date.getUTCMonth(),
60
+ day.date.getUTCDate()
61
+ )
62
+ "
63
+ (keydown)="onDayKeyDown($event, day.date)"
64
+ >
65
+ {{ day.date.getUTCDate() }}
66
+ </div>
67
+ }
68
+ </div>
69
+ }
70
+ </div>
71
+ </div>
72
+ }
73
+ </div>
@@ -0,0 +1,77 @@
1
+ :host {
2
+ display: block;
3
+ position: relative;
4
+ font-family: var(--origo-typography-body-font-family);
5
+ }
6
+
7
+ .origo-date-picker__input {
8
+ width: 100%;
9
+ padding: var(--origo-spacing-sm) var(--origo-spacing-md);
10
+ border: 1px solid var(--origo-color-neutral-300);
11
+ border-radius: var(--origo-border-radius-md);
12
+ background-color: var(--origo-color-surface-default);
13
+ cursor: pointer;
14
+ }
15
+
16
+ .origo-date-picker__calendar {
17
+ position: absolute;
18
+ top: calc(100% + var(--origo-spacing-xs));
19
+ left: 0;
20
+ z-index: 1000;
21
+ background: var(--origo-color-surface-default);
22
+ border: 1px solid var(--origo-color-neutral-200);
23
+ border-radius: var(--origo-border-radius-md);
24
+ box-shadow: var(--origo-shadow-md);
25
+ padding: var(--origo-spacing-md);
26
+ min-width: 280px;
27
+ }
28
+
29
+ .origo-date-picker__header {
30
+ display: flex;
31
+ justify-content: space-between;
32
+ align-items: center;
33
+ margin-bottom: var(--origo-spacing-md);
34
+ font-weight: bold;
35
+ }
36
+
37
+ .origo-date-picker__weekdays,
38
+ .origo-date-picker__days > div {
39
+ display: grid;
40
+ grid-template-columns: repeat(7, 1fr);
41
+ text-align: center;
42
+ gap: var(--origo-spacing-xs);
43
+ }
44
+
45
+ .origo-date-picker__weekdays {
46
+ font-size: 0.85em;
47
+ color: var(--origo-color-neutral-500);
48
+ margin-bottom: var(--origo-spacing-sm);
49
+ }
50
+
51
+ .origo-date-picker__day {
52
+ padding: var(--origo-spacing-sm) var(--origo-spacing-xs);
53
+ border-radius: var(--origo-border-radius-sm);
54
+ cursor: pointer;
55
+ }
56
+
57
+ .origo-date-picker__day:hover:not(.origo-date-picker__day--disabled) {
58
+ background-color: var(--origo-color-neutral-100);
59
+ }
60
+
61
+ .origo-date-picker__day--disabled {
62
+ opacity: 0.5;
63
+ cursor: not-allowed;
64
+ }
65
+
66
+ .origo-date-picker__day--other-month {
67
+ color: var(--origo-color-neutral-400);
68
+ }
69
+
70
+ .origo-date-picker__day--selected {
71
+ background-color: var(--origo-color-primary-main);
72
+ color: var(--origo-color-surface-default);
73
+ }
74
+
75
+ .origo-date-picker__day--selected:hover:not(.origo-date-picker__day--disabled) {
76
+ background-color: var(--origo-color-primary-dark);
77
+ }