@epistola.app/valtimo-plugin 0.0.1 → 0.2.0

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 (54) hide show
  1. package/package.json +9 -13
  2. package/ng-package.json +0 -17
  3. package/src/lib/assets/epistola-logo.ts +0 -4
  4. package/src/lib/assets/index.ts +0 -1
  5. package/src/lib/components/check-job-status-configuration/check-job-status-configuration.component.html +0 -51
  6. package/src/lib/components/check-job-status-configuration/check-job-status-configuration.component.scss +0 -1
  7. package/src/lib/components/check-job-status-configuration/check-job-status-configuration.component.ts +0 -71
  8. package/src/lib/components/data-mapping-tree/data-mapping-tree.component.html +0 -23
  9. package/src/lib/components/data-mapping-tree/data-mapping-tree.component.scss +0 -38
  10. package/src/lib/components/data-mapping-tree/data-mapping-tree.component.ts +0 -124
  11. package/src/lib/components/download-document-configuration/download-document-configuration.component.html +0 -29
  12. package/src/lib/components/download-document-configuration/download-document-configuration.component.scss +0 -1
  13. package/src/lib/components/download-document-configuration/download-document-configuration.component.ts +0 -71
  14. package/src/lib/components/epistola-configuration/epistola-configuration.component.html +0 -74
  15. package/src/lib/components/epistola-configuration/epistola-configuration.component.scss +0 -1
  16. package/src/lib/components/epistola-configuration/epistola-configuration.component.ts +0 -96
  17. package/src/lib/components/epistola-download/epistola-download.component.ts +0 -79
  18. package/src/lib/components/epistola-download/epistola-download.formio.ts +0 -19
  19. package/src/lib/components/field-tree/field-tree.component.html +0 -192
  20. package/src/lib/components/field-tree/field-tree.component.scss +0 -255
  21. package/src/lib/components/field-tree/field-tree.component.ts +0 -321
  22. package/src/lib/components/generate-document-configuration/generate-document-configuration.component.html +0 -182
  23. package/src/lib/components/generate-document-configuration/generate-document-configuration.component.scss +0 -150
  24. package/src/lib/components/generate-document-configuration/generate-document-configuration.component.ts +0 -422
  25. package/src/lib/epistola.module.ts +0 -50
  26. package/src/lib/epistola.specification.ts +0 -208
  27. package/src/lib/models/config.ts +0 -53
  28. package/src/lib/models/index.ts +0 -2
  29. package/src/lib/models/template.ts +0 -70
  30. package/src/lib/services/epistola-plugin.service.ts +0 -82
  31. package/src/lib/services/index.ts +0 -1
  32. package/src/public_api.ts +0 -16
  33. package/tsconfig.lib.json +0 -21
  34. /package/{dist/fesm2022 → fesm2022}/epistola.app-valtimo-plugin.mjs +0 -0
  35. /package/{dist/fesm2022 → fesm2022}/epistola.app-valtimo-plugin.mjs.map +0 -0
  36. /package/{dist/index.d.ts → index.d.ts} +0 -0
  37. /package/{dist/lib → lib}/assets/epistola-logo.d.ts +0 -0
  38. /package/{dist/lib → lib}/assets/index.d.ts +0 -0
  39. /package/{dist/lib → lib}/components/check-job-status-configuration/check-job-status-configuration.component.d.ts +0 -0
  40. /package/{dist/lib → lib}/components/data-mapping-tree/data-mapping-tree.component.d.ts +0 -0
  41. /package/{dist/lib → lib}/components/download-document-configuration/download-document-configuration.component.d.ts +0 -0
  42. /package/{dist/lib → lib}/components/epistola-configuration/epistola-configuration.component.d.ts +0 -0
  43. /package/{dist/lib → lib}/components/epistola-download/epistola-download.component.d.ts +0 -0
  44. /package/{dist/lib → lib}/components/epistola-download/epistola-download.formio.d.ts +0 -0
  45. /package/{dist/lib → lib}/components/field-tree/field-tree.component.d.ts +0 -0
  46. /package/{dist/lib → lib}/components/generate-document-configuration/generate-document-configuration.component.d.ts +0 -0
  47. /package/{dist/lib → lib}/epistola.module.d.ts +0 -0
  48. /package/{dist/lib → lib}/epistola.specification.d.ts +0 -0
  49. /package/{dist/lib → lib}/models/config.d.ts +0 -0
  50. /package/{dist/lib → lib}/models/index.d.ts +0 -0
  51. /package/{dist/lib → lib}/models/template.d.ts +0 -0
  52. /package/{dist/lib → lib}/services/epistola-plugin.service.d.ts +0 -0
  53. /package/{dist/lib → lib}/services/index.d.ts +0 -0
  54. /package/{dist/public_api.d.ts → public_api.d.ts} +0 -0
@@ -1,79 +0,0 @@
1
- import {Component, EventEmitter, Input, Output} from '@angular/core';
2
- import {CommonModule} from '@angular/common';
3
- import {HttpClient} from '@angular/common/http';
4
- import {FormioCustomComponent} from '@valtimo/components';
5
-
6
- export interface DownloadData {
7
- documentId: string;
8
- tenantId: string;
9
- }
10
-
11
- @Component({
12
- standalone: true,
13
- imports: [CommonModule],
14
- selector: 'epistola-download-component',
15
- template: `
16
- <button
17
- type="button"
18
- class="btn btn-outline-primary"
19
- [disabled]="disabled || downloading || !hasRequiredData()"
20
- (click)="download()"
21
- >
22
- <i class="mdi mdi-download mr-1"></i>
23
- {{ downloading ? 'Downloading...' : buttonLabel }}
24
- </button>
25
- <span *ngIf="error" class="text-danger ml-2">{{ error }}</span>
26
- `,
27
- })
28
- export class EpistolaDownloadComponent implements FormioCustomComponent<DownloadData> {
29
- @Input() value: DownloadData;
30
- @Output() valueChange = new EventEmitter<DownloadData>();
31
-
32
- @Input() disabled = false;
33
- @Input() filename = 'document.pdf';
34
- @Input() label = 'Download PDF';
35
-
36
- downloading = false;
37
- error: string | null = null;
38
-
39
- get buttonLabel(): string {
40
- return this.label || 'Download PDF';
41
- }
42
-
43
- constructor(private readonly http: HttpClient) {}
44
-
45
- hasRequiredData(): boolean {
46
- return !!(this.value?.documentId && this.value?.tenantId);
47
- }
48
-
49
- download(): void {
50
- if (!this.hasRequiredData() || this.downloading) {
51
- return;
52
- }
53
-
54
- this.downloading = true;
55
- this.error = null;
56
-
57
- const {documentId, tenantId} = this.value;
58
- const url = `/api/v1/plugin/epistola/documents/${encodeURIComponent(documentId)}/download`
59
- + `?tenantId=${encodeURIComponent(tenantId)}`
60
- + `&filename=${encodeURIComponent(this.filename)}`;
61
-
62
- this.http.get(url, {responseType: 'blob'}).subscribe({
63
- next: (blob) => {
64
- const objectUrl = URL.createObjectURL(blob);
65
- const anchor = document.createElement('a');
66
- anchor.href = objectUrl;
67
- anchor.download = this.filename;
68
- anchor.click();
69
- URL.revokeObjectURL(objectUrl);
70
- this.downloading = false;
71
- },
72
- error: (err) => {
73
- console.error('Download failed', err);
74
- this.error = 'Download mislukt. Probeer opnieuw.';
75
- this.downloading = false;
76
- },
77
- });
78
- }
79
- }
@@ -1,19 +0,0 @@
1
- import {Injector} from '@angular/core';
2
- import {FormioCustomComponentInfo, registerCustomFormioComponent} from '@valtimo/components';
3
- import {EpistolaDownloadComponent} from './epistola-download.component';
4
-
5
- export const EPISTOLA_DOWNLOAD_OPTIONS: FormioCustomComponentInfo = {
6
- type: 'epistola-download',
7
- selector: 'epistola-download-button',
8
- title: 'Epistola Download',
9
- group: 'basic',
10
- icon: 'download',
11
- emptyValue: null,
12
- fieldOptions: ['filename', 'label'],
13
- };
14
-
15
- export function registerEpistolaDownloadComponent(injector: Injector): void {
16
- if (!customElements.get(EPISTOLA_DOWNLOAD_OPTIONS.selector)) {
17
- registerCustomFormioComponent(EPISTOLA_DOWNLOAD_OPTIONS, EpistolaDownloadComponent, injector);
18
- }
19
- }
@@ -1,192 +0,0 @@
1
- <!-- SCALAR field: label row + input with 3-mode selector -->
2
- <div *ngIf="field.fieldType === 'SCALAR'" class="field-row" [class.field-required-unmapped]="field.required && !getStringValue()">
3
- <div class="field-label">
4
- <span class="field-name">{{ field.name }}</span>
5
- <span class="field-meta">({{ field.type }}{{ field.required ? ', required' : '' }})</span>
6
- </div>
7
- <div class="field-input">
8
- <div class="input-mode-group">
9
- <button type="button" class="mode-btn" [class.mode-active]="inputMode === 'browse'" [disabled]="disabled" (click)="setInputMode('browse')" [title]="'browseMode' | pluginTranslate: pluginId | async">⊞</button>
10
- <button type="button" class="mode-btn" [class.mode-active]="inputMode === 'pv'" [disabled]="disabled" (click)="setInputMode('pv')" [title]="'pvMode' | pluginTranslate: pluginId | async">pv</button>
11
- <button type="button" class="mode-btn" [class.mode-active]="inputMode === 'expression'" [disabled]="disabled" (click)="setInputMode('expression')" [title]="'expressionMode' | pluginTranslate: pluginId | async">fx</button>
12
- </div>
13
-
14
- <!-- Browse mode: ValuePathSelector -->
15
- <div class="field-input-control" *ngIf="inputMode === 'browse'">
16
- <valtimo-value-path-selector
17
- [name]="'field_' + field.path"
18
- [caseDefinitionKey]="caseDefinitionKey"
19
- [prefixes]="[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]"
20
- [notation]="'dots'"
21
- [disabled]="disabled"
22
- [defaultValue]="getStringValue()"
23
- [showCaseDefinitionSelector]="!caseDefinitionKey"
24
- (valueChangeEvent)="onBrowseValueChange($event)"
25
- ></valtimo-value-path-selector>
26
- </div>
27
-
28
- <!-- PV mode: dropdown (when available) or text fallback -->
29
- <div class="field-input-control" *ngIf="inputMode === 'pv'">
30
- <select
31
- *ngIf="processVariables.length > 0; else pvFallback"
32
- class="pv-select"
33
- [disabled]="disabled"
34
- (change)="onPvChange($any($event.target).value)"
35
- >
36
- <option value="">{{ 'pvPlaceholder' | pluginTranslate: pluginId | async }}</option>
37
- <option *ngFor="let pv of processVariables" [value]="pv" [selected]="pv === getPvName()">{{ pv }}</option>
38
- </select>
39
- <ng-template #pvFallback>
40
- <v-input
41
- [name]="'pvfb_' + field.path"
42
- [defaultValue]="getPvName()"
43
- [disabled]="disabled"
44
- [placeholder]="'pvPlaceholder' | pluginTranslate: pluginId | async"
45
- (valueChange)="onPvChange($event)"
46
- ></v-input>
47
- </ng-template>
48
- </div>
49
-
50
- <!-- Expression mode: text input -->
51
- <div class="field-input-control" *ngIf="inputMode === 'expression'">
52
- <v-input
53
- [name]="'fx_' + field.path"
54
- [defaultValue]="getStringValue()"
55
- [disabled]="disabled"
56
- [placeholder]="'e.g. pv:variableName or doc:path.to.field'"
57
- (valueChange)="onExpressionValueChange($event)"
58
- ></v-input>
59
- </div>
60
- </div>
61
- </div>
62
-
63
- <!-- OBJECT field: collapsible section with children -->
64
- <div *ngIf="field.fieldType === 'OBJECT'" class="field-object">
65
- <div class="field-object-header" (click)="toggleExpanded()" [class.field-required-unmapped]="totalRequired > 0 && mappedCount < totalRequired">
66
- <span class="expand-icon">{{ expanded ? '▼' : '▶' }}</span>
67
- <span class="field-name">{{ field.name }}</span>
68
- <span class="field-meta">(object{{ field.required ? ', required' : '' }})</span>
69
- <span class="completeness-badge" *ngIf="totalRequired > 0 && !expanded">
70
- {{ mappedCount }}/{{ totalRequired }}
71
- </span>
72
- </div>
73
- <div class="field-object-children" *ngIf="expanded">
74
- <epistola-field-tree
75
- *ngFor="let child of field.children"
76
- [field]="child"
77
- [value]="getChildValue(child.name)"
78
- [pluginId]="pluginId"
79
- [caseDefinitionKey]="caseDefinitionKey"
80
- [processVariables]="processVariables"
81
- [disabled]="disabled"
82
- (valueChange)="onChildChange(child.name, $event)"
83
- ></epistola-field-tree>
84
- </div>
85
- </div>
86
-
87
- <!-- ARRAY field: collapsible section with source collection + optional per-item mapping -->
88
- <div *ngIf="field.fieldType === 'ARRAY'" class="field-array">
89
- <div class="field-array-header" (click)="toggleExpanded()" [class.field-required-unmapped]="field.required && !getSourceValue()">
90
- <span class="expand-icon">{{ expanded ? '▼' : '▶' }}</span>
91
- <span class="field-name">{{ field.name }}</span>
92
- <span class="field-meta">(array{{ field.required ? ', required' : '' }})</span>
93
- <span class="completeness-badge" *ngIf="totalRequired > 0 && !expanded">
94
- {{ mappedCount }}/{{ totalRequired }}
95
- </span>
96
- <span class="mapped-indicator" *ngIf="totalRequired === 0 && getSourceValue() && !expanded">✓</span>
97
- </div>
98
- <div class="field-array-content" *ngIf="expanded">
99
- <!-- Source collection input -->
100
- <div class="field-row">
101
- <div class="field-label">
102
- <span class="field-name">{{ 'mapCollectionTo' | pluginTranslate: pluginId | async }}</span>
103
- </div>
104
- <div class="field-input">
105
- <div class="input-mode-group">
106
- <button type="button" class="mode-btn" [class.mode-active]="inputMode === 'browse'" [disabled]="disabled" (click)="setInputMode('browse')" [title]="'browseMode' | pluginTranslate: pluginId | async">⊞</button>
107
- <button type="button" class="mode-btn" [class.mode-active]="inputMode === 'pv'" [disabled]="disabled" (click)="setInputMode('pv')" [title]="'pvMode' | pluginTranslate: pluginId | async">pv</button>
108
- <button type="button" class="mode-btn" [class.mode-active]="inputMode === 'expression'" [disabled]="disabled" (click)="setInputMode('expression')" [title]="'expressionMode' | pluginTranslate: pluginId | async">fx</button>
109
- </div>
110
-
111
- <div class="field-input-control" *ngIf="inputMode === 'browse'">
112
- <valtimo-value-path-selector
113
- [name]="'field_' + field.path"
114
- [caseDefinitionKey]="caseDefinitionKey"
115
- [prefixes]="[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]"
116
- [notation]="'dots'"
117
- [disabled]="disabled"
118
- [defaultValue]="getSourceValue()"
119
- [showCaseDefinitionSelector]="!caseDefinitionKey"
120
- (valueChangeEvent)="onSourceBrowseChange($event)"
121
- ></valtimo-value-path-selector>
122
- </div>
123
-
124
- <div class="field-input-control" *ngIf="inputMode === 'pv'">
125
- <select
126
- *ngIf="processVariables.length > 0; else pvSourceFallback"
127
- class="pv-select"
128
- [disabled]="disabled"
129
- (change)="onSourcePvChange($any($event.target).value)"
130
- >
131
- <option value="">{{ 'pvPlaceholder' | pluginTranslate: pluginId | async }}</option>
132
- <option *ngFor="let pv of processVariables" [value]="pv" [selected]="pv === getSourcePvName()">{{ pv }}</option>
133
- </select>
134
- <ng-template #pvSourceFallback>
135
- <v-input
136
- [name]="'pvfb_' + field.path"
137
- [defaultValue]="getSourcePvName()"
138
- [disabled]="disabled"
139
- [placeholder]="'pvPlaceholder' | pluginTranslate: pluginId | async"
140
- (valueChange)="onSourcePvChange($event)"
141
- ></v-input>
142
- </ng-template>
143
- </div>
144
-
145
- <div class="field-input-control" *ngIf="inputMode === 'expression'">
146
- <v-input
147
- [name]="'fx_' + field.path"
148
- [defaultValue]="getSourceValue()"
149
- [disabled]="disabled"
150
- [placeholder]="'e.g. pv:variableName or doc:path.to.field'"
151
- (valueChange)="onSourceExpressionChange($event)"
152
- ></v-input>
153
- </div>
154
- </div>
155
- </div>
156
-
157
- <!-- Per-item field mapping toggle (only shown when array has children) -->
158
- <div class="array-per-field-toggle" *ngIf="hasArrayChildren()">
159
- <label class="toggle-label">
160
- <input
161
- type="checkbox"
162
- [checked]="arrayPerFieldMode"
163
- [disabled]="disabled"
164
- (change)="toggleArrayPerFieldMode()"
165
- />
166
- <span>{{ 'itemFieldMapping' | pluginTranslate: pluginId | async }}</span>
167
- </label>
168
- </div>
169
-
170
- <!-- Per-item field mappings -->
171
- <div class="array-item-fields" *ngIf="arrayPerFieldMode && hasArrayChildren()">
172
- <div class="item-fields-header">
173
- <span class="item-fields-title">{{ 'itemFieldMappingTitle' | pluginTranslate: pluginId | async }}</span>
174
- </div>
175
- <div class="item-field-row" *ngFor="let child of field.children">
176
- <div class="item-field-label">
177
- <span class="field-name">{{ child.name }}</span>
178
- <span class="field-meta">({{ child.type }}{{ child.required ? ', required' : '' }})</span>
179
- </div>
180
- <div class="item-field-input">
181
- <v-input
182
- [name]="'itemField_' + child.path"
183
- [defaultValue]="getItemFieldValue(child.name)"
184
- [disabled]="disabled"
185
- [placeholder]="'sourceFieldPlaceholder' | pluginTranslate: pluginId | async"
186
- (valueChange)="onItemFieldChange(child.name, $event)"
187
- ></v-input>
188
- </div>
189
- </div>
190
- </div>
191
- </div>
192
- </div>
@@ -1,255 +0,0 @@
1
- // -- Scalar field row --
2
- .field-row {
3
- display: flex;
4
- align-items: flex-start;
5
- gap: 0.75rem;
6
- padding: 0.5rem 0;
7
- border-left: 3px solid transparent;
8
-
9
- &.field-required-unmapped {
10
- border-left-color: #dc3545;
11
- background-color: #fff5f5;
12
- padding-left: 0.5rem;
13
- }
14
- }
15
-
16
- .field-label {
17
- flex: 0 0 200px;
18
- min-width: 140px;
19
- padding-top: 0.5rem;
20
- word-break: break-word;
21
-
22
- .field-name {
23
- font-weight: 500;
24
- }
25
-
26
- .field-meta {
27
- font-size: 0.8125rem;
28
- color: #6c757d;
29
- margin-left: 0.25rem;
30
- }
31
- }
32
-
33
- .field-input {
34
- flex: 1;
35
- display: flex;
36
- align-items: flex-start;
37
- gap: 0.5rem;
38
- min-width: 0;
39
- }
40
-
41
- .field-input-control {
42
- flex: 1;
43
- min-width: 0;
44
- }
45
-
46
- // -- 3-button input mode group --
47
- .input-mode-group {
48
- flex: 0 0 auto;
49
- display: flex;
50
- margin-top: 0.25rem;
51
- border: 1px solid #c6c6c6;
52
- border-radius: 4px;
53
- overflow: hidden;
54
-
55
- .mode-btn {
56
- width: 32px;
57
- height: 32px;
58
- padding: 0;
59
- border: none;
60
- border-right: 1px solid #c6c6c6;
61
- background: #f4f4f4;
62
- color: #525252;
63
- font-size: 0.75rem;
64
- font-weight: 600;
65
- cursor: pointer;
66
- display: flex;
67
- align-items: center;
68
- justify-content: center;
69
- transition: background-color 0.15s;
70
-
71
- &:last-child {
72
- border-right: none;
73
- }
74
-
75
- &:hover:not(:disabled) {
76
- background: #e0e0e0;
77
- }
78
-
79
- &.mode-active {
80
- background: #0f62fe;
81
- color: #fff;
82
-
83
- &:hover:not(:disabled) {
84
- background: #0353e9;
85
- }
86
- }
87
-
88
- &:disabled {
89
- opacity: 0.5;
90
- cursor: not-allowed;
91
- }
92
- }
93
- }
94
-
95
- // -- PV select dropdown --
96
- .pv-select {
97
- width: 100%;
98
- height: 2.5rem;
99
- padding: 0 0.75rem;
100
- border: 1px solid #c6c6c6;
101
- border-radius: 4px;
102
- background: #fff;
103
- color: #161616;
104
- font-size: 0.875rem;
105
- cursor: pointer;
106
-
107
- &:focus {
108
- outline: 2px solid #0f62fe;
109
- outline-offset: -2px;
110
- }
111
-
112
- &:disabled {
113
- opacity: 0.5;
114
- cursor: not-allowed;
115
- background: #f4f4f4;
116
- }
117
- }
118
-
119
- // -- Object section --
120
- .field-object {
121
- margin: 0.25rem 0;
122
- }
123
-
124
- .field-object-header,
125
- .field-array-header {
126
- display: flex;
127
- align-items: center;
128
- gap: 0.5rem;
129
- padding: 0.5rem 0.25rem;
130
- cursor: pointer;
131
- user-select: none;
132
- border-left: 3px solid transparent;
133
- border-radius: 2px;
134
-
135
- &:hover {
136
- background: #f4f4f4;
137
- }
138
-
139
- &.field-required-unmapped {
140
- border-left-color: #dc3545;
141
- background-color: #fff5f5;
142
- }
143
-
144
- .expand-icon {
145
- flex: 0 0 1rem;
146
- font-size: 0.75rem;
147
- color: #525252;
148
- }
149
-
150
- .field-name {
151
- font-weight: 500;
152
- }
153
-
154
- .field-meta {
155
- font-size: 0.8125rem;
156
- color: #6c757d;
157
- }
158
-
159
- .completeness-badge {
160
- margin-left: auto;
161
- font-size: 0.75rem;
162
- padding: 0.125rem 0.5rem;
163
- border-radius: 10px;
164
- background: #e0e0e0;
165
- color: #525252;
166
- font-weight: 500;
167
- }
168
-
169
- .mapped-indicator {
170
- margin-left: auto;
171
- color: #198754;
172
- font-weight: 600;
173
- }
174
- }
175
-
176
- .field-object-children {
177
- padding-left: 1.25rem;
178
- border-left: 1px solid #e0e0e0;
179
- margin-left: 0.5rem;
180
- }
181
-
182
- // -- Array section --
183
- .field-array {
184
- margin: 0.25rem 0;
185
- }
186
-
187
- .field-array-content {
188
- padding-left: 1.25rem;
189
- border-left: 1px solid #e0e0e0;
190
- margin-left: 0.5rem;
191
- }
192
-
193
- // -- Array per-item field mapping --
194
- .array-per-field-toggle {
195
- padding: 0.5rem 0;
196
-
197
- .toggle-label {
198
- display: flex;
199
- align-items: center;
200
- gap: 0.5rem;
201
- cursor: pointer;
202
- font-size: 0.875rem;
203
- color: #525252;
204
-
205
- input[type="checkbox"] {
206
- cursor: pointer;
207
- }
208
- }
209
- }
210
-
211
- .array-item-fields {
212
- padding: 0.25rem 0 0.5rem;
213
- margin-left: 0.5rem;
214
- border-left: 1px dashed #c6c6c6;
215
- padding-left: 1rem;
216
- }
217
-
218
- .item-fields-header {
219
- padding-bottom: 0.25rem;
220
-
221
- .item-fields-title {
222
- font-size: 0.8125rem;
223
- font-weight: 500;
224
- color: #6c757d;
225
- }
226
- }
227
-
228
- .item-field-row {
229
- display: flex;
230
- align-items: center;
231
- gap: 0.75rem;
232
- padding: 0.25rem 0;
233
- }
234
-
235
- .item-field-label {
236
- flex: 0 0 180px;
237
- min-width: 120px;
238
- word-break: break-word;
239
-
240
- .field-name {
241
- font-weight: 500;
242
- font-size: 0.875rem;
243
- }
244
-
245
- .field-meta {
246
- font-size: 0.75rem;
247
- color: #6c757d;
248
- margin-left: 0.25rem;
249
- }
250
- }
251
-
252
- .item-field-input {
253
- flex: 1;
254
- min-width: 0;
255
- }