orynn 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -1049,7 +1049,7 @@
1049
1049
  font-size: var(--orynn-font-size);
1050
1050
  font-weight: 500;
1051
1051
  line-height: 1;
1052
- cursor: pointer;
1052
+ cursor: var(--orynn-button-cursor, pointer);
1053
1053
  outline: none;
1054
1054
  transition: var(--orynn-transition);
1055
1055
  /* default variant */
@@ -1062,7 +1062,7 @@
1062
1062
  flex-shrink: 0;
1063
1063
  pointer-events: none;
1064
1064
  }
1065
- .orynn-button:hover {
1065
+ .orynn-button:hover:not([data-hover-effect="none"]) {
1066
1066
  background: color-mix(in oklch, var(--orynn-color-primary) 90%, transparent);
1067
1067
  }
1068
1068
  .orynn-button:focus-visible {
@@ -1083,14 +1083,14 @@
1083
1083
  background: var(--orynn-color-secondary);
1084
1084
  color: var(--orynn-color-secondary-foreground);
1085
1085
  }
1086
- .orynn-button--secondary:hover {
1086
+ .orynn-button--secondary:hover:not([data-hover-effect="none"]) {
1087
1087
  background: color-mix(in oklch, var(--orynn-color-secondary) 80%, transparent);
1088
1088
  }
1089
1089
  .orynn-button--destructive {
1090
1090
  background: var(--orynn-color-destructive);
1091
1091
  color: #fff;
1092
1092
  }
1093
- .orynn-button--destructive:hover {
1093
+ .orynn-button--destructive:hover:not([data-hover-effect="none"]) {
1094
1094
  background: color-mix(in oklch, var(--orynn-color-destructive) 90%, transparent);
1095
1095
  }
1096
1096
  .orynn-button--destructive:focus-visible {
@@ -1103,7 +1103,7 @@
1103
1103
  box-shadow: var(--orynn-shadow-xs);
1104
1104
  color: var(--orynn-color-foreground);
1105
1105
  }
1106
- .orynn-button--outline:hover {
1106
+ .orynn-button--outline:hover:not([data-hover-effect="none"]) {
1107
1107
  background: var(--orynn-color-accent);
1108
1108
  color: var(--orynn-color-accent-foreground);
1109
1109
  }
@@ -1112,15 +1112,15 @@
1112
1112
  border-color: var(--orynn-color-input);
1113
1113
  background: color-mix(in oklch, var(--orynn-color-input) 30%, transparent);
1114
1114
  }
1115
- [data-orynn-color-scheme="dark"] .orynn-button--outline:hover,
1116
- .dark .orynn-button--outline:hover {
1115
+ [data-orynn-color-scheme="dark"] .orynn-button--outline:hover:not([data-hover-effect="none"]),
1116
+ .dark .orynn-button--outline:hover:not([data-hover-effect="none"]) {
1117
1117
  background: color-mix(in oklch, var(--orynn-color-input) 50%, transparent);
1118
1118
  }
1119
1119
  .orynn-button--ghost {
1120
1120
  background: transparent;
1121
1121
  color: var(--orynn-color-foreground);
1122
1122
  }
1123
- .orynn-button--ghost:hover {
1123
+ .orynn-button--ghost:hover:not([data-hover-effect="none"]) {
1124
1124
  background: var(--orynn-color-accent);
1125
1125
  color: var(--orynn-color-accent-foreground);
1126
1126
  }
@@ -1131,7 +1131,7 @@
1131
1131
  color: var(--orynn-color-primary);
1132
1132
  text-underline-offset: 4px;
1133
1133
  }
1134
- .orynn-button--link:hover {
1134
+ .orynn-button--link:hover:not([data-hover-effect="none"]) {
1135
1135
  background: transparent;
1136
1136
  text-decoration: underline;
1137
1137
  }
@@ -1151,6 +1151,71 @@
1151
1151
  padding: 0;
1152
1152
  }
1153
1153
 
1154
+ /* -- per-instance state knobs (data-attrs set by <Button>) --------------- *
1155
+ * Defaults (no attr) are unchanged. Every effect is token-driven so a theme
1156
+ * can retune it without new markup. */
1157
+
1158
+ /* hover: "lift" — raise + shadow, settle on press */
1159
+ .orynn-button[data-hover-effect="lift"] {
1160
+ transition: var(--orynn-transition), transform 120ms var(--orynn-ease), box-shadow 120ms
1161
+ var(--orynn-ease);
1162
+ }
1163
+ .orynn-button[data-hover-effect="lift"]:hover:not(:disabled):not([data-disabled]) {
1164
+ transform: translateY(var(--orynn-button-hover-lift, -1px));
1165
+ box-shadow: var(--orynn-button-hover-shadow, var(--orynn-shadow-md));
1166
+ }
1167
+ .orynn-button[data-hover-effect="lift"]:active:not(:disabled) {
1168
+ transform: translateY(0);
1169
+ }
1170
+
1171
+ /* hover: "glow" — soft ring in the fill colour */
1172
+ .orynn-button[data-hover-effect="glow"] {
1173
+ transition: var(--orynn-transition), box-shadow 140ms var(--orynn-ease);
1174
+ }
1175
+ .orynn-button[data-hover-effect="glow"]:hover:not(:disabled):not([data-disabled]) {
1176
+ box-shadow: 0 0 0 var(--orynn-button-glow-size, 4px)
1177
+ var(--orynn-button-glow, color-mix(in oklch, var(--orynn-color-primary) 22%, transparent));
1178
+ }
1179
+
1180
+ /* hover: "outline-fill" — flood the fill (reads well on ghost / outline) */
1181
+ .orynn-button[data-hover-effect="outline-fill"]:hover:not(:disabled):not([data-disabled]) {
1182
+ background: var(--orynn-button-fill-bg, var(--orynn-color-primary));
1183
+ color: var(--orynn-button-fill-fg, var(--orynn-color-primary-foreground));
1184
+ border-color: var(--orynn-button-fill-bg, var(--orynn-color-primary));
1185
+ text-decoration: none;
1186
+ }
1187
+
1188
+ /* focus-visible styles */
1189
+ .orynn-button[data-focus-style="solid"]:focus-visible {
1190
+ border-color: transparent;
1191
+ box-shadow: none;
1192
+ outline: var(--orynn-button-focus-width, 2px) solid var(--orynn-color-ring);
1193
+ outline-offset: var(--orynn-button-focus-offset, 2px);
1194
+ }
1195
+ .orynn-button[data-focus-style="ring-inset"]:focus-visible {
1196
+ border-color: transparent;
1197
+ box-shadow: inset 0 0 0 var(--orynn-button-focus-width, 2px) var(--orynn-color-ring);
1198
+ }
1199
+ .orynn-button[data-focus-style="none"]:focus-visible {
1200
+ border-color: transparent;
1201
+ box-shadow: none;
1202
+ outline: none;
1203
+ }
1204
+
1205
+ /* selected / pressed */
1206
+ .orynn-button[data-selected] {
1207
+ background: var(--orynn-button-selected-bg, var(--orynn-color-primary));
1208
+ color: var(--orynn-button-selected-fg, var(--orynn-color-primary-foreground));
1209
+ border-color: var(--orynn-button-selected-border, transparent);
1210
+ }
1211
+ .orynn-button[data-selected]:hover:not(:disabled):not([data-hover-effect="none"]) {
1212
+ background: color-mix(
1213
+ in oklch,
1214
+ var(--orynn-button-selected-bg, var(--orynn-color-primary)) 88%,
1215
+ var(--orynn-color-foreground)
1216
+ );
1217
+ }
1218
+
1154
1219
  /* ------------------------------------------------------------- badge ---- */
1155
1220
 
1156
1221
  .orynn-badge {
@@ -2256,11 +2321,27 @@
2256
2321
  /* ------------------------------------------------------- datepicker ----- */
2257
2322
 
2258
2323
  .orynn-calendar {
2324
+ /* Tunables — a theme or the `calendarWidth` prop can override these. */
2325
+ --orynn-calendar-min-width: 0px;
2326
+ --orynn-calendar-day-max: 2.75rem;
2327
+ --orynn-calendar-day-height: 2rem;
2328
+
2259
2329
  padding: 0.75rem;
2330
+ box-sizing: border-box;
2331
+ /* Natural width — used when the calendar carries extra furniture
2332
+ (multi-month panels, a presets rail, a time column); the popover then
2333
+ sizes to this content instead of to the trigger. */
2260
2334
  inline-size: max-content;
2335
+ max-inline-size: 100%;
2261
2336
  color: var(--orynn-color-popover-foreground);
2262
2337
  user-select: none;
2263
2338
  }
2339
+ /* `data-fill` (plain single month, or inline): stretch to the host width so the
2340
+ popover matches the trigger and the day columns spread edge-to-edge. */
2341
+ .orynn-calendar[data-fill] {
2342
+ inline-size: 100%;
2343
+ min-inline-size: var(--orynn-calendar-min-width);
2344
+ }
2264
2345
  .orynn-calendar__header {
2265
2346
  display: flex;
2266
2347
  align-items: center;
@@ -2330,11 +2411,20 @@
2330
2411
  inline-size: 100%;
2331
2412
  border-collapse: collapse;
2332
2413
  }
2414
+ /* fill mode: even columns that split the width instead of hugging the digits */
2415
+ .orynn-calendar[data-fill] .orynn-calendar__grid {
2416
+ table-layout: fixed;
2417
+ }
2333
2418
  .orynn-calendar__grid th {
2334
2419
  font-size: var(--orynn-font-size-sm);
2335
2420
  font-weight: 400;
2336
2421
  color: var(--orynn-color-muted-foreground);
2337
2422
  padding: 0.3rem 0 0.45rem;
2423
+ text-align: center;
2424
+ }
2425
+ .orynn-calendar__grid td {
2426
+ text-align: center;
2427
+ padding: 0;
2338
2428
  }
2339
2429
  .orynn-calendar__weeknum {
2340
2430
  color: var(--orynn-color-muted-foreground);
@@ -2353,6 +2443,14 @@
2353
2443
  cursor: pointer;
2354
2444
  transition: background-color var(--orynn-transition), color var(--orynn-transition);
2355
2445
  }
2446
+ /* fill mode: the cell spreads to the column; the tap target stays a tidy
2447
+ centred square capped by the token. */
2448
+ .orynn-calendar[data-fill] .orynn-calendar__day {
2449
+ inline-size: 100%;
2450
+ max-inline-size: var(--orynn-calendar-day-max);
2451
+ block-size: var(--orynn-calendar-day-height);
2452
+ margin-inline: auto;
2453
+ }
2356
2454
  .orynn-calendar__day:hover:not(:disabled):not([data-selected]) {
2357
2455
  background: var(--orynn-color-accent);
2358
2456
  color: var(--orynn-color-accent-foreground);
@@ -2487,18 +2585,29 @@ button.orynn-calendar__title:focus-visible {
2487
2585
  color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2488
2586
  }
2489
2587
 
2490
- /* multi-month day view (numberOfMonths > 1) */
2588
+ /* multi-month day view (numberOfMonths > 1) — each panel keeps a comfortable
2589
+ natural width instead of being squeezed into the trigger width. */
2491
2590
  .orynn-calendar__panels {
2492
2591
  display: flex;
2493
2592
  gap: 1rem;
2494
2593
  align-items: flex-start;
2495
2594
  }
2595
+ .orynn-calendar__panels > .orynn-calendar__grid {
2596
+ flex: 1 1 0;
2597
+ min-inline-size: 14rem;
2598
+ }
2496
2599
 
2497
2600
  /* preset side rail (only rendered when the `presets` prop is passed) */
2498
2601
  .orynn-datepicker__panel {
2499
2602
  display: flex;
2500
2603
  align-items: stretch;
2501
2604
  }
2605
+ .orynn-datepicker__panel > .orynn-calendar,
2606
+ .orynn-datepicker__panel > .orynn-datepicker__withtime,
2607
+ .orynn-datepicker__withtime > .orynn-calendar {
2608
+ flex: 1 1 auto;
2609
+ min-inline-size: 0;
2610
+ }
2502
2611
  .orynn-datepicker__presets {
2503
2612
  display: flex;
2504
2613
  flex-direction: column;
@@ -2601,6 +2710,706 @@ button.orynn-calendar__title:focus-visible {
2601
2710
  min-inline-size: 0;
2602
2711
  }
2603
2712
 
2713
+ /* ========================================================= 0.6 additions == */
2714
+
2715
+ /* --------------------------------------------------------- accordion ---- */
2716
+
2717
+ .orynn-accordion {
2718
+ --orynn-accordion-trigger-py: 0.875rem;
2719
+ --orynn-accordion-trigger-px: 0.125rem;
2720
+ --orynn-accordion-font-size: var(--orynn-font-size);
2721
+ --orynn-accordion-body-pb: 1rem;
2722
+ --orynn-accordion-gap: 0.5rem;
2723
+ --orynn-accordion-radius: var(--orynn-radius-lg);
2724
+ --orynn-accordion-duration: 200ms;
2725
+
2726
+ display: block;
2727
+ inline-size: 100%;
2728
+ color: var(--orynn-color-foreground);
2729
+ font-family: var(--orynn-font-family);
2730
+ }
2731
+ .orynn-accordion[data-size="sm"] {
2732
+ --orynn-accordion-trigger-py: 0.625rem;
2733
+ --orynn-accordion-font-size: var(--orynn-font-size-sm);
2734
+ --orynn-accordion-body-pb: 0.75rem;
2735
+ }
2736
+ .orynn-accordion[data-size="lg"] {
2737
+ --orynn-accordion-trigger-py: 1.125rem;
2738
+ --orynn-accordion-font-size: var(--orynn-font-size-lg);
2739
+ --orynn-accordion-body-pb: 1.25rem;
2740
+ }
2741
+
2742
+ .orynn-accordion__item {
2743
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
2744
+ }
2745
+ .orynn-accordion[data-variant="bordered"] {
2746
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
2747
+ }
2748
+ .orynn-accordion[data-variant="ghost"] .orynn-accordion__item,
2749
+ .orynn-accordion[data-variant="ghost"] {
2750
+ border: 0;
2751
+ }
2752
+ .orynn-accordion[data-variant="separated"] {
2753
+ display: flex;
2754
+ flex-direction: column;
2755
+ gap: var(--orynn-accordion-gap);
2756
+ }
2757
+ .orynn-accordion[data-variant="separated"] .orynn-accordion__item {
2758
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
2759
+ border-radius: var(--orynn-accordion-radius);
2760
+ padding-inline: 1rem;
2761
+ background: var(--orynn-color-card);
2762
+ }
2763
+
2764
+ .orynn-accordion__header {
2765
+ display: flex;
2766
+ margin: 0;
2767
+ }
2768
+ .orynn-accordion__trigger {
2769
+ flex: 1 1 auto;
2770
+ display: flex;
2771
+ align-items: center;
2772
+ gap: 0.75rem;
2773
+ inline-size: 100%;
2774
+ padding-block: var(--orynn-accordion-trigger-py);
2775
+ padding-inline: var(--orynn-accordion-trigger-px);
2776
+ border: 0;
2777
+ background: transparent;
2778
+ font: inherit;
2779
+ font-size: var(--orynn-accordion-font-size);
2780
+ font-weight: 500;
2781
+ color: inherit;
2782
+ text-align: start;
2783
+ cursor: pointer;
2784
+ transition: color var(--orynn-transition);
2785
+ }
2786
+ .orynn-accordion__trigger[data-icon-position="start"] {
2787
+ justify-content: flex-start;
2788
+ }
2789
+ .orynn-accordion__trigger[data-icon-position="end"] .orynn-accordion__label {
2790
+ flex: 1 1 auto;
2791
+ }
2792
+ .orynn-accordion__trigger:hover {
2793
+ color: var(--orynn-color-primary);
2794
+ }
2795
+ .orynn-accordion__trigger:focus-visible {
2796
+ outline: none;
2797
+ border-radius: var(--orynn-radius-sm);
2798
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2799
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2800
+ }
2801
+ .orynn-accordion__trigger:disabled {
2802
+ opacity: 0.5;
2803
+ cursor: not-allowed;
2804
+ }
2805
+ .orynn-accordion__icon {
2806
+ display: inline-flex;
2807
+ flex: 0 0 auto;
2808
+ inline-size: 1rem;
2809
+ block-size: 1rem;
2810
+ color: var(--orynn-color-muted-foreground);
2811
+ transition: transform var(--orynn-accordion-duration) var(--orynn-ease);
2812
+ }
2813
+ .orynn-accordion__icon > svg {
2814
+ inline-size: 100%;
2815
+ block-size: 100%;
2816
+ }
2817
+ .orynn-accordion__trigger[data-state="open"] .orynn-accordion__icon {
2818
+ transform: rotate(180deg);
2819
+ }
2820
+
2821
+ .orynn-accordion__content {
2822
+ overflow: hidden;
2823
+ font-size: var(--orynn-accordion-font-size);
2824
+ color: var(--orynn-color-muted-foreground);
2825
+ }
2826
+ .orynn-accordion__content[data-state="open"] {
2827
+ animation: orynn-accordion-down var(--orynn-accordion-duration) var(--orynn-ease);
2828
+ }
2829
+ .orynn-accordion__content[data-state="closed"] {
2830
+ animation: orynn-accordion-up var(--orynn-accordion-duration) var(--orynn-ease);
2831
+ }
2832
+ .orynn-accordion__body {
2833
+ padding-block: 0 var(--orynn-accordion-body-pb);
2834
+ padding-inline: var(--orynn-accordion-trigger-px);
2835
+ line-height: 1.6;
2836
+ }
2837
+ @keyframes orynn-accordion-down {
2838
+ from {
2839
+ block-size: 0;
2840
+ }
2841
+ to {
2842
+ block-size: var(--radix-accordion-content-height);
2843
+ }
2844
+ }
2845
+ @keyframes orynn-accordion-up {
2846
+ from {
2847
+ block-size: var(--radix-accordion-content-height);
2848
+ }
2849
+ to {
2850
+ block-size: 0;
2851
+ }
2852
+ }
2853
+
2854
+ /* ----------------------------------------------------------- slider ----- */
2855
+
2856
+ .orynn-slider {
2857
+ --orynn-slider-track-size: 0.375rem;
2858
+ --orynn-slider-thumb-size: 1.125rem;
2859
+ --orynn-slider-track-color: var(--orynn-color-muted);
2860
+ --orynn-slider-range-color: var(--orynn-color-primary);
2861
+ --orynn-slider-thumb-color: var(--orynn-color-background);
2862
+ --orynn-slider-thumb-border: var(--orynn-color-primary);
2863
+
2864
+ position: relative;
2865
+ display: flex;
2866
+ align-items: center;
2867
+ inline-size: 100%;
2868
+ touch-action: none;
2869
+ user-select: none;
2870
+ }
2871
+ .orynn-slider[data-size="sm"] {
2872
+ --orynn-slider-track-size: 0.25rem;
2873
+ --orynn-slider-thumb-size: 0.875rem;
2874
+ }
2875
+ .orynn-slider[data-size="lg"] {
2876
+ --orynn-slider-track-size: 0.5rem;
2877
+ --orynn-slider-thumb-size: 1.375rem;
2878
+ }
2879
+ .orynn-slider[data-orientation="vertical"] {
2880
+ flex-direction: column;
2881
+ inline-size: auto;
2882
+ block-size: 12rem;
2883
+ }
2884
+ .orynn-slider[data-disabled] {
2885
+ opacity: 0.5;
2886
+ cursor: not-allowed;
2887
+ }
2888
+
2889
+ .orynn-slider__track {
2890
+ position: relative;
2891
+ flex-grow: 1;
2892
+ border-radius: 999px;
2893
+ background: var(--orynn-slider-track-color);
2894
+ }
2895
+ .orynn-slider[data-orientation="horizontal"] .orynn-slider__track {
2896
+ block-size: var(--orynn-slider-track-size);
2897
+ }
2898
+ .orynn-slider[data-orientation="vertical"] .orynn-slider__track {
2899
+ inline-size: var(--orynn-slider-track-size);
2900
+ }
2901
+ .orynn-slider__range {
2902
+ position: absolute;
2903
+ border-radius: inherit;
2904
+ background: var(--orynn-slider-range-color);
2905
+ transition: none;
2906
+ }
2907
+ .orynn-slider[data-orientation="horizontal"] .orynn-slider__range {
2908
+ block-size: 100%;
2909
+ }
2910
+ .orynn-slider[data-orientation="vertical"] .orynn-slider__range {
2911
+ inline-size: 100%;
2912
+ }
2913
+
2914
+ .orynn-slider__thumb {
2915
+ display: block;
2916
+ inline-size: var(--orynn-slider-thumb-size);
2917
+ block-size: var(--orynn-slider-thumb-size);
2918
+ border-radius: 999px;
2919
+ background: var(--orynn-slider-thumb-color);
2920
+ border: 2px solid var(--orynn-slider-thumb-border);
2921
+ box-shadow: var(--orynn-shadow-sm);
2922
+ cursor: grab;
2923
+ transition: box-shadow var(--orynn-transition);
2924
+ }
2925
+ .orynn-slider__thumb:hover {
2926
+ box-shadow: 0 0 0 4px color-mix(in oklch, var(--orynn-color-ring) 18%, transparent);
2927
+ }
2928
+ .orynn-slider__thumb:focus-visible {
2929
+ outline: none;
2930
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2931
+ color-mix(in oklch, var(--orynn-color-ring) 45%, transparent);
2932
+ }
2933
+ .orynn-slider__thumb:active {
2934
+ cursor: grabbing;
2935
+ }
2936
+
2937
+ .orynn-slider__tick {
2938
+ position: absolute;
2939
+ inline-size: 2px;
2940
+ block-size: 2px;
2941
+ border-radius: 999px;
2942
+ background: color-mix(in oklch, var(--orynn-color-foreground) 30%, transparent);
2943
+ transform: translateX(-50%);
2944
+ inset-block-start: 50%;
2945
+ margin-block-start: -1px;
2946
+ }
2947
+
2948
+ .orynn-slider__tooltip {
2949
+ position: absolute;
2950
+ inset-block-end: calc(100% + 0.5rem);
2951
+ inset-inline-start: 50%;
2952
+ transform: translateX(-50%);
2953
+ padding: 0.15rem 0.4rem;
2954
+ border-radius: var(--orynn-radius-sm);
2955
+ background: var(--orynn-color-foreground);
2956
+ color: var(--orynn-color-background);
2957
+ font-size: var(--orynn-font-size-sm);
2958
+ line-height: 1.2;
2959
+ white-space: nowrap;
2960
+ pointer-events: none;
2961
+ opacity: 0;
2962
+ transition: opacity var(--orynn-transition);
2963
+ }
2964
+ .orynn-slider[data-tooltip="always"] .orynn-slider__tooltip,
2965
+ .orynn-slider[data-tooltip="hover"] .orynn-slider__thumb:hover .orynn-slider__tooltip,
2966
+ .orynn-slider[data-tooltip="hover"] .orynn-slider__thumb:focus-visible .orynn-slider__tooltip {
2967
+ opacity: 1;
2968
+ }
2969
+
2970
+ .orynn-slider__marks {
2971
+ position: absolute;
2972
+ inset-inline: 0;
2973
+ inset-block-start: calc(50% + var(--orynn-slider-thumb-size) / 2 + 0.25rem);
2974
+ block-size: 0;
2975
+ }
2976
+ .orynn-slider__mark {
2977
+ position: absolute;
2978
+ display: flex;
2979
+ flex-direction: column;
2980
+ align-items: center;
2981
+ transform: translateX(-50%);
2982
+ }
2983
+ .orynn-slider__mark-dot {
2984
+ inline-size: 3px;
2985
+ block-size: 3px;
2986
+ border-radius: 999px;
2987
+ background: var(--orynn-color-muted-foreground);
2988
+ }
2989
+ .orynn-slider__mark-label {
2990
+ margin-block-start: 0.35rem;
2991
+ font-size: var(--orynn-font-size-sm);
2992
+ color: var(--orynn-color-muted-foreground);
2993
+ white-space: nowrap;
2994
+ }
2995
+
2996
+ /* --------------------------------------------------------- progress ---- */
2997
+
2998
+ .orynn-progress__wrap {
2999
+ inline-size: 100%;
3000
+ }
3001
+ .orynn-progress__meta {
3002
+ display: flex;
3003
+ justify-content: space-between;
3004
+ gap: 1rem;
3005
+ margin-block-end: 0.4rem;
3006
+ font-size: var(--orynn-font-size-sm);
3007
+ }
3008
+ .orynn-progress__label {
3009
+ color: var(--orynn-color-foreground);
3010
+ font-weight: 500;
3011
+ }
3012
+ .orynn-progress__value {
3013
+ color: var(--orynn-color-muted-foreground);
3014
+ font-variant-numeric: tabular-nums;
3015
+ }
3016
+
3017
+ .orynn-progress {
3018
+ --orynn-progress-height: 0.5rem;
3019
+ --orynn-progress-track: var(--orynn-color-muted);
3020
+ --orynn-progress-fill: var(--orynn-color-primary);
3021
+
3022
+ position: relative;
3023
+ display: block;
3024
+ inline-size: 100%;
3025
+ block-size: var(--orynn-progress-height);
3026
+ overflow: hidden;
3027
+ border-radius: 999px;
3028
+ background: var(--orynn-progress-track);
3029
+ }
3030
+ .orynn-progress[data-size="sm"] {
3031
+ --orynn-progress-height: 0.35rem;
3032
+ }
3033
+ .orynn-progress[data-size="lg"] {
3034
+ --orynn-progress-height: 0.75rem;
3035
+ }
3036
+ .orynn-progress[data-variant="success"] {
3037
+ --orynn-progress-fill: var(--orynn-color-success, oklch(0.62 0.17 145));
3038
+ }
3039
+ .orynn-progress[data-variant="warning"] {
3040
+ --orynn-progress-fill: oklch(0.75 0.15 80);
3041
+ }
3042
+ .orynn-progress[data-variant="destructive"] {
3043
+ --orynn-progress-fill: var(--orynn-color-destructive);
3044
+ }
3045
+
3046
+ .orynn-progress__bar {
3047
+ block-size: 100%;
3048
+ inline-size: 100%;
3049
+ background: var(--orynn-progress-fill);
3050
+ transition: transform 320ms var(--orynn-ease);
3051
+ }
3052
+ .orynn-progress[data-striped] .orynn-progress__bar {
3053
+ background-image: linear-gradient(
3054
+ 45deg,
3055
+ color-mix(in oklch, #fff 18%, transparent) 25%,
3056
+ transparent 25%,
3057
+ transparent 50%,
3058
+ color-mix(in oklch, #fff 18%, transparent) 50%,
3059
+ color-mix(in oklch, #fff 18%, transparent) 75%,
3060
+ transparent 75%,
3061
+ transparent
3062
+ );
3063
+ background-size: 1rem 1rem;
3064
+ }
3065
+ .orynn-progress[data-animated] .orynn-progress__bar {
3066
+ animation: orynn-progress-stripes 1s linear infinite;
3067
+ }
3068
+ .orynn-progress[data-indeterminate] .orynn-progress__bar {
3069
+ inline-size: 40%;
3070
+ transform: none;
3071
+ animation: orynn-progress-indeterminate 1.3s var(--orynn-ease) infinite;
3072
+ }
3073
+ @keyframes orynn-progress-stripes {
3074
+ from {
3075
+ background-position: 0 0;
3076
+ }
3077
+ to {
3078
+ background-position: 1rem 0;
3079
+ }
3080
+ }
3081
+ @keyframes orynn-progress-indeterminate {
3082
+ 0% {
3083
+ margin-inline-start: -40%;
3084
+ }
3085
+ 100% {
3086
+ margin-inline-start: 100%;
3087
+ }
3088
+ }
3089
+
3090
+ /* circular */
3091
+ .orynn-progress--circle {
3092
+ block-size: auto;
3093
+ inline-size: auto;
3094
+ overflow: visible;
3095
+ background: transparent;
3096
+ border-radius: 0;
3097
+ display: inline-grid;
3098
+ place-items: center;
3099
+ }
3100
+ .orynn-progress__svg {
3101
+ inline-size: 100%;
3102
+ block-size: 100%;
3103
+ transform: rotate(-90deg);
3104
+ grid-area: 1 / 1;
3105
+ }
3106
+ .orynn-progress__ring-track {
3107
+ stroke: var(--orynn-progress-track);
3108
+ }
3109
+ .orynn-progress__ring {
3110
+ stroke: var(--orynn-progress-fill);
3111
+ transition: stroke-dashoffset 320ms var(--orynn-ease);
3112
+ }
3113
+ .orynn-progress--circle[data-indeterminate] .orynn-progress__svg {
3114
+ animation: orynn-progress-spin 0.9s linear infinite;
3115
+ }
3116
+ @keyframes orynn-progress-spin {
3117
+ to {
3118
+ transform: rotate(270deg);
3119
+ }
3120
+ }
3121
+ .orynn-progress__circle-value {
3122
+ grid-area: 1 / 1;
3123
+ font-size: var(--orynn-font-size-sm);
3124
+ font-weight: 600;
3125
+ font-variant-numeric: tabular-nums;
3126
+ color: var(--orynn-color-foreground);
3127
+ }
3128
+
3129
+ /* ----------------------------------------------------------- toast ----- */
3130
+
3131
+ .orynn-toaster {
3132
+ position: fixed;
3133
+ z-index: var(--orynn-z-toast, 9999);
3134
+ display: flex;
3135
+ flex-direction: column;
3136
+ gap: var(--orynn-toaster-gap, 12px);
3137
+ inline-size: min(24rem, calc(100vw - 2 * var(--orynn-toaster-offset, 24px)));
3138
+ max-block-size: 100vh;
3139
+ margin: 0;
3140
+ padding: 0;
3141
+ list-style: none;
3142
+ outline: none;
3143
+ }
3144
+ .orynn-toaster[data-position$="-left"] {
3145
+ inset-inline-start: var(--orynn-toaster-offset, 24px);
3146
+ }
3147
+ .orynn-toaster[data-position$="-right"] {
3148
+ inset-inline-end: var(--orynn-toaster-offset, 24px);
3149
+ }
3150
+ .orynn-toaster[data-position$="-center"] {
3151
+ inset-inline-start: 50%;
3152
+ transform: translateX(-50%);
3153
+ }
3154
+ .orynn-toaster[data-position^="top"] {
3155
+ flex-direction: column;
3156
+ }
3157
+ .orynn-toaster[data-position^="bottom"] {
3158
+ flex-direction: column-reverse;
3159
+ }
3160
+
3161
+ .orynn-toast {
3162
+ --orynn-toast-accent: var(--orynn-color-foreground);
3163
+
3164
+ display: flex;
3165
+ align-items: flex-start;
3166
+ gap: 0.625rem;
3167
+ inline-size: 100%;
3168
+ box-sizing: border-box;
3169
+ padding: 0.875rem 1rem;
3170
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
3171
+ border-radius: var(--orynn-radius-lg);
3172
+ background: var(--orynn-color-popover);
3173
+ color: var(--orynn-color-popover-foreground);
3174
+ box-shadow: var(--orynn-shadow-lg, var(--orynn-shadow-md));
3175
+ font-family: var(--orynn-font-family);
3176
+ font-size: var(--orynn-font-size-sm);
3177
+ }
3178
+ .orynn-toast[data-variant="success"] {
3179
+ --orynn-toast-accent: var(--orynn-color-success, oklch(0.62 0.17 145));
3180
+ }
3181
+ .orynn-toast[data-variant="error"] {
3182
+ --orynn-toast-accent: var(--orynn-color-destructive);
3183
+ }
3184
+ .orynn-toast[data-variant="warning"] {
3185
+ --orynn-toast-accent: oklch(0.72 0.15 80);
3186
+ }
3187
+ .orynn-toast[data-variant="info"] {
3188
+ --orynn-toast-accent: var(--orynn-color-primary);
3189
+ }
3190
+ .orynn-toast[data-variant="loading"] {
3191
+ --orynn-toast-accent: var(--orynn-color-muted-foreground);
3192
+ }
3193
+
3194
+ .orynn-toaster[data-rich-colors] .orynn-toast[data-variant]:not([data-variant="default"]) {
3195
+ background: color-mix(in oklch, var(--orynn-toast-accent) 12%, var(--orynn-color-popover));
3196
+ border-color: color-mix(in oklch, var(--orynn-toast-accent) 35%, var(--orynn-color-border));
3197
+ color: color-mix(in oklch, var(--orynn-toast-accent) 55%, var(--orynn-color-popover-foreground));
3198
+ }
3199
+
3200
+ .orynn-toast__icon {
3201
+ flex: none;
3202
+ display: inline-flex;
3203
+ inline-size: 1.1rem;
3204
+ block-size: 1.1rem;
3205
+ margin-block-start: 0.05rem;
3206
+ color: var(--orynn-toast-accent);
3207
+ }
3208
+ .orynn-toast__icon > svg {
3209
+ inline-size: 100%;
3210
+ block-size: 100%;
3211
+ }
3212
+ .orynn-toast__content {
3213
+ flex: 1 1 auto;
3214
+ min-inline-size: 0;
3215
+ display: flex;
3216
+ flex-direction: column;
3217
+ gap: 0.15rem;
3218
+ }
3219
+ .orynn-toast__title {
3220
+ font-weight: 600;
3221
+ color: var(--orynn-color-foreground);
3222
+ line-height: 1.35;
3223
+ }
3224
+ .orynn-toast__description {
3225
+ color: var(--orynn-color-muted-foreground);
3226
+ line-height: 1.4;
3227
+ }
3228
+ .orynn-toast__action {
3229
+ flex: none;
3230
+ align-self: center;
3231
+ padding: 0.3rem 0.6rem;
3232
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
3233
+ border-radius: var(--orynn-radius-sm);
3234
+ background: transparent;
3235
+ color: var(--orynn-color-foreground);
3236
+ font: inherit;
3237
+ font-weight: 500;
3238
+ cursor: pointer;
3239
+ white-space: nowrap;
3240
+ transition: background-color var(--orynn-transition);
3241
+ }
3242
+ .orynn-toast__action:hover {
3243
+ background: var(--orynn-color-accent);
3244
+ }
3245
+ .orynn-toast__close {
3246
+ flex: none;
3247
+ align-self: flex-start;
3248
+ display: inline-flex;
3249
+ inline-size: 1.1rem;
3250
+ block-size: 1.1rem;
3251
+ padding: 0;
3252
+ border: 0;
3253
+ background: transparent;
3254
+ color: var(--orynn-color-muted-foreground);
3255
+ cursor: pointer;
3256
+ border-radius: var(--orynn-radius-sm);
3257
+ transition: color var(--orynn-transition);
3258
+ }
3259
+ .orynn-toast__close:hover {
3260
+ color: var(--orynn-color-foreground);
3261
+ }
3262
+ .orynn-toast__close > svg {
3263
+ inline-size: 100%;
3264
+ block-size: 100%;
3265
+ }
3266
+
3267
+ .orynn-toast[data-state="open"] {
3268
+ animation: orynn-toast-in 200ms var(--orynn-ease);
3269
+ }
3270
+ .orynn-toast[data-state="closed"] {
3271
+ animation: orynn-toast-out 140ms ease-in;
3272
+ }
3273
+ .orynn-toast[data-swipe="move"] {
3274
+ transform: translateX(var(--radix-toast-swipe-move-x, 0));
3275
+ }
3276
+ .orynn-toast[data-swipe="cancel"] {
3277
+ transform: translateX(0);
3278
+ transition: transform 160ms var(--orynn-ease);
3279
+ }
3280
+ .orynn-toast[data-swipe="end"] {
3281
+ animation: orynn-toast-swipe-out 140ms ease-out;
3282
+ }
3283
+ @keyframes orynn-toast-in {
3284
+ from {
3285
+ opacity: 0;
3286
+ transform: translateY(0.5rem) scale(0.98);
3287
+ }
3288
+ to {
3289
+ opacity: 1;
3290
+ transform: none;
3291
+ }
3292
+ }
3293
+ @keyframes orynn-toast-out {
3294
+ to {
3295
+ opacity: 0;
3296
+ transform: scale(0.97);
3297
+ }
3298
+ }
3299
+ @keyframes orynn-toast-swipe-out {
3300
+ to {
3301
+ transform: translateX(var(--radix-toast-swipe-end-x, 100%));
3302
+ opacity: 0;
3303
+ }
3304
+ }
3305
+
3306
+ /* -------------------------------------------------------- pagination --- */
3307
+
3308
+ .orynn-pagination {
3309
+ --orynn-pagination-size: 2.25rem;
3310
+ --orynn-pagination-font: var(--orynn-font-size-sm);
3311
+ --orynn-pagination-gap: 0.25rem;
3312
+ --orynn-pagination-radius: var(--orynn-radius-md);
3313
+
3314
+ display: block;
3315
+ font-family: var(--orynn-font-family);
3316
+ }
3317
+ .orynn-pagination[data-size="sm"] {
3318
+ --orynn-pagination-size: 1.875rem;
3319
+ --orynn-pagination-font: var(--orynn-font-size-sm);
3320
+ }
3321
+ .orynn-pagination[data-size="lg"] {
3322
+ --orynn-pagination-size: 2.75rem;
3323
+ --orynn-pagination-font: var(--orynn-font-size);
3324
+ }
3325
+ .orynn-pagination[data-disabled] {
3326
+ opacity: 0.55;
3327
+ pointer-events: none;
3328
+ }
3329
+
3330
+ .orynn-pagination__list {
3331
+ display: flex;
3332
+ flex-wrap: wrap;
3333
+ align-items: center;
3334
+ gap: var(--orynn-pagination-gap);
3335
+ margin: 0;
3336
+ padding: 0;
3337
+ list-style: none;
3338
+ }
3339
+ .orynn-pagination__item {
3340
+ display: flex;
3341
+ }
3342
+
3343
+ .orynn-pagination__link {
3344
+ display: inline-flex;
3345
+ align-items: center;
3346
+ justify-content: center;
3347
+ gap: 0.3rem;
3348
+ min-inline-size: var(--orynn-pagination-size);
3349
+ block-size: var(--orynn-pagination-size);
3350
+ padding-inline: 0.5rem;
3351
+ border: var(--orynn-border-width) solid transparent;
3352
+ border-radius: var(--orynn-pagination-radius);
3353
+ background: transparent;
3354
+ color: var(--orynn-color-foreground);
3355
+ font: inherit;
3356
+ font-size: var(--orynn-pagination-font);
3357
+ font-weight: 500;
3358
+ font-variant-numeric: tabular-nums;
3359
+ cursor: pointer;
3360
+ transition: background-color var(--orynn-transition), border-color var(--orynn-transition), color
3361
+ var(--orynn-transition);
3362
+ }
3363
+ .orynn-pagination__link > svg {
3364
+ inline-size: 1em;
3365
+ block-size: 1em;
3366
+ }
3367
+ .orynn-pagination__link:hover:not(:disabled):not([data-active]) {
3368
+ background: var(--orynn-color-accent);
3369
+ color: var(--orynn-color-accent-foreground);
3370
+ }
3371
+ .orynn-pagination__link:focus-visible {
3372
+ outline: none;
3373
+ box-shadow: 0 0 0 var(--orynn-ring-width)
3374
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
3375
+ }
3376
+ .orynn-pagination__link:disabled {
3377
+ opacity: 0.45;
3378
+ cursor: not-allowed;
3379
+ }
3380
+
3381
+ /* variant: outline (default) — bordered idle boxes */
3382
+ .orynn-pagination[data-variant="outline"] .orynn-pagination__link {
3383
+ border-color: var(--orynn-color-border);
3384
+ }
3385
+ .orynn-pagination[data-variant="outline"] .orynn-pagination__link[data-active],
3386
+ .orynn-pagination[data-variant="solid"] .orynn-pagination__link[data-active] {
3387
+ background: var(--orynn-color-primary);
3388
+ border-color: var(--orynn-color-primary);
3389
+ color: var(--orynn-color-primary-foreground);
3390
+ }
3391
+ /* variant: ghost — no borders, active = muted fill */
3392
+ .orynn-pagination[data-variant="ghost"] .orynn-pagination__link[data-active] {
3393
+ background: var(--orynn-color-muted);
3394
+ color: var(--orynn-color-foreground);
3395
+ }
3396
+ /* variant: solid — every item filled faintly, active = primary */
3397
+ .orynn-pagination[data-variant="solid"] .orynn-pagination__link:not([data-active]) {
3398
+ background: var(--orynn-color-muted);
3399
+ }
3400
+
3401
+ .orynn-pagination__nav-label {
3402
+ font-weight: 500;
3403
+ }
3404
+ .orynn-pagination__ellipsis {
3405
+ display: inline-flex;
3406
+ align-items: center;
3407
+ justify-content: center;
3408
+ min-inline-size: var(--orynn-pagination-size);
3409
+ block-size: var(--orynn-pagination-size);
3410
+ color: var(--orynn-color-muted-foreground);
3411
+ }
3412
+
2604
3413
  @media (prefers-reduced-motion: reduce) {
2605
3414
  .orynn-popover,
2606
3415
  .orynn-spin,
@@ -2617,4 +3426,23 @@ button.orynn-calendar__title:focus-visible {
2617
3426
  .orynn-choice__control {
2618
3427
  transition: none;
2619
3428
  }
3429
+ .orynn-button[data-hover-effect="lift"]:hover,
3430
+ .orynn-button[data-hover-effect="lift"]:active {
3431
+ transform: none;
3432
+ }
3433
+ .orynn-accordion__content[data-state="open"],
3434
+ .orynn-accordion__content[data-state="closed"] {
3435
+ animation: none;
3436
+ }
3437
+ .orynn-accordion__icon,
3438
+ .orynn-progress__bar,
3439
+ .orynn-progress__ring,
3440
+ .orynn-progress__svg,
3441
+ .orynn-progress[data-indeterminate] .orynn-progress__bar,
3442
+ .orynn-progress--circle[data-indeterminate] .orynn-progress__svg,
3443
+ .orynn-slider__range,
3444
+ .orynn-toast {
3445
+ transition: none;
3446
+ animation: none;
3447
+ }
2620
3448
  }