@floless/app 0.7.1 → 0.9.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.
package/dist/web/app.css CHANGED
@@ -987,6 +987,9 @@
987
987
  background: var(--accent-bright);
988
988
  box-shadow: 0 0 14px var(--accent-glow);
989
989
  }
990
+ /* A disabled action reads as inert — never a primary that looks clickable but isn't. */
991
+ .modal-actions button:disabled { opacity: 0.5; cursor: default; }
992
+ .modal-actions button.primary:disabled:hover { background: var(--accent); box-shadow: none; }
990
993
  .modal.library {
991
994
  width: 720px;
992
995
  max-height: 82vh;
@@ -2262,3 +2265,221 @@ body {
2262
2265
  .req-thumb { width: 46px; height: 46px; padding: 0; border: 1px solid var(--border-strong); border-radius: 4px; background: var(--bg); overflow: hidden; cursor: pointer; flex-shrink: 0; transition: border-color 0.15s; }
2263
2266
  .req-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
2264
2267
  .req-thumb:hover { border-color: var(--accent-dim); }
2268
+
2269
+ /* ============================================================================
2270
+ * Release notes — the click-to-open popover on the footer update pills, and the
2271
+ * relaunch-surviving "what's new" panel after a floless.app self-update.
2272
+ * Baseline tokens only (shadcn dark slate-blue): no new fonts/colours/aesthetics.
2273
+ * The popover's upward shadow IS the elevation cue (no decorative arrow); change
2274
+ * types are typeset, never coloured badges (only `.added` borrows --accent).
2275
+ * ==========================================================================*/
2276
+
2277
+ /* ── Popover (shared by #app-update and #aware-update) ───────────────────── */
2278
+ .relnotes-popover {
2279
+ position: fixed;
2280
+ width: 320px;
2281
+ background: var(--surface);
2282
+ border: 1px solid var(--border-strong);
2283
+ border-radius: 8px;
2284
+ box-shadow: 0 -8px 32px rgba(0, 0, 0, 0.55), 0 0 0 1px var(--border-strong);
2285
+ z-index: 1000;
2286
+ color: var(--text);
2287
+ animation: relnotes-in 0.14s ease-out;
2288
+ }
2289
+ .relnotes-popover[hidden] { display: none; }
2290
+ @keyframes relnotes-in {
2291
+ from { opacity: 0; transform: translateY(6px); }
2292
+ to { opacity: 1; transform: translateY(0); }
2293
+ }
2294
+ .relnotes-header { padding: 16px 16px 0; }
2295
+ .relnotes-title { font-size: 14px; font-weight: 700; color: var(--text); line-height: 1.3; }
2296
+ .relnotes-summary { font-size: 12px; color: var(--text-muted); margin-top: 4px; line-height: 1.45; }
2297
+ .relnotes-body {
2298
+ padding: 12px 16px;
2299
+ max-height: 260px;
2300
+ overflow-y: auto;
2301
+ border-top: 1px solid var(--border);
2302
+ border-bottom: 1px solid var(--border);
2303
+ }
2304
+ .relnotes-actions { padding: 12px 16px; display: flex; gap: 8px; align-items: center; }
2305
+
2306
+ /* Typed change bullets — REUSED verbatim by the what's-new panel (one renderer). */
2307
+ .relnotes-group { margin-bottom: 12px; }
2308
+ .relnotes-group:last-child { margin-bottom: 0; }
2309
+ .relnotes-type {
2310
+ font-family: var(--mono);
2311
+ font-size: 9px;
2312
+ text-transform: uppercase;
2313
+ letter-spacing: 0.16em;
2314
+ font-weight: 600;
2315
+ color: var(--text-dim);
2316
+ margin-bottom: 5px;
2317
+ }
2318
+ .relnotes-type.added { color: var(--accent); }
2319
+ .relnotes-list { list-style: none; display: flex; flex-direction: column; gap: 3px; }
2320
+ .relnotes-item {
2321
+ position: relative;
2322
+ font-size: 12px;
2323
+ color: var(--text-muted);
2324
+ line-height: 1.45;
2325
+ padding-left: 12px;
2326
+ }
2327
+ .relnotes-item::before { content: "–"; position: absolute; left: 0; color: var(--text-dim); }
2328
+
2329
+ /* Skeleton — renders instantly while notes load; the action row is live beneath it. */
2330
+ .relnotes-skel { display: flex; flex-direction: column; gap: 8px; }
2331
+ .relnotes-skel-line {
2332
+ height: 11px;
2333
+ border-radius: 3px;
2334
+ background: var(--surface-2);
2335
+ position: relative;
2336
+ overflow: hidden;
2337
+ }
2338
+ .relnotes-skel-line:nth-child(2) { width: 85%; }
2339
+ .relnotes-skel-line:nth-child(3) { width: 70%; }
2340
+ .relnotes-skel-line::after {
2341
+ content: "";
2342
+ position: absolute;
2343
+ inset: 0;
2344
+ transform: translateX(-100%);
2345
+ background: linear-gradient(90deg, transparent, var(--surface-3), transparent);
2346
+ animation: relnotes-shimmer 1.3s ease-in-out infinite;
2347
+ }
2348
+ @keyframes relnotes-shimmer { to { transform: translateX(100%); } }
2349
+ .relnotes-unavailable { font-size: 12px; color: var(--text-dim); font-style: italic; }
2350
+
2351
+ /* Action row — Update now reuses the modal .primary recipe; the changelog link is a ghost. */
2352
+ .relnotes-update {
2353
+ background: var(--accent);
2354
+ color: #fff;
2355
+ border: 1px solid var(--accent);
2356
+ font-weight: 600;
2357
+ padding: 7px 14px;
2358
+ border-radius: 4px;
2359
+ font-size: 12px;
2360
+ cursor: pointer;
2361
+ transition: background 0.15s, box-shadow 0.15s;
2362
+ }
2363
+ .relnotes-update:hover { background: var(--accent-bright); box-shadow: 0 0 14px var(--accent-glow); }
2364
+ .relnotes-update[disabled] { opacity: 0.6; cursor: default; }
2365
+ .relnotes-update[disabled]:hover { background: var(--accent); box-shadow: none; }
2366
+ .relnotes-changelog {
2367
+ margin-left: auto;
2368
+ background: transparent;
2369
+ border: 1px solid transparent;
2370
+ color: var(--text-dim);
2371
+ padding: 7px 10px;
2372
+ border-radius: 4px;
2373
+ font-size: 12px;
2374
+ text-decoration: none;
2375
+ cursor: pointer;
2376
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
2377
+ }
2378
+ .relnotes-changelog:hover { background: var(--surface-2); border-color: var(--border-strong); color: var(--text-muted); }
2379
+ .relnotes-update:focus-visible,
2380
+ .relnotes-changelog:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2381
+
2382
+ /* The AWARE version label becomes a notes affordance after an in-place upgrade. */
2383
+ .aware-version.relnotes-reopen { cursor: pointer; }
2384
+ .aware-version.relnotes-reopen:hover { color: var(--accent-bright); }
2385
+
2386
+ /* ── What's-new panel (floless.app post-update) ─────────────────────────────
2387
+ A 4th grid row above the footer — NOT absolutely positioned. .has-whats-new
2388
+ inserts an `auto` row + a full-width `whats-new` area between the body and footer. */
2389
+ .app.has-whats-new {
2390
+ grid-template-rows: 60px 1fr auto 44px;
2391
+ grid-template-areas:
2392
+ "header header header"
2393
+ "chat canvas inspect"
2394
+ "whats-new whats-new whats-new"
2395
+ "footer footer footer";
2396
+ }
2397
+ .whats-new {
2398
+ grid-area: whats-new;
2399
+ background: var(--surface);
2400
+ border-top: 1px solid var(--border);
2401
+ border-bottom: 1px solid var(--border);
2402
+ border-left: 3px solid var(--accent);
2403
+ font-size: 12px;
2404
+ padding: 0 18px;
2405
+ overflow: hidden;
2406
+ }
2407
+ .whats-new[hidden] { display: none; }
2408
+ .whats-new-summary { display: flex; align-items: center; gap: 10px; height: 44px; }
2409
+ .whats-new-label {
2410
+ font-family: var(--mono);
2411
+ font-size: 10px;
2412
+ text-transform: uppercase;
2413
+ letter-spacing: 0.14em;
2414
+ color: var(--accent);
2415
+ font-weight: 600;
2416
+ flex-shrink: 0;
2417
+ }
2418
+ .whats-new-summary-text {
2419
+ font-size: 12px;
2420
+ color: var(--text-muted);
2421
+ flex: 1;
2422
+ overflow: hidden;
2423
+ text-overflow: ellipsis;
2424
+ white-space: nowrap;
2425
+ }
2426
+ .whats-new-toggle {
2427
+ flex-shrink: 0;
2428
+ background: transparent;
2429
+ border: 1px solid var(--border-strong);
2430
+ color: var(--text-muted);
2431
+ padding: 4px 10px;
2432
+ border-radius: 4px;
2433
+ font-size: 11px;
2434
+ cursor: pointer;
2435
+ transition: border-color 0.15s, color 0.15s, background 0.15s;
2436
+ }
2437
+ .whats-new-toggle:hover { color: var(--accent); border-color: var(--accent-dim); }
2438
+ .whats-new-link {
2439
+ flex-shrink: 0;
2440
+ color: var(--text-dim);
2441
+ font-size: 11px;
2442
+ text-decoration: none;
2443
+ padding: 4px 6px;
2444
+ border-radius: 4px;
2445
+ transition: color 0.15s;
2446
+ }
2447
+ .whats-new-link:hover { color: var(--accent-bright); }
2448
+ .whats-new-dismiss {
2449
+ flex-shrink: 0;
2450
+ width: 26px;
2451
+ height: 26px;
2452
+ display: inline-flex;
2453
+ align-items: center;
2454
+ justify-content: center;
2455
+ padding: 0;
2456
+ background: transparent;
2457
+ border: 1px solid transparent;
2458
+ border-radius: 4px;
2459
+ color: var(--text-dim);
2460
+ font-size: 12px;
2461
+ line-height: 1;
2462
+ cursor: pointer;
2463
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
2464
+ }
2465
+ .whats-new-dismiss:hover { color: var(--text); border-color: var(--border-strong); background: var(--surface-2); }
2466
+ .whats-new-toggle:focus-visible,
2467
+ .whats-new-link:focus-visible,
2468
+ .whats-new-dismiss:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2469
+ .whats-new-detail {
2470
+ display: grid;
2471
+ grid-template-rows: 0fr;
2472
+ transition: grid-template-rows 0.18s ease-out;
2473
+ overflow: hidden;
2474
+ }
2475
+ .whats-new-detail.open { grid-template-rows: 1fr; }
2476
+ .whats-new-detail-inner { overflow: hidden; padding-bottom: 14px; }
2477
+
2478
+ /* Reduced motion — kill the popover entry, the skeleton shimmer, and the
2479
+ what's-new expand transition; the surfaces still read via their static styling.
2480
+ Mirrors the .rtn-fired-flash / node-running reduced-motion precedents above. */
2481
+ @media (prefers-reduced-motion: reduce) {
2482
+ .relnotes-popover { animation: none; }
2483
+ .relnotes-skel-line::after { animation: none; }
2484
+ .whats-new-detail { transition: none; }
2485
+ }
package/dist/web/app.js CHANGED
@@ -972,6 +972,7 @@ function handleMenuAction(action) {
972
972
  case 'find': openFind(); break;
973
973
  case 'integrations': openIntegrations(); break;
974
974
  case 'routines': openRoutines(); break;
975
+ case 'report-issue': openReportIssue(); break;
975
976
  }
976
977
  }
977
978