@resira/ui 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -24,6 +24,31 @@
24
24
  padding: 0;
25
25
  }
26
26
 
27
+ /* Global focus-visible ring for all interactive elements */
28
+ .resira-root button:focus-visible,
29
+ .resira-root a:focus-visible,
30
+ .resira-root input:focus-visible,
31
+ .resira-root select:focus-visible,
32
+ .resira-root textarea:focus-visible,
33
+ .resira-root [role="button"]:focus-visible,
34
+ .resira-root [tabindex]:focus-visible {
35
+ outline: 2px solid var(--resira-primary);
36
+ outline-offset: 2px;
37
+ }
38
+
39
+ /* Reduced motion — respect user preference */
40
+ @media (prefers-reduced-motion: reduce) {
41
+ .resira-root,
42
+ .resira-root *,
43
+ .resira-root *::before,
44
+ .resira-root *::after {
45
+ animation-duration: 0.01ms !important;
46
+ animation-iteration-count: 1 !important;
47
+ transition-duration: 0.01ms !important;
48
+ scroll-behavior: auto !important;
49
+ }
50
+ }
51
+
27
52
  /* ─────────────────────────────────────────────────────────────── */
28
53
  /* Animations */
29
54
  /* ─────────────────────────────────────────────────────────────── */
@@ -38,12 +63,12 @@
38
63
  }
39
64
 
40
65
  @keyframes resira-slide-up {
41
- from { opacity: 0; transform: translateY(12px); }
66
+ from { opacity: 0; transform: translateY(8px); }
42
67
  to { opacity: 1; transform: translateY(0); }
43
68
  }
44
69
 
45
70
  @keyframes resira-scale-in {
46
- from { opacity: 0; transform: scale(0.96) translateY(8px); }
71
+ from { opacity: 0; transform: scale(0.97) translateY(6px); }
47
72
  to { opacity: 1; transform: scale(1) translateY(0); }
48
73
  }
49
74
 
@@ -108,6 +133,16 @@
108
133
  padding: 12px 24px 112px;
109
134
  }
110
135
 
136
+ /* Step content fade-in on mount */
137
+ .resira-widget-body > * {
138
+ animation: resira-step-enter 150ms ease both;
139
+ }
140
+
141
+ @keyframes resira-step-enter {
142
+ from { opacity: 0; transform: translateY(4px); }
143
+ to { opacity: 1; transform: translateY(0); }
144
+ }
145
+
111
146
  .resira-widget-footer {
112
147
  position: sticky;
113
148
  bottom: 0;
@@ -124,8 +159,9 @@
124
159
  justify-content: space-between;
125
160
  }
126
161
 
127
- .resira-widget-footer--single .resira-btn {
128
- width: 100%;
162
+ .resira-widget-footer .resira-btn {
163
+ flex: 1;
164
+ min-width: 0;
129
165
  }
130
166
 
131
167
  /* ─────────────────────────────────────────────────────────────── */
@@ -159,7 +195,7 @@
159
195
  border: none;
160
196
  cursor: default;
161
197
  white-space: nowrap;
162
- transition: color 0.2s ease;
198
+ transition: color 150ms ease;
163
199
  flex: 1;
164
200
  min-width: 0;
165
201
  }
@@ -215,7 +251,7 @@
215
251
  background: var(--resira-surface);
216
252
  color: var(--resira-text);
217
253
  cursor: pointer;
218
- transition: all 0.15s ease;
254
+ transition: background 120ms ease, border-color 120ms ease;
219
255
  }
220
256
 
221
257
  .resira-calendar-nav-btn:hover { background: var(--resira-bg-subtle); border-color: var(--resira-muted); }
@@ -250,7 +286,7 @@
250
286
  background: transparent;
251
287
  color: var(--resira-text);
252
288
  cursor: pointer;
253
- transition: all 0.15s ease;
289
+ transition: background 120ms ease, color 120ms ease;
254
290
  }
255
291
 
256
292
  .resira-calendar-day:hover:not(:disabled):not(.resira-calendar-day--blocked) {
@@ -408,7 +444,7 @@
408
444
  background: var(--resira-surface);
409
445
  color: var(--resira-text);
410
446
  cursor: pointer;
411
- transition: all 0.15s ease;
447
+ transition: background 120ms ease, border-color 120ms ease;
412
448
  }
413
449
 
414
450
  .resira-mini-cal-nav-btn:hover { background: var(--resira-surface); border-color: var(--resira-muted); }
@@ -444,7 +480,7 @@
444
480
  background: transparent;
445
481
  color: var(--resira-text);
446
482
  cursor: pointer;
447
- transition: all 0.12s ease;
483
+ transition: background 100ms ease, color 100ms ease;
448
484
  margin: 0 auto;
449
485
  }
450
486
 
@@ -534,7 +570,7 @@
534
570
  background: transparent;
535
571
  color: var(--resira-text);
536
572
  cursor: pointer;
537
- transition: all 0.12s ease;
573
+ transition: background 100ms ease, color 100ms ease;
538
574
  }
539
575
 
540
576
  .resira-party-btn:hover:not(:disabled) {
@@ -576,7 +612,7 @@
576
612
  background: var(--resira-surface);
577
613
  color: var(--resira-text);
578
614
  cursor: pointer;
579
- transition: all 0.15s ease;
615
+ transition: border-color 120ms ease, background 120ms ease, color 120ms ease, box-shadow 120ms ease;
580
616
  flex: 1;
581
617
  min-width: 70px;
582
618
  }
@@ -622,7 +658,7 @@
622
658
  border-radius: var(--resira-input-radius, 10px);
623
659
  background: var(--resira-surface);
624
660
  cursor: pointer;
625
- transition: all 0.15s ease;
661
+ transition: border-color 120ms ease, background 120ms ease, color 120ms ease, box-shadow 120ms ease, transform 100ms ease;
626
662
  gap: 1px;
627
663
  }
628
664
 
@@ -764,6 +800,13 @@
764
800
  cursor: pointer;
765
801
  width: 100%;
766
802
  flex-shrink: 0;
803
+ border-radius: var(--resira-card-radius, 14px);
804
+ }
805
+
806
+ .resira-service-card-btn:focus-visible {
807
+ outline: 2px solid var(--resira-primary);
808
+ outline-offset: 3px;
809
+ border-radius: var(--resira-card-radius, 14px);
767
810
  }
768
811
 
769
812
  .resira-service-list--horizontal .resira-service-card-btn {
@@ -778,7 +821,7 @@
778
821
  border-radius: var(--resira-card-radius, 14px);
779
822
  overflow: hidden;
780
823
  background: var(--resira-surface);
781
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
824
+ transition: border-color 150ms ease, box-shadow 150ms ease, transform 100ms ease;
782
825
  font-family: var(--resira-font);
783
826
  color: var(--resira-text);
784
827
  }
@@ -789,6 +832,10 @@
789
832
  transform: translateY(-1px);
790
833
  }
791
834
 
835
+ .resira-service-card:active {
836
+ transform: scale(0.98);
837
+ }
838
+
792
839
  .resira-service-card--selected {
793
840
  border-color: var(--resira-primary) !important;
794
841
  background: color-mix(in srgb, var(--resira-primary) 3%, var(--resira-surface)) !important;
@@ -981,13 +1028,17 @@
981
1028
  cursor: pointer;
982
1029
  display: flex;
983
1030
  flex-direction: column;
984
- transition: transform 0.18s ease, box-shadow 0.18s ease;
1031
+ transition: transform 120ms ease, box-shadow 120ms ease;
985
1032
  box-shadow: 0 2px 8px rgba(0,0,0,0.08);
986
1033
  }
987
1034
 
988
1035
  .resira-category-tile:hover {
989
1036
  transform: translateY(-2px);
990
- box-shadow: 0 6px 20px rgba(0,0,0,0.12);
1037
+ box-shadow: 0 8px 24px rgba(0,0,0,0.14);
1038
+ }
1039
+
1040
+ .resira-category-tile:active {
1041
+ transform: scale(0.97);
991
1042
  }
992
1043
 
993
1044
  .resira-category-tile-image {
@@ -1079,18 +1130,23 @@
1079
1130
  flex-direction: column;
1080
1131
  justify-content: flex-end;
1081
1132
  cursor: pointer;
1082
- transition: transform 0.18s ease, box-shadow 0.18s ease;
1133
+ transition: transform 120ms ease, box-shadow 120ms ease;
1083
1134
  box-shadow: 0 2px 8px rgba(0,0,0,0.08);
1084
1135
  }
1085
1136
 
1086
1137
  .resira-service-overlay-card:hover {
1087
1138
  transform: translateY(-2px);
1088
- box-shadow: 0 6px 20px rgba(0,0,0,0.12);
1139
+ box-shadow: 0 8px 24px rgba(0,0,0,0.14);
1140
+ }
1141
+
1142
+ .resira-service-overlay-card:active {
1143
+ transform: scale(0.98);
1089
1144
  }
1090
1145
 
1091
1146
  .resira-service-overlay-card--selected {
1092
1147
  outline: 2.5px solid var(--resira-primary);
1093
1148
  outline-offset: -2.5px;
1149
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--resira-primary) 15%, transparent);
1094
1150
  }
1095
1151
 
1096
1152
  .resira-service-overlay-card-bg {
@@ -1239,7 +1295,7 @@
1239
1295
  background: var(--resira-surface);
1240
1296
  color: var(--resira-text);
1241
1297
  outline: none;
1242
- transition: all 0.2s ease;
1298
+ transition: border-color 150ms ease, box-shadow 150ms ease;
1243
1299
  width: 100%;
1244
1300
  }
1245
1301
 
@@ -1321,12 +1377,17 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
1321
1377
  border-radius: 10px;
1322
1378
  border: none;
1323
1379
  cursor: pointer;
1324
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1380
+ transition: background 150ms ease, box-shadow 150ms ease, transform 100ms ease;
1325
1381
  white-space: nowrap;
1326
1382
  }
1327
1383
 
1328
1384
  .resira-btn:disabled { opacity: 0.45; cursor: not-allowed; transform: none !important; }
1329
1385
 
1386
+ .resira-btn:focus-visible {
1387
+ outline: 2px solid var(--resira-primary);
1388
+ outline-offset: 3px;
1389
+ }
1390
+
1330
1391
  .resira-btn--primary {
1331
1392
  background: var(--resira-primary);
1332
1393
  color: var(--resira-primary-fg);
@@ -1336,7 +1397,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
1336
1397
 
1337
1398
  .resira-btn--primary:hover:not(:disabled) {
1338
1399
  background: var(--resira-primary-hover);
1339
- box-shadow: 0 4px 12px color-mix(in srgb, var(--resira-primary) 30%, transparent);
1400
+ box-shadow: 0 4px 14px color-mix(in srgb, var(--resira-primary) 30%, transparent);
1340
1401
  transform: translateY(-1px);
1341
1402
  }
1342
1403
 
@@ -1623,7 +1684,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
1623
1684
  overflow: hidden;
1624
1685
  background: var(--resira-surface);
1625
1686
  cursor: pointer;
1626
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1687
+ transition: border-color 150ms ease, box-shadow 150ms ease, transform 100ms ease;
1627
1688
  text-align: left;
1628
1689
  font-family: var(--resira-font);
1629
1690
  color: var(--resira-text);
@@ -1636,6 +1697,10 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
1636
1697
  transform: translateY(-1px);
1637
1698
  }
1638
1699
 
1700
+ .resira-resource-card:active {
1701
+ transform: scale(0.98);
1702
+ }
1703
+
1639
1704
  .resira-resource-card--selected {
1640
1705
  border-color: var(--resira-primary) !important;
1641
1706
  background: color-mix(in srgb, var(--resira-primary) 3%, var(--resira-surface)) !important;
@@ -1823,7 +1888,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
1823
1888
  background: var(--resira-bg-subtle);
1824
1889
  border-radius: 8px;
1825
1890
  border: 1.5px solid var(--resira-border);
1826
- transition: all 0.2s ease;
1891
+ transition: border-color 150ms ease, background 150ms ease;
1827
1892
  }
1828
1893
 
1829
1894
  .resira-waiver-row--compact {
@@ -2093,9 +2158,9 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2093
2158
  align-items: center !important;
2094
2159
  justify-content: center !important;
2095
2160
  background: rgba(0, 0, 0, 0.45) !important;
2096
- backdrop-filter: blur(6px) !important;
2097
- -webkit-backdrop-filter: blur(6px) !important;
2098
- animation: resira-fade-in 0.15s ease;
2161
+ backdrop-filter: blur(8px) !important;
2162
+ -webkit-backdrop-filter: blur(8px) !important;
2163
+ animation: resira-fade-in 0.12s ease;
2099
2164
  }
2100
2165
 
2101
2166
  .resira-modal-container {
@@ -2111,7 +2176,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2111
2176
  box-shadow:
2112
2177
  0 24px 80px -12px rgba(0, 0, 0, 0.25),
2113
2178
  0 0 0 1px rgba(0, 0, 0, 0.05) !important;
2114
- animation: resira-scale-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
2179
+ animation: resira-scale-in 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
2115
2180
  margin: 16px !important;
2116
2181
  overscroll-behavior: contain;
2117
2182
  }
@@ -2132,7 +2197,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2132
2197
  background: var(--resira-bg-subtle, #f3f4f6) !important;
2133
2198
  color: var(--resira-muted, #6b7280) !important;
2134
2199
  cursor: pointer !important;
2135
- transition: all 0.15s ease;
2200
+ transition: background 120ms ease, color 120ms ease;
2136
2201
  flex-shrink: 0 !important;
2137
2202
  padding: 0 !important;
2138
2203
  margin: 0 !important;
@@ -2203,23 +2268,23 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2203
2268
  align-items: center;
2204
2269
  justify-content: center;
2205
2270
  gap: 10px;
2206
- padding: 16px 36px;
2271
+ padding: 14px 32px;
2207
2272
  font-size: 16px;
2208
2273
  font-weight: 700;
2209
2274
  font-family: var(--resira-font, system-ui, -apple-system, sans-serif);
2210
2275
  border: none;
2211
- border-radius: 14px;
2276
+ border-radius: 12px;
2212
2277
  background: var(--resira-primary, #2563eb);
2213
2278
  color: var(--resira-primary-fg, #ffffff);
2214
2279
  cursor: pointer;
2215
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2216
- box-shadow: 0 2px 12px color-mix(in srgb, var(--resira-primary, #2563eb) 35%, transparent);
2280
+ transition: background 150ms ease, box-shadow 150ms ease, transform 100ms ease;
2281
+ box-shadow: 0 2px 10px color-mix(in srgb, var(--resira-primary, #2563eb) 30%, transparent);
2217
2282
  letter-spacing: -0.01em;
2218
2283
  }
2219
2284
 
2220
2285
  .resira-book-now-btn:hover {
2221
2286
  background: var(--resira-primary-hover, #1d4ed8);
2222
- box-shadow: 0 6px 24px color-mix(in srgb, var(--resira-primary, #2563eb) 40%, transparent);
2287
+ box-shadow: 0 6px 20px color-mix(in srgb, var(--resira-primary, #2563eb) 35%, transparent);
2223
2288
  transform: translateY(-2px);
2224
2289
  }
2225
2290
 
@@ -2227,6 +2292,11 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2227
2292
  transform: translateY(0);
2228
2293
  }
2229
2294
 
2295
+ .resira-book-now-btn:focus-visible {
2296
+ outline: 2px solid var(--resira-primary, #2563eb);
2297
+ outline-offset: 3px;
2298
+ }
2299
+
2230
2300
  /* ─────────────────────────────────────────────────────────────── */
2231
2301
  /* Responsive */
2232
2302
  /* ─────────────────────────────────────────────────────────────── */
@@ -2349,7 +2419,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2349
2419
  background: transparent;
2350
2420
  color: var(--resira-primary, #2563eb);
2351
2421
  cursor: pointer;
2352
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2422
+ transition: background 150ms ease, color 150ms ease, box-shadow 150ms ease, transform 100ms ease;
2353
2423
  letter-spacing: -0.01em;
2354
2424
  }
2355
2425
 
@@ -2393,7 +2463,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2393
2463
  box-shadow:
2394
2464
  0 24px 80px -12px rgba(0, 0, 0, 0.3),
2395
2465
  0 0 0 1px rgba(0, 0, 0, 0.06) !important;
2396
- animation: resira-scale-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
2466
+ animation: resira-scale-in 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
2397
2467
  margin: 16px !important;
2398
2468
  overscroll-behavior: contain;
2399
2469
  scrollbar-width: thin;
@@ -2424,7 +2494,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2424
2494
  background: var(--resira-bg-subtle, #f3f4f6) !important;
2425
2495
  color: var(--resira-muted, #6b7280) !important;
2426
2496
  cursor: pointer !important;
2427
- transition: all 0.15s ease;
2497
+ transition: background 120ms ease, color 120ms ease;
2428
2498
  flex-shrink: 0 !important;
2429
2499
  padding: 0 !important;
2430
2500
  }
@@ -2513,7 +2583,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2513
2583
  background: var(--resira-surface, #ffffff);
2514
2584
  overflow: hidden;
2515
2585
  cursor: pointer;
2516
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2586
+ transition: border-color 150ms ease, box-shadow 150ms ease, transform 100ms ease;
2517
2587
  padding: 0;
2518
2588
  text-align: left;
2519
2589
  font-family: inherit;
@@ -2622,7 +2692,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2622
2692
  background: transparent;
2623
2693
  color: var(--resira-muted, #64748b);
2624
2694
  cursor: pointer;
2625
- transition: all 0.15s ease;
2695
+ transition: border-color 120ms ease, color 120ms ease;
2626
2696
  flex-shrink: 0;
2627
2697
  }
2628
2698
 
@@ -2752,7 +2822,7 @@ textarea.resira-field-input { resize: vertical; min-height: 52px; }
2752
2822
  border: none;
2753
2823
  border-radius: var(--resira-btn-radius, 10px);
2754
2824
  cursor: pointer;
2755
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2825
+ transition: background 150ms ease, color 150ms ease, box-shadow 150ms ease, transform 100ms ease;
2756
2826
  }
2757
2827
 
2758
2828
  .resira-dish-action--3d {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resira/ui",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "React UI components for the Resira booking platform",
5
5
  "license": "MIT",
6
6
  "type": "module",