@acms-subir/core 0.0.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.
Files changed (107) hide show
  1. package/cli.mjs +75 -0
  2. package/integration.mjs +286 -0
  3. package/package.json +89 -0
  4. package/src/actions/index.ts +502 -0
  5. package/src/components/DesignManager.tsx +542 -0
  6. package/src/components/LinksManager.tsx +694 -0
  7. package/src/components/Modal.astro +65 -0
  8. package/src/components/NavManager.tsx +168 -0
  9. package/src/components/WidgetRenderer.astro +84 -0
  10. package/src/components/builder/PageBuilder.tsx +575 -0
  11. package/src/components/editor/ImagePicker.tsx +215 -0
  12. package/src/components/editor/PostEditor.tsx +1011 -0
  13. package/src/components/editor/PreviewOverlay.tsx +77 -0
  14. package/src/components/editor/extensions/calendar.tsx +230 -0
  15. package/src/components/editor/extensions/cards.tsx +488 -0
  16. package/src/components/editor/extensions/codeBlock.tsx +70 -0
  17. package/src/components/editor/extensions/infoCards.tsx +270 -0
  18. package/src/components/editor/extensions/mediaCards.tsx +376 -0
  19. package/src/components/editor/extensions/postList.tsx +130 -0
  20. package/src/components/editor/extensions/slash.tsx +250 -0
  21. package/src/components/editor/extensions/tableTyping.ts +63 -0
  22. package/src/components/editor/imaging.ts +146 -0
  23. package/src/components/media/CropModal.tsx +229 -0
  24. package/src/components/media/MediaLibrary.tsx +295 -0
  25. package/src/layouts/Admin.astro +119 -0
  26. package/src/layouts/Site.astro +218 -0
  27. package/src/lib/auth.ts +94 -0
  28. package/src/lib/backup/unzip.ts +38 -0
  29. package/src/lib/backup/zip.ts +105 -0
  30. package/src/lib/blocksToHtml.ts +68 -0
  31. package/src/lib/brand.ts +26 -0
  32. package/src/lib/calendar/ics.ts +402 -0
  33. package/src/lib/calendar/render.ts +275 -0
  34. package/src/lib/calendar/src.ts +68 -0
  35. package/src/lib/content.ts +53 -0
  36. package/src/lib/dates.ts +34 -0
  37. package/src/lib/dynamicBlocks.ts +115 -0
  38. package/src/lib/env.ts +6 -0
  39. package/src/lib/highlightCode.ts +44 -0
  40. package/src/lib/i18n.ts +40 -0
  41. package/src/lib/markdown.ts +7 -0
  42. package/src/lib/media/store.ts +95 -0
  43. package/src/lib/net.ts +51 -0
  44. package/src/lib/preview.ts +28 -0
  45. package/src/lib/repo/d1.ts +44 -0
  46. package/src/lib/repo/index.ts +23 -0
  47. package/src/lib/repo/migrations.ts +231 -0
  48. package/src/lib/repo/search.ts +14 -0
  49. package/src/lib/repo/sql.ts +721 -0
  50. package/src/lib/repo/sqlite.ts +43 -0
  51. package/src/lib/repo/types.ts +132 -0
  52. package/src/lib/schema.ts +286 -0
  53. package/src/lib/seo.ts +37 -0
  54. package/src/lib/theme.ts +206 -0
  55. package/src/lib/widgets.ts +108 -0
  56. package/src/middleware.ts +109 -0
  57. package/src/pages/[...slug].astro +43 -0
  58. package/src/pages/admin/c/[collection]/[id].astro +56 -0
  59. package/src/pages/admin/c/[collection]/index.astro +163 -0
  60. package/src/pages/admin/design.astro +42 -0
  61. package/src/pages/admin/index.astro +145 -0
  62. package/src/pages/admin/links.astro +21 -0
  63. package/src/pages/admin/login.astro +83 -0
  64. package/src/pages/admin/logout.ts +7 -0
  65. package/src/pages/admin/media.astro +13 -0
  66. package/src/pages/admin/navigation.astro +17 -0
  67. package/src/pages/admin/pages/[id].astro +49 -0
  68. package/src/pages/admin/pages/index.astro +100 -0
  69. package/src/pages/admin/posts/[id].astro +6 -0
  70. package/src/pages/admin/posts/index.astro +7 -0
  71. package/src/pages/admin/settings.astro +512 -0
  72. package/src/pages/admin/tags.astro +101 -0
  73. package/src/pages/admin/users.astro +149 -0
  74. package/src/pages/api/backup.ts +63 -0
  75. package/src/pages/api/drafts.ts +106 -0
  76. package/src/pages/api/media/upload.ts +89 -0
  77. package/src/pages/api/restore.ts +102 -0
  78. package/src/pages/author/[slug].astro +66 -0
  79. package/src/pages/blog/[slug].astro +240 -0
  80. package/src/pages/blog/index.astro +51 -0
  81. package/src/pages/blog/tag/[slug].astro +83 -0
  82. package/src/pages/embed/[pageId]/[blockId].ts +45 -0
  83. package/src/pages/go/[id].ts +10 -0
  84. package/src/pages/index.astro +52 -0
  85. package/src/pages/links.astro +110 -0
  86. package/src/pages/llms.txt.ts +47 -0
  87. package/src/pages/media/[...key].ts +18 -0
  88. package/src/pages/preview/[type]/[id].astro +52 -0
  89. package/src/pages/robots.txt.ts +28 -0
  90. package/src/pages/rss.xml.ts +58 -0
  91. package/src/pages/search.astro +83 -0
  92. package/src/pages/sitemap.xml.ts +55 -0
  93. package/src/styles/admin.css +652 -0
  94. package/src/styles/builder.css +121 -0
  95. package/src/styles/cards.css +176 -0
  96. package/src/styles/editor.css +596 -0
  97. package/src/styles/site.css +427 -0
  98. package/src/themes/editorial/templates/home.astro +127 -0
  99. package/src/themes/editorial/templates/post-minimal.astro +50 -0
  100. package/src/themes/editorial/theme.css +108 -0
  101. package/src/themes/editorial/theme.json +20 -0
  102. package/src/themes/field/theme.json +17 -0
  103. package/src/themes/ink/theme.json +17 -0
  104. package/src/themes/night/theme.css +7 -0
  105. package/src/themes/night/theme.json +17 -0
  106. package/src/virtual.d.ts +25 -0
  107. package/src/worker.ts +28 -0
@@ -0,0 +1,596 @@
1
+ /* Post editor — full-screen Ghost-style writing surface on the Two-Tone Studio
2
+ tokens. Relies on :root variables from admin.css. */
3
+
4
+ .pe-shell { height: 100vh; background: var(--bg); display: flex; flex-direction: column; }
5
+
6
+ /* top bar */
7
+ .pe-topbar {
8
+ display: flex; align-items: center; justify-content: space-between; gap: 12px;
9
+ padding: 10px 18px; border-bottom: 1px solid var(--line);
10
+ position: sticky; top: 0; background: rgb(238 240 244 / 88%); backdrop-filter: blur(8px); z-index: 30;
11
+ }
12
+ .pe-topbar-left, .pe-topbar-right { display: flex; align-items: center; gap: 10px; }
13
+ .pe-savestate { font-size: 12.5px; color: var(--faint); }
14
+ .pe-savestate.dirty { color: var(--muted); }
15
+ .pe-savestate.saving { color: var(--muted); }
16
+ .pe-savestate.error { color: var(--red); }
17
+
18
+ /* buttons (island-local mirror of .btn) */
19
+ .pe-btn {
20
+ display: inline-flex; align-items: center; gap: 6px;
21
+ background: var(--panel); color: var(--text);
22
+ border: 1px solid var(--line-strong); border-radius: var(--r-md);
23
+ padding: 6px 13px; font-size: 13px; font-weight: 600;
24
+ cursor: pointer; font-family: inherit; text-decoration: none;
25
+ box-shadow: var(--shadow-sm);
26
+ }
27
+ .pe-btn:hover { border-color: var(--faint); }
28
+ .pe-btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
29
+ .pe-btn.primary:hover { background: var(--accent-strong); border-color: var(--accent-strong); }
30
+ .pe-btn.primary:disabled { opacity: 0.5; cursor: default; }
31
+ .pe-btn.sm { padding: 3px 10px; font-size: 12.5px; }
32
+ .pe-btn.ghost { background: transparent; border-color: transparent; color: var(--muted); box-shadow: none; }
33
+ .pe-btn.ghost:hover, .pe-btn.ghost.is-active { color: var(--text); background: rgb(26 29 37 / 5%); }
34
+ .pe-btn.danger { color: var(--red); }
35
+
36
+ /* layout */
37
+ .pe-body { flex: 1; display: flex; min-height: 0; }
38
+ .pe-main { flex: 1; overflow-y: auto; min-width: 0; }
39
+ .pe-column { max-width: 740px; margin: 0 auto; padding: 40px 20px 120px; position: relative; }
40
+ .pe-shell.has-sidebar .pe-main { margin-right: 320px; }
41
+ .pe-shell.has-split.has-sidebar .pe-main { margin-right: 0; }
42
+
43
+ /* side-by-side live preview */
44
+ .pe-splitpane {
45
+ width: min(46vw, 760px); flex: 0 0 auto; display: flex; flex-direction: column;
46
+ border-left: 1px solid var(--line); background: var(--panel-2);
47
+ }
48
+ .pe-shell.has-sidebar .pe-splitpane { margin-right: 320px; }
49
+ .pe-split-bar {
50
+ display: flex; align-items: center; justify-content: space-between; gap: 8px;
51
+ padding: 5px 10px; border-bottom: 1px solid var(--line);
52
+ }
53
+ .pe-split-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--faint); }
54
+ .pe-split-actions { display: flex; gap: 2px; }
55
+ .pe-splitpane iframe { flex: 1; width: 100%; border: 0; background: #fff; }
56
+
57
+ /* checkbox field (page settings) */
58
+ .pe-field.pe-check { display: flex; align-items: center; gap: 8px; cursor: pointer; }
59
+ .pe-field.pe-check input { width: auto; accent-color: var(--accent); }
60
+ .pe-field.pe-check > span { margin: 0; font-size: 13px; color: var(--text); display: inline; }
61
+ .pe-field.pe-check code { background: var(--panel-2); border: 1px solid var(--line); border-radius: 4px; padding: 0 4px; font-size: 11.5px; }
62
+
63
+ /* feature image */
64
+ .pe-add-feature {
65
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
66
+ width: 100%; padding: 26px 16px; margin-bottom: 22px;
67
+ background: rgb(26 29 37 / 2%); border: 1.5px dashed var(--line-strong); border-radius: var(--r-lg);
68
+ color: var(--faint); font-family: inherit; cursor: pointer; transition: border-color 0.15s, color 0.15s;
69
+ }
70
+ .pe-add-feature svg { margin-bottom: 4px; }
71
+ .pe-add-feature span { font-size: 13.5px; font-weight: 600; color: var(--muted); }
72
+ .pe-add-feature em { font-style: normal; font-size: 12px; color: var(--faint); }
73
+ .pe-add-feature:hover { border-color: var(--accent); color: var(--accent); }
74
+ .pe-add-feature:hover span { color: var(--text); }
75
+ .pe-feature { position: relative; margin: 0 0 22px; border-radius: var(--r-lg); overflow: hidden; }
76
+ .pe-feature img {
77
+ width: 100%; aspect-ratio: 2 / 1; object-fit: cover; display: block; background: var(--panel-2);
78
+ }
79
+ .pe-feature-tools { position: absolute; top: 10px; right: 10px; display: flex; gap: 6px; opacity: 0; transition: opacity 0.15s; }
80
+ .pe-feature:hover .pe-feature-tools { opacity: 1; }
81
+ .pe-feature-label {
82
+ position: absolute; left: 10px; bottom: 10px; margin: 0;
83
+ font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em;
84
+ color: #fff; background: rgb(0 0 0 / 55%); padding: 3px 8px; border-radius: var(--r-full);
85
+ opacity: 0; transition: opacity 0.15s; pointer-events: none;
86
+ }
87
+ .pe-feature:hover .pe-feature-label { opacity: 1; }
88
+
89
+ /* title */
90
+ .pe-title {
91
+ width: 100%; background: none; border: none; resize: none; outline: none;
92
+ color: var(--text); font-family: inherit; font-weight: 700;
93
+ font-size: 36px; line-height: 1.2; letter-spacing: -0.02em;
94
+ padding: 0; margin: 0 0 14px; overflow: hidden;
95
+ }
96
+ .pe-title::placeholder { color: var(--faint); }
97
+
98
+ /* prose */
99
+ .pe-prose { outline: none; color: var(--text); font-size: 16.5px; line-height: 1.72; min-height: 320px; }
100
+ .pe-prose p { margin: 0 0 0.9em; }
101
+ .pe-prose h2 { font-size: 25px; letter-spacing: -0.015em; margin: 1.4em 0 0.5em; }
102
+ .pe-prose h3 { font-size: 19px; letter-spacing: -0.01em; margin: 1.3em 0 0.4em; }
103
+ .pe-prose a { color: var(--accent-deep); text-decoration: underline; text-decoration-color: rgb(238 93 32 / 35%); }
104
+ .pe-prose blockquote { border-left: 3px solid var(--accent); margin: 1.2em 0; padding: 2px 0 2px 18px; color: var(--muted); font-style: italic; }
105
+ .pe-prose code { background: var(--panel-2); border: 1px solid var(--line); border-radius: 5px; padding: 1px 5px; font-size: 0.88em; font-family: ui-monospace, 'SF Mono', monospace; }
106
+ .pe-prose pre { background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 14px 16px; overflow-x: auto; margin: 1.2em 0; }
107
+ .pe-prose pre code { background: none; border: none; padding: 0; font-size: 13.5px; }
108
+ .pe-prose hr { border: none; border-top: 1px solid var(--line); margin: 2em auto; width: 120px; }
109
+
110
+ /* ---- code block (extensions/codeBlock.tsx) ---- */
111
+ .pe-codeblock { position: relative; margin: 1.2em 0; }
112
+ .pe-codeblock pre { margin: 0; }
113
+ .pe-codeblock-lang {
114
+ position: absolute; top: 6px; right: 6px; z-index: 3;
115
+ background: rgb(255 255 255 / 92%); color: var(--muted); border: 1px solid var(--line);
116
+ border-radius: 6px; font-size: 11px; font-weight: 600; padding: 2px 6px; font-family: inherit;
117
+ opacity: 0; transition: opacity 0.12s; cursor: pointer;
118
+ }
119
+ .pe-codeblock:hover .pe-codeblock-lang, .pe-codeblock:focus-within .pe-codeblock-lang { opacity: 1; }
120
+ /* GitHub-light token palette on the --panel-2 block */
121
+ .pe-prose pre .hljs-comment, .pe-prose pre .hljs-quote { color: #6e7781; font-style: italic; }
122
+ .pe-prose pre .hljs-keyword, .pe-prose pre .hljs-selector-tag, .pe-prose pre .hljs-doctag,
123
+ .pe-prose pre .hljs-template-tag, .pe-prose pre .hljs-operator { color: #cf222e; }
124
+ .pe-prose pre .hljs-string, .pe-prose pre .hljs-regexp, .pe-prose pre .hljs-addition { color: #0a3069; }
125
+ .pe-prose pre .hljs-title, .pe-prose pre .hljs-section { color: #8250df; }
126
+ .pe-prose pre .hljs-number, .pe-prose pre .hljs-literal, .pe-prose pre .hljs-attr,
127
+ .pe-prose pre .hljs-variable, .pe-prose pre .hljs-template-variable, .pe-prose pre .hljs-type,
128
+ .pe-prose pre .hljs-selector-class, .pe-prose pre .hljs-selector-id, .pe-prose pre .hljs-meta,
129
+ .pe-prose pre .hljs-attribute, .pe-prose pre .hljs-property { color: #0550ae; }
130
+ .pe-prose pre .hljs-name, .pe-prose pre .hljs-tag, .pe-prose pre .hljs-bullet { color: #116329; }
131
+ .pe-prose pre .hljs-built_in, .pe-prose pre .hljs-symbol { color: #953800; }
132
+ .pe-prose pre .hljs-deletion { color: #82071e; }
133
+ .pe-prose pre .hljs-emphasis { font-style: italic; }
134
+ .pe-prose pre .hljs-strong { font-weight: 700; }
135
+ .pe-prose ul, .pe-prose ol { padding-left: 1.4em; margin: 0 0 0.9em; }
136
+ .pe-prose li { margin: 0.25em 0; }
137
+ .pe-prose p.is-empty::before, .pe-prose > .is-editor-empty:first-child::before {
138
+ content: attr(data-placeholder); color: var(--faint); float: left; height: 0; pointer-events: none;
139
+ }
140
+ .pe-prose .ProseMirror-selectednode { outline: none; }
141
+
142
+ /* tables */
143
+ .pe-prose .tableWrapper { overflow-x: auto; margin: 1.2em 0; }
144
+ .pe-prose table { width: 100%; border-collapse: collapse; table-layout: fixed; font-size: 15px; line-height: 1.5; }
145
+ .pe-prose th, .pe-prose td {
146
+ border: 1px solid var(--line); padding: 7px 11px; text-align: left; vertical-align: top;
147
+ position: relative; min-width: 48px;
148
+ }
149
+ .pe-prose th { background: var(--panel-2); font-weight: 600; }
150
+ .pe-prose th p, .pe-prose td p { margin: 0; }
151
+ .pe-prose .selectedCell::after {
152
+ content: ''; position: absolute; inset: 0; background: var(--accent-soft); pointer-events: none;
153
+ }
154
+
155
+ .pe-wordcount {
156
+ position: fixed; right: 18px; bottom: 14px; font-size: 12px; color: var(--faint);
157
+ background: rgb(255 255 255 / 85%); padding: 3px 9px; border-radius: var(--r-full); border: 1px solid var(--line);
158
+ pointer-events: none; z-index: 20;
159
+ }
160
+ .pe-shell.has-sidebar .pe-wordcount { right: 338px; }
161
+
162
+ /* cards (editor chrome around .pc-* public styles) */
163
+ .pe-card { position: relative; margin: 1.2em 0; border-radius: var(--r-md); }
164
+ .pe-card.is-selected { box-shadow: 0 0 0 2px var(--accent); }
165
+ .pe-card img { max-width: 100%; display: block; border-radius: 8px; }
166
+ .pe-card-tools {
167
+ position: absolute; top: 8px; right: 8px; z-index: 3; display: flex; gap: 4px; align-items: center;
168
+ opacity: 0; transition: opacity 0.12s;
169
+ }
170
+ .pe-card:hover .pe-card-tools, .pe-card.is-selected .pe-card-tools { opacity: 1; }
171
+ .pe-card-tools button, .pe-card-tools .pe-provider {
172
+ background: rgb(255 255 255 / 92%); color: var(--muted); border: 1px solid var(--line);
173
+ border-radius: 6px; font-size: 11px; font-weight: 700; padding: 3px 8px; cursor: pointer; font-family: inherit;
174
+ }
175
+ .pe-card-tools button:hover { color: var(--text); }
176
+ .pe-card-tools button.has-value { color: var(--green); }
177
+ .pe-card-tools .pe-provider { cursor: default; text-transform: uppercase; letter-spacing: 0.05em; }
178
+ .pe-caption {
179
+ width: 100%; background: none; border: none; outline: none; text-align: center;
180
+ color: var(--muted); font-size: 13px; font-family: inherit; padding: 8px 4px 2px;
181
+ }
182
+ .pe-caption::placeholder { color: var(--faint); opacity: 0; transition: opacity 0.12s; }
183
+ .pe-card:hover .pe-caption::placeholder, .pe-card.is-selected .pe-caption::placeholder { opacity: 1; }
184
+
185
+ /* embed card */
186
+ .pe-embedcard .pc-embed-frame { border-radius: 8px; overflow: hidden; background: var(--panel); }
187
+ .pe-embedcard iframe { width: 100%; height: 100%; border: 0; display: block; }
188
+ .pe-embed-form {
189
+ display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
190
+ background: var(--panel); border: 1px dashed var(--line); border-radius: var(--r-md); padding: 14px 16px;
191
+ }
192
+ .pe-embed-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--accent); }
193
+ .pe-embed-form input { flex: 1; min-width: 220px; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md); padding: 7px 10px; font-size: 13.5px; font-family: inherit; }
194
+ .pe-embed-form input:focus { outline: none; border-color: var(--accent); }
195
+ .pe-embed-error { color: var(--red); font-size: 12.5px; width: 100%; }
196
+
197
+ /* button card */
198
+ .pe-button-fields { display: flex; gap: 8px; margin-bottom: 10px; }
199
+ .pe-button-fields input { flex: 1; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md); padding: 6px 10px; font-size: 13px; font-family: inherit; }
200
+ .pe-button-fields input:focus { outline: none; border-color: var(--accent); }
201
+ .pe-buttoncard { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 14px 16px 18px; }
202
+
203
+ /* html card */
204
+ .pe-htmlcard { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px; }
205
+ .pe-html-input {
206
+ width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
207
+ padding: 10px 12px; font-family: ui-monospace, 'SF Mono', monospace; font-size: 12.5px; resize: vertical;
208
+ }
209
+ .pe-html-input:focus { outline: none; border-color: var(--accent); }
210
+ .pe-html-preview { width: 100%; min-height: 120px; border: 0; border-radius: var(--r-md); background: var(--bg); }
211
+
212
+ /* callout (editor) */
213
+ .pe-callout .pc-callout-emoji { background: none; border: none; cursor: pointer; font-family: inherit; }
214
+
215
+ /* bubble & floating menus */
216
+ .pe-bubble {
217
+ display: flex; align-items: center; gap: 2px;
218
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 3px;
219
+ box-shadow: var(--shadow-pop);
220
+ }
221
+ .pe-bubble button {
222
+ background: none; border: none; color: var(--muted); font-family: inherit; font-size: 12.5px;
223
+ font-weight: 600; padding: 5px 8px; border-radius: 5px; cursor: pointer;
224
+ }
225
+ .pe-bubble button:hover { color: var(--text); background: rgb(26 29 37 / 5%); }
226
+ .pe-bubble button.is-active { color: var(--accent-deep); background: var(--accent-soft); }
227
+ .pe-bubble-sep { width: 1px; height: 16px; background: var(--line); margin: 0 3px; }
228
+
229
+ .pe-floating { display: flex; align-items: center; gap: 2px; margin-left: -6px; }
230
+ .pe-floating button {
231
+ background: none; border: 1px solid var(--line); color: var(--faint); font-family: inherit;
232
+ font-size: 11.5px; font-weight: 600; padding: 2px 8px; border-radius: var(--r-full); cursor: pointer;
233
+ }
234
+ .pe-floating button:hover { color: var(--text); border-color: var(--faint); }
235
+ .pe-floating-hint { font-size: 11.5px; color: var(--faint); margin-left: 6px; }
236
+
237
+ /* slash menu */
238
+ .pe-slash {
239
+ width: 300px; max-height: 330px; overflow-y: auto;
240
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 6px;
241
+ box-shadow: var(--shadow-pop);
242
+ }
243
+ .pe-slash-group { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--faint); padding: 8px 10px 4px; }
244
+ .pe-slash-item {
245
+ display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
246
+ background: none; border: none; border-radius: var(--r-md); padding: 7px 10px; cursor: pointer; font-family: inherit;
247
+ }
248
+ .pe-slash-item.is-selected { background: var(--accent-soft); }
249
+ .pe-slash-icon { width: 30px; height: 30px; flex: 0 0 auto; display: grid; place-items: center; background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-sm); color: var(--muted); }
250
+ .pe-slash-icon svg { width: 16px; height: 16px; }
251
+ .pe-slash-item.is-selected .pe-slash-icon { color: var(--accent-deep); }
252
+ .pe-slash-title { display: block; font-size: 13px; font-weight: 600; color: var(--text); }
253
+ .pe-slash-desc { display: block; font-size: 11.5px; color: var(--faint); }
254
+ .pe-slash-empty { padding: 12px; color: var(--faint); font-size: 12.5px; }
255
+
256
+ /* publish popover */
257
+ .pe-publish-wrap { position: relative; }
258
+ .pe-popover {
259
+ position: absolute; top: calc(100% + 8px); right: 0; width: 264px; z-index: 40;
260
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 6px;
261
+ box-shadow: var(--shadow-pop);
262
+ }
263
+ .pe-pop-item { display: block; width: 100%; text-align: left; background: none; border: none; border-radius: var(--r-sm); padding: 8px 10px; cursor: pointer; font-family: inherit; }
264
+ .pe-pop-item:hover { background: rgb(26 29 37 / 4%); }
265
+ .pe-pop-item b { display: block; font-size: 13px; color: var(--text); }
266
+ .pe-pop-item span { display: block; font-size: 11.5px; color: var(--faint); }
267
+ .pe-pop-sep { height: 1px; background: var(--line); margin: 6px 4px; }
268
+ .pe-pop-note { font-size: 12px; color: var(--amber); padding: 8px 10px 4px; }
269
+ .pe-pop-schedule { padding: 6px 10px 8px; display: flex; flex-direction: column; gap: 8px; }
270
+ .pe-pop-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--faint); }
271
+ .pe-pop-schedule input { background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md); padding: 6px 9px; font-size: 12.5px; font-family: inherit; color-scheme: light; }
272
+
273
+ /* sidebar */
274
+ .pe-sidebar {
275
+ position: fixed; top: 0; right: 0; bottom: 0; width: 320px; z-index: 35;
276
+ background: var(--panel); border-left: 1px solid var(--line);
277
+ padding: 14px 16px 24px; overflow-y: auto;
278
+ }
279
+ .pe-sidebar-head { display: flex; align-items: center; justify-content: space-between; font-weight: 700; font-size: 14px; margin-bottom: 14px; }
280
+ .pe-field { display: block; margin-bottom: 14px; }
281
+ .pe-field > span { display: flex; justify-content: space-between; font-size: 12px; color: var(--muted); margin-bottom: 5px; font-weight: 500; }
282
+ .pe-field > span em { font-style: normal; color: var(--faint); font-size: 11px; }
283
+ .pe-field input, .pe-field textarea {
284
+ width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
285
+ padding: 7px 10px; font-size: 13px; font-family: inherit; resize: vertical; color-scheme: light;
286
+ }
287
+ .pe-field input:focus, .pe-field textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
288
+ .pe-slug { display: flex; align-items: center; background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); }
289
+ .pe-slug:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
290
+ .pe-slug-prefix { color: var(--faint); font-size: 13px; padding-left: 10px; }
291
+ .pe-slug input { border: none !important; box-shadow: none !important; padding-left: 2px; }
292
+ .pe-seo { border-top: 1px solid var(--line); margin-top: 4px; padding-top: 12px; }
293
+ .pe-seo summary { cursor: pointer; font-size: 13px; font-weight: 600; color: var(--muted); margin-bottom: 10px; }
294
+ .pe-danger { border-top: 1px solid var(--line); margin-top: 18px; padding-top: 16px; }
295
+
296
+ /* tags */
297
+ .pe-tags {
298
+ display: flex; flex-wrap: wrap; gap: 6px; align-items: center;
299
+ background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); padding: 6px 8px;
300
+ }
301
+ .pe-tags:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
302
+ .pe-tag {
303
+ display: inline-flex; align-items: center; gap: 5px;
304
+ background: var(--accent-soft); color: var(--accent-deep); font-size: 12px; font-weight: 600;
305
+ padding: 2px 8px; border-radius: var(--r-full);
306
+ }
307
+ .pe-tag button { background: none; border: none; color: inherit; cursor: pointer; font-size: 10px; padding: 0; }
308
+ .pe-tags input { flex: 1; min-width: 80px; background: none !important; border: none !important; box-shadow: none !important; padding: 2px !important; }
309
+ .pe-tags-wrap { position: relative; }
310
+ .pe-tag-suggest {
311
+ position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 30;
312
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-sm);
313
+ overflow: hidden; box-shadow: var(--shadow-pop);
314
+ }
315
+ .pe-tag-suggest button {
316
+ display: block; width: 100%; text-align: left; background: none; border: none;
317
+ color: var(--text); font: inherit; font-size: 13px; padding: 7px 11px; cursor: pointer;
318
+ }
319
+ .pe-tag-suggest button:hover { background: var(--accent-soft); color: var(--accent-deep); }
320
+
321
+ /* ---- media crop modal ---- */
322
+ .mc-modal { width: min(880px, 94vw); }
323
+ .mc-dims { color: var(--faint); font-size: 12px; font-variant-numeric: tabular-nums; }
324
+ .mc-stage { padding: 16px; display: grid; place-items: center; min-height: 320px; }
325
+ .mc-loading { color: var(--muted); font-size: 13px; }
326
+ .mc-canvas { position: relative; display: inline-block; max-width: 100%; touch-action: none; user-select: none; }
327
+ .mc-canvas img { display: block; max-width: 100%; max-height: 56vh; width: auto; height: auto; }
328
+ .mc-crop {
329
+ position: absolute; cursor: move; box-sizing: border-box;
330
+ border: 1.5px solid var(--accent);
331
+ box-shadow: 0 0 0 9999px rgb(0 0 0 / 55%);
332
+ }
333
+ .mc-handle {
334
+ position: absolute; width: 12px; height: 12px; background: var(--accent);
335
+ border: 2px solid #fff; border-radius: 50%;
336
+ }
337
+ .mc-nw { left: -7px; top: -7px; cursor: nwse-resize; }
338
+ .mc-ne { right: -7px; top: -7px; cursor: nesw-resize; }
339
+ .mc-sw { left: -7px; bottom: -7px; cursor: nesw-resize; }
340
+ .mc-se { right: -7px; bottom: -7px; cursor: nwse-resize; }
341
+ .mc-toolbar {
342
+ display: flex; align-items: center; justify-content: space-between; gap: 12px;
343
+ padding: 12px 16px; border-top: 1px solid var(--line); flex-wrap: wrap;
344
+ }
345
+ .mc-aspects, .mc-actions { display: flex; gap: 6px; flex-wrap: wrap; }
346
+
347
+ /* modal (image picker) */
348
+ .pe-modal-backdrop {
349
+ position: fixed; inset: 0; z-index: 60; background: rgb(20 22 28 / 40%);
350
+ display: grid; place-items: center; padding: 24px; backdrop-filter: blur(2px);
351
+ }
352
+ .pe-modal {
353
+ width: 100%; max-width: 640px; max-height: 80vh; display: flex; flex-direction: column;
354
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden;
355
+ box-shadow: 0 24px 60px rgb(26 29 37 / 28%);
356
+ }
357
+ .pe-modal-head { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; border-bottom: 1px solid var(--line); }
358
+ .pe-tabs { display: flex; gap: 2px; }
359
+ .pe-tabs button { background: none; border: none; color: var(--muted); font-family: inherit; font-size: 13px; font-weight: 600; padding: 6px 12px; border-radius: var(--r-md); cursor: pointer; }
360
+ .pe-tabs button:hover { color: var(--text); }
361
+ .pe-tabs button.is-active { color: var(--accent-deep); background: var(--accent-soft); }
362
+ .pe-modal-close { background: none; border: none; color: var(--muted); cursor: pointer; font-size: 13px; padding: 6px 8px; }
363
+ .pe-modal-error { color: var(--red); font-size: 12.5px; padding: 10px 16px 0; }
364
+ .pe-dropzone {
365
+ margin: 16px; min-height: 220px; display: grid; place-items: center; text-align: center;
366
+ border: 1.5px dashed var(--line-strong); border-radius: var(--r-md); cursor: pointer; color: var(--muted);
367
+ }
368
+ .pe-dropzone.is-over { border-color: var(--accent); background: var(--accent-soft); }
369
+ .pe-dropzone.is-busy { cursor: wait; }
370
+ .pe-dropzone b { color: var(--text); }
371
+ .pe-dropzone-hint { color: var(--faint); font-size: 12px; margin-top: 4px; }
372
+ .pe-unsplash-search { display: flex; gap: 8px; padding: 12px 16px 0; }
373
+ .pe-unsplash-search input { flex: 1; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md); padding: 7px 10px; font-size: 13.5px; font-family: inherit; }
374
+ .pe-unsplash-search input:focus { outline: none; border-color: var(--accent); }
375
+ .pe-grid {
376
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px;
377
+ padding: 14px 16px 16px; overflow-y: auto;
378
+ }
379
+ .pe-grid-note { color: var(--faint); font-size: 13px; grid-column: 1 / -1; padding: 12px; }
380
+ .pe-grid-item {
381
+ position: relative; aspect-ratio: 4/3; border: 1px solid var(--line); border-radius: 8px;
382
+ overflow: hidden; padding: 0; background: var(--panel-2); cursor: pointer;
383
+ }
384
+ .pe-grid-item:hover { border-color: var(--accent); }
385
+ .pe-grid-item img { width: 100%; height: 100%; object-fit: cover; display: block; }
386
+ .pe-grid-credit {
387
+ position: absolute; left: 0; right: 0; bottom: 0; font-size: 10.5px; color: #fff;
388
+ background: linear-gradient(transparent, rgb(0 0 0 / 70%)); padding: 14px 8px 5px; text-align: left;
389
+ }
390
+
391
+ /* preview overlay */
392
+ .pe-preview { position: fixed; inset: 0; z-index: 70; background: var(--bg); display: flex; flex-direction: column; }
393
+ .pe-preview-bar {
394
+ display: flex; align-items: center; justify-content: space-between; gap: 12px;
395
+ padding: 10px 18px; border-bottom: 1px solid var(--line);
396
+ }
397
+ .pe-devices { display: flex; gap: 2px; background: var(--panel-2); border: 1px solid var(--line); border-radius: 8px; padding: 2px; }
398
+ .pe-devices button {
399
+ background: none; border: none; color: var(--muted); font-family: inherit; font-size: 12.5px;
400
+ font-weight: 600; padding: 4px 14px; border-radius: 6px; cursor: pointer;
401
+ }
402
+ .pe-devices button.is-active { background: var(--accent-soft); color: var(--text); }
403
+ .pe-preview-actions { display: flex; gap: 8px; }
404
+ .pe-preview-stage { flex: 1; display: flex; justify-content: center; overflow: hidden; padding: 0; background: var(--panel-2); }
405
+ .pe-preview-stage iframe { height: 100%; border: 0; background: #fff; transition: width 0.2s ease; }
406
+ .pe-preview-stage iframe.is-framed { border-left: 1px solid var(--line); border-right: 1px solid var(--line); }
407
+
408
+ /* ---- post-list card (dynamic block) ---- */
409
+ .pe-postlist { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px 12px 10px; }
410
+ .pe-postlist.is-selected { box-shadow: 0 0 0 2px var(--accent); }
411
+ .pe-postlist-config { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 10px; padding-right: 56px; }
412
+ .pe-postlist-badge { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; background: var(--accent-soft); color: var(--accent-deep); border-radius: var(--r-full); padding: 3px 9px; }
413
+ .pe-postlist-config select, .pe-postlist-config input[type='text'] {
414
+ width: auto; flex: 0 1 auto; background: var(--bg); color: var(--text);
415
+ border: 1px solid var(--line); border-radius: var(--r-md); padding: 5px 8px;
416
+ font-size: 12.5px; font-family: inherit; color-scheme: light;
417
+ }
418
+ .pe-postlist-config input[type='text'] { width: 120px; }
419
+ .pe-postlist-config label { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--muted); white-space: nowrap; }
420
+ .pe-postlist-config label input { accent-color: var(--accent); }
421
+ .pe-postlist-ghost { position: relative; display: grid; gap: 10px; background: var(--bg); border: 1.5px dashed var(--line); border-radius: 8px; padding: 12px 12px 30px; }
422
+ .pe-postlist-ghost.layout-grid { grid-template-columns: 1fr 1fr; }
423
+ .pe-postlist-ghostcard .g-img { height: 42px; border-radius: 6px; background: var(--panel-2); margin-bottom: 7px; }
424
+ .pe-postlist-ghost.layout-feature .pe-postlist-ghostcard .g-img { height: 72px; }
425
+ .pe-postlist-ghostcard .g-line { height: 7px; border-radius: 4px; background: var(--panel-2); margin: 5px 0; }
426
+ .g-line.w60 { width: 60%; } .g-line.w75 { width: 75%; } .g-line.w90 { width: 90%; }
427
+ .pe-postlist-note { position: absolute; bottom: 6px; left: 12px; right: 12px; margin: 0; font-size: 11px; color: var(--faint); }
428
+
429
+
430
+ /* publish popover v2: explicit CTA + header, success toast */
431
+ .pe-pop-head { padding: 8px 10px 10px; border-bottom: 1px solid var(--line); margin-bottom: 10px; }
432
+ .pe-pop-head b { display: block; font-size: 13.5px; color: var(--text); margin-bottom: 2px; }
433
+ .pe-pop-head span { display: block; font-size: 11.5px; color: var(--faint); line-height: 1.45; }
434
+ .pe-pop-cta { display: block; width: calc(100% - 8px); margin: 0 4px 8px; text-align: center; padding: 9px 12px; font-size: 13.5px; font-weight: 600; text-decoration: none; }
435
+ .pe-pop-schedule { border-top: 1px solid var(--line); margin-top: 2px; padding-top: 10px; }
436
+ .pe-pop-schedrow { display: flex; gap: 8px; }
437
+ .pe-pop-schedrow input { flex: 1; min-width: 0; }
438
+ .pe-pop-schedrow .pe-btn { flex-shrink: 0; }
439
+ .pe-pop-hint { font-size: 11px; color: var(--faint); }
440
+ .pe-toast {
441
+ position: fixed; top: 14px; left: 50%; transform: translateX(-50%); z-index: 90;
442
+ display: flex; align-items: center; gap: 10px;
443
+ background: var(--green-soft); border: 1px solid rgb(18 116 66 / 25%); color: var(--green);
444
+ border-radius: var(--r-md); padding: 9px 16px; font-size: 13px;
445
+ box-shadow: var(--shadow-pop);
446
+ animation: pe-toast-in 0.18s ease-out;
447
+ }
448
+ .pe-toast-check { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 50%; background: #1c9e5a; color: #fff; font-size: 11px; }
449
+ .pe-toast a { color: #0f5c34; font-weight: 600; text-decoration: none; }
450
+ .pe-toast a:hover { text-decoration: underline; }
451
+ @keyframes pe-toast-in { from { opacity: 0; transform: translate(-50%, -6px); } to { opacity: 1; transform: translate(-50%, 0); } }
452
+ .pe-check-hint { display: block; font-style: normal; font-size: 11px; color: var(--faint); margin-top: 1px; }
453
+
454
+ /* image width hint inside the editor column */
455
+ .pe-imagecard.w-wide { margin-left: -48px; margin-right: -48px; }
456
+ .pe-imagecard.w-full { margin-left: -96px; margin-right: -96px; }
457
+ .pe-imagecard.w-wide img, .pe-imagecard.w-full img { border-radius: 4px; }
458
+
459
+ /* ---- phase-2 cards: file, gallery, bookmark ---- */
460
+ .pe-filecard .pc-filecard { margin: 0; cursor: default; }
461
+ .pe-filecard input[type='file'] { font-size: 13px; }
462
+
463
+ .pe-gallery-empty {
464
+ border: 1.5px dashed var(--border, #d5d2ca); border-radius: 9px; padding: 22px;
465
+ text-align: center; font-size: 13.5px; color: var(--muted, #8a8880);
466
+ }
467
+ .pe-gallery-item { position: relative; display: block; }
468
+ .pe-gallery-item img {
469
+ width: 100%; height: 100%; aspect-ratio: 4 / 3; object-fit: cover;
470
+ border-radius: 8px; display: block;
471
+ }
472
+ .pe-gallery-x {
473
+ position: absolute; top: 6px; right: 6px; width: 22px; height: 22px;
474
+ border: 0; border-radius: 50%; background: rgb(0 0 0 / 55%); color: #fff;
475
+ font-size: 11px; cursor: pointer; opacity: 0; transition: opacity 0.12s;
476
+ display: flex; align-items: center; justify-content: center;
477
+ }
478
+ .pe-gallery-item:hover .pe-gallery-x { opacity: 1; }
479
+
480
+ .pe-bookmarkcard .pc-bookmark { margin: 0; cursor: default; }
481
+
482
+ /* floating link editor (⌘K) */
483
+ .pe-linkedit {
484
+ position: sticky; top: 12px; z-index: 60;
485
+ display: flex; gap: 8px; align-items: center;
486
+ background: var(--panel, #fff); border: 1px solid var(--border, #d5d2ca);
487
+ border-radius: 10px; padding: 8px 10px; margin: 0 auto 12px;
488
+ max-width: 560px; box-shadow: 0 10px 30px rgb(0 0 0 / 14%);
489
+ }
490
+ .pe-linkedit input {
491
+ flex: 1; border: 0; outline: none; font-size: 14px; background: none; color: inherit;
492
+ }
493
+
494
+ /* shortcut cheat-sheet */
495
+ .pe-wordcount { display: flex; align-items: center; gap: 10px; }
496
+ .pe-shortcuts-btn {
497
+ border: 1px solid var(--border, #d5d2ca); background: none; border-radius: 6px;
498
+ font-size: 10.5px; padding: 2px 7px; color: var(--muted, #8a8880); cursor: pointer;
499
+ }
500
+ .pe-shortcuts-btn:hover { color: inherit; }
501
+ .pe-shortcuts-overlay {
502
+ position: fixed; inset: 0; z-index: 90; background: rgb(0 0 0 / 40%);
503
+ display: flex; align-items: center; justify-content: center; padding: 24px;
504
+ }
505
+ .pe-shortcuts {
506
+ background: var(--panel, #fff); border-radius: 14px; padding: 20px 24px;
507
+ width: min(440px, 100%); max-height: 80vh; overflow-y: auto;
508
+ box-shadow: 0 24px 60px rgb(0 0 0 / 25%);
509
+ }
510
+ .pe-shortcuts-head {
511
+ display: flex; align-items: center; justify-content: space-between;
512
+ font-weight: 600; margin-bottom: 6px;
513
+ }
514
+ .pe-shortcuts-group { margin-top: 14px; }
515
+ .pe-shortcuts-title {
516
+ font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em;
517
+ color: var(--muted, #8a8880); margin-bottom: 6px;
518
+ }
519
+ .pe-shortcuts-row { display: flex; align-items: baseline; gap: 12px; padding: 4px 0; font-size: 13.5px; }
520
+ .pe-shortcuts-row kbd {
521
+ flex: none; min-width: 108px; font-family: ui-monospace, monospace; font-size: 12px;
522
+ color: var(--muted, #6d685e);
523
+ }
524
+
525
+ /* multi-author checklist in the sidebar */
526
+ .pe-authors {
527
+ display: flex; flex-direction: column; gap: 2px;
528
+ border: 1px solid var(--border, #d5d2ca); border-radius: 9px; padding: 8px 10px;
529
+ max-height: 180px; overflow-y: auto;
530
+ }
531
+ .pe-author-check { font-size: 13.5px; padding: 3px 0; }
532
+
533
+ /* ---- calendar card (dynamic block) ---- */
534
+ .pe-calcard { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px 12px 10px; }
535
+ .pe-calcard.is-selected { box-shadow: 0 0 0 2px var(--accent); }
536
+ .pe-calcard.is-empty { padding: 12px; }
537
+ .pe-calendar-config { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 10px; padding-right: 56px; }
538
+ .pe-calendar-config select, .pe-calendar-config input[type='text'] {
539
+ width: auto; flex: 0 1 auto; background: var(--bg); color: var(--text);
540
+ border: 1px solid var(--line); border-radius: var(--r-md); padding: 5px 8px;
541
+ font-size: 12.5px; font-family: inherit; color-scheme: light;
542
+ }
543
+ .pe-calendar-config input.pe-cal-title { flex: 1 1 180px; }
544
+ .pe-calendar-config label { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--muted); white-space: nowrap; }
545
+ .pe-calendar-config label input { accent-color: var(--accent); }
546
+ .pe-cal-sources { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 10px; }
547
+ .pe-cal-chip {
548
+ display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text);
549
+ background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-full); padding: 4px 6px 4px 9px;
550
+ }
551
+ .pe-cal-chip i { width: 7px; height: 7px; border-radius: 99px; flex: none; }
552
+ .pe-cal-chip button { border: 0; background: none; color: var(--faint); font-size: 10px; cursor: pointer; padding: 2px 4px; }
553
+ .pe-cal-chip button:hover { color: var(--red); }
554
+ .pe-cal-add { display: inline-flex; gap: 6px; }
555
+ .pe-cal-add input {
556
+ background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
557
+ padding: 5px 8px; font-size: 12.5px; font-family: inherit; width: 200px;
558
+ }
559
+ .pe-cal-preview { position: relative; background: var(--bg); border: 1.5px dashed var(--line); border-radius: 8px; padding: 10px 12px 30px; }
560
+ .pe-cal-previewrow { display: flex; align-items: baseline; gap: 8px; font-size: 12.5px; color: var(--text); padding: 3px 0; }
561
+ .pe-cal-previewrow i { width: 6px; height: 6px; border-radius: 99px; flex: none; align-self: center; }
562
+ .pe-cal-previewrow .w { flex: 0 0 130px; color: var(--muted); font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.04em; font-weight: 600; }
563
+ .pe-cal-previewrow .ti { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
564
+ .pe-cal-preview .pe-postlist-note { position: absolute; bottom: 6px; left: 12px; right: 12px; }
565
+
566
+ /* ---- info cards (static block) ---- */
567
+ .pe-infocards { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px; }
568
+ .pe-infocards.is-selected { box-shadow: 0 0 0 2px var(--accent); }
569
+ .pe-infocards-empty { font-size: 13px; color: var(--muted); padding: 2px 2px 10px; }
570
+ .pe-infocard {
571
+ background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md);
572
+ padding: 10px; margin-bottom: 10px;
573
+ }
574
+ .pe-infocard-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
575
+ .pe-infocard input[type='text'], .pe-infocard input[type='url'], .pe-infocard select, .pe-infocard textarea {
576
+ background: var(--panel); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
577
+ padding: 5px 8px; font-size: 12.5px; font-family: inherit; color-scheme: light; width: auto;
578
+ }
579
+ .pe-infocard-title { flex: 1 1 140px; font-weight: 600; }
580
+ .pe-infocard-badge { flex: 0 1 130px; }
581
+ .pe-infocard-ops { display: inline-flex; gap: 2px; margin-left: auto; }
582
+ .pe-infocard-ops button {
583
+ border: 0; background: none; color: var(--faint); font-size: 12px; cursor: pointer; padding: 3px 5px;
584
+ }
585
+ .pe-infocard-ops button:hover:not(:disabled) { color: var(--text); }
586
+ .pe-infocard-ops button:disabled { opacity: 0.35; cursor: default; }
587
+ .pe-infocard-ops button[title='Remove card']:hover { color: var(--red); }
588
+ .pe-infocard-desc { display: block; width: 100%; resize: vertical; margin-bottom: 8px; line-height: 1.45; }
589
+ .pe-infocard-line { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; }
590
+ .pe-infocard-line input { flex: 1; }
591
+ .pe-infocard-line button { border: 0; background: none; color: var(--faint); font-size: 10px; cursor: pointer; padding: 2px 4px; }
592
+ .pe-infocard-line button:hover { color: var(--red); }
593
+ .pe-infocard-icon { display: flex; align-items: center; color: var(--muted); }
594
+ .pe-infocard-icon svg { width: 14px; height: 14px; }
595
+ .pe-infocard-foot { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
596
+ .pe-infocard-href { flex: 1; }