|
58 | 58 |
|
59 | 59 | /* ── Grid ── */ |
60 | 60 | .grid-wrap { |
61 | | - max-width: 1200px; |
| 61 | + max-width: 900px; |
62 | 62 | margin: 0 auto; |
63 | 63 | padding: 0 1.5rem 3rem; |
64 | 64 | } |
65 | 65 | .grid { |
66 | 66 | display: grid; |
67 | | - grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); |
68 | | - gap: 1.25rem; |
| 67 | + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); |
| 68 | + gap: 1rem; |
69 | 69 | } |
70 | 70 |
|
71 | 71 | /* ── Card ── */ |
72 | 72 | .card { |
73 | | - display: block; |
| 73 | + display: flex; |
| 74 | + align-items: flex-start; |
| 75 | + gap: .85rem; |
| 76 | + padding: 1.1rem 1.2rem; |
74 | 77 | background: var(--surface); |
75 | 78 | border: 1px solid var(--border); |
76 | 79 | border-radius: var(--radius); |
77 | | - overflow: hidden; |
78 | 80 | text-decoration: none; |
79 | 81 | color: inherit; |
80 | 82 | box-shadow: var(--shadow-sm); |
81 | 83 | transition: transform .22s cubic-bezier(.22,1,.36,1), |
82 | 84 | box-shadow .22s cubic-bezier(.22,1,.36,1), |
83 | 85 | border-color .18s ease; |
84 | 86 | cursor: pointer; |
85 | | - position: relative; |
86 | 87 | } |
87 | 88 | .card:hover { |
88 | 89 | transform: translateY(-4px); |
89 | 90 | box-shadow: var(--shadow-lg); |
90 | 91 | border-color: color-mix(in oklab, var(--card-accent, #6366f1) 40%, transparent); |
91 | 92 | } |
92 | 93 |
|
93 | | - /* ── Live preview iframe container ── */ |
94 | | - .preview-wrap { |
95 | | - position: relative; |
96 | | - width: 100%; |
97 | | - /* 4:3 aspect ratio container */ |
98 | | - aspect-ratio: 4 / 3; |
99 | | - overflow: hidden; |
100 | | - background: var(--bg); |
101 | | - pointer-events: none; |
102 | | - } |
103 | | - .preview-wrap iframe { |
104 | | - position: absolute; |
105 | | - top: 0; |
106 | | - left: 0; |
107 | | - /* Scale 2.5x so content fills the container with detail */ |
108 | | - width: 250%; |
109 | | - height: 250%; |
110 | | - border: none; |
111 | | - transform: scale(0.4); |
112 | | - transform-origin: top left; |
113 | | - pointer-events: none; |
114 | | - } |
115 | | - |
116 | | - /* ── Card label (bottom) ── */ |
117 | | - .card-label { |
118 | | - display: flex; |
119 | | - align-items: center; |
120 | | - gap: .7rem; |
121 | | - padding: .8rem 1rem; |
122 | | - border-top: 1px solid var(--border); |
123 | | - } |
| 94 | + /* Icon circle */ |
124 | 95 | .card-icon { |
125 | 96 | flex-shrink: 0; |
126 | | - width: 36px; height: 36px; |
127 | | - border-radius: 9px; |
| 97 | + width: 48px; height: 48px; |
| 98 | + border-radius: 12px; |
128 | 99 | display: flex; |
129 | 100 | align-items: center; |
130 | 101 | justify-content: center; |
131 | | - font-size: 1.15rem; |
| 102 | + font-size: 1.5rem; |
132 | 103 | background: color-mix(in oklab, var(--card-accent, #6366f1) 10%, transparent); |
| 104 | + color: var(--card-accent, #6366f1); |
133 | 105 | } |
| 106 | + |
| 107 | + /* Text */ |
| 108 | + .card-body { min-width: 0; flex: 1; } |
134 | 109 | .card-name { |
135 | | - font-size: .85rem; |
| 110 | + font-size: .92rem; |
136 | 111 | font-weight: 700; |
137 | 112 | letter-spacing: -.01em; |
| 113 | + margin: 0 0 .15rem; |
138 | 114 | color: var(--text); |
139 | 115 | } |
140 | 116 | .card-tag { |
141 | | - font-size: .7rem; |
| 117 | + font-size: .78rem; |
142 | 118 | color: var(--text-3); |
| 119 | + line-height: 1.4; |
| 120 | + margin: 0; |
143 | 121 | } |
144 | 122 |
|
145 | 123 | /* ── Footer ── */ |
|
169 | 147 | --shadow-md: 0 4px 16px rgba(0,0,0,.3); |
170 | 148 | --shadow-lg: 0 12px 40px rgba(0,0,0,.45); |
171 | 149 | } |
172 | | - .preview-wrap { |
173 | | - background: #0d0d0f; |
174 | | - } |
175 | 150 | } |
176 | 151 |
|
177 | 152 | /* ── Mobile ── */ |
@@ -223,30 +198,12 @@ <h1>schema-apps</h1> |
223 | 198 | a.className = "card"; |
224 | 199 | a.href = "./" + app.file; |
225 | 200 | a.style.setProperty("--card-accent", app.accent); |
226 | | - |
227 | | - // Live iframe preview |
228 | | - const preview = document.createElement("div"); |
229 | | - preview.className = "preview-wrap"; |
230 | | - const iframe = document.createElement("iframe"); |
231 | | - iframe.src = "./" + app.file; |
232 | | - iframe.loading = "lazy"; |
233 | | - iframe.setAttribute("sandbox", "allow-same-origin"); |
234 | | - iframe.setAttribute("tabindex", "-1"); |
235 | | - iframe.setAttribute("aria-hidden", "true"); |
236 | | - preview.appendChild(iframe); |
237 | | - a.appendChild(preview); |
238 | | - |
239 | | - // Label |
240 | | - const label = document.createElement("div"); |
241 | | - label.className = "card-label"; |
242 | | - label.innerHTML = |
| 201 | + a.innerHTML = |
243 | 202 | '<div class="card-icon">' + app.icon + '</div>' + |
244 | | - '<div>' + |
245 | | - '<div class="card-name">' + app.name + '</div>' + |
246 | | - '<div class="card-tag">' + app.tag + '</div>' + |
| 203 | + '<div class="card-body">' + |
| 204 | + '<p class="card-name">' + app.name + '</p>' + |
| 205 | + '<p class="card-tag">' + app.tag + '</p>' + |
247 | 206 | '</div>'; |
248 | | - a.appendChild(label); |
249 | | - |
250 | 207 | grid.appendChild(a); |
251 | 208 | } |
252 | 209 | </script> |
|
0 commit comments