duoop-ui 1.0.0 → 1.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 (5) hide show
  1. package/README.md +131 -200
  2. package/THIRD_PARTY_NOTICES.md +116 -116
  3. package/lib/index.js +2657 -2255
  4. package/lib/styles.css +1743 -1364
  5. package/package.json +80 -79
package/lib/styles.css CHANGED
@@ -44,117 +44,122 @@ button:disabled {
44
44
  white-space: nowrap;
45
45
  border: 0;
46
46
  }
47
- :focus-visible {
48
- outline: 2px solid currentColor;
49
- outline-offset: -4px;
47
+ /* Focus stays within the component: no additional surrounding ring. */
48
+ :focus {
49
+ outline: none;
50
+ }
51
+ :where(button, a, select, [role="button"]):focus-visible {
52
+ text-decoration-line: underline;
53
+ text-decoration-thickness: 2px;
54
+ text-underline-offset: 4px;
50
55
  }
51
56
  @media (prefers-reduced-motion: reduce) {
52
57
  html {
53
58
  scroll-behavior: auto;
54
59
  }
55
60
  }
56
- .duoop-breadcrumb {
57
- color: #373434;
58
- font-family: "DM Sans", sans-serif;
59
- font-size: 14px;
60
- min-inline-size: 0;
61
- }
62
- .duoop-breadcrumb__list {
63
- display: flex;
64
- align-items: center;
65
- flex-wrap: wrap;
66
- gap: 4px 8px;
67
- list-style: none;
68
- padding: 0;
69
- margin: 0;
70
- }
71
- .duoop-breadcrumb__item {
72
- display: inline-flex;
73
- min-inline-size: 0;
74
- max-inline-size: 100%;
75
- }
76
- .duoop-breadcrumb__link,
77
- .duoop-breadcrumb__page {
78
- display: inline-flex;
79
- align-items: center;
80
- min-block-size: 44px;
81
- padding: 8px 12px;
82
- border: 2px solid transparent;
83
- border-radius: 10px;
84
- overflow-wrap: anywhere;
85
- }
86
- .duoop-breadcrumb__link {
87
- color: #686565;
88
- text-decoration: none;
89
- transition:
90
- transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1),
91
- box-shadow 180ms ease-out,
92
- background-color 150ms ease-out,
93
- border-color 150ms ease-out,
94
- color 150ms ease-out;
95
- }
96
- .duoop-breadcrumb__link:hover {
97
- color: #373434;
98
- background: #fff;
99
- border-color: #373434;
100
- box-shadow: 2px 2px 0 #1d1b1b;
101
- transform: translateY(-2px);
102
- }
103
- .duoop-breadcrumb__link:active {
104
- transform: translate(1px, 1px);
105
- box-shadow: none;
106
- }
107
- .duoop-breadcrumb__link:focus-visible {
108
- outline: none;
109
- border-color: #373434;
110
- text-decoration: underline;
111
- text-decoration-thickness: 2px;
112
- text-underline-offset: 4px;
113
- }
114
- .duoop-breadcrumb__page {
115
- background: #f0eeee;
116
- border-color: #373434;
117
- font-weight: 600;
118
- box-shadow: 2px 2px 0 #1d1b1b;
119
- }
120
- .duoop-breadcrumb__separator {
121
- color: #777474;
122
- flex: 0 0 auto;
123
- user-select: none;
124
- }
125
- @media (prefers-reduced-motion: reduce) {
126
- .duoop-breadcrumb__link {
127
- transition: none;
128
- }
129
- .duoop-breadcrumb__link:hover,
130
- .duoop-breadcrumb__link:active {
131
- transform: none;
132
- }
133
- }
134
- .duoop-separator {
135
- --separator-color: #777474;
136
- flex-shrink: 0;
137
- background: var(--separator-color);
138
- border: 0;
139
- border-radius: 1px;
140
- }
141
- .duoop-separator[data-orientation="horizontal"] {
142
- block-size: 1px;
143
- inline-size: 100%;
144
- margin-block: 24px;
145
- }
146
- .duoop-separator[data-orientation="vertical"] {
147
- inline-size: 1px;
148
- align-self: stretch;
149
- min-block-size: 24px;
150
- margin-inline: 16px;
151
- }
152
- @media (forced-colors: active) {
153
- .duoop-separator {
154
- background: CanvasText;
155
- forced-color-adjust: none;
156
- }
157
- }
61
+ .duoop-breadcrumb {
62
+ color: #373434;
63
+ font-family: "DM Sans", sans-serif;
64
+ font-size: 14px;
65
+ min-inline-size: 0;
66
+ }
67
+ .duoop-breadcrumb__list {
68
+ display: flex;
69
+ align-items: center;
70
+ flex-wrap: wrap;
71
+ gap: 4px 8px;
72
+ list-style: none;
73
+ padding: 0;
74
+ margin: 0;
75
+ }
76
+ .duoop-breadcrumb__item {
77
+ display: inline-flex;
78
+ min-inline-size: 0;
79
+ max-inline-size: 100%;
80
+ }
81
+ .duoop-breadcrumb__link,
82
+ .duoop-breadcrumb__page {
83
+ display: inline-flex;
84
+ align-items: center;
85
+ min-block-size: 44px;
86
+ padding: 8px 12px;
87
+ border: 2px solid transparent;
88
+ border-radius: 10px;
89
+ overflow-wrap: anywhere;
90
+ }
91
+ .duoop-breadcrumb__link {
92
+ color: #686565;
93
+ text-decoration: none;
94
+ transition:
95
+ transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1),
96
+ box-shadow 180ms ease-out,
97
+ background-color 150ms ease-out,
98
+ border-color 150ms ease-out,
99
+ color 150ms ease-out;
100
+ }
101
+ .duoop-breadcrumb__link:hover {
102
+ color: #373434;
103
+ background: #fff;
104
+ border-color: #373434;
105
+ box-shadow: 2px 2px 0 #1d1b1b;
106
+ transform: translateY(-2px);
107
+ }
108
+ .duoop-breadcrumb__link:active {
109
+ transform: translate(1px, 1px);
110
+ box-shadow: none;
111
+ }
112
+ .duoop-breadcrumb__link:focus-visible {
113
+ outline: none;
114
+ border-color: #373434;
115
+ text-decoration: underline;
116
+ text-decoration-thickness: 2px;
117
+ text-underline-offset: 4px;
118
+ }
119
+ .duoop-breadcrumb__page {
120
+ background: #f0eeee;
121
+ border-color: #373434;
122
+ font-weight: 600;
123
+ box-shadow: 2px 2px 0 #1d1b1b;
124
+ }
125
+ .duoop-breadcrumb__separator {
126
+ color: #777474;
127
+ flex: 0 0 auto;
128
+ user-select: none;
129
+ }
130
+ @media (prefers-reduced-motion: reduce) {
131
+ .duoop-breadcrumb__link {
132
+ transition: none;
133
+ }
134
+ .duoop-breadcrumb__link:hover,
135
+ .duoop-breadcrumb__link:active {
136
+ transform: none;
137
+ }
138
+ }
139
+ .duoop-separator {
140
+ --separator-color: #777474;
141
+ flex-shrink: 0;
142
+ background: var(--separator-color);
143
+ border: 0;
144
+ border-radius: 1px;
145
+ }
146
+ .duoop-separator[data-orientation="horizontal"] {
147
+ block-size: 1px;
148
+ inline-size: 100%;
149
+ margin-block: 24px;
150
+ }
151
+ .duoop-separator[data-orientation="vertical"] {
152
+ inline-size: 1px;
153
+ align-self: stretch;
154
+ min-block-size: 24px;
155
+ margin-inline: 16px;
156
+ }
157
+ @media (forced-colors: active) {
158
+ .duoop-separator {
159
+ background: CanvasText;
160
+ forced-color-adjust: none;
161
+ }
162
+ }
158
163
  .duoop-button {
159
164
  --button-face: #373434; --button-text: #fff; --button-edge: #1d1b1b; --button-depth: 4px;
160
165
  appearance: none; display: inline-grid; place-items: center; position: relative;
@@ -235,7 +240,6 @@ button:disabled {
235
240
  /* Intent variants share the same mechanical geometry. */
236
241
  .duoop-button--destructive { --button-face: #b42332; --button-text: #fff; --button-edge: #681322; }
237
242
  .duoop-button--destructive-outline { --button-face: #fff; --button-text: #a51d2d; --button-edge: #a51d2d; }
238
- .duoop-button--destructive:focus-visible, .duoop-button--destructive-outline:focus-visible { outline-color: #a51d2d; }
239
243
  .duoop-button--destructive[aria-pressed=true] { --button-face: #801b29; --button-text: #fff; --button-edge: #681322; }
240
244
  .duoop-button--destructive-outline[aria-pressed=true] { --button-face: #ffe9ec; --button-text: #8a1927; --button-edge: #a51d2d; }
241
245
  .duoop-button--link { --button-face: transparent; --button-text: #191919; --button-edge: transparent; --button-depth: 0px; padding-inline: 8px; border-radius: 4px; }
@@ -257,7 +261,6 @@ button:disabled {
257
261
  .duoop-button[data-custom-color]:is(.duoop-button--ghost,.duoop-button--link) { --button-face:transparent; --button-text:var(--custom-ink); --button-edge:transparent; }
258
262
  .duoop-button[data-custom-color][aria-pressed=true] { --button-face:var(--custom-hover); }
259
263
  .duoop-button[data-custom-color][aria-pressed=true]:is(.duoop-button--outline,.duoop-button--destructive-outline,.duoop-button--ghost,.duoop-button--link) { --button-face:var(--custom-tint); }
260
- .duoop-button[data-custom-color]:focus-visible { outline-color:var(--custom-ink); }
261
264
  @media (hover:hover) {
262
265
  .duoop-button[data-custom-color]:hover:not([aria-disabled=true]) { background:var(--custom-hover); }
263
266
  .duoop-button[data-custom-color]:is(.duoop-button--outline,.duoop-button--destructive-outline,.duoop-button--ghost,.duoop-button--link):hover:not([aria-disabled=true]) { background:var(--custom-tint); }
@@ -276,7 +279,7 @@ button:disabled {
276
279
  .duoop-button[data-status=success] { --button-face:#356247; --button-edge:#234631; --button-text:#fff; background:var(--button-face); color:var(--button-text); animation:feedback-reveal 240ms ease-out; }
277
280
  .duoop-button[data-status=error] { --button-face:#a51d2d; --button-edge:#761725; --button-text:#fff; background:var(--button-face); color:var(--button-text); }
278
281
  .duoop-button:focus-visible { outline:none; }
279
- .duoop-button:focus-visible::after { content:''; position:absolute; inset:5px; border:1px solid currentColor; border-radius:4px; pointer-events:none; }
282
+ .duoop-button:focus-visible::after { content:''; position:absolute; inset:auto 5px 4px; height:2px; background:currentColor; border-radius:1px; pointer-events:none; }
280
283
  @media(prefers-reduced-motion:reduce) { .action-feedback-content,.feedback-orbit,.feedback-symbol,.duoop-button[data-status=success] { animation:none; } }
281
284
 
282
285
  .action-feedback:empty { display:none; }
@@ -308,7 +311,7 @@ button:disabled {
308
311
  .duoop-badge--interactive { cursor:pointer; transition:transform 220ms cubic-bezier(.2,1.7,.35,1),box-shadow 220ms cubic-bezier(.2,1.7,.35,1),background-color 150ms ease-out,color 150ms ease-out; }
309
312
  @media(hover:hover) { .duoop-badge--interactive:hover { transform:translateY(-2px) rotate(-1deg); box-shadow:0 4px 0 var(--badge-edge); } }
310
313
  .duoop-badge--interactive:active { transform:translateY(2px) scale(.97); box-shadow:none; transition-duration:80ms; }
311
- .duoop-badge--interactive:focus-visible,.duoop-badge__remove:focus-visible { outline:2px solid currentColor; outline-offset:-5px; border-style:solid; }
314
+ .duoop-badge--interactive:focus-visible,.duoop-badge__remove:focus-visible { outline:none; border-style:dashed; }
312
315
  .duoop-badge[data-disabled] { opacity:.5; pointer-events:none; }
313
316
  .duoop-badge__label { overflow:hidden; text-overflow:ellipsis; }
314
317
  .duoop-badge__dot { width:8px; height:8px; flex:none; border:1.5px solid currentColor; background:currentColor; transform:rotate(45deg); border-radius:1px; }
@@ -352,7 +355,7 @@ button:disabled {
352
355
  .duoop-dialog__close { position: absolute; z-index: 1; inset-block-start: 24px; inset-inline-end: 24px; width: 44px; height: 44px; color: inherit; border: 2px solid #373434; border-radius: 10px; background: #fff; box-shadow: 0 3px 0 #1d1b1b; display: grid; place-items: center; cursor: pointer; transition: transform 180ms cubic-bezier(.2,.8,.2,1),box-shadow 180ms ease,background 150ms ease; }
353
356
  .duoop-dialog__close:hover { background: #f0eeee; transform: translateY(-2px); box-shadow: 0 5px 0 #1d1b1b; }
354
357
  .duoop-dialog__close:active { transform: translateY(3px); box-shadow: 0 0 0 #1d1b1b; }
355
- .duoop-dialog__close:focus-visible { outline: 2px solid #373434; outline-offset: -7px; }
358
+ .duoop-dialog__close:focus-visible { outline:none; }
356
359
  .duoop-dialog__close svg { width: 19px; height: 19px; fill: none; stroke: currentColor; stroke-width: 2; }
357
360
  .duoop-dialog__body input,.duoop-dialog__body textarea { box-sizing: border-box; width: 100%; min-height: 46px; margin-top: 8px; border: 2px solid #777474; border-radius: 10px; padding: 12px 14px; background: #fff; color: #373434; font: inherit; font-weight: 400; transition: border-color 150ms ease,background 150ms ease; }
358
361
  .duoop-dialog__body input:focus,.duoop-dialog__body textarea:focus { outline: none; border-color: #373434; background: #faf9f8; box-shadow: inset 3px 0 #373434; }
@@ -431,7 +434,9 @@ button:disabled {
431
434
  .feedback-lab-controls input[type=range]::-webkit-slider-thumb { appearance:none; width:20px; height:24px; margin-top:-10px; border:2px solid #1d1b1b; border-radius:5px; background:#fff; box-shadow:0 3px 0 #1d1b1b; }
432
435
  .feedback-lab-controls input[type=range]::-moz-range-track { height:5px; border:2px solid #1d1b1b; border-radius:4px; background:#e8e4e4; }
433
436
  .feedback-lab-controls input[type=range]::-moz-range-thumb { width:16px; height:20px; border:2px solid #1d1b1b; border-radius:5px; background:#fff; box-shadow:0 3px 0 #1d1b1b; }
434
- .feedback-lab-controls input[type=range]:focus-visible { outline:2px solid #373434; outline-offset:-4px; border-radius:4px; }
437
+ .feedback-lab-controls input[type=range]:focus-visible { outline:none; border-radius:4px; }
438
+ .feedback-lab-controls input[type=range]:focus-visible::-webkit-slider-thumb { background:#e8e4e4; border-style:dashed; }
439
+ .feedback-lab-controls input[type=range]:focus-visible::-moz-range-thumb { background:#e8e4e4; border-style:dashed; }
435
440
  .feedback-lab-controls .duoop-switch { grid-column:1/-1; }
436
441
  .feedback-lab-stage { background:var(--feedback-soft); padding:40px; display:flex; flex-direction:column; justify-content:center; gap:28px; min-width:0; min-height:330px; }
437
442
  .toast-showcase .gallery-card-preview,.progress-showcase .gallery-card-preview { padding:32px 24px; min-height:280px; align-items:center; }
@@ -442,9 +447,9 @@ button:disabled {
442
447
  .feedback-lab-controls .duoop-select { min-width:0; }
443
448
  @media(max-width:500px) { .feedback-lab-controls { grid-template-columns:minmax(0,1fr); } }
444
449
  /* Shared presentation for the three related catalogue families. */
445
- .stepper-showcase .gallery-grid,.reaction-button-showcase .gallery-grid,.achievement-showcase .gallery-grid { grid-template-columns:repeat(2,minmax(0,1fr)); align-items:start; }
446
- .stepper-showcase .gallery-card--wide,.achievement-showcase .gallery-card--wide { grid-column:1 / -1; }
447
- .stepper-showcase .gallery-card-preview,.reaction-button-showcase .gallery-card-preview,.achievement-showcase .gallery-card-preview { min-height:280px; padding:36px 28px; }
450
+ .stepper-showcase .gallery-grid,.reaction-button-showcase .gallery-grid { grid-template-columns:repeat(2,minmax(0,1fr)); align-items:start; }
451
+ .stepper-showcase .gallery-card--wide { grid-column:1 / -1; }
452
+ .stepper-showcase .gallery-card-preview,.reaction-button-showcase .gallery-card-preview { min-height:280px; padding:36px 28px; }
448
453
  .experience-demo { width:100%; min-width:0; display:flex; flex-direction:column; align-items:stretch; gap:24px; }
449
454
  .experience-demo[data-theme=dark] { padding:24px; background:var(--feedback-face); border-radius:10px; }
450
455
  .experience-kicker { margin:0; color:var(--feedback-muted); font-size: 10px; font-weight:650; letter-spacing:.12em; text-transform:uppercase; }
@@ -468,8 +473,8 @@ button:disabled {
468
473
  .experience-surface[data-theme=dark] .duoop-button:disabled { --button-face:#383333; --button-text:#bdb5b5; --button-edge:#746a6a; }
469
474
  .experience-surface .duoop-checkbox { --check-fg:var(--feedback-ink); --check-muted:var(--feedback-muted); --check-bg:var(--feedback-face); --check-border:var(--feedback-edge); --check-soft:var(--feedback-soft); --check-error:var(--feedback-error); --check-shadow:var(--feedback-edge); }
470
475
  @media(max-width:700px) {
471
- .stepper-showcase .gallery-grid,.reaction-button-showcase .gallery-grid,.achievement-showcase .gallery-grid { grid-template-columns:minmax(0,1fr); }
472
- .stepper-showcase .gallery-card-preview,.reaction-button-showcase .gallery-card-preview,.achievement-showcase .gallery-card-preview { padding:28px 20px; }
476
+ .stepper-showcase .gallery-grid,.reaction-button-showcase .gallery-grid { grid-template-columns:minmax(0,1fr); }
477
+ .stepper-showcase .gallery-card-preview,.reaction-button-showcase .gallery-card-preview { padding:28px 20px; }
473
478
  }
474
479
  .duoop-reaction { position:relative; display:inline-flex; align-items:center; flex-wrap:wrap; gap:12px; max-width:100%; color:var(--feedback-ink,#373434); }
475
480
  .reaction-control-wrap { position:relative; display:inline-flex; max-width:100%; }
@@ -596,7 +601,7 @@ button:disabled {
596
601
  .duoop-textarea.duoop-input--lg { min-height:144px; }
597
602
  .duoop-input-group { display:flex; flex-wrap:wrap; align-items:center; gap:8px; width:100%; min-width:0; padding:4px 10px; border:2px solid #777474; border-radius:10px; background:#fff; color:#686565; transition:border-color 140ms ease,box-shadow 180ms ease-out; }
598
603
  .duoop-input-group:hover { border-color:#373434; }
599
- .duoop-input-group:focus-within { border-color:#373434; box-shadow:0 3px 0 #373434; }
604
+ .duoop-input-group:focus-within { outline:none; border-color:#373434; box-shadow:0 3px 0 #373434; }
600
605
  .duoop-input-group:has([aria-invalid=true]) { border-color:#a51d2d; }
601
606
  .duoop-input-group:has([aria-invalid=true]):focus-within { box-shadow:0 3px 0 #a51d2d; }
602
607
  .duoop-input-group>.duoop-input { order:1; flex:1; width:0; min-width:0; min-height:32px; padding:4px 0; border:0; border-radius:0; background:transparent; box-shadow:none; }
@@ -626,12 +631,12 @@ button:disabled {
626
631
  .duoop-textarea { scrollbar-width:thin; scrollbar-color:#aaa5a5 transparent; }
627
632
  .textarea-resizable { position:relative; width:100%; min-width:0; padding-bottom:18px; border:2px solid #777474; border-radius:10px; background:#fff; transition:border-color 140ms ease,box-shadow 180ms ease-out; }
628
633
  .textarea-resizable:hover { border-color:#373434; }
629
- .textarea-resizable:focus-within { border-color:#373434; box-shadow:0 3px 0 #373434; }
634
+ .textarea-resizable:focus-within { outline:none; border-color:#373434; box-shadow:0 3px 0 #373434; }
630
635
  .textarea-resizable>.duoop-textarea { border:0; border-radius:8px; box-shadow:none; }
631
636
  .textarea-resize-handle { position:absolute; bottom:0; left:calc(50% - 24px); width:48px; height:24px; display:grid; place-items:center; border:0; background:transparent; cursor:ns-resize; touch-action:none; padding:0; }
632
637
  .textarea-resize-handle span { width:24px; height:3px; border-radius:3px; background:#b3adad; transition:background 140ms ease; }
633
638
  .textarea-resize-handle:hover span,.textarea-resize-handle:focus-visible span { background:#373434; }
634
- .textarea-resize-handle:focus-visible { outline:2px solid #373434; outline-offset:0; border-radius:4px; }
639
+ .textarea-resize-handle:focus-visible { outline:none; border-radius:4px; }
635
640
  .duoop-input[type=search]::-webkit-search-cancel-button,.duoop-input[type=search]::-webkit-search-decoration { -webkit-appearance:none; appearance:none; }
636
641
  .group-icon-action,.group-loading-action { display:grid; place-items:center; flex-shrink:0; width:32px; height:32px; padding:0; border:0; border-radius:6px; background:transparent; color:#686565; transition:background 140ms ease,color 140ms ease,transform 140ms ease; }
637
642
  .group-icon-action:hover,.group-loading-action:hover { background:#efeded; color:#252323; }
@@ -738,12 +743,12 @@ button:disabled {
738
743
  .number-field { width:100%; min-width:0; }
739
744
  .number-control { display:flex; align-items:stretch; min-height:44px; border:2px solid #777474; border-radius:10px; background:#fff; transition:border-color 140ms ease,box-shadow 180ms ease-out; overflow:hidden; }
740
745
  .number-control:hover { border-color:#373434; }
741
- .number-control:focus-within { border-color:#373434; box-shadow:0 3px 0 #373434; }
746
+ .number-control:focus-within { outline:none; border-color:#373434; box-shadow:0 3px 0 #373434; }
742
747
  .number-control input { width:100%; min-width:0; margin:0; padding:10px 4px; border:0; border-radius:0; background:transparent; color:#252323; font: inherit; font-size: 14px; text-align:center; font-variant-numeric:tabular-nums; outline:none; }
743
748
  .number-control button { flex:0 0 42px; padding:0; border:0; border-radius:0; color:#373434; background:transparent; font: inherit; font-size: 20px; cursor:pointer; transition:background 140ms ease,transform 120ms ease; }
744
749
  .number-control button:hover:not(:disabled) { background:#efeded; }
745
750
  .number-control button:active:not(:disabled) { transform:translateY(2px); }
746
- .number-control button:focus-visible { outline:2px solid #373434; outline-offset:-5px; border-radius:8px; }
751
+ .number-control button:focus-visible { outline:none; border-radius:8px; }
747
752
  .number-control button:disabled { color:#b2adad; cursor:not-allowed; }
748
753
  .number-field--sm .number-control { min-height:36px; }
749
754
  .number-field--sm input { padding:7px 4px; font-size: 12px; }
@@ -798,7 +803,7 @@ button:disabled {
798
803
  .checkbox-control input:indeterminate + .checkbox-box .checkbox-dash { opacity:1; transform:scaleX(1); }
799
804
  .checkbox-label:hover .checkbox-control input:not(:disabled) + .checkbox-box { border-color:var(--check-fg); }
800
805
  .checkbox-label:active .checkbox-control input:not(:disabled):not([readonly]) + .checkbox-box { transform:translateY(2px); box-shadow:0 0 0 var(--check-shadow); }
801
- .checkbox-control input:focus-visible + .checkbox-box { outline:2px solid currentColor; outline-offset:-5px; border-style:solid; }
806
+ .checkbox-control input:focus-visible + .checkbox-box { outline:none; border-style:dashed; }
802
807
  .checkbox-content { display:flex; flex:1; min-width:0; flex-direction:column; gap:5px; }
803
808
  .checkbox-title { display:flex; align-items:baseline; flex-wrap:wrap; gap:5px 7px; font-weight:550; overflow-wrap:anywhere; }
804
809
  .checkbox-title small { color:var(--check-muted); font-size: 11px; font-weight:400; }
@@ -874,7 +879,7 @@ button:disabled {
874
879
  .radio-control input:checked + .radio-disc > span { opacity:1; transform:scale(1); }
875
880
  .radio-option:hover:not(:has(:disabled)) .radio-disc { border-color:var(--selection-fg,#373434); }
876
881
  .radio-option:active:not(:has(:disabled)) .radio-disc { transform:translateY(2px) scale(.94); box-shadow:0 0 0 var(--selection-shadow,#1d1b1b); }
877
- .radio-control input:focus-visible + .radio-disc,.switch-control input:focus-visible + .switch-track { border-style:solid; outline:2px solid currentColor; outline-offset:-5px; }
882
+ .radio-control input:focus-visible + .radio-disc,.switch-control input:focus-visible + .switch-track { border-style:dashed; outline:none; }
878
883
  .radio-option--row,.radio-option--card { padding:18px; border:2px solid var(--selection-border,#777474); border-radius:10px; transition:background-color 160ms ease, border-color 160ms ease, transform 180ms cubic-bezier(.2,.8,.2,1),box-shadow 140ms ease; }
879
884
  .radio-option--row:has(:checked),.radio-option--card:has(:checked) { background:var(--selection-soft,#f0eeee); border-color:var(--selection-fg,#373434); box-shadow:0 3px 0 var(--selection-shadow,#1d1b1b); }
880
885
  .radio-option--row:hover:not(:has(:disabled)),.radio-option--card:hover:not(:has(:disabled)) { background:var(--selection-soft,#f0eeee); transform:translateY(-1px); }
@@ -923,7 +928,7 @@ button:disabled {
923
928
  @keyframes selection-reveal { from { opacity:0; transform:translateY(-5px); } to { opacity:1; transform:translateY(0); } }
924
929
  @media(prefers-reduced-motion:reduce) { .radio-disc,.radio-disc > span,.radio-option,.selection-image svg,.switch-track,.switch-thumb,.duoop-switch--card .switch-label { transition:none; } .selection-error,.selection-reveal,.switch-spinner { animation:none; } }
925
930
  @media(forced-colors:active) { .radio-disc,.switch-track { forced-color-adjust:none; background:Canvas; border-color:ButtonText; } .radio-disc > span { background:Highlight; } .switch-control input:checked + .switch-track { background:Highlight; border-color:Highlight; } .switch-thumb { background:Canvas; border-color:ButtonText; } }
926
- .duoop-select-field{position:relative;display:grid;gap:7px;width:max-content;max-width:100%;color:#373434;font-size: 13px}.duoop-select-field>label{font-weight:600}.duoop-select-field--fixed{width:280px}.duoop-select-field--full{width:100%}.duoop-select__help,.duoop-select__error{font-size: 11px;line-height:1.5;color:#686565}.duoop-select__error{color:#a51d2d}.duoop-select{--select-face:#fff;--select-edge:#373434;min-width:220px;max-width:100%;height:48px;padding:0 13px 0 15px;border:2px solid var(--select-edge);border-radius:10px;background:var(--select-face);box-shadow:0 3px 0 #1d1b1b;color:#373434;display:flex;align-items:center;gap:12px;text-align:left;font: 500 13px/1.3 inherit;cursor:pointer;transition:transform 100ms ease,box-shadow 120ms ease,background 150ms ease}.duoop-select>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.duoop-select>span[data-placeholder]{color:#777474}.duoop-select>svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;flex:none;transition:transform 200ms ease}.duoop-select[aria-expanded=true]>svg{transform:rotate(180deg)}.duoop-select:hover:not(:disabled){background:#f4f2f2}.duoop-select:active:not(:disabled){transform:translateY(2px);box-shadow:0 1px 0 #1d1b1b}.duoop-select:focus-visible{outline:2px solid var(--select-edge);outline-offset:-6px}.duoop-select:disabled{opacity:.45;cursor:not-allowed}.duoop-select[aria-invalid=true]{--select-edge:#a51d2d;background:#fff5f5;box-shadow:0 3px 0 #761725}.duoop-select--sm{height:40px;min-width:180px}.duoop-select--lg{height:56px;min-width:260px;font-size: 14px}.duoop-select--ghost{border-color:transparent;box-shadow:none}.duoop-select--filled{background:#f0eeee}.duoop-select-field--full .duoop-select{width:100%}.duoop-select__popup{position:absolute;z-index:30;inset-block-start:calc(100% + 9px);inset-inline:0;min-width:max(100%,240px);animation:select-open 180ms cubic-bezier(.2,.8,.2,1);transform-origin:top}.duoop-select__popup ul{list-style:none;margin:0;padding:7px;max-height:280px;overflow:auto;overscroll-behavior:contain;border:2px solid #373434;border-radius:10px;background:#fff;box-shadow:0 5px 0 #1d1b1b}.duoop-select__popup [role=option]{min-height:42px;padding:8px 10px;border-radius:6px;display:flex;align-items:center;gap:10px;cursor:pointer}.duoop-select__popup [role=option][data-active]{background:#f0eeee}.duoop-select__popup [role=option][aria-disabled=true]{opacity:.4;cursor:not-allowed}.duoop-select__option-copy{min-width:0;display:grid;gap:2px;flex:1}.duoop-select__option-copy strong{font-size: 12px;font-weight:600}.duoop-select__option-copy small{font-size: 11px;color:#686565}.duoop-select__option-meta{font-size: 10px;color:#686565}.duoop-select__option-icon{display:grid;place-items:center}.duoop-select__option-icon svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8}.duoop-select__check{width:18px;height:18px;fill:none;stroke:#373434;stroke-width:2.2;opacity:0;transform:scale(.7);transition:opacity 120ms ease,transform 160ms cubic-bezier(.2,.8,.2,1)}[role=option][data-selected] .duoop-select__check{opacity:1;transform:scale(1)}.duoop-select__group{padding:9px 10px 5px;color:#686565;font-size: 10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.duoop-select__separator{height:1px;background:#e0dddd;margin:6px}.duoop-select__popup *{scrollbar-width:thin;scrollbar-color:#aaa5a5 transparent}@keyframes select-open{from{opacity:0;transform:translateY(-5px) scale(.98)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.duoop-select,.duoop-select>svg,.duoop-select__popup,.duoop-select__check{animation:none;transition:none}}
931
+ .duoop-select-field{position:relative;display:grid;gap:7px;width:max-content;max-width:100%;color:#373434;font-size: 13px}.duoop-select-field>label{font-weight:600}.duoop-select-field--fixed{width:280px}.duoop-select-field--full{width:100%}.duoop-select__help,.duoop-select__error{font-size: 11px;line-height:1.5;color:#686565}.duoop-select__error{color:#a51d2d}.duoop-select{--select-face:#fff;--select-edge:#373434;min-width:220px;max-width:100%;height:48px;padding:0 13px 0 15px;border:2px solid var(--select-edge);border-radius:10px;background:var(--select-face);box-shadow:0 3px 0 #1d1b1b;color:#373434;display:flex;align-items:center;gap:12px;text-align:left;font: 500 13px/1.3 inherit;cursor:pointer;transition:transform 100ms ease,box-shadow 120ms ease,background 150ms ease}.duoop-select>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.duoop-select>span[data-placeholder]{color:#777474}.duoop-select>svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;flex:none;transition:transform 200ms ease}.duoop-select[aria-expanded=true]>svg{transform:rotate(180deg)}.duoop-select:hover:not(:disabled){background:#f4f2f2}.duoop-select:active:not(:disabled){transform:translateY(2px);box-shadow:0 1px 0 #1d1b1b}.duoop-select:focus-visible{outline:none;}.duoop-select:disabled{opacity:.45;cursor:not-allowed}.duoop-select[aria-invalid=true]{--select-edge:#a51d2d;background:#fff5f5;box-shadow:0 3px 0 #761725}.duoop-select--sm{height:40px;min-width:180px}.duoop-select--lg{height:56px;min-width:260px;font-size: 14px}.duoop-select--ghost{border-color:transparent;box-shadow:none}.duoop-select--filled{background:#f0eeee}.duoop-select-field--full .duoop-select{width:100%}.duoop-select__popup{position:absolute;z-index:30;inset-block-start:calc(100% + 9px);inset-inline:0;min-width:max(100%,240px);animation:select-open 180ms cubic-bezier(.2,.8,.2,1);transform-origin:top}.duoop-select__popup ul{list-style:none;margin:0;padding:7px;max-height:280px;overflow:auto;overscroll-behavior:contain;border:2px solid #373434;border-radius:10px;background:#fff;box-shadow:0 5px 0 #1d1b1b}.duoop-select__popup [role=option]{min-height:42px;padding:8px 10px;border-radius:6px;display:flex;align-items:center;gap:10px;cursor:pointer}.duoop-select__popup [role=option][data-active]{background:#f0eeee}.duoop-select__popup [role=option][aria-disabled=true]{opacity:.4;cursor:not-allowed}.duoop-select__option-copy{min-width:0;display:grid;gap:2px;flex:1}.duoop-select__option-copy strong{font-size: 12px;font-weight:600}.duoop-select__option-copy small{font-size: 11px;color:#686565}.duoop-select__option-meta{font-size: 10px;color:#686565}.duoop-select__option-icon{display:grid;place-items:center}.duoop-select__option-icon svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8}.duoop-select__check{width:18px;height:18px;fill:none;stroke:#373434;stroke-width:2.2;opacity:0;transform:scale(.7);transition:opacity 120ms ease,transform 160ms cubic-bezier(.2,.8,.2,1)}[role=option][data-selected] .duoop-select__check{opacity:1;transform:scale(1)}.duoop-select__group{padding:9px 10px 5px;color:#686565;font-size: 10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.duoop-select__separator{height:1px;background:#e0dddd;margin:6px}.duoop-select__popup *{scrollbar-width:thin;scrollbar-color:#aaa5a5 transparent}@keyframes select-open{from{opacity:0;transform:translateY(-5px) scale(.98)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.duoop-select,.duoop-select>svg,.duoop-select__popup,.duoop-select__check{animation:none;transition:none}}
927
932
  .duoop-select__popup{min-width:240px}
928
933
  .duoop-select__popup--bottom-end{inset-inline:unset 0}
929
934
  .duoop-select__popup--top-start,.duoop-select__popup--top-end{inset-block:unset calc(100% + 9px);transform-origin:bottom}
@@ -933,6 +938,7 @@ button:disabled {
933
938
  .duoop-autocomplete { width:100%; min-width:0; color:#373434; }
934
939
  .autocomplete-control { display:flex; align-items:center; width:100%; min-width:0; min-height:44px; border:2px solid #373434; border-radius:10px; background:#fff; box-shadow:0 3px 0 #1d1b1b; transition:box-shadow 180ms cubic-bezier(.2,.8,.2,1),border-color 140ms ease,background 140ms ease; }
935
940
  .autocomplete-control:hover { background:#fcfbfb; }
941
+ .autocomplete-control:focus-within { outline:none; }
936
942
  .autocomplete-control[data-open] { box-shadow:0 4px 0 #1d1b1b; }
937
943
  .autocomplete-control input { display:block; flex:1; min-width:0; width:100%; margin:0; padding:11px 12px; border:0; border-radius:8px; background:transparent; color:inherit; box-shadow:none; font: inherit; font-size: 14px; line-height:1.4; }
938
944
  .autocomplete-control input:focus { outline:none; box-shadow:none; }
@@ -950,7 +956,7 @@ button:disabled {
950
956
  .autocomplete-action { flex:none; display:grid; place-items:center; width:36px; align-self:stretch; margin:2px; padding:0; border:0; border-radius:6px; background:transparent; color:inherit; cursor:pointer; transition:background 140ms ease,transform 100ms ease; }
951
957
  .autocomplete-action:hover:not(:disabled) { background:#f0eeee; }
952
958
  .autocomplete-action:active:not(:disabled) { transform:translateY(2px); }
953
- .autocomplete-action:focus-visible { outline:2px solid currentColor; outline-offset:-4px; }
959
+ .autocomplete-action:focus-visible { outline:none; }
954
960
  .autocomplete-action:disabled { opacity:.35; cursor:default; }
955
961
  .autocomplete-trigger svg { transition:transform 200ms cubic-bezier(.2,.8,.2,1); }
956
962
  .autocomplete-trigger[aria-expanded=true] svg { transform:rotate(180deg); }
@@ -1089,8 +1095,9 @@ button:disabled {
1089
1095
  cursor: not-allowed;
1090
1096
  }
1091
1097
  .duoop-tabs__tab:focus-visible {
1092
- outline: 2px solid currentColor;
1093
- outline-offset: -5px;
1098
+ outline:none;
1099
+ text-decoration: underline;
1100
+ text-decoration-thickness: 2px;
1094
1101
  }
1095
1102
  .duoop-tabs__indicator {
1096
1103
  background: var(--tabs-face);
@@ -1187,8 +1194,8 @@ button:disabled {
1187
1194
  margin-top: 0;
1188
1195
  }
1189
1196
  .duoop-tabs__panel:focus-visible {
1190
- outline:2px solid currentColor; outline-offset:-5px;
1191
- border-style: solid;
1197
+ outline:none;
1198
+ border-style:dashed;
1192
1199
  }
1193
1200
  .duoop-tabs[data-transition='fade'] > .duoop-tabs__panels > .duoop-tabs__panel {
1194
1201
  animation: tabs-panel-pop 240ms cubic-bezier(0.2, 0.8, 0.2, 1);
@@ -1259,7 +1266,7 @@ button:disabled {
1259
1266
  transform: none;
1260
1267
  }
1261
1268
  }
1262
- .duoop-menu{position:relative;display:inline-block;color:#373434}.duoop-menu__trigger{min-height:44px;padding:0 14px;border:2px solid #373434;border-radius:10px;background:#fff;box-shadow:0 3px 0 #1d1b1b;color:inherit;font: 600 13px inherit;cursor:pointer;transition:transform 100ms ease,box-shadow 120ms ease,background 150ms ease}.duoop-menu__trigger:hover{background:#f4f2f2}.duoop-menu__trigger:active,.duoop-menu__trigger[aria-expanded=true]{transform:translateY(2px);box-shadow:0 1px 0 #1d1b1b}.duoop-menu__trigger:focus-visible,.duoop-menu__item:focus-visible{outline:2px solid #373434;outline-offset:-6px}.duoop-menu__position{position:absolute;z-index:35;min-width:230px}.duoop-menu__position--bottom-start{inset-block-start:calc(100% + 8px);inset-inline-start:0}.duoop-menu__position--bottom-end{inset-block-start:calc(100% + 8px);inset-inline-end:0}.duoop-menu__position--top-start{inset-block-end:calc(100% + 8px);inset-inline-start:0}.duoop-menu__position--top-end{inset-block-end:calc(100% + 8px);inset-inline-end:0}.duoop-menu__popup,.duoop-menu__subpopup{padding:7px;border:2px solid #373434;border-radius:10px;background:#fff;box-shadow:0 5px 0 #1d1b1b;animation:menu-open 170ms cubic-bezier(.2,.8,.2,1)}.duoop-menu__item{width:100%;min-height:42px;padding:8px 10px;border:0;border-radius:6px;background:transparent;color:inherit;display:flex;align-items:center;gap:10px;text-align:left;text-decoration:none;font: inherit;cursor:pointer}.duoop-menu__item:hover,.duoop-menu__item:focus-visible{background:#f0eeee}.duoop-menu__item[aria-disabled=true]{opacity:.38;cursor:not-allowed}.duoop-menu__item[data-destructive]{color:#a51d2d}.duoop-menu__mark{width:20px;height:20px;display:grid;place-items:center;flex:none}.duoop-menu__mark svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.duoop-menu__copy{display:grid;gap:2px;min-width:0;flex:1}.duoop-menu__copy strong{font-size: 12px;font-weight:600}.duoop-menu__copy small{font-size: 10px;line-height:1.35;color:#686565}.duoop-menu__item kbd{font:
1269
+ .duoop-menu{position:relative;display:inline-block;color:#373434}.duoop-menu__trigger{min-height:44px;padding:0 14px;border:2px solid #373434;border-radius:10px;background:#fff;box-shadow:0 3px 0 #1d1b1b;color:inherit;font: 600 13px inherit;cursor:pointer;transition:transform 100ms ease,box-shadow 120ms ease,background 150ms ease}.duoop-menu__trigger:hover{background:#f4f2f2}.duoop-menu__trigger:active,.duoop-menu__trigger[aria-expanded=true]{transform:translateY(2px);box-shadow:0 1px 0 #1d1b1b}.duoop-menu__trigger:focus-visible,.duoop-menu__item:focus-visible{outline:none;}.duoop-menu__position{position:absolute;z-index:35;min-width:230px}.duoop-menu__position--bottom-start{inset-block-start:calc(100% + 8px);inset-inline-start:0}.duoop-menu__position--bottom-end{inset-block-start:calc(100% + 8px);inset-inline-end:0}.duoop-menu__position--top-start{inset-block-end:calc(100% + 8px);inset-inline-start:0}.duoop-menu__position--top-end{inset-block-end:calc(100% + 8px);inset-inline-end:0}.duoop-menu__popup,.duoop-menu__subpopup{padding:7px;border:2px solid #373434;border-radius:10px;background:#fff;box-shadow:0 5px 0 #1d1b1b;animation:menu-open 170ms cubic-bezier(.2,.8,.2,1)}.duoop-menu__item{width:100%;min-height:42px;padding:8px 10px;border:0;border-radius:6px;background:transparent;color:inherit;display:flex;align-items:center;gap:10px;text-align:left;text-decoration:none;font: inherit;cursor:pointer}.duoop-menu__item:hover,.duoop-menu__item:focus-visible{background:#f0eeee}.duoop-menu__item[aria-disabled=true]{opacity:.38;cursor:not-allowed}.duoop-menu__item[data-destructive]{color:#a51d2d}.duoop-menu__mark{width:20px;height:20px;display:grid;place-items:center;flex:none}.duoop-menu__mark svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.duoop-menu__copy{display:grid;gap:2px;min-width:0;flex:1}.duoop-menu__copy strong{font-size: 12px;font-weight:600}.duoop-menu__copy small{font-size: 10px;line-height:1.35;color:#686565}.duoop-menu__item kbd{font:
1263
1270
  10px Consolas,
1264
1271
  monospace;color:#686565}.duoop-menu__label{padding:9px 10px 5px;color:#686565;font-size: 10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.duoop-menu__separator{height:1px;background:#dedada;margin:6px}.duoop-menu__submenu{position:relative}.duoop-menu__subpopup{position:absolute;z-index:1;inset-inline-start:calc(100% + 6px);inset-block-start:-7px;min-width:210px}.duoop-menu__popup{max-height:min(360px,70vh);overflow:auto;overscroll-behavior:contain}@keyframes menu-open{from{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.duoop-menu__trigger,.duoop-menu__popup,.duoop-menu__subpopup{animation:none;transition:none}}
1265
1272
  .duoop-menu__subpopup[style]{z-index:36}
@@ -1286,7 +1293,7 @@ button.stepper-control { cursor:pointer; }
1286
1293
  .stepper-item[data-state=disabled] .stepper-control,.stepper-item[data-state=blocked] .stepper-control { color:var(--step-muted); }
1287
1294
  .stepper-control:disabled { opacity:1; cursor:not-allowed; }
1288
1295
  .stepper-control:focus-visible { outline:none; }
1289
- .stepper-control:focus-visible .stepper-marker { outline:2px solid currentColor; outline-offset:-6px; }
1296
+ .stepper-control:focus-visible .stepper-marker { outline:none; border-style:dashed; }
1290
1297
  .stepper-connector { position:absolute; z-index:0; top:calc(var(--step-mark) / 2 - 2px); inset-inline-start:50%; width:100%; height:6px; border-block:1px solid var(--step-edge); background:var(--step-soft); pointer-events:none; }
1291
1298
  .stepper-connector i { display:block; width:100%; height:100%; background:var(--step-ink); transform:scaleX(var(--step-progress)); transform-origin:left; transition:transform 320ms cubic-bezier(.2,.8,.2,1); }
1292
1299
  .duoop-stepper:dir(rtl) .stepper-connector i { transform-origin:right; }
@@ -1336,8 +1343,8 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1336
1343
  .duoop-stepper[data-mobile=vertical] .stepper-item:last-child .stepper-control { padding-bottom:0; }
1337
1344
  }
1338
1345
  @media(prefers-reduced-motion:reduce) { .stepper-marker,.stepper-marker *,.stepper-connector i,.stepper-panel>div,.stepper-inline-panel>* { animation:none; transition:none; } button.stepper-control:hover:not(:disabled) .stepper-marker,button.stepper-control:active:not(:disabled) .stepper-marker { transform:none; } }
1339
-
1340
- .stepper-progress-control { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; }
1346
+
1347
+ .stepper-progress-control { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; }
1341
1348
  .stepper-progress-control > input[type=range] { display: block; margin: 0; width: 128px; max-width: 100%; accent-color: var(--step-ink, #373434); }
1342
1349
  .duoop-accordion {
1343
1350
  --acc-edge: #373434;
@@ -1379,7 +1386,7 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1379
1386
  transition: background 160ms ease, color 160ms ease;
1380
1387
  }
1381
1388
  .duoop-accordion__trigger:hover:not(:disabled) { background: var(--acc-soft); }
1382
- .duoop-accordion__trigger:focus-visible { outline: 2px solid currentColor; outline-offset: -6px; }
1389
+ .duoop-accordion__trigger:focus-visible { outline:none; }
1383
1390
  .duoop-accordion__trigger[aria-expanded=true] { border-end-start-radius: 0; border-end-end-radius: 0; }
1384
1391
  .duoop-accordion__copy { display: grid; gap: 6px; min-width: 0; flex: 1; overflow-wrap: anywhere; }
1385
1392
  .duoop-accordion__copy small { font-size: 12px; font-weight: 400; line-height: 1.6; color: var(--acc-muted); }
@@ -1456,10 +1463,10 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1456
1463
  .duoop-card:hover .duoop-card__title { transform:translateX(3px); }
1457
1464
  }
1458
1465
  .duoop-card--interactive:active { transform:translateY(3px) scale(.99); box-shadow:0 1px 0 var(--card-shadow); transition-duration:90ms; }
1459
- .duoop-card--interactive:focus-visible { outline:2px solid currentColor; outline-offset:-5px; border-style:solid; }
1460
- .duoop-card--interactive:not(a):not(button) { cursor:default; }
1461
- .duoop-card--interactive:not(a):not(button):is(:hover,:active) { transform:none; }
1462
- .duoop-card--interactive:not(a):not(button):focus-within { box-shadow:0 7px 0 var(--card-shadow); border-style:solid; }
1466
+ .duoop-card--interactive:focus-visible { outline:none; border-style:dashed; }
1467
+ .duoop-card--interactive:not(a):not(button) { cursor:default; }
1468
+ .duoop-card--interactive:not(a):not(button):is(:hover,:active) { transform:none; }
1469
+ .duoop-card--interactive:not(a):not(button):focus-within { box-shadow:0 7px 0 var(--card-shadow); border-style:solid; }
1463
1470
  .duoop-card[data-selected] { background:var(--card-soft); box-shadow:0 3px 0 var(--card-shadow); }
1464
1471
  .duoop-card[data-selected] .duoop-card__title { animation:card-title-pop 300ms cubic-bezier(.2,1.7,.35,1); }
1465
1472
  .duoop-card[data-disabled] { opacity:.48; pointer-events:none; }
@@ -1542,33 +1549,38 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1542
1549
  @container(max-width:440px) { .duoop-bento__grid { grid-template-columns:minmax(0,1fr); gap:18px; }.duoop-bento__item { grid-column:auto; grid-row:auto; padding:20px; }.bento-hero-copy h3 { font-size: 36px; }.bento-hero-copy { padding-top:12px; } }
1543
1550
  @media(max-width:600px) { .bento-playground,.bento-grid-showcase .gallery-card-preview { padding:16px; }.bento-demo[data-theme=dark] { padding:12px; } }
1544
1551
  @media(prefers-reduced-motion:reduce) { .duoop-bento__item { transition:none; }.duoop-bento__item:hover { transform:none; box-shadow:0 4px 0 var(--feedback-edge,#1d1b1b); }.bento-drawing__layout { animation:none; } }
1545
- .cards-carousel__rail::-webkit-scrollbar { display:none; }
1552
+ .cards-carousel__rail::-webkit-scrollbar { display:none; }
1546
1553
  .cards-carousel { width:100%; min-width:0; background:var(--feedback-face); color:var(--feedback-ink); --story-border:var(--feedback-edge); }
1547
- .cards-carousel__heading { display:flex; align-items:end; justify-content:space-between; gap:24px; padding:32px 32px 12px; }
1554
+ .cards-carousel__heading { display:flex; align-items:end; justify-content:space-between; gap:24px; padding:32px 32px 24px; }
1548
1555
  .cards-carousel__eyebrow { display:block; font-size: 10px; line-height:1.5; letter-spacing:1.2px; font-weight:600; text-transform:uppercase; }
1549
1556
  .cards-carousel__heading h3 { margin:12px 0 0; max-width:440px; font-size: clamp(24px, 3vw, 36px); line-height:1.12; font-weight:600; letter-spacing:-1.2px; text-wrap:balance; }
1550
1557
  .cards-carousel__hint { max-width:150px; font-size: 12px; color:var(--feedback-muted); line-height:1.7; }
1551
- .cards-carousel__rail { display:flex; gap:20px; overflow-x:auto; overscroll-behavior-x:contain; scroll-snap-type:x mandatory; scroll-padding-inline:32px; padding:20px 32px 28px; scrollbar-width:none; }
1552
- .cards-carousel__card { position:relative; flex:0 0 300px; min-width:0; padding:0; display:flex; flex-direction:column; text-align:start; font: inherit; color:inherit; background:var(--feedback-face); border:2px solid var(--story-border); border-radius:10px; box-shadow:0 5px 0 var(--story-border); overflow:hidden; scroll-snap-align:start; cursor:pointer; transition:transform 200ms cubic-bezier(.2,.8,.2,1),box-shadow 200ms ease-out; }
1553
- .cards-carousel__copy { display:block; min-height:140px; padding:24px; }
1554
- .cards-carousel__copy strong { display:block; margin-top:12px; font-size: 25px; font-weight:600; line-height:1.16; letter-spacing:-.7px; text-wrap:balance; overflow-wrap:anywhere; }
1555
- .cards-carousel__image { width:100%; height:240px; object-fit:cover; display:block; border-block:2px solid var(--story-border); }
1558
+ .cards-carousel__rail { display:flex; gap:20px; overflow-x:auto; overscroll-behavior-x:contain; scroll-snap-type:x mandatory; scroll-padding-inline:32px; padding:32px 32px 48px; scrollbar-width:none; background:var(--feedback-soft); border-block:1px solid var(--feedback-track); }
1559
+ .cards-carousel__card { position:relative; flex:0 0 300px; min-width:0; padding:0; display:flex; flex-direction:column; text-align:start; font: inherit; color:inherit; background:var(--feedback-face); border:2px solid var(--story-border); border-radius:10px; box-shadow:0 5px 0 var(--story-border); overflow:hidden; scroll-snap-align:start; cursor:pointer; transform:translateY(var(--card-rise, 0px)); transition:transform 280ms cubic-bezier(.2,.8,.2,1),box-shadow 200ms ease-out; }
1560
+ .cards-carousel__card:nth-child(even) { --card-rise:16px; }
1561
+ .cards-carousel__copy { display:block; min-height:156px; padding:24px; }
1562
+ .cards-carousel__copy strong { display:block; margin-top:12px; font-size:27px; font-weight:800; line-height:1.06; letter-spacing:-.8px; text-transform:uppercase; text-wrap:balance; overflow-wrap:anywhere; }
1563
+ .cards-carousel__window { display:block; width:calc(100% - 36px); height:224px; flex-shrink:0; margin:0 18px; overflow:visible; }
1564
+ .cards-carousel__image { width:100%; height:100%; object-fit:cover; display:block; transform-origin:center; transition:transform 320ms cubic-bezier(.2,.8,.2,1); }
1556
1565
  .cards-carousel__image-fallback { display:grid; place-items:center; background:var(--feedback-soft); color:var(--feedback-muted); font-size: 12px; }
1557
1566
  .cards-carousel__card-footer { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:16px 20px; font-size: 11px; }
1558
- .cards-carousel__plus { display:grid; place-items:center; width:36px; height:36px; border:2px solid var(--story-border); border-radius:8px; box-shadow:0 3px 0 var(--story-border); transition:transform 180ms ease-out,box-shadow 180ms ease-out; }
1559
- .cards-carousel__plus svg { width:20px; height:20px; }
1560
- @media(hover:hover) { .cards-carousel__card:hover { transform:translateY(-4px); box-shadow:0 8px 0 var(--story-border); }.cards-carousel__card:hover .cards-carousel__plus { transform:rotate(90deg); } }
1567
+ .cards-carousel__plus { display:grid; place-items:center; width:40px; height:40px; border:2px solid var(--story-border); border-radius:8px; box-shadow:0 3px 0 var(--story-border); transition:transform 180ms ease-out,box-shadow 180ms ease-out; }
1568
+ .cards-carousel__plus svg { width:20px; height:20px; transition:transform 240ms cubic-bezier(.2,.8,.2,1); }
1569
+ @media(hover:hover) { .cards-carousel__card:hover { transform:translateY(-8px); box-shadow:0 9px 0 var(--story-border); }.cards-carousel__card:hover .cards-carousel__image { transform:scale(1.045); }.cards-carousel__card:hover .cards-carousel__plus { transform:translateY(2px); box-shadow:0 1px 0 var(--story-border); }.cards-carousel__card:hover .cards-carousel__plus svg { transform:rotate(90deg); } }
1570
+ .cards-carousel__card:focus-visible { transform:translateY(-8px); box-shadow:0 9px 0 var(--story-border); }
1561
1571
  .cards-carousel__card:active { transform:translateY(3px); box-shadow:0 2px 0 var(--story-border); }
1562
- .cards-carousel__card:focus-visible { outline:2px solid var(--feedback-ink); outline-offset:-7px; }
1572
+ .cards-carousel__card:focus-visible { outline:none; }
1563
1573
  .cards-carousel__navigation { display:flex; align-items:center; justify-content:space-between; gap:20px; padding:16px 32px 32px; }
1564
1574
  .cards-carousel__navigation>span { font-size: 12px; line-height:1.6; color:var(--feedback-muted); }
1575
+ .cards-carousel__progress { display:block; width:clamp(80px,18vw,200px); height:6px; margin-top:12px; overflow:hidden; border:1px solid var(--story-border); border-radius:3px; background:var(--feedback-soft); }
1576
+ .cards-carousel__progress>span { display:block; width:100%; height:100%; background:var(--feedback-ink); transform-origin:left; transform:scaleX(calc(.12 + var(--collection-progress, 0) * .88)); }
1565
1577
  .cards-carousel__navigation>div { display:flex; gap:12px; }
1566
1578
  .cards-carousel__navigation .duoop-button,.cards-carousel__detail-heading .duoop-button { width:44px; height:44px; flex-shrink:0; }
1567
1579
  .cards-carousel__empty { padding:48px 0; color:var(--feedback-muted); }
1568
1580
  .cards-carousel[data-size=compact] .cards-carousel__card { flex-basis:240px; }
1569
- .cards-carousel[data-size=compact] .cards-carousel__copy { min-height:132px; padding:20px; }
1581
+ .cards-carousel[data-size=compact] .cards-carousel__copy { min-height:144px; padding:20px; }
1570
1582
  .cards-carousel[data-size=compact] .cards-carousel__copy strong { font-size: 22px; }
1571
- .cards-carousel[data-size=compact] .cards-carousel__image { height:180px; }
1583
+ .cards-carousel[data-size=compact] .cards-carousel__window { height:184px; }
1572
1584
  .cards-carousel__dialog { width:min(800px,calc(100% - 32px)); max-height:calc(100dvh - 48px); padding:0; border:2px solid var(--story-border); border-radius:12px; background:var(--feedback-face); color:var(--feedback-ink); box-shadow:0 6px 0 var(--story-border); overscroll-behavior:contain; scrollbar-width:thin; scrollbar-color:var(--feedback-muted) transparent; }
1573
1585
  .cards-carousel__dialog[open] { animation:story-enter 240ms cubic-bezier(.2,.8,.2,1); }
1574
1586
  .cards-carousel__dialog::backdrop { background:rgb(29 27 27 / .6); animation:story-fade 180ms ease-out; }
@@ -1608,15 +1620,16 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1608
1620
  .cards-controls .duoop-button-reserve { display:none; }
1609
1621
  .cards-carousel-showcase .gallery-grid { grid-template-columns:minmax(0,1fr); }
1610
1622
  .cards-carousel-showcase .gallery-card-preview { padding:0; }
1611
- .cards-mini { display:flex; gap:12px; width:262px; transform:rotate(-3deg); }
1623
+ .cards-mini { display:flex; gap:12px; width:262px; }
1612
1624
  .cards-mini>span { flex:0 0 124px; display:flex; flex-direction:column; border:2px solid #1d1b1b; border-radius:8px; background:#fff; overflow:hidden; box-shadow:0 4px 0 #1d1b1b; transition:transform 200ms ease-out; }
1613
- .cards-mini strong { font-size: 13px; line-height:1.2; padding:12px; }
1614
- .cards-mini img { width:100%; height:90px; object-fit:cover; border-top:2px solid #1d1b1b; }
1625
+ .cards-mini>span:last-child { transform:translateY(12px); }
1626
+ .cards-mini strong { text-transform:uppercase; font-weight:800; font-size: 13px; line-height:1.2; padding:12px; }
1627
+ .cards-mini img { width:calc(100% - 16px); margin:0 8px 10px; height:90px; object-fit:cover; border:2px solid #1d1b1b; border-radius:60px 60px 5px 5px; }
1615
1628
  .library-card:hover .cards-mini>span:last-child { transform:translateY(-6px); }
1616
1629
  @keyframes story-enter { from { opacity:0; transform:translateY(16px) scale(.98); } to { opacity:1; transform:none; } }
1617
1630
  @keyframes story-fade { from { opacity:0; } to { opacity:1; } }
1618
1631
  @media(max-width:600px) { .cards-carousel__heading { padding:24px 20px 8px; }.cards-carousel__hint { display:none; }.cards-carousel__rail { padding-inline:20px; scroll-padding-inline:20px; }.cards-carousel__card,.cards-carousel[data-size=compact] .cards-carousel__card { flex-basis:min(280px,88%); }.cards-carousel__copy { padding:20px; }.cards-carousel__navigation { padding:16px 20px 24px; }.cards-controls { padding:24px 20px; gap:24px; }.cards-carousel__detail-heading,.cards-carousel__detail-content { padding:24px 20px; }.cards-carousel__detail-heading { gap:16px; }.cards-carousel__story-number { flex-basis:42px; height:50px; font-size: 22px; }.cards-carousel__detail-toolbar { padding:12px 20px; }.cards-carousel__detail-toolbar>.cards-carousel__eyebrow>span { margin-inline:4px; }.cards-carousel__figure { margin-inline:20px; }.cards-carousel__detail-image { height:200px; }.cards-carousel__detail-content { flex-direction:column; gap:24px; }.cards-carousel__takeaway { flex:auto; width:100%; padding:16px 20px; border:1px solid var(--feedback-track); border-inline-start:2px solid var(--story-border); border-radius:0 8px 8px 0; background:var(--feedback-soft); }.cards-carousel__takeaway>svg { display:none; }.cards-carousel__detail-footer { padding:20px; flex-wrap:wrap; }.cards-carousel__detail-footer nav { justify-content:space-between; flex:1; }.cards-carousel__return { order:1; width:100%; } }
1619
- @media(prefers-reduced-motion:reduce) { .cards-carousel__card,.cards-carousel__plus,.cards-mini>span { transition:none; }.cards-carousel__card:hover,.cards-carousel__card:active,.cards-carousel__card:hover .cards-carousel__plus,.library-card:hover .cards-mini>span:last-child { transform:none; }.cards-carousel__dialog[open],.cards-carousel__story { animation:story-fade 120ms ease-out; } }
1632
+ @media(prefers-reduced-motion:reduce) { .cards-carousel__card,.cards-carousel__image,.cards-carousel__plus,.cards-carousel__plus svg,.cards-mini>span { transition:none; }.cards-carousel__card,.cards-carousel__card:focus-visible,.cards-carousel__card:hover .cards-carousel__image,.cards-carousel__card:hover .cards-carousel__plus svg,.cards-carousel__card:hover,.cards-carousel__card:active,.cards-carousel__card:hover .cards-carousel__plus,.library-card:hover .cards-mini>span:last-child { transform:none; }.cards-carousel__dialog[open],.cards-carousel__story { animation:story-fade 120ms ease-out; } }
1620
1633
  .duoop-avatar { --avatar-size:48px; --avatar-face:var(--feedback-face,#fff); --avatar-ink:var(--feedback-ink,#373434); --avatar-edge:var(--feedback-edge,#1d1b1b); position:relative; display:inline-flex; flex:none; width:var(--avatar-size); height:var(--avatar-size); color:var(--avatar-ink); vertical-align:middle; }
1621
1634
  .duoop-avatar--sm { --avatar-size:32px; }
1622
1635
  .duoop-avatar--lg { --avatar-size:64px; }
@@ -1643,20 +1656,22 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1643
1656
  .avatar-choice[aria-pressed=true] .duoop-avatar__face { --avatar-border-width:3px; }
1644
1657
  .avatar-choice:disabled { opacity:.45; cursor:not-allowed; }
1645
1658
  @media(prefers-reduced-motion:reduce) { .duoop-avatar__face,.duoop-avatar img { transition:none; } .avatar-choice:hover:not(:disabled) .duoop-avatar__face,.avatar-choice:active:not(:disabled) .duoop-avatar__face { transform:none; } }
1646
- .testimonials { --testimonial-ink:#373434; --testimonial-edge:#1d1b1b; width:100%; min-width:0; container-type:inline-size; color:var(--testimonial-ink); padding:40px; background:#f7f6f4; border-radius:10px; }
1647
- .testimonials__heading { max-width:500px; margin-bottom:32px; }
1659
+ .testimonials { --testimonial-ink:#373434; --testimonial-edge:#1d1b1b; width:100%; min-width:0; container-type:inline-size; color:var(--testimonial-ink); padding:40px; background:#f0eeee; border:2px solid var(--testimonial-edge); box-shadow:0 4px 0 var(--testimonial-edge); border-radius:10px; }
1660
+ .testimonials__heading { max-width:680px; margin-bottom:40px; }
1648
1661
  .testimonials__eyebrow { display:block; font-size: 10px; font-weight:600; letter-spacing:.13em; text-transform:uppercase; margin-bottom:12px; }
1649
- .testimonials .testimonials__heading h3 { margin:0; font-size: clamp(26px, 4cqi, 38px); line-height:1.15; letter-spacing:-.045em; font-weight:600; }
1662
+ .testimonials .testimonials__heading h3 { margin:0; font-size:clamp(28px, 4.8cqi, 48px); line-height:1.04; letter-spacing:-.035em; font-weight:800; text-transform:uppercase; text-wrap:balance; }
1650
1663
  .testimonials .testimonials__heading p { margin:16px 0 0; font-size: 13px; line-height:1.7; color:#686565; max-width:380px; }
1651
1664
  .testimonials__stage { min-width:0; }
1652
1665
  .testimonials__paper { background:#fff; border:2px solid var(--testimonial-edge); border-radius:10px; box-shadow:0 5px 0 var(--testimonial-edge); padding:28px; min-width:0; }
1653
- .testimonials__company { display:flex; align-items:center; justify-content:space-between; gap:16px; font-size: 18px; font-weight:650; letter-spacing:-.04em; }
1666
+ .testimonials__company { display:flex; align-items:center; justify-content:space-between; gap:16px; font-size:22px; font-weight:800; letter-spacing:.025em; text-transform:uppercase; }
1654
1667
  .testimonials__company > span { color:#686565; font-size: 10px; font-weight:450; letter-spacing:0; }
1655
1668
  .testimonials__quote { margin:0; min-width:0; }
1656
1669
  .testimonials__mark { width:36px; height:30px; flex:none; }
1657
1670
  .testimonials blockquote { margin:16px 0 24px; font-size: 14px; line-height:1.7; letter-spacing:-.015em; overflow-wrap:anywhere; }
1658
- .testimonials__quote--featured { padding-top:28px; }
1659
- .testimonials__quote--featured blockquote { font-size: clamp(20px, 3.6cqi, 30px); font-weight:500; line-height:1.45; letter-spacing:-.035em; min-height:4.35em; }
1671
+ .testimonials__quote--featured { padding-top:32px; display:grid; grid-template-columns:100px minmax(0,1fr); column-gap:28px; align-items:start; }
1672
+ .testimonials__quote--featured > .testimonials__mark { width:100%; height:auto; margin-top:12px; }
1673
+ .testimonials__quote--featured > .testimonials__author { grid-column:2; }
1674
+ .testimonials__quote--featured blockquote { font-size: clamp(20px, 3.6cqi, 30px); font-weight:600; line-height:1.4; letter-spacing:-.035em; min-height:4.35em; }
1660
1675
  .testimonials__author { display:flex; gap:12px; align-items:center; }
1661
1676
  .testimonials__author > span:last-child { display:grid; gap:4px; min-width:0; }
1662
1677
  .testimonials__author strong { font-size: 12px; font-weight:600; }
@@ -1665,7 +1680,7 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1665
1680
  .testimonials__footer > span { font-size: 11px; font-variant-numeric:tabular-nums; color:#686565; }
1666
1681
  .testimonials__footer > div { display:flex; gap:12px; }
1667
1682
  .testimonials__footer .duoop-button { min-width:44px; min-height:44px; }
1668
- .testimonials__story { animation:testimonial-arrive 320ms cubic-bezier(.2,.8,.2,1) both; }
1683
+ .testimonials__story { animation:testimonial-arrive 420ms cubic-bezier(.2,.8,.2,1) both; }
1669
1684
  .testimonials__wall { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,2.15fr) minmax(0,1fr); align-items:start; gap:20px; padding-bottom:8px; }
1670
1685
  .testimonials__wall-column, .testimonials__wall-center { display:grid; gap:24px; min-width:0; align-content:start; }
1671
1686
  .testimonials__wall-lower { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:20px; align-items:start; }
@@ -1674,7 +1689,8 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1674
1689
  .testimonials__wall .testimonials__mark { width:28px; height:24px; }
1675
1690
  .testimonials__wall .testimonials__author { align-items:flex-start; gap:10px; }
1676
1691
  .testimonials__wall .testimonials__author small { font-size: 10px; }
1677
- .testimonials__wall .testimonials__quote--featured { padding:32px 28px 0; overflow:hidden; }
1692
+ .testimonials__wall .testimonials__quote--featured { display:block; padding:32px 28px 0; overflow:hidden; }
1693
+ .testimonials__wall .testimonials__quote--featured > .testimonials__mark { width:76px; height:auto; margin:0; }
1678
1694
  .testimonials__wall .testimonials__quote--featured blockquote { font-size: clamp(20px, 2.7cqi, 28px); line-height:1.55; font-weight:550; min-height:0; margin-bottom:32px; }
1679
1695
  .testimonials__wall .testimonials__quote--featured .testimonials__author { padding:24px 28px; margin-inline:-28px; border-top:1px solid #e2dede; background:#f7f6f4; }
1680
1696
  .testimonials--wall .testimonials__heading { text-align:center; margin:0 auto 32px; }
@@ -1695,10 +1711,13 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1695
1711
  .testimonials-mini strong { font-size: 15px; letter-spacing:-.03em; }
1696
1712
  .testimonials-mini small { font-size: 10px; color:#686565; }
1697
1713
  @container (max-width:700px) { .testimonials__wall { grid-template-columns:1fr 1fr; } .testimonials__wall-center { grid-column:1 / -1; grid-row:1; } .testimonials--voices .testimonials__stage { grid-template-columns:1fr; } .testimonials__choices { flex-direction:row; flex-wrap:wrap; } .testimonials__choices .duoop-button { flex:1; min-width:120px; } }
1698
- @container (max-width:420px) { .testimonials__wall, .testimonials__wall-lower { grid-template-columns:1fr; gap:24px; } .testimonials__wall .testimonials__quote--featured { padding:24px 20px 0; } .testimonials__wall .testimonials__quote--featured .testimonials__author { margin-inline:-20px; padding:20px; } .testimonials__paper { padding:20px; } .testimonials__company { flex-wrap:wrap; } .testimonials__quote--featured blockquote { min-height:0; } }
1714
+ @container (max-width:420px) { .testimonials__wall, .testimonials__wall-lower { grid-template-columns:1fr; gap:24px; } .testimonials__wall .testimonials__quote--featured { padding:24px 20px 0; } .testimonials__wall .testimonials__quote--featured .testimonials__author { margin-inline:-20px; padding:20px; } .testimonials__paper { padding:20px; } .testimonials__company { flex-wrap:wrap; } .testimonials__quote--featured { display:block; padding-top:24px; } .testimonials__quote--featured > .testimonials__mark { width:64px; height:auto; margin:0; } .testimonials__quote--featured blockquote { min-height:0; } }
1699
1715
  @media(max-width:650px) { .testimonials { padding:24px 16px; } .testimonials-showcase .gallery-card-preview { padding:8px; } }
1700
- @keyframes testimonial-arrive { from { opacity:0; transform:translateY(10px) rotate(.4deg); } to { opacity:1; transform:translateY(0) rotate(0); } }
1701
- @media(prefers-reduced-motion:reduce) { .testimonials__story { animation:none; } }
1716
+ @keyframes testimonial-arrive { from { opacity:0; transform:translateX(calc(var(--testimonial-direction) * 28px)); } to { opacity:1; transform:translateX(0); } }
1717
+ .testimonials--voices .testimonials__story { animation-name:testimonial-fade; }
1718
+ @keyframes testimonial-fade { from { opacity:0; } to { opacity:1; } }
1719
+ @media(hover:hover) and (prefers-reduced-motion:no-preference) { .testimonials__wall .testimonials__quote { transition:transform 220ms ease, box-shadow 220ms ease; } .testimonials__wall .testimonials__quote:hover { transform:translateY(-4px); box-shadow:0 8px 0 var(--testimonial-edge); } }
1720
+ @media(prefers-reduced-motion:reduce) { .testimonials .testimonials__story { animation:none; } }
1702
1721
 
1703
1722
 
1704
1723
  .duoop-progress { --progress-tone:var(--feedback-ink,#373434); width:100%; min-width:0; display:flex; flex-direction:column; gap:12px; color:var(--feedback-ink,#373434); }
@@ -1830,122 +1849,6 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1830
1849
  .toast-placement-field { grid-template-columns:minmax(0,1fr) minmax(180px,220px); align-items:center; gap:16px; }
1831
1850
  .toast-placement-field .duoop-select { min-width:0; }
1832
1851
  @media(max-width:500px) { .toast-placement-field { grid-template-columns:minmax(0,1fr); } }
1833
- .duoop-achievement { --card-ink:var(--feedback-ink,#373434); --card-border:var(--feedback-edge,#1d1b1b); --card-shadow:var(--card-border); --card-muted:var(--feedback-muted,#686565); background:var(--feedback-face,#fff); overflow:visible; color:var(--card-ink); }
1834
- .achievement-heading { display:flex; align-items:center; gap:24px; padding:32px 28px 28px; min-width:0; }
1835
- .achievement-copy { display:flex; flex-direction:column; align-items:flex-start; gap:10px; min-width:0; }
1836
- .achievement-copy h4 { font-size:22px; font-weight:700; line-height:1.35; letter-spacing:-.4px; margin:0; overflow-wrap:anywhere; }
1837
- .achievement-copy>p { margin:0; font-size:13px; line-height:1.65; color:var(--card-muted); }
1838
- .achievement-copy .achievement-eyebrow { text-transform:uppercase; font-size: 10px; line-height:1.5; letter-spacing:.1em; font-weight:650; }
1839
- .achievement-emblem { --emblem-width:100px; display:block; flex:none; width:var(--emblem-width); aspect-ratio:100 / 116; color:var(--feedback-ink,#373434); }
1840
- .achievement-emblem>svg { display:block; width:100%; height:100%; overflow:visible; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
1841
- .achievement-svg-shadow { fill:currentColor; stroke:currentColor; }
1842
- .achievement-medal-face { fill:var(--feedback-face,#fff); }
1843
- .achievement-ribbon,.achievement-medal-inset,.achievement-laurel { fill:var(--feedback-soft,#f0eeee); }
1844
- .achievement-medal-inset { stroke-width:1.8; }
1845
- .achievement-medal-glint { stroke:var(--feedback-face,#fff); stroke-width:3; }
1846
- .achievement-emblem[data-visual=icon] { --emblem-width:56px; aspect-ratio:64 / 68; }
1847
- .achievement-emblem[data-visual=illustration] { --emblem-width:180px; aspect-ratio:200 / 160; }
1848
- .duoop-achievement[data-concealed=true] .achievement-medal-inset { stroke-dasharray:none; }
1849
- .achievement-progress { padding:0 28px 24px; }
1850
- .achievement-progress-label { display:flex; align-items:baseline; justify-content:space-between; gap:12px; margin:0 0 12px; font-size: 12px; font-weight:600; font-variant-numeric:tabular-nums; }
1851
- .achievement-progress .progress-caption:empty { display:none; }
1852
- .achievement-quantity { margin:0; display:flex; align-items:baseline; gap:10px; }
1853
- .achievement-quantity strong { font-size: 25px; letter-spacing:-1px; font-variant-numeric:tabular-nums; }
1854
- .achievement-quantity>span { font-size: 12px; color:var(--card-muted); }
1855
- .achievement-checklist { margin:0; padding:0; list-style:none; display:grid; gap:16px; }
1856
- .achievement-metadata { margin:0; padding:0 28px 24px; display:grid; gap:12px; }
1857
- .achievement-metadata>div { display:grid; grid-template-columns:85px minmax(0,1fr); gap:16px; font-size: 12px; line-height:1.7; }
1858
- .achievement-metadata dt { color:var(--card-muted); }
1859
- .achievement-metadata dd { margin:0; overflow-wrap:anywhere; }
1860
- .achievement-footer { border-top:2px solid var(--card-border); padding:16px 24px; display:flex; gap:16px; align-items:center; justify-content:space-between; flex-wrap:wrap; background:var(--feedback-face,#fff); border-radius:0 0 8px 8px; }
1861
- .achievement-reward { display:inline-flex; align-items:center; gap:8px; font-size: 12px; font-weight:600; }
1862
- .achievement-reward svg { width:28px; height:28px; flex:none; }
1863
- .achievement-reward>span { display:grid; gap:4px; }
1864
- .achievement-reward small { font-size:10px; font-weight:500; color:var(--card-muted); }
1865
- .achievement-reward strong { font-size:13px; font-weight:650; line-height:1.5; }
1866
- .achievement-footer>.experience-actions:empty { display:none; }
1867
- .achievement-progress-label>span:last-child { flex-shrink:0; font-weight:750; }
1868
- .achievement-progress-label>span:first-child { color:var(--card-muted); }
1869
- .duoop-achievement:is([data-state=unlocked],[data-state=claimable],[data-state=claimed]) .achievement-footer { background:var(--feedback-success-soft,#edf5ef); }
1870
- .duoop-achievement[data-state=claimable] .achievement-reward { color:var(--feedback-success,#356247); }
1871
- .duoop-achievement[data-visual=illustration] .achievement-heading { flex-direction:column; text-align:center; }
1872
- .duoop-achievement[data-visual=illustration] .achievement-copy { align-items:center; }
1873
- .duoop-achievement[data-visual=illustration] .achievement-emblem { --emblem-width:200px; max-width:100%; }
1874
- .achievement-summary-icon { flex-shrink:0; }
1875
- .achievement-collection>li>.duoop-achievement { height:100%; }
1876
- .achievement-collection .achievement-footer { margin-top:auto; }
1877
- .achievement-claim-error { margin:0; padding:16px 24px; color:var(--feedback-error,#a51d2d); font-size: 12px; line-height:1.7; }
1878
- .duoop-achievement[data-presentation=badge] { border:0; background:transparent; align-items:center; box-shadow:none; }
1879
- .duoop-achievement[data-presentation=badge] .achievement-heading { flex-direction:column; text-align:center; padding:12px; gap:20px; }
1880
- .duoop-achievement[data-presentation=badge] .achievement-copy { align-items:center; }
1881
- .duoop-achievement[data-presentation=badge] .achievement-emblem { --emblem-width:116px; }
1882
- .duoop-achievement[data-presentation=row] .achievement-heading { padding:20px; gap:20px; }
1883
- .duoop-achievement[data-presentation=row] .achievement-emblem { --emblem-width:48px; }
1884
- .duoop-achievement[data-presentation=row] .achievement-copy h4 { font-size: 14px; }
1885
- .duoop-achievement[data-presentation=row] .achievement-copy { gap:8px; }
1886
- .duoop-achievement[data-presentation=row] .achievement-progress { padding:0 20px 20px; }
1887
- .duoop-achievement[data-size=sm] .achievement-heading { padding:20px; gap:16px; }
1888
- .duoop-achievement[data-size=sm] .achievement-emblem { --emblem-width:48px; }
1889
- .duoop-achievement[data-size=lg] .achievement-emblem { --emblem-width:100px; }
1890
- .duoop-achievement[data-size=lg] .achievement-heading { padding:32px; }
1891
- .achievement-collection { padding:0; margin:0; list-style:none; display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:24px; }
1892
- .achievement-collection[data-layout=list] { grid-template-columns:1fr; gap:16px; }
1893
- .achievement-collection>li { min-width:0; display:flex; }
1894
- .achievement-summary { display:flex; gap:16px; align-items:center; }
1895
- .achievement-summary-icon { display:grid; place-items:center; width:48px; height:48px; border:2px solid var(--feedback-edge,#1d1b1b); box-shadow:0 3px 0 var(--feedback-edge,#1d1b1b); background:var(--feedback-face,#fff); border-radius:10px; }
1896
- .achievement-summary-icon svg { width:25px; height:25px; }
1897
- .achievement-summary>div { flex:1; min-width:0; display:grid; gap:12px; }
1898
- .achievement-summary strong { font-size: 14px; }
1899
- .achievement-tiers { margin:0; padding:0; list-style:none; display:grid; gap:20px; }
1900
- .achievement-error { display:grid; gap:16px; padding:24px; justify-items:start; }
1901
- .achievement-error>svg { width:28px; height:28px; }
1902
- .achievement-error>p { color:var(--feedback-error,#a51d2d); font-size: 13px; line-height:1.7; margin:0; }
1903
- .achievement-unlock { position:relative; background:var(--feedback-face,#fff); border:2px solid var(--feedback-edge,#1d1b1b); border-radius:10px; box-shadow:0 4px 0 var(--feedback-edge,#1d1b1b); padding:32px; display:grid; justify-items:center; gap:24px; }
1904
- .achievement-unlock-body { position:relative; display:flex; flex-direction:column; align-items:center; gap:16px; text-align:center; color:var(--feedback-ink,#373434); }
1905
- .achievement-unlock-body h4 { margin:0; font-size:28px; letter-spacing:-.6px; line-height:1.35; }
1906
- .achievement-unlock-body>.achievement-emblem { --emblem-width:120px; }
1907
- .achievement-unlock-body>p { margin:0; font-size: 13px; color:var(--feedback-muted,#686565); }
1908
- .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti]) .achievement-emblem { animation:achievement-earned 1050ms cubic-bezier(.16,1,.3,1) both; transform-origin:50% 65%; }
1909
- .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])>.experience-kicker { animation:achievement-copy-in 500ms cubic-bezier(.16,1,.3,1) 180ms both; }
1910
- .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])>h4 { animation:achievement-copy-in 600ms cubic-bezier(.16,1,.3,1) 260ms both; }
1911
- .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])>p { animation:achievement-copy-in 600ms cubic-bezier(.16,1,.3,1) 360ms both; }
1912
- .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])::before { content:''; position:absolute; width:110px; height:110px; top:0; border:2px solid currentColor; border-radius:50%; opacity:0; pointer-events:none; animation:achievement-halo 950ms cubic-bezier(.16,1,.3,1) 140ms both; }
1913
- .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti]) .achievement-medal-inset { stroke-dasharray:190; animation:achievement-engrave 800ms ease-out 180ms both; }
1914
- .achievement-unlock-body[data-celebration=accent] .achievement-emblem { animation:achievement-accent 280ms ease-out; }
1915
- .achievement-unlock[data-mode=banner] .achievement-unlock-body { display:grid; grid-template-columns:auto minmax(0,1fr); text-align:start; gap:8px 20px; width:100%; }
1916
- .achievement-unlock[data-mode=banner] .achievement-emblem { grid-column:1; grid-row:1 / 4; --emblem-width:56px; }
1917
- .achievement-unlock[data-mode=banner] .achievement-unlock-body>p,.achievement-unlock[data-mode=banner] .achievement-unlock-body>h4 { grid-column:2; }
1918
- .achievement-unlock[data-mode=banner] h4 { font-size: 18px; }
1919
- .achievement-unlock[data-mode=banner] .achievement-unlock-body::before { width:64px; height:64px; inset-inline-start:-4px; }
1920
- .achievement-toast { position:fixed; z-index:1200; inset:auto 24px 24px auto; width:min(390px,calc(100vw - 48px)); }
1921
- .achievement-confetti { pointer-events:none; position:absolute; top:65px; left:50%; }
1922
- .achievement-confetti i { position:absolute; width:6px; height:10px; border:1px solid var(--feedback-edge,#1d1b1b); border-radius:1px; background:var(--feedback-soft,#f0eeee); animation:achievement-confetti 1100ms cubic-bezier(.12,.7,.2,1) calc(180ms + var(--confetti-delay)) both; opacity:0; }
1923
- .achievement-confetti i:nth-child(3n) { background:var(--feedback-ink,#373434); }
1924
- .achievement-demo-checklist { display:grid; gap:16px; }
1925
- .achievement-streak { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:8px; }
1926
- .achievement-streak>span { display:grid; place-items:center; min-height:35px; border:2px solid var(--feedback-edge); border-radius:6px; font-size: 11px; color:var(--feedback-muted); }
1927
- .achievement-streak>span[data-done=true] { background:var(--feedback-success-soft); color:var(--feedback-success); box-shadow:0 3px 0 var(--feedback-edge); }
1928
- @keyframes achievement-earned { 0% { opacity:0; transform:perspective(500px) translateY(28px) rotateY(-75deg) rotate(-14deg) scale(.55); } 48% { opacity:1; transform:perspective(500px) translateY(-8px) rotateY(12deg) rotate(5deg) scale(1.13); } 72% { transform:perspective(500px) translateY(2px) rotateY(-4deg) rotate(-2deg) scale(.98); } to { opacity:1; transform:none; } }
1929
- @keyframes achievement-confetti { 0% { opacity:0; transform:translate(0,0) scale(.3); } 15% { opacity:1; } 55% { opacity:1; transform:translate(var(--confetti-x),var(--confetti-y)) rotate(var(--confetti-turn)) scale(1); } to { opacity:0; transform:translate(calc(var(--confetti-x) * 1.2),calc(var(--confetti-y) + 60px)) rotate(calc(var(--confetti-turn) * 1.6)) scale(.65); } }
1930
- @keyframes achievement-copy-in { from { opacity:0; transform:translateY(12px); } to { opacity:1; transform:none; } }
1931
- @keyframes achievement-halo { from { opacity:.5; transform:scale(.55); } to { opacity:0; transform:scale(1.65); } }
1932
- @keyframes achievement-engrave { from { stroke-dashoffset:190; } to { stroke-dashoffset:0; } }
1933
- @keyframes achievement-accent { from { opacity:.45; } to { opacity:1; } }
1934
- @media(max-width:600px) { .achievement-collection { grid-template-columns:1fr; } .achievement-heading { padding:24px 20px; gap:20px; flex-direction:column; align-items:flex-start; } .achievement-progress,.achievement-metadata { padding-inline:20px; } .duoop-achievement[data-presentation=row] .achievement-heading { flex-direction:row; } .achievement-toast { inset-inline:16px; bottom:16px; width:auto; } }
1935
- @media(prefers-reduced-motion:reduce) { .achievement-unlock-body .achievement-emblem,.achievement-confetti i { animation:none !important; } .achievement-confetti { display:none; } }
1936
- @media(prefers-reduced-motion:reduce) { .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])>:is(.experience-kicker,h4,p),.achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti]) .achievement-medal-inset { animation:none; }.achievement-unlock-body::before { display:none; } }
1937
-
1938
- .achievement-trophy-shade { fill:var(--feedback-soft,#f0eeee); }
1939
-
1940
- /* Adapt to the card's actual width, including narrow gallery columns. */
1941
- .duoop-achievement { container-type:inline-size; }
1942
- @container (max-width:340px) {
1943
- .achievement-heading { gap:16px; padding:24px 20px; }
1944
- .achievement-emblem { --emblem-width:76px; }
1945
- .achievement-copy h4 { font-size:19px; }
1946
- .achievement-footer { padding:16px 20px; }
1947
- .achievement-metadata>div { grid-template-columns:1fr; gap:4px; }
1948
- }
1949
1852
  .kinetic-type { display:block; margin:0; font: inherit; }
1950
1853
  .kinetic-type__accessible { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:pre; }
1951
1854
  .kinetic-type__visual { display:block; perspective:800px; }
@@ -1990,7 +1893,8 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
1990
1893
  @media(max-width:480px) { .kinetic-playground>.kinetic-stage { margin:16px 16px 20px; }.kinetic-controls { grid-template-columns:1fr; gap:24px; padding:20px; }.kinetic-controls .duoop-textarea { font-size: 16px; }.kinetic-stage__meta { padding:20px 16px; flex-wrap:wrap; gap:8px; }.kinetic-stage__body { min-height:220px; }.kinetic-stage__footer { padding:20px 16px; flex-wrap:wrap; }.kinetic-stage__actions { width:100%; flex-wrap:wrap; }.kinetic-stage__actions button { flex:1 0 auto; } }
1991
1894
  @media(prefers-reduced-motion:reduce) { .kinetic-type__letter { transform:none!important; opacity:1!important; } }
1992
1895
  .shuffle-deck { width:100%; min-width:0; color:var(--feedback-ink,#373434); }
1993
- .shuffle-deck__viewport { position:relative; height:350px; width:100%; max-width:430px; margin:0 auto; touch-action:pan-y; cursor:grab; user-select:none; outline-offset:-6px; }
1896
+ .shuffle-deck__viewport { position:relative; height:350px; width:100%; max-width:430px; margin:0 auto; touch-action:pan-y; cursor:grab; user-select:none; }
1897
+ .shuffle-deck__viewport:focus-visible::after { content:''; position:absolute; inset:auto calc(50% - 16px) 0; height:3px; background:currentColor; border-radius:1px; pointer-events:none; }
1994
1898
  .shuffle-deck__viewport:active { cursor:grabbing; }
1995
1899
  .shuffle-deck__card { position:absolute; inset:38px 40px 22px; padding:28px; display:flex; flex-direction:column; gap:20px; border:2px solid var(--feedback-edge,#1d1b1b); border-radius:10px; background:var(--feedback-face,#fff); box-shadow:0 5px 0 var(--feedback-edge,#1d1b1b); transform-origin:50% 85%; overflow:hidden; }
1996
1900
  .shuffle-deck__card[aria-hidden=true] { pointer-events:none; }
@@ -2037,8 +1941,12 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
2037
1941
  @media(prefers-reduced-motion:reduce) { .shuffle-mini>span { transition:none; }.library-card:hover .shuffle-mini>span:first-child,.library-card:focus-visible .shuffle-mini>span:first-child { transform:translateY(-10px) rotate(-8deg); }.library-card:hover .shuffle-mini>span:nth-child(2),.library-card:focus-visible .shuffle-mini>span:nth-child(2) { transform:translateY(-5px) rotate(5deg); } }
2038
1942
  .text-loop { width:100%; min-width:0; overflow:hidden; }
2039
1943
  .text-loop-svg { display:block; width:100%; height:auto; overflow:hidden; }
2040
- .text-loop-measure { visibility:hidden; white-space:pre; }
2041
- .text-loop-text { font-family:inherit; white-space:pre; }
1944
+ .text-loop-art { pointer-events:none; }
1945
+ .text-loop-glyph { font-family:inherit; white-space:pre; }
1946
+ .text-loop-edge { stroke:var(--feedback-edge, #1d1b1b); }
1947
+ .text-loop-stitch { stroke:var(--feedback-ink, #373434); stroke-width:1.4; stroke-dasharray:5 8; opacity:.3; }
1948
+ .text-loop-accents { stroke:var(--feedback-edge, #1d1b1b); stroke-width:2.5; stroke-linecap:round; stroke-linejoin:round; }
1949
+ .text-loop-hit { pointer-events:stroke; }
2042
1950
  .text-loop-showcase { grid-template-columns:minmax(0,1fr); }
2043
1951
  .text-loop-playground { margin-top:32px; background:#fafbfc; border:1px solid var(--border); border-radius:12px; overflow:hidden; }
2044
1952
  .text-loop-stage { width:100%; min-width:0; background:var(--feedback-soft); border:2px solid var(--feedback-edge); border-radius:10px; box-shadow:0 4px 0 var(--feedback-edge); overflow:hidden; }
@@ -2049,90 +1957,27 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
2049
1957
  .text-loop-footer p { margin:0; line-height:1.7; }
2050
1958
  .text-loop-controls { grid-template-columns:repeat(3,minmax(0,1fr)); border-top:1px solid var(--border); background:#fff; align-items:start; }
2051
1959
  .text-loop-actions { display:flex; align-items:center; flex-wrap:wrap; gap:12px; padding-top:20px; }
1960
+ .text-loop-controls .color-inputs input { min-height:40px; border:1px solid var(--border); border-radius:6px; background:#fff; color:#252a34; }
1961
+ .text-loop-controls .color-inputs input[type=color] { width:44px; height:40px; padding:3px; flex-shrink:0; cursor:pointer; }
1962
+ .text-loop-controls .color-inputs input:not([type=color]) { width:120px; min-width:0; padding:8px; font-family:monospace; }
2052
1963
  .text-loop-note { margin:0; padding:16px 28px; font-size: 12px; line-height:1.7; color:var(--muted); border-top:1px solid var(--border); }
2053
1964
  .text-loop-showcase .gallery-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
2054
1965
  .text-loop-showcase .gallery-card-preview { padding:24px 20px; }
2055
1966
  .text-loop-mini { display:block; width:100%; }
2056
1967
  @media(max-width:800px) { .text-loop-controls { grid-template-columns:repeat(2,minmax(0,1fr)); }.text-loop-words { grid-column:1/-1; } }
2057
- @media(max-width:600px) { .text-loop-showcase .gallery-grid { grid-template-columns:minmax(0,1fr); }.text-loop-playground>.text-loop-stage { margin:16px 16px 20px; }.text-loop-meta,.text-loop-footer { padding:16px; }.text-loop-meta { flex-wrap:wrap; }.text-loop-controls { grid-template-columns:minmax(0,1fr); }.text-loop-controls .duoop-input { font-size: 16px; }.text-loop-actions { padding-top:0; }.text-loop-stage .text-loop-svg { width:180%; max-width:none; margin-inline-start:-40%; }.text-loop-note { padding:16px 20px; } }
2058
- .depth-carousel { width:100%; min-width:0; color:var(--feedback-ink,#373434); --depth-paper:var(--feedback-face,#fff); --depth-fill:var(--feedback-soft,#f0eeee); }
2059
- .depth-carousel__viewport { position:relative; height:370px; perspective:1200px; overflow:hidden; touch-action:pan-y; user-select:none; cursor:grab; border-radius:10px; }
2060
- .depth-carousel__viewport:active { cursor:grabbing; }
2061
- .depth-carousel__viewport:focus-visible { outline:2px solid var(--feedback-ink,#373434); outline-offset:-8px; }
2062
- .depth-carousel__card { position:absolute; top:50%; left:50%; width:min(270px,65%); height:310px; display:flex; flex-direction:column; background:var(--depth-paper); border:2px solid var(--feedback-edge,#1d1b1b); border-radius:10px; box-shadow:0 5px 0 var(--feedback-edge,#1d1b1b); overflow:hidden; transform:translate(-50%,-50%); pointer-events:none; }
2063
- .depth-carousel__card::after { content:''; position:absolute; inset:0; background:var(--feedback-ink,#373434); opacity:var(--depth-shade,0); pointer-events:none; }
2064
- .depth-carousel__card>img { width:100%; height:100%; object-fit:cover; }
2065
- .depth-carousel__card>h4 { margin:16px; }
2066
- .depth-carousel__navigation { display:flex; justify-content:center; align-items:center; gap:24px; padding:4px 0; }
2067
- .depth-carousel__navigation .duoop-button { width:44px; height:44px; }
2068
- .depth-carousel__counter { font-size: 13px; font-weight:600; font-variant-numeric:tabular-nums; }
2069
- .depth-carousel__counter>span { color:var(--feedback-muted,#686565); font-weight:400; }
2070
- .depth-carousel__indicators { display:flex; justify-content:center; }
2071
- .depth-carousel__indicators button { width:36px; height:44px; padding:12px 8px; border:0; background:transparent; color:inherit; cursor:pointer; }
2072
- .depth-carousel__indicators button>span { display:block; height:6px; border:1.5px solid currentColor; border-radius:2px; transition:transform 180ms ease-out,background-color 180ms ease-out; }
2073
- .depth-carousel__indicators button[aria-pressed=true]>span { background:currentColor; transform:translateY(-2px); box-shadow:0 2px 0 var(--feedback-edge,#1d1b1b); }
2074
- .depth-carousel__indicators button:hover>span { transform:translateY(-3px); }
2075
- .depth-carousel__indicators button:focus-visible { outline:2px solid currentColor; outline-offset:-7px; border-radius:8px; }
2076
- .depth-carousel__empty { text-align:center; padding:120px 24px; font-size: 13px; }
2077
- .depth-playground .depth-carousel { max-width:780px; }
2078
- .depth-playground .depth-carousel__viewport { height:520px; }
2079
- .depth-playground .depth-carousel__card { width:min(380px,65%); height:460px; }
2080
- .depth-mini img { display:block; width:100%; height:100%; object-fit:cover; }
2081
- .depth-playground { margin-top:32px; border:1px solid var(--border); border-radius:12px; overflow:hidden; }
2082
- .depth-playground__preview { display:flex; justify-content:center; padding:24px; background:var(--feedback-soft,#f0eeee); color:var(--feedback-ink,#373434); }
2083
- .depth-controls { display:flex; justify-content:center; flex-wrap:wrap; gap:28px; padding:28px; border-top:1px solid var(--border); }
2084
- .depth-controls fieldset { padding:0; border:0; margin:0; min-width:0; }
2085
- .depth-controls legend { font-size: 12px; font-weight:600; margin-bottom:12px; }
2086
- .depth-controls fieldset>div { display:flex; flex-wrap:wrap; gap:12px; }
2087
- .depth-controls .duoop-button-reserve { display:none; }
2088
- .depth-carousel-showcase .gallery-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
2089
- .depth-carousel-showcase .gallery-card-preview { padding:16px; }
2090
- .depth-demo { width:100%; min-width:0; padding:8px 0; border-radius:10px; background:var(--feedback-soft,#f0eeee); }
2091
- .depth-mini { display:block; position:relative; width:220px; height:155px; perspective:700px; --depth-paper:#fff; --depth-fill:#f0eeee; }
2092
- .depth-mini>span { position:absolute; left:20px; top:0; width:140px; height:150px; border:2px solid #1d1b1b; border-radius:10px; box-shadow:0 4px 0 #1d1b1b; background:#fff; overflow:hidden; transition:transform 350ms cubic-bezier(.2,.8,.2,1); }
2093
- .depth-mini>span:first-child { transform:translate(68px,0) scale(.72) rotateY(-15deg); background:#dedada; }
2094
- .depth-mini>span:nth-child(2) { transform:translate(37px,0) scale(.85) rotateY(-15deg); background:#f0eeee; }
2095
- .library-card:hover .depth-mini>span:last-child { transform:translateX(-8px); }
2096
-
2097
- @media(max-width:700px) { .depth-carousel-showcase .gallery-grid { grid-template-columns:1fr; } }
2098
- @media(max-width:480px) { .depth-playground__preview { padding:16px 4px 8px; }.depth-controls { padding:20px; gap:20px; }.depth-carousel__card { width:72%; }.depth-carousel__viewport { height:355px; }.depth-playground .depth-carousel__viewport { height:420px; }.depth-playground .depth-carousel__card { width:72%; height:360px; } }
2099
- @media(prefers-reduced-motion:reduce) { .depth-mini>span,.depth-carousel__indicators button>span { transition:none; }.library-card:hover .depth-mini>span:last-child { transform:none; } }
2100
-
2101
-
2102
- .card-spread { width:100%; min-width:0; color:var(--feedback-ink,#373434); }
2103
- .card-spread__fan { position:relative; width:88%; margin:0 auto; aspect-ratio:1.7; isolation:isolate; }
2104
- .card-spread__card { position:absolute; left:calc(50% + var(--x)); top:calc(15% + var(--y)); width:23%; height:59%; padding:0; border:2px solid #1d1b1b; border-radius:10px; background:#1d1b1b; color:var(--feedback-ink,#373434); box-shadow:0 4px 0 #1d1b1b; overflow:hidden; cursor:pointer; transform:translate(calc(-50% + var(--shift)),var(--lift)) rotate(var(--angle)); transform-origin:50% 70%; transition:transform 480ms cubic-bezier(.25,.8,.25,1),box-shadow 180ms ease-out; -webkit-tap-highlight-color:transparent; }
2105
- .card-spread__card img { position:absolute; inset:-1px; width:calc(100% + 2px); height:calc(100% + 2px); object-fit:cover; display:block; pointer-events:none; }
2106
- .card-spread__card:focus-visible { outline:none; }
2107
- .card-spread__card:focus-visible::after { content:''; position:absolute; inset:5px; border:2px solid #1d1b1b; border-radius:5px; pointer-events:none; }
2108
- .card-spread__card:active { box-shadow:0 1px 0 #1d1b1b; }
2109
- .card-spread__empty { padding:48px 24px; text-align:center; }
2110
- .spread-playground { margin-top:32px; border:1px solid var(--border); border-radius:12px; overflow:hidden; }
2111
- .spread-stage { background:var(--feedback-soft,#f0eeee); padding:32px 40px 16px; color:var(--feedback-ink,#373434); }
2112
- .spread-stage__heading { display:flex; justify-content:space-between; align-items:baseline; gap:20px; }
2113
- .spread-stage__heading h3 { margin:0; font-size: 20px; font-weight:600; letter-spacing:-.5px; }
2114
- .spread-stage__heading span { font-size: 10px; letter-spacing:.1em; color:var(--feedback-muted,#686565); }
2115
- .spread-stage>p { margin:0; text-align:center; font-size: 12px; line-height:1.7; color:var(--feedback-muted,#686565); }
2116
- .spread-controls { display:flex; gap:12px; padding:20px 28px; border-top:1px solid var(--border); }
2117
- .spread-demo { width:100%; padding:20px; background:var(--feedback-soft,#f0eeee); border-radius:10px; }
2118
- .card-spread-showcase .gallery-grid { grid-template-columns:1fr; }
2119
- .card-spread-showcase .gallery-card-preview { padding:24px; }
2120
- .spread-mini { display:block; position:relative; width:240px; height:150px; }
2121
- .spread-mini>span { position:absolute; left:calc(50% + var(--offset) * 23px); top:calc(16px + var(--drop) * 5px); width:58px; height:90px; border:2px solid #1d1b1b; border-radius:6px; box-shadow:0 3px 0 #1d1b1b; overflow:hidden; transform:translateX(-50%) rotate(calc(var(--offset) * 15deg)); background:#fff; }
2122
- .spread-mini img { width:100%; height:100%; object-fit:cover; }
2123
- @media(max-width:600px) { .spread-stage { padding:24px 8px 20px; }.spread-stage__heading { padding:0 12px; }.spread-stage__heading span { display:none; }.card-spread__fan { aspect-ratio:1.4; }.card-spread__card { height:49%; top:calc(22% + var(--y)); }.spread-stage>p { padding:0 16px; }.spread-demo { padding:8px; }.card-spread-showcase .gallery-card-preview { padding:12px; } }
2124
- @media(prefers-reduced-motion:reduce) { .card-spread__card { transition:none; } }
1968
+ @media(max-width:600px) { .text-loop-showcase .gallery-grid { grid-template-columns:minmax(0,1fr); }.text-loop-playground>.text-loop-stage { margin:16px 16px 20px; }.text-loop-meta,.text-loop-footer { padding:16px; }.text-loop-meta { flex-wrap:wrap; }.text-loop-controls { grid-template-columns:minmax(0,1fr); }.text-loop-controls .duoop-input { font-size: 16px; }.text-loop-actions { padding-top:0; }.text-loop-stage .text-loop-svg { width:150%; max-width:none; margin-inline-start:-25%; }.text-loop-note { padding:16px 20px; } }
2125
1969
  .map-experience { width:100%; min-width:0; color:#373434; text-align:start; container-type:inline-size; }
2126
1970
  .map-atlas { border:2px solid #373434; border-radius:12px; box-shadow:4px 5px 0 #1d1b1b; overflow:hidden; background:#fff; }
2127
- .map-atlas-heading { display:flex; justify-content:space-between; align-items:center; gap:24px; padding:28px 32px; border-bottom:2px solid #373434; }
2128
- .map-eyebrow { font-size: 10px; font-weight:600; letter-spacing:.13em; color:#686565; }
2129
- .map-atlas-heading h3 { font-size: 38px; font-weight:550; letter-spacing:-1.6px; margin:9px 0 0; line-height:1.1; }
2130
- .map-atlas-heading h3 span { color:#777474; }
1971
+ .map-atlas-heading { display:flex; justify-content:space-between; align-items:center; gap:24px; padding:30px 32px; border-bottom:2px solid #373434; background:#f0eeee; }
1972
+ .map-eyebrow { font-size:10px; font-weight:650; letter-spacing:.1em; color:#686565; }
1973
+ .map-atlas-heading h3 { font-size:clamp(38px, 6cqi, 68px); font-weight:800; letter-spacing:-.055em; margin:9px 0 0; line-height:1.1; text-transform:uppercase; }
1974
+ .map-atlas-heading h3 span { color:#373434; }
2131
1975
  .map-coordinates { font-size: 11px; line-height:1.9; letter-spacing:.06em; text-align:end; color:#686565; font-variant-numeric:tabular-nums; }
2132
1976
  .duoop-map { position:relative; height:510px; isolation:isolate; background:#eeece8; }
2133
1977
  .duoop-map-canvas { width:100%; height:100%; background:#eeece8; font-family:var(--duoop-font, 'DM Sans', sans-serif); }
2134
1978
  .duoop-map .leaflet-tile-pane { filter:grayscale(1) contrast(.72) brightness(1.15); }
2135
- .duoop-map-canvas:focus-visible { outline:3px solid #373434; outline-offset:-6px; }
1979
+ .duoop-map-canvas:focus-visible { outline:none; }
1980
+ .duoop-map-canvas:focus-visible::after { content:''; position:absolute; inset:auto 0 0; height:3px; background:#373434; z-index:800; pointer-events:none; }
2136
1981
  .duoop-map-controls { position:absolute; z-index:800; right:22px; top:22px; display:grid; gap:12px; }
2137
1982
  .duoop-map-controls .duoop-button { width:44px; height:44px; }
2138
1983
  .duoop-map-controls .duoop-button:last-child { margin-top:4px; }
@@ -2144,1015 +1989,1549 @@ button.stepper-control:active:not(:disabled) .stepper-marker { transform:transla
2144
1989
  .map-atlas-footer i { font-style:normal; color:#aaa5a5; padding:0 8px; }
2145
1990
  .map-showcase .gallery-card-preview { padding:30px; display:block; }
2146
1991
  .map-showcase .gallery-card--wide { grid-column:1/-1; }
2147
- .mini-map { position:relative; display:block; width:250px; height:150px; background:#eae8e2; border:2px solid #373434; border-radius:10px; box-shadow:4px 5px 0 #1d1b1b; overflow:hidden; }
1992
+ .mini-map { position:relative; display:block; width:250px; height:170px; background:#eae8e2; border:2px solid #373434; border-radius:10px; box-shadow:4px 5px 0 #1d1b1b; overflow:hidden; }
2148
1993
  .mini-map svg { position:absolute; inset:0; width:100%; height:100%; }
2149
- .mini-map b { position:absolute; top:14px; left:14px; color:#373434; font-size: 20px; font-weight:600; letter-spacing:-.7px; }
2150
- .mini-map small { position:absolute; bottom:0; left:0; right:0; background:white; padding:8px 14px; border-top:1px solid #373434; font-size: 9px; letter-spacing:.08em; }
2151
1994
  @container (max-width:580px) { .map-atlas-heading { padding:22px 20px; } .map-atlas-heading h3 { font-size: 30px; } .map-coordinates { font-size: 10px; } .duoop-map { height:430px; } .map-atlas-footer { padding:16px 20px; flex-direction:column; gap:4px; } .duoop-map-controls { top:16px; right:16px; } }
2152
1995
  @media(max-width:600px) { .map-showcase .gallery-card-preview { padding:18px 12px 22px; } }
2153
- .duoop-tooltip {
2154
- z-index: 120;
2155
- max-width: min(280px, var(--radix-tooltip-content-available-width));
2156
- padding: 10px 14px;
2157
- border: 2px solid #1d1b1b;
2158
- border-radius: 8px;
2159
- background: #373434;
2160
- color: #fff;
2161
- box-shadow: 0 3px 0 #1d1b1b;
2162
- font:
2163
- 500 13px/1.5 'DM Sans',
2164
- sans-serif;
2165
- overflow-wrap: anywhere;
2166
- transform-origin: var(--radix-tooltip-content-transform-origin);
2167
- animation: duoop-tooltip-in 160ms ease-out;
2168
- }
2169
- .duoop-tooltip[data-state='closed'] {
2170
- animation: duoop-tooltip-out 100ms ease-in;
2171
- }
2172
- .duoop-tooltip__arrow {
2173
- fill: #373434;
2174
- }
2175
- .duoop-tooltip-disabled {
2176
- display: inline-flex;
2177
- border-radius: 10px;
2178
- }
2179
- .duoop-tooltip-disabled:focus-visible {
2180
- outline: 2px dashed #373434;
2181
- outline-offset: -3px;
2182
- }
2183
- @keyframes duoop-tooltip-in {
2184
- from {
2185
- opacity: 0;
2186
- transform: translateY(3px) scale(0.96);
2187
- }
2188
- to {
2189
- opacity: 1;
2190
- transform: none;
2191
- }
2192
- }
2193
- @keyframes duoop-tooltip-out {
2194
- to {
2195
- opacity: 0;
2196
- }
2197
- }
2198
- @media (prefers-reduced-motion: reduce) {
2199
- .duoop-tooltip,
2200
- .duoop-tooltip[data-state='closed'] {
2201
- animation: none;
2202
- }
2203
- }
2204
- .duoop-popover {
2205
- z-index: 110;
2206
- box-sizing: border-box;
2207
- width: 320px;
2208
- max-width: min(calc(100vw - 24px), var(--radix-popover-content-available-width));
2209
- max-height: var(--radix-popover-content-available-height);
2210
- overflow: auto;
2211
- padding: 24px;
2212
- border: 2px solid #373434;
2213
- border-radius: 12px;
2214
- background: #fff;
2215
- color: #373434;
2216
- box-shadow: 0 5px 0 #1d1b1b;
2217
- font:
2218
- 400 14px/1.6 'DM Sans',
2219
- sans-serif;
2220
- transform-origin: var(--radix-popover-content-transform-origin);
2221
- animation: duoop-popover-in 200ms cubic-bezier(0.2, 0.8, 0.2, 1);
2222
- }
2223
- .duoop-popover[data-state='closed'] {
2224
- animation: duoop-popover-out 120ms ease-in;
2225
- }
2226
- .duoop-popover:focus-visible {
2227
- outline: 2px dashed #373434;
2228
- outline-offset: -6px;
2229
- }
2230
- .duoop-popover h3 {
2231
- margin: 0 0 8px;
2232
- font-size: 17px;
2233
- }
2234
- .duoop-popover p {
2235
- margin: 0;
2236
- }
2237
- @keyframes duoop-popover-in {
2238
- from {
2239
- opacity: 0;
2240
- transform: translateY(6px) scale(0.97);
2241
- }
2242
- to {
2243
- opacity: 1;
2244
- transform: none;
2245
- }
2246
- }
2247
- @keyframes duoop-popover-out {
2248
- to {
2249
- opacity: 0;
2250
- transform: scale(0.98);
2251
- }
2252
- }
2253
- @media (prefers-reduced-motion: reduce) {
2254
- .duoop-popover,
2255
- .duoop-popover[data-state='closed'] {
2256
- animation: none;
2257
- }
2258
- }
2259
- .duoop-slider {
2260
- width: 100%;
2261
- min-width: 0;
2262
- color: #373434;
2263
- font:
2264
- 500 14px/1.5 'DM Sans',
2265
- sans-serif;
2266
- }
2267
- .duoop-slider__heading {
2268
- display: flex;
2269
- justify-content: space-between;
2270
- gap: 20px;
2271
- margin-bottom: 12px;
2272
- }
2273
- .duoop-slider output {
2274
- font-variant-numeric: tabular-nums;
2275
- color: #686565;
2276
- }
2277
- .duoop-slider__control {
2278
- display: flex;
2279
- align-items: center;
2280
- position: relative;
2281
- height: 44px;
2282
- width: 100%;
2283
- touch-action: none;
2284
- user-select: none;
2285
- }
2286
- .duoop-slider__track {
2287
- position: relative;
2288
- flex: 1;
2289
- height: 10px;
2290
- border: 2px solid #777474;
2291
- border-radius: 5px;
2292
- background: #f0eeee;
2293
- overflow: hidden;
2294
- }
2295
- .duoop-slider__range {
2296
- position: absolute;
2297
- height: 100%;
2298
- background: #373434;
2299
- }
2300
- .duoop-slider__thumb {
2301
- display: block;
2302
- position: relative;
2303
- width: 24px;
2304
- height: 28px;
2305
- box-sizing: border-box;
2306
- border: 2px solid #373434;
2307
- border-radius: 7px;
2308
- background: #fff;
2309
- box-shadow: 0 3px 0 #1d1b1b;
2310
- transition:
2311
- transform 120ms ease-out,
2312
- box-shadow 160ms ease-out,
2313
- background 160ms;
2314
- }
2315
- .duoop-slider__thumb::before {
2316
- content: '';
2317
- position: absolute;
2318
- inset: -10px;
2319
- }
2320
- .duoop-slider__thumb::after {
2321
- content: '';
2322
- position: absolute;
2323
- inset: 7px 8px;
2324
- border-inline: 1px solid #777474;
2325
- }
2326
- .duoop-slider__thumb:hover {
2327
- background: #f0eeee;
2328
- transform: translateY(-1px);
2329
- }
2330
- .duoop-slider__thumb:active {
2331
- transform: translateY(2px);
2332
- box-shadow: 0 1px 0 #1d1b1b;
2333
- }
2334
- .duoop-slider__thumb:focus-visible {
2335
- outline: none;
2336
- border-style: dashed;
2337
- background: #f0eeee;
2338
- }
2339
- .duoop-slider__marks {
2340
- height: 24px;
2341
- position: relative;
2342
- margin-inline: 12px;
2343
- font-size: 12px;
2344
- color: #686565;
2345
- }
2346
- .duoop-slider__marks span {
2347
- position: absolute;
2348
- transform: translateX(-50%);
2349
- }
2350
- .duoop-slider[dir='rtl'] .duoop-slider__marks span {
2351
- transform: translateX(50%);
2352
- }
2353
- .duoop-slider[data-disabled] {
2354
- opacity: 0.5;
2355
- }
2356
- @media (prefers-reduced-motion: reduce) {
2357
- .duoop-slider__thumb {
2358
- transition: none;
2359
- }
2360
- }
2361
- .duoop-calendar {
2362
- --day-size: 40px;
2363
- box-sizing: border-box;
2364
- width: 324px;
2365
- max-width: 100%;
2366
- padding: 20px;
2367
- border: 2px solid #373434;
2368
- border-radius: 12px;
2369
- box-shadow: 0 4px 0 #1d1b1b;
2370
- background: #fff;
2371
- color: #373434;
2372
- font:
2373
- 400 14px/1.5 'DM Sans',
2374
- sans-serif;
2375
- }
2376
- .duoop-calendar .rdp-months {
2377
- position: relative;
2378
- display: flex;
2379
- gap: 24px;
2380
- flex-wrap: wrap;
2381
- }
2382
- .duoop-calendar .rdp-month {
2383
- min-width: 0;
2384
- }
2385
- .duoop-calendar .rdp-month_caption {
2386
- display: flex;
2387
- align-items: center;
2388
- height: 44px;
2389
- margin-bottom: 16px;
2390
- padding-inline-end: 86px;
2391
- font-weight: 600;
2392
- }
2393
- .duoop-calendar .rdp-caption_label {
2394
- display: flex;
2395
- gap: 4px;
2396
- align-items: center;
2397
- white-space: nowrap;
2398
- }
2399
- .duoop-calendar .rdp-dropdowns {
2400
- display: flex;
2401
- gap: 8px;
2402
- align-items: center;
2403
- }
2404
- .duoop-calendar .rdp-dropdown_root {
2405
- position: relative;
2406
- border-bottom: 1px solid #777474;
2407
- }
2408
- .duoop-calendar .rdp-dropdown {
2409
- position: absolute;
2410
- inset: 0;
2411
- width: 100%;
2412
- opacity: 0;
2413
- cursor: pointer;
2414
- }
2415
- .duoop-calendar .rdp-dropdown_root:focus-within {
2416
- border-bottom: 2px dashed #373434;
2417
- }
2418
- .duoop-calendar .rdp-nav {
2419
- position: absolute;
2420
- inset-inline-end: 0;
2421
- top: 0;
2422
- display: flex;
2423
- gap: 6px;
2424
- }
2425
- .duoop-calendar .rdp-button_previous,
2426
- .duoop-calendar .rdp-button_next {
2427
- display: grid;
2428
- place-items: center;
2429
- height: 36px;
2430
- width: 36px;
2431
- border: 2px solid #777474;
2432
- border-radius: 8px;
2433
- background: #fff;
2434
- color: #373434;
2435
- box-shadow: 0 2px 0 #1d1b1b;
2436
- }
2437
- .duoop-calendar .rdp-chevron {
2438
- width: 16px;
2439
- height: 16px;
2440
- fill: currentColor;
2441
- }
2442
- .duoop-calendar .rdp-month_grid {
2443
- border-collapse: collapse;
2444
- table-layout: fixed;
2445
- width: 100%;
2446
- }
2447
- .duoop-calendar .rdp-weekday {
2448
- height: 32px;
2449
- font-size: 11px;
2450
- color: #686565;
2451
- font-weight: 500;
2452
- text-align: center;
2453
- }
2454
- .duoop-calendar .rdp-day {
2455
- width: calc(100% / 7);
2456
- height: 44px;
2457
- padding: 2px 0;
2458
- text-align: center;
2459
- }
2460
- .duoop-calendar .rdp-day_button {
2461
- position: relative;
2462
- display: grid;
2463
- place-items: center;
2464
- width: 100%;
2465
- max-width: var(--day-size);
2466
- height: 38px;
2467
- padding: 0;
2468
- margin: 0 auto;
2469
- border: 2px solid transparent;
2470
- border-radius: 8px;
2471
- background: transparent;
2472
- color: inherit;
2473
- font: inherit;
2474
- cursor: pointer;
2475
- transition:
2476
- background 140ms,
2477
- transform 120ms,
2478
- box-shadow 140ms;
2479
- }
2480
- .duoop-calendar .rdp-day_button:hover:not(:disabled) {
2481
- border-color: #777474;
2482
- background: #f0eeee;
2483
- }
2484
- .duoop-calendar .rdp-day_button:active:not(:disabled) {
2485
- transform: translateY(2px);
2486
- box-shadow: none;
2487
- }
2488
- .duoop-calendar .rdp-selected .rdp-day_button {
2489
- border-color: #1d1b1b;
2490
- background: #373434;
2491
- color: #fff;
2492
- box-shadow: 0 2px 0 #1d1b1b;
2493
- font-weight: 600;
2494
- }
2495
- .duoop-calendar .rdp-selected .rdp-day_button:hover {
2496
- background: #373434;
2497
- }
2498
- .duoop-calendar .rdp-today:not(.rdp-selected) .rdp-day_button {
2499
- border-color: #777474;
2500
- }
2501
- .duoop-calendar .rdp-range_middle {
2502
- background: #f0eeee;
2503
- }
2504
- .duoop-calendar .rdp-range_middle .rdp-day_button {
2505
- border-color: transparent;
2506
- background: transparent;
2507
- color: #373434;
2508
- box-shadow: none;
2509
- }
2510
- .duoop-calendar .rdp-outside {
2511
- color: #777474;
2512
- }
2513
- .duoop-calendar .rdp-disabled {
2514
- opacity: 0.35;
2515
- }
2516
- .duoop-calendar button:disabled {
2517
- cursor: not-allowed;
2518
- }
2519
- .duoop-calendar button:focus-visible {
2520
- outline: none;
2521
- border: 2px dashed currentColor;
2522
- }
2523
- .duoop-calendar .rdp-hidden {
2524
- visibility: hidden;
2525
- }
2526
- .duoop-calendar .rdp-footer {
2527
- margin-top: 16px;
2528
- font-size: 12px;
2529
- color: #686565;
2530
- }
2531
- @media (max-width: 480px) {
2532
- .duoop-calendar {
2533
- --day-size: 34px;
2534
- padding: 12px;
2535
- }
2536
- .duoop-calendar .rdp-month_caption {
2537
- font-size: 12px;
2538
- }
2539
- .duoop-calendar .rdp-dropdowns {
2540
- gap: 5px;
2541
- }
2542
- }
2543
- @media (prefers-reduced-motion: reduce) {
2544
- .duoop-calendar .rdp-day_button {
2545
- transition: none;
2546
- }
2547
- }
2548
- .duoop-date-picker {
2549
- display: grid;
2550
- gap: 10px;
2551
- width: 100%;
2552
- font:
2553
- 500 14px/1.5 'DM Sans',
2554
- sans-serif;
2555
- color: #373434;
2556
- }
2557
- .duoop-date-picker__trigger {
2558
- width: 100%;
2559
- }
2560
- .duoop-date-picker__trigger .duoop-button-content {
2561
- width: 100%;
2562
- justify-content: space-between;
2563
- }
2564
- .duoop-date-picker__trigger .duoop-button-label {
2565
- white-space: normal;
2566
- text-align: start;
2567
- }
2568
- .duoop-date-picker__popup {
2569
- width: 328px;
2570
- padding: 0;
2571
- }
2572
- .duoop-date-picker__popup .duoop-calendar {
2573
- width: 100%;
2574
- border: 0;
2575
- box-shadow: none;
2576
- border-radius: 0;
2577
- }
2578
- .duoop-date-picker__footer {
2579
- display: flex;
2580
- align-items: center;
2581
- justify-content: space-between;
2582
- gap: 12px;
2583
- padding: 12px 20px;
2584
- border-top: 1px solid #e7e9ed;
2585
- font-size: 12px;
2586
- color: #686565;
2587
- }
2588
- .duoop-pagination {
2589
- display: flex;
2590
- align-items: center;
2591
- justify-content: center;
2592
- gap: 10px;
2593
- font:
2594
- 500 13px/1.5 'DM Sans',
2595
- sans-serif;
2596
- color: #373434;
2597
- }
2598
- .duoop-pagination__pages {
2599
- display: flex;
2600
- align-items: center;
2601
- gap: 8px;
2602
- }
2603
- .duoop-pagination .duoop-button {
2604
- min-width: 36px;
2605
- padding-inline: 10px;
2606
- }
2607
- .duoop-pagination__gap {
2608
- width: 16px;
2609
- text-align: center;
2610
- }
2611
- .duoop-pagination__compact {
2612
- display: none;
2613
- min-width: 64px;
2614
- text-align: center;
2615
- font-variant-numeric: tabular-nums;
2616
- }
2617
- @media (max-width: 600px) {
2618
- .duoop-pagination__pages {
2619
- display: none;
2620
- }
2621
- .duoop-pagination__compact {
2622
- display: inline;
2623
- }
2624
- .duoop-pagination .duoop-button {
2625
- min-width: 44px;
2626
- min-height: 44px;
2627
- }
2628
- }
2629
- .duoop-data-table {
2630
- width: 100%;
2631
- min-width: 0;
2632
- color: #373434;
2633
- font:
2634
- 400 14px/1.6 'DM Sans',
2635
- sans-serif;
2636
- }
2637
- .duoop-table-scroll {
2638
- width: 100%;
2639
- overflow: auto;
2640
- border: 2px solid #373434;
2641
- border-radius: 10px;
2642
- box-shadow: 0 4px 0 #1d1b1b;
2643
- background: #fff;
2644
- }
2645
- .duoop-table-scroll:focus-visible {
2646
- outline: 2px dashed #373434;
2647
- outline-offset: -5px;
2648
- }
2649
- .duoop-table {
2650
- width: 100%;
2651
- border-collapse: collapse;
2652
- text-align: start;
2653
- font:
2654
- 400 14px/1.6 'DM Sans',
2655
- sans-serif;
2656
- color: #373434;
2657
- }
2658
- .duoop-table caption {
2659
- padding: 18px 20px;
2660
- text-align: start;
2661
- border-bottom: 1px solid #e7e9ed;
2662
- font-weight: 600;
2663
- }
2664
- .duoop-table th {
2665
- background: #f7f6f6;
2666
- font-size: 12px;
2667
- font-weight: 600;
2668
- }
2669
- .duoop-table th,
2670
- .duoop-table td {
2671
- padding: 14px 20px;
2672
- border-bottom: 1px solid #e7e9ed;
2673
- white-space: nowrap;
2674
- text-align: start;
2675
- }
2676
- .duoop-table th .duoop-button {
2677
- margin: -8px;
2678
- font-size: 12px;
2679
- }
2680
- .duoop-table tr:last-child td {
2681
- border-bottom: 0;
2682
- }
2683
- .duoop-table tbody tr {
2684
- transition: background 160ms;
2685
- }
2686
- .duoop-table tbody tr:hover {
2687
- background: #faf9f9;
2688
- }
2689
- .duoop-table tbody tr[data-selected] {
2690
- background: #f0eeee;
2691
- }
2692
- .duoop-table__select {
2693
- width: 48px;
2694
- }
2695
- .duoop-data-table__footer {
2696
- display: flex;
2697
- flex-wrap: wrap;
2698
- justify-content: space-between;
2699
- align-items: center;
2700
- gap: 20px;
2701
- padding-top: 24px;
2702
- }
2703
- .duoop-data-table__footer > span {
2704
- color: #686565;
2705
- font-size: 12px;
2706
- }
2707
- .duoop-table__empty {
2708
- text-align: center;
2709
- padding: 40px 12px;
2710
- white-space: normal;
2711
- }
2712
- .duoop-table__empty strong {
2713
- font-size: 16px;
2714
- }
2715
- .duoop-table__empty p {
2716
- color: #686565;
2717
- margin: 8px 0 20px;
2718
- }
2719
- @media (prefers-reduced-motion: reduce) {
2720
- .duoop-table tbody tr {
2721
- transition: none;
2722
- }
2723
- }
2724
- .duoop-sheet-overlay {
2725
- position: fixed;
2726
- inset: 0;
2727
- z-index: 130;
2728
- background: rgb(29 27 27 / 0.3);
2729
- animation: duoop-sheet-fade 180ms ease-out;
2730
- }
2731
- .duoop-sheet {
2732
- position: fixed;
2733
- z-index: 131;
2734
- box-sizing: border-box;
2735
- padding: 32px;
2736
- background: #fff;
2737
- color: #373434;
2738
- border: 2px solid #373434;
2739
- font:
2740
- 400 14px/1.6 'DM Sans',
2741
- sans-serif;
2742
- overflow: auto;
2743
- overscroll-behavior: contain;
2744
- animation: duoop-sheet-in 240ms cubic-bezier(0.2, 0.8, 0.2, 1);
2745
- }
2746
- .duoop-sheet[data-side='right'] {
2747
- inset: 12px 12px 12px auto;
2748
- width: min(420px, calc(100vw - 24px));
2749
- border-radius: 12px;
2750
- box-shadow: 4px 4px 0 #1d1b1b;
2751
- --sheet-x: 32px;
2752
- --sheet-y: 0px;
2753
- }
2754
- .duoop-sheet[data-side='left'] {
2755
- inset: 12px auto 12px 12px;
2756
- width: min(420px, calc(100vw - 24px));
2757
- border-radius: 12px;
2758
- box-shadow: 4px 4px 0 #1d1b1b;
2759
- --sheet-x: -32px;
2760
- --sheet-y: 0px;
2761
- }
2762
- .duoop-sheet[data-side='bottom'] {
2763
- inset: auto 0 0;
2764
- max-height: 85dvh;
2765
- border-radius: 16px 16px 0 0;
2766
- padding-bottom: max(32px, env(safe-area-inset-bottom));
2767
- --sheet-x: 0px;
2768
- --sheet-y: 40px;
2769
- }
2770
- .duoop-sheet[data-side='top'] {
2771
- inset: 0 0 auto;
2772
- max-height: 85dvh;
2773
- border-radius: 0 0 16px 16px;
2774
- padding-top: max(32px, env(safe-area-inset-top));
2775
- --sheet-x: 0px;
2776
- --sheet-y: -40px;
2777
- }
2778
- .duoop-sheet h2 {
2779
- margin: 0 48px 8px 0;
2780
- font-size: 24px;
2781
- }
2782
- .duoop-sheet p {
2783
- color: #686565;
2784
- margin: 0 0 28px;
2785
- }
2786
- .duoop-sheet__close {
2787
- position: absolute;
2788
- top: 20px;
2789
- right: 20px;
2790
- }
2791
- .duoop-sheet[data-state='closed'] {
2792
- animation: duoop-sheet-out 160ms ease-in;
2793
- }
2794
- .duoop-sheet-overlay[data-state='closed'] {
2795
- animation: duoop-sheet-fade 140ms ease-in reverse;
2796
- }
2797
- @keyframes duoop-sheet-in {
2798
- from {
2799
- opacity: 0;
2800
- transform: translate(var(--sheet-x), var(--sheet-y));
2801
- }
2802
- to {
2803
- opacity: 1;
2804
- transform: none;
2805
- }
2806
- }
2807
- @keyframes duoop-sheet-out {
2808
- to {
2809
- opacity: 0;
2810
- transform: translate(var(--sheet-x), var(--sheet-y));
2811
- }
2812
- }
2813
- @keyframes duoop-sheet-fade {
2814
- from {
2815
- opacity: 0;
2816
- }
2817
- to {
2818
- opacity: 1;
2819
- }
2820
- }
2821
- @media (max-width: 480px) {
2822
- .duoop-sheet {
2823
- padding: 24px 20px;
2824
- }
2825
- }
2826
- @media (prefers-reduced-motion: reduce) {
2827
- .duoop-sheet,
2828
- .duoop-sheet[data-state='closed'],
2829
- .duoop-sheet-overlay,
2830
- .duoop-sheet-overlay[data-state='closed'] {
2831
- animation-duration: 1ms;
2832
- }
2833
- }
2834
- .duoop-file-upload {
2835
- width: 100%;
2836
- color: #373434;
2837
- font:
2838
- 400 14px/1.6 'DM Sans',
2839
- sans-serif;
2840
- }
2841
- .duoop-file-upload h3 {
2842
- margin: 0 0 16px;
2843
- font-size: 15px;
2844
- }
2845
- .duoop-dropzone {
2846
- display: flex;
2847
- flex-direction: column;
2848
- align-items: center;
2849
- text-align: center;
2850
- gap: 16px;
2851
- padding: 32px 24px;
2852
- border: 2px dashed #777474;
2853
- border-radius: 12px;
2854
- background: #fff;
2855
- transition:
2856
- background 160ms,
2857
- border-color 160ms;
2858
- }
2859
- .duoop-dropzone[data-active] {
2860
- border-color: #373434;
2861
- border-style: solid;
2862
- background: #f0eeee;
2863
- }
2864
- .duoop-dropzone[data-disabled] {
2865
- opacity: 0.5;
2866
- }
2867
- .duoop-dropzone__icon {
2868
- display: grid;
2869
- place-items: center;
2870
- width: 52px;
2871
- height: 60px;
2872
- border: 2px solid #373434;
2873
- border-radius: 9px;
2874
- box-shadow: 0 4px 0 #1d1b1b;
2875
- background: #f7f6f6;
2876
- transition: transform 200ms;
2877
- }
2878
- .duoop-dropzone[data-active] .duoop-dropzone__icon {
2879
- transform: translateY(-4px) rotate(-4deg);
2880
- }
2881
- .duoop-dropzone__icon svg {
2882
- width: 30px;
2883
- height: 30px;
2884
- }
2885
- .duoop-dropzone p {
2886
- margin: -8px 0 0;
2887
- font-size: 13px;
2888
- color: #686565;
2889
- }
2890
- .duoop-dropzone small {
2891
- font-size: 12px;
2892
- color: #686565;
2893
- }
2894
- .duoop-file-upload__errors p,
2895
- .duoop-file-upload__info p {
2896
- color: #a51d2d;
2897
- font-size: 12px;
2898
- overflow-wrap: anywhere;
2899
- }
2900
- .duoop-file-upload__list {
2901
- margin: 20px 0;
2902
- padding: 0;
2903
- list-style: none;
2904
- display: grid;
2905
- gap: 12px;
2906
- }
2907
- .duoop-file-upload__list li {
2908
- display: flex;
2909
- align-items: center;
2910
- gap: 12px;
2911
- padding: 14px;
2912
- border: 1px solid #d0cccc;
2913
- border-radius: 10px;
2914
- background: #fff;
2915
- animation: duoop-file-in 200ms ease-out;
2916
- }
2917
- .duoop-file-upload__list li[data-state='error'] {
2918
- border-color: #a51d2d;
2919
- background: #fff2f3;
2920
- }
2921
- .duoop-file-upload__preview {
2922
- width: 40px;
2923
- height: 44px;
2924
- flex-shrink: 0;
2925
- display: grid;
2926
- place-items: center;
2927
- }
2928
- .duoop-file-upload__preview img {
2929
- width: 100%;
2930
- height: 100%;
2931
- object-fit: cover;
2932
- border-radius: 6px;
2933
- }
2934
- .duoop-file-upload__preview svg {
2935
- width: 28px;
2936
- height: 28px;
2937
- }
2938
- .duoop-file-upload__info {
2939
- flex: 1;
2940
- min-width: 0;
2941
- }
2942
- .duoop-file-upload__info strong {
2943
- display: block;
2944
- overflow-wrap: anywhere;
2945
- font-size: 13px;
2946
- }
2947
- .duoop-file-upload__info small {
2948
- display: block;
2949
- color: #686565;
2950
- font-size: 12px;
2951
- }
2952
- .duoop-file-upload__success {
2953
- width: 24px;
2954
- color: #356247;
2955
- }
2956
- .duoop-file-upload__list .duoop-button svg {
2957
- width: 18px;
2958
- height: 18px;
2959
- }
2960
- @keyframes duoop-file-in {
2961
- from {
2962
- opacity: 0;
2963
- transform: translateY(5px);
2964
- }
2965
- to {
2966
- opacity: 1;
2967
- transform: none;
2968
- }
2969
- }
2970
- @media (max-width: 480px) {
2971
- .duoop-dropzone {
2972
- padding: 24px 16px;
2973
- }
2974
- .duoop-file-upload__list li {
2975
- padding: 10px;
2976
- gap: 8px;
2977
- flex-wrap: wrap;
2978
- }
2979
- }
2980
- @media (prefers-reduced-motion: reduce) {
2981
- .duoop-dropzone,
2982
- .duoop-dropzone__icon,
2983
- .duoop-file-upload__list li {
2984
- animation: none;
2985
- transition: none;
2986
- }
2987
- }
2988
- .duoop-skeleton {
2989
- display: block;
2990
- position: relative;
2991
- box-sizing: border-box;
2992
- overflow: hidden;
2993
- width: 100%;
2994
- height: 12px;
2995
- border: 1px solid #d0cccc;
2996
- border-radius: 4px;
2997
- background: #eae7e7;
2998
- }
2999
- .duoop-skeleton::after {
3000
- content: '';
3001
- position: absolute;
3002
- inset: 0;
3003
- background: linear-gradient(
3004
- 90deg,
3005
- transparent,
3006
- rgb(255 255 255 / 0.7),
3007
- transparent
3008
- );
3009
- transform: translateX(-100%);
3010
- animation: duoop-skeleton-shimmer 1.8s ease-in-out infinite;
3011
- }
3012
- .duoop-skeleton--avatar {
3013
- width: 44px;
3014
- height: 44px;
3015
- border-radius: 12px;
3016
- flex-shrink: 0;
3017
- }
3018
- .duoop-skeleton--card {
3019
- border-radius: 8px;
3020
- height: 140px;
3021
- }
3022
- .duoop-skeleton-text {
3023
- display: grid;
3024
- width: 100%;
3025
- gap: 12px;
3026
- }
3027
- .duoop-skeleton-card {
3028
- display: grid;
3029
- gap: 24px;
3030
- width: 100%;
3031
- box-sizing: border-box;
3032
- padding: 24px;
3033
- border: 2px solid #777474;
3034
- border-radius: 12px;
3035
- background: #fff;
3036
- box-shadow: 0 3px 0 #373434;
3037
- }
3038
- .duoop-skeleton-person {
3039
- display: flex;
3040
- align-items: center;
3041
- gap: 16px;
3042
- }
3043
- .duoop-skeleton-table {
3044
- width: 100%;
3045
- border: 2px solid #777474;
3046
- border-radius: 10px;
3047
- background: #fff;
3048
- overflow: hidden;
3049
- }
3050
- .duoop-skeleton-table > div {
3051
- display: grid;
3052
- gap: 24px;
3053
- padding: 22px;
3054
- border-bottom: 1px solid #e7e9ed;
3055
- }
3056
- .duoop-skeleton-table > div:last-child {
3057
- border: 0;
3058
- }
3059
- @keyframes duoop-skeleton-shimmer {
3060
- to {
3061
- transform: translateX(100%);
3062
- }
3063
- }
3064
- @media (prefers-reduced-motion: reduce) {
3065
- .duoop-skeleton::after {
3066
- animation: none;
3067
- display: none;
3068
- }
3069
- }
3070
- .duoop-alert {
3071
- --alert-ink: #373434;
3072
- --alert-bg: #f7f6f6;
3073
- --alert-shadow: #1d1b1b;
3074
- display: flex;
3075
- align-items: flex-start;
3076
- gap: 14px;
3077
- width: 100%;
3078
- box-sizing: border-box;
3079
- padding: 20px;
3080
- border: 2px solid var(--alert-ink);
3081
- border-radius: 10px;
3082
- box-shadow: 0 3px 0 var(--alert-shadow);
3083
- background: var(--alert-bg);
3084
- color: var(--alert-ink);
3085
- font:
3086
- 400 14px/1.6 'DM Sans',
3087
- sans-serif;
3088
- animation: duoop-alert-in 220ms ease-out;
3089
- }
3090
- .duoop-alert[data-tone='success'] {
3091
- --alert-ink: #356247;
3092
- --alert-bg: #edf5ef;
3093
- --alert-shadow: #234631;
3094
- }
3095
- .duoop-alert[data-tone='warning'] {
3096
- --alert-ink: #79521a;
3097
- --alert-bg: #fff8e8;
3098
- --alert-shadow: #543a15;
3099
- }
3100
- .duoop-alert[data-tone='error'] {
3101
- --alert-ink: #a51d2d;
3102
- --alert-bg: #fff2f3;
3103
- --alert-shadow: #761725;
3104
- }
3105
- .duoop-alert__icon {
3106
- display: grid;
3107
- place-items: center;
3108
- flex: 0 0 24px;
3109
- padding-top: 1px;
3110
- }
3111
- .duoop-alert .feedback-icon {
3112
- width: 22px;
3113
- height: 22px;
3114
- }
3115
- .duoop-alert__body {
3116
- flex: 1;
3117
- min-width: 0;
3118
- overflow-wrap: anywhere;
3119
- }
3120
- .duoop-alert h3 {
3121
- font:
3122
- 600 14px/1.6 'DM Sans',
3123
- sans-serif;
3124
- margin: 0;
3125
- color: inherit;
3126
- }
3127
- .duoop-alert__description {
3128
- margin-top: 6px;
3129
- font-size: 13px;
3130
- }
3131
- .duoop-alert__description p {
3132
- margin: 0;
3133
- }
3134
- .duoop-alert__action {
3135
- margin-top: 16px;
3136
- }
3137
- .duoop-alert .duoop-alert__dismiss {
3138
- color: inherit;
3139
- margin: -8px -8px 0 0;
3140
- }
3141
- @keyframes duoop-alert-in {
3142
- from {
3143
- opacity: 0;
3144
- transform: translateY(5px);
3145
- }
3146
- to {
3147
- opacity: 1;
3148
- transform: none;
3149
- }
3150
- }
3151
- @media (prefers-reduced-motion: reduce) {
3152
- .duoop-alert {
3153
- animation: none;
3154
- }
3155
- }
1996
+ .map-coordinates b { display:block; font-size:10px; letter-spacing:.12em; margin-bottom:8px; color:#373434; }
1997
+ .duoop-map-compass { position:absolute; z-index:700; left:24px; bottom:32px; width:100px; pointer-events:none; }
1998
+ .duoop-map-compass svg { display:block; width:100%; overflow:visible; }
1999
+ .duoop-map-needle { transform-origin:50px 53px; transition:transform 320ms cubic-bezier(.2,.8,.2,1); }
2000
+ .is-moving .duoop-map-needle { transform:translateY(-2px); }
2001
+ .duoop-map-readout { position:absolute; z-index:700; right:22px; bottom:38px; display:grid; grid-template-columns:1fr auto; align-items:baseline; gap:8px 16px; padding:12px 16px; min-width:116px; background:#fff; border:2px solid #1d1b1b; border-radius:10px; box-shadow:0 4px 0 #1d1b1b; pointer-events:none; }
2002
+ .duoop-map-readout>span:first-child { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.1em; }
2003
+ .duoop-map-readout strong { font-size:24px; line-height:1; font-weight:800; font-variant-numeric:tabular-nums; animation:map-level-reveal 220ms ease-out; }
2004
+ .duoop-map-meter { grid-column:1/-1; height:4px; background:#e6e2e2; border-radius:2px; overflow:hidden; }
2005
+ .duoop-map-meter i { display:block; height:100%; background:#373434; transform-origin:left; transition:transform 260ms cubic-bezier(.2,.8,.2,1); }
2006
+ .map-atlas-footer span:first-child { font-weight:650; }
2007
+ @keyframes map-level-reveal { from { opacity:.4; transform:translateY(5px); } to { opacity:1; transform:translateY(0); } }
2008
+ @container (max-width:580px) { .map-atlas-heading { align-items:flex-start; gap:12px; padding:24px 20px; } .map-atlas-heading h3 { font-size:38px; } .map-eyebrow { font-size:9px; } .map-coordinates { font-size:10px; } .map-coordinates b { font-size:9px; } .duoop-map-compass { width:78px; left:16px; } .duoop-map-readout { right:16px; min-width:102px; padding:10px 12px; } }
2009
+ @container (max-width:360px) { .map-atlas-heading { flex-direction:column; gap:16px; } .map-coordinates { text-align:start; } .map-coordinates b { margin-bottom:2px; } }
2010
+ @media(prefers-reduced-motion:reduce) { .duoop-map-needle, .duoop-map-meter i { transition:none; } .is-moving .duoop-map-needle { transform:none; } .duoop-map-readout strong { animation:none; } }
2011
+ .duoop-tooltip {
2012
+ z-index: 120;
2013
+ max-width: min(280px, var(--radix-tooltip-content-available-width));
2014
+ padding: 10px 14px;
2015
+ border: 2px solid #1d1b1b;
2016
+ border-radius: 8px;
2017
+ background: #373434;
2018
+ color: #fff;
2019
+ box-shadow: 0 3px 0 #1d1b1b;
2020
+ font:
2021
+ 500 13px/1.5 'DM Sans',
2022
+ sans-serif;
2023
+ overflow-wrap: anywhere;
2024
+ transform-origin: var(--radix-tooltip-content-transform-origin);
2025
+ animation: duoop-tooltip-in 160ms ease-out;
2026
+ }
2027
+ .duoop-tooltip[data-state='closed'] {
2028
+ animation: duoop-tooltip-out 100ms ease-in;
2029
+ }
2030
+ .duoop-tooltip__arrow {
2031
+ fill: #373434;
2032
+ }
2033
+ .duoop-tooltip-disabled {
2034
+ display: inline-flex;
2035
+ border-radius: 10px;
2036
+ }
2037
+ .duoop-tooltip-disabled:focus-visible {
2038
+ outline:none;
2039
+ text-decoration: underline;
2040
+ }
2041
+ @keyframes duoop-tooltip-in {
2042
+ from {
2043
+ opacity: 0;
2044
+ transform: translateY(3px) scale(0.96);
2045
+ }
2046
+ to {
2047
+ opacity: 1;
2048
+ transform: none;
2049
+ }
2050
+ }
2051
+ @keyframes duoop-tooltip-out {
2052
+ to {
2053
+ opacity: 0;
2054
+ }
2055
+ }
2056
+ @media (prefers-reduced-motion: reduce) {
2057
+ .duoop-tooltip,
2058
+ .duoop-tooltip[data-state='closed'] {
2059
+ animation: none;
2060
+ }
2061
+ }
2062
+ .duoop-popover {
2063
+ z-index: 110;
2064
+ box-sizing: border-box;
2065
+ width: 320px;
2066
+ max-width: min(calc(100vw - 24px), var(--radix-popover-content-available-width));
2067
+ max-height: var(--radix-popover-content-available-height);
2068
+ overflow: auto;
2069
+ padding: 24px;
2070
+ border: 2px solid #373434;
2071
+ border-radius: 12px;
2072
+ background: #fff;
2073
+ color: #373434;
2074
+ box-shadow: 0 5px 0 #1d1b1b;
2075
+ font:
2076
+ 400 14px/1.6 'DM Sans',
2077
+ sans-serif;
2078
+ transform-origin: var(--radix-popover-content-transform-origin);
2079
+ animation: duoop-popover-in 200ms cubic-bezier(0.2, 0.8, 0.2, 1);
2080
+ }
2081
+ .duoop-popover[data-state='closed'] {
2082
+ animation: duoop-popover-out 120ms ease-in;
2083
+ }
2084
+ .duoop-popover:focus-visible {
2085
+ outline: none;
2086
+ border-style: dashed;
2087
+ }
2088
+ .duoop-popover h3 {
2089
+ margin: 0 0 8px;
2090
+ font-size: 17px;
2091
+ }
2092
+ .duoop-popover p {
2093
+ margin: 0;
2094
+ }
2095
+ @keyframes duoop-popover-in {
2096
+ from {
2097
+ opacity: 0;
2098
+ transform: translateY(6px) scale(0.97);
2099
+ }
2100
+ to {
2101
+ opacity: 1;
2102
+ transform: none;
2103
+ }
2104
+ }
2105
+ @keyframes duoop-popover-out {
2106
+ to {
2107
+ opacity: 0;
2108
+ transform: scale(0.98);
2109
+ }
2110
+ }
2111
+ @media (prefers-reduced-motion: reduce) {
2112
+ .duoop-popover,
2113
+ .duoop-popover[data-state='closed'] {
2114
+ animation: none;
2115
+ }
2116
+ }
2117
+ .duoop-slider {
2118
+ width: 100%;
2119
+ min-width: 0;
2120
+ color: #373434;
2121
+ font:
2122
+ 500 14px/1.5 'DM Sans',
2123
+ sans-serif;
2124
+ }
2125
+ .duoop-slider__heading {
2126
+ display: flex;
2127
+ justify-content: space-between;
2128
+ gap: 20px;
2129
+ margin-bottom: 12px;
2130
+ }
2131
+ .duoop-slider output {
2132
+ font-variant-numeric: tabular-nums;
2133
+ color: #686565;
2134
+ }
2135
+ .duoop-slider__control {
2136
+ display: flex;
2137
+ align-items: center;
2138
+ position: relative;
2139
+ height: 44px;
2140
+ width: 100%;
2141
+ touch-action: none;
2142
+ user-select: none;
2143
+ }
2144
+ .duoop-slider__track {
2145
+ position: relative;
2146
+ flex: 1;
2147
+ height: 10px;
2148
+ border: 2px solid #777474;
2149
+ border-radius: 5px;
2150
+ background: #f0eeee;
2151
+ overflow: hidden;
2152
+ }
2153
+ .duoop-slider__range {
2154
+ position: absolute;
2155
+ height: 100%;
2156
+ background: #373434;
2157
+ }
2158
+ .duoop-slider__thumb {
2159
+ display: block;
2160
+ position: relative;
2161
+ width: 24px;
2162
+ height: 28px;
2163
+ box-sizing: border-box;
2164
+ border: 2px solid #373434;
2165
+ border-radius: 7px;
2166
+ background: #fff;
2167
+ box-shadow: 0 3px 0 #1d1b1b;
2168
+ transition:
2169
+ transform 120ms ease-out,
2170
+ box-shadow 160ms ease-out,
2171
+ background 160ms;
2172
+ }
2173
+ .duoop-slider__thumb::before {
2174
+ content: '';
2175
+ position: absolute;
2176
+ inset: -10px;
2177
+ }
2178
+ .duoop-slider__thumb::after {
2179
+ content: '';
2180
+ position: absolute;
2181
+ inset: 7px 8px;
2182
+ border-inline: 1px solid #777474;
2183
+ }
2184
+ .duoop-slider__thumb:hover {
2185
+ background: #f0eeee;
2186
+ transform: translateY(-1px);
2187
+ }
2188
+ .duoop-slider__thumb:active {
2189
+ transform: translateY(2px);
2190
+ box-shadow: 0 1px 0 #1d1b1b;
2191
+ }
2192
+ .duoop-slider__thumb:focus-visible {
2193
+ outline: none;
2194
+ border-style: dashed;
2195
+ background: #f0eeee;
2196
+ }
2197
+ .duoop-slider__marks {
2198
+ height: 24px;
2199
+ position: relative;
2200
+ margin-inline: 12px;
2201
+ font-size: 12px;
2202
+ color: #686565;
2203
+ }
2204
+ .duoop-slider__marks span {
2205
+ position: absolute;
2206
+ transform: translateX(-50%);
2207
+ }
2208
+ .duoop-slider[dir='rtl'] .duoop-slider__marks span {
2209
+ transform: translateX(50%);
2210
+ }
2211
+ .duoop-slider[data-disabled] {
2212
+ opacity: 0.5;
2213
+ }
2214
+ @media (prefers-reduced-motion: reduce) {
2215
+ .duoop-slider__thumb {
2216
+ transition: none;
2217
+ }
2218
+ }
2219
+ .duoop-calendar {
2220
+ --day-size: 40px;
2221
+ box-sizing: border-box;
2222
+ width: 324px;
2223
+ max-width: 100%;
2224
+ padding: 20px;
2225
+ border: 2px solid #373434;
2226
+ border-radius: 12px;
2227
+ box-shadow: 0 4px 0 #1d1b1b;
2228
+ background: #fff;
2229
+ color: #373434;
2230
+ font:
2231
+ 400 14px/1.5 'DM Sans',
2232
+ sans-serif;
2233
+ }
2234
+ .duoop-calendar .rdp-months {
2235
+ position: relative;
2236
+ display: flex;
2237
+ gap: 24px;
2238
+ flex-wrap: wrap;
2239
+ }
2240
+ .duoop-calendar .rdp-month {
2241
+ min-width: 0;
2242
+ }
2243
+ .duoop-calendar .rdp-month_caption {
2244
+ display: flex;
2245
+ align-items: center;
2246
+ height: 44px;
2247
+ margin-bottom: 16px;
2248
+ padding-inline-end: 86px;
2249
+ font-weight: 600;
2250
+ }
2251
+ .duoop-calendar .rdp-caption_label {
2252
+ display: flex;
2253
+ gap: 4px;
2254
+ align-items: center;
2255
+ white-space: nowrap;
2256
+ }
2257
+ .duoop-calendar .rdp-dropdowns {
2258
+ display: flex;
2259
+ gap: 8px;
2260
+ align-items: center;
2261
+ }
2262
+ .duoop-calendar .rdp-dropdown_root {
2263
+ position: relative;
2264
+ border-bottom: 1px solid #777474;
2265
+ }
2266
+ .duoop-calendar .rdp-dropdown {
2267
+ position: absolute;
2268
+ inset: 0;
2269
+ width: 100%;
2270
+ opacity: 0;
2271
+ cursor: pointer;
2272
+ }
2273
+ .duoop-calendar .rdp-dropdown_root:focus-within {
2274
+ border-bottom: 2px dashed #373434;
2275
+ }
2276
+ .duoop-calendar .rdp-nav {
2277
+ position: absolute;
2278
+ inset-inline-end: 0;
2279
+ top: 0;
2280
+ display: flex;
2281
+ gap: 6px;
2282
+ }
2283
+ .duoop-calendar .rdp-button_previous,
2284
+ .duoop-calendar .rdp-button_next {
2285
+ display: grid;
2286
+ place-items: center;
2287
+ height: 36px;
2288
+ width: 36px;
2289
+ border: 2px solid #777474;
2290
+ border-radius: 8px;
2291
+ background: #fff;
2292
+ color: #373434;
2293
+ box-shadow: 0 2px 0 #1d1b1b;
2294
+ }
2295
+ .duoop-calendar .rdp-chevron {
2296
+ width: 16px;
2297
+ height: 16px;
2298
+ fill: currentColor;
2299
+ }
2300
+ .duoop-calendar .rdp-month_grid {
2301
+ border-collapse: collapse;
2302
+ table-layout: fixed;
2303
+ width: 100%;
2304
+ }
2305
+ .duoop-calendar .rdp-weekday {
2306
+ height: 32px;
2307
+ font-size: 11px;
2308
+ color: #686565;
2309
+ font-weight: 500;
2310
+ text-align: center;
2311
+ }
2312
+ .duoop-calendar .rdp-day {
2313
+ width: calc(100% / 7);
2314
+ height: 44px;
2315
+ padding: 2px 0;
2316
+ text-align: center;
2317
+ }
2318
+ .duoop-calendar .rdp-day_button {
2319
+ position: relative;
2320
+ display: grid;
2321
+ place-items: center;
2322
+ width: 100%;
2323
+ max-width: var(--day-size);
2324
+ height: 38px;
2325
+ padding: 0;
2326
+ margin: 0 auto;
2327
+ border: 2px solid transparent;
2328
+ border-radius: 8px;
2329
+ background: transparent;
2330
+ color: inherit;
2331
+ font: inherit;
2332
+ cursor: pointer;
2333
+ transition:
2334
+ background 140ms,
2335
+ transform 120ms,
2336
+ box-shadow 140ms;
2337
+ }
2338
+ .duoop-calendar .rdp-day_button:hover:not(:disabled) {
2339
+ border-color: #777474;
2340
+ background: #f0eeee;
2341
+ }
2342
+ .duoop-calendar .rdp-day_button:active:not(:disabled) {
2343
+ transform: translateY(2px);
2344
+ box-shadow: none;
2345
+ }
2346
+ .duoop-calendar .rdp-selected .rdp-day_button {
2347
+ border-color: #1d1b1b;
2348
+ background: #373434;
2349
+ color: #fff;
2350
+ box-shadow: 0 2px 0 #1d1b1b;
2351
+ font-weight: 600;
2352
+ }
2353
+ .duoop-calendar .rdp-selected .rdp-day_button:hover {
2354
+ background: #373434;
2355
+ }
2356
+ .duoop-calendar .rdp-today:not(.rdp-selected) .rdp-day_button {
2357
+ border-color: #777474;
2358
+ }
2359
+ .duoop-calendar .rdp-range_middle {
2360
+ background: #f0eeee;
2361
+ }
2362
+ .duoop-calendar .rdp-range_middle .rdp-day_button {
2363
+ border-color: transparent;
2364
+ background: transparent;
2365
+ color: #373434;
2366
+ box-shadow: none;
2367
+ }
2368
+ .duoop-calendar .rdp-outside {
2369
+ color: #777474;
2370
+ }
2371
+ .duoop-calendar .rdp-disabled {
2372
+ opacity: 0.35;
2373
+ }
2374
+ .duoop-calendar button:disabled {
2375
+ cursor: not-allowed;
2376
+ }
2377
+ .duoop-calendar button:focus-visible {
2378
+ outline: none;
2379
+ border: 2px dashed currentColor;
2380
+ }
2381
+ .duoop-calendar .rdp-hidden {
2382
+ visibility: hidden;
2383
+ }
2384
+ .duoop-calendar .rdp-footer {
2385
+ margin-top: 16px;
2386
+ font-size: 12px;
2387
+ color: #686565;
2388
+ }
2389
+ @media (max-width: 480px) {
2390
+ .duoop-calendar {
2391
+ --day-size: 34px;
2392
+ padding: 12px;
2393
+ }
2394
+ .duoop-calendar .rdp-month_caption {
2395
+ font-size: 12px;
2396
+ }
2397
+ .duoop-calendar .rdp-dropdowns {
2398
+ gap: 5px;
2399
+ }
2400
+ }
2401
+ @media (prefers-reduced-motion: reduce) {
2402
+ .duoop-calendar .rdp-day_button {
2403
+ transition: none;
2404
+ }
2405
+ }
2406
+ .duoop-date-picker {
2407
+ display: grid;
2408
+ gap: 10px;
2409
+ width: 100%;
2410
+ font:
2411
+ 500 14px/1.5 'DM Sans',
2412
+ sans-serif;
2413
+ color: #373434;
2414
+ }
2415
+ .duoop-date-picker__trigger {
2416
+ width: 100%;
2417
+ }
2418
+ .duoop-date-picker__trigger .duoop-button-content {
2419
+ width: 100%;
2420
+ justify-content: space-between;
2421
+ }
2422
+ .duoop-date-picker__trigger .duoop-button-label {
2423
+ white-space: normal;
2424
+ text-align: start;
2425
+ }
2426
+ .duoop-date-picker__popup {
2427
+ width: 328px;
2428
+ padding: 0;
2429
+ }
2430
+ .duoop-date-picker__popup .duoop-calendar {
2431
+ width: 100%;
2432
+ border: 0;
2433
+ box-shadow: none;
2434
+ border-radius: 0;
2435
+ }
2436
+ .duoop-date-picker__footer {
2437
+ display: flex;
2438
+ align-items: center;
2439
+ justify-content: space-between;
2440
+ gap: 12px;
2441
+ padding: 12px 20px;
2442
+ border-top: 1px solid #e7e9ed;
2443
+ font-size: 12px;
2444
+ color: #686565;
2445
+ }
2446
+ .duoop-pagination {
2447
+ display: flex;
2448
+ align-items: center;
2449
+ justify-content: center;
2450
+ gap: 10px;
2451
+ font:
2452
+ 500 13px/1.5 'DM Sans',
2453
+ sans-serif;
2454
+ color: #373434;
2455
+ }
2456
+ .duoop-pagination__pages {
2457
+ display: flex;
2458
+ align-items: center;
2459
+ gap: 8px;
2460
+ }
2461
+ .duoop-pagination .duoop-button {
2462
+ min-width: 36px;
2463
+ padding-inline: 10px;
2464
+ }
2465
+ .duoop-pagination__gap {
2466
+ width: 16px;
2467
+ text-align: center;
2468
+ }
2469
+ .duoop-pagination__compact {
2470
+ display: none;
2471
+ min-width: 64px;
2472
+ text-align: center;
2473
+ font-variant-numeric: tabular-nums;
2474
+ }
2475
+ @media (max-width: 600px) {
2476
+ .duoop-pagination__pages {
2477
+ display: none;
2478
+ }
2479
+ .duoop-pagination__compact {
2480
+ display: inline;
2481
+ }
2482
+ .duoop-pagination .duoop-button {
2483
+ min-width: 44px;
2484
+ min-height: 44px;
2485
+ }
2486
+ }
2487
+ .duoop-data-table {
2488
+ width: 100%;
2489
+ min-width: 0;
2490
+ color: #373434;
2491
+ font:
2492
+ 400 14px/1.6 'DM Sans',
2493
+ sans-serif;
2494
+ }
2495
+ .duoop-table-scroll {
2496
+ width: 100%;
2497
+ overflow: auto;
2498
+ border: 2px solid #373434;
2499
+ border-radius: 10px;
2500
+ box-shadow: 0 4px 0 #1d1b1b;
2501
+ background: #fff;
2502
+ }
2503
+ .duoop-table-scroll:focus-visible {
2504
+ outline: none;
2505
+ border-style: dashed;
2506
+ }
2507
+ .duoop-table {
2508
+ width: 100%;
2509
+ border-collapse: collapse;
2510
+ text-align: start;
2511
+ font:
2512
+ 400 14px/1.6 'DM Sans',
2513
+ sans-serif;
2514
+ color: #373434;
2515
+ }
2516
+ .duoop-table caption {
2517
+ padding: 18px 20px;
2518
+ text-align: start;
2519
+ border-bottom: 1px solid #e7e9ed;
2520
+ font-weight: 600;
2521
+ }
2522
+ .duoop-table th {
2523
+ background: #f7f6f6;
2524
+ font-size: 12px;
2525
+ font-weight: 600;
2526
+ }
2527
+ .duoop-table th,
2528
+ .duoop-table td {
2529
+ padding: 14px 20px;
2530
+ border-bottom: 1px solid #e7e9ed;
2531
+ white-space: nowrap;
2532
+ text-align: start;
2533
+ }
2534
+ .duoop-table th .duoop-button {
2535
+ margin: -8px;
2536
+ font-size: 12px;
2537
+ }
2538
+ .duoop-table tr:last-child td {
2539
+ border-bottom: 0;
2540
+ }
2541
+ .duoop-table tbody tr {
2542
+ transition: background 160ms;
2543
+ }
2544
+ .duoop-table tbody tr:hover {
2545
+ background: #faf9f9;
2546
+ }
2547
+ .duoop-table tbody tr[data-selected] {
2548
+ background: #f0eeee;
2549
+ }
2550
+ .duoop-table__select {
2551
+ width: 48px;
2552
+ }
2553
+ .duoop-data-table__footer {
2554
+ display: flex;
2555
+ flex-wrap: wrap;
2556
+ justify-content: space-between;
2557
+ align-items: center;
2558
+ gap: 20px;
2559
+ padding-top: 24px;
2560
+ }
2561
+ .duoop-data-table__footer > span {
2562
+ color: #686565;
2563
+ font-size: 12px;
2564
+ }
2565
+ .duoop-table__empty {
2566
+ text-align: center;
2567
+ padding: 40px 12px;
2568
+ white-space: normal;
2569
+ }
2570
+ .duoop-table__empty strong {
2571
+ font-size: 16px;
2572
+ }
2573
+ .duoop-table__empty p {
2574
+ color: #686565;
2575
+ margin: 8px 0 20px;
2576
+ }
2577
+ @media (prefers-reduced-motion: reduce) {
2578
+ .duoop-table tbody tr {
2579
+ transition: none;
2580
+ }
2581
+ }
2582
+ .duoop-sheet-overlay {
2583
+ position: fixed;
2584
+ inset: 0;
2585
+ z-index: 130;
2586
+ background: rgb(29 27 27 / 0.3);
2587
+ animation: duoop-sheet-fade 180ms ease-out;
2588
+ }
2589
+ .duoop-sheet {
2590
+ position: fixed;
2591
+ z-index: 131;
2592
+ box-sizing: border-box;
2593
+ padding: 32px;
2594
+ background: #fff;
2595
+ color: #373434;
2596
+ border: 2px solid #373434;
2597
+ font:
2598
+ 400 14px/1.6 'DM Sans',
2599
+ sans-serif;
2600
+ overflow: auto;
2601
+ overscroll-behavior: contain;
2602
+ animation: duoop-sheet-in 240ms cubic-bezier(0.2, 0.8, 0.2, 1);
2603
+ }
2604
+ .duoop-sheet[data-side='right'] {
2605
+ inset: 12px 12px 12px auto;
2606
+ width: min(420px, calc(100vw - 24px));
2607
+ border-radius: 12px;
2608
+ box-shadow: 4px 4px 0 #1d1b1b;
2609
+ --sheet-x: 32px;
2610
+ --sheet-y: 0px;
2611
+ }
2612
+ .duoop-sheet[data-side='left'] {
2613
+ inset: 12px auto 12px 12px;
2614
+ width: min(420px, calc(100vw - 24px));
2615
+ border-radius: 12px;
2616
+ box-shadow: 4px 4px 0 #1d1b1b;
2617
+ --sheet-x: -32px;
2618
+ --sheet-y: 0px;
2619
+ }
2620
+ .duoop-sheet[data-side='bottom'] {
2621
+ inset: auto 0 0;
2622
+ max-height: 85dvh;
2623
+ border-radius: 16px 16px 0 0;
2624
+ padding-bottom: max(32px, env(safe-area-inset-bottom));
2625
+ --sheet-x: 0px;
2626
+ --sheet-y: 40px;
2627
+ }
2628
+ .duoop-sheet[data-side='top'] {
2629
+ inset: 0 0 auto;
2630
+ max-height: 85dvh;
2631
+ border-radius: 0 0 16px 16px;
2632
+ padding-top: max(32px, env(safe-area-inset-top));
2633
+ --sheet-x: 0px;
2634
+ --sheet-y: -40px;
2635
+ }
2636
+ .duoop-sheet h2 {
2637
+ margin: 0 48px 8px 0;
2638
+ font-size: 24px;
2639
+ }
2640
+ .duoop-sheet p {
2641
+ color: #686565;
2642
+ margin: 0 0 28px;
2643
+ }
2644
+ .duoop-sheet__close {
2645
+ position: absolute;
2646
+ top: 20px;
2647
+ right: 20px;
2648
+ }
2649
+ .duoop-sheet[data-state='closed'] {
2650
+ animation: duoop-sheet-out 160ms ease-in;
2651
+ }
2652
+ .duoop-sheet-overlay[data-state='closed'] {
2653
+ animation: duoop-sheet-fade 140ms ease-in reverse;
2654
+ }
2655
+ @keyframes duoop-sheet-in {
2656
+ from {
2657
+ opacity: 0;
2658
+ transform: translate(var(--sheet-x), var(--sheet-y));
2659
+ }
2660
+ to {
2661
+ opacity: 1;
2662
+ transform: none;
2663
+ }
2664
+ }
2665
+ @keyframes duoop-sheet-out {
2666
+ to {
2667
+ opacity: 0;
2668
+ transform: translate(var(--sheet-x), var(--sheet-y));
2669
+ }
2670
+ }
2671
+ @keyframes duoop-sheet-fade {
2672
+ from {
2673
+ opacity: 0;
2674
+ }
2675
+ to {
2676
+ opacity: 1;
2677
+ }
2678
+ }
2679
+ @media (max-width: 480px) {
2680
+ .duoop-sheet {
2681
+ padding: 24px 20px;
2682
+ }
2683
+ }
2684
+ @media (prefers-reduced-motion: reduce) {
2685
+ .duoop-sheet,
2686
+ .duoop-sheet[data-state='closed'],
2687
+ .duoop-sheet-overlay,
2688
+ .duoop-sheet-overlay[data-state='closed'] {
2689
+ animation-duration: 1ms;
2690
+ }
2691
+ }
2692
+ .duoop-file-upload {
2693
+ width: 100%;
2694
+ color: #373434;
2695
+ font:
2696
+ 400 14px/1.6 'DM Sans',
2697
+ sans-serif;
2698
+ }
2699
+ .duoop-file-upload h3 {
2700
+ margin: 0 0 16px;
2701
+ font-size: 15px;
2702
+ }
2703
+ .duoop-dropzone {
2704
+ display: flex;
2705
+ flex-direction: column;
2706
+ align-items: center;
2707
+ text-align: center;
2708
+ gap: 16px;
2709
+ padding: 32px 24px;
2710
+ border: 2px dashed #777474;
2711
+ border-radius: 12px;
2712
+ background: #fff;
2713
+ transition:
2714
+ background 160ms,
2715
+ border-color 160ms;
2716
+ }
2717
+ .duoop-dropzone[data-active] {
2718
+ border-color: #373434;
2719
+ border-style: solid;
2720
+ background: #f0eeee;
2721
+ }
2722
+ .duoop-dropzone[data-disabled] {
2723
+ opacity: 0.5;
2724
+ }
2725
+ .duoop-dropzone__icon {
2726
+ display: grid;
2727
+ place-items: center;
2728
+ width: 52px;
2729
+ height: 60px;
2730
+ border: 2px solid #373434;
2731
+ border-radius: 9px;
2732
+ box-shadow: 0 4px 0 #1d1b1b;
2733
+ background: #f7f6f6;
2734
+ transition: transform 200ms;
2735
+ }
2736
+ .duoop-dropzone[data-active] .duoop-dropzone__icon {
2737
+ transform: translateY(-4px) rotate(-4deg);
2738
+ }
2739
+ .duoop-dropzone__icon svg {
2740
+ width: 30px;
2741
+ height: 30px;
2742
+ }
2743
+ .duoop-dropzone p {
2744
+ margin: -8px 0 0;
2745
+ font-size: 13px;
2746
+ color: #686565;
2747
+ }
2748
+ .duoop-dropzone small {
2749
+ font-size: 12px;
2750
+ color: #686565;
2751
+ }
2752
+ .duoop-file-upload__errors p,
2753
+ .duoop-file-upload__info p {
2754
+ color: #a51d2d;
2755
+ font-size: 12px;
2756
+ overflow-wrap: anywhere;
2757
+ }
2758
+ .duoop-file-upload__list {
2759
+ margin: 20px 0;
2760
+ padding: 0;
2761
+ list-style: none;
2762
+ display: grid;
2763
+ gap: 12px;
2764
+ }
2765
+ .duoop-file-upload__list li {
2766
+ display: flex;
2767
+ align-items: center;
2768
+ gap: 12px;
2769
+ padding: 14px;
2770
+ border: 1px solid #d0cccc;
2771
+ border-radius: 10px;
2772
+ background: #fff;
2773
+ animation: duoop-file-in 200ms ease-out;
2774
+ }
2775
+ .duoop-file-upload__list li[data-state='error'] {
2776
+ border-color: #a51d2d;
2777
+ background: #fff2f3;
2778
+ }
2779
+ .duoop-file-upload__preview {
2780
+ width: 40px;
2781
+ height: 44px;
2782
+ flex-shrink: 0;
2783
+ display: grid;
2784
+ place-items: center;
2785
+ }
2786
+ .duoop-file-upload__preview img {
2787
+ width: 100%;
2788
+ height: 100%;
2789
+ object-fit: cover;
2790
+ border-radius: 6px;
2791
+ }
2792
+ .duoop-file-upload__preview svg {
2793
+ width: 28px;
2794
+ height: 28px;
2795
+ }
2796
+ .duoop-file-upload__info {
2797
+ flex: 1;
2798
+ min-width: 0;
2799
+ }
2800
+ .duoop-file-upload__info strong {
2801
+ display: block;
2802
+ overflow-wrap: anywhere;
2803
+ font-size: 13px;
2804
+ }
2805
+ .duoop-file-upload__info small {
2806
+ display: block;
2807
+ color: #686565;
2808
+ font-size: 12px;
2809
+ }
2810
+ .duoop-file-upload__success {
2811
+ width: 24px;
2812
+ color: #356247;
2813
+ }
2814
+ .duoop-file-upload__list .duoop-button svg {
2815
+ width: 18px;
2816
+ height: 18px;
2817
+ }
2818
+ @keyframes duoop-file-in {
2819
+ from {
2820
+ opacity: 0;
2821
+ transform: translateY(5px);
2822
+ }
2823
+ to {
2824
+ opacity: 1;
2825
+ transform: none;
2826
+ }
2827
+ }
2828
+ @media (max-width: 480px) {
2829
+ .duoop-dropzone {
2830
+ padding: 24px 16px;
2831
+ }
2832
+ .duoop-file-upload__list li {
2833
+ padding: 10px;
2834
+ gap: 8px;
2835
+ flex-wrap: wrap;
2836
+ }
2837
+ }
2838
+ @media (prefers-reduced-motion: reduce) {
2839
+ .duoop-dropzone,
2840
+ .duoop-dropzone__icon,
2841
+ .duoop-file-upload__list li {
2842
+ animation: none;
2843
+ transition: none;
2844
+ }
2845
+ }
2846
+ .duoop-skeleton {
2847
+ display: block;
2848
+ position: relative;
2849
+ box-sizing: border-box;
2850
+ overflow: hidden;
2851
+ width: 100%;
2852
+ height: 12px;
2853
+ border: 1px solid #d0cccc;
2854
+ border-radius: 4px;
2855
+ background: #eae7e7;
2856
+ }
2857
+ .duoop-skeleton::after {
2858
+ content: '';
2859
+ position: absolute;
2860
+ inset: 0;
2861
+ background: linear-gradient(
2862
+ 90deg,
2863
+ transparent,
2864
+ rgb(255 255 255 / 0.7),
2865
+ transparent
2866
+ );
2867
+ transform: translateX(-100%);
2868
+ animation: duoop-skeleton-shimmer 1.8s ease-in-out infinite;
2869
+ }
2870
+ .duoop-skeleton--avatar {
2871
+ width: 44px;
2872
+ height: 44px;
2873
+ border-radius: 12px;
2874
+ flex-shrink: 0;
2875
+ }
2876
+ .duoop-skeleton--card {
2877
+ border-radius: 8px;
2878
+ height: 140px;
2879
+ }
2880
+ .duoop-skeleton-text {
2881
+ display: grid;
2882
+ width: 100%;
2883
+ gap: 12px;
2884
+ }
2885
+ .duoop-skeleton-card {
2886
+ display: grid;
2887
+ gap: 24px;
2888
+ width: 100%;
2889
+ box-sizing: border-box;
2890
+ padding: 24px;
2891
+ border: 2px solid #777474;
2892
+ border-radius: 12px;
2893
+ background: #fff;
2894
+ box-shadow: 0 3px 0 #373434;
2895
+ }
2896
+ .duoop-skeleton-person {
2897
+ display: flex;
2898
+ align-items: center;
2899
+ gap: 16px;
2900
+ }
2901
+ .duoop-skeleton-table {
2902
+ width: 100%;
2903
+ border: 2px solid #777474;
2904
+ border-radius: 10px;
2905
+ background: #fff;
2906
+ overflow: hidden;
2907
+ }
2908
+ .duoop-skeleton-table > div {
2909
+ display: grid;
2910
+ gap: 24px;
2911
+ padding: 22px;
2912
+ border-bottom: 1px solid #e7e9ed;
2913
+ }
2914
+ .duoop-skeleton-table > div:last-child {
2915
+ border: 0;
2916
+ }
2917
+ @keyframes duoop-skeleton-shimmer {
2918
+ to {
2919
+ transform: translateX(100%);
2920
+ }
2921
+ }
2922
+ @media (prefers-reduced-motion: reduce) {
2923
+ .duoop-skeleton::after {
2924
+ animation: none;
2925
+ display: none;
2926
+ }
2927
+ }
2928
+ .duoop-alert {
2929
+ --alert-ink: #373434;
2930
+ --alert-bg: #f7f6f6;
2931
+ --alert-shadow: #1d1b1b;
2932
+ display: flex;
2933
+ align-items: flex-start;
2934
+ gap: 14px;
2935
+ width: 100%;
2936
+ box-sizing: border-box;
2937
+ padding: 20px;
2938
+ border: 2px solid var(--alert-ink);
2939
+ border-radius: 10px;
2940
+ box-shadow: 0 3px 0 var(--alert-shadow);
2941
+ background: var(--alert-bg);
2942
+ color: var(--alert-ink);
2943
+ font:
2944
+ 400 14px/1.6 'DM Sans',
2945
+ sans-serif;
2946
+ animation: duoop-alert-in 220ms ease-out;
2947
+ }
2948
+ .duoop-alert[data-tone='success'] {
2949
+ --alert-ink: #356247;
2950
+ --alert-bg: #edf5ef;
2951
+ --alert-shadow: #234631;
2952
+ }
2953
+ .duoop-alert[data-tone='warning'] {
2954
+ --alert-ink: #79521a;
2955
+ --alert-bg: #fff8e8;
2956
+ --alert-shadow: #543a15;
2957
+ }
2958
+ .duoop-alert[data-tone='error'] {
2959
+ --alert-ink: #a51d2d;
2960
+ --alert-bg: #fff2f3;
2961
+ --alert-shadow: #761725;
2962
+ }
2963
+ .duoop-alert__icon {
2964
+ display: grid;
2965
+ place-items: center;
2966
+ flex: 0 0 24px;
2967
+ padding-top: 1px;
2968
+ }
2969
+ .duoop-alert .feedback-icon {
2970
+ width: 22px;
2971
+ height: 22px;
2972
+ }
2973
+ .duoop-alert__body {
2974
+ flex: 1;
2975
+ min-width: 0;
2976
+ overflow-wrap: anywhere;
2977
+ }
2978
+ .duoop-alert h3 {
2979
+ font:
2980
+ 600 14px/1.6 'DM Sans',
2981
+ sans-serif;
2982
+ margin: 0;
2983
+ color: inherit;
2984
+ }
2985
+ .duoop-alert__description {
2986
+ margin-top: 6px;
2987
+ font-size: 13px;
2988
+ }
2989
+ .duoop-alert__description p {
2990
+ margin: 0;
2991
+ }
2992
+ .duoop-alert__action {
2993
+ margin-top: 16px;
2994
+ }
2995
+ .duoop-alert .duoop-alert__dismiss {
2996
+ color: inherit;
2997
+ margin: -8px -8px 0 0;
2998
+ }
2999
+ @keyframes duoop-alert-in {
3000
+ from {
3001
+ opacity: 0;
3002
+ transform: translateY(5px);
3003
+ }
3004
+ to {
3005
+ opacity: 1;
3006
+ transform: none;
3007
+ }
3008
+ }
3009
+ @media (prefers-reduced-motion: reduce) {
3010
+ .duoop-alert {
3011
+ animation: none;
3012
+ }
3013
+ }
3014
+ .duoop-folder { position: relative; isolation: isolate; container-type: inline-size; width: min(100%, 500px); aspect-ratio: 1.12; color: #373434; font-family: var(--duoop-font, 'DM Sans', sans-serif); }
3015
+ .duoop-folder__back { position: absolute; width: 80%; height: auto; left: 10%; bottom: 12px; z-index: 0; }
3016
+ .duoop-folder__cover { position: absolute; z-index: 2; left: 10%; bottom: 12px; width: 80%; aspect-ratio: 400 / 250; }
3017
+ .duoop-folder__front { position: relative; isolation: isolate; width: 100%; height: 100%; display: flex; justify-content: space-between; align-items: center; gap: 12px; text-align: start; padding: 16.25% 8.75% 8.75%; border: 0; background: transparent; color: inherit; transform-origin: center 94%; transform: perspective(220cqw) rotateX(0deg); transition: transform 420ms cubic-bezier(.22,.61,.36,1) 80ms; cursor: pointer; }
3018
+ .duoop-folder__flap { position: absolute; inset: 0; width: 100%; height: 100%; z-index: -1; overflow: visible; }
3019
+ .duoop-folder__flap-face { transition: fill 150ms; }
3020
+ .duoop-folder[data-state='preview'] .duoop-folder__front { transform: perspective(220cqw) rotateX(-52deg); transition-duration: 300ms; transition-delay: 0ms; }
3021
+ .duoop-folder[data-state='expanded'] .duoop-folder__front { transform: perspective(220cqw) rotateX(-62deg); transition-duration: 300ms; transition-delay: 0ms; }
3022
+ .duoop-folder__front:focus-visible .duoop-folder__flap-face { stroke-dasharray: 5 3; }
3023
+ .duoop-folder__toggle { display: flex; flex-direction: column; gap: 8px; }
3024
+ .duoop-folder__caption { min-width: 0; }
3025
+ .duoop-folder__caption strong { font-size: clamp(18px, 5.6cqw, 28px); font-weight: 800; letter-spacing: .025em; text-transform: uppercase; line-height: 1.08; overflow-wrap: anywhere; }
3026
+ .duoop-folder__toggle { align-items: center; font-size: 11px; flex-shrink: 0; width: 48px; text-align: center; line-height: 1.4; }
3027
+ .duoop-folder__toggle svg { width: 24px; height: 24px; transition: transform 240ms; }
3028
+ .duoop-folder[data-open='true'] .duoop-folder__toggle svg { transform: rotate(180deg); }
3029
+ .duoop-folder__documents { position: absolute; inset: 0; z-index: 1; pointer-events: none; }
3030
+ .duoop-folder__document { position: absolute; left: 50%; bottom: 14%; width: 44%; aspect-ratio: 1.6; min-height: 92px; display: flex; flex-direction: column; align-items: stretch; gap: 8px; padding: clamp(9px, 3cqw, 16px); text-align: start; border: 2px solid #1d1b1b; border-radius: 10px; background: #fff; color: #373434; box-shadow: 0 4px 0 #1d1b1b; opacity: 0; visibility: hidden; transform: translate(-50%, 12%) rotate(calc(var(--offset) * 2deg)); transition: transform 360ms cubic-bezier(.4,0,.2,1), opacity 100ms ease 240ms, visibility 0s linear 360ms, background-color 150ms, box-shadow 150ms; }
3031
+ .duoop-folder__document-top { display: flex; justify-content: space-between; align-items: center; font-size: 10px; font-weight: 600; letter-spacing: .06em; }
3032
+ .duoop-folder__document-top svg { width: 19px; height: 19px; flex-shrink: 0; }
3033
+ .duoop-folder__document strong { font-size: clamp(11px, 2.8cqw, 14px); font-weight: 750; line-height: 1.35; overflow-wrap: anywhere; }
3034
+ .duoop-folder__meta { margin-top: auto; font-size: 10px; line-height: 1.4; color: #686565; overflow-wrap: anywhere; }
3035
+ .duoop-folder[data-state='preview'] .duoop-folder__document:nth-child(-n+3) { transition-delay: 0ms; opacity: 1; visibility: visible; transform: translate(-50%, 0) rotate(calc(var(--offset) * 2deg)); }
3036
+ .duoop-folder[data-open='true'] .duoop-folder__document { transition-delay: 0ms; pointer-events: auto; opacity: 1; visibility: visible; transform: translate(calc(-50% + var(--offset) * 55%), var(--rise)) rotate(calc(var(--offset) * 8deg)); }
3037
+ .duoop-folder[data-open='true'] .duoop-folder__document:hover, .duoop-folder[data-open='true'] .duoop-folder__document:focus-visible { transform: translate(calc(-50% + var(--offset) * 55%), calc(var(--rise) - 8%)) rotate(0deg); z-index: 3; }
3038
+ .duoop-folder__document[aria-pressed='true'] { background: #f0eeee; z-index: 2; }
3039
+ .duoop-folder__front:hover .duoop-folder__flap-face { fill: #faf9f8; }
3040
+ .duoop-folder__document:active { box-shadow: 0 1px 0 #1d1b1b; }
3041
+ .duoop-folder button:focus-visible { outline: none; border-style: dashed; }
3042
+ .duoop-folder__document:disabled { color: #777171; background: #f0eeee; cursor: not-allowed; }
3043
+ .duoop-folder__empty { position: absolute; top: 16%; inset-inline: 0; text-align: center; font-size: 13px; opacity: 0; visibility: hidden; }
3044
+ .duoop-folder[data-open='true'] .duoop-folder__empty { opacity: 1; visibility: visible; }
3045
+ /* Large collections use a scrollable landscape-card grid above the cover. */
3046
+ .duoop-folder[data-open='true'] .duoop-folder__documents[data-many='true'] { inset: 0 4% 56%; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; overflow-y: auto; padding: 8px 4px; pointer-events: auto; }
3047
+ .duoop-folder[data-open='true'] .duoop-folder__documents[data-many='true'] .duoop-folder__document { position: relative; left: auto; bottom: auto; width: 100%; transform: none; }
3048
+ @media (max-width: 480px) { .duoop-folder__front { gap: 8px; padding-inline: 6%; } .duoop-folder__document { gap: 5px; } .duoop-folder__toggle { width: 40px; font-size: 10px; } }
3049
+ @media (prefers-reduced-motion: reduce) { .duoop-folder *, .duoop-folder *::before { transition: none; } }
3050
+ .duoop-achievement { --card-ink:var(--feedback-ink,#373434); --card-border:var(--feedback-edge,#1d1b1b); --card-shadow:var(--card-border); --card-muted:var(--feedback-muted,#686565); background:var(--feedback-face,#fff); overflow:visible; color:var(--card-ink); }
3051
+ .achievement-heading { display:flex; align-items:center; gap:24px; padding:32px 28px 28px; min-width:0; }
3052
+ .achievement-copy { display:flex; flex-direction:column; align-items:flex-start; gap:10px; min-width:0; }
3053
+ .achievement-copy h4 { font-size:22px; font-weight:700; line-height:1.35; letter-spacing:-.4px; margin:0; overflow-wrap:anywhere; }
3054
+ .achievement-copy>p { margin:0; font-size:13px; line-height:1.65; color:var(--card-muted); }
3055
+ .achievement-copy .achievement-eyebrow { text-transform:uppercase; font-size: 10px; line-height:1.5; letter-spacing:.1em; font-weight:650; }
3056
+ .achievement-emblem { --emblem-width:100px; display:block; flex:none; width:var(--emblem-width); aspect-ratio:100 / 116; color:var(--feedback-ink,#373434); }
3057
+ .achievement-emblem>svg { display:block; width:100%; height:100%; overflow:visible; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
3058
+ .achievement-svg-shadow { fill:currentColor; stroke:currentColor; }
3059
+ .achievement-medal-face { fill:var(--feedback-face,#fff); }
3060
+ .achievement-ribbon,.achievement-medal-inset,.achievement-laurel { fill:var(--feedback-soft,#f0eeee); }
3061
+ .achievement-medal-inset { stroke-width:1.8; }
3062
+ .achievement-medal-glint { stroke:var(--feedback-face,#fff); stroke-width:3; }
3063
+ .achievement-emblem[data-visual=icon] { --emblem-width:56px; aspect-ratio:64 / 68; }
3064
+ .achievement-emblem[data-visual=illustration] { --emblem-width:180px; aspect-ratio:200 / 160; }
3065
+ .duoop-achievement[data-concealed=true] .achievement-medal-inset { stroke-dasharray:none; }
3066
+ .achievement-progress { padding:0 28px 24px; }
3067
+ .achievement-progress-label { display:flex; align-items:baseline; justify-content:space-between; gap:12px; margin:0 0 12px; font-size: 12px; font-weight:600; font-variant-numeric:tabular-nums; }
3068
+ .achievement-progress .progress-caption:empty { display:none; }
3069
+ .achievement-quantity { margin:0; display:flex; align-items:baseline; gap:10px; }
3070
+ .achievement-quantity strong { font-size: 25px; letter-spacing:-1px; font-variant-numeric:tabular-nums; }
3071
+ .achievement-quantity>span { font-size: 12px; color:var(--card-muted); }
3072
+ .achievement-checklist { margin:0; padding:0; list-style:none; display:grid; gap:16px; }
3073
+ .achievement-metadata { margin:0; padding:0 28px 24px; display:grid; gap:12px; }
3074
+ .achievement-metadata>div { display:grid; grid-template-columns:85px minmax(0,1fr); gap:16px; font-size: 12px; line-height:1.7; }
3075
+ .achievement-metadata dt { color:var(--card-muted); }
3076
+ .achievement-metadata dd { margin:0; overflow-wrap:anywhere; }
3077
+ .achievement-footer { border-top:2px solid var(--card-border); padding:16px 24px; display:flex; gap:16px; align-items:center; justify-content:space-between; flex-wrap:wrap; background:var(--feedback-face,#fff); border-radius:0 0 8px 8px; }
3078
+ .achievement-reward { display:inline-flex; align-items:center; gap:8px; font-size: 12px; font-weight:600; }
3079
+ .achievement-reward svg { width:28px; height:28px; flex:none; }
3080
+ .achievement-reward>span { display:grid; gap:4px; }
3081
+ .achievement-reward small { font-size:10px; font-weight:500; color:var(--card-muted); }
3082
+ .achievement-reward strong { font-size:13px; font-weight:650; line-height:1.5; }
3083
+ .achievement-footer>.experience-actions:empty { display:none; }
3084
+ .achievement-progress-label>span:last-child { flex-shrink:0; font-weight:750; }
3085
+ .achievement-progress-label>span:first-child { color:var(--card-muted); }
3086
+ .duoop-achievement:is([data-state=unlocked],[data-state=claimable],[data-state=claimed]) .achievement-footer { background:var(--feedback-success-soft,#edf5ef); }
3087
+ .duoop-achievement[data-state=claimable] .achievement-reward { color:var(--feedback-success,#356247); }
3088
+ .duoop-achievement[data-visual=illustration] .achievement-heading { flex-direction:column; text-align:center; }
3089
+ .duoop-achievement[data-visual=illustration] .achievement-copy { align-items:center; }
3090
+ .duoop-achievement[data-visual=illustration] .achievement-emblem { --emblem-width:200px; max-width:100%; }
3091
+ .achievement-summary-icon { flex-shrink:0; }
3092
+ .achievement-collection>li>.duoop-achievement { height:100%; }
3093
+ .achievement-collection .achievement-footer { margin-top:auto; }
3094
+ .achievement-claim-error { margin:0; padding:16px 24px; color:var(--feedback-error,#a51d2d); font-size: 12px; line-height:1.7; }
3095
+ .duoop-achievement[data-presentation=badge] { border:0; background:transparent; align-items:center; box-shadow:none; }
3096
+ .duoop-achievement[data-presentation=badge] .achievement-heading { flex-direction:column; text-align:center; padding:12px; gap:20px; }
3097
+ .duoop-achievement[data-presentation=badge] .achievement-copy { align-items:center; }
3098
+ .duoop-achievement[data-presentation=badge] .achievement-emblem { --emblem-width:116px; }
3099
+ .duoop-achievement[data-presentation=row] .achievement-heading { padding:20px; gap:20px; }
3100
+ .duoop-achievement[data-presentation=row] .achievement-emblem { --emblem-width:48px; }
3101
+ .duoop-achievement[data-presentation=row] .achievement-copy h4 { font-size: 14px; }
3102
+ .duoop-achievement[data-presentation=row] .achievement-copy { gap:8px; }
3103
+ .duoop-achievement[data-presentation=row] .achievement-progress { padding:0 20px 20px; }
3104
+ .duoop-achievement[data-size=sm] .achievement-heading { padding:20px; gap:16px; }
3105
+ .duoop-achievement[data-size=sm] .achievement-emblem { --emblem-width:48px; }
3106
+ .duoop-achievement[data-size=lg] .achievement-emblem { --emblem-width:100px; }
3107
+ .duoop-achievement[data-size=lg] .achievement-heading { padding:32px; }
3108
+ .achievement-collection { padding:0; margin:0; list-style:none; display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:24px; }
3109
+ .achievement-collection[data-layout=list] { grid-template-columns:1fr; gap:16px; }
3110
+ .achievement-collection>li { min-width:0; display:flex; }
3111
+ .achievement-summary { display:flex; gap:16px; align-items:center; }
3112
+ .achievement-summary-icon { display:grid; place-items:center; width:48px; height:48px; border:2px solid var(--feedback-edge,#1d1b1b); box-shadow:0 3px 0 var(--feedback-edge,#1d1b1b); background:var(--feedback-face,#fff); border-radius:10px; }
3113
+ .achievement-summary-icon svg { width:25px; height:25px; }
3114
+ .achievement-summary>div { flex:1; min-width:0; display:grid; gap:12px; }
3115
+ .achievement-summary strong { font-size: 14px; }
3116
+ .achievement-tiers { margin:0; padding:0; list-style:none; display:grid; gap:20px; }
3117
+ .achievement-error { display:grid; gap:16px; padding:24px; justify-items:start; }
3118
+ .achievement-error>svg { width:28px; height:28px; }
3119
+ .achievement-error>p { color:var(--feedback-error,#a51d2d); font-size: 13px; line-height:1.7; margin:0; }
3120
+ .achievement-unlock { position:relative; background:var(--feedback-face,#fff); border:2px solid var(--feedback-edge,#1d1b1b); border-radius:10px; box-shadow:0 4px 0 var(--feedback-edge,#1d1b1b); padding:32px; display:grid; justify-items:center; gap:24px; }
3121
+ .achievement-unlock-body { position:relative; display:flex; flex-direction:column; align-items:center; gap:16px; text-align:center; color:var(--feedback-ink,#373434); }
3122
+ .achievement-unlock-body h4 { margin:0; font-size:28px; letter-spacing:-.6px; line-height:1.35; }
3123
+ .achievement-unlock-body>.achievement-emblem { --emblem-width:120px; }
3124
+ .achievement-unlock-body>p { margin:0; font-size: 13px; color:var(--feedback-muted,#686565); }
3125
+ .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti]) .achievement-emblem { animation:achievement-earned 1050ms cubic-bezier(.16,1,.3,1) both; transform-origin:50% 65%; }
3126
+ .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])>.experience-kicker { animation:achievement-copy-in 500ms cubic-bezier(.16,1,.3,1) 180ms both; }
3127
+ .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])>h4 { animation:achievement-copy-in 600ms cubic-bezier(.16,1,.3,1) 260ms both; }
3128
+ .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])>p { animation:achievement-copy-in 600ms cubic-bezier(.16,1,.3,1) 360ms both; }
3129
+ .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])::before { content:''; position:absolute; width:110px; height:110px; top:0; border:2px solid currentColor; border-radius:50%; opacity:0; pointer-events:none; animation:achievement-halo 950ms cubic-bezier(.16,1,.3,1) 140ms both; }
3130
+ .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti]) .achievement-medal-inset { stroke-dasharray:190; animation:achievement-engrave 800ms ease-out 180ms both; }
3131
+ .achievement-unlock-body[data-celebration=accent] .achievement-emblem { animation:achievement-accent 280ms ease-out; }
3132
+ .achievement-unlock[data-mode=banner] .achievement-unlock-body { display:grid; grid-template-columns:auto minmax(0,1fr); text-align:start; gap:8px 20px; width:100%; }
3133
+ .achievement-unlock[data-mode=banner] .achievement-emblem { grid-column:1; grid-row:1 / 4; --emblem-width:56px; }
3134
+ .achievement-unlock[data-mode=banner] .achievement-unlock-body>p,.achievement-unlock[data-mode=banner] .achievement-unlock-body>h4 { grid-column:2; }
3135
+ .achievement-unlock[data-mode=banner] h4 { font-size: 18px; }
3136
+ .achievement-unlock[data-mode=banner] .achievement-unlock-body::before { width:64px; height:64px; inset-inline-start:-4px; }
3137
+ .achievement-toast { position:fixed; z-index:1200; inset:auto 24px 24px auto; width:min(390px,calc(100vw - 48px)); }
3138
+ .achievement-confetti { pointer-events:none; position:absolute; top:65px; left:50%; }
3139
+ .achievement-confetti i { position:absolute; width:6px; height:10px; border:1px solid var(--feedback-edge,#1d1b1b); border-radius:1px; background:var(--feedback-soft,#f0eeee); animation:achievement-confetti 1100ms cubic-bezier(.12,.7,.2,1) calc(180ms + var(--confetti-delay)) both; opacity:0; }
3140
+ .achievement-confetti i:nth-child(3n) { background:var(--feedback-ink,#373434); }
3141
+ .achievement-demo-checklist { display:grid; gap:16px; }
3142
+ .achievement-streak { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:8px; }
3143
+ .achievement-streak>span { display:grid; place-items:center; min-height:35px; border:2px solid var(--feedback-edge); border-radius:6px; font-size: 11px; color:var(--feedback-muted); }
3144
+ .achievement-streak>span[data-done=true] { background:var(--feedback-success-soft); color:var(--feedback-success); box-shadow:0 3px 0 var(--feedback-edge); }
3145
+ @keyframes achievement-earned { 0% { opacity:0; transform:perspective(500px) translateY(28px) rotateY(-75deg) rotate(-14deg) scale(.55); } 48% { opacity:1; transform:perspective(500px) translateY(-8px) rotateY(12deg) rotate(5deg) scale(1.13); } 72% { transform:perspective(500px) translateY(2px) rotateY(-4deg) rotate(-2deg) scale(.98); } to { opacity:1; transform:none; } }
3146
+ @keyframes achievement-confetti { 0% { opacity:0; transform:translate(0,0) scale(.3); } 15% { opacity:1; } 55% { opacity:1; transform:translate(var(--confetti-x),var(--confetti-y)) rotate(var(--confetti-turn)) scale(1); } to { opacity:0; transform:translate(calc(var(--confetti-x) * 1.2),calc(var(--confetti-y) + 60px)) rotate(calc(var(--confetti-turn) * 1.6)) scale(.65); } }
3147
+ @keyframes achievement-copy-in { from { opacity:0; transform:translateY(12px); } to { opacity:1; transform:none; } }
3148
+ @keyframes achievement-halo { from { opacity:.5; transform:scale(.55); } to { opacity:0; transform:scale(1.65); } }
3149
+ @keyframes achievement-engrave { from { stroke-dashoffset:190; } to { stroke-dashoffset:0; } }
3150
+ @keyframes achievement-accent { from { opacity:.45; } to { opacity:1; } }
3151
+ @media(max-width:600px) { .achievement-collection { grid-template-columns:1fr; } .achievement-heading { padding:24px 20px; gap:20px; flex-direction:column; align-items:flex-start; } .achievement-progress,.achievement-metadata { padding-inline:20px; } .duoop-achievement[data-presentation=row] .achievement-heading { flex-direction:row; } .achievement-toast { inset-inline:16px; bottom:16px; width:auto; } }
3152
+ @media(prefers-reduced-motion:reduce) { .achievement-unlock-body .achievement-emblem,.achievement-confetti i { animation:none !important; } .achievement-confetti { display:none; } }
3153
+ @media(prefers-reduced-motion:reduce) { .achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti])>:is(.experience-kicker,h4,p),.achievement-unlock-body:is([data-celebration=brief],[data-celebration=confetti]) .achievement-medal-inset { animation:none; }.achievement-unlock-body::before { display:none; } }
3154
+
3155
+ .achievement-trophy-shade { fill:var(--feedback-soft,#f0eeee); }
3156
+
3157
+ /* Adapt to the card's actual width, including narrow gallery columns. */
3158
+ .duoop-achievement { container-type:inline-size; }
3159
+ @container (max-width:340px) {
3160
+ .achievement-heading { gap:16px; padding:24px 20px; }
3161
+ .achievement-emblem { --emblem-width:76px; }
3162
+ .achievement-copy h4 { font-size:19px; }
3163
+ .achievement-footer { padding:16px 20px; }
3164
+ .achievement-metadata>div { grid-template-columns:1fr; gap:4px; }
3165
+ }
3166
+ .duoop-chart {
3167
+ --chart-face: #fff;
3168
+ --chart-ink: #373434;
3169
+ --chart-edge: #1d1b1b;
3170
+ --chart-soft: #f0eeee;
3171
+ width: 100%;
3172
+ min-width: 0;
3173
+ color: var(--chart-ink);
3174
+ background: var(--chart-face);
3175
+ border: 2px solid var(--chart-edge);
3176
+ border-radius: 10px;
3177
+ box-shadow: 0 4px 0 var(--chart-edge);
3178
+ font-family: "DM Sans", sans-serif;
3179
+ overflow: hidden;
3180
+ }
3181
+ .duoop-chart__header {
3182
+ display: flex;
3183
+ align-items: center;
3184
+ justify-content: space-between;
3185
+ gap: 24px;
3186
+ padding: 28px 28px 16px;
3187
+ }
3188
+ .duoop-chart__eyebrow {
3189
+ font-size: 10px;
3190
+ letter-spacing: 0.13em;
3191
+ font-weight: 600;
3192
+ }
3193
+ .duoop-chart__header h2 {
3194
+ font-size: 30px;
3195
+ line-height: 1.2;
3196
+ font-weight: 800;
3197
+ letter-spacing: -1px;
3198
+ margin: 12px 0 6px;
3199
+ }
3200
+ .duoop-chart__header p {
3201
+ font-size: 13px;
3202
+ line-height: 1.6;
3203
+ margin: 0;
3204
+ }
3205
+ .duoop-chart__emblem {
3206
+ width: 56px;
3207
+ height: 56px;
3208
+ flex-shrink: 0;
3209
+ }
3210
+ .duoop-chart__legend {
3211
+ display: flex;
3212
+ flex-wrap: wrap;
3213
+ gap: 10px;
3214
+ padding: 0 28px 18px;
3215
+ }
3216
+ .duoop-chart__legend button {
3217
+ display: inline-flex;
3218
+ align-items: center;
3219
+ gap: 8px;
3220
+ min-height: 36px;
3221
+ padding: 5px 10px;
3222
+ font:
3223
+ 500 12px "DM Sans",
3224
+ sans-serif;
3225
+ border: 1.5px solid var(--chart-edge);
3226
+ border-radius: 6px;
3227
+ background: var(--chart-face);
3228
+ color: var(--chart-ink);
3229
+ cursor: pointer;
3230
+ box-shadow: 0 2px 0 var(--chart-edge);
3231
+ transition:
3232
+ transform 150ms,
3233
+ box-shadow 150ms,
3234
+ background 150ms;
3235
+ }
3236
+ .duoop-chart__legend button:hover {
3237
+ transform: translateY(-1px);
3238
+ background: var(--chart-soft);
3239
+ }
3240
+ .duoop-chart__legend button:active {
3241
+ transform: translateY(2px);
3242
+ box-shadow: 0 0 0 var(--chart-edge);
3243
+ }
3244
+ .duoop-chart__legend button[aria-pressed="false"] {
3245
+ text-decoration: line-through;
3246
+ background: var(--chart-soft);
3247
+ box-shadow: none;
3248
+ }
3249
+ .duoop-chart :focus-visible {
3250
+ outline:none;
3251
+ }
3252
+ .duoop-chart__plot {
3253
+ margin: 0 12px;
3254
+ touch-action: pan-y;
3255
+ }
3256
+ .duoop-chart__plot svg {
3257
+ display: block;
3258
+ overflow: visible;
3259
+ }
3260
+ .duoop-chart__tick {
3261
+ fill: var(--chart-ink);
3262
+ font:
3263
+ 11px "DM Sans",
3264
+ sans-serif;
3265
+ }
3266
+ .duoop-chart__grid {
3267
+ fill: none;
3268
+ stroke: var(--chart-ink);
3269
+ stroke-dasharray: 2 6;
3270
+ opacity: 0.17;
3271
+ }
3272
+ .duoop-chart__empty {
3273
+ fill: var(--chart-ink);
3274
+ font:
3275
+ 14px "DM Sans",
3276
+ sans-serif;
3277
+ }
3278
+ .duoop-chart__footer {
3279
+ display: flex;
3280
+ flex-wrap: wrap;
3281
+ align-items: center;
3282
+ justify-content: space-between;
3283
+ gap: 12px;
3284
+ padding: 16px 24px;
3285
+ margin-top: 14px;
3286
+ background: var(--chart-soft);
3287
+ border-top: 1px solid var(--chart-edge);
3288
+ font-size: 12px;
3289
+ }
3290
+ .duoop-chart__footer p {
3291
+ margin: 0;
3292
+ }
3293
+ .duoop-chart__footer output {
3294
+ display: flex;
3295
+ flex-wrap: wrap;
3296
+ gap: 12px;
3297
+ min-height: 20px;
3298
+ align-items: center;
3299
+ }
3300
+ .duoop-chart__data {
3301
+ padding: 14px 24px;
3302
+ font-size: 12px;
3303
+ border-top: 1px solid var(--chart-edge);
3304
+ }
3305
+ .duoop-chart__data summary {
3306
+ cursor: pointer;
3307
+ padding: 6px 0;
3308
+ font-weight: 600;
3309
+ }
3310
+ .duoop-chart__data > div {
3311
+ overflow: auto;
3312
+ }
3313
+ .duoop-chart__data table {
3314
+ width: 100%;
3315
+ border-collapse: collapse;
3316
+ text-align: start;
3317
+ }
3318
+ .duoop-chart__data th,
3319
+ .duoop-chart__data td {
3320
+ padding: 10px;
3321
+ border-bottom: 1px solid var(--chart-soft);
3322
+ text-align: start;
3323
+ }
3324
+ .duoop-chart__data caption {
3325
+ text-align: start;
3326
+ padding: 14px 10px;
3327
+ }
3328
+ .duoop-chart[data-animate="true"] .duoop-chart__marks {
3329
+ animation: chart-reveal 420ms cubic-bezier(0.2, 0.8, 0.2, 1);
3330
+ transform-origin: center bottom;
3331
+ }
3332
+ @keyframes chart-reveal {
3333
+ from {
3334
+ opacity: 0;
3335
+ transform: translateY(8px);
3336
+ }
3337
+ to {
3338
+ opacity: 1;
3339
+ transform: translateY(0);
3340
+ }
3341
+ }
3342
+ .chart-showcase {
3343
+ grid-template-columns: minmax(0, 1fr);
3344
+ }
3345
+ .chart-playground {
3346
+ margin-top: 28px;
3347
+ border: 1px solid #e7e9ed;
3348
+ border-radius: 12px;
3349
+ overflow: hidden;
3350
+ }
3351
+ .chart-playground__stage {
3352
+ padding: 32px;
3353
+ background: #f0eeee;
3354
+ }
3355
+ .chart-controls {
3356
+ padding: 24px;
3357
+ display: grid;
3358
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3359
+ gap: 24px;
3360
+ background: #fff;
3361
+ }
3362
+ .chart-controls > label,
3363
+ .chart-controls fieldset {
3364
+ display: flex;
3365
+ flex-direction: column;
3366
+ gap: 10px;
3367
+ font-size: 13px;
3368
+ margin: 0;
3369
+ padding: 0;
3370
+ border: 0;
3371
+ min-width: 0;
3372
+ }
3373
+ .chart-controls legend {
3374
+ margin-bottom: 10px;
3375
+ font-size: 13px;
3376
+ }
3377
+ .chart-controls__choices {
3378
+ display: flex;
3379
+ flex-wrap: wrap;
3380
+ gap: 8px;
3381
+ }
3382
+ .chart-controls input[type="color"] {
3383
+ width: 100%;
3384
+ height: 40px;
3385
+ padding: 4px;
3386
+ border: 2px solid #373434;
3387
+ border-radius: 8px;
3388
+ background: #fff;
3389
+ cursor: pointer;
3390
+ }
3391
+ .chart-controls__toggles {
3392
+ display: flex;
3393
+ gap: 16px;
3394
+ flex-wrap: wrap;
3395
+ grid-column: 1/-1;
3396
+ align-items: center;
3397
+ }
3398
+ .chart-controls__data {
3399
+ margin-left: auto;
3400
+ }
3401
+ .duoop-popover.chart-data-editor {
3402
+ display: flex;
3403
+ width: 420px;
3404
+ padding: 20px;
3405
+ overflow: hidden;
3406
+ }
3407
+ .chart-data-editor form {
3408
+ display: flex;
3409
+ flex-direction: column;
3410
+ min-height: 0;
3411
+ width: 100%;
3412
+ }
3413
+ .chart-data-editor__heading,
3414
+ .chart-data-editor__actions {
3415
+ display: flex;
3416
+ align-items: center;
3417
+ justify-content: space-between;
3418
+ gap: 12px;
3419
+ flex-shrink: 0;
3420
+ }
3421
+ .chart-data-editor__heading h3 {
3422
+ margin: 0;
3423
+ }
3424
+ .chart-data-editor p {
3425
+ flex-shrink: 0;
3426
+ font-size: 12px;
3427
+ margin: 8px 0 16px;
3428
+ }
3429
+ .chart-data-editor__rows {
3430
+ min-height: 0;
3431
+ max-height: 280px;
3432
+ overflow: auto;
3433
+ margin-bottom: 16px;
3434
+ }
3435
+ .chart-data-editor table {
3436
+ width: 100%;
3437
+ table-layout: fixed;
3438
+ border-spacing: 0 6px;
3439
+ }
3440
+ .chart-data-editor th {
3441
+ text-align: left;
3442
+ font-size: 11px;
3443
+ font-weight: 600;
3444
+ }
3445
+ .chart-data-editor td {
3446
+ padding-right: 6px;
3447
+ }
3448
+ .chart-data-editor th:last-child,
3449
+ .chart-data-editor td:last-child {
3450
+ width: 32px;
3451
+ padding-right: 0;
3452
+ }
3453
+ .chart-data-editor input {
3454
+ box-sizing: border-box;
3455
+ width: 100%;
3456
+ min-width: 0;
3457
+ height: 36px;
3458
+ padding: 6px 8px;
3459
+ font: inherit;
3460
+ font-size: 12px;
3461
+ color: #373434;
3462
+ background: #fff;
3463
+ border: 1px solid #373434;
3464
+ border-radius: 5px;
3465
+ }
3466
+ .chart-data-editor button:not(.duoop-button) {
3467
+ width: 32px;
3468
+ height: 36px;
3469
+ border: 0;
3470
+ border-radius: 5px;
3471
+ background: transparent;
3472
+ color: #373434;
3473
+ font-size: 20px;
3474
+ cursor: pointer;
3475
+ }
3476
+ .chart-data-editor button:not(.duoop-button):hover {
3477
+ background: #f0eeee;
3478
+ }
3479
+ .chart-data-editor :focus-visible {
3480
+ outline:none;
3481
+ background: #f0eeee;
3482
+ }
3483
+ .chart-showcase .gallery-grid {
3484
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3485
+ }
3486
+ .chart-showcase .gallery-card-preview {
3487
+ padding: 24px;
3488
+ }
3489
+ .chart-mini {
3490
+ width: 88%;
3491
+ max-width: 320px;
3492
+ }
3493
+ @media (max-width: 700px) {
3494
+ .chart-controls {
3495
+ grid-template-columns: 1fr;
3496
+ padding: 20px;
3497
+ }
3498
+ .chart-playground__stage {
3499
+ padding: 16px;
3500
+ }
3501
+ .chart-showcase .gallery-grid {
3502
+ grid-template-columns: 1fr;
3503
+ }
3504
+ .duoop-chart__header {
3505
+ padding: 20px 18px 16px;
3506
+ }
3507
+ .duoop-chart__header h2 {
3508
+ font-size: 24px;
3509
+ }
3510
+ .duoop-chart__legend {
3511
+ padding-inline: 18px;
3512
+ }
3513
+ .duoop-chart__legend button {
3514
+ min-height: 44px;
3515
+ }
3516
+ .duoop-chart__emblem {
3517
+ width: 44px;
3518
+ height: 44px;
3519
+ }
3520
+ .duoop-chart__footer {
3521
+ padding: 16px;
3522
+ }
3523
+ .duoop-chart__data summary {
3524
+ min-height: 32px;
3525
+ }
3526
+ }
3527
+ @media (prefers-reduced-motion: reduce) {
3528
+ .duoop-chart[data-animate="true"] .duoop-chart__marks {
3529
+ animation: none;
3530
+ }
3531
+ .duoop-chart__legend button {
3532
+ transition: none;
3533
+ }
3534
+ }
3156
3535
  /* required styles */
3157
3536
 
3158
3537
  .leaflet-pane,