@fasl-work/caos-app-shell 0.13.1 → 0.14.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.
@@ -22,6 +22,7 @@
22
22
  "caos-architecture-diagram",
23
23
  "caos-badges",
24
24
  "caos-bars",
25
+ "caos-card",
25
26
  "caos-chart",
26
27
  "caos-chart-key",
27
28
  "caos-chart-legend",
@@ -33,8 +34,15 @@
33
34
  "caos-chipgroup-label",
34
35
  "caos-cw",
35
36
  "caos-cw-context",
37
+ "caos-cw-focus",
36
38
  "caos-cw-panel",
37
39
  "caos-cw-panel-head",
40
+ "caos-deck",
41
+ "caos-deck-bar",
42
+ "caos-deck-btn",
43
+ "caos-deck-card",
44
+ "caos-deck-position",
45
+ "caos-deck-track",
38
46
  "caos-doc-reference-list",
39
47
  "caos-doc-references",
40
48
  "caos-doc-section",
@@ -82,11 +90,24 @@
82
90
  "caos-exec-title",
83
91
  "caos-exec-value",
84
92
  "caos-field",
93
+ "caos-flip",
94
+ "caos-flip-back",
95
+ "caos-flip-content",
96
+ "caos-flip-face",
97
+ "caos-flip-front",
98
+ "caos-flip-icon",
99
+ "caos-flip-inner",
100
+ "caos-flip-return",
101
+ "caos-flip-return-title",
102
+ "caos-flip-title",
103
+ "caos-flip-toggle",
85
104
  "caos-focus-actions",
105
+ "caos-focus-enter",
86
106
  "caos-focus-hud",
87
107
  "caos-focus-instrument",
88
108
  "caos-focus-label",
89
109
  "caos-focus-rail",
110
+ "caos-focus-rail-body",
90
111
  "caos-focus-shell",
91
112
  "caos-focus-stage",
92
113
  "caos-gauge-dot",
@@ -306,6 +327,7 @@
306
327
  "caos-architecture-diagram",
307
328
  "caos-badges",
308
329
  "caos-bars",
330
+ "caos-card",
309
331
  "caos-chart",
310
332
  "caos-chart-key",
311
333
  "caos-chart-legend",
@@ -318,8 +340,15 @@
318
340
  "caos-col-text",
319
341
  "caos-cw",
320
342
  "caos-cw-context",
343
+ "caos-cw-focus",
321
344
  "caos-cw-panel",
322
345
  "caos-cw-panel-head",
346
+ "caos-deck",
347
+ "caos-deck-bar",
348
+ "caos-deck-btn",
349
+ "caos-deck-card",
350
+ "caos-deck-position",
351
+ "caos-deck-track",
323
352
  "caos-doc-reference-list",
324
353
  "caos-doc-references",
325
354
  "caos-doc-section",
@@ -367,11 +396,24 @@
367
396
  "caos-exec-title",
368
397
  "caos-exec-value",
369
398
  "caos-field",
399
+ "caos-flip",
400
+ "caos-flip-back",
401
+ "caos-flip-content",
402
+ "caos-flip-face",
403
+ "caos-flip-front",
404
+ "caos-flip-icon",
405
+ "caos-flip-inner",
406
+ "caos-flip-return",
407
+ "caos-flip-return-title",
408
+ "caos-flip-title",
409
+ "caos-flip-toggle",
370
410
  "caos-focus-actions",
411
+ "caos-focus-enter",
371
412
  "caos-focus-hud",
372
413
  "caos-focus-instrument",
373
414
  "caos-focus-label",
374
415
  "caos-focus-rail",
416
+ "caos-focus-rail-body",
375
417
  "caos-focus-shell",
376
418
  "caos-focus-stage",
377
419
  "caos-gauge-dot",
package/styles.css CHANGED
@@ -517,12 +517,12 @@ svg.lucide { flex: none; }
517
517
  .caos-wb-rail-panel { display: flex; flex-direction: column; gap: 0.8rem; min-height: 0; }
518
518
  /* A labelled control in the rail stacks its text above it; a knob's head keeps its own row, the value at the right
519
519
  (until 0.9.3 this rule outranked `.caos-knob-head` and stacked every knob, a line per knob; CAOS_APP_SHELL#77). */
520
- .caos-wb-rail label:not(.caos-knob-head) { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.8rem; color: var(--color-fg-subtle); }
521
- .caos-wb-rail .select, .caos-wb-rail .range { width: 100%; }
520
+ .caos-wb-rail label:not(.caos-knob-head), .caos-focus-rail label:not(.caos-knob-head) { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.8rem; color: var(--color-fg-subtle); }
521
+ .caos-wb-rail .select, .caos-wb-rail .range, .caos-focus-rail .select, .caos-focus-rail .range { width: 100%; }
522
522
  /* The variants wrap in the rail instead of scrolling. */
523
- .caos-wb-rail .caos-variant-bar { margin-bottom: 0; }
524
- .caos-wb-rail .caos-chip-row { flex-wrap: wrap; overflow: visible; }
525
- .caos-wb-rail .caos-variant-note { font-size: 0.8rem; }
523
+ .caos-wb-rail .caos-variant-bar, .caos-focus-rail .caos-variant-bar { margin-bottom: 0; }
524
+ .caos-wb-rail .caos-chip-row, .caos-focus-rail .caos-chip-row { flex-wrap: wrap; overflow: visible; }
525
+ .caos-wb-rail .caos-variant-note, .caos-focus-rail .caos-variant-note { font-size: 0.8rem; }
526
526
  .caos-wb-main { display: flex; flex-direction: column; min-height: 0; min-width: 0; }
527
527
 
528
528
  /* CaseWorkbench: ONE row of at most six question groups; the open panel takes the height the row leaves and owns its
@@ -767,3 +767,63 @@ svg.lucide { flex: none; }
767
767
  .caos-exec-links { display: flex; flex-wrap: wrap; gap: 0.5rem 1.5rem; padding-top: 0.25rem; }
768
768
  .caos-exec-link { font-weight: 600; }
769
769
  .caos-exec-error { padding: 1rem 1.25rem; border: 1px solid var(--color-bad); border-radius: var(--radius-md); }
770
+
771
+ /* == flip cards and the card deck (shell 0.14.0) ================================================================== */
772
+
773
+ /* A flip card: two faces stacked in one cell (the card is as tall as its back, so a row of cards keeps one height), the
774
+ inner box turns on the Y axis. The hidden face leaves the accessibility tree and the tab order through `visibility`
775
+ (switched after the turn on the way out, at once on the way in) and `aria-hidden`; its content stays in the markup.
776
+ Theme tokens only. Under reduced motion the faces swap without the turn. */
777
+ .caos-flip { position: relative; display: flex; min-width: 0; width: 100%; perspective: 1100px; }
778
+ .caos-flip-inner { display: grid; flex: 1 1 auto; min-width: 0; transform-style: preserve-3d; transition: transform 0.45s ease; }
779
+ .caos-flip[data-flip-open="true"] > .caos-flip-inner { transform: rotateY(180deg); }
780
+ .caos-flip-face { grid-area: 1 / 1; min-width: 0; display: flex; flex-direction: column; background: var(--color-surface-2); border: 1px solid var(--color-border); border-radius: var(--radius-md); overflow-wrap: anywhere; backface-visibility: hidden; -webkit-backface-visibility: hidden; transition: visibility 0s linear 0s; }
781
+ .caos-flip-back { transform: rotateY(180deg); visibility: hidden; padding: 0.8rem 1rem; gap: 0.5rem; transition: visibility 0s linear 0.45s; }
782
+ .caos-flip[data-flip-open="true"] > .caos-flip-inner > .caos-flip-front { visibility: hidden; transition-delay: 0.45s; }
783
+ .caos-flip[data-flip-open="true"] > .caos-flip-inner > .caos-flip-back { visibility: visible; transition-delay: 0s; }
784
+ .caos-flip-toggle { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; width: 100%; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
785
+ .caos-flip-front > .caos-flip-toggle { flex: 1 1 auto; padding: 0.8rem 1rem; font-weight: 650; border-radius: var(--radius-md); }
786
+ .caos-flip-front:hover { border-color: var(--color-accent); }
787
+ .caos-flip-title { min-width: 0; }
788
+ .caos-flip-icon { flex: none; color: var(--color-fg-faint); }
789
+ .caos-flip-return { flex: none; font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.04em; font-weight: 650; color: var(--color-fg-faint); }
790
+ .caos-flip-return-title { min-width: 0; }
791
+ .caos-flip-content { display: flex; flex-direction: column; gap: 0.5rem; min-width: 0; }
792
+ @media (prefers-reduced-motion: reduce) {
793
+ .caos-flip-inner { transform: none !important; transition: none !important; }
794
+ .caos-flip-back { transform: none !important; }
795
+ .caos-flip-face { transition: none !important; }
796
+ }
797
+
798
+ /* The card deck: a row of cards, or a carousel that pages through them (one window of as many cards as fit, at least
799
+ one; the page and the panel never scroll sideways). Entering cards slide in; reduced motion removes it. */
800
+ .caos-deck { display: flex; flex-direction: column; gap: 0.6rem; min-width: 0; }
801
+ .caos-deck-track { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); gap: 0.9rem; min-width: 0; touch-action: pan-y; }
802
+ .caos-deck[data-deck-mode="carousel"] > .caos-deck-track { grid-template-columns: repeat(var(--deck-per, 1), minmax(0, 1fr)); }
803
+ .caos-deck-card { min-width: 0; display: flex; }
804
+ .caos-deck-card[hidden] { display: none; }
805
+ .caos-card { flex: 1 1 auto; min-width: 0; padding: 0.8rem 1rem; background: var(--color-surface-2); border: 1px solid var(--color-border); border-radius: var(--radius-md); display: flex; flex-direction: column; gap: 0.5rem; overflow-wrap: anywhere; }
806
+ .caos-deck-bar { display: flex; align-items: center; justify-content: center; gap: 0.75rem; }
807
+ .caos-deck-btn { display: inline-flex; align-items: center; justify-content: center; width: 2.25rem; height: 2.25rem; padding: 0; border: 1px solid var(--color-border); border-radius: 999px; background: var(--color-surface); color: var(--color-fg); cursor: pointer; }
808
+ .caos-deck-btn:hover { border-color: var(--color-accent); color: var(--color-accent); }
809
+ .caos-deck-btn[aria-disabled="true"] { opacity: 0.4; cursor: default; }
810
+ .caos-deck-btn[aria-disabled="true"]:hover { border-color: var(--color-border); color: var(--color-fg); }
811
+ .caos-deck-position { min-width: 6.5rem; text-align: center; font-size: var(--text-sm); color: var(--color-fg-subtle); font-variant-numeric: tabular-nums; }
812
+ @keyframes caos-deck-in { from { opacity: 0; transform: translateX(0.75rem); } to { opacity: 1; transform: none; } }
813
+ .caos-deck[data-deck-moved] .caos-deck-card { animation: caos-deck-in 0.28s ease-out; }
814
+ @media (prefers-reduced-motion: reduce) { .caos-deck-card { animation: none !important; } }
815
+
816
+ /* Flip cards inside the executive view keep the width of the plain cards they replace. */
817
+ .caos-exec .caos-exec-cs.caos-deck-track { grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); }
818
+ .caos-exec .caos-deck[data-deck-mode="carousel"] > .caos-exec-cs.caos-deck-track { grid-template-columns: repeat(var(--deck-per, 1), minmax(0, 1fr)); }
819
+
820
+ /* == Focus mode for the App (shell 0.14.0, ADR-0070) ================================================================== */
821
+
822
+ /* The stage is the open group; the label overlay (heading and line) sits above it, so the group starts below the label. */
823
+ .caos-focus-instrument > .caos-cw-focus { position: absolute; inset: 0; padding: 4.6rem 0.9rem 0.9rem; }
824
+ .caos-focus-instrument > .caos-cw-focus > .tabs { display: flex; flex-direction: column; min-height: 0; flex: 1 1 auto; }
825
+ .caos-focus-rail-body { display: flex; flex-direction: column; gap: var(--space-3); padding: 0.85rem; min-width: 0; }
826
+ .caos-focus-enter { align-self: flex-start; }
827
+ @media (max-width: 900px) {
828
+ .caos-focus-instrument > .caos-cw-focus { padding: 6.6rem 0.5rem 0.5rem; }
829
+ }