@nuasite/collections-admin 0.43.0-beta.1
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.
- package/dist/types/app.d.ts +24 -0
- package/dist/types/app.d.ts.map +1 -0
- package/dist/types/app.js +240 -0
- package/dist/types/client.d.ts +75 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +134 -0
- package/dist/types/field-view.d.ts +17 -0
- package/dist/types/field-view.d.ts.map +1 -0
- package/dist/types/field-view.js +77 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +52 -0
- package/src/app.tsx +329 -0
- package/src/client.ts +216 -0
- package/src/css.d.ts +9 -0
- package/src/field-view.tsx +88 -0
- package/src/index.ts +24 -0
- package/src/styles.css +371 -0
- package/src/tsconfig.json +11 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only field rendering, driven by a collection's `FieldDefinition`.
|
|
3
|
+
*
|
|
4
|
+
* Scalar types (text/number/boolean/date/select/image/url/email/tel/color) show
|
|
5
|
+
* their value directly; structural types (array/object/reference) show their
|
|
6
|
+
* structure. Nothing here mutates — editing arrives in F3.2.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { FieldDefinition, FieldType } from '@nuasite/cms-types'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Frontmatter values arrive from the sidecar already stringified
|
|
13
|
+
* (`{ value: string; line: number }`). For structural types the string is a
|
|
14
|
+
* JSON payload; we parse it best-effort for a structured render and fall back to
|
|
15
|
+
* the raw string when it is not JSON.
|
|
16
|
+
*/
|
|
17
|
+
function parseStructured(raw: string): unknown {
|
|
18
|
+
const trimmed = raw.trim()
|
|
19
|
+
if (trimmed === '') return undefined
|
|
20
|
+
if (!(trimmed.startsWith('{') || trimmed.startsWith('['))) return raw
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(trimmed)
|
|
23
|
+
} catch {
|
|
24
|
+
return raw
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function StructuredValue({ raw }: { raw: string }) {
|
|
29
|
+
const parsed = parseStructured(raw)
|
|
30
|
+
if (parsed === undefined) {
|
|
31
|
+
return <span className="nua-cadmin-field-empty">—</span>
|
|
32
|
+
}
|
|
33
|
+
if (typeof parsed === 'string') {
|
|
34
|
+
return <span>{parsed}</span>
|
|
35
|
+
}
|
|
36
|
+
return <pre className="nua-cadmin-field-structured">{JSON.stringify(parsed, null, 2)}</pre>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function BooleanValue({ raw }: { raw: string }) {
|
|
40
|
+
const on = raw === 'true' || raw === '1' || raw.toLowerCase() === 'yes'
|
|
41
|
+
return <span className={on ? 'nua-cadmin-bool-on' : 'nua-cadmin-bool-off'}>{on ? 'Yes' : 'No'}</span>
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function ImageValue({ raw }: { raw: string }) {
|
|
45
|
+
if (raw === '') return <span className="nua-cadmin-field-empty">—</span>
|
|
46
|
+
const looksLikeUrl = /^(https?:\/\/|\/)/.test(raw)
|
|
47
|
+
return (
|
|
48
|
+
<div>
|
|
49
|
+
{looksLikeUrl ? <img className="nua-cadmin-img" src={raw} alt="" /> : null}
|
|
50
|
+
<div className="nua-cadmin-cell-mono">{raw}</div>
|
|
51
|
+
</div>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const STRUCTURAL_TYPES: ReadonlySet<FieldType> = new Set<FieldType>(['array', 'object', 'reference'])
|
|
56
|
+
|
|
57
|
+
export function FieldValueView({ field, raw }: { field: FieldDefinition; raw: string | undefined }) {
|
|
58
|
+
if (raw === undefined || raw === '') {
|
|
59
|
+
return <div className="nua-cadmin-field-value nua-cadmin-field-empty">—</div>
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let content: React.ReactNode
|
|
63
|
+
switch (field.type) {
|
|
64
|
+
case 'boolean':
|
|
65
|
+
content = <BooleanValue raw={raw} />
|
|
66
|
+
break
|
|
67
|
+
case 'image':
|
|
68
|
+
case 'file':
|
|
69
|
+
content = <ImageValue raw={raw} />
|
|
70
|
+
break
|
|
71
|
+
default:
|
|
72
|
+
content = STRUCTURAL_TYPES.has(field.type) ? <StructuredValue raw={raw} /> : <span>{raw}</span>
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return <div className="nua-cadmin-field-value">{content}</div>
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function FieldRow({ field, raw }: { field: FieldDefinition; raw: string | undefined }) {
|
|
79
|
+
return (
|
|
80
|
+
<div className="nua-cadmin-field">
|
|
81
|
+
<div className="nua-cadmin-field-label">
|
|
82
|
+
<span>{field.name}</span>
|
|
83
|
+
<span className="nua-cadmin-field-type">{field.type}{field.required ? ' · required' : ''}</span>
|
|
84
|
+
</div>
|
|
85
|
+
<FieldValueView field={field} raw={raw} />
|
|
86
|
+
</div>
|
|
87
|
+
)
|
|
88
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@nuasite/collections-admin` — read-only collections SPA over the cms-sidecar
|
|
3
|
+
* `/cms/v1` HTTP contract (cms-headless F3.1). Host-agnostic: mount
|
|
4
|
+
* `<CollectionsAdminApp apiBase={…} />` and it drives its own internal view-state
|
|
5
|
+
* navigation. Self-contained styles ship at `./styles.css` (imported by the app).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { CollectionsAdminApp, type CollectionsAdminAppProps } from './app'
|
|
9
|
+
// Re-export the field-type contract values so consumers can drive field UIs off
|
|
10
|
+
// the same source of truth — and so `@nuasite/cms-types` is a genuine runtime
|
|
11
|
+
// dependency (not type-only), matching the shared-contract intent.
|
|
12
|
+
export { FIELD_TYPES, isFieldType } from '@nuasite/cms-types'
|
|
13
|
+
export {
|
|
14
|
+
type CmsApiError,
|
|
15
|
+
type CmsCapabilities,
|
|
16
|
+
type CmsClient,
|
|
17
|
+
CmsClientError,
|
|
18
|
+
type CmsEntriesListResult,
|
|
19
|
+
type CmsErrorCode,
|
|
20
|
+
type CmsPageEntry,
|
|
21
|
+
type CmsProjectModel,
|
|
22
|
+
createClient,
|
|
23
|
+
type GetEntriesOptions,
|
|
24
|
+
} from './client'
|
package/src/styles.css
ADDED
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained styles for the collections-admin SPA.
|
|
3
|
+
*
|
|
4
|
+
* Scoped under `.nua-cadmin` so the lib does not depend on the host's Tailwind
|
|
5
|
+
* config (webmaster) or any global CSS — F7 can reuse it verbatim in local dev.
|
|
6
|
+
* Kept deliberately minimal: this is a de-risk milestone, not a design showcase.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
.nua-cadmin {
|
|
10
|
+
--nua-cadmin-fg: #1f2937;
|
|
11
|
+
--nua-cadmin-muted: #6b7280;
|
|
12
|
+
--nua-cadmin-border: #e5e7eb;
|
|
13
|
+
--nua-cadmin-bg: #ffffff;
|
|
14
|
+
--nua-cadmin-bg-subtle: #f9fafb;
|
|
15
|
+
--nua-cadmin-accent: #2563eb;
|
|
16
|
+
--nua-cadmin-danger: #b91c1c;
|
|
17
|
+
--nua-cadmin-danger-bg: #fef2f2;
|
|
18
|
+
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
height: 100%;
|
|
22
|
+
min-height: 0;
|
|
23
|
+
color: var(--nua-cadmin-fg);
|
|
24
|
+
background: var(--nua-cadmin-bg);
|
|
25
|
+
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
26
|
+
font-size: 13px;
|
|
27
|
+
line-height: 1.5;
|
|
28
|
+
box-sizing: border-box;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.nua-cadmin *,
|
|
32
|
+
.nua-cadmin *::before,
|
|
33
|
+
.nua-cadmin *::after {
|
|
34
|
+
box-sizing: border-box;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* --- Header / breadcrumb bar --- */
|
|
38
|
+
|
|
39
|
+
.nua-cadmin-header {
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
gap: 8px;
|
|
43
|
+
padding: 10px 14px;
|
|
44
|
+
border-bottom: 1px solid var(--nua-cadmin-border);
|
|
45
|
+
background: var(--nua-cadmin-bg-subtle);
|
|
46
|
+
flex-shrink: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.nua-cadmin-back {
|
|
50
|
+
display: inline-flex;
|
|
51
|
+
align-items: center;
|
|
52
|
+
gap: 4px;
|
|
53
|
+
padding: 4px 8px;
|
|
54
|
+
border: 1px solid var(--nua-cadmin-border);
|
|
55
|
+
border-radius: 6px;
|
|
56
|
+
background: var(--nua-cadmin-bg);
|
|
57
|
+
color: var(--nua-cadmin-fg);
|
|
58
|
+
font-size: 12px;
|
|
59
|
+
cursor: pointer;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.nua-cadmin-back:hover {
|
|
63
|
+
background: var(--nua-cadmin-bg-subtle);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.nua-cadmin-title {
|
|
67
|
+
font-size: 13px;
|
|
68
|
+
font-weight: 600;
|
|
69
|
+
margin: 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.nua-cadmin-crumb {
|
|
73
|
+
color: var(--nua-cadmin-muted);
|
|
74
|
+
font-size: 12px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.nua-cadmin-spacer {
|
|
78
|
+
flex: 1;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.nua-cadmin-close {
|
|
82
|
+
display: inline-flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
justify-content: center;
|
|
85
|
+
width: 26px;
|
|
86
|
+
height: 26px;
|
|
87
|
+
border: none;
|
|
88
|
+
border-radius: 6px;
|
|
89
|
+
background: transparent;
|
|
90
|
+
color: var(--nua-cadmin-muted);
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
font-size: 16px;
|
|
93
|
+
line-height: 1;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.nua-cadmin-close:hover {
|
|
97
|
+
background: var(--nua-cadmin-border);
|
|
98
|
+
color: var(--nua-cadmin-fg);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* --- Scroll body --- */
|
|
102
|
+
|
|
103
|
+
.nua-cadmin-body {
|
|
104
|
+
flex: 1;
|
|
105
|
+
min-height: 0;
|
|
106
|
+
overflow-y: auto;
|
|
107
|
+
padding: 12px 14px;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* --- States --- */
|
|
111
|
+
|
|
112
|
+
.nua-cadmin-state {
|
|
113
|
+
display: flex;
|
|
114
|
+
flex-direction: column;
|
|
115
|
+
align-items: center;
|
|
116
|
+
justify-content: center;
|
|
117
|
+
gap: 8px;
|
|
118
|
+
padding: 40px 16px;
|
|
119
|
+
text-align: center;
|
|
120
|
+
color: var(--nua-cadmin-muted);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.nua-cadmin-spinner {
|
|
124
|
+
width: 22px;
|
|
125
|
+
height: 22px;
|
|
126
|
+
border: 2px solid var(--nua-cadmin-border);
|
|
127
|
+
border-top-color: var(--nua-cadmin-accent);
|
|
128
|
+
border-radius: 50%;
|
|
129
|
+
animation: nua-cadmin-spin 0.7s linear infinite;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@keyframes nua-cadmin-spin {
|
|
133
|
+
to {
|
|
134
|
+
transform: rotate(360deg);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.nua-cadmin-error {
|
|
139
|
+
margin: 0;
|
|
140
|
+
padding: 12px 14px;
|
|
141
|
+
border: 1px solid #fecaca;
|
|
142
|
+
border-radius: 8px;
|
|
143
|
+
background: var(--nua-cadmin-danger-bg);
|
|
144
|
+
color: var(--nua-cadmin-danger);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.nua-cadmin-error-title {
|
|
148
|
+
font-weight: 600;
|
|
149
|
+
margin-bottom: 2px;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.nua-cadmin-retry {
|
|
153
|
+
margin-top: 8px;
|
|
154
|
+
padding: 4px 10px;
|
|
155
|
+
border: 1px solid #fecaca;
|
|
156
|
+
border-radius: 6px;
|
|
157
|
+
background: var(--nua-cadmin-bg);
|
|
158
|
+
color: var(--nua-cadmin-danger);
|
|
159
|
+
font-size: 12px;
|
|
160
|
+
cursor: pointer;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* --- Collection list --- */
|
|
164
|
+
|
|
165
|
+
.nua-cadmin-list {
|
|
166
|
+
display: flex;
|
|
167
|
+
flex-direction: column;
|
|
168
|
+
gap: 6px;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.nua-cadmin-card {
|
|
172
|
+
display: flex;
|
|
173
|
+
align-items: center;
|
|
174
|
+
justify-content: space-between;
|
|
175
|
+
gap: 12px;
|
|
176
|
+
width: 100%;
|
|
177
|
+
padding: 10px 12px;
|
|
178
|
+
border: 1px solid var(--nua-cadmin-border);
|
|
179
|
+
border-radius: 8px;
|
|
180
|
+
background: var(--nua-cadmin-bg);
|
|
181
|
+
text-align: left;
|
|
182
|
+
cursor: pointer;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.nua-cadmin-card:hover {
|
|
186
|
+
border-color: var(--nua-cadmin-accent);
|
|
187
|
+
background: var(--nua-cadmin-bg-subtle);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.nua-cadmin-card-main {
|
|
191
|
+
display: flex;
|
|
192
|
+
flex-direction: column;
|
|
193
|
+
gap: 2px;
|
|
194
|
+
min-width: 0;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.nua-cadmin-card-label {
|
|
198
|
+
font-weight: 600;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.nua-cadmin-card-sub {
|
|
202
|
+
color: var(--nua-cadmin-muted);
|
|
203
|
+
font-size: 12px;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.nua-cadmin-badge {
|
|
207
|
+
display: inline-flex;
|
|
208
|
+
align-items: center;
|
|
209
|
+
padding: 1px 7px;
|
|
210
|
+
border-radius: 999px;
|
|
211
|
+
background: var(--nua-cadmin-bg-subtle);
|
|
212
|
+
border: 1px solid var(--nua-cadmin-border);
|
|
213
|
+
color: var(--nua-cadmin-muted);
|
|
214
|
+
font-size: 11px;
|
|
215
|
+
font-weight: 500;
|
|
216
|
+
white-space: nowrap;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.nua-cadmin-badge-draft {
|
|
220
|
+
background: #fffbeb;
|
|
221
|
+
border-color: #fde68a;
|
|
222
|
+
color: #92400e;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* --- Entries table --- */
|
|
226
|
+
|
|
227
|
+
.nua-cadmin-table {
|
|
228
|
+
width: 100%;
|
|
229
|
+
border-collapse: collapse;
|
|
230
|
+
font-size: 12px;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.nua-cadmin-table th {
|
|
234
|
+
text-align: left;
|
|
235
|
+
padding: 6px 8px;
|
|
236
|
+
border-bottom: 1px solid var(--nua-cadmin-border);
|
|
237
|
+
color: var(--nua-cadmin-muted);
|
|
238
|
+
font-weight: 600;
|
|
239
|
+
white-space: nowrap;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.nua-cadmin-table td {
|
|
243
|
+
padding: 7px 8px;
|
|
244
|
+
border-bottom: 1px solid var(--nua-cadmin-border);
|
|
245
|
+
vertical-align: top;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.nua-cadmin-row {
|
|
249
|
+
cursor: pointer;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.nua-cadmin-row:hover td {
|
|
253
|
+
background: var(--nua-cadmin-bg-subtle);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.nua-cadmin-cell-mono {
|
|
257
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
258
|
+
font-size: 11px;
|
|
259
|
+
color: var(--nua-cadmin-muted);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.nua-cadmin-load-more {
|
|
263
|
+
margin-top: 12px;
|
|
264
|
+
padding: 6px 12px;
|
|
265
|
+
border: 1px solid var(--nua-cadmin-border);
|
|
266
|
+
border-radius: 6px;
|
|
267
|
+
background: var(--nua-cadmin-bg);
|
|
268
|
+
color: var(--nua-cadmin-fg);
|
|
269
|
+
font-size: 12px;
|
|
270
|
+
cursor: pointer;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.nua-cadmin-load-more:hover {
|
|
274
|
+
background: var(--nua-cadmin-bg-subtle);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.nua-cadmin-load-more:disabled {
|
|
278
|
+
opacity: 0.6;
|
|
279
|
+
cursor: default;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* --- Entry detail --- */
|
|
283
|
+
|
|
284
|
+
.nua-cadmin-fields {
|
|
285
|
+
display: flex;
|
|
286
|
+
flex-direction: column;
|
|
287
|
+
gap: 10px;
|
|
288
|
+
margin-bottom: 18px;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.nua-cadmin-field {
|
|
292
|
+
display: flex;
|
|
293
|
+
flex-direction: column;
|
|
294
|
+
gap: 3px;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.nua-cadmin-field-label {
|
|
298
|
+
display: flex;
|
|
299
|
+
align-items: center;
|
|
300
|
+
gap: 6px;
|
|
301
|
+
font-size: 11px;
|
|
302
|
+
font-weight: 600;
|
|
303
|
+
color: var(--nua-cadmin-muted);
|
|
304
|
+
text-transform: uppercase;
|
|
305
|
+
letter-spacing: 0.03em;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.nua-cadmin-field-type {
|
|
309
|
+
font-weight: 400;
|
|
310
|
+
text-transform: none;
|
|
311
|
+
letter-spacing: 0;
|
|
312
|
+
color: var(--nua-cadmin-muted);
|
|
313
|
+
opacity: 0.7;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.nua-cadmin-field-value {
|
|
317
|
+
padding: 7px 10px;
|
|
318
|
+
border: 1px solid var(--nua-cadmin-border);
|
|
319
|
+
border-radius: 6px;
|
|
320
|
+
background: var(--nua-cadmin-bg-subtle);
|
|
321
|
+
white-space: pre-wrap;
|
|
322
|
+
word-break: break-word;
|
|
323
|
+
min-height: 32px;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.nua-cadmin-field-empty {
|
|
327
|
+
color: var(--nua-cadmin-muted);
|
|
328
|
+
font-style: italic;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.nua-cadmin-field-structured {
|
|
332
|
+
margin: 0;
|
|
333
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
334
|
+
font-size: 11px;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.nua-cadmin-bool-on {
|
|
338
|
+
color: #166534;
|
|
339
|
+
font-weight: 600;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.nua-cadmin-bool-off {
|
|
343
|
+
color: var(--nua-cadmin-muted);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
.nua-cadmin-section-title {
|
|
347
|
+
font-size: 12px;
|
|
348
|
+
font-weight: 600;
|
|
349
|
+
margin: 0 0 6px;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.nua-cadmin-body-content {
|
|
353
|
+
margin: 0;
|
|
354
|
+
padding: 12px;
|
|
355
|
+
border: 1px solid var(--nua-cadmin-border);
|
|
356
|
+
border-radius: 8px;
|
|
357
|
+
background: var(--nua-cadmin-bg-subtle);
|
|
358
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
359
|
+
font-size: 12px;
|
|
360
|
+
white-space: pre-wrap;
|
|
361
|
+
word-break: break-word;
|
|
362
|
+
overflow-x: auto;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.nua-cadmin-img {
|
|
366
|
+
max-width: 220px;
|
|
367
|
+
max-height: 160px;
|
|
368
|
+
border-radius: 6px;
|
|
369
|
+
border: 1px solid var(--nua-cadmin-border);
|
|
370
|
+
display: block;
|
|
371
|
+
}
|