@aviala-design/spiral 2.7.2 → 2.9.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/props.json CHANGED
@@ -4024,6 +4024,205 @@
4024
4024
  }
4025
4025
  ]
4026
4026
  },
4027
+ "Drawer": {
4028
+ "displayName": "Drawer",
4029
+ "description": "",
4030
+ "props": [],
4031
+ "parts": [
4032
+ {
4033
+ "displayName": "DrawerTrigger",
4034
+ "description": "",
4035
+ "props": [
4036
+ {
4037
+ "name": "asChild",
4038
+ "type": "boolean",
4039
+ "required": false,
4040
+ "description": ""
4041
+ }
4042
+ ]
4043
+ },
4044
+ {
4045
+ "displayName": "DrawerOverlay",
4046
+ "description": "",
4047
+ "props": [
4048
+ {
4049
+ "name": "asChild",
4050
+ "type": "boolean",
4051
+ "required": false,
4052
+ "description": ""
4053
+ }
4054
+ ]
4055
+ },
4056
+ {
4057
+ "displayName": "DrawerContent",
4058
+ "description": "",
4059
+ "props": [
4060
+ {
4061
+ "name": "asChild",
4062
+ "type": "boolean",
4063
+ "required": false,
4064
+ "description": ""
4065
+ },
4066
+ {
4067
+ "name": "position",
4068
+ "type": "\"left\" | \"right\" | \"top\" | \"bottom\"",
4069
+ "values": [
4070
+ "left",
4071
+ "right",
4072
+ "top",
4073
+ "bottom"
4074
+ ],
4075
+ "defaultValue": "right",
4076
+ "required": false,
4077
+ "description": ""
4078
+ },
4079
+ {
4080
+ "name": "portalled",
4081
+ "type": "boolean",
4082
+ "defaultValue": "true",
4083
+ "required": false,
4084
+ "description": "Render without Portal — use inside nested overlays."
4085
+ },
4086
+ {
4087
+ "name": "showOverlay",
4088
+ "type": "boolean",
4089
+ "defaultValue": "true",
4090
+ "required": false,
4091
+ "description": "Show the default overlay scrim."
4092
+ }
4093
+ ]
4094
+ },
4095
+ {
4096
+ "displayName": "DrawerHeader",
4097
+ "description": "",
4098
+ "props": [
4099
+ {
4100
+ "name": "icon",
4101
+ "type": "ReactNode",
4102
+ "required": false,
4103
+ "description": "Optional leading status icon"
4104
+ },
4105
+ {
4106
+ "name": "showIcon",
4107
+ "type": "boolean",
4108
+ "defaultValue": "false",
4109
+ "required": false,
4110
+ "description": "Show the leading icon slot"
4111
+ },
4112
+ {
4113
+ "name": "showClose",
4114
+ "type": "boolean",
4115
+ "defaultValue": "true",
4116
+ "required": false,
4117
+ "description": "Show the header close control"
4118
+ },
4119
+ {
4120
+ "name": "closeLabel",
4121
+ "type": "string",
4122
+ "required": false,
4123
+ "description": ""
4124
+ }
4125
+ ]
4126
+ },
4127
+ {
4128
+ "displayName": "DrawerHeaderText",
4129
+ "description": "",
4130
+ "props": [
4131
+ {
4132
+ "name": "icon",
4133
+ "type": "ReactNode",
4134
+ "required": false,
4135
+ "description": "Optional leading status icon"
4136
+ },
4137
+ {
4138
+ "name": "showIcon",
4139
+ "type": "boolean",
4140
+ "defaultValue": "false",
4141
+ "required": false,
4142
+ "description": "Show the leading icon slot"
4143
+ },
4144
+ {
4145
+ "name": "showClose",
4146
+ "type": "boolean",
4147
+ "defaultValue": "true",
4148
+ "required": false,
4149
+ "description": "Show the header close control"
4150
+ },
4151
+ {
4152
+ "name": "closeLabel",
4153
+ "type": "string",
4154
+ "required": false,
4155
+ "description": ""
4156
+ },
4157
+ {
4158
+ "name": "description",
4159
+ "type": "ReactNode",
4160
+ "required": false,
4161
+ "description": ""
4162
+ }
4163
+ ]
4164
+ },
4165
+ {
4166
+ "displayName": "DrawerTitle",
4167
+ "description": "",
4168
+ "props": [
4169
+ {
4170
+ "name": "asChild",
4171
+ "type": "boolean",
4172
+ "required": false,
4173
+ "description": ""
4174
+ }
4175
+ ]
4176
+ },
4177
+ {
4178
+ "displayName": "DrawerDescription",
4179
+ "description": "",
4180
+ "props": [
4181
+ {
4182
+ "name": "asChild",
4183
+ "type": "boolean",
4184
+ "required": false,
4185
+ "description": ""
4186
+ }
4187
+ ]
4188
+ },
4189
+ {
4190
+ "displayName": "DrawerBody",
4191
+ "description": "",
4192
+ "props": [
4193
+ {
4194
+ "name": "layout",
4195
+ "type": "\"text\" | \"default\"",
4196
+ "values": [
4197
+ "text",
4198
+ "default"
4199
+ ],
4200
+ "defaultValue": "default",
4201
+ "required": false,
4202
+ "description": "Figma `Content=Text` — title + body copy preset"
4203
+ },
4204
+ {
4205
+ "name": "description",
4206
+ "type": "ReactNode",
4207
+ "required": false,
4208
+ "description": ""
4209
+ }
4210
+ ]
4211
+ },
4212
+ {
4213
+ "displayName": "DrawerClose",
4214
+ "description": "",
4215
+ "props": [
4216
+ {
4217
+ "name": "asChild",
4218
+ "type": "boolean",
4219
+ "required": false,
4220
+ "description": ""
4221
+ }
4222
+ ]
4223
+ }
4224
+ ]
4225
+ },
4027
4226
  "Tooltip": {
4028
4227
  "displayName": "Tooltip",
4029
4228
  "description": "",
@@ -4651,6 +4850,168 @@
4651
4850
  }
4652
4851
  ]
4653
4852
  },
4853
+ "Video": {
4854
+ "displayName": "Video",
4855
+ "description": "",
4856
+ "props": [
4857
+ {
4858
+ "name": "appearance",
4859
+ "type": "\"default\" | \"light\"",
4860
+ "values": [
4861
+ "default",
4862
+ "light"
4863
+ ],
4864
+ "defaultValue": "default",
4865
+ "required": false,
4866
+ "description": "Figma `Style` — Default stacks the bar; Light floats a pill bar over the stage."
4867
+ },
4868
+ {
4869
+ "name": "skipSeconds",
4870
+ "type": "number",
4871
+ "defaultValue": "10",
4872
+ "required": false,
4873
+ "description": "Seconds to skip when Previous / Next have no playlist handlers."
4874
+ },
4875
+ {
4876
+ "name": "playbackRates",
4877
+ "type": "number[]",
4878
+ "defaultValue": "[...DEFAULT_PLAYBACK_RATES]",
4879
+ "required": false,
4880
+ "description": "Available playback rates in the speed popover."
4881
+ },
4882
+ {
4883
+ "name": "muted",
4884
+ "type": "boolean",
4885
+ "required": false,
4886
+ "description": ""
4887
+ },
4888
+ {
4889
+ "name": "defaultMuted",
4890
+ "type": "boolean",
4891
+ "required": false,
4892
+ "description": ""
4893
+ },
4894
+ {
4895
+ "name": "onMutedChange",
4896
+ "type": "(muted: boolean) => void",
4897
+ "required": false,
4898
+ "description": ""
4899
+ },
4900
+ {
4901
+ "name": "playbackRate",
4902
+ "type": "number",
4903
+ "required": false,
4904
+ "description": ""
4905
+ },
4906
+ {
4907
+ "name": "defaultPlaybackRate",
4908
+ "type": "number",
4909
+ "required": false,
4910
+ "description": ""
4911
+ },
4912
+ {
4913
+ "name": "onPlaybackRateChange",
4914
+ "type": "(rate: number) => void",
4915
+ "required": false,
4916
+ "description": ""
4917
+ },
4918
+ {
4919
+ "name": "objectFit",
4920
+ "type": "\"fill\" | \"original\" | \"stretch\"",
4921
+ "values": [
4922
+ "fill",
4923
+ "original",
4924
+ "stretch"
4925
+ ],
4926
+ "required": false,
4927
+ "description": "Figma 画面比例 — original→contain, stretch→fill, fill→cover."
4928
+ },
4929
+ {
4930
+ "name": "defaultObjectFit",
4931
+ "type": "\"fill\" | \"original\" | \"stretch\"",
4932
+ "values": [
4933
+ "fill",
4934
+ "original",
4935
+ "stretch"
4936
+ ],
4937
+ "required": false,
4938
+ "description": ""
4939
+ },
4940
+ {
4941
+ "name": "onObjectFitChange",
4942
+ "type": "(fit: VideoObjectFit) => void",
4943
+ "required": false,
4944
+ "description": ""
4945
+ },
4946
+ {
4947
+ "name": "volumeBalance",
4948
+ "type": "boolean",
4949
+ "required": false,
4950
+ "description": "Lightweight loudness balance via Web Audio DynamicsCompressor."
4951
+ },
4952
+ {
4953
+ "name": "defaultVolumeBalance",
4954
+ "type": "boolean",
4955
+ "required": false,
4956
+ "description": ""
4957
+ },
4958
+ {
4959
+ "name": "onVolumeBalanceChange",
4960
+ "type": "(enabled: boolean) => void",
4961
+ "required": false,
4962
+ "description": ""
4963
+ },
4964
+ {
4965
+ "name": "volume",
4966
+ "type": "number",
4967
+ "required": false,
4968
+ "description": "Linear gain 0–1 (`HTMLMediaElement.volume`)."
4969
+ },
4970
+ {
4971
+ "name": "defaultVolume",
4972
+ "type": "number",
4973
+ "required": false,
4974
+ "description": ""
4975
+ },
4976
+ {
4977
+ "name": "onVolumeChange",
4978
+ "type": "(volume: number) => void",
4979
+ "required": false,
4980
+ "description": ""
4981
+ },
4982
+ {
4983
+ "name": "onPrevious",
4984
+ "type": "() => void",
4985
+ "required": false,
4986
+ "description": "Override Previous (default: seek back `skipSeconds`)."
4987
+ },
4988
+ {
4989
+ "name": "onNext",
4990
+ "type": "() => void",
4991
+ "required": false,
4992
+ "description": "Override Next (default: seek forward `skipSeconds`)."
4993
+ },
4994
+ {
4995
+ "name": "stageBackground",
4996
+ "type": "string",
4997
+ "required": false,
4998
+ "description": "Letterbox / pillarbox fill behind the media.\nCSS color value — prefer a token, e.g. `var(--box-box-normal-background-blackonly)`.\nDefaults to Black (`--box-box-normal-background-blackonly`)."
4999
+ },
5000
+ {
5001
+ "name": "autoHideControls",
5002
+ "type": "boolean",
5003
+ "defaultValue": "false",
5004
+ "required": false,
5005
+ "description": "Auto-hide the control bar after idle (slide down + fade).\nPointer move / press on the player reveals it again."
5006
+ },
5007
+ {
5008
+ "name": "autoHideDelay",
5009
+ "type": "number",
5010
+ "required": false,
5011
+ "description": "Idle time in ms before hiding when `autoHideControls` is on. Default 2500."
5012
+ }
5013
+ ]
5014
+ },
4654
5015
  "ScrollPicker": {
4655
5016
  "displayName": "ScrollPicker",
4656
5017
  "description": "",
package/dist/styles.css CHANGED
@@ -131,6 +131,10 @@
131
131
  --control-control-normal-lightbackground-2: #e5e4e3;
132
132
  --control-control-normal-background-3: #d6d5d4;
133
133
  --control-control-normal-background-whiteonly: #ffffff;
134
+ --box-box-normal-background-whiteonly: #ffffff;
135
+ --box-box-normal-background-blackonly: #000000;
136
+ --box-box-normal-lightbackground-white: #f9f8f8;
137
+ --box-box-normal-lightbackground-black: #262525;
134
138
 
135
139
  /* Neutral text series (body copy, labels, icons) */
136
140
  --text-text-normal-text-black: #262525;
@@ -143,6 +147,9 @@
143
147
  0 0 1px 0 rgb(0 0 0 / 18%),
144
148
  0 6px 18px 0 rgba(0, 0, 0, 0.08);
145
149
 
150
+ /* Shared elevation — BasicShadow-Level5 */
151
+ --aviala-shadow-level5: 0 8px 24px 2px rgba(0, 0, 0, 0.06);
152
+
146
153
  /* Shared interaction surfaces — Figma Components 1909:28593 matrix */
147
154
  --aviala-interaction-ghost-hover: var(
148
155
  --aviala-neutral-neutral-3,
@@ -502,10 +509,14 @@
502
509
  --switch-thumb-travel-small: calc(
503
510
  var(--switch-width) - 2 * var(--switch-padding) - var(--switch-thumb-size-small)
504
511
  );
505
- --switch-transition-duration: 0.3s;
506
- --switch-transition-easing: ease-in-out;
507
- --switch-press-transition-duration: 0.2s;
508
- --switch-thumb-press-scale: 1.28;
512
+ --switch-transition-duration: 0.26s;
513
+ --switch-thumb-lead-ease: cubic-bezier(0.16, 1, 0.3, 1);
514
+ --switch-thumb-trail-ease: cubic-bezier(0.35, 0, 0.15, 1);
515
+ --switch-transition-easing: var(--switch-thumb-lead-ease, cubic-bezier(0.16, 1, 0.3, 1));
516
+ --switch-press-transition-duration: 0.12s;
517
+ --switch-press-transition-easing: cubic-bezier(0.2, 0, 0.2, 1);
518
+ --switch-track-transition-duration: 0.22s;
519
+ --switch-thumb-press-scale: 1.2;
509
520
  --switch-disabled-opacity: 0.55;
510
521
 
511
522
  --link-fg-theme: var(--text-text-theme-primary-black, var(--button-no-bg-fg));
@@ -697,6 +708,36 @@
697
708
  --modal-close-fg: var(--text-text-normal-text-caption-black, #616060);
698
709
  --modal-description-fg: var(--text-text-normal-text-caption-black, #616060);
699
710
 
711
+ /* Drawer — Figma Components → Drawer (2051:26823) */
712
+ --drawer-overlay-bg: rgba(0, 0, 0, 0.4);
713
+ --drawer-inset: var(--padding-large, 18px);
714
+ --drawer-content-width: 310px;
715
+ --drawer-content-max-width: calc(100vw - 36px);
716
+ --drawer-content-max-height-edge: 400px;
717
+ --drawer-content-bg: var(--box-box-normal-background-whiteonly, #ffffff);
718
+ --drawer-content-fg: var(--text-text-normal-text-black, #262525);
719
+ --drawer-content-border: var(--border-border-normal-1, #f0efef);
720
+ --drawer-content-radius: var(--border-radius-big, 12px);
721
+ --drawer-content-shadow: var(--aviala-shadow-level5);
722
+ --drawer-header-bg: var(--drawer-content-bg);
723
+ --drawer-header-pl: var(--padding-big, 14px);
724
+ --drawer-header-pr: var(--padding-small, 6px);
725
+ --drawer-header-py: var(--gap-none, 0);
726
+ --drawer-header-main-py: var(--padding-middle, 10px);
727
+ --drawer-header-gap: var(--gap-content-space, 10px);
728
+ --drawer-section-padding: var(--padding-big, 14px);
729
+ --drawer-section-border: var(--border-border-normal-1, #f0efef);
730
+ --drawer-body-bg: var(--drawer-content-bg);
731
+ --drawer-footer-bg: var(--drawer-content-bg);
732
+ --drawer-footer-actions-gap: var(--gap-component-space, 8px);
733
+ --drawer-icon-size: var(--size-semilarge, 1.375rem);
734
+ --drawer-icon-slot-size: var(--size-semilarge, 1.375rem);
735
+ --drawer-icon-py: var(--padding-min, 2px);
736
+ --drawer-icon-fg: var(--text-text-normal-text-black, #262525);
737
+ --drawer-close-icon-size: var(--size-middle, 1rem);
738
+ --drawer-close-fg: var(--text-text-normal-text-caption-black, #616060);
739
+ --drawer-description-fg: var(--text-text-normal-text-caption-black, #616060);
740
+
700
741
  --tooltip-content-bg: var(--text-text-normal-text-black, var(--aviala-neutral-neutral-10, #262525));
701
742
  --tooltip-content-fg: var(
702
743
  --control-control-normal-background-whiteonly,
@@ -797,7 +838,8 @@
797
838
  --navigation-rail-inline-start: 1px;
798
839
  --navigation-rail-width: 3px;
799
840
  --navigation-indicator-width-horizontal: 50px;
800
- --navigation-transition-duration: var(--switch-transition-duration, 0.3s);
841
+ /* Keep Navigation timing independent of Switch micro-interaction tokens. */
842
+ --navigation-transition-duration: 0.3s;
801
843
  /* Snappy ease-out: most travel happens early, then settles hard. */
802
844
  --navigation-transition-easing: cubic-bezier(0.16, 1, 0.3, 1);
803
845
  --navigation-icon-box: var(--line-height-regular, 1.125rem);
@@ -1039,6 +1081,40 @@
1039
1081
  --card-fg: var(--text-text-normal-text-black, #262525);
1040
1082
  --card-divider-height: 14px;
1041
1083
  --card-trailing-gap: 10px;
1084
+
1085
+ /* Video — Figma Information Display → Video (1958:1400) */
1086
+ --video-width: 800px;
1087
+ --video-height: 450px;
1088
+ --video-radius: var(--border-radius-big, 12px);
1089
+ --video-bg: var(--normal-background-theme, var(--box-box-normal-lightbackground-white, #f9f8f8));
1090
+ --video-border: var(--border-border-normal-1, #f9f8f8);
1091
+ --video-bar-height: 46px;
1092
+ --video-bar-padding: var(--padding-default, 8px);
1093
+ --video-bar-gap: var(--gap-component-space, 8px);
1094
+ --video-bar-group-gap: var(--gap-inside, 4px);
1095
+ --video-bar-progress-gap: 10px;
1096
+ --video-bar-bg: var(--control-control-normal-lightbackground-1, #f0efef);
1097
+ --video-bar-light-inset: var(--padding-big, 14px);
1098
+ --video-bar-light-radius: var(--border-radius-allround, 99px);
1099
+ --video-bar-light-shadow: var(--aviala-shadow-level4-with-line);
1100
+ /* Light floating bar — frosted material over <video> (Figma fill luminosity ≈ glass) */
1101
+ --video-bar-light-blur: 24px;
1102
+ --video-bar-light-bg: color-mix(
1103
+ in srgb,
1104
+ var(--video-bar-bg, var(--control-control-normal-lightbackground-1, #f0efef)) 72%,
1105
+ transparent
1106
+ );
1107
+ --video-settings-width: 200px;
1108
+ --video-settings-gap: var(--gap-component-space, 8px);
1109
+ --video-settings-row-gap: var(--gap-inside-space, 6px);
1110
+ --video-settings-padding: var(--padding-middle, 10px);
1111
+ --video-speed-min-width: 48px;
1112
+ --video-speed-item-width: 160px;
1113
+ --video-volume-slider-size: 96px;
1114
+ /* Letterbox / pillarbox behind media — ALD box-normal-Background-blackOnly */
1115
+ --video-stage-bg: var(--box-box-normal-background-blackonly, #000000);
1116
+ --video-controls-hide-duration: 0.28s;
1117
+ --video-controls-hide-easing: cubic-bezier(0.33, 1, 0.68, 1);
1042
1118
  }
1043
1119
 
1044
1120
  @theme inline {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aviala-design/spiral",
3
- "version": "2.7.2",
3
+ "version": "2.9.0",
4
4
  "description": "Spiral 2 ? Aviala Design React component library",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -44,8 +44,8 @@
44
44
  "clsx": "^2.1.1",
45
45
  "colord": "^2.9.3",
46
46
  "tailwind-merge": "^3.3.1",
47
- "@aviala-design/icons": "2.3.0",
48
- "@aviala-design/tokens": "2.5.2"
47
+ "@aviala-design/icons": "2.4.0",
48
+ "@aviala-design/tokens": "2.5.5"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "react": ">=18",
@@ -55,12 +55,13 @@
55
55
  "devDependencies": {
56
56
  "@hookform/resolvers": "^5.2.1",
57
57
  "@types/react": "^19.1.8",
58
- "react-hook-form": "^7.62.0",
59
58
  "@types/react-dom": "^19.1.6",
60
59
  "react-docgen-typescript": "^2.2.20",
60
+ "react-hook-form": "^7.62.0",
61
61
  "rimraf": "^6.0.1",
62
62
  "tsup": "^8.5.0",
63
63
  "typescript": "^5.8.3",
64
+ "vitest": "^4.1.11",
64
65
  "zod": "^4.0.17"
65
66
  },
66
67
  "scripts": {
@@ -69,6 +70,7 @@
69
70
  "changelog:aggregate": "node scripts/aggregate-changelogs.mjs",
70
71
  "changelog:stamp": "node scripts/stamp-unreleased.mjs",
71
72
  "dev": "tsup --watch",
73
+ "test": "vitest run",
72
74
  "typecheck": "tsc --noEmit",
73
75
  "clean": "rimraf dist"
74
76
  }