@teambit/compositions 1.0.871 → 1.0.873

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.
@@ -1,5 +1,5 @@
1
- import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.compositions_compositions@1.0.871/dist/compositions.composition.js';
2
- import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.compositions_compositions@1.0.871/dist/compositions.docs.mdx';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.compositions_compositions@1.0.873/dist/compositions.composition.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.compositions_compositions@1.0.873/dist/compositions.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
@@ -67,6 +67,13 @@ function _designInputs5() {
67
67
  };
68
68
  return data;
69
69
  }
70
+ function _useOverlay() {
71
+ const data = require("./use-overlay");
72
+ _useOverlay = function () {
73
+ return data;
74
+ };
75
+ return data;
76
+ }
70
77
  function _liveControlInputModule() {
71
78
  const data = _interopRequireDefault(require("./live-control-input.module.scss"));
72
79
  _liveControlInputModule = function () {
@@ -74,9 +81,15 @@ function _liveControlInputModule() {
74
81
  };
75
82
  return data;
76
83
  }
84
+ function _overlayModule() {
85
+ const data = _interopRequireDefault(require("./overlay.module.scss"));
86
+ _overlayModule = function () {
87
+ return data;
88
+ };
89
+ return data;
90
+ }
77
91
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
78
- /* eslint-disable no-console */
79
-
92
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } /* eslint-disable no-console */
80
93
  function ShortTextInput({
81
94
  value,
82
95
  onChange
@@ -119,37 +132,50 @@ function SelectInput({
119
132
  meta
120
133
  }) {
121
134
  const [selectedValue, setSelectedValue] = _react().default.useState(value || '');
135
+ const [open, setOpen] = _react().default.useState(false);
136
+ const triggerRef = _react().default.useRef(null);
122
137
  _react().default.useEffect(() => {
123
138
  setSelectedValue(value || '');
124
139
  }, [value]);
125
- const handleChange = newValue => {
126
- onChange(newValue || '');
127
- setSelectedValue(newValue || '');
128
- };
129
140
  const options = _react().default.useMemo(() => {
130
- if (!meta || !meta.options) return [];
131
- return meta.options.map(option => {
132
- if (typeof option === 'string') {
133
- return {
134
- label: option,
135
- value: option
136
- };
137
- }
138
- return option;
139
- });
141
+ if (!meta?.options) return [];
142
+ return meta.options.map(o => typeof o === 'string' ? {
143
+ label: o,
144
+ value: o
145
+ } : o);
140
146
  }, [meta]);
141
147
  const placeholderContent = options.find(o => o.value === selectedValue)?.label;
148
+ const {
149
+ position,
150
+ style
151
+ } = (0, _useOverlay().useOverlay)(triggerRef, open, 0, {
152
+ paddingTop: 8,
153
+ paddingBottom: 8
154
+ });
155
+ const commitSelection = v => {
156
+ onChange(v);
157
+ setSelectedValue(v);
158
+ setOpen(false);
159
+ };
142
160
  return /*#__PURE__*/_react().default.createElement("p", {
161
+ ref: triggerRef,
143
162
  className: (0, _classnames().default)(_liveControlInputModule().default.wrapper)
144
163
  }, /*#__PURE__*/_react().default.createElement(_designInputs3().Dropdown, {
145
- placeholderContent: placeholderContent
146
- }, options.map(option => {
147
- return /*#__PURE__*/_react().default.createElement(_designInputsSelectors().MenuItem, {
148
- active: option.value === selectedValue,
149
- key: option.value,
150
- onClick: () => handleChange(option.value)
151
- }, option.label);
152
- })));
164
+ placeholderContent: placeholderContent,
165
+ open: open,
166
+ onChange: (_, isOpen) => setOpen(isOpen),
167
+ position: position,
168
+ dropClass: _overlayModule().default.suppressNativeMenu
169
+ }), open && style && /*#__PURE__*/_react().default.createElement(_useOverlay().BitPortal, null, /*#__PURE__*/_react().default.createElement("div", {
170
+ className: _overlayModule().default.overlay,
171
+ style: style,
172
+ onMouseDown: e => e.stopPropagation()
173
+ }, options.map(option => /*#__PURE__*/_react().default.createElement(_designInputsSelectors().MenuItem, {
174
+ className: _liveControlInputModule().default.portalMenuItem,
175
+ key: option.value,
176
+ active: option.value === selectedValue,
177
+ onClick: () => commitSelection(option.value)
178
+ }, option.label)))));
153
179
  }
154
180
  function NumberInput({
155
181
  value,
@@ -176,6 +202,36 @@ function NumberInput({
176
202
  onChange: handleChange
177
203
  });
178
204
  }
205
+ function ColorPickerPortal(props) {
206
+ const [open, setOpen] = _react().default.useState(false);
207
+ const triggerRef = _react().default.useRef(null);
208
+ const {
209
+ position,
210
+ style
211
+ } = (0, _useOverlay().useOverlay)(triggerRef, open, 4, {
212
+ padding: 16
213
+ });
214
+ return /*#__PURE__*/_react().default.createElement("div", {
215
+ ref: triggerRef
216
+ }, /*#__PURE__*/_react().default.createElement(_designUiInput().ColorPicker, _extends({}, props, {
217
+ open: open,
218
+ onChange: (_, isOpen) => setOpen(isOpen),
219
+ position: position,
220
+ dropClass: _overlayModule().default.suppressNativeMenu
221
+ })), open && style && /*#__PURE__*/_react().default.createElement(_useOverlay().BitPortal, null, /*#__PURE__*/_react().default.createElement("div", {
222
+ className: _overlayModule().default.overlay,
223
+ style: style,
224
+ onMouseDown: e => e.stopPropagation()
225
+ }, /*#__PURE__*/_react().default.createElement(_designUiInput().ColorsBox, {
226
+ onColorSelect: color => {
227
+ props.onColorSelect?.(color);
228
+ setOpen(false);
229
+ },
230
+ colorsList: props.colorsList,
231
+ showNoColor: props.showNoColor,
232
+ selected: props.value ?? ''
233
+ }))));
234
+ }
179
235
  function ColorInput({
180
236
  value,
181
237
  onChange
@@ -184,13 +240,13 @@ function ColorInput({
184
240
  _react().default.useEffect(() => {
185
241
  setInputValue(value || '');
186
242
  }, [value]);
187
- const handleChange = newValue => {
188
- onChange(newValue || '');
189
- setInputValue(newValue || '');
243
+ const handleChange = v => {
244
+ onChange(v);
245
+ setInputValue(v);
190
246
  };
191
247
  return /*#__PURE__*/_react().default.createElement("p", {
192
- className: (0, _classnames().default)(_liveControlInputModule().default.wrapper)
193
- }, /*#__PURE__*/_react().default.createElement(_designUiInput().ColorPicker, {
248
+ className: _liveControlInputModule().default.wrapper
249
+ }, /*#__PURE__*/_react().default.createElement(ColorPickerPortal, {
194
250
  value: inputValue,
195
251
  onColorSelect: handleChange,
196
252
  allowCustomColor: true
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireDefault","require","_classnames","_designInputs","_designInputs2","_designInputs3","_designInputsSelectors","_designUiInput","_designInputs4","_designInputs5","_liveControlInputModule","e","__esModule","default","ShortTextInput","value","onChange","inputValue","setInputValue","React","useState","useEffect","handleChange","newValue","target","createElement","InputText","LongTextInput","TextArea","SelectInput","meta","selectedValue","setSelectedValue","options","useMemo","map","option","label","placeholderContent","find","o","className","classNames","styles","wrapper","Dropdown","MenuItem","active","key","onClick","NumberInput","isNaN","Number","console","error","type","ColorInput","ColorPicker","onColorSelect","allowCustomColor","DateInput","Date","toISOString","split","DatePicker","date","ToggleInput","isChecked","setIsChecked","Toggle","defaultChecked","JsonInput","JSON","stringify","message","setMessage","parsedValue","parse","style","color","getInputComponent","warn"],"sources":["live-control-input.tsx"],"sourcesContent":["/* eslint-disable no-console */\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport { InputText } from '@teambit/design.inputs.input-text';\nimport { TextArea } from '@teambit/design.inputs.text-area';\nimport { Dropdown } from '@teambit/design.inputs.dropdown';\nimport { MenuItem } from '@teambit/design.inputs.selectors.menu-item';\nimport { ColorPicker } from '@teambit/design.ui.input.color-picker';\nimport { DatePicker } from '@teambit/design.inputs.date-picker';\nimport { Toggle } from '@teambit/design.inputs.toggle-switch';\n\nimport { type SelectOption } from '@teambit/compositions.ui.composition-live-controls';\n\nimport styles from './live-control-input.module.scss';\n\ntype InputComponentProps = {\n id: string;\n value: any;\n onChange: (value: any) => void;\n meta?: any;\n};\n\ntype InputComponent = React.FC<InputComponentProps>;\n\nfunction ShortTextInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(value || '');\n\n React.useEffect(() => {\n setInputValue(value || '');\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n onChange(newValue || '');\n setInputValue(newValue || '');\n };\n\n return <InputText value={inputValue} onChange={handleChange} />;\n}\n\nfunction LongTextInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(value || '');\n\n React.useEffect(() => {\n setInputValue(value || '');\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n onChange(newValue || '');\n setInputValue(newValue || '');\n };\n\n return <TextArea value={inputValue} onChange={handleChange} />;\n}\n\nfunction SelectInput({ value, onChange, meta }: InputComponentProps) {\n const [selectedValue, setSelectedValue] = React.useState(value || '');\n\n React.useEffect(() => {\n setSelectedValue(value || '');\n }, [value]);\n\n const handleChange = (newValue: any) => {\n onChange(newValue || '');\n setSelectedValue(newValue || '');\n };\n\n const options: {\n label: string;\n value: string;\n }[] = React.useMemo(() => {\n if (!meta || !meta.options) return [];\n return meta.options.map((option: SelectOption) => {\n if (typeof option === 'string') {\n return { label: option, value: option };\n }\n return option;\n });\n }, [meta]);\n\n const placeholderContent = options.find((o) => o.value === selectedValue)?.label;\n\n return (\n <p className={classNames(styles.wrapper)}>\n <Dropdown placeholderContent={placeholderContent}>\n {options.map((option) => {\n return (\n <MenuItem\n active={option.value === selectedValue}\n key={option.value}\n onClick={() => handleChange(option.value)}\n >\n {option.label}\n </MenuItem>\n );\n })}\n </Dropdown>\n </p>\n );\n}\n\nfunction NumberInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(value || 0);\n\n React.useEffect(() => {\n setInputValue(value || 0);\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!isNaN(Number(newValue))) {\n onChange(Number(newValue) || 0);\n setInputValue(Number(newValue) || 0);\n } else {\n // TODO: render error message\n // eslint-disable-next-line no-console\n console.error('Invalid number input', newValue);\n }\n };\n\n return <InputText type=\"number\" value={inputValue} onChange={handleChange} />;\n}\n\nfunction ColorInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(value || '');\n\n React.useEffect(() => {\n setInputValue(value || '');\n }, [value]);\n\n const handleChange = (newValue: string) => {\n onChange(newValue || '');\n setInputValue(newValue || '');\n };\n\n return (\n <p className={classNames(styles.wrapper)}>\n <ColorPicker value={inputValue} onColorSelect={handleChange} allowCustomColor />\n </p>\n );\n}\n\nfunction DateInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState<Date | null>(new Date(value));\n\n React.useEffect(() => {\n setInputValue(new Date(value));\n }, [value]);\n\n const handleChange = (newValue: Date | null) => {\n if (newValue) {\n onChange(newValue.toISOString().split('T')[0]);\n }\n setInputValue(newValue);\n };\n\n return (\n <p className={classNames(styles.wrapper)}>\n <DatePicker date={inputValue} onChange={handleChange} />\n </p>\n );\n}\n\nfunction ToggleInput({ value, onChange }: InputComponentProps) {\n const [isChecked, setIsChecked] = React.useState(!!value);\n\n React.useEffect(() => {\n setIsChecked(!!value);\n }, [value]);\n\n const handleChange = () => {\n setIsChecked(!isChecked);\n onChange(!isChecked);\n };\n\n return (\n <p className={classNames(styles.wrapper)}>\n <Toggle defaultChecked={isChecked} onChange={handleChange} />\n </p>\n );\n}\n\nfunction JsonInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(JSON.stringify(value, null, 2));\n\n React.useEffect(() => {\n setInputValue(JSON.stringify(value, null, 2));\n }, [value]);\n\n const [message, setMessage] = React.useState('');\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n try {\n const parsedValue = JSON.parse(newValue);\n onChange(parsedValue);\n setMessage('');\n } catch {\n setMessage('Invalid JSON');\n }\n setInputValue(newValue);\n };\n\n return (\n <div>\n <TextArea value={inputValue} onChange={handleChange} />\n {message && <div style={{ color: 'red' }}>{message}</div>}\n </div>\n );\n}\n\nexport function getInputComponent(type: string): InputComponent {\n switch (type) {\n case 'text':\n return ShortTextInput;\n case 'longtext':\n return LongTextInput;\n case 'select':\n return SelectInput;\n case 'number':\n return NumberInput;\n case 'color':\n return ColorInput;\n case 'date':\n return DateInput;\n case 'boolean':\n return ToggleInput;\n case 'json':\n return JsonInput;\n default:\n // eslint-disable-next-line no-console\n console.warn(`Unknown input type: ${type}`);\n return ShortTextInput;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireDefault","require","_classnames","_designInputs","_designInputs2","_designInputs3","_designInputsSelectors","_designUiInput","_designInputs4","_designInputs5","_useOverlay","_liveControlInputModule","_overlayModule","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","ShortTextInput","value","onChange","inputValue","setInputValue","React","useState","useEffect","handleChange","newValue","target","createElement","InputText","LongTextInput","TextArea","SelectInput","meta","selectedValue","setSelectedValue","open","setOpen","triggerRef","useRef","options","useMemo","map","o","label","placeholderContent","find","position","style","useOverlay","paddingTop","paddingBottom","commitSelection","v","ref","className","classNames","styles","wrapper","Dropdown","_","isOpen","dropClass","overlayStyles","suppressNativeMenu","BitPortal","overlay","onMouseDown","stopPropagation","option","MenuItem","portalMenuItem","key","active","onClick","NumberInput","isNaN","Number","console","error","type","ColorPickerPortal","props","padding","ColorPicker","ColorsBox","onColorSelect","color","colorsList","showNoColor","selected","ColorInput","allowCustomColor","DateInput","Date","toISOString","split","DatePicker","date","ToggleInput","isChecked","setIsChecked","Toggle","defaultChecked","JsonInput","JSON","stringify","message","setMessage","parsedValue","parse","getInputComponent","warn"],"sources":["live-control-input.tsx"],"sourcesContent":["/* eslint-disable no-console */\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport { InputText } from '@teambit/design.inputs.input-text';\nimport { TextArea } from '@teambit/design.inputs.text-area';\nimport { Dropdown } from '@teambit/design.inputs.dropdown';\nimport { MenuItem } from '@teambit/design.inputs.selectors.menu-item';\nimport { ColorPicker, ColorsBox } from '@teambit/design.ui.input.color-picker';\nimport { DatePicker } from '@teambit/design.inputs.date-picker';\nimport { Toggle } from '@teambit/design.inputs.toggle-switch';\nimport { useOverlay, BitPortal } from './use-overlay';\n\nimport styles from './live-control-input.module.scss';\nimport overlayStyles from './overlay.module.scss';\n\ntype InputComponentProps = {\n id: string;\n value: any;\n onChange: (value: any) => void;\n meta?: any;\n};\n\ntype InputComponent = React.FC<InputComponentProps>;\n\nfunction ShortTextInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(value || '');\n\n React.useEffect(() => {\n setInputValue(value || '');\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n onChange(newValue || '');\n setInputValue(newValue || '');\n };\n\n return <InputText value={inputValue} onChange={handleChange} />;\n}\n\nfunction LongTextInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(value || '');\n\n React.useEffect(() => {\n setInputValue(value || '');\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n onChange(newValue || '');\n setInputValue(newValue || '');\n };\n\n return <TextArea value={inputValue} onChange={handleChange} />;\n}\n\nfunction SelectInput({ value, onChange, meta }: InputComponentProps) {\n const [selectedValue, setSelectedValue] = React.useState(value || '');\n const [open, setOpen] = React.useState(false);\n const triggerRef = React.useRef<HTMLParagraphElement>(null);\n\n React.useEffect(() => {\n setSelectedValue(value || '');\n }, [value]);\n\n const options = React.useMemo(() => {\n if (!meta?.options) return [];\n return meta.options.map((o: any) => (typeof o === 'string' ? { label: o, value: o } : o));\n }, [meta]);\n\n const placeholderContent = options.find((o) => o.value === selectedValue)?.label;\n\n const { position, style } = useOverlay(triggerRef, open, 0, {\n paddingTop: 8,\n paddingBottom: 8,\n });\n\n const commitSelection = (v: string) => {\n onChange(v);\n setSelectedValue(v);\n setOpen(false);\n };\n\n return (\n <p ref={triggerRef} className={classNames(styles.wrapper)}>\n <Dropdown\n placeholderContent={placeholderContent}\n open={open}\n onChange={(_, isOpen) => setOpen(isOpen)}\n position={position}\n dropClass={overlayStyles.suppressNativeMenu}\n />\n\n {open && style && (\n <BitPortal>\n <div className={overlayStyles.overlay} style={style} onMouseDown={(e) => e.stopPropagation()}>\n {options.map((option) => (\n <MenuItem\n className={styles.portalMenuItem}\n key={option.value}\n active={option.value === selectedValue}\n onClick={() => commitSelection(option.value)}\n >\n {option.label}\n </MenuItem>\n ))}\n </div>\n </BitPortal>\n )}\n </p>\n );\n}\n\nfunction NumberInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(value || 0);\n\n React.useEffect(() => {\n setInputValue(value || 0);\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!isNaN(Number(newValue))) {\n onChange(Number(newValue) || 0);\n setInputValue(Number(newValue) || 0);\n } else {\n // TODO: render error message\n // eslint-disable-next-line no-console\n console.error('Invalid number input', newValue);\n }\n };\n\n return <InputText type=\"number\" value={inputValue} onChange={handleChange} />;\n}\n\nfunction ColorPickerPortal(props: any) {\n const [open, setOpen] = React.useState(false);\n const triggerRef = React.useRef<HTMLDivElement>(null);\n\n const { position, style } = useOverlay(triggerRef, open, 4, {\n padding: 16,\n });\n\n return (\n <div ref={triggerRef}>\n <ColorPicker\n {...props}\n open={open}\n onChange={(_, isOpen) => setOpen(isOpen)}\n position={position}\n dropClass={overlayStyles.suppressNativeMenu}\n />\n\n {open && style && (\n <BitPortal>\n <div className={overlayStyles.overlay} style={style} onMouseDown={(e) => e.stopPropagation()}>\n <ColorsBox\n onColorSelect={(color: string) => {\n props.onColorSelect?.(color);\n setOpen(false);\n }}\n colorsList={props.colorsList}\n showNoColor={props.showNoColor}\n selected={props.value ?? ''}\n />\n </div>\n </BitPortal>\n )}\n </div>\n );\n}\n\nfunction ColorInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(value || '');\n\n React.useEffect(() => {\n setInputValue(value || '');\n }, [value]);\n\n const handleChange = (v: string) => {\n onChange(v);\n setInputValue(v);\n };\n\n return (\n <p className={styles.wrapper}>\n <ColorPickerPortal value={inputValue} onColorSelect={handleChange} allowCustomColor />\n </p>\n );\n}\n\nfunction DateInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState<Date | null>(new Date(value));\n\n React.useEffect(() => {\n setInputValue(new Date(value));\n }, [value]);\n\n const handleChange = (newValue: Date | null) => {\n if (newValue) {\n onChange(newValue.toISOString().split('T')[0]);\n }\n setInputValue(newValue);\n };\n\n return (\n <p className={classNames(styles.wrapper)}>\n <DatePicker date={inputValue} onChange={handleChange} />\n </p>\n );\n}\n\nfunction ToggleInput({ value, onChange }: InputComponentProps) {\n const [isChecked, setIsChecked] = React.useState(!!value);\n\n React.useEffect(() => {\n setIsChecked(!!value);\n }, [value]);\n\n const handleChange = () => {\n setIsChecked(!isChecked);\n onChange(!isChecked);\n };\n\n return (\n <p className={classNames(styles.wrapper)}>\n <Toggle defaultChecked={isChecked} onChange={handleChange} />\n </p>\n );\n}\n\nfunction JsonInput({ value, onChange }: InputComponentProps) {\n const [inputValue, setInputValue] = React.useState(JSON.stringify(value, null, 2));\n\n React.useEffect(() => {\n setInputValue(JSON.stringify(value, null, 2));\n }, [value]);\n\n const [message, setMessage] = React.useState('');\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n try {\n const parsedValue = JSON.parse(newValue);\n onChange(parsedValue);\n setMessage('');\n } catch {\n setMessage('Invalid JSON');\n }\n setInputValue(newValue);\n };\n\n return (\n <div>\n <TextArea value={inputValue} onChange={handleChange} />\n {message && <div style={{ color: 'red' }}>{message}</div>}\n </div>\n );\n}\n\nexport function getInputComponent(type: string): InputComponent {\n switch (type) {\n case 'text':\n return ShortTextInput;\n case 'longtext':\n return LongTextInput;\n case 'select':\n return SelectInput;\n case 'number':\n return NumberInput;\n case 'color':\n return ColorInput;\n case 'date':\n return DateInput;\n case 'boolean':\n return ToggleInput;\n case 'json':\n return JsonInput;\n default:\n // eslint-disable-next-line no-console\n console.warn(`Unknown input type: ${type}`);\n return ShortTextInput;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,21 @@
1
+ @import '@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
+
1
3
  .wrapper {
2
4
  padding: 4px 0;
3
5
  }
6
+
7
+ .portalMenu {
8
+ max-height: 240px;
9
+ overflow-y: auto;
10
+ background: var(--surface-neutral-color, #fff);
11
+ border: 1px solid var(--border-medium-color, #ededed);
12
+ border-radius: 8px;
13
+ box-shadow: var(--bit-shadow-hover-low);
14
+ position: fixed;
15
+ z-index: $modal-z-index - 1;
16
+ }
17
+
18
+ .portalMenuItem {
19
+ cursor: pointer;
20
+ font-family: 'CircularPro', 'Gill Sans', 'Gill Sans MT', 'Helvetica Neue', Helvetica, Arial, sans-serif;
21
+ }
@@ -39,10 +39,7 @@ function LiveControls({
39
39
  onChange
40
40
  }) {
41
41
  return /*#__PURE__*/_react().default.createElement("ul", {
42
- className: (0, _classnames().default)(_liveControlPanelModule().default.container),
43
- style: {
44
- paddingBottom: '20em' /* temp walkaround for cutting popups */
45
- }
42
+ className: (0, _classnames().default)(_liveControlPanelModule().default.container)
46
43
  }, defs.map(field => {
47
44
  const key = field.id;
48
45
  const InputComponent = (0, _liveControlInput().getInputComponent)(field.input || 'text');
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireDefault","require","_classnames","_liveControlPanelModule","_liveControlInput","e","__esModule","default","LiveControls","defs","values","onChange","createElement","className","classNames","styles","container","style","paddingBottom","map","field","key","id","InputComponent","getInputComponent","input","item","label","htmlFor","value","v","meta"],"sources":["live-control-panel.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { type Control } from '@teambit/compositions.ui.composition-live-controls';\n\nimport styles from './live-control-panel.module.scss';\nimport { getInputComponent } from './live-control-input';\n\nexport function LiveControls({\n defs,\n values,\n onChange,\n}: {\n defs: Array<Control>;\n values: Record<string, any>;\n onChange: (key: string, value: any) => void;\n}) {\n return (\n <ul\n className={classNames(styles.container)}\n style={{ paddingBottom: '20em' /* temp walkaround for cutting popups */ }}\n >\n {defs.map((field) => {\n const key = field.id;\n const InputComponent = getInputComponent(field.input || 'text');\n return (\n <li key={key} className={classNames(styles.item)}>\n <div className={classNames(styles.label)}>\n <label htmlFor={`control-${key}`}>{field.label || field.id}</label>\n </div>\n <div>\n <InputComponent\n id={`control-${key}`}\n value={values[key]}\n onChange={(v: any) => onChange(key, v)}\n meta={field}\n />\n </div>\n </li>\n );\n })}\n </ul>\n );\n}\n"],"mappings":";;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,YAAA;EAAA,MAAAH,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAC,WAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGA,SAAAI,wBAAA;EAAA,MAAAJ,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAE,uBAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAK,kBAAA;EAAA,MAAAL,IAAA,GAAAE,OAAA;EAAAG,iBAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAyD,SAAAC,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAElD,SAASG,YAAYA,CAAC;EAC3BC,IAAI;EACJC,MAAM;EACNC;AAKF,CAAC,EAAE;EACD,oBACEb,MAAA,GAAAS,OAAA,CAAAK,aAAA;IACEC,SAAS,EAAE,IAAAC,qBAAU,EAACC,iCAAM,CAACC,SAAS,CAAE;IACxCC,KAAK,EAAE;MAAEC,aAAa,EAAE,MAAM,CAAC;IAAyC;EAAE,GAEzET,IAAI,CAACU,GAAG,CAAEC,KAAK,IAAK;IACnB,MAAMC,GAAG,GAAGD,KAAK,CAACE,EAAE;IACpB,MAAMC,cAAc,GAAG,IAAAC,qCAAiB,EAACJ,KAAK,CAACK,KAAK,IAAI,MAAM,CAAC;IAC/D,oBACE3B,MAAA,GAAAS,OAAA,CAAAK,aAAA;MAAIS,GAAG,EAAEA,GAAI;MAACR,SAAS,EAAE,IAAAC,qBAAU,EAACC,iCAAM,CAACW,IAAI;IAAE,gBAC/C5B,MAAA,GAAAS,OAAA,CAAAK,aAAA;MAAKC,SAAS,EAAE,IAAAC,qBAAU,EAACC,iCAAM,CAACY,KAAK;IAAE,gBACvC7B,MAAA,GAAAS,OAAA,CAAAK,aAAA;MAAOgB,OAAO,EAAE,WAAWP,GAAG;IAAG,GAAED,KAAK,CAACO,KAAK,IAAIP,KAAK,CAACE,EAAU,CAC/D,CAAC,eACNxB,MAAA,GAAAS,OAAA,CAAAK,aAAA,2BACEd,MAAA,GAAAS,OAAA,CAAAK,aAAA,CAACW,cAAc;MACbD,EAAE,EAAE,WAAWD,GAAG,EAAG;MACrBQ,KAAK,EAAEnB,MAAM,CAACW,GAAG,CAAE;MACnBV,QAAQ,EAAGmB,CAAM,IAAKnB,QAAQ,CAACU,GAAG,EAAES,CAAC,CAAE;MACvCC,IAAI,EAAEX;IAAM,CACb,CACE,CACH,CAAC;EAET,CAAC,CACC,CAAC;AAET","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireDefault","require","_classnames","_liveControlPanelModule","_liveControlInput","e","__esModule","default","LiveControls","defs","values","onChange","createElement","className","classNames","styles","container","map","field","key","id","InputComponent","getInputComponent","input","item","label","htmlFor","value","v","meta"],"sources":["live-control-panel.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { type Control } from '@teambit/compositions.ui.composition-live-controls';\n\nimport styles from './live-control-panel.module.scss';\nimport { getInputComponent } from './live-control-input';\n\nexport function LiveControls({\n defs,\n values,\n onChange,\n}: {\n defs: Array<Control>;\n values: Record<string, any>;\n onChange: (key: string, value: any) => void;\n}) {\n return (\n <ul className={classNames(styles.container)}>\n {defs.map((field) => {\n const key = field.id;\n const InputComponent = getInputComponent(field.input || 'text');\n return (\n <li key={key} className={classNames(styles.item)}>\n <div className={classNames(styles.label)}>\n <label htmlFor={`control-${key}`}>{field.label || field.id}</label>\n </div>\n <div>\n <InputComponent\n id={`control-${key}`}\n value={values[key]}\n onChange={(v: any) => onChange(key, v)}\n meta={field}\n />\n </div>\n </li>\n );\n })}\n </ul>\n );\n}\n"],"mappings":";;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,YAAA;EAAA,MAAAH,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAC,WAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGA,SAAAI,wBAAA;EAAA,MAAAJ,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAE,uBAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAK,kBAAA;EAAA,MAAAL,IAAA,GAAAE,OAAA;EAAAG,iBAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAyD,SAAAC,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAElD,SAASG,YAAYA,CAAC;EAC3BC,IAAI;EACJC,MAAM;EACNC;AAKF,CAAC,EAAE;EACD,oBACEb,MAAA,GAAAS,OAAA,CAAAK,aAAA;IAAIC,SAAS,EAAE,IAAAC,qBAAU,EAACC,iCAAM,CAACC,SAAS;EAAE,GACzCP,IAAI,CAACQ,GAAG,CAAEC,KAAK,IAAK;IACnB,MAAMC,GAAG,GAAGD,KAAK,CAACE,EAAE;IACpB,MAAMC,cAAc,GAAG,IAAAC,qCAAiB,EAACJ,KAAK,CAACK,KAAK,IAAI,MAAM,CAAC;IAC/D,oBACEzB,MAAA,GAAAS,OAAA,CAAAK,aAAA;MAAIO,GAAG,EAAEA,GAAI;MAACN,SAAS,EAAE,IAAAC,qBAAU,EAACC,iCAAM,CAACS,IAAI;IAAE,gBAC/C1B,MAAA,GAAAS,OAAA,CAAAK,aAAA;MAAKC,SAAS,EAAE,IAAAC,qBAAU,EAACC,iCAAM,CAACU,KAAK;IAAE,gBACvC3B,MAAA,GAAAS,OAAA,CAAAK,aAAA;MAAOc,OAAO,EAAE,WAAWP,GAAG;IAAG,GAAED,KAAK,CAACO,KAAK,IAAIP,KAAK,CAACE,EAAU,CAC/D,CAAC,eACNtB,MAAA,GAAAS,OAAA,CAAAK,aAAA,2BACEd,MAAA,GAAAS,OAAA,CAAAK,aAAA,CAACS,cAAc;MACbD,EAAE,EAAE,WAAWD,GAAG,EAAG;MACrBQ,KAAK,EAAEjB,MAAM,CAACS,GAAG,CAAE;MACnBR,QAAQ,EAAGiB,CAAM,IAAKjB,QAAQ,CAACQ,GAAG,EAAES,CAAC,CAAE;MACvCC,IAAI,EAAEX;IAAM,CACb,CACE,CACH,CAAC;EAET,CAAC,CACC,CAAC;AAET","ignoreList":[]}
@@ -3,6 +3,7 @@
3
3
  flex-direction: column;
4
4
  font-size: 12px;
5
5
  padding: 8px 0;
6
+ width: 100%;
6
7
  }
7
8
 
8
9
  .item {
@@ -0,0 +1,15 @@
1
+ @import '@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
+
3
+ .overlay {
4
+ position: fixed;
5
+ z-index: $modal-z-index - 1;
6
+ overflow-y: auto;
7
+ background: var(--surface-neutral-color, #fff);
8
+ border: 1px solid var(--border-medium-color, #ededed);
9
+ border-radius: 8px;
10
+ box-shadow: var(--bit-shadow-hover-low, 0 2px 8px 0 rgba(0, 0, 0, 0.2));
11
+ }
12
+
13
+ .suppressNativeMenu {
14
+ display: none !important;
15
+ }
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ export type OverlayPosition = 'top' | 'bottom';
3
+ export type OverlayStyle = {
4
+ top?: number;
5
+ bottom?: number;
6
+ left: number;
7
+ maxWidth: number;
8
+ maxHeight: number;
9
+ } & React.CSSProperties;
10
+ export declare function useOverlay(anchorRef: React.RefObject<HTMLElement>, open: boolean, gap?: number, extraStyle?: React.CSSProperties): {
11
+ position: OverlayPosition;
12
+ style: OverlayStyle | null;
13
+ };
14
+ export declare function BitPortal({ children }: {
15
+ children: React.ReactNode;
16
+ }): React.ReactPortal;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BitPortal = BitPortal;
7
+ exports.useOverlay = useOverlay;
8
+ function _react() {
9
+ const data = _interopRequireDefault(require("react"));
10
+ _react = function () {
11
+ return data;
12
+ };
13
+ return data;
14
+ }
15
+ function _reactDom() {
16
+ const data = _interopRequireDefault(require("react-dom"));
17
+ _reactDom = function () {
18
+ return data;
19
+ };
20
+ return data;
21
+ }
22
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
24
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
26
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
27
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
28
+ const GAP = 4;
29
+ function useOverlay(anchorRef, open, gap = GAP, extraStyle) {
30
+ const [position, setPosition] = _react().default.useState('bottom');
31
+ const [style, setStyle] = _react().default.useState(null);
32
+ _react().default.useLayoutEffect(() => {
33
+ if (!open || !anchorRef.current) return;
34
+ const rect = anchorRef.current.getBoundingClientRect();
35
+ const below = window.innerHeight - rect.bottom - gap;
36
+ const above = rect.top - gap;
37
+ const shouldFlip = below < 240 && above > below;
38
+ const pos = shouldFlip ? 'top' : 'bottom';
39
+ setPosition(pos);
40
+ setStyle(_objectSpread(_objectSpread({}, extraStyle), {}, {
41
+ left: rect.left,
42
+ maxWidth: rect.width,
43
+ maxHeight: 240,
44
+ top: pos === 'bottom' ? rect.bottom + gap : undefined,
45
+ bottom: pos === 'top' ? window.innerHeight - rect.top + gap : undefined
46
+ }));
47
+ }, [open]);
48
+ return {
49
+ position,
50
+ style
51
+ };
52
+ }
53
+ function BitPortal({
54
+ children
55
+ }) {
56
+ return /*#__PURE__*/_reactDom().default.createPortal(children, document.body);
57
+ }
58
+
59
+ //# sourceMappingURL=use-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","data","_interopRequireDefault","require","_reactDom","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","GAP","useOverlay","anchorRef","open","gap","extraStyle","position","setPosition","React","useState","style","setStyle","useLayoutEffect","current","rect","getBoundingClientRect","below","window","innerHeight","bottom","above","top","shouldFlip","pos","left","maxWidth","width","maxHeight","undefined","BitPortal","children","ReactDOM","createPortal","document","body"],"sources":["use-overlay.ts"],"sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport type OverlayPosition = 'top' | 'bottom';\n\nexport type OverlayStyle = {\n top?: number;\n bottom?: number;\n left: number;\n maxWidth: number;\n maxHeight: number;\n} & React.CSSProperties;\n\nconst GAP = 4;\n\nexport function useOverlay(\n anchorRef: React.RefObject<HTMLElement>,\n open: boolean,\n gap: number = GAP,\n extraStyle?: React.CSSProperties\n) {\n const [position, setPosition] = React.useState<OverlayPosition>('bottom');\n const [style, setStyle] = React.useState<OverlayStyle | null>(null);\n\n React.useLayoutEffect(() => {\n if (!open || !anchorRef.current) return;\n\n const rect = anchorRef.current.getBoundingClientRect();\n\n const below = window.innerHeight - rect.bottom - gap;\n const above = rect.top - gap;\n\n const shouldFlip = below < 240 && above > below;\n\n const pos: OverlayPosition = shouldFlip ? 'top' : 'bottom';\n\n setPosition(pos);\n setStyle({\n ...extraStyle,\n left: rect.left,\n maxWidth: rect.width,\n maxHeight: 240,\n top: pos === 'bottom' ? rect.bottom + gap : undefined,\n bottom: pos === 'top' ? window.innerHeight - rect.top + gap : undefined,\n });\n }, [open]);\n\n return { position, style };\n}\n\nexport function BitPortal({ children }: { children: React.ReactNode }) {\n return ReactDOM.createPortal(children, document.body);\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/compositions",
3
- "version": "1.0.871",
3
+ "version": "1.0.873",
4
4
  "homepage": "https://bit.cloud/teambit/compositions/compositions",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.compositions",
8
8
  "name": "compositions",
9
- "version": "1.0.871"
9
+ "version": "1.0.873"
10
10
  },
11
11
  "dependencies": {
12
12
  "graphql-tag": "2.12.1",
@@ -54,16 +54,16 @@
54
54
  "@teambit/design.inputs.text-area": "0.0.20",
55
55
  "@teambit/design.inputs.toggle-switch": "0.0.8",
56
56
  "@teambit/design.ui.input.color-picker": "0.0.56",
57
- "@teambit/component": "1.0.871",
58
- "@teambit/graphql": "1.0.871",
59
- "@teambit/dev-files": "1.0.871",
60
- "@teambit/envs": "1.0.871",
61
- "@teambit/preview": "1.0.871",
62
- "@teambit/schema": "1.0.871",
63
- "@teambit/scope": "1.0.871",
64
- "@teambit/workspace": "1.0.871",
65
- "@teambit/component-compare": "1.0.871",
66
- "@teambit/ui": "1.0.871"
57
+ "@teambit/component": "1.0.873",
58
+ "@teambit/graphql": "1.0.873",
59
+ "@teambit/dev-files": "1.0.873",
60
+ "@teambit/envs": "1.0.873",
61
+ "@teambit/preview": "1.0.873",
62
+ "@teambit/schema": "1.0.873",
63
+ "@teambit/scope": "1.0.873",
64
+ "@teambit/workspace": "1.0.873",
65
+ "@teambit/component-compare": "1.0.873",
66
+ "@teambit/ui": "1.0.873"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@types/lodash": "4.14.165",
@@ -76,8 +76,10 @@
76
76
  },
77
77
  "peerDependencies": {
78
78
  "react": "^17.0.0 || ^18.0.0",
79
+ "react-dom": "^17.0.0 || ^18.0.0",
79
80
  "react-router-dom": "^6.16.0",
80
81
  "@types/react": "^17.0.73",
82
+ "@types/react-dom": "^17.0.5",
81
83
  "@teambit/base-react.navigation.link": "2.0.33"
82
84
  },
83
85
  "license": "Apache-2.0",
@@ -1,3 +1,21 @@
1
+ @import '@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
+
1
3
  .wrapper {
2
4
  padding: 4px 0;
3
5
  }
6
+
7
+ .portalMenu {
8
+ max-height: 240px;
9
+ overflow-y: auto;
10
+ background: var(--surface-neutral-color, #fff);
11
+ border: 1px solid var(--border-medium-color, #ededed);
12
+ border-radius: 8px;
13
+ box-shadow: var(--bit-shadow-hover-low);
14
+ position: fixed;
15
+ z-index: $modal-z-index - 1;
16
+ }
17
+
18
+ .portalMenuItem {
19
+ cursor: pointer;
20
+ font-family: 'CircularPro', 'Gill Sans', 'Gill Sans MT', 'Helvetica Neue', Helvetica, Arial, sans-serif;
21
+ }
@@ -7,13 +7,13 @@ import { InputText } from '@teambit/design.inputs.input-text';
7
7
  import { TextArea } from '@teambit/design.inputs.text-area';
8
8
  import { Dropdown } from '@teambit/design.inputs.dropdown';
9
9
  import { MenuItem } from '@teambit/design.inputs.selectors.menu-item';
10
- import { ColorPicker } from '@teambit/design.ui.input.color-picker';
10
+ import { ColorPicker, ColorsBox } from '@teambit/design.ui.input.color-picker';
11
11
  import { DatePicker } from '@teambit/design.inputs.date-picker';
12
12
  import { Toggle } from '@teambit/design.inputs.toggle-switch';
13
-
14
- import { type SelectOption } from '@teambit/compositions.ui.composition-live-controls';
13
+ import { useOverlay, BitPortal } from './use-overlay';
15
14
 
16
15
  import styles from './live-control-input.module.scss';
16
+ import overlayStyles from './overlay.module.scss';
17
17
 
18
18
  type InputComponentProps = {
19
19
  id: string;
@@ -58,46 +58,57 @@ function LongTextInput({ value, onChange }: InputComponentProps) {
58
58
 
59
59
  function SelectInput({ value, onChange, meta }: InputComponentProps) {
60
60
  const [selectedValue, setSelectedValue] = React.useState(value || '');
61
+ const [open, setOpen] = React.useState(false);
62
+ const triggerRef = React.useRef<HTMLParagraphElement>(null);
61
63
 
62
64
  React.useEffect(() => {
63
65
  setSelectedValue(value || '');
64
66
  }, [value]);
65
67
 
66
- const handleChange = (newValue: any) => {
67
- onChange(newValue || '');
68
- setSelectedValue(newValue || '');
69
- };
70
-
71
- const options: {
72
- label: string;
73
- value: string;
74
- }[] = React.useMemo(() => {
75
- if (!meta || !meta.options) return [];
76
- return meta.options.map((option: SelectOption) => {
77
- if (typeof option === 'string') {
78
- return { label: option, value: option };
79
- }
80
- return option;
81
- });
68
+ const options = React.useMemo(() => {
69
+ if (!meta?.options) return [];
70
+ return meta.options.map((o: any) => (typeof o === 'string' ? { label: o, value: o } : o));
82
71
  }, [meta]);
83
72
 
84
73
  const placeholderContent = options.find((o) => o.value === selectedValue)?.label;
85
74
 
75
+ const { position, style } = useOverlay(triggerRef, open, 0, {
76
+ paddingTop: 8,
77
+ paddingBottom: 8,
78
+ });
79
+
80
+ const commitSelection = (v: string) => {
81
+ onChange(v);
82
+ setSelectedValue(v);
83
+ setOpen(false);
84
+ };
85
+
86
86
  return (
87
- <p className={classNames(styles.wrapper)}>
88
- <Dropdown placeholderContent={placeholderContent}>
89
- {options.map((option) => {
90
- return (
91
- <MenuItem
92
- active={option.value === selectedValue}
93
- key={option.value}
94
- onClick={() => handleChange(option.value)}
95
- >
96
- {option.label}
97
- </MenuItem>
98
- );
99
- })}
100
- </Dropdown>
87
+ <p ref={triggerRef} className={classNames(styles.wrapper)}>
88
+ <Dropdown
89
+ placeholderContent={placeholderContent}
90
+ open={open}
91
+ onChange={(_, isOpen) => setOpen(isOpen)}
92
+ position={position}
93
+ dropClass={overlayStyles.suppressNativeMenu}
94
+ />
95
+
96
+ {open && style && (
97
+ <BitPortal>
98
+ <div className={overlayStyles.overlay} style={style} onMouseDown={(e) => e.stopPropagation()}>
99
+ {options.map((option) => (
100
+ <MenuItem
101
+ className={styles.portalMenuItem}
102
+ key={option.value}
103
+ active={option.value === selectedValue}
104
+ onClick={() => commitSelection(option.value)}
105
+ >
106
+ {option.label}
107
+ </MenuItem>
108
+ ))}
109
+ </div>
110
+ </BitPortal>
111
+ )}
101
112
  </p>
102
113
  );
103
114
  }
@@ -124,6 +135,43 @@ function NumberInput({ value, onChange }: InputComponentProps) {
124
135
  return <InputText type="number" value={inputValue} onChange={handleChange} />;
125
136
  }
126
137
 
138
+ function ColorPickerPortal(props: any) {
139
+ const [open, setOpen] = React.useState(false);
140
+ const triggerRef = React.useRef<HTMLDivElement>(null);
141
+
142
+ const { position, style } = useOverlay(triggerRef, open, 4, {
143
+ padding: 16,
144
+ });
145
+
146
+ return (
147
+ <div ref={triggerRef}>
148
+ <ColorPicker
149
+ {...props}
150
+ open={open}
151
+ onChange={(_, isOpen) => setOpen(isOpen)}
152
+ position={position}
153
+ dropClass={overlayStyles.suppressNativeMenu}
154
+ />
155
+
156
+ {open && style && (
157
+ <BitPortal>
158
+ <div className={overlayStyles.overlay} style={style} onMouseDown={(e) => e.stopPropagation()}>
159
+ <ColorsBox
160
+ onColorSelect={(color: string) => {
161
+ props.onColorSelect?.(color);
162
+ setOpen(false);
163
+ }}
164
+ colorsList={props.colorsList}
165
+ showNoColor={props.showNoColor}
166
+ selected={props.value ?? ''}
167
+ />
168
+ </div>
169
+ </BitPortal>
170
+ )}
171
+ </div>
172
+ );
173
+ }
174
+
127
175
  function ColorInput({ value, onChange }: InputComponentProps) {
128
176
  const [inputValue, setInputValue] = React.useState(value || '');
129
177
 
@@ -131,14 +179,14 @@ function ColorInput({ value, onChange }: InputComponentProps) {
131
179
  setInputValue(value || '');
132
180
  }, [value]);
133
181
 
134
- const handleChange = (newValue: string) => {
135
- onChange(newValue || '');
136
- setInputValue(newValue || '');
182
+ const handleChange = (v: string) => {
183
+ onChange(v);
184
+ setInputValue(v);
137
185
  };
138
186
 
139
187
  return (
140
- <p className={classNames(styles.wrapper)}>
141
- <ColorPicker value={inputValue} onColorSelect={handleChange} allowCustomColor />
188
+ <p className={styles.wrapper}>
189
+ <ColorPickerPortal value={inputValue} onColorSelect={handleChange} allowCustomColor />
142
190
  </p>
143
191
  );
144
192
  }
@@ -3,6 +3,7 @@
3
3
  flex-direction: column;
4
4
  font-size: 12px;
5
5
  padding: 8px 0;
6
+ width: 100%;
6
7
  }
7
8
 
8
9
  .item {
@@ -15,10 +15,7 @@ export function LiveControls({
15
15
  onChange: (key: string, value: any) => void;
16
16
  }) {
17
17
  return (
18
- <ul
19
- className={classNames(styles.container)}
20
- style={{ paddingBottom: '20em' /* temp walkaround for cutting popups */ }}
21
- >
18
+ <ul className={classNames(styles.container)}>
22
19
  {defs.map((field) => {
23
20
  const key = field.id;
24
21
  const InputComponent = getInputComponent(field.input || 'text');
@@ -0,0 +1,15 @@
1
+ @import '@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
+
3
+ .overlay {
4
+ position: fixed;
5
+ z-index: $modal-z-index - 1;
6
+ overflow-y: auto;
7
+ background: var(--surface-neutral-color, #fff);
8
+ border: 1px solid var(--border-medium-color, #ededed);
9
+ border-radius: 8px;
10
+ box-shadow: var(--bit-shadow-hover-low, 0 2px 8px 0 rgba(0, 0, 0, 0.2));
11
+ }
12
+
13
+ .suppressNativeMenu {
14
+ display: none !important;
15
+ }
@@ -0,0 +1,53 @@
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom';
3
+
4
+ export type OverlayPosition = 'top' | 'bottom';
5
+
6
+ export type OverlayStyle = {
7
+ top?: number;
8
+ bottom?: number;
9
+ left: number;
10
+ maxWidth: number;
11
+ maxHeight: number;
12
+ } & React.CSSProperties;
13
+
14
+ const GAP = 4;
15
+
16
+ export function useOverlay(
17
+ anchorRef: React.RefObject<HTMLElement>,
18
+ open: boolean,
19
+ gap: number = GAP,
20
+ extraStyle?: React.CSSProperties
21
+ ) {
22
+ const [position, setPosition] = React.useState<OverlayPosition>('bottom');
23
+ const [style, setStyle] = React.useState<OverlayStyle | null>(null);
24
+
25
+ React.useLayoutEffect(() => {
26
+ if (!open || !anchorRef.current) return;
27
+
28
+ const rect = anchorRef.current.getBoundingClientRect();
29
+
30
+ const below = window.innerHeight - rect.bottom - gap;
31
+ const above = rect.top - gap;
32
+
33
+ const shouldFlip = below < 240 && above > below;
34
+
35
+ const pos: OverlayPosition = shouldFlip ? 'top' : 'bottom';
36
+
37
+ setPosition(pos);
38
+ setStyle({
39
+ ...extraStyle,
40
+ left: rect.left,
41
+ maxWidth: rect.width,
42
+ maxHeight: 240,
43
+ top: pos === 'bottom' ? rect.bottom + gap : undefined,
44
+ bottom: pos === 'top' ? window.innerHeight - rect.top + gap : undefined,
45
+ });
46
+ }, [open]);
47
+
48
+ return { position, style };
49
+ }
50
+
51
+ export function BitPortal({ children }: { children: React.ReactNode }) {
52
+ return ReactDOM.createPortal(children, document.body);
53
+ }