@flux-ui/components 3.0.0-next.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.
Files changed (261) hide show
  1. package/README.md +45 -0
  2. package/package.json +77 -0
  3. package/src/component/FluxAction.vue +27 -0
  4. package/src/component/FluxActionBar.vue +94 -0
  5. package/src/component/FluxActionPane.vue +40 -0
  6. package/src/component/FluxActions.vue +27 -0
  7. package/src/component/FluxAlert.vue +37 -0
  8. package/src/component/FluxAnimatedColors.vue +141 -0
  9. package/src/component/FluxAspectRatio.vue +21 -0
  10. package/src/component/FluxAutoGrid.vue +27 -0
  11. package/src/component/FluxAvatar.vue +119 -0
  12. package/src/component/FluxBadge.vue +84 -0
  13. package/src/component/FluxBadgeStack.vue +18 -0
  14. package/src/component/FluxBorderShine.vue +36 -0
  15. package/src/component/FluxBoxedIcon.vue +36 -0
  16. package/src/component/FluxButton.vue +110 -0
  17. package/src/component/FluxButtonGroup.vue +15 -0
  18. package/src/component/FluxButtonStack.vue +28 -0
  19. package/src/component/FluxCalendar.vue +254 -0
  20. package/src/component/FluxCalendarEvent.vue +41 -0
  21. package/src/component/FluxCheckbox.vue +60 -0
  22. package/src/component/FluxChip.vue +57 -0
  23. package/src/component/FluxClickablePane.vue +61 -0
  24. package/src/component/FluxColorPicker.vue +265 -0
  25. package/src/component/FluxColorSelect.vue +81 -0
  26. package/src/component/FluxComment.vue +71 -0
  27. package/src/component/FluxConfirm.vue +42 -0
  28. package/src/component/FluxContainer.vue +23 -0
  29. package/src/component/FluxDataTable.vue +96 -0
  30. package/src/component/FluxDatePicker.vue +353 -0
  31. package/src/component/FluxDestructiveButton.vue +28 -0
  32. package/src/component/FluxDisabled.vue +22 -0
  33. package/src/component/FluxDivider.vue +37 -0
  34. package/src/component/FluxDotPattern.vue +72 -0
  35. package/src/component/FluxDropZone.vue +202 -0
  36. package/src/component/FluxDynamicView.vue +16 -0
  37. package/src/component/FluxExpandable.vue +119 -0
  38. package/src/component/FluxExpandableGroup.vue +53 -0
  39. package/src/component/FluxFader.vue +64 -0
  40. package/src/component/FluxFaderItem.vue +15 -0
  41. package/src/component/FluxFilter.vue +133 -0
  42. package/src/component/FluxFilterDate.vue +58 -0
  43. package/src/component/FluxFilterDateRange.vue +59 -0
  44. package/src/component/FluxFilterOption.vue +49 -0
  45. package/src/component/FluxFilterOptionAsync.vue +103 -0
  46. package/src/component/FluxFilterOptions.vue +62 -0
  47. package/src/component/FluxFilterOptionsAsync.vue +113 -0
  48. package/src/component/FluxFilterRange.vue +91 -0
  49. package/src/component/FluxFlickeringGrid.vue +141 -0
  50. package/src/component/FluxFlyout.vue +205 -0
  51. package/src/component/FluxFocalPointEditor.vue +137 -0
  52. package/src/component/FluxFocalPointImage.vue +29 -0
  53. package/src/component/FluxForm.vue +35 -0
  54. package/src/component/FluxFormColumn.vue +15 -0
  55. package/src/component/FluxFormDateInput.vue +92 -0
  56. package/src/component/FluxFormDateRangeInput.vue +87 -0
  57. package/src/component/FluxFormDateTimeInput.vue +120 -0
  58. package/src/component/FluxFormField.vue +98 -0
  59. package/src/component/FluxFormFieldAddition.vue +37 -0
  60. package/src/component/FluxFormInput.vue +223 -0
  61. package/src/component/FluxFormInputAddition.vue +31 -0
  62. package/src/component/FluxFormInputGroup.vue +25 -0
  63. package/src/component/FluxFormPinInput.vue +135 -0
  64. package/src/component/FluxFormRangeSlider.vue +179 -0
  65. package/src/component/FluxFormRow.vue +15 -0
  66. package/src/component/FluxFormSection.vue +23 -0
  67. package/src/component/FluxFormSelect.vue +59 -0
  68. package/src/component/FluxFormSelectAsync.vue +118 -0
  69. package/src/component/FluxFormSlider.vue +123 -0
  70. package/src/component/FluxFormTextArea.vue +53 -0
  71. package/src/component/FluxFormTimeZonePicker.vue +713 -0
  72. package/src/component/FluxGallery.vue +99 -0
  73. package/src/component/FluxGalleryItem.vue +49 -0
  74. package/src/component/FluxGrid.vue +28 -0
  75. package/src/component/FluxGridColumn.vue +31 -0
  76. package/src/component/FluxGridPattern.vue +60 -0
  77. package/src/component/FluxIcon.vue +79 -0
  78. package/src/component/FluxInfo.vue +28 -0
  79. package/src/component/FluxInfoStack.vue +17 -0
  80. package/src/component/FluxLegend.vue +27 -0
  81. package/src/component/FluxLink.vue +35 -0
  82. package/src/component/FluxMenu.vue +31 -0
  83. package/src/component/FluxMenuGroup.vue +21 -0
  84. package/src/component/FluxMenuItem.vue +84 -0
  85. package/src/component/FluxMenuOptions.vue +38 -0
  86. package/src/component/FluxMenuSubHeader.vue +33 -0
  87. package/src/component/FluxMenuTitle.vue +17 -0
  88. package/src/component/FluxNotice.vue +79 -0
  89. package/src/component/FluxNoticeStack.vue +17 -0
  90. package/src/component/FluxOverlay.vue +31 -0
  91. package/src/component/FluxPagination.vue +148 -0
  92. package/src/component/FluxPaginationBar.vue +81 -0
  93. package/src/component/FluxPane.vue +45 -0
  94. package/src/component/FluxPaneBody.vue +15 -0
  95. package/src/component/FluxPaneDeck.vue +24 -0
  96. package/src/component/FluxPaneFooter.vue +15 -0
  97. package/src/component/FluxPaneGroup.vue +15 -0
  98. package/src/component/FluxPaneHeader.vue +44 -0
  99. package/src/component/FluxPaneIllustration.vue +68 -0
  100. package/src/component/FluxPaneMedia.vue +31 -0
  101. package/src/component/FluxPercentageBar.vue +45 -0
  102. package/src/component/FluxPersona.vue +48 -0
  103. package/src/component/FluxPlaceholder.vue +56 -0
  104. package/src/component/FluxPressable.vue +77 -0
  105. package/src/component/FluxPrimaryButton.vue +28 -0
  106. package/src/component/FluxProgressBar.vue +75 -0
  107. package/src/component/FluxPrompt.vue +77 -0
  108. package/src/component/FluxPublishButton.vue +59 -0
  109. package/src/component/FluxQuantitySelector.vue +109 -0
  110. package/src/component/FluxRemove.vue +34 -0
  111. package/src/component/FluxRoot.vue +60 -0
  112. package/src/component/FluxSecondaryButton.vue +28 -0
  113. package/src/component/FluxSegmentedControl.vue +77 -0
  114. package/src/component/FluxSegmentedView.vue +15 -0
  115. package/src/component/FluxSeparator.vue +19 -0
  116. package/src/component/FluxSlideOver.vue +25 -0
  117. package/src/component/FluxSnackbar.vue +154 -0
  118. package/src/component/FluxSnackbarProvider.vue +34 -0
  119. package/src/component/FluxSpacer.vue +9 -0
  120. package/src/component/FluxSpacing.vue +32 -0
  121. package/src/component/FluxSpinner.vue +48 -0
  122. package/src/component/FluxSplitButton.vue +61 -0
  123. package/src/component/FluxStack.vue +40 -0
  124. package/src/component/FluxStatistic.vue +68 -0
  125. package/src/component/FluxStepper.vue +69 -0
  126. package/src/component/FluxStepperStep.vue +15 -0
  127. package/src/component/FluxStepperSteps.vue +62 -0
  128. package/src/component/FluxTab.vue +23 -0
  129. package/src/component/FluxTabBar.vue +87 -0
  130. package/src/component/FluxTabBarItem.vue +104 -0
  131. package/src/component/FluxTable.vue +68 -0
  132. package/src/component/FluxTableActions.vue +16 -0
  133. package/src/component/FluxTableCell.vue +47 -0
  134. package/src/component/FluxTableHeader.vue +111 -0
  135. package/src/component/FluxTableRow.vue +15 -0
  136. package/src/component/FluxTabs.vue +91 -0
  137. package/src/component/FluxTag.vue +85 -0
  138. package/src/component/FluxTagStack.vue +18 -0
  139. package/src/component/FluxTicks.vue +44 -0
  140. package/src/component/FluxTimeline.vue +17 -0
  141. package/src/component/FluxTimelineItem.vue +73 -0
  142. package/src/component/FluxToggle.vue +64 -0
  143. package/src/component/FluxToolbar.vue +32 -0
  144. package/src/component/FluxToolbarGroup.vue +18 -0
  145. package/src/component/FluxTooltip.vue +56 -0
  146. package/src/component/FluxTooltipProvider.vue +176 -0
  147. package/src/component/FluxWindow.vue +47 -0
  148. package/src/component/index.ts +142 -0
  149. package/src/component/primitive/Anchor.vue +17 -0
  150. package/src/component/primitive/AnchorPopup.vue +194 -0
  151. package/src/component/primitive/CoordinatePicker.vue +155 -0
  152. package/src/component/primitive/CoordinatePickerThumb.vue +71 -0
  153. package/src/component/primitive/FilterItem.vue +44 -0
  154. package/src/component/primitive/FilterMenuRenderer.ts +233 -0
  155. package/src/component/primitive/FilterOptionBase.vue +67 -0
  156. package/src/component/primitive/SelectBase.vue +340 -0
  157. package/src/component/primitive/SliderBase.vue +89 -0
  158. package/src/component/primitive/SliderThumb.vue +64 -0
  159. package/src/component/primitive/SliderTrack.vue +22 -0
  160. package/src/component/primitive/VNodeRenderer.ts +11 -0
  161. package/src/component/primitive/index.ts +10 -0
  162. package/src/composable/index.ts +9 -0
  163. package/src/composable/private/index.ts +3 -0
  164. package/src/composable/private/useFormSelect.ts +66 -0
  165. package/src/composable/private/useLoaded.ts +21 -0
  166. package/src/composable/private/useTranslate.ts +35 -0
  167. package/src/composable/useBreakpoints.ts +54 -0
  168. package/src/composable/useDisabled.ts +9 -0
  169. package/src/composable/useDisabledInjection.ts +6 -0
  170. package/src/composable/useExpandableGroupInjection.ts +10 -0
  171. package/src/composable/useFilterInjection.ts +22 -0
  172. package/src/composable/useFlyoutInjection.ts +10 -0
  173. package/src/composable/useFormFieldInjection.ts +8 -0
  174. package/src/composable/useTableInjection.ts +11 -0
  175. package/src/css/base.scss +33 -0
  176. package/src/css/component/Action.module.scss +107 -0
  177. package/src/css/component/Avatar.module.scss +177 -0
  178. package/src/css/component/Badge.module.scss +189 -0
  179. package/src/css/component/Button.module.scss +293 -0
  180. package/src/css/component/Calendar.module.scss +171 -0
  181. package/src/css/component/Chip.module.scss +58 -0
  182. package/src/css/component/Color.module.scss +184 -0
  183. package/src/css/component/Comment.module.scss +123 -0
  184. package/src/css/component/DatePicker.module.scss +193 -0
  185. package/src/css/component/Divider.module.scss +79 -0
  186. package/src/css/component/DropZone.module.scss +99 -0
  187. package/src/css/component/Expandable.module.scss +112 -0
  188. package/src/css/component/Fader.module.scss +38 -0
  189. package/src/css/component/Filter.module.scss +80 -0
  190. package/src/css/component/Flyout.module.scss +63 -0
  191. package/src/css/component/FocalPoint.module.scss +84 -0
  192. package/src/css/component/Form.module.scss +812 -0
  193. package/src/css/component/Gallery.module.scss +64 -0
  194. package/src/css/component/Grid.module.scss +24 -0
  195. package/src/css/component/Icon.module.scss +104 -0
  196. package/src/css/component/Info.module.scss +15 -0
  197. package/src/css/component/Layout.module.scss +63 -0
  198. package/src/css/component/Legend.module.scss +32 -0
  199. package/src/css/component/Menu.module.scss +314 -0
  200. package/src/css/component/Notice.module.scss +279 -0
  201. package/src/css/component/Overlay.module.scss +149 -0
  202. package/src/css/component/Pagination.module.scss +59 -0
  203. package/src/css/component/Pane.module.scss +218 -0
  204. package/src/css/component/PercentageBar.module.scss +31 -0
  205. package/src/css/component/Placeholder.module.scss +72 -0
  206. package/src/css/component/Progress.module.scss +84 -0
  207. package/src/css/component/Remove.module.scss +29 -0
  208. package/src/css/component/Root.module.scss +8 -0
  209. package/src/css/component/SegmentedControl.module.scss +82 -0
  210. package/src/css/component/Snackbar.module.scss +227 -0
  211. package/src/css/component/Spinner.module.scss +36 -0
  212. package/src/css/component/Statistic.module.scss +118 -0
  213. package/src/css/component/Stepper.module.scss +103 -0
  214. package/src/css/component/Tab.module.scss +162 -0
  215. package/src/css/component/Table.module.scss +164 -0
  216. package/src/css/component/Timeline.module.scss +173 -0
  217. package/src/css/component/Toolbar.module.scss +82 -0
  218. package/src/css/component/Tooltip.module.scss +62 -0
  219. package/src/css/component/Transition.module.scss +142 -0
  220. package/src/css/component/Visual.module.scss +70 -0
  221. package/src/css/component/base/Button.module.scss +87 -0
  222. package/src/css/component/base/Effect.module.scss +139 -0
  223. package/src/css/component/base/Grid.module.scss +8 -0
  224. package/src/css/component/base/Pane.module.scss +54 -0
  225. package/src/css/component/primitive/CoordinatePicker.module.scss +24 -0
  226. package/src/css/component/primitive/Slider.module.scss +116 -0
  227. package/src/css/index.scss +5 -0
  228. package/src/css/layers.scss +1 -0
  229. package/src/css/mixin/breakpoints.scss +112 -0
  230. package/src/css/mixin/focus-ring.scss +56 -0
  231. package/src/css/mixin/hover.scss +7 -0
  232. package/src/css/mixin/index.scss +3 -0
  233. package/src/css/reset.scss +169 -0
  234. package/src/css/typography.scss +87 -0
  235. package/src/css/variables.scss +214 -0
  236. package/src/data/di.ts +42 -0
  237. package/src/data/filter.ts +9 -0
  238. package/src/data/helper.ts +9 -0
  239. package/src/data/i18n.ts +55 -0
  240. package/src/data/iconRegistry.ts +21 -0
  241. package/src/data/index.ts +8 -0
  242. package/src/data/inputMask.ts +34 -0
  243. package/src/data/store.ts +233 -0
  244. package/src/image/avatar-mask.svg +3 -0
  245. package/src/index.ts +25 -0
  246. package/src/transition/FluxAutoHeightTransition.vue +59 -0
  247. package/src/transition/FluxAutoWidthTransition.vue +59 -0
  248. package/src/transition/FluxBreakthroughTransition.vue +23 -0
  249. package/src/transition/FluxFadeTransition.vue +24 -0
  250. package/src/transition/FluxOverlayTransition.vue +22 -0
  251. package/src/transition/FluxRouteTransition.vue +23 -0
  252. package/src/transition/FluxSlideOverTransition.vue +22 -0
  253. package/src/transition/FluxTooltipTransition.vue +22 -0
  254. package/src/transition/FluxVerticalWindowTransition.vue +23 -0
  255. package/src/transition/FluxWindowTransition.vue +23 -0
  256. package/src/transition/index.ts +10 -0
  257. package/src/util/createDialogRenderer.ts +64 -0
  258. package/src/util/createLabelForDateRange.ts +61 -0
  259. package/src/util/index.ts +2 -0
  260. package/src/vite.d.ts +13 -0
  261. package/tsconfig.json +45 -0
@@ -0,0 +1,812 @@
1
+ @use '$flux/css/mixin';
2
+
3
+ @value button, buttonLabel from './base/Button.module.scss';
4
+ @value basePaneStructure from './base/Pane.module.scss';
5
+
6
+ %-form-input-group-inner-styles {
7
+ height: 100%;
8
+ min-height: unset;
9
+ border: 0;
10
+ border-radius: 0;
11
+
12
+ @include mixin.focus-ring-remove();
13
+
14
+ &:first-child {
15
+ border-top-left-radius: calc(var(--radius) - 1px);
16
+ border-bottom-left-radius: calc(var(--radius) - 1px);
17
+ }
18
+
19
+ &:last-child {
20
+ border-top-right-radius: calc(var(--radius) - 1px);
21
+ border-bottom-right-radius: calc(var(--radius) - 1px);
22
+ }
23
+ }
24
+
25
+ .formStructureElement {
26
+ display: flex;
27
+ flex-flow: column;
28
+ }
29
+
30
+ .form {
31
+ composes: formStructureElement;
32
+ gap: 42px;
33
+ }
34
+
35
+ :local(.pane) > .form {
36
+ display: contents;
37
+ gap: 0;
38
+ }
39
+
40
+ .formColumn,
41
+ .formSection {
42
+ composes: formStructureElement;
43
+ gap: 18px;
44
+ }
45
+
46
+ .form,
47
+ .formColumn,
48
+ .formSection {
49
+ > :local(.button) {
50
+ align-self: flex-start;
51
+ }
52
+ }
53
+
54
+ .formRow {
55
+ display: flex;
56
+ flex-grow: 1;
57
+ gap: 12px;
58
+ }
59
+
60
+ .formSectionTitle {
61
+ color: var(--foreground-prominent);
62
+ font-size: 18px;
63
+ font-weight: 800;
64
+ }
65
+
66
+ .formField {
67
+ display: flex;
68
+ flex: 1 1 0;
69
+ flex-flow: column;
70
+ gap: 6px;
71
+ }
72
+
73
+ .formFieldHeader {
74
+ display: flex;
75
+ margin-bottom: 0;
76
+ width: 100%;
77
+ align-items: center;
78
+ align-self: flex-start;
79
+ gap: 6px;
80
+ font-size: unset;
81
+ }
82
+
83
+ .formFieldLabel {
84
+ min-height: 1.6em;
85
+ color: var(--foreground-prominent);
86
+ font-weight: 600;
87
+ }
88
+
89
+ .formFieldOptional {
90
+ color: var(--foreground-secondary);
91
+ font-size: .85em;
92
+ }
93
+
94
+ .formFieldValue {
95
+ margin-left: auto;
96
+ color: var(--foreground-secondary);
97
+ font-size: .85em;
98
+ }
99
+
100
+ .formFieldCounter {
101
+ margin-left: auto;
102
+ color: var(--foreground-secondary);
103
+ font-size: .85em;
104
+ white-space: nowrap;
105
+ }
106
+
107
+ .formFieldAddition {
108
+ display: flex;
109
+ gap: 9px;
110
+ font-size: 14px;
111
+ }
112
+
113
+ .formFieldAdditionIcon {
114
+ margin-top: 3px;
115
+ }
116
+
117
+ .formFieldAdditionError {
118
+ composes: formFieldAddition;
119
+
120
+ color: rgb(var(--danger-7));
121
+ }
122
+
123
+ .formFieldAdditionHint {
124
+ composes: formFieldAddition;
125
+
126
+ color: var(--foreground-secondary);
127
+ }
128
+
129
+ .formInput {
130
+ position: relative;
131
+ display: block;
132
+ height: 42px;
133
+ width: 100%;
134
+ padding: 0 12px;
135
+ align-self: start;
136
+ background: rgb(var(--gray-0));
137
+ background-clip: padding-box;
138
+ border: 1px solid rgb(var(--gray-3));
139
+ border-radius: var(--radius);
140
+ box-shadow: var(--shadow-px);
141
+ color: var(--foreground);
142
+ transition: 180ms var(--swift-out);
143
+ transition-property: background, border-color, mixin.focus-ring-transition-properties();
144
+
145
+ &::placeholder {
146
+ color: var(--foreground-secondary);
147
+ }
148
+
149
+ &.isSecondary {
150
+ background: rgb(var(--gray-2));
151
+ border-color: transparent;
152
+ box-shadow: none;
153
+ }
154
+ }
155
+
156
+ .formInputDisabled {
157
+ composes: formInput;
158
+
159
+ background: rgb(var(--gray-2));
160
+ cursor: not-allowed;
161
+
162
+ input {
163
+ cursor: inherit;
164
+ }
165
+ }
166
+
167
+ .formInputEnabled {
168
+ composes: formInput;
169
+
170
+ @include mixin.focus-ring(-1px, true);
171
+
172
+ @include mixin.hover {
173
+ border-color: rgb(var(--gray-4));
174
+ }
175
+ }
176
+
177
+ .formInputIcon {
178
+ position: absolute;
179
+ margin-top: 11px;
180
+ margin-bottom: 11px;
181
+ color: var(--foreground-secondary);
182
+ pointer-events: none;
183
+ }
184
+
185
+ .formInputIconTrailing {
186
+ composes: formInputIcon;
187
+
188
+ right: 12px;
189
+ }
190
+
191
+ .formInputIconLeading {
192
+ composes: formInputIcon;
193
+
194
+ left: 12px;
195
+ }
196
+
197
+ .formInputIconPasswordToggle {
198
+ composes: formInputIconTrailing;
199
+
200
+ pointer-events: unset;
201
+ cursor: pointer;
202
+
203
+ @include mixin.hover {
204
+ color: var(--foreground);
205
+ }
206
+ }
207
+
208
+ .formInputNative {
209
+ position: absolute;
210
+ inset: 0;
211
+ height: 100%;
212
+ width: 100%;
213
+ padding: 0 12px;
214
+ background: unset;
215
+ border: 0;
216
+ border-radius: inherit;
217
+ color: inherit;
218
+ font: inherit;
219
+ outline: 0;
220
+ text-align: left;
221
+
222
+ &::placeholder {
223
+ color: var(--foreground-secondary);
224
+ }
225
+
226
+ &::-webkit-search-decoration,
227
+ &::-webkit-search-cancel-button,
228
+ &::-webkit-search-results-button,
229
+ &::-webkit-search-results-decoration {
230
+ -webkit-appearance: none;
231
+ }
232
+
233
+ &::-webkit-color-swatch {
234
+ border: 0;
235
+ border-radius: calc(var(--radius) / 2);
236
+ }
237
+
238
+ &::-webkit-color-swatch-wrapper {
239
+ margin: 0 -12px;
240
+ padding: 3px;
241
+ width: calc(100% + 24px);
242
+ }
243
+ }
244
+
245
+ .formInputNativeHasIconLeading {
246
+ padding-left: 42px;
247
+ }
248
+
249
+ .formInputNativeHasIconTrailing {
250
+ padding-right: 42px;
251
+ }
252
+
253
+ .formInputAddition {
254
+ composes: formInput;
255
+
256
+ display: flex;
257
+ width: unset;
258
+ align-items: center;
259
+ flex-grow: 0;
260
+ justify-content: center;
261
+ background: rgb(var(--gray-1));
262
+ color: var(--foreground-secondary);
263
+ pointer-events: none;
264
+
265
+ &:has(+ .formInput .formInputNative) {
266
+ border-right: 1px solid rgb(var(--gray-3));
267
+ }
268
+
269
+ + .formInputAddition {
270
+ border-left: 1px solid rgb(var(--gray-3));
271
+ }
272
+
273
+ @at-root .formInput:has(.formInputNative) + & {
274
+ border-left: 1px solid rgb(var(--gray-3));
275
+ }
276
+ }
277
+
278
+ .formInputGroup {
279
+ composes: formInputEnabled;
280
+
281
+ display: flex;
282
+ padding: 0;
283
+
284
+ @include mixin.focus-ring(-1px, true);
285
+
286
+ > :is(.formInput, .formSelect, :local(.button)) {
287
+ @extend %-form-input-group-inner-styles;
288
+
289
+ + :is(:local(.button), :local(.buttonGroup)) {
290
+ margin: 0;
291
+ border-left: 1px solid rgb(var(--gray-3));
292
+ }
293
+ }
294
+
295
+ > :local(.buttonGroup) > :local(.button) {
296
+ @extend %-form-input-group-inner-styles;
297
+
298
+ + :local(.button) {
299
+ margin: 0;
300
+ border-left: 1px solid rgb(var(--gray-3));
301
+ }
302
+ }
303
+
304
+ > :local(.buttonGroup):not(:first-child) > :local(.button):first-child {
305
+ border-top-left-radius: 0;
306
+ border-bottom-left-radius: 0;
307
+ }
308
+
309
+ &.isSecondary {
310
+ .formInput {
311
+ background: transparent;
312
+ border-color: transparent;
313
+ box-shadow: none;
314
+ }
315
+
316
+ .formInputAddition:not(:last-child) {
317
+ padding-right: 0;
318
+ }
319
+
320
+ .secondaryButton {
321
+ background: transparent;
322
+ border-color: rgb(var(--gray-3));
323
+ box-shadow: none;
324
+
325
+ @include mixin.hover {
326
+ background: rgb(var(--gray-3));
327
+ }
328
+ }
329
+ }
330
+ }
331
+
332
+ .formDateInput {
333
+ cursor: default;
334
+
335
+ :is(input) {
336
+ text-align: left;
337
+
338
+ &::-webkit-input-placeholder {
339
+ visibility: hidden;
340
+ }
341
+
342
+ &::-webkit-calendar-picker-indicator {
343
+ display: none;
344
+ -webkit-appearance: none;
345
+ }
346
+ }
347
+ }
348
+
349
+ .formDateRangeInput {
350
+ composes: formInput;
351
+
352
+ display: flex;
353
+ align-items: center;
354
+ cursor: default;
355
+ }
356
+
357
+ .formDateTimeInput {
358
+ .formInput:last-child {
359
+ max-width: 99px;
360
+ }
361
+
362
+ .inputGroup {
363
+ flex-grow: 1;
364
+ }
365
+ }
366
+
367
+ .formTimeInput {
368
+ composes: formDateInput;
369
+ }
370
+
371
+ .formSelect {
372
+ composes: formInput;
373
+
374
+ position: relative;
375
+ display: flex;
376
+ height: unset;
377
+ min-height: 42px;
378
+ padding: 0 39px 0 6px;
379
+ align-items: center;
380
+ flex-wrap: wrap;
381
+ gap: 0 6px;
382
+ cursor: pointer;
383
+
384
+ &:not(.isDisabled) {
385
+ @include mixin.focus-ring(-1px, true);
386
+
387
+ @include mixin.hover {
388
+ border-color: rgb(var(--gray-4));
389
+ }
390
+ }
391
+
392
+ &.isDisabled {
393
+ cursor: not-allowed;
394
+ }
395
+
396
+ &.isFocused {
397
+ @include mixin.focus-outline-visible(-1px);
398
+ }
399
+
400
+ .badge {
401
+ margin-top: 6px;
402
+ margin-bottom: 6px;
403
+ max-width: 100%;
404
+ flex: 0 0 auto;
405
+ }
406
+ }
407
+
408
+ .formSelectIcon {
409
+ position: absolute;
410
+ top: 50%;
411
+ right: 12px;
412
+ translate: 0 -50%;
413
+ }
414
+
415
+ .formSelectInput {
416
+ position: sticky;
417
+ top: 0;
418
+ height: 48px;
419
+ margin-bottom: 9px;
420
+ background: rgb(var(--gray-0));
421
+ border-top: 0;
422
+ border-left: 0;
423
+ border-right: 0;
424
+ border-radius: 0;
425
+ outline: 0;
426
+ z-index: 2;
427
+
428
+ @include mixin.focus-ring-remove;
429
+
430
+ .formInputIcon {
431
+ margin: 15px;
432
+ font-size: 18px;
433
+ }
434
+
435
+ .formInputNative {
436
+ padding-left: 21px;
437
+ padding-right: 21px;
438
+ }
439
+ }
440
+
441
+ .formSelectPlaceholder {
442
+ margin-left: 6px;
443
+ margin-right: 6px;
444
+ color: var(--foreground-secondary);
445
+ user-select: none;
446
+ }
447
+
448
+ .formSelectPopup {
449
+ composes: basePaneStructure;
450
+
451
+ position: fixed;
452
+ display: block;
453
+ top: 0;
454
+ left: 0;
455
+ width: var(--width, auto);
456
+ max-height: max(330px, 50dvh);
457
+ min-width: 120px;
458
+ box-shadow: var(--shadow-md);
459
+ overflow: auto;
460
+ translate: var(--x) var(--y);
461
+ z-index: 10000;
462
+
463
+ .menuItem {
464
+ contain-intrinsic-size: #{'auto 42px'};
465
+ content-visibility: auto;
466
+ }
467
+
468
+ &.isKeyboardAction .menuItem {
469
+ transition: 0s;
470
+ }
471
+
472
+ &.isSearchable .menuSubHeader {
473
+ top: 48px;
474
+ }
475
+ }
476
+
477
+ .formSelectSelected {
478
+ position: absolute;
479
+ height: 100%;
480
+ padding-left: 12px;
481
+ padding-right: 42px;
482
+ inset: -1px;
483
+ pointer-events: none;
484
+
485
+ :local(.buttonLabel) {
486
+ overflow: hidden;
487
+ text-overflow: ellipsis;
488
+ white-space: nowrap;
489
+ }
490
+ }
491
+
492
+ .isDisabled .formSelectIcon {
493
+ opacity: .5;
494
+ }
495
+
496
+ .isDisabled .formSelectSelected {
497
+ background: rgb(var(--gray-2));
498
+ border: 1px solid rgb(var(--gray-3));
499
+ color: var(--foreground-secondary);
500
+ opacity: 1;
501
+ }
502
+
503
+ .formTextArea {
504
+ height: unset;
505
+ // 18px = padding / 2px = border
506
+ min-height: calc(18px + 2px + var(--rows, 1) * 1lh);
507
+ padding-top: 9px;
508
+ padding-bottom: 9px;
509
+ flex-shrink: 0;
510
+ field-sizing: content;
511
+ resize: vertical;
512
+ }
513
+
514
+ .formTextAreaDisabled {
515
+ composes: formInputDisabled;
516
+ composes: formTextArea;
517
+ }
518
+
519
+ .formTextAreaEnabled {
520
+ composes: formInputEnabled;
521
+ composes: formTextArea;
522
+ }
523
+
524
+ .checkbox {
525
+ display: inline-flex;
526
+ flex-shrink: 0;
527
+ gap: 12px;
528
+ outline: 0;
529
+ }
530
+
531
+ .checkboxElement,
532
+ .checkboxNative {
533
+ margin: 1px 0;
534
+ height: 22px;
535
+ width: 22px;
536
+ }
537
+
538
+ .checkboxElement {
539
+ position: relative;
540
+ display: inline-flex;
541
+ height: 22px;
542
+ width: 22px;
543
+ padding: 0;
544
+ align-items: center;
545
+ justify-content: center;
546
+ background: rgb(var(--gray-3));
547
+ border: 0;
548
+ border-radius: calc(var(--radius) / 2);
549
+ color: rgb(var(--primary-0));
550
+ cursor: pointer;
551
+ pointer-events: none;
552
+ transition: 210ms var(--swift-out);
553
+ transition-property: background, color, mixin.focus-ring-transition-properties();
554
+
555
+ @include mixin.focus-outline;
556
+
557
+ .icon {
558
+ opacity: 0;
559
+ scale: .85;
560
+ transition: inherit;
561
+ transition-property: opacity;
562
+
563
+ :is(path) {
564
+ stroke: white;
565
+ stroke-width: 54px;
566
+ }
567
+ }
568
+ }
569
+
570
+ .checkboxLabel {
571
+ align-self: center;
572
+ }
573
+
574
+ .checkboxNative {
575
+ position: absolute;
576
+ opacity: 0;
577
+
578
+ @include mixin.hover {
579
+ + .checkboxElement {
580
+ background: rgb(var(--gray-4));
581
+ }
582
+ }
583
+
584
+ &:is(:checked, :indeterminate) + .checkboxElement {
585
+ background: rgb(var(--primary-7));
586
+
587
+ .icon {
588
+ opacity: 1;
589
+ }
590
+ }
591
+
592
+ &:focus-visible + .checkboxElement {
593
+ @include mixin.focus-outline-visible(2px);
594
+ }
595
+ }
596
+
597
+ .quantitySelector {
598
+ align-self: center;
599
+ justify-self: center;
600
+ border: 1px solid rgb(var(--gray-3));
601
+ border-radius: var(--radius);
602
+ box-shadow: var(--shadow-px);
603
+ overflow: hidden;
604
+
605
+ @include mixin.focus-ring-transition(2px, true);
606
+
607
+ @include mixin.hover {
608
+ border-color: rgb(var(--gray-4));
609
+ }
610
+ }
611
+
612
+ .quantitySelectorButton {
613
+ margin: -1px;
614
+ border: 0;
615
+
616
+ &:first-child {
617
+ margin-right: 0;
618
+ }
619
+
620
+ &:last-child {
621
+ margin-left: 0;
622
+ }
623
+
624
+ &,
625
+ &:focus-visible,
626
+ &:focus-within {
627
+ outline: 0;
628
+ }
629
+ }
630
+
631
+ .quantitySelectorInput {
632
+ composes: formInput;
633
+
634
+ margin: -1px 0;
635
+ padding-left: 0;
636
+ padding-right: 0;
637
+ border-radius: 0;
638
+ font-variant-numeric: tabular-nums;
639
+ font-weight: 700;
640
+ text-align: center;
641
+
642
+ &:hover {
643
+ border-color: rgb(var(--gray-3));
644
+ }
645
+
646
+ &,
647
+ &:focus-visible,
648
+ &:focus-within {
649
+ outline: 0 !important;
650
+ }
651
+
652
+ & {
653
+ -moz-appearance: textfield;
654
+ }
655
+
656
+ &::-webkit-outer-spin-button,
657
+ &::-webkit-inner-spin-button {
658
+ -webkit-appearance: none;
659
+ margin: 0;
660
+ }
661
+ }
662
+
663
+ .pinInput {
664
+ display: grid;
665
+ width: min-content;
666
+ gap: .4ch;
667
+ grid-template-columns: repeat(var(--max-length, 0), 1fr);
668
+ margin: 0;
669
+ padding: 0;
670
+ border: 0;
671
+ font-size: 24px;
672
+ font-weight: 700;
673
+ }
674
+
675
+ .pinInputField {
676
+ padding: 0;
677
+ width: 2.7ch;
678
+ background-clip: padding-box;
679
+ border: 1px solid rgb(var(--gray-3));
680
+ border-radius: var(--radius);
681
+ box-shadow: var(--shadow-px);
682
+ font: inherit;
683
+ line-height: 3.3ch;
684
+ outline: 0;
685
+ text-align: center;
686
+ transition: 180ms var(--swift-out);
687
+ transition-property: border-color, mixin.focus-ring-transition-properties();
688
+ }
689
+
690
+ .pinInputEnabled {
691
+ composes: pinInput;
692
+
693
+ .pinInputField {
694
+ background-color: rgb(var(--gray-0));
695
+ color: var(--foreground-prominent);
696
+
697
+ @include mixin.focus-ring(-1px, true);
698
+ }
699
+ }
700
+
701
+ .pinInputDisabled {
702
+ composes: pinInput;
703
+
704
+ .pinInputField {
705
+ background-color: rgb(var(--gray-2));
706
+ color: var(--foreground-secondary);
707
+ cursor: not-allowed;
708
+ }
709
+ }
710
+
711
+ .toggle {
712
+ position: relative;
713
+ display: block;
714
+ width: 54px;
715
+ height: 30px;
716
+ flex: 0 0 auto;
717
+ background: rgb(var(--gray-2));
718
+ border-radius: 99px;
719
+ contain: paint;
720
+
721
+ &.isChecked {
722
+ .toggleInput::after {
723
+ translate: 24px 0;
724
+ }
725
+
726
+ &:not(.isSwitch) {
727
+ background: rgb(var(--primary-7));
728
+
729
+ .toggleIcon {
730
+ color: rgb(var(--primary-0));
731
+ }
732
+
733
+ .toggleInput::after {
734
+ border-color: transparent;
735
+ }
736
+ }
737
+
738
+ .toggleIconOn {
739
+ translate: calc(-50% + 24px) -50%;
740
+ }
741
+ }
742
+
743
+ &:not(.isChecked) .toggleIconOff {
744
+ translate: calc(-50% - 24px) -50%;
745
+ }
746
+
747
+ &.isDisabled {
748
+ cursor: not-allowed;
749
+ opacity: .6;
750
+ }
751
+ }
752
+
753
+ .toggleIcon {
754
+ position: absolute;
755
+ top: 50%;
756
+ color: var(--foreground-secondary);
757
+ pointer-events: none;
758
+ translate: -50% -50%;
759
+ }
760
+
761
+ .toggleIconOff {
762
+ composes: toggleIcon;
763
+
764
+ left: 15px;
765
+ }
766
+
767
+ .toggleIconOn {
768
+ composes: toggleIcon;
769
+
770
+ left: 39px;
771
+ }
772
+
773
+ .toggleInput {
774
+ -webkit-appearance: none;
775
+ appearance: none;
776
+
777
+ position: relative;
778
+ display: block;
779
+ margin: 0;
780
+ height: inherit;
781
+ width: inherit;
782
+ background: unset;
783
+ border: 0;
784
+ border-radius: inherit;
785
+ cursor: pointer;
786
+ outline: 0;
787
+
788
+ @include mixin.focus-ring(2px);
789
+
790
+ &::after {
791
+ position: absolute;
792
+ display: block;
793
+ top: 3px;
794
+ left: 3px;
795
+ height: 24px;
796
+ width: 24px;
797
+ content: '';
798
+ background: rgb(var(--gray-0));
799
+ background-clip: padding-box;
800
+ border: 1px solid rgb(var(--gray-3));
801
+ border-radius: 99px;
802
+ box-shadow: var(--shadow-sm);
803
+ }
804
+ }
805
+
806
+ .toggle,
807
+ .toggleIcon,
808
+ .toggleInput,
809
+ .toggleInput::after {
810
+ transition: 210ms var(--swift-out);
811
+ transition-property: background, border-color, color, opacity, scale, translate, mixin.focus-ring-transition-properties();
812
+ }