@usevyre/react 1.2.1 → 1.4.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.
@@ -3877,3 +3877,933 @@
3877
3877
  font-size: var(--vyre-typography-font-size-xs);
3878
3878
  white-space: pre-wrap;
3879
3879
  }
3880
+
3881
+ /* ── Layout primitives: Stack / Grid / GridItem / Box ───────── */
3882
+ /* Use these instead of inline flex/grid styles. All spacing is */
3883
+ /* token-locked so AI never emits a raw px/rem value. */
3884
+
3885
+ /* Token name → spacing value resolver. Set --vyre-sp-* then read */
3886
+ /* var(--vyre-sp-<slot>) where a token-driven length is needed. */
3887
+ .vyre-stack, .vyre-grid, .vyre-box {
3888
+ --vyre-sp-none: var(--vyre-spacing-0);
3889
+ --vyre-sp-xs: var(--vyre-spacing-2);
3890
+ --vyre-sp-sm: var(--vyre-spacing-3);
3891
+ --vyre-sp-md: var(--vyre-spacing-4);
3892
+ --vyre-sp-lg: var(--vyre-spacing-6);
3893
+ --vyre-sp-xl: var(--vyre-spacing-8);
3894
+ --vyre-sp-2xl: var(--vyre-spacing-12);
3895
+ }
3896
+
3897
+ /* Stack */
3898
+ .vyre-stack { display: flex; min-width: 0; }
3899
+ .vyre-stack[data-inline] { display: inline-flex; }
3900
+ .vyre-stack[data-direction="row"] { flex-direction: row; }
3901
+ .vyre-stack[data-direction="column"] { flex-direction: column; }
3902
+ .vyre-stack[data-direction="row-reverse"] { flex-direction: row-reverse; }
3903
+ .vyre-stack[data-direction="column-reverse"] { flex-direction: column-reverse; }
3904
+ .vyre-stack[data-wrap="nowrap"] { flex-wrap: nowrap; }
3905
+ .vyre-stack[data-wrap="wrap"] { flex-wrap: wrap; }
3906
+ .vyre-stack[data-wrap="wrap-reverse"] { flex-wrap: wrap-reverse; }
3907
+
3908
+ .vyre-stack[data-align="start"] { align-items: flex-start; }
3909
+ .vyre-stack[data-align="center"] { align-items: center; }
3910
+ .vyre-stack[data-align="end"] { align-items: flex-end; }
3911
+ .vyre-stack[data-align="stretch"] { align-items: stretch; }
3912
+ .vyre-stack[data-align="baseline"] { align-items: baseline; }
3913
+
3914
+ .vyre-stack[data-justify="start"] { justify-content: flex-start; }
3915
+ .vyre-stack[data-justify="center"] { justify-content: center; }
3916
+ .vyre-stack[data-justify="end"] { justify-content: flex-end; }
3917
+ .vyre-stack[data-justify="between"] { justify-content: space-between; }
3918
+ .vyre-stack[data-justify="around"] { justify-content: space-around; }
3919
+ .vyre-stack[data-justify="evenly"] { justify-content: space-evenly; }
3920
+
3921
+ .vyre-stack[data-align-content="start"] { align-content: flex-start; }
3922
+ .vyre-stack[data-align-content="center"] { align-content: center; }
3923
+ .vyre-stack[data-align-content="end"] { align-content: flex-end; }
3924
+ .vyre-stack[data-align-content="stretch"] { align-content: stretch; }
3925
+ .vyre-stack[data-align-content="between"] { align-content: space-between; }
3926
+ .vyre-stack[data-align-content="around"] { align-content: space-around; }
3927
+ .vyre-stack[data-align-content="evenly"] { align-content: space-evenly; }
3928
+
3929
+ .vyre-stack[data-align-self="auto"] { align-self: auto; }
3930
+ .vyre-stack[data-align-self="start"] { align-self: flex-start; }
3931
+ .vyre-stack[data-align-self="center"] { align-self: center; }
3932
+ .vyre-stack[data-align-self="end"] { align-self: flex-end; }
3933
+ .vyre-stack[data-align-self="stretch"] { align-self: stretch; }
3934
+ .vyre-stack[data-align-self="baseline"] { align-self: baseline; }
3935
+
3936
+ /* grow/shrink set inline (flexGrow/flexShrink); basis via resolved var */
3937
+ .vyre-stack[style*="--vyre-stack-basis"] { flex-basis: var(--vyre-stack-basis); }
3938
+
3939
+ /* Grid */
3940
+ .vyre-grid {
3941
+ display: grid;
3942
+ min-width: 0;
3943
+ grid-template-columns: repeat(var(--vyre-grid-columns, 1), minmax(0, 1fr));
3944
+ }
3945
+ .vyre-grid[data-columns="auto-fit"] {
3946
+ grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
3947
+ }
3948
+ .vyre-grid[data-rows] {
3949
+ grid-template-rows: repeat(var(--vyre-grid-rows, 1), minmax(0, 1fr));
3950
+ }
3951
+ .vyre-grid[data-flow="row"] { grid-auto-flow: row; }
3952
+ .vyre-grid[data-flow="column"] { grid-auto-flow: column; }
3953
+ .vyre-grid[data-flow="dense"] { grid-auto-flow: dense; }
3954
+ .vyre-grid[data-flow="row-dense"] { grid-auto-flow: row dense; }
3955
+ .vyre-grid[data-flow="column-dense"] { grid-auto-flow: column dense; }
3956
+ .vyre-grid[data-align="start"] { align-items: start; }
3957
+ .vyre-grid[data-align="center"] { align-items: center; }
3958
+ .vyre-grid[data-align="end"] { align-items: end; }
3959
+ .vyre-grid[data-align="stretch"] { align-items: stretch; }
3960
+ .vyre-grid[data-justify="start"] { justify-items: start; }
3961
+ .vyre-grid[data-justify="center"] { justify-items: center; }
3962
+ .vyre-grid[data-justify="end"] { justify-items: end; }
3963
+ .vyre-grid[data-justify="stretch"] { justify-items: stretch; }
3964
+
3965
+ /* GridItem placement */
3966
+ .vyre-grid-item[data-col-span] { grid-column: span var(--vyre-grid-item-col-span) / span var(--vyre-grid-item-col-span); }
3967
+ .vyre-grid-item[data-row-span] { grid-row: span var(--vyre-grid-item-row-span) / span var(--vyre-grid-item-row-span); }
3968
+ .vyre-grid-item[data-col-start] { grid-column-start: var(--vyre-grid-item-col-start); }
3969
+ .vyre-grid-item[data-row-start] { grid-row-start: var(--vyre-grid-item-row-start); }
3970
+
3971
+ /* Box */
3972
+ .vyre-box { display: block; }
3973
+
3974
+ /* Shared gap scale (Stack + Grid). Per-axis overrides shorthand. */
3975
+ .vyre-stack[data-gap="none"], .vyre-grid[data-gap="none"] { gap: var(--vyre-sp-none); }
3976
+ .vyre-stack[data-gap="xs"], .vyre-grid[data-gap="xs"] { gap: var(--vyre-sp-xs); }
3977
+ .vyre-stack[data-gap="sm"], .vyre-grid[data-gap="sm"] { gap: var(--vyre-sp-sm); }
3978
+ .vyre-stack[data-gap="md"], .vyre-grid[data-gap="md"] { gap: var(--vyre-sp-md); }
3979
+ .vyre-stack[data-gap="lg"], .vyre-grid[data-gap="lg"] { gap: var(--vyre-sp-lg); }
3980
+ .vyre-stack[data-gap="xl"], .vyre-grid[data-gap="xl"] { gap: var(--vyre-sp-xl); }
3981
+ .vyre-stack[data-gap="2xl"], .vyre-grid[data-gap="2xl"] { gap: var(--vyre-sp-2xl); }
3982
+
3983
+ .vyre-stack[data-row-gap="none"], .vyre-grid[data-row-gap="none"] { row-gap: var(--vyre-sp-none); }
3984
+ .vyre-stack[data-row-gap="xs"], .vyre-grid[data-row-gap="xs"] { row-gap: var(--vyre-sp-xs); }
3985
+ .vyre-stack[data-row-gap="sm"], .vyre-grid[data-row-gap="sm"] { row-gap: var(--vyre-sp-sm); }
3986
+ .vyre-stack[data-row-gap="md"], .vyre-grid[data-row-gap="md"] { row-gap: var(--vyre-sp-md); }
3987
+ .vyre-stack[data-row-gap="lg"], .vyre-grid[data-row-gap="lg"] { row-gap: var(--vyre-sp-lg); }
3988
+ .vyre-stack[data-row-gap="xl"], .vyre-grid[data-row-gap="xl"] { row-gap: var(--vyre-sp-xl); }
3989
+ .vyre-stack[data-row-gap="2xl"], .vyre-grid[data-row-gap="2xl"] { row-gap: var(--vyre-sp-2xl); }
3990
+
3991
+ .vyre-stack[data-column-gap="none"], .vyre-grid[data-column-gap="none"] { column-gap: var(--vyre-sp-none); }
3992
+ .vyre-stack[data-column-gap="xs"], .vyre-grid[data-column-gap="xs"] { column-gap: var(--vyre-sp-xs); }
3993
+ .vyre-stack[data-column-gap="sm"], .vyre-grid[data-column-gap="sm"] { column-gap: var(--vyre-sp-sm); }
3994
+ .vyre-stack[data-column-gap="md"], .vyre-grid[data-column-gap="md"] { column-gap: var(--vyre-sp-md); }
3995
+ .vyre-stack[data-column-gap="lg"], .vyre-grid[data-column-gap="lg"] { column-gap: var(--vyre-sp-lg); }
3996
+ .vyre-stack[data-column-gap="xl"], .vyre-grid[data-column-gap="xl"] { column-gap: var(--vyre-sp-xl); }
3997
+ .vyre-stack[data-column-gap="2xl"], .vyre-grid[data-column-gap="2xl"] { column-gap: var(--vyre-sp-2xl); }
3998
+
3999
+ /* Box spacing — shorthand, then axis, then per-side (cascade by source order) */
4000
+ .vyre-box[data-p="none"] { padding: var(--vyre-sp-none); }
4001
+ .vyre-box[data-p="xs"] { padding: var(--vyre-sp-xs); }
4002
+ .vyre-box[data-p="sm"] { padding: var(--vyre-sp-sm); }
4003
+ .vyre-box[data-p="md"] { padding: var(--vyre-sp-md); }
4004
+ .vyre-box[data-p="lg"] { padding: var(--vyre-sp-lg); }
4005
+ .vyre-box[data-p="xl"] { padding: var(--vyre-sp-xl); }
4006
+ .vyre-box[data-p="2xl"] { padding: var(--vyre-sp-2xl); }
4007
+ .vyre-box[data-px="none"] { padding-left: var(--vyre-sp-none); padding-right: var(--vyre-sp-none); }
4008
+ .vyre-box[data-px="xs"] { padding-left: var(--vyre-sp-xs); padding-right: var(--vyre-sp-xs); }
4009
+ .vyre-box[data-px="sm"] { padding-left: var(--vyre-sp-sm); padding-right: var(--vyre-sp-sm); }
4010
+ .vyre-box[data-px="md"] { padding-left: var(--vyre-sp-md); padding-right: var(--vyre-sp-md); }
4011
+ .vyre-box[data-px="lg"] { padding-left: var(--vyre-sp-lg); padding-right: var(--vyre-sp-lg); }
4012
+ .vyre-box[data-px="xl"] { padding-left: var(--vyre-sp-xl); padding-right: var(--vyre-sp-xl); }
4013
+ .vyre-box[data-px="2xl"] { padding-left: var(--vyre-sp-2xl); padding-right: var(--vyre-sp-2xl); }
4014
+ .vyre-box[data-py="none"] { padding-top: var(--vyre-sp-none); padding-bottom: var(--vyre-sp-none); }
4015
+ .vyre-box[data-py="xs"] { padding-top: var(--vyre-sp-xs); padding-bottom: var(--vyre-sp-xs); }
4016
+ .vyre-box[data-py="sm"] { padding-top: var(--vyre-sp-sm); padding-bottom: var(--vyre-sp-sm); }
4017
+ .vyre-box[data-py="md"] { padding-top: var(--vyre-sp-md); padding-bottom: var(--vyre-sp-md); }
4018
+ .vyre-box[data-py="lg"] { padding-top: var(--vyre-sp-lg); padding-bottom: var(--vyre-sp-lg); }
4019
+ .vyre-box[data-py="xl"] { padding-top: var(--vyre-sp-xl); padding-bottom: var(--vyre-sp-xl); }
4020
+ .vyre-box[data-py="2xl"] { padding-top: var(--vyre-sp-2xl); padding-bottom: var(--vyre-sp-2xl); }
4021
+ .vyre-box[data-pt="none"] { padding-top: var(--vyre-sp-none); }
4022
+ .vyre-box[data-pt="xs"] { padding-top: var(--vyre-sp-xs); }
4023
+ .vyre-box[data-pt="sm"] { padding-top: var(--vyre-sp-sm); }
4024
+ .vyre-box[data-pt="md"] { padding-top: var(--vyre-sp-md); }
4025
+ .vyre-box[data-pt="lg"] { padding-top: var(--vyre-sp-lg); }
4026
+ .vyre-box[data-pt="xl"] { padding-top: var(--vyre-sp-xl); }
4027
+ .vyre-box[data-pt="2xl"] { padding-top: var(--vyre-sp-2xl); }
4028
+ .vyre-box[data-pr="none"] { padding-right: var(--vyre-sp-none); }
4029
+ .vyre-box[data-pr="xs"] { padding-right: var(--vyre-sp-xs); }
4030
+ .vyre-box[data-pr="sm"] { padding-right: var(--vyre-sp-sm); }
4031
+ .vyre-box[data-pr="md"] { padding-right: var(--vyre-sp-md); }
4032
+ .vyre-box[data-pr="lg"] { padding-right: var(--vyre-sp-lg); }
4033
+ .vyre-box[data-pr="xl"] { padding-right: var(--vyre-sp-xl); }
4034
+ .vyre-box[data-pr="2xl"] { padding-right: var(--vyre-sp-2xl); }
4035
+ .vyre-box[data-pb="none"] { padding-bottom: var(--vyre-sp-none); }
4036
+ .vyre-box[data-pb="xs"] { padding-bottom: var(--vyre-sp-xs); }
4037
+ .vyre-box[data-pb="sm"] { padding-bottom: var(--vyre-sp-sm); }
4038
+ .vyre-box[data-pb="md"] { padding-bottom: var(--vyre-sp-md); }
4039
+ .vyre-box[data-pb="lg"] { padding-bottom: var(--vyre-sp-lg); }
4040
+ .vyre-box[data-pb="xl"] { padding-bottom: var(--vyre-sp-xl); }
4041
+ .vyre-box[data-pb="2xl"] { padding-bottom: var(--vyre-sp-2xl); }
4042
+ .vyre-box[data-pl="none"] { padding-left: var(--vyre-sp-none); }
4043
+ .vyre-box[data-pl="xs"] { padding-left: var(--vyre-sp-xs); }
4044
+ .vyre-box[data-pl="sm"] { padding-left: var(--vyre-sp-sm); }
4045
+ .vyre-box[data-pl="md"] { padding-left: var(--vyre-sp-md); }
4046
+ .vyre-box[data-pl="lg"] { padding-left: var(--vyre-sp-lg); }
4047
+ .vyre-box[data-pl="xl"] { padding-left: var(--vyre-sp-xl); }
4048
+ .vyre-box[data-pl="2xl"] { padding-left: var(--vyre-sp-2xl); }
4049
+ .vyre-box[data-m="none"] { margin: var(--vyre-sp-none); }
4050
+ .vyre-box[data-m="xs"] { margin: var(--vyre-sp-xs); }
4051
+ .vyre-box[data-m="sm"] { margin: var(--vyre-sp-sm); }
4052
+ .vyre-box[data-m="md"] { margin: var(--vyre-sp-md); }
4053
+ .vyre-box[data-m="lg"] { margin: var(--vyre-sp-lg); }
4054
+ .vyre-box[data-m="xl"] { margin: var(--vyre-sp-xl); }
4055
+ .vyre-box[data-m="2xl"] { margin: var(--vyre-sp-2xl); }
4056
+ .vyre-box[data-mx="none"] { margin-left: var(--vyre-sp-none); margin-right: var(--vyre-sp-none); }
4057
+ .vyre-box[data-mx="xs"] { margin-left: var(--vyre-sp-xs); margin-right: var(--vyre-sp-xs); }
4058
+ .vyre-box[data-mx="sm"] { margin-left: var(--vyre-sp-sm); margin-right: var(--vyre-sp-sm); }
4059
+ .vyre-box[data-mx="md"] { margin-left: var(--vyre-sp-md); margin-right: var(--vyre-sp-md); }
4060
+ .vyre-box[data-mx="lg"] { margin-left: var(--vyre-sp-lg); margin-right: var(--vyre-sp-lg); }
4061
+ .vyre-box[data-mx="xl"] { margin-left: var(--vyre-sp-xl); margin-right: var(--vyre-sp-xl); }
4062
+ .vyre-box[data-mx="2xl"] { margin-left: var(--vyre-sp-2xl); margin-right: var(--vyre-sp-2xl); }
4063
+ .vyre-box[data-my="none"] { margin-top: var(--vyre-sp-none); margin-bottom: var(--vyre-sp-none); }
4064
+ .vyre-box[data-my="xs"] { margin-top: var(--vyre-sp-xs); margin-bottom: var(--vyre-sp-xs); }
4065
+ .vyre-box[data-my="sm"] { margin-top: var(--vyre-sp-sm); margin-bottom: var(--vyre-sp-sm); }
4066
+ .vyre-box[data-my="md"] { margin-top: var(--vyre-sp-md); margin-bottom: var(--vyre-sp-md); }
4067
+ .vyre-box[data-my="lg"] { margin-top: var(--vyre-sp-lg); margin-bottom: var(--vyre-sp-lg); }
4068
+ .vyre-box[data-my="xl"] { margin-top: var(--vyre-sp-xl); margin-bottom: var(--vyre-sp-xl); }
4069
+ .vyre-box[data-my="2xl"] { margin-top: var(--vyre-sp-2xl); margin-bottom: var(--vyre-sp-2xl); }
4070
+ .vyre-box[data-mt="none"] { margin-top: var(--vyre-sp-none); }
4071
+ .vyre-box[data-mt="xs"] { margin-top: var(--vyre-sp-xs); }
4072
+ .vyre-box[data-mt="sm"] { margin-top: var(--vyre-sp-sm); }
4073
+ .vyre-box[data-mt="md"] { margin-top: var(--vyre-sp-md); }
4074
+ .vyre-box[data-mt="lg"] { margin-top: var(--vyre-sp-lg); }
4075
+ .vyre-box[data-mt="xl"] { margin-top: var(--vyre-sp-xl); }
4076
+ .vyre-box[data-mt="2xl"] { margin-top: var(--vyre-sp-2xl); }
4077
+ .vyre-box[data-mr="none"] { margin-right: var(--vyre-sp-none); }
4078
+ .vyre-box[data-mr="xs"] { margin-right: var(--vyre-sp-xs); }
4079
+ .vyre-box[data-mr="sm"] { margin-right: var(--vyre-sp-sm); }
4080
+ .vyre-box[data-mr="md"] { margin-right: var(--vyre-sp-md); }
4081
+ .vyre-box[data-mr="lg"] { margin-right: var(--vyre-sp-lg); }
4082
+ .vyre-box[data-mr="xl"] { margin-right: var(--vyre-sp-xl); }
4083
+ .vyre-box[data-mr="2xl"] { margin-right: var(--vyre-sp-2xl); }
4084
+ .vyre-box[data-mb="none"] { margin-bottom: var(--vyre-sp-none); }
4085
+ .vyre-box[data-mb="xs"] { margin-bottom: var(--vyre-sp-xs); }
4086
+ .vyre-box[data-mb="sm"] { margin-bottom: var(--vyre-sp-sm); }
4087
+ .vyre-box[data-mb="md"] { margin-bottom: var(--vyre-sp-md); }
4088
+ .vyre-box[data-mb="lg"] { margin-bottom: var(--vyre-sp-lg); }
4089
+ .vyre-box[data-mb="xl"] { margin-bottom: var(--vyre-sp-xl); }
4090
+ .vyre-box[data-mb="2xl"] { margin-bottom: var(--vyre-sp-2xl); }
4091
+ .vyre-box[data-ml="none"] { margin-left: var(--vyre-sp-none); }
4092
+ .vyre-box[data-ml="xs"] { margin-left: var(--vyre-sp-xs); }
4093
+ .vyre-box[data-ml="sm"] { margin-left: var(--vyre-sp-sm); }
4094
+ .vyre-box[data-ml="md"] { margin-left: var(--vyre-sp-md); }
4095
+ .vyre-box[data-ml="lg"] { margin-left: var(--vyre-sp-lg); }
4096
+ .vyre-box[data-ml="xl"] { margin-left: var(--vyre-sp-xl); }
4097
+ .vyre-box[data-ml="2xl"] { margin-left: var(--vyre-sp-2xl); }
4098
+
4099
+ /* Sizing scale (width / height) — shared by Stack / Grid / Box. */
4100
+ /* Keyword values + fixed-rem token sizes. No raw px ever needed. */
4101
+ .vyre-stack[data-w="auto"], .vyre-grid[data-w="auto"], .vyre-box[data-w="auto"] { width: auto; }
4102
+ .vyre-stack[data-w="full"], .vyre-grid[data-w="full"], .vyre-box[data-w="full"] { width: 100%; }
4103
+ .vyre-stack[data-w="fit"], .vyre-grid[data-w="fit"], .vyre-box[data-w="fit"] { width: fit-content; }
4104
+ .vyre-stack[data-w="screen"], .vyre-grid[data-w="screen"], .vyre-box[data-w="screen"]{ width: 100vw; }
4105
+ .vyre-stack[data-w="xs"], .vyre-grid[data-w="xs"], .vyre-box[data-w="xs"] { width: 8rem; }
4106
+ .vyre-stack[data-w="sm"], .vyre-grid[data-w="sm"], .vyre-box[data-w="sm"] { width: 12rem; }
4107
+ .vyre-stack[data-w="md"], .vyre-grid[data-w="md"], .vyre-box[data-w="md"] { width: 16rem; }
4108
+ .vyre-stack[data-w="lg"], .vyre-grid[data-w="lg"], .vyre-box[data-w="lg"] { width: 24rem; }
4109
+ .vyre-stack[data-w="xl"], .vyre-grid[data-w="xl"], .vyre-box[data-w="xl"] { width: 32rem; }
4110
+ .vyre-stack[data-w="2xl"], .vyre-grid[data-w="2xl"], .vyre-box[data-w="2xl"] { width: 42rem; }
4111
+ .vyre-stack[data-h="auto"], .vyre-grid[data-h="auto"], .vyre-box[data-h="auto"] { height: auto; }
4112
+ .vyre-stack[data-h="full"], .vyre-grid[data-h="full"], .vyre-box[data-h="full"] { height: 100%; }
4113
+ .vyre-stack[data-h="fit"], .vyre-grid[data-h="fit"], .vyre-box[data-h="fit"] { height: fit-content; }
4114
+ .vyre-stack[data-h="screen"], .vyre-grid[data-h="screen"], .vyre-box[data-h="screen"]{ height: 100vh; }
4115
+ .vyre-stack[data-h="xs"], .vyre-grid[data-h="xs"], .vyre-box[data-h="xs"] { height: 8rem; }
4116
+ .vyre-stack[data-h="sm"], .vyre-grid[data-h="sm"], .vyre-box[data-h="sm"] { height: 12rem; }
4117
+ .vyre-stack[data-h="md"], .vyre-grid[data-h="md"], .vyre-box[data-h="md"] { height: 16rem; }
4118
+ .vyre-stack[data-h="lg"], .vyre-grid[data-h="lg"], .vyre-box[data-h="lg"] { height: 24rem; }
4119
+ .vyre-stack[data-h="xl"], .vyre-grid[data-h="xl"], .vyre-box[data-h="xl"] { height: 32rem; }
4120
+ .vyre-stack[data-h="2xl"], .vyre-grid[data-h="2xl"], .vyre-box[data-h="2xl"] { height: 42rem; }
4121
+
4122
+ /* ── Form ───────────────────────────────────────────────────── */
4123
+ /* Vertical stack of fields with token spacing. The wrapped Field */
4124
+ /* handles label / error / hint; Form only owns layout rhythm. */
4125
+ .vyre-form {
4126
+ display: flex;
4127
+ flex-direction: column;
4128
+ gap: var(--vyre-spacing-5);
4129
+ }
4130
+ .vyre-form-field {
4131
+ margin: 0;
4132
+ }
4133
+
4134
+ /* ── NumberInput ────────────────────────────────────────────── */
4135
+ /* Stepper buttons + numeric field. Same token palette as Input. */
4136
+ .vyre-number-input {
4137
+ display: inline-flex;
4138
+ align-items: stretch;
4139
+ background: var(--vyre-color-semantic-surface-raised);
4140
+ border: 1px solid var(--vyre-color-semantic-border);
4141
+ border-radius: var(--vyre-border-radius-md);
4142
+ overflow: hidden;
4143
+ transition: border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
4144
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
4145
+ }
4146
+ .vyre-number-input:focus-within {
4147
+ border-color: var(--vyre-color-semantic-accent);
4148
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-accent-subtle);
4149
+ }
4150
+ .vyre-field--error .vyre-number-input {
4151
+ border-color: var(--vyre-color-semantic-danger);
4152
+ }
4153
+ .vyre-field--error .vyre-number-input:focus-within {
4154
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-danger-subtle);
4155
+ }
4156
+ .vyre-number-input--disabled {
4157
+ opacity: 0.55;
4158
+ cursor: not-allowed;
4159
+ }
4160
+
4161
+ .vyre-number-input__field {
4162
+ flex: 1;
4163
+ min-width: 3rem;
4164
+ border: none;
4165
+ outline: none;
4166
+ background: transparent;
4167
+ text-align: center;
4168
+ color: var(--vyre-color-semantic-text-primary);
4169
+ font-family: var(--vyre-typography-font-family-body);
4170
+ font-variant-numeric: tabular-nums;
4171
+ -moz-appearance: textfield;
4172
+ }
4173
+ .vyre-number-input__field:disabled {
4174
+ cursor: not-allowed;
4175
+ }
4176
+
4177
+ .vyre-number-input__btn {
4178
+ display: flex;
4179
+ align-items: center;
4180
+ justify-content: center;
4181
+ border: none;
4182
+ background: transparent;
4183
+ color: var(--vyre-color-semantic-text-secondary);
4184
+ cursor: pointer;
4185
+ user-select: none;
4186
+ font-size: var(--vyre-typography-font-size-md);
4187
+ line-height: 1;
4188
+ transition: background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
4189
+ color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
4190
+ }
4191
+ .vyre-number-input__btn:hover:not(:disabled) {
4192
+ background: var(--vyre-color-semantic-surface);
4193
+ color: var(--vyre-color-semantic-text-primary);
4194
+ }
4195
+ .vyre-number-input__btn:active:not(:disabled) {
4196
+ background: var(--vyre-color-semantic-accent-subtle);
4197
+ }
4198
+ .vyre-number-input__btn:disabled {
4199
+ opacity: 0.4;
4200
+ cursor: not-allowed;
4201
+ }
4202
+
4203
+ /* Sizes — mirror Input's scale */
4204
+ .vyre-number-input--sm .vyre-number-input__field { padding: var(--vyre-spacing-2) var(--vyre-spacing-2); font-size: var(--vyre-typography-font-size-xs); }
4205
+ .vyre-number-input--sm .vyre-number-input__btn { width: 1.75rem; }
4206
+ .vyre-number-input--md .vyre-number-input__field { padding: var(--vyre-spacing-3) var(--vyre-spacing-3); font-size: var(--vyre-typography-font-size-sm); }
4207
+ .vyre-number-input--md .vyre-number-input__btn { width: 2.25rem; }
4208
+ .vyre-number-input--lg .vyre-number-input__field { padding: var(--vyre-spacing-4) var(--vyre-spacing-4); font-size: var(--vyre-typography-font-size-md); }
4209
+ .vyre-number-input--lg .vyre-number-input__btn { width: 2.75rem; }
4210
+
4211
+ /* ── ToggleGroup ────────────────────────────────────────────── */
4212
+ /* Segmented control: connected toggle buttons sharing a track. */
4213
+ .vyre-toggle-group {
4214
+ display: inline-flex;
4215
+ align-items: stretch;
4216
+ gap: 2px;
4217
+ padding: 3px;
4218
+ background: var(--vyre-color-semantic-surface);
4219
+ border: 1px solid var(--vyre-color-semantic-border);
4220
+ border-radius: var(--vyre-border-radius-lg);
4221
+ }
4222
+ .vyre-toggle-group[data-orientation="vertical"] {
4223
+ flex-direction: column;
4224
+ }
4225
+ .vyre-toggle-group--disabled {
4226
+ opacity: 0.55;
4227
+ cursor: not-allowed;
4228
+ }
4229
+
4230
+ .vyre-toggle-item {
4231
+ display: inline-flex;
4232
+ align-items: center;
4233
+ justify-content: center;
4234
+ gap: var(--vyre-spacing-2);
4235
+ border: none;
4236
+ background: transparent;
4237
+ color: var(--vyre-color-semantic-text-secondary);
4238
+ font-family: var(--vyre-typography-font-family-body);
4239
+ font-weight: var(--vyre-typography-font-weight-medium);
4240
+ border-radius: var(--vyre-border-radius-md);
4241
+ cursor: pointer;
4242
+ user-select: none;
4243
+ white-space: nowrap;
4244
+ transition: background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
4245
+ color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
4246
+ }
4247
+ .vyre-toggle-item:hover:not(:disabled):not(.vyre-toggle-item--selected) {
4248
+ background: var(--vyre-color-semantic-surface-raised);
4249
+ color: var(--vyre-color-semantic-text-primary);
4250
+ }
4251
+ .vyre-toggle-item:focus-visible {
4252
+ outline: none;
4253
+ box-shadow: 0 0 0 2px var(--vyre-color-semantic-accent);
4254
+ }
4255
+ .vyre-toggle-item--selected {
4256
+ background: var(--vyre-color-semantic-surface-raised);
4257
+ color: var(--vyre-color-semantic-text-primary);
4258
+ box-shadow: var(--vyre-shadow-sm);
4259
+ }
4260
+ .vyre-toggle-item:disabled {
4261
+ opacity: 0.45;
4262
+ cursor: not-allowed;
4263
+ }
4264
+ .vyre-toggle-item__icon {
4265
+ display: inline-flex;
4266
+ align-items: center;
4267
+ }
4268
+
4269
+ /* Sizes */
4270
+ .vyre-toggle-group--sm .vyre-toggle-item { padding: var(--vyre-spacing-1) var(--vyre-spacing-3); font-size: var(--vyre-typography-font-size-xs); }
4271
+ .vyre-toggle-group--md .vyre-toggle-item { padding: var(--vyre-spacing-2) var(--vyre-spacing-4); font-size: var(--vyre-typography-font-size-sm); }
4272
+ .vyre-toggle-group--lg .vyre-toggle-item { padding: var(--vyre-spacing-3) var(--vyre-spacing-5); font-size: var(--vyre-typography-font-size-md); }
4273
+
4274
+ /* ── Stepper ────────────────────────────────────────────────── */
4275
+ /* Ordered linear flow: numbered/check indicators + connectors. */
4276
+ .vyre-stepper {
4277
+ display: flex;
4278
+ flex-direction: column;
4279
+ gap: var(--vyre-spacing-6);
4280
+ }
4281
+ .vyre-stepper__nav {
4282
+ display: flex;
4283
+ }
4284
+ .vyre-stepper--horizontal .vyre-stepper__nav {
4285
+ flex-direction: row;
4286
+ align-items: flex-start;
4287
+ }
4288
+ .vyre-stepper--vertical .vyre-stepper__nav {
4289
+ flex-direction: column;
4290
+ gap: var(--vyre-spacing-1);
4291
+ }
4292
+
4293
+ .vyre-step {
4294
+ display: flex;
4295
+ align-items: center;
4296
+ gap: var(--vyre-spacing-3);
4297
+ position: relative;
4298
+ }
4299
+ .vyre-stepper--horizontal .vyre-step {
4300
+ flex: 1;
4301
+ }
4302
+ .vyre-stepper--horizontal .vyre-step:last-child {
4303
+ flex: 0;
4304
+ }
4305
+ .vyre-stepper--vertical .vyre-step {
4306
+ align-items: flex-start;
4307
+ padding-bottom: var(--vyre-spacing-5);
4308
+ }
4309
+
4310
+ .vyre-step__indicator {
4311
+ display: flex;
4312
+ align-items: center;
4313
+ justify-content: center;
4314
+ flex-shrink: 0;
4315
+ width: 2rem;
4316
+ height: 2rem;
4317
+ border-radius: var(--vyre-border-radius-full);
4318
+ border: 2px solid var(--vyre-color-semantic-border);
4319
+ background: var(--vyre-color-semantic-surface);
4320
+ color: var(--vyre-color-semantic-text-secondary);
4321
+ font-family: var(--vyre-typography-font-family-body);
4322
+ font-size: var(--vyre-typography-font-size-sm);
4323
+ font-weight: var(--vyre-typography-font-weight-bold);
4324
+ cursor: default;
4325
+ transition: background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
4326
+ border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
4327
+ color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
4328
+ }
4329
+ .vyre-step--current .vyre-step__indicator {
4330
+ border-color: var(--vyre-color-semantic-accent);
4331
+ color: var(--vyre-color-semantic-accent);
4332
+ background: var(--vyre-color-semantic-accent-subtle);
4333
+ }
4334
+ .vyre-step--completed .vyre-step__indicator {
4335
+ border-color: var(--vyre-color-semantic-accent);
4336
+ background: var(--vyre-color-semantic-accent);
4337
+ color: var(--vyre-color-semantic-accent-foreground);
4338
+ }
4339
+ .vyre-step--clickable .vyre-step__indicator {
4340
+ cursor: pointer;
4341
+ }
4342
+ .vyre-step--clickable .vyre-step__indicator:focus-visible {
4343
+ outline: none;
4344
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-accent-subtle);
4345
+ }
4346
+
4347
+ .vyre-step__text {
4348
+ display: flex;
4349
+ flex-direction: column;
4350
+ gap: 2px;
4351
+ min-width: 0;
4352
+ }
4353
+ .vyre-step__label {
4354
+ font-size: var(--vyre-typography-font-size-sm);
4355
+ font-weight: var(--vyre-typography-font-weight-medium);
4356
+ color: var(--vyre-color-semantic-text-primary);
4357
+ }
4358
+ .vyre-step--upcoming .vyre-step__label {
4359
+ color: var(--vyre-color-semantic-text-secondary);
4360
+ }
4361
+ .vyre-step__description {
4362
+ font-size: var(--vyre-typography-font-size-xs);
4363
+ color: var(--vyre-color-semantic-text-muted);
4364
+ }
4365
+
4366
+ /* Connector line between steps */
4367
+ .vyre-step__connector {
4368
+ background: var(--vyre-color-semantic-border);
4369
+ }
4370
+ .vyre-step--completed .vyre-step__connector {
4371
+ background: var(--vyre-color-semantic-accent);
4372
+ }
4373
+ .vyre-stepper--horizontal .vyre-step__connector {
4374
+ flex: 1;
4375
+ height: 2px;
4376
+ margin: 0 var(--vyre-spacing-2);
4377
+ }
4378
+ .vyre-stepper--horizontal .vyre-step:last-child .vyre-step__connector {
4379
+ display: none;
4380
+ }
4381
+ .vyre-stepper--vertical .vyre-step__connector {
4382
+ position: absolute;
4383
+ left: calc(1rem - 1px);
4384
+ top: 2rem;
4385
+ width: 2px;
4386
+ height: calc(100% - 2rem);
4387
+ }
4388
+ .vyre-stepper--vertical .vyre-step:last-child .vyre-step__connector {
4389
+ display: none;
4390
+ }
4391
+
4392
+ .vyre-step-panel {
4393
+ animation: vyre-step-panel-in var(--vyre-transition-duration-normal) var(--vyre-transition-easing-out);
4394
+ }
4395
+ @keyframes vyre-step-panel-in {
4396
+ from { opacity: 0; transform: translateY(4px); }
4397
+ to { opacity: 1; transform: translateY(0); }
4398
+ }
4399
+
4400
+ /* ── EmptyState ─────────────────────────────────────────────── */
4401
+ /* Centered placeholder: icon + title + description + CTA slot. */
4402
+ .vyre-empty-state {
4403
+ display: flex;
4404
+ flex-direction: column;
4405
+ align-items: center;
4406
+ text-align: center;
4407
+ gap: var(--vyre-spacing-3);
4408
+ padding: var(--vyre-spacing-10) var(--vyre-spacing-6);
4409
+ }
4410
+ .vyre-empty-state__icon {
4411
+ display: flex;
4412
+ align-items: center;
4413
+ justify-content: center;
4414
+ color: var(--vyre-color-semantic-text-muted);
4415
+ }
4416
+ .vyre-empty-state__title {
4417
+ color: var(--vyre-color-semantic-text-primary);
4418
+ font-family: var(--vyre-typography-font-family-body);
4419
+ font-weight: var(--vyre-typography-font-weight-bold);
4420
+ }
4421
+ .vyre-empty-state__description {
4422
+ color: var(--vyre-color-semantic-text-muted);
4423
+ font-size: var(--vyre-typography-font-size-sm);
4424
+ max-width: 32ch;
4425
+ line-height: var(--vyre-typography-line-height-normal);
4426
+ }
4427
+ .vyre-empty-state__action {
4428
+ margin-top: var(--vyre-spacing-2);
4429
+ display: flex;
4430
+ gap: var(--vyre-spacing-2);
4431
+ flex-wrap: wrap;
4432
+ justify-content: center;
4433
+ }
4434
+ .vyre-empty-state[data-variant="error"] .vyre-empty-state__icon {
4435
+ color: var(--vyre-color-semantic-danger);
4436
+ }
4437
+
4438
+ /* Sizes */
4439
+ .vyre-empty-state--sm {
4440
+ padding: var(--vyre-spacing-6) var(--vyre-spacing-4);
4441
+ gap: var(--vyre-spacing-2);
4442
+ }
4443
+ .vyre-empty-state--sm .vyre-empty-state__icon svg { width: 28px; height: 28px; }
4444
+ .vyre-empty-state--sm .vyre-empty-state__title { font-size: var(--vyre-typography-font-size-sm); }
4445
+ .vyre-empty-state--md .vyre-empty-state__title { font-size: var(--vyre-typography-font-size-md); }
4446
+ .vyre-empty-state--lg {
4447
+ padding: var(--vyre-spacing-16) var(--vyre-spacing-8);
4448
+ gap: var(--vyre-spacing-4);
4449
+ }
4450
+ .vyre-empty-state--lg .vyre-empty-state__icon svg { width: 56px; height: 56px; }
4451
+ .vyre-empty-state--lg .vyre-empty-state__title { font-size: var(--vyre-typography-font-size-lg); }
4452
+
4453
+ /* ── Stat ───────────────────────────────────────────────────── */
4454
+ /* Dashboard KPI: label + large value + trend-colored delta. */
4455
+ .vyre-stat {
4456
+ display: flex;
4457
+ align-items: flex-start;
4458
+ gap: var(--vyre-spacing-3);
4459
+ }
4460
+ .vyre-stat__icon {
4461
+ display: flex;
4462
+ align-items: center;
4463
+ justify-content: center;
4464
+ flex-shrink: 0;
4465
+ color: var(--vyre-color-semantic-text-muted);
4466
+ }
4467
+ .vyre-stat__body {
4468
+ display: flex;
4469
+ flex-direction: column;
4470
+ gap: var(--vyre-spacing-1);
4471
+ min-width: 0;
4472
+ }
4473
+ .vyre-stat__label {
4474
+ color: var(--vyre-color-semantic-text-muted);
4475
+ font-family: var(--vyre-typography-font-family-body);
4476
+ font-size: var(--vyre-typography-font-size-sm);
4477
+ }
4478
+ .vyre-stat__value {
4479
+ color: var(--vyre-color-semantic-text-primary);
4480
+ font-family: var(--vyre-typography-font-family-body);
4481
+ font-weight: var(--vyre-typography-font-weight-bold);
4482
+ font-variant-numeric: tabular-nums;
4483
+ line-height: var(--vyre-typography-line-height-tight);
4484
+ }
4485
+ .vyre-stat__delta {
4486
+ display: inline-flex;
4487
+ align-items: center;
4488
+ gap: var(--vyre-spacing-1);
4489
+ font-size: var(--vyre-typography-font-size-xs);
4490
+ color: var(--vyre-color-semantic-text-muted);
4491
+ }
4492
+ .vyre-stat__delta[data-trend="up"] { color: var(--vyre-color-semantic-success); }
4493
+ .vyre-stat__delta[data-trend="down"] { color: var(--vyre-color-semantic-danger); }
4494
+ .vyre-stat__delta-value {
4495
+ font-weight: var(--vyre-typography-font-weight-medium);
4496
+ }
4497
+ .vyre-stat__delta-label {
4498
+ color: var(--vyre-color-semantic-text-muted);
4499
+ font-weight: var(--vyre-typography-font-weight-regular);
4500
+ }
4501
+
4502
+ /* Sizes */
4503
+ .vyre-stat--sm .vyre-stat__value { font-size: var(--vyre-typography-font-size-lg); }
4504
+ .vyre-stat--md .vyre-stat__value { font-size: var(--vyre-typography-font-size-2xl); }
4505
+ .vyre-stat--lg .vyre-stat__value { font-size: var(--vyre-typography-font-size-3xl); }
4506
+
4507
+ /* StatGroup — evenly split row with dividers */
4508
+ .vyre-stat-group {
4509
+ display: flex;
4510
+ flex-wrap: wrap;
4511
+ }
4512
+ .vyre-stat-group > .vyre-stat {
4513
+ flex: 1;
4514
+ min-width: 8rem;
4515
+ padding: 0 var(--vyre-spacing-5);
4516
+ border-left: 1px solid var(--vyre-color-semantic-border-subtle);
4517
+ }
4518
+ .vyre-stat-group > .vyre-stat:first-child {
4519
+ padding-left: 0;
4520
+ border-left: none;
4521
+ }
4522
+
4523
+ /* ── Timeline ───────────────────────────────────────────────── */
4524
+ /* Vertical activity feed: status dot + connector + content. */
4525
+ .vyre-timeline {
4526
+ list-style: none;
4527
+ margin: 0;
4528
+ padding: 0;
4529
+ display: flex;
4530
+ flex-direction: column;
4531
+ }
4532
+ .vyre-timeline-item {
4533
+ display: flex;
4534
+ gap: var(--vyre-spacing-3);
4535
+ }
4536
+ .vyre-timeline-item__marker {
4537
+ display: flex;
4538
+ flex-direction: column;
4539
+ align-items: center;
4540
+ flex-shrink: 0;
4541
+ width: 1.25rem;
4542
+ }
4543
+ .vyre-timeline-item__dot {
4544
+ width: 0.625rem;
4545
+ height: 0.625rem;
4546
+ margin-top: 0.3rem;
4547
+ border-radius: var(--vyre-border-radius-full);
4548
+ background: var(--vyre-color-semantic-border);
4549
+ flex-shrink: 0;
4550
+ }
4551
+ .vyre-timeline-item__icon {
4552
+ display: flex;
4553
+ align-items: center;
4554
+ justify-content: center;
4555
+ margin-top: 0.1rem;
4556
+ color: var(--vyre-color-semantic-text-muted);
4557
+ }
4558
+ .vyre-timeline-item__connector {
4559
+ flex: 1;
4560
+ width: 2px;
4561
+ margin-top: var(--vyre-spacing-1);
4562
+ background: var(--vyre-color-semantic-border-subtle);
4563
+ }
4564
+ .vyre-timeline-item:last-child .vyre-timeline-item__connector {
4565
+ display: none;
4566
+ }
4567
+
4568
+ /* Status dot colors */
4569
+ .vyre-timeline-item[data-status="success"] .vyre-timeline-item__dot,
4570
+ .vyre-timeline-item[data-status="success"] .vyre-timeline-item__icon { color: var(--vyre-color-semantic-success); background: var(--vyre-color-semantic-success); }
4571
+ .vyre-timeline-item[data-status="warning"] .vyre-timeline-item__dot,
4572
+ .vyre-timeline-item[data-status="warning"] .vyre-timeline-item__icon { color: var(--vyre-color-semantic-warning); background: var(--vyre-color-semantic-warning); }
4573
+ .vyre-timeline-item[data-status="danger"] .vyre-timeline-item__dot,
4574
+ .vyre-timeline-item[data-status="danger"] .vyre-timeline-item__icon { color: var(--vyre-color-semantic-danger); background: var(--vyre-color-semantic-danger); }
4575
+ .vyre-timeline-item[data-status="info"] .vyre-timeline-item__dot,
4576
+ .vyre-timeline-item[data-status="info"] .vyre-timeline-item__icon { color: var(--vyre-color-semantic-accent); background: var(--vyre-color-semantic-accent); }
4577
+ /* icon variant should not get a filled background */
4578
+ .vyre-timeline-item__icon { background: transparent !important; }
4579
+
4580
+ .vyre-timeline-item__body {
4581
+ padding-bottom: var(--vyre-spacing-5);
4582
+ min-width: 0;
4583
+ flex: 1;
4584
+ }
4585
+ .vyre-timeline-item:last-child .vyre-timeline-item__body {
4586
+ padding-bottom: 0;
4587
+ }
4588
+ .vyre-timeline-item__head {
4589
+ display: flex;
4590
+ align-items: baseline;
4591
+ justify-content: space-between;
4592
+ gap: var(--vyre-spacing-3);
4593
+ }
4594
+ .vyre-timeline-item__title {
4595
+ color: var(--vyre-color-semantic-text-primary);
4596
+ font-family: var(--vyre-typography-font-family-body);
4597
+ font-size: var(--vyre-typography-font-size-sm);
4598
+ font-weight: var(--vyre-typography-font-weight-medium);
4599
+ }
4600
+ .vyre-timeline-item__time {
4601
+ color: var(--vyre-color-semantic-text-muted);
4602
+ font-size: var(--vyre-typography-font-size-xs);
4603
+ white-space: nowrap;
4604
+ flex-shrink: 0;
4605
+ }
4606
+ .vyre-timeline-item__content {
4607
+ margin-top: var(--vyre-spacing-1);
4608
+ color: var(--vyre-color-semantic-text-secondary);
4609
+ font-size: var(--vyre-typography-font-size-sm);
4610
+ }
4611
+
4612
+ /* ── Tree ───────────────────────────────────────────────────── */
4613
+ /* Hierarchical view: rows with chevron, recursive groups. */
4614
+ .vyre-tree,
4615
+ .vyre-tree__group {
4616
+ list-style: none;
4617
+ margin: 0;
4618
+ padding: 0;
4619
+ }
4620
+ .vyre-tree {
4621
+ font-family: var(--vyre-typography-font-family-body);
4622
+ font-size: var(--vyre-typography-font-size-sm);
4623
+ }
4624
+ .vyre-tree__row {
4625
+ display: flex;
4626
+ align-items: center;
4627
+ gap: var(--vyre-spacing-2);
4628
+ padding: var(--vyre-spacing-1) var(--vyre-spacing-2);
4629
+ border-radius: var(--vyre-border-radius-md);
4630
+ color: var(--vyre-color-semantic-text-secondary);
4631
+ cursor: pointer;
4632
+ user-select: none;
4633
+ outline: none;
4634
+ }
4635
+ .vyre-tree__row:hover {
4636
+ background: var(--vyre-color-semantic-surface-raised);
4637
+ color: var(--vyre-color-semantic-text-primary);
4638
+ }
4639
+ .vyre-tree__row:focus-visible {
4640
+ box-shadow: inset 0 0 0 2px var(--vyre-color-semantic-accent);
4641
+ }
4642
+ .vyre-tree__row[data-selected] {
4643
+ background: var(--vyre-color-semantic-accent-subtle);
4644
+ color: var(--vyre-color-semantic-accent);
4645
+ font-weight: var(--vyre-typography-font-weight-medium);
4646
+ }
4647
+ .vyre-tree__row[aria-disabled="true"] {
4648
+ opacity: 0.45;
4649
+ cursor: not-allowed;
4650
+ }
4651
+ .vyre-tree__chevron-slot {
4652
+ display: inline-flex;
4653
+ align-items: center;
4654
+ justify-content: center;
4655
+ width: 0.75rem;
4656
+ flex-shrink: 0;
4657
+ color: var(--vyre-color-semantic-text-muted);
4658
+ }
4659
+ .vyre-tree__chevron {
4660
+ transition: transform var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
4661
+ }
4662
+ .vyre-tree__chevron[data-open] {
4663
+ transform: rotate(90deg);
4664
+ }
4665
+ .vyre-tree__icon {
4666
+ display: inline-flex;
4667
+ align-items: center;
4668
+ flex-shrink: 0;
4669
+ color: var(--vyre-color-semantic-text-muted);
4670
+ }
4671
+ .vyre-tree__label {
4672
+ overflow: hidden;
4673
+ text-overflow: ellipsis;
4674
+ white-space: nowrap;
4675
+ }
4676
+
4677
+ /* ── OTPInput ───────────────────────────────────────────────── */
4678
+ /* Segmented one-time-code slots. Same token palette as Input. */
4679
+ .vyre-otp {
4680
+ display: inline-flex;
4681
+ gap: var(--vyre-spacing-2);
4682
+ }
4683
+ .vyre-otp__slot {
4684
+ width: 2.75rem;
4685
+ height: 3rem;
4686
+ text-align: center;
4687
+ font-family: var(--vyre-typography-font-family-body);
4688
+ font-size: var(--vyre-typography-font-size-lg);
4689
+ font-weight: var(--vyre-typography-font-weight-medium);
4690
+ font-variant-numeric: tabular-nums;
4691
+ color: var(--vyre-color-semantic-text-primary);
4692
+ background: var(--vyre-color-semantic-surface-raised);
4693
+ border: 1px solid var(--vyre-color-semantic-border);
4694
+ border-radius: var(--vyre-border-radius-md);
4695
+ outline: none;
4696
+ -webkit-appearance: none;
4697
+ transition: border-color var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
4698
+ box-shadow var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
4699
+ }
4700
+ .vyre-otp__slot:focus {
4701
+ border-color: var(--vyre-color-semantic-accent);
4702
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-accent-subtle);
4703
+ }
4704
+ .vyre-otp__slot:disabled {
4705
+ opacity: 0.55;
4706
+ cursor: not-allowed;
4707
+ }
4708
+ .vyre-field--error .vyre-otp__slot {
4709
+ border-color: var(--vyre-color-semantic-danger);
4710
+ }
4711
+ .vyre-field--error .vyre-otp__slot:focus {
4712
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-danger-subtle);
4713
+ }
4714
+
4715
+ /* Sizes */
4716
+ .vyre-otp--sm .vyre-otp__slot { width: 2.25rem; height: 2.5rem; font-size: var(--vyre-typography-font-size-md); }
4717
+ .vyre-otp--lg .vyre-otp__slot { width: 3.25rem; height: 3.5rem; font-size: var(--vyre-typography-font-size-xl); }
4718
+
4719
+ /* ── Carousel ───────────────────────────────────────────────── */
4720
+ /* Snap-scrolling slider + arrows + dot indicators. */
4721
+ .vyre-carousel {
4722
+ position: relative;
4723
+ display: flex;
4724
+ flex-direction: column;
4725
+ gap: var(--vyre-spacing-3);
4726
+ }
4727
+ .vyre-carousel__viewport {
4728
+ position: relative;
4729
+ overflow: hidden;
4730
+ border-radius: var(--vyre-border-radius-lg);
4731
+ }
4732
+ .vyre-carousel__track {
4733
+ display: flex;
4734
+ overflow-x: auto;
4735
+ scroll-snap-type: x mandatory;
4736
+ scrollbar-width: none;
4737
+ outline: none;
4738
+ }
4739
+ .vyre-carousel__track::-webkit-scrollbar {
4740
+ display: none;
4741
+ }
4742
+ .vyre-carousel__slide {
4743
+ flex: 0 0 100%;
4744
+ min-width: 0;
4745
+ scroll-snap-align: start;
4746
+ }
4747
+ .vyre-carousel__track:focus-visible {
4748
+ box-shadow: inset 0 0 0 2px var(--vyre-color-semantic-accent);
4749
+ }
4750
+
4751
+ .vyre-carousel__arrow {
4752
+ position: absolute;
4753
+ top: 50%;
4754
+ transform: translateY(-50%);
4755
+ display: flex;
4756
+ align-items: center;
4757
+ justify-content: center;
4758
+ width: 2.25rem;
4759
+ height: 2.25rem;
4760
+ border: none;
4761
+ border-radius: var(--vyre-border-radius-full);
4762
+ background: var(--vyre-color-semantic-surface-raised);
4763
+ color: var(--vyre-color-semantic-text-primary);
4764
+ box-shadow: var(--vyre-shadow-md);
4765
+ cursor: pointer;
4766
+ transition: opacity var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
4767
+ background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
4768
+ }
4769
+ .vyre-carousel__arrow:hover:not(:disabled) {
4770
+ background: var(--vyre-color-semantic-surface);
4771
+ }
4772
+ .vyre-carousel__arrow:focus-visible {
4773
+ outline: none;
4774
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-accent-subtle);
4775
+ }
4776
+ .vyre-carousel__arrow:disabled {
4777
+ opacity: 0;
4778
+ pointer-events: none;
4779
+ }
4780
+ .vyre-carousel__arrow--prev { left: var(--vyre-spacing-3); }
4781
+ .vyre-carousel__arrow--next { right: var(--vyre-spacing-3); }
4782
+
4783
+ .vyre-carousel__indicators {
4784
+ display: flex;
4785
+ justify-content: center;
4786
+ gap: var(--vyre-spacing-2);
4787
+ }
4788
+ .vyre-carousel__dot {
4789
+ width: 0.5rem;
4790
+ height: 0.5rem;
4791
+ padding: 0;
4792
+ border: none;
4793
+ border-radius: var(--vyre-border-radius-full);
4794
+ background: var(--vyre-color-semantic-border);
4795
+ cursor: pointer;
4796
+ transition: background var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out),
4797
+ width var(--vyre-transition-duration-fast) var(--vyre-transition-easing-out);
4798
+ }
4799
+ .vyre-carousel__dot:hover {
4800
+ background: var(--vyre-color-semantic-text-muted);
4801
+ }
4802
+ .vyre-carousel__dot[data-active] {
4803
+ width: 1.25rem;
4804
+ background: var(--vyre-color-semantic-accent);
4805
+ }
4806
+ .vyre-carousel__dot:focus-visible {
4807
+ outline: none;
4808
+ box-shadow: 0 0 0 3px var(--vyre-color-semantic-accent-subtle);
4809
+ }