@origostudio/origo-design 0.0.55 → 0.0.56

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 (88) hide show
  1. package/CHANGELOG.md +4 -4
  2. package/dist/packages/angular-renderer/CHANGELOG.md +11 -0
  3. package/dist/packages/angular-renderer/package.json +3 -3
  4. package/dist/packages/angular-renderer/src/components/primitives/dialog/dialog.component.d.ts +153 -0
  5. package/dist/packages/angular-renderer/src/components/primitives/dialog/dialog.component.js +346 -0
  6. package/dist/packages/angular-renderer/src/components/primitives/dialog/dialog.component.js.map +1 -0
  7. package/dist/packages/angular-renderer/src/components/primitives/drawer/drawer.component.d.ts +93 -0
  8. package/dist/packages/angular-renderer/src/components/primitives/drawer/drawer.component.js +205 -0
  9. package/dist/packages/angular-renderer/src/components/primitives/drawer/drawer.component.js.map +1 -0
  10. package/dist/packages/angular-renderer/src/components/primitives/modal/modal.component.d.ts +106 -0
  11. package/dist/packages/angular-renderer/src/components/primitives/modal/modal.component.js +61 -0
  12. package/dist/packages/angular-renderer/src/components/primitives/modal/modal.component.js.map +1 -0
  13. package/dist/packages/angular-renderer/src/components/primitives/popover/popover.component.d.ts +82 -0
  14. package/dist/packages/angular-renderer/src/components/primitives/popover/popover.component.js +280 -0
  15. package/dist/packages/angular-renderer/src/components/primitives/popover/popover.component.js.map +1 -0
  16. package/dist/packages/angular-renderer/src/components/primitives/tooltip/tooltip.component.d.ts +86 -0
  17. package/dist/packages/angular-renderer/src/components/primitives/tooltip/tooltip.component.js +272 -0
  18. package/dist/packages/angular-renderer/src/components/primitives/tooltip/tooltip.component.js.map +1 -0
  19. package/dist/packages/angular-renderer/src/index.d.ts +5 -0
  20. package/dist/packages/angular-renderer/src/index.js +5 -0
  21. package/dist/packages/angular-renderer/src/index.js.map +1 -1
  22. package/dist/packages/angular-renderer/src/lib/overlay/overlay-ref.d.ts +13 -0
  23. package/dist/packages/angular-renderer/src/lib/overlay/overlay-ref.js +18 -0
  24. package/dist/packages/angular-renderer/src/lib/overlay/overlay-ref.js.map +1 -1
  25. package/dist/packages/angular-renderer/src/lib/overlay/overlay.models.d.ts +10 -0
  26. package/dist/packages/angular-renderer/src/lib/primitives.provider.js +11 -0
  27. package/dist/packages/angular-renderer/src/lib/primitives.provider.js.map +1 -1
  28. package/dist/packages/cli/CHANGELOG.md +4 -0
  29. package/dist/packages/cli/package.json +2 -2
  30. package/dist/packages/cli/package.json.bak +2 -2
  31. package/dist/packages/core/CHANGELOG.md +4 -0
  32. package/dist/packages/core/package.json +1 -1
  33. package/dist/packages/core/package.json.bak +1 -1
  34. package/dist/packages/design-tokens/CHANGELOG.md +4 -0
  35. package/dist/packages/design-tokens/package.json +1 -1
  36. package/dist/packages/playground/browser/{chunk-COdU4TAE.js → chunk-1EpKMVqg.js} +1 -1
  37. package/dist/packages/playground/browser/{chunk-FZuwRWVL.js → chunk-99Z1ZSho.js} +1 -1
  38. package/dist/packages/playground/browser/{chunk-ChIFPhYz.js → chunk-B6I7DcL1.js} +1 -1
  39. package/dist/packages/playground/browser/{chunk-xkhVqkfX.js → chunk-BJUlPnGj.js} +1 -1
  40. package/dist/packages/playground/browser/{chunk-BtTuZVyy.js → chunk-BQzQEZtb.js} +1 -1
  41. package/dist/packages/playground/browser/{chunk-CkxX-6B-.js → chunk-BhCIuVBX.js} +1 -1
  42. package/dist/packages/playground/browser/{chunk-DYVZHQvW.js → chunk-CKodZfQB.js} +1 -1
  43. package/dist/packages/playground/browser/{chunk-DhQakfe5.js → chunk-CVI627RV.js} +1 -1
  44. package/dist/packages/playground/browser/{chunk-DT7XZi8x.js → chunk-ClkrBRsl.js} +1 -1
  45. package/dist/packages/playground/browser/{chunk-x-oQTX69.js → chunk-D9WDO3Mq.js} +1 -1
  46. package/dist/packages/playground/browser/{chunk-CsaBv_7w.js → chunk-DFbzJcTS.js} +1 -1
  47. package/dist/packages/playground/browser/{chunk-DYyPC2oE.js → chunk-DiYrE5js.js} +1 -1
  48. package/dist/packages/playground/browser/{chunk-DVT-phDq.js → chunk-Dq1v5PE5.js} +1 -1
  49. package/dist/packages/playground/browser/{chunk-BrNyIaRu.js → chunk-DyacuCzl.js} +1 -1
  50. package/dist/packages/playground/browser/{chunk-1qL4kcgA.js → chunk-YNHZb2Tp.js} +1 -1
  51. package/dist/packages/playground/browser/index.html +1 -1
  52. package/dist/packages/playground/browser/main-LRA6JC6Y.js +894 -0
  53. package/package.json +1 -1
  54. package/packages/angular-renderer/CHANGELOG.md +11 -0
  55. package/packages/angular-renderer/package.json +3 -3
  56. package/packages/angular-renderer/src/components/primitives/dialog/dialog.component.html +49 -0
  57. package/packages/angular-renderer/src/components/primitives/dialog/dialog.component.scss +102 -0
  58. package/packages/angular-renderer/src/components/primitives/dialog/dialog.component.ts +415 -0
  59. package/packages/angular-renderer/src/components/primitives/drawer/drawer.component.html +38 -0
  60. package/packages/angular-renderer/src/components/primitives/drawer/drawer.component.scss +76 -0
  61. package/packages/angular-renderer/src/components/primitives/drawer/drawer.component.ts +248 -0
  62. package/packages/angular-renderer/src/components/primitives/modal/modal.component.html +13 -0
  63. package/packages/angular-renderer/src/components/primitives/modal/modal.component.scss +3 -0
  64. package/packages/angular-renderer/src/components/primitives/modal/modal.component.ts +56 -0
  65. package/packages/angular-renderer/src/components/primitives/popover/popover.component.html +41 -0
  66. package/packages/angular-renderer/src/components/primitives/popover/popover.component.scss +77 -0
  67. package/packages/angular-renderer/src/components/primitives/popover/popover.component.ts +345 -0
  68. package/packages/angular-renderer/src/components/primitives/tooltip/tooltip.component.html +27 -0
  69. package/packages/angular-renderer/src/components/primitives/tooltip/tooltip.component.scss +30 -0
  70. package/packages/angular-renderer/src/components/primitives/tooltip/tooltip.component.ts +330 -0
  71. package/packages/angular-renderer/src/index.ts +5 -0
  72. package/packages/angular-renderer/src/lib/overlay/overlay-ref.ts +31 -0
  73. package/packages/angular-renderer/src/lib/overlay/overlay.models.ts +10 -0
  74. package/packages/angular-renderer/src/lib/primitives.provider.ts +11 -0
  75. package/packages/angular-renderer/src/styles/overlay.scss +70 -26
  76. package/packages/cli/CHANGELOG.md +4 -0
  77. package/packages/cli/package.json +2 -2
  78. package/packages/core/CHANGELOG.md +4 -0
  79. package/packages/core/package.json +1 -1
  80. package/packages/design-tokens/CHANGELOG.md +4 -0
  81. package/packages/design-tokens/package.json +1 -1
  82. package/packages/devtools/CHANGELOG.md +4 -0
  83. package/packages/devtools/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  84. package/packages/devtools/package.json +3 -3
  85. package/packages/playground/CHANGELOG.md +4 -0
  86. package/packages/playground/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  87. package/packages/playground/package.json +3 -3
  88. package/dist/packages/playground/browser/main-UNDFLKYI.js +0 -889
@@ -0,0 +1,76 @@
1
+ :host {
2
+ display: contents;
3
+ }
4
+
5
+ .origo-drawer {
6
+ display: flex;
7
+ flex-direction: column;
8
+ box-sizing: border-box;
9
+ inline-size: 100%;
10
+ block-size: 100%;
11
+ background-color: var(--origo-color-surface-overlay, var(--origo-color-surface-primary));
12
+ color: var(--origo-color-text-primary);
13
+ box-shadow: var(--origo-shadow-xl, var(--origo-shadow-lg));
14
+ overflow: hidden;
15
+ outline: none;
16
+
17
+ &__header {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: space-between;
21
+ padding-inline: var(--origo-space-md);
22
+ padding-block: var(--origo-space-md);
23
+ border-block-end: var(--origo-border-width-default) solid var(--origo-color-border-subtle);
24
+ background-color: var(--origo-color-surface-secondary);
25
+ gap: var(--origo-space-sm);
26
+ }
27
+
28
+ &__title {
29
+ margin: 0;
30
+ font-size: var(--origo-font-size-lg);
31
+ font-weight: var(--origo-font-weight-semibold);
32
+ color: var(--origo-color-text-primary);
33
+ line-height: var(--origo-line-height-tight);
34
+ }
35
+
36
+ &__close {
37
+ display: inline-flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ border: none;
41
+ background: transparent;
42
+ color: var(--origo-color-text-secondary);
43
+ border-radius: var(--origo-radius-sm);
44
+ padding-inline: var(--origo-space-xs);
45
+ padding-block: var(--origo-space-xs);
46
+ cursor: pointer;
47
+ font-size: var(--origo-font-size-md);
48
+ line-height: 1;
49
+ margin-inline-start: auto;
50
+
51
+ &:hover {
52
+ background-color: var(--origo-color-action-hover);
53
+ color: var(--origo-color-text-primary);
54
+ }
55
+
56
+ &:focus-visible {
57
+ outline: var(--origo-border-width-focus) solid var(--origo-color-focus-ring);
58
+ outline-offset: var(--origo-space-xxs);
59
+ }
60
+ }
61
+
62
+ &__content {
63
+ padding-inline: var(--origo-space-md);
64
+ padding-block: var(--origo-space-md);
65
+ flex: 1 1 auto;
66
+ overflow-y: auto;
67
+ color: var(--origo-color-text-primary);
68
+ }
69
+
70
+ &__footer {
71
+ padding-inline: var(--origo-space-md);
72
+ padding-block: var(--origo-space-md);
73
+ border-block-start: var(--origo-border-width-default) solid var(--origo-color-border-subtle);
74
+ background-color: var(--origo-color-surface-secondary);
75
+ }
76
+ }
@@ -0,0 +1,248 @@
1
+ import {
2
+ Component,
3
+ input,
4
+ output,
5
+ ChangeDetectionStrategy,
6
+ ViewEncapsulation,
7
+ inject,
8
+ viewChild,
9
+ ViewContainerRef,
10
+ TemplateRef,
11
+ computed,
12
+ effect,
13
+ DestroyRef,
14
+ } from '@angular/core';
15
+ import { InteractionContract } from '@origostudio/core';
16
+ import {
17
+ OrigoAdapter,
18
+ ContainerComponent,
19
+ coerceContractProps,
20
+ } from '../../../adapters/web/adapter';
21
+ import { WebExperienceAdapterService } from '../../../adapters/web/experience-adapter.service';
22
+ import { OrigoOverlayService } from '../../../lib/overlay/overlay.service';
23
+ import { OrigoOverlayConfig, OrigoOverlayRef } from '../../../lib/overlay/overlay.models';
24
+
25
+ let drawerCounter = 0;
26
+
27
+ export interface DrawerProps {
28
+ visible?: boolean;
29
+ position?: 'left' | 'right' | 'top' | 'bottom';
30
+ modal?: boolean;
31
+ dismissible?: boolean;
32
+ closeOnEscape?: boolean;
33
+ blockScroll?: boolean;
34
+ size?: string;
35
+ header?: string;
36
+ footer?: string;
37
+ closable?: boolean;
38
+ data?: unknown;
39
+ permissions?: Record<string, string>;
40
+ rules?: Record<string, unknown>;
41
+ metadata?: Record<string, unknown>;
42
+ 'aria-label'?: string;
43
+ 'aria-describedby'?: string;
44
+ }
45
+
46
+ export const DrawerContractSchema = {
47
+ permissions: 'object',
48
+ rules: 'object',
49
+ metadata: 'object',
50
+ 'aria-label': 'string',
51
+ 'aria-describedby': 'string',
52
+ visible: 'boolean',
53
+ position: 'string',
54
+ modal: 'boolean',
55
+ dismissible: 'boolean',
56
+ closeOnEscape: 'boolean',
57
+ blockScroll: 'boolean',
58
+ size: 'string',
59
+ header: 'string',
60
+ footer: 'string',
61
+ closable: 'boolean',
62
+ data: 'object',
63
+ } as const;
64
+
65
+ @Component({
66
+ selector: 'origo-drawer',
67
+ standalone: true,
68
+ templateUrl: './drawer.component.html',
69
+ styleUrls: ['./drawer.component.scss'],
70
+ changeDetection: ChangeDetectionStrategy.OnPush,
71
+ encapsulation: ViewEncapsulation.ShadowDom,
72
+ host: {
73
+ '[class.origo-drawer-host]': 'true',
74
+ '[attr.data-testid]': 'contract().id',
75
+ },
76
+ })
77
+ export class DrawerComponent implements OrigoAdapter<DrawerProps>, ContainerComponent {
78
+ static readonly contractSchema = DrawerContractSchema;
79
+ static readonly strictContract = false;
80
+
81
+ contract = input.required<InteractionContract<DrawerProps>>();
82
+ vc = viewChild('vc', { read: ViewContainerRef });
83
+
84
+ drawerTemplate = viewChild('drawerTemplate', { read: TemplateRef });
85
+
86
+ visibleChange = output<boolean>();
87
+ open = output<void>();
88
+ close = output<void>();
89
+ show = output<void>();
90
+ hide = output<void>();
91
+
92
+ private overlayService = inject(OrigoOverlayService);
93
+ private destroyRef = inject(DestroyRef);
94
+ private vcr = inject(ViewContainerRef);
95
+ private experienceAdapter = inject(WebExperienceAdapterService);
96
+
97
+ private readonly id = ++drawerCounter;
98
+ readonly headerId = `origo-drawer-header-${this.id}`;
99
+
100
+ private overlayRef: OrigoOverlayRef | null = null;
101
+ private isOpen = false;
102
+
103
+ coercedProps = computed(() =>
104
+ coerceContractProps<DrawerProps>(this.contract()?.props ?? {}, DrawerContractSchema)
105
+ );
106
+
107
+ computedVisible = computed(() => !!this.coercedProps().visible);
108
+ computedPosition = computed(() => this.coercedProps().position ?? 'left');
109
+ computedModal = computed(() => this.coercedProps().modal !== false);
110
+ computedDismissible = computed(() => this.coercedProps().dismissible !== false);
111
+ computedCloseOnEscape = computed(() => this.coercedProps().closeOnEscape !== false);
112
+ computedSize = computed(() => this.coercedProps().size ?? '320px');
113
+ computedHeader = computed(() => this.coercedProps().header);
114
+ computedFooter = computed(() => this.coercedProps().footer);
115
+ computedClosable = computed(() => this.coercedProps().closable !== false);
116
+
117
+ computedAriaLabel = computed(() => {
118
+ const label = this.contract()?.props?.['aria-label'];
119
+ return label !== undefined && label !== null ? String(label) : 'Drawer';
120
+ });
121
+
122
+ computedAriaDescribedBy = computed(() => {
123
+ const desc = this.contract()?.props?.['aria-describedby'];
124
+ return desc !== undefined && desc !== null ? String(desc) : undefined;
125
+ });
126
+
127
+ constructor() {
128
+ effect(() => {
129
+ const visible = this.computedVisible();
130
+ if (visible && !this.isOpen) {
131
+ this.openDrawer();
132
+ } else if (!visible && this.isOpen) {
133
+ this.closeDrawer(false);
134
+ }
135
+ });
136
+
137
+ this.destroyRef.onDestroy(() => {
138
+ this.cleanup();
139
+ });
140
+ }
141
+
142
+ private openDrawer(): void {
143
+ if (this.isOpen) return;
144
+
145
+ const tpl = this.drawerTemplate();
146
+ if (!tpl) return;
147
+
148
+ const pos = this.computedPosition();
149
+ const size = this.computedSize();
150
+
151
+ let alignment: 'start' | 'end' | 'top' | 'bottom' = 'start';
152
+ let width: string | undefined = size;
153
+ let height: string | undefined = '100%';
154
+
155
+ switch (pos) {
156
+ case 'right':
157
+ alignment = 'end';
158
+ width = size;
159
+ height = '100%';
160
+ break;
161
+ case 'top':
162
+ alignment = 'top';
163
+ width = '100%';
164
+ height = size;
165
+ break;
166
+ case 'bottom':
167
+ alignment = 'bottom';
168
+ width = '100%';
169
+ height = size;
170
+ break;
171
+ case 'left':
172
+ default:
173
+ alignment = 'start';
174
+ width = size;
175
+ height = '100%';
176
+ break;
177
+ }
178
+
179
+ const config: OrigoOverlayConfig = {
180
+ position: {
181
+ type: 'global',
182
+ position: alignment,
183
+ width,
184
+ height,
185
+ },
186
+ hasBackdrop: this.computedModal(),
187
+ backdropClass: 'origo-drawer-backdrop',
188
+ panelClass: ['origo-overlay-pane--drawer', `origo-overlay-pane--drawer-${pos}`],
189
+ closeOnBackdropClick: this.computedDismissible(),
190
+ closeOnOutsideClick: this.computedDismissible(),
191
+ closeOnEscape: this.computedCloseOnEscape(),
192
+ trapFocus: this.computedModal(),
193
+ viewContainerRef: this.vcr,
194
+ };
195
+
196
+ this.overlayRef = this.overlayService.create(config, this.destroyRef);
197
+ this.overlayRef.open(tpl, this.vcr);
198
+ this.isOpen = true;
199
+
200
+ this.open.emit();
201
+ this.show.emit();
202
+ this.experienceAdapter.updateState(this.contract().id, 'visible', true);
203
+ this.experienceAdapter.dispatchCapability(this.contract().id, 'open', undefined);
204
+ this.experienceAdapter.dispatchCapability(this.contract().id, 'show', undefined);
205
+
206
+ this.overlayRef.afterClosed().then(result => {
207
+ if (this.isOpen) {
208
+ this.isOpen = false;
209
+ this.visibleChange.emit(false);
210
+ this.close.emit();
211
+ this.hide.emit();
212
+ this.experienceAdapter.updateState(this.contract().id, 'visible', false);
213
+ this.experienceAdapter.dispatchCapability(this.contract().id, 'close', result);
214
+ this.experienceAdapter.dispatchCapability(this.contract().id, 'hide', result);
215
+ }
216
+ });
217
+ }
218
+
219
+ private closeDrawer(notify = true): void {
220
+ if (!this.isOpen) return;
221
+ this.isOpen = false;
222
+
223
+ if (this.overlayRef?.isOpen) {
224
+ this.overlayRef.close();
225
+ }
226
+
227
+ if (notify) {
228
+ this.visibleChange.emit(false);
229
+ this.close.emit();
230
+ this.hide.emit();
231
+ this.experienceAdapter.updateState(this.contract().id, 'visible', false);
232
+ this.experienceAdapter.dispatchCapability(this.contract().id, 'close', undefined);
233
+ this.experienceAdapter.dispatchCapability(this.contract().id, 'hide', undefined);
234
+ }
235
+ }
236
+
237
+ onClose(): void {
238
+ this.closeDrawer(true);
239
+ }
240
+
241
+ private cleanup(): void {
242
+ if (this.overlayRef) {
243
+ this.overlayRef.dispose();
244
+ this.overlayRef = null;
245
+ }
246
+ this.isOpen = false;
247
+ }
248
+ }
@@ -0,0 +1,13 @@
1
+ <origo-dialog
2
+ [contract]="coercedModalContract()"
3
+ (visibleChange)="visibleChange.emit($event)"
4
+ (open)="open.emit()"
5
+ (close)="close.emit()"
6
+ (maximize)="maximize.emit($event)"
7
+ (restore)="restore.emit()"
8
+ (dragEnd)="dragEnd.emit($event)"
9
+ (resizeEnd)="resizeEnd.emit($event)"
10
+ >
11
+ <ng-container #vc></ng-container>
12
+ <ng-content></ng-content>
13
+ </origo-dialog>
@@ -0,0 +1,56 @@
1
+ import {
2
+ Component,
3
+ input,
4
+ output,
5
+ ChangeDetectionStrategy,
6
+ ViewEncapsulation,
7
+ viewChild,
8
+ ViewContainerRef,
9
+ computed,
10
+ } from '@angular/core';
11
+ import { InteractionContract } from '@origostudio/core';
12
+ import { OrigoAdapter, ContainerComponent } from '../../../adapters/web/adapter';
13
+ import { DialogComponent, DialogProps, DialogContractSchema } from '../dialog/dialog.component';
14
+
15
+ export type ModalProps = DialogProps;
16
+ export const ModalContractSchema = DialogContractSchema;
17
+
18
+ @Component({
19
+ selector: 'origo-modal',
20
+ standalone: true,
21
+ imports: [DialogComponent],
22
+ templateUrl: './modal.component.html',
23
+ styleUrls: ['./modal.component.scss'],
24
+ changeDetection: ChangeDetectionStrategy.OnPush,
25
+ encapsulation: ViewEncapsulation.ShadowDom,
26
+ host: {
27
+ '[class.origo-modal-host]': 'true',
28
+ '[attr.data-testid]': 'contract().id',
29
+ },
30
+ })
31
+ export class ModalComponent implements OrigoAdapter<ModalProps>, ContainerComponent {
32
+ static readonly contractSchema = ModalContractSchema;
33
+ static readonly strictContract = false;
34
+
35
+ contract = input.required<InteractionContract<ModalProps>>();
36
+ vc = viewChild('vc', { read: ViewContainerRef });
37
+
38
+ visibleChange = output<boolean>();
39
+ open = output<void>();
40
+ close = output<void>();
41
+ maximize = output<boolean>();
42
+ restore = output<void>();
43
+ dragEnd = output<{ x: number; y: number }>();
44
+ resizeEnd = output<{ width: number; height: number }>();
45
+
46
+ coercedModalContract = computed(() => {
47
+ const origContract = this.contract();
48
+ return {
49
+ ...origContract,
50
+ props: {
51
+ ...(origContract?.props ?? {}),
52
+ modal: true, // Architectural invariant: modal is always strictly true
53
+ },
54
+ };
55
+ });
56
+ }
@@ -0,0 +1,41 @@
1
+ <div
2
+ #triggerWrapper
3
+ class="origo-popover__trigger-wrapper"
4
+ [attr.aria-expanded]="isOpen()"
5
+ [attr.aria-haspopup]="'dialog'"
6
+ (click)="toggle()"
7
+ >
8
+ <ng-content select="[slot=trigger],[trigger]"></ng-content>
9
+ </div>
10
+
11
+ <ng-template #popoverTemplate>
12
+ <div
13
+ role="dialog"
14
+ class="origo-popover"
15
+ [attr.data-testid]="contract().id"
16
+ [attr.aria-label]="computedAriaLabel()"
17
+ [attr.aria-describedby]="computedAriaDescribedBy()"
18
+ >
19
+ @if (computedTitle() || computedShowClose()) {
20
+ <div class="origo-popover__header">
21
+ @if (computedTitle()) {
22
+ <div class="origo-popover__title">{{ computedTitle() }}</div>
23
+ }
24
+ @if (computedShowClose()) {
25
+ <button
26
+ type="button"
27
+ class="origo-popover__close"
28
+ aria-label="Close popover"
29
+ (click)="closePopover()"
30
+ >
31
+ <span class="origo-popover__close-icon">✕</span>
32
+ </button>
33
+ }
34
+ </div>
35
+ }
36
+ <div class="origo-popover__content">
37
+ <ng-container #vc></ng-container>
38
+ <ng-content></ng-content>
39
+ </div>
40
+ </div>
41
+ </ng-template>
@@ -0,0 +1,77 @@
1
+ :host {
2
+ display: inline-block;
3
+ }
4
+
5
+ .origo-popover {
6
+ display: flex;
7
+ flex-direction: column;
8
+ box-sizing: border-box;
9
+ background-color: var(--origo-color-surface-overlay, var(--origo-color-surface-primary));
10
+ color: var(--origo-color-text-primary);
11
+ border-radius: var(--origo-radius-md);
12
+ box-shadow: var(--origo-shadow-lg);
13
+ border: var(--origo-border-width-default) solid var(--origo-color-border-subtle);
14
+ overflow: hidden;
15
+ outline: none;
16
+ min-inline-size: var(--origo-overlay-min-width, var(--origo-size-dropdown-min-width, 11.25rem));
17
+ max-inline-size: min(90vw, var(--origo-overlay-max-width, 22.5rem));
18
+
19
+ &__trigger-wrapper {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ cursor: pointer;
23
+ }
24
+
25
+ &__header {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: space-between;
29
+ padding-inline: var(--origo-space-md);
30
+ padding-block: var(--origo-space-sm);
31
+ border-block-end: var(--origo-border-width-default) solid var(--origo-color-border-subtle);
32
+ background-color: var(--origo-color-surface-secondary);
33
+ gap: var(--origo-space-sm);
34
+ }
35
+
36
+ &__title {
37
+ margin: 0;
38
+ font-size: var(--origo-font-size-md);
39
+ font-weight: var(--origo-font-weight-semibold);
40
+ color: var(--origo-color-text-primary);
41
+ line-height: var(--origo-line-height-tight);
42
+ }
43
+
44
+ &__close {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ border: none;
49
+ background: transparent;
50
+ color: var(--origo-color-text-secondary);
51
+ border-radius: var(--origo-radius-sm);
52
+ padding-inline: var(--origo-space-xs);
53
+ padding-block: var(--origo-space-xs);
54
+ cursor: pointer;
55
+ font-size: var(--origo-font-size-md);
56
+ line-height: 1;
57
+ margin-inline-start: auto;
58
+
59
+ &:hover {
60
+ background-color: var(--origo-color-action-hover);
61
+ color: var(--origo-color-text-primary);
62
+ }
63
+
64
+ &:focus-visible {
65
+ outline: var(--origo-border-width-focus) solid var(--origo-color-focus-ring);
66
+ outline-offset: var(--origo-space-xxs);
67
+ }
68
+ }
69
+
70
+ &__content {
71
+ padding-inline: var(--origo-space-md);
72
+ padding-block: var(--origo-space-md);
73
+ flex: 1 1 auto;
74
+ overflow-y: auto;
75
+ color: var(--origo-color-text-primary);
76
+ }
77
+ }