@artsy/palette 18.7.2 → 18.8.1

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/CHANGELOG.md CHANGED
@@ -1,3 +1,54 @@
1
+ # v18.8.1 (Tue Nov 30 2021)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - fix(autocomplete): only closes when options are visible [#1079](https://github.com/artsy/palette/pull/1079) ([@dzucconi](https://github.com/dzucconi))
6
+ - fix(autocomplete): only closes when options are visible ([@dzucconi](https://github.com/dzucconi))
7
+
8
+ #### Authors: 1
9
+
10
+ - Damon ([@dzucconi](https://github.com/dzucconi))
11
+
12
+ ---
13
+
14
+ # v18.8.0 (Thu Nov 25 2021)
15
+
16
+ #### 🚀 Enhancement
17
+
18
+ - feat(NX02486): adjusts the modal to the new design [#1076](https://github.com/artsy/palette/pull/1076) ([@araujobarret](https://github.com/araujobarret))
19
+
20
+ #### Authors: 1
21
+
22
+ - Carlos Alberto de Araujo Barreto ([@araujobarret](https://github.com/araujobarret))
23
+
24
+ ---
25
+
26
+ # v18.7.4 (Wed Nov 24 2021)
27
+
28
+ #### 🐛 Bug Fix
29
+
30
+ - fix(clickable): resets margin for safari [#1078](https://github.com/artsy/palette/pull/1078) ([@dzucconi](https://github.com/dzucconi))
31
+ - fix(clickable): resets margin for safari ([@dzucconi](https://github.com/dzucconi))
32
+
33
+ #### Authors: 1
34
+
35
+ - Damon ([@dzucconi](https://github.com/dzucconi))
36
+
37
+ ---
38
+
39
+ # v18.7.3 (Wed Nov 24 2021)
40
+
41
+ #### 🐛 Bug Fix
42
+
43
+ - fix(autocomplete): improves onclose; fixes memory leak [#1077](https://github.com/artsy/palette/pull/1077) ([@dzucconi](https://github.com/dzucconi))
44
+ - fix(autocomplete): improves onclose; fixes memory leak ([@dzucconi](https://github.com/dzucconi))
45
+
46
+ #### Authors: 1
47
+
48
+ - Damon ([@dzucconi](https://github.com/dzucconi))
49
+
50
+ ---
51
+
1
52
  # v18.7.2 (Mon Nov 22 2021)
2
53
 
3
54
  #### 🐛 Bug Fix
@@ -185,10 +185,7 @@ var AutocompleteInput = function AutocompleteInput(_ref) {
185
185
  reset = _useKeyboardListNavig.reset,
186
186
  set = _useKeyboardListNavig.set;
187
187
 
188
- var isDropdownVisible = state.open && options.length > 0;
189
- (0, _react.useEffect)(function () {
190
- if (!isDropdownVisible) onClose === null || onClose === void 0 ? void 0 : onClose();
191
- }, [isDropdownVisible, onClose]); // Reset keyboard navigation when options change
188
+ var isDropdownVisible = state.open && options.length > 0; // Reset keyboard navigation when options change
192
189
  // eslint-disable-next-line react-hooks/exhaustive-deps
193
190
 
194
191
  (0, _react.useEffect)(reset, [options]); // Reset keyboard navigation when query is empty
@@ -267,12 +264,14 @@ var AutocompleteInput = function AutocompleteInput(_ref) {
267
264
  option === null || option === void 0 ? void 0 : (_option$ref = option.ref) === null || _option$ref === void 0 ? void 0 : (_option$ref$current = _option$ref.current) === null || _option$ref$current === void 0 ? void 0 : _option$ref$current.focus();
268
265
  }, [index, optionsWithRefs]);
269
266
  var handleFocusChange = (0, _react.useCallback)(function (focused) {
270
- if (focused) return;
267
+ if (focused || !isDropdownVisible) return;
271
268
  dispatch({
272
269
  type: "CLOSE"
273
270
  });
274
- reset(); // eslint-disable-next-line react-hooks/exhaustive-deps
275
- }, []); // Handle closing the dropdown when clicking outside of the input
271
+ reset();
272
+ onClose === null || onClose === void 0 ? void 0 : onClose();
273
+ }, // eslint-disable-next-line react-hooks/exhaustive-deps
274
+ [onClose, isDropdownVisible]); // Handle closing the dropdown when clicking outside of the input
276
275
  // or when focus leaves the input completely
277
276
 
278
277
  var _useContainsFocus = (0, _utils.useContainsFocus)({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/AutocompleteInput/AutocompleteInput.tsx"],"names":["reducer","state","action","type","open","query","payload","AutocompleteInput","defaultValue","id","loading","onSubmit","onSelect","onChange","onClear","onClose","onKeyDown","height","renderOption","option","options","rest","inputRef","containerRef","boxProps","inputProps","dispatch","optionsWithRefs","map","ref","resetUI","setTimeout","current","focus","reset","handleSelect","index","text","list","waitForInteractive","onEnter","element","i","set","isDropdownVisible","length","position","offset","active","anchorRef","tooltipRef","width","handleFocus","handleMouseDown","handleMouseEnter","cursor","interactive","handleChange","event","value","currentTarget","handleClearOrSubmit","handleFocusChange","focused","containsFocusRef","handleInputKeydown","key","preventDefault","stopPropagation","blur","handleContainerKeydown","staged","AutocompleteInputDropdown","Box","DROP_SHADOW"],"mappings":"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","sourcesContent":["import composeRefs from \"@seznam/compose-react-refs\"\nimport React, {\n createRef,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\"\nimport styled from \"styled-components\"\nimport { useKeyboardListNavigation } from \"use-keyboard-list-navigation\"\nimport { Spinner } from \"..\"\nimport { DROP_SHADOW } from \"../../helpers\"\nimport { CloseIcon, MagnifyingGlassIcon } from \"../../svgs\"\nimport { usePosition, useContainsFocus } from \"../../utils\"\nimport { useWidthOf } from \"../../utils/useWidthOf\"\nimport { Box, splitBoxProps } from \"../Box\"\nimport { Clickable } from \"../Clickable\"\nimport { InputProps } from \"../Input\"\nimport { LabeledInput } from \"../LabeledInput\"\nimport { VisuallyHidden } from \"../VisuallyHidden\"\nimport { AutocompleteInputOption } from \"./AutocompleteInputOption\"\nimport { AutocompleteInputOptionLabel } from \"./AutocompleteInputOptionLabel\"\n\n/** Base option type — can be expanded */\nexport interface AutocompleteInputOptionType {\n text: string\n value: string\n}\n\ninterface State {\n open: boolean\n query: string\n}\n\ntype Action =\n | { type: \"OPEN\" }\n | { type: \"CLOSE\" }\n | { type: \"CLEAR\" }\n | { type: \"CHANGE\"; payload: { query: string } }\n | { type: \"SELECT\"; payload: { query: string } }\n\nconst reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"OPEN\":\n return { ...state, open: true }\n case \"CLOSE\":\n return { ...state, open: false }\n case \"CLEAR\":\n return { ...state, query: \"\" }\n case \"CHANGE\":\n return { ...state, query: action.payload.query, open: true }\n case \"SELECT\":\n return { ...state, query: action.payload.query, open: false }\n }\n}\n\nexport interface AutocompleteInputProps<T extends AutocompleteInputOptionType>\n extends Omit<InputProps, \"onSelect\" | \"onSubmit\"> {\n defaultValue?: string\n loading?: boolean\n /** on <enter> when no option is selected */\n onSubmit?(query: string): void\n /** on <click> or <enter> when an option is selected */\n onSelect?(option: T, index: number): void\n /** on <click> of the 'x' (clear) button */\n onClear?(): void\n /** Callback that runs when options are hidden */\n onClose?(): void\n renderOption?(\n option: T,\n i: number\n ): React.ReactElement<any, string | React.JSXElementConstructor<any>>\n options: T[]\n}\n\n/** AutocompleteInput */\nexport const AutocompleteInput = <T extends AutocompleteInputOptionType>({\n defaultValue = \"\",\n id,\n loading,\n onSubmit,\n onSelect,\n onChange,\n onClear,\n onClose,\n onKeyDown,\n height,\n renderOption = (option) => <AutocompleteInputOptionLabel {...option} />,\n options,\n ...rest\n}: AutocompleteInputProps<T>) => {\n const inputRef = useRef<HTMLInputElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n\n const [boxProps, inputProps] = splitBoxProps(rest)\n\n const [state, dispatch] = useReducer(reducer, {\n open: false,\n query: defaultValue,\n })\n\n const optionsWithRefs = useMemo(() => {\n return options.map((option) => ({\n option,\n ref: createRef<HTMLButtonElement>(),\n }))\n }, [options])\n\n const resetUI = () => {\n setTimeout(() => {\n inputRef.current?.focus()\n reset()\n dispatch({ type: \"CLOSE\" })\n }, 100)\n }\n\n const handleSelect = (option: T, index: number) => {\n dispatch({ type: \"SELECT\", payload: { query: option.text } })\n inputRef.current?.focus()\n onSelect?.(option, index)\n }\n\n const { index, reset, set } = useKeyboardListNavigation({\n ref: containerRef,\n list: options,\n waitForInteractive: true,\n onEnter: ({ element: option, index: i }) => {\n handleSelect(option, i)\n resetUI()\n },\n })\n\n const isDropdownVisible = state.open && options.length > 0\n\n useEffect(() => {\n if (!isDropdownVisible) onClose?.()\n }, [isDropdownVisible, onClose])\n\n // Reset keyboard navigation when options change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(reset, [options])\n\n // Reset keyboard navigation when query is empty\n useEffect(() => {\n if (state.query === \"\") reset()\n }, [reset, state.query])\n\n const { anchorRef, tooltipRef } = usePosition({\n position: \"bottom\",\n offset: 10,\n active: isDropdownVisible,\n })\n\n const { width } = useWidthOf({ ref: anchorRef })\n\n const handleFocus = () => {\n reset()\n dispatch({ type: \"OPEN\" })\n }\n\n const handleMouseDown = (option: T, i: number) => () => {\n handleSelect(option, i)\n resetUI()\n }\n\n const handleMouseEnter = (i: number) => () => {\n set({ cursor: i, interactive: true })\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const {\n currentTarget: { value },\n } = event\n\n dispatch({ type: \"CHANGE\", payload: { query: value } })\n onChange?.(event)\n }\n\n const handleClearOrSubmit = () => {\n if (state.query === \"\") {\n onSubmit?.(state.query)\n return\n }\n\n dispatch({ type: \"CLEAR\" })\n inputRef.current?.focus()\n onClear?.()\n }\n\n // Moves focus to different options when keyboard navigating using up/down\n useEffect(() => {\n const option = optionsWithRefs[index]\n option?.ref?.current?.focus()\n }, [index, optionsWithRefs])\n\n const handleFocusChange = useCallback((focused: boolean) => {\n if (focused) return\n dispatch({ type: \"CLOSE\" })\n reset()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Handle closing the dropdown when clicking outside of the input\n // or when focus leaves the input completely\n const { ref: containsFocusRef } = useContainsFocus({\n onChange: handleFocusChange,\n })\n\n const handleInputKeydown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n // Handle <Enter> when nothing is selected\n case \"Enter\":\n if (state.query !== \"\" && index === -1) {\n onSubmit?.(state.query)\n resetUI()\n }\n return\n\n // <Esc> to close dropdown\n case \"Escape\":\n event.preventDefault()\n event.stopPropagation()\n\n dispatch({ type: \"CLOSE\" })\n inputRef.current?.blur()\n\n return\n\n default:\n break\n }\n\n onKeyDown?.(event)\n }\n\n // Moves focus back to input when typing\n const handleContainerKeydown = (\n event: React.KeyboardEvent<HTMLDivElement>\n ) => {\n switch (event.key) {\n case \"Alt\":\n case \"ArrowDown\":\n case \"ArrowUp\":\n case \"Control\":\n case \"Enter\":\n case \"Meta\":\n case \"Shift\":\n case \"Tab\":\n // Ignore\n return\n\n case \"Escape\":\n event.preventDefault()\n event.stopPropagation()\n\n dispatch({ type: \"CLOSE\" })\n inputRef.current?.blur()\n reset()\n\n return\n\n default:\n inputRef.current?.focus()\n }\n }\n\n // Option that is being hovered or keyed into\n const staged = options[index]\n\n return (\n <Box\n ref={composeRefs(containerRef, containsFocusRef) as any}\n onKeyDown={handleContainerKeydown}\n {...boxProps}\n >\n <LabeledInput\n ref={composeRefs(inputRef, anchorRef) as any}\n role=\"combobox\"\n aria-expanded={isDropdownVisible}\n aria-autocomplete=\"list\"\n {...(id ? { id, \"aria-describedby\": `${id}__assistiveHint` } : {})}\n label={\n loading ? (\n <Box width={18}>\n <Spinner size=\"small\" />\n </Box>\n ) : state.query ? (\n <Clickable\n onClick={handleClearOrSubmit}\n height=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n aria-label=\"Clear input\"\n >\n <CloseIcon fill=\"black60\" aria-hidden />\n </Clickable>\n ) : (\n <MagnifyingGlassIcon fill=\"black60\" aria-hidden />\n )\n }\n value={staged?.text ?? state.query}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleInputKeydown}\n autoComplete=\"off\"\n height={height}\n {...inputProps}\n />\n\n {isDropdownVisible && (\n <AutocompleteInputDropdown\n ref={tooltipRef as any}\n role=\"listbox\"\n width={width}\n >\n {optionsWithRefs.map(({ option, ref }, i) => {\n return (\n <AutocompleteInputOption\n key={i}\n ref={ref}\n role=\"option\"\n aria-selected={i === index}\n aria-posinset={i + 1}\n aria-setsize={options.length}\n onMouseDown={handleMouseDown(option, i)}\n onMouseEnter={handleMouseEnter(i)}\n selected={i === index}\n tabIndex={-1}\n >\n {renderOption(option, i)}\n </AutocompleteInputOption>\n )\n })}\n </AutocompleteInputDropdown>\n )}\n\n <VisuallyHidden {...(id ? { id: `${id}__assistiveHint` } : {})}>\n When autocomplete results are available use up and down arrows to review\n and enter to select. Touch device users, explore by touch or with swipe\n gestures.\n </VisuallyHidden>\n\n {isDropdownVisible && (\n <VisuallyHidden role=\"status\" aria-atomic=\"true\" aria-live=\"polite\">\n {options.length === 1\n ? `1 result is available`\n : `${options.length} results are available`}\n </VisuallyHidden>\n )}\n </Box>\n )\n}\n\nconst AutocompleteInputDropdown = styled(Box)`\n box-shadow: ${DROP_SHADOW};\n max-height: 300px;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n z-index: 1;\n`\n"],"file":"AutocompleteInput.js"}
1
+ {"version":3,"sources":["../../../src/elements/AutocompleteInput/AutocompleteInput.tsx"],"names":["reducer","state","action","type","open","query","payload","AutocompleteInput","defaultValue","id","loading","onSubmit","onSelect","onChange","onClear","onClose","onKeyDown","height","renderOption","option","options","rest","inputRef","containerRef","boxProps","inputProps","dispatch","optionsWithRefs","map","ref","resetUI","setTimeout","current","focus","reset","handleSelect","index","text","list","waitForInteractive","onEnter","element","i","set","isDropdownVisible","length","position","offset","active","anchorRef","tooltipRef","width","handleFocus","handleMouseDown","handleMouseEnter","cursor","interactive","handleChange","event","value","currentTarget","handleClearOrSubmit","handleFocusChange","focused","containsFocusRef","handleInputKeydown","key","preventDefault","stopPropagation","blur","handleContainerKeydown","staged","AutocompleteInputDropdown","Box","DROP_SHADOW"],"mappings":"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","sourcesContent":["import composeRefs from \"@seznam/compose-react-refs\"\nimport React, {\n createRef,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\"\nimport styled from \"styled-components\"\nimport { useKeyboardListNavigation } from \"use-keyboard-list-navigation\"\nimport { Spinner } from \"..\"\nimport { DROP_SHADOW } from \"../../helpers\"\nimport { CloseIcon, MagnifyingGlassIcon } from \"../../svgs\"\nimport { usePosition, useContainsFocus } from \"../../utils\"\nimport { useWidthOf } from \"../../utils/useWidthOf\"\nimport { Box, splitBoxProps } from \"../Box\"\nimport { Clickable } from \"../Clickable\"\nimport { InputProps } from \"../Input\"\nimport { LabeledInput } from \"../LabeledInput\"\nimport { VisuallyHidden } from \"../VisuallyHidden\"\nimport { AutocompleteInputOption } from \"./AutocompleteInputOption\"\nimport { AutocompleteInputOptionLabel } from \"./AutocompleteInputOptionLabel\"\n\n/** Base option type — can be expanded */\nexport interface AutocompleteInputOptionType {\n text: string\n value: string\n}\n\ninterface State {\n open: boolean\n query: string\n}\n\ntype Action =\n | { type: \"OPEN\" }\n | { type: \"CLOSE\" }\n | { type: \"CLEAR\" }\n | { type: \"CHANGE\"; payload: { query: string } }\n | { type: \"SELECT\"; payload: { query: string } }\n\nconst reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"OPEN\":\n return { ...state, open: true }\n case \"CLOSE\":\n return { ...state, open: false }\n case \"CLEAR\":\n return { ...state, query: \"\" }\n case \"CHANGE\":\n return { ...state, query: action.payload.query, open: true }\n case \"SELECT\":\n return { ...state, query: action.payload.query, open: false }\n }\n}\n\nexport interface AutocompleteInputProps<T extends AutocompleteInputOptionType>\n extends Omit<InputProps, \"onSelect\" | \"onSubmit\"> {\n defaultValue?: string\n loading?: boolean\n /** on <enter> when no option is selected */\n onSubmit?(query: string): void\n /** on <click> or <enter> when an option is selected */\n onSelect?(option: T, index: number): void\n /** on <click> of the 'x' (clear) button */\n onClear?(): void\n /** Callback that runs when options are hidden */\n onClose?(): void\n renderOption?(\n option: T,\n i: number\n ): React.ReactElement<any, string | React.JSXElementConstructor<any>>\n options: T[]\n}\n\n/** AutocompleteInput */\nexport const AutocompleteInput = <T extends AutocompleteInputOptionType>({\n defaultValue = \"\",\n id,\n loading,\n onSubmit,\n onSelect,\n onChange,\n onClear,\n onClose,\n onKeyDown,\n height,\n renderOption = (option) => <AutocompleteInputOptionLabel {...option} />,\n options,\n ...rest\n}: AutocompleteInputProps<T>) => {\n const inputRef = useRef<HTMLInputElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n\n const [boxProps, inputProps] = splitBoxProps(rest)\n\n const [state, dispatch] = useReducer(reducer, {\n open: false,\n query: defaultValue,\n })\n\n const optionsWithRefs = useMemo(() => {\n return options.map((option) => ({\n option,\n ref: createRef<HTMLButtonElement>(),\n }))\n }, [options])\n\n const resetUI = () => {\n setTimeout(() => {\n inputRef.current?.focus()\n reset()\n dispatch({ type: \"CLOSE\" })\n }, 100)\n }\n\n const handleSelect = (option: T, index: number) => {\n dispatch({ type: \"SELECT\", payload: { query: option.text } })\n inputRef.current?.focus()\n onSelect?.(option, index)\n }\n\n const { index, reset, set } = useKeyboardListNavigation({\n ref: containerRef,\n list: options,\n waitForInteractive: true,\n onEnter: ({ element: option, index: i }) => {\n handleSelect(option, i)\n resetUI()\n },\n })\n\n const isDropdownVisible = state.open && options.length > 0\n\n // Reset keyboard navigation when options change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(reset, [options])\n\n // Reset keyboard navigation when query is empty\n useEffect(() => {\n if (state.query === \"\") reset()\n }, [reset, state.query])\n\n const { anchorRef, tooltipRef } = usePosition({\n position: \"bottom\",\n offset: 10,\n active: isDropdownVisible,\n })\n\n const { width } = useWidthOf({ ref: anchorRef })\n\n const handleFocus = () => {\n reset()\n dispatch({ type: \"OPEN\" })\n }\n\n const handleMouseDown = (option: T, i: number) => () => {\n handleSelect(option, i)\n resetUI()\n }\n\n const handleMouseEnter = (i: number) => () => {\n set({ cursor: i, interactive: true })\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const {\n currentTarget: { value },\n } = event\n\n dispatch({ type: \"CHANGE\", payload: { query: value } })\n onChange?.(event)\n }\n\n const handleClearOrSubmit = () => {\n if (state.query === \"\") {\n onSubmit?.(state.query)\n return\n }\n\n dispatch({ type: \"CLEAR\" })\n inputRef.current?.focus()\n onClear?.()\n }\n\n // Moves focus to different options when keyboard navigating using up/down\n useEffect(() => {\n const option = optionsWithRefs[index]\n option?.ref?.current?.focus()\n }, [index, optionsWithRefs])\n\n const handleFocusChange = useCallback(\n (focused: boolean) => {\n if (focused || !isDropdownVisible) return\n\n dispatch({ type: \"CLOSE\" })\n reset()\n onClose?.()\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onClose, isDropdownVisible]\n )\n\n // Handle closing the dropdown when clicking outside of the input\n // or when focus leaves the input completely\n const { ref: containsFocusRef } = useContainsFocus({\n onChange: handleFocusChange,\n })\n\n const handleInputKeydown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n // Handle <Enter> when nothing is selected\n case \"Enter\":\n if (state.query !== \"\" && index === -1) {\n onSubmit?.(state.query)\n resetUI()\n }\n return\n\n // <Esc> to close dropdown\n case \"Escape\":\n event.preventDefault()\n event.stopPropagation()\n\n dispatch({ type: \"CLOSE\" })\n inputRef.current?.blur()\n\n return\n\n default:\n break\n }\n\n onKeyDown?.(event)\n }\n\n // Moves focus back to input when typing\n const handleContainerKeydown = (\n event: React.KeyboardEvent<HTMLDivElement>\n ) => {\n switch (event.key) {\n case \"Alt\":\n case \"ArrowDown\":\n case \"ArrowUp\":\n case \"Control\":\n case \"Enter\":\n case \"Meta\":\n case \"Shift\":\n case \"Tab\":\n // Ignore\n return\n\n case \"Escape\":\n event.preventDefault()\n event.stopPropagation()\n\n dispatch({ type: \"CLOSE\" })\n inputRef.current?.blur()\n reset()\n\n return\n\n default:\n inputRef.current?.focus()\n }\n }\n\n // Option that is being hovered or keyed into\n const staged = options[index]\n\n return (\n <Box\n ref={composeRefs(containerRef, containsFocusRef) as any}\n onKeyDown={handleContainerKeydown}\n {...boxProps}\n >\n <LabeledInput\n ref={composeRefs(inputRef, anchorRef) as any}\n role=\"combobox\"\n aria-expanded={isDropdownVisible}\n aria-autocomplete=\"list\"\n {...(id ? { id, \"aria-describedby\": `${id}__assistiveHint` } : {})}\n label={\n loading ? (\n <Box width={18}>\n <Spinner size=\"small\" />\n </Box>\n ) : state.query ? (\n <Clickable\n onClick={handleClearOrSubmit}\n height=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n aria-label=\"Clear input\"\n >\n <CloseIcon fill=\"black60\" aria-hidden />\n </Clickable>\n ) : (\n <MagnifyingGlassIcon fill=\"black60\" aria-hidden />\n )\n }\n value={staged?.text ?? state.query}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleInputKeydown}\n autoComplete=\"off\"\n height={height}\n {...inputProps}\n />\n\n {isDropdownVisible && (\n <AutocompleteInputDropdown\n ref={tooltipRef as any}\n role=\"listbox\"\n width={width}\n >\n {optionsWithRefs.map(({ option, ref }, i) => {\n return (\n <AutocompleteInputOption\n key={i}\n ref={ref}\n role=\"option\"\n aria-selected={i === index}\n aria-posinset={i + 1}\n aria-setsize={options.length}\n onMouseDown={handleMouseDown(option, i)}\n onMouseEnter={handleMouseEnter(i)}\n selected={i === index}\n tabIndex={-1}\n >\n {renderOption(option, i)}\n </AutocompleteInputOption>\n )\n })}\n </AutocompleteInputDropdown>\n )}\n\n <VisuallyHidden {...(id ? { id: `${id}__assistiveHint` } : {})}>\n When autocomplete results are available use up and down arrows to review\n and enter to select. Touch device users, explore by touch or with swipe\n gestures.\n </VisuallyHidden>\n\n {isDropdownVisible && (\n <VisuallyHidden role=\"status\" aria-atomic=\"true\" aria-live=\"polite\">\n {options.length === 1\n ? `1 result is available`\n : `${options.length} results are available`}\n </VisuallyHidden>\n )}\n </Box>\n )\n}\n\nconst AutocompleteInputDropdown = styled(Box)`\n box-shadow: ${DROP_SHADOW};\n max-height: 300px;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n z-index: 1;\n`\n"],"file":"AutocompleteInput.js"}
@@ -107,7 +107,8 @@ var Default = function Default() {
107
107
  placeholder: "Search",
108
108
  options: OPTIONS,
109
109
  onSelect: (0, _addonActions.action)("onSelect"),
110
- onSubmit: (0, _addonActions.action)("onSubmit")
110
+ onSubmit: (0, _addonActions.action)("onSubmit"),
111
+ onClose: (0, _addonActions.action)("onClose")
111
112
  }));
112
113
  };
113
114
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/AutocompleteInput/AutocompleteInput.story.tsx"],"names":["title","OPTIONS","text","value","subtitle","Default","loading","options","height","map","option","renderOption","Demo","query","setQuery","handleChange","event","target","i","displayQuery","borderBottom","borderColor"],"mappings":"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","sourcesContent":["import { action } from \"@storybook/addon-actions\"\nimport React, { useState } from \"react\"\nimport { States } from \"storybook-states\"\nimport { Box } from \"../Box\"\nimport { Text } from \"../Text\"\nimport { AutocompleteInput, AutocompleteInputProps } from \"./AutocompleteInput\"\n\nexport default {\n title: \"Components/AutocompleteInput\",\n}\n\nconst OPTIONS = [\n {\n text: \"Painting\",\n value: \"painting\",\n subtitle: \"An example subtitle\",\n },\n { text: \"Print\", value: \"print\", subtitle: \"An example subtitle\" },\n { text: \"Sculpture\", value: \"sculpture\", subtitle: \"An example subtitle\" },\n {\n text: \"Photography\",\n value: \"photography\",\n subtitle: \"An example subtitle\",\n },\n {\n text: \"Mixed Media\",\n value: \"mixed-media\",\n subtitle: \"An example subtitle\",\n },\n]\n\nexport const Default = () => {\n return (\n <States<Partial<AutocompleteInputProps<typeof OPTIONS[number]>>>\n states={[\n {},\n { loading: true },\n { options: [], height: 40 },\n {\n options: [\n ...OPTIONS,\n ...OPTIONS.map((option) => ({\n ...option,\n text: `Another ${option.text}`,\n value: `another-${option.value}`,\n })),\n ],\n renderOption: (option) => (\n <Box px={2} py={1}>\n <Text variant=\"md\">{option.text}</Text>\n <Text variant=\"xs\" color=\"black60\">\n {option.subtitle}\n </Text>\n </Box>\n ),\n },\n ]}\n >\n <AutocompleteInput\n placeholder=\"Search\"\n options={OPTIONS}\n onSelect={action(\"onSelect\")}\n onSubmit={action(\"onSubmit\")}\n />\n </States>\n )\n}\n\nexport const Demo = () => {\n const [query, setQuery] = useState(\"\")\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n }\n\n return (\n <AutocompleteInput\n placeholder=\"Begin typing...\"\n options={[...(query ? [{ text: query, value: query }] : []), ...OPTIONS]}\n onChange={handleChange}\n onSelect={action(\"onSelect\")}\n onSubmit={action(\"onSubmit\")}\n onClose={action(\"onClose\")}\n renderOption={(option, i) => {\n const displayQuery = i === 0 && query !== \"\"\n\n return (\n <Box\n px={2}\n py={1}\n {...(displayQuery\n ? { borderBottom: \"1px solid\", borderColor: \"black10\" }\n : {})}\n >\n <Text variant=\"md\">\n {displayQuery\n ? `See full results for “${option.text}”`\n : option.text}\n </Text>\n\n {\"subtitle\" in option && (\n <Text variant=\"xs\" color=\"black60\">\n {option.subtitle}\n </Text>\n )}\n </Box>\n )\n }}\n />\n )\n}\n"],"file":"AutocompleteInput.story.js"}
1
+ {"version":3,"sources":["../../../src/elements/AutocompleteInput/AutocompleteInput.story.tsx"],"names":["title","OPTIONS","text","value","subtitle","Default","loading","options","height","map","option","renderOption","Demo","query","setQuery","handleChange","event","target","i","displayQuery","borderBottom","borderColor"],"mappings":"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","sourcesContent":["import { action } from \"@storybook/addon-actions\"\nimport React, { useState } from \"react\"\nimport { States } from \"storybook-states\"\nimport { Box } from \"../Box\"\nimport { Text } from \"../Text\"\nimport { AutocompleteInput, AutocompleteInputProps } from \"./AutocompleteInput\"\n\nexport default {\n title: \"Components/AutocompleteInput\",\n}\n\nconst OPTIONS = [\n {\n text: \"Painting\",\n value: \"painting\",\n subtitle: \"An example subtitle\",\n },\n { text: \"Print\", value: \"print\", subtitle: \"An example subtitle\" },\n { text: \"Sculpture\", value: \"sculpture\", subtitle: \"An example subtitle\" },\n {\n text: \"Photography\",\n value: \"photography\",\n subtitle: \"An example subtitle\",\n },\n {\n text: \"Mixed Media\",\n value: \"mixed-media\",\n subtitle: \"An example subtitle\",\n },\n]\n\nexport const Default = () => {\n return (\n <States<Partial<AutocompleteInputProps<typeof OPTIONS[number]>>>\n states={[\n {},\n { loading: true },\n { options: [], height: 40 },\n {\n options: [\n ...OPTIONS,\n ...OPTIONS.map((option) => ({\n ...option,\n text: `Another ${option.text}`,\n value: `another-${option.value}`,\n })),\n ],\n renderOption: (option) => (\n <Box px={2} py={1}>\n <Text variant=\"md\">{option.text}</Text>\n <Text variant=\"xs\" color=\"black60\">\n {option.subtitle}\n </Text>\n </Box>\n ),\n },\n ]}\n >\n <AutocompleteInput\n placeholder=\"Search\"\n options={OPTIONS}\n onSelect={action(\"onSelect\")}\n onSubmit={action(\"onSubmit\")}\n onClose={action(\"onClose\")}\n />\n </States>\n )\n}\n\nexport const Demo = () => {\n const [query, setQuery] = useState(\"\")\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n }\n\n return (\n <AutocompleteInput\n placeholder=\"Begin typing...\"\n options={[...(query ? [{ text: query, value: query }] : []), ...OPTIONS]}\n onChange={handleChange}\n onSelect={action(\"onSelect\")}\n onSubmit={action(\"onSubmit\")}\n onClose={action(\"onClose\")}\n renderOption={(option, i) => {\n const displayQuery = i === 0 && query !== \"\"\n\n return (\n <Box\n px={2}\n py={1}\n {...(displayQuery\n ? { borderBottom: \"1px solid\", borderColor: \"black10\" }\n : {})}\n >\n <Text variant=\"md\">\n {displayQuery\n ? `See full results for “${option.text}”`\n : option.text}\n </Text>\n\n {\"subtitle\" in option && (\n <Text variant=\"xs\" color=\"black60\">\n {option.subtitle}\n </Text>\n )}\n </Box>\n )\n }}\n />\n )\n}\n"],"file":"AutocompleteInput.story.js"}
@@ -28,7 +28,7 @@ var textDecoration = (0, _styledSystem.system)({
28
28
  var Clickable = _styledComponents.default.button.withConfig({
29
29
  displayName: "Clickable",
30
30
  componentId: "sc-10cr82y-0"
31
- })(["appearance:none;padding:0;border:0;background-color:transparent;color:inherit;font:inherit;text-align:inherit;", " &:disabled{cursor:default;}"], (0, _styledSystem.compose)(_Box.boxMixin, cursor, textDecoration));
31
+ })(["appearance:none;padding:0;border:0;margin:0;background-color:transparent;color:inherit;font:inherit;text-align:inherit;", " &:disabled{cursor:default;}"], (0, _styledSystem.compose)(_Box.boxMixin, cursor, textDecoration));
32
32
 
33
33
  exports.Clickable = Clickable;
34
34
  Clickable.defaultProps = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/Clickable/Clickable.tsx"],"names":["cursor","textDecoration","Clickable","styled","button","boxMixin","defaultProps","type"],"mappings":";;;;;;;AACA;;AACA;;AACA;;;;AAEA,IAAMA,MAAM,GAAG,0BAAO;AAAEA,EAAAA,MAAM,EAAE;AAAV,CAAP,CAAf;AACA,IAAMC,cAAc,GAAG,0BAAO;AAAEA,EAAAA,cAAc,EAAE;AAAlB,CAAP,CAAvB;AAEA;;AAOA;AACA;AACA;AACA;AACO,IAAMC,SAAS,GAAGC,0BAAOC,MAAV;AAAA;AAAA;AAAA,uJASlB,2BAAQC,aAAR,EAAkBL,MAAlB,EAA0BC,cAA1B,CATkB,CAAf;;;AAgBPC,SAAS,CAACI,YAAV,GAAyB;AACvBN,EAAAA,MAAM,EAAE,SADe;AAEvBO,EAAAA,IAAI,EAAE;AAFiB,CAAzB","sourcesContent":["import React from \"react\"\nimport styled from \"styled-components\"\nimport { compose, ResponsiveValue, system } from \"styled-system\"\nimport { boxMixin, BoxProps } from \"../Box\"\n\nconst cursor = system({ cursor: true })\nconst textDecoration = system({ textDecoration: true })\n\n/** ClickableProps */\nexport type ClickableProps = React.ButtonHTMLAttributes<HTMLButtonElement> &\n BoxProps & {\n cursor?: ResponsiveValue<string>\n textDecoration?: ResponsiveValue<string>\n }\n\n/**\n * Clickable is a utility component useful for wrapping things like <div>s\n * without having to deal with the requirements to make the <div> accessible.\n */\nexport const Clickable = styled.button<ClickableProps>`\n appearance: none;\n padding: 0;\n border: 0;\n background-color: transparent;\n color: inherit;\n font: inherit;\n text-align: inherit;\n\n ${compose(boxMixin, cursor, textDecoration)}\n\n &:disabled {\n cursor: default;\n }\n`\n\nClickable.defaultProps = {\n cursor: \"pointer\",\n type: \"button\",\n}\n"],"file":"Clickable.js"}
1
+ {"version":3,"sources":["../../../src/elements/Clickable/Clickable.tsx"],"names":["cursor","textDecoration","Clickable","styled","button","boxMixin","defaultProps","type"],"mappings":";;;;;;;AACA;;AACA;;AACA;;;;AAEA,IAAMA,MAAM,GAAG,0BAAO;AAAEA,EAAAA,MAAM,EAAE;AAAV,CAAP,CAAf;AACA,IAAMC,cAAc,GAAG,0BAAO;AAAEA,EAAAA,cAAc,EAAE;AAAlB,CAAP,CAAvB;AAEA;;AAOA;AACA;AACA;AACA;AACO,IAAMC,SAAS,GAAGC,0BAAOC,MAAV;AAAA;AAAA;AAAA,gKAUlB,2BAAQC,aAAR,EAAkBL,MAAlB,EAA0BC,cAA1B,CAVkB,CAAf;;;AAiBPC,SAAS,CAACI,YAAV,GAAyB;AACvBN,EAAAA,MAAM,EAAE,SADe;AAEvBO,EAAAA,IAAI,EAAE;AAFiB,CAAzB","sourcesContent":["import React from \"react\"\nimport styled from \"styled-components\"\nimport { compose, ResponsiveValue, system } from \"styled-system\"\nimport { boxMixin, BoxProps } from \"../Box\"\n\nconst cursor = system({ cursor: true })\nconst textDecoration = system({ textDecoration: true })\n\n/** ClickableProps */\nexport type ClickableProps = React.ButtonHTMLAttributes<HTMLButtonElement> &\n BoxProps & {\n cursor?: ResponsiveValue<string>\n textDecoration?: ResponsiveValue<string>\n }\n\n/**\n * Clickable is a utility component useful for wrapping things like <div>s\n * without having to deal with the requirements to make the <div> accessible.\n */\nexport const Clickable = styled.button<ClickableProps>`\n appearance: none;\n padding: 0;\n border: 0;\n margin: 0;\n background-color: transparent;\n color: inherit;\n font: inherit;\n text-align: inherit;\n\n ${compose(boxMixin, cursor, textDecoration)}\n\n &:disabled {\n cursor: default;\n }\n`\n\nClickable.defaultProps = {\n cursor: \"pointer\",\n type: \"button\",\n}\n"],"file":"Clickable.js"}
@@ -46,6 +46,11 @@ var Default = function Default() {
46
46
  cursor: "default"
47
47
  }, {
48
48
  children: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Inherits the page\u2019s", /*#__PURE__*/_react.default.createElement("br", null), "text alignment.")
49
+ }, {
50
+ bg: "red100",
51
+ color: "white100",
52
+ m: 2,
53
+ p: 1
49
54
  }]
50
55
  }, /*#__PURE__*/_react.default.createElement(_Clickable.Clickable, {
51
56
  onClick: (0, _addonActions.action)("onClick")
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/Clickable/Clickable.story.tsx"],"names":["title","Default","textDecoration","cursor","children","Submit","isSubmitted","setSubmitted","e","preventDefault","setTimeout","story","name"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;eAEe;AACbA,EAAAA,KAAK,EAAE;AADM,C;;;AAIR,IAAMC,OAAO,GAAG,SAAVA,OAAU,GAAM;AAC3B,sBACE,6BAAC,uBAAD;AACE,IAAA,MAAM,EAAE,CACN,EADM,EAEN;AAAEC,MAAAA,cAAc,EAAE;AAAlB,KAFM,EAGN;AAAEC,MAAAA,MAAM,EAAE;AAAV,KAHM,EAIN;AACEC,MAAAA,QAAQ,eACN,qGAEE,wCAFF;AAFJ,KAJM;AADV,kBAgBE,6BAAC,oBAAD;AAAW,IAAA,OAAO,EAAE,0BAAO,SAAP;AAApB,iBAhBF,CADF;AAoBD,CArBM;;;AAAMH,O;;AAuBN,IAAMI,MAAM,GAAG,SAATA,MAAS,GAAM;AAAA,kBACU,qBAAS,KAAT,CADV;AAAA;AAAA,MACnBC,WADmB;AAAA,MACNC,YADM;;AAG1B,sBACE;AACE,IAAA,QAAQ,EAAE,kBAACC,CAAD,EAAO;AACfA,MAAAA,CAAC,CAACC,cAAF;AACAF,MAAAA,YAAY,CAAC,IAAD,CAAZ;AAEAG,MAAAA,UAAU,CAAC,YAAM;AACfH,QAAAA,YAAY,CAAC,KAAD,CAAZ;AACD,OAFS,EAEP,IAFO,CAAV;AAGD;AARH,kBAUE,yDAAiBD,WAAW,GAAG,KAAH,GAAW,IAAvC,CAVF,eAYE,6BAAC,QAAD;AAAK,IAAA,EAAE,EAAE;AAAT,kBACE,6BAAC,oBAAD;AAAW,IAAA,MAAM,EAAC,WAAlB;AAA8B,IAAA,CAAC,EAAE,CAAjC;AAAoC,IAAA,IAAI,EAAC,QAAzC;AAAkD,IAAA,EAAE,EAAE;AAAtD,uBADF,eAKE,6BAAC,oBAAD;AAAW,IAAA,MAAM,EAAC,WAAlB;AAA8B,IAAA,CAAC,EAAE,CAAjC;AAAoC,IAAA,IAAI,EAAC;AAAzC,uBALF,CAZF,CADF;AAwBD,CA3BM;;;AAAMD,M;AA6BbA,MAAM,CAACM,KAAP,GAAe;AACbC,EAAAA,IAAI,EAAE;AADO,CAAf","sourcesContent":["import { action } from \"@storybook/addon-actions\"\nimport React, { useState } from \"react\"\nimport { States } from \"storybook-states\"\nimport { Box } from \"../Box\"\nimport { Clickable, ClickableProps } from \"./Clickable\"\n\nexport default {\n title: \"Components/Clickable\",\n}\n\nexport const Default = () => {\n return (\n <States<ClickableProps>\n states={[\n {},\n { textDecoration: \"underline\" },\n { cursor: \"default\" },\n {\n children: (\n <>\n Inherits the page’s\n <br />\n text alignment.\n </>\n ),\n },\n ]}\n >\n <Clickable onClick={action(\"onClick\")}>Clickable</Clickable>\n </States>\n )\n}\n\nexport const Submit = () => {\n const [isSubmitted, setSubmitted] = useState(false)\n\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault()\n setSubmitted(true)\n\n setTimeout(() => {\n setSubmitted(false)\n }, 1000)\n }}\n >\n <pre>submitted? {isSubmitted ? \"yes\" : \"no\"}</pre>\n\n <Box mt={1}>\n <Clickable border=\"1px solid\" p={2} type=\"button\" mr={1}>\n type=\"button\"\n </Clickable>\n\n <Clickable border=\"1px solid\" p={2} type=\"submit\">\n type=\"submit\"\n </Clickable>\n </Box>\n </form>\n )\n}\n\nSubmit.story = {\n name: \"Does not submit forms by default\",\n}\n"],"file":"Clickable.story.js"}
1
+ {"version":3,"sources":["../../../src/elements/Clickable/Clickable.story.tsx"],"names":["title","Default","textDecoration","cursor","children","bg","color","m","p","Submit","isSubmitted","setSubmitted","e","preventDefault","setTimeout","story","name"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;eAEe;AACbA,EAAAA,KAAK,EAAE;AADM,C;;;AAIR,IAAMC,OAAO,GAAG,SAAVA,OAAU,GAAM;AAC3B,sBACE,6BAAC,uBAAD;AACE,IAAA,MAAM,EAAE,CACN,EADM,EAEN;AAAEC,MAAAA,cAAc,EAAE;AAAlB,KAFM,EAGN;AAAEC,MAAAA,MAAM,EAAE;AAAV,KAHM,EAIN;AACEC,MAAAA,QAAQ,eACN,qGAEE,wCAFF;AAFJ,KAJM,EAaN;AACEC,MAAAA,EAAE,EAAE,QADN;AAEEC,MAAAA,KAAK,EAAE,UAFT;AAGEC,MAAAA,CAAC,EAAE,CAHL;AAIEC,MAAAA,CAAC,EAAE;AAJL,KAbM;AADV,kBAsBE,6BAAC,oBAAD;AAAW,IAAA,OAAO,EAAE,0BAAO,SAAP;AAApB,iBAtBF,CADF;AA0BD,CA3BM;;;AAAMP,O;;AA6BN,IAAMQ,MAAM,GAAG,SAATA,MAAS,GAAM;AAAA,kBACU,qBAAS,KAAT,CADV;AAAA;AAAA,MACnBC,WADmB;AAAA,MACNC,YADM;;AAG1B,sBACE;AACE,IAAA,QAAQ,EAAE,kBAACC,CAAD,EAAO;AACfA,MAAAA,CAAC,CAACC,cAAF;AACAF,MAAAA,YAAY,CAAC,IAAD,CAAZ;AAEAG,MAAAA,UAAU,CAAC,YAAM;AACfH,QAAAA,YAAY,CAAC,KAAD,CAAZ;AACD,OAFS,EAEP,IAFO,CAAV;AAGD;AARH,kBAUE,yDAAiBD,WAAW,GAAG,KAAH,GAAW,IAAvC,CAVF,eAYE,6BAAC,QAAD;AAAK,IAAA,EAAE,EAAE;AAAT,kBACE,6BAAC,oBAAD;AAAW,IAAA,MAAM,EAAC,WAAlB;AAA8B,IAAA,CAAC,EAAE,CAAjC;AAAoC,IAAA,IAAI,EAAC,QAAzC;AAAkD,IAAA,EAAE,EAAE;AAAtD,uBADF,eAKE,6BAAC,oBAAD;AAAW,IAAA,MAAM,EAAC,WAAlB;AAA8B,IAAA,CAAC,EAAE,CAAjC;AAAoC,IAAA,IAAI,EAAC;AAAzC,uBALF,CAZF,CADF;AAwBD,CA3BM;;;AAAMD,M;AA6BbA,MAAM,CAACM,KAAP,GAAe;AACbC,EAAAA,IAAI,EAAE;AADO,CAAf","sourcesContent":["import { action } from \"@storybook/addon-actions\"\nimport React, { useState } from \"react\"\nimport { States } from \"storybook-states\"\nimport { Box } from \"../Box\"\nimport { Clickable, ClickableProps } from \"./Clickable\"\n\nexport default {\n title: \"Components/Clickable\",\n}\n\nexport const Default = () => {\n return (\n <States<ClickableProps>\n states={[\n {},\n { textDecoration: \"underline\" },\n { cursor: \"default\" },\n {\n children: (\n <>\n Inherits the page’s\n <br />\n text alignment.\n </>\n ),\n },\n {\n bg: \"red100\",\n color: \"white100\",\n m: 2,\n p: 1,\n },\n ]}\n >\n <Clickable onClick={action(\"onClick\")}>Clickable</Clickable>\n </States>\n )\n}\n\nexport const Submit = () => {\n const [isSubmitted, setSubmitted] = useState(false)\n\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault()\n setSubmitted(true)\n\n setTimeout(() => {\n setSubmitted(false)\n }, 1000)\n }}\n >\n <pre>submitted? {isSubmitted ? \"yes\" : \"no\"}</pre>\n\n <Box mt={1}>\n <Clickable border=\"1px solid\" p={2} type=\"button\" mr={1}>\n type=\"button\"\n </Clickable>\n\n <Clickable border=\"1px solid\" p={2} type=\"submit\">\n type=\"submit\"\n </Clickable>\n </Box>\n </form>\n )\n}\n\nSubmit.story = {\n name: \"Does not submit forms by default\",\n}\n"],"file":"Clickable.story.js"}
@@ -1,4 +1,4 @@
1
- import { SFC } from "react";
1
+ import { FC } from "react";
2
2
  /**
3
3
  * FIXME: This whole thing needs to be rebuilt from scratch
4
4
  */
@@ -21,7 +21,7 @@ export declare enum ModalWidth {
21
21
  }
22
22
  /**
23
23
  * Modal.
24
- * Spec: https://app.zeplin.io/project/5acd19ff49a1429169c3128b/screen/5c75ad115c1db5628cc03c2a
24
+ * Spec: https://www.figma.com/file/m6gDpKHEWDbYJyrwsVZDBr/Artsy-3.0-Design-System?node-id=6150%3A7290
25
25
  */
26
- export declare const Modal: SFC<ModalProps>;
26
+ export declare const Modal: FC<ModalProps>;
27
27
  export {};
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.Modal = exports.ModalWidth = void 0;
9
9
 
10
+ var _themeGet = require("@styled-system/theme-get");
11
+
10
12
  var _react = _interopRequireWildcard(require("react"));
11
13
 
12
14
  var _styledComponents = _interopRequireDefault(require("styled-components"));
@@ -21,11 +23,15 @@ var _Box = require("../Box");
21
23
 
22
24
  var _Flex = require("../Flex");
23
25
 
26
+ var _Join = require("../Join");
27
+
24
28
  var _Spacer = require("../Spacer");
25
29
 
26
- var _Typography = require("../Typography");
30
+ var _Text = require("../Text");
27
31
 
28
- var _templateObject, _templateObject2, _templateObject3, _templateObject4;
32
+ var _useOnScroll2 = require("../../utils/useOnScroll");
33
+
34
+ var _templateObject, _templateObject2;
29
35
 
30
36
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
37
 
@@ -50,7 +56,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
50
56
  var ModalWidth;
51
57
  /**
52
58
  * Modal.
53
- * Spec: https://app.zeplin.io/project/5acd19ff49a1429169c3128b/screen/5c75ad115c1db5628cc03c2a
59
+ * Spec: https://www.figma.com/file/m6gDpKHEWDbYJyrwsVZDBr/Artsy-3.0-Design-System?node-id=6150%3A7290
54
60
  */
55
61
 
56
62
  exports.ModalWidth = ModalWidth;
@@ -78,6 +84,10 @@ var Modal = function Modal(_ref) {
78
84
  fadeIn = _useState2[0],
79
85
  setFadeIn = _useState2[1];
80
86
 
87
+ var _useOnScroll = (0, _useOnScroll2.useOnScroll)(),
88
+ isScrolled = _useOnScroll.isScrolled,
89
+ elementRef = _useOnScroll.elementRef;
90
+
81
91
  var handleEscapeKey = function handleEscapeKey(event) {
82
92
  if (event && event.key === "Escape") {
83
93
  onClose();
@@ -126,39 +136,64 @@ var Modal = function Modal(_ref) {
126
136
  isWide: isWide,
127
137
  show: show,
128
138
  className: fadeIn ? "fadeIn" : ""
129
- }, /*#__PURE__*/_react.default.createElement(ModalFlexContent, null, !hideCloseButton && /*#__PURE__*/_react.default.createElement(CloseIconWrapper, {
139
+ }, /*#__PURE__*/_react.default.createElement(ModalFlexContent, null, /*#__PURE__*/_react.default.createElement(ModalStickyHeader, {
140
+ position: "sticky",
141
+ top: 0,
142
+ display: "flex",
143
+ justifyContent: "center",
144
+ flexDirection: "column",
145
+ isScrolled: isScrolled,
146
+ px: 2
147
+ }, /*#__PURE__*/_react.default.createElement(_Spacer.Spacer, {
148
+ my: 1
149
+ }), /*#__PURE__*/_react.default.createElement(_Flex.Flex, null, /*#__PURE__*/_react.default.createElement(_Box.Box, {
150
+ pr: 6,
151
+ flex: 1
152
+ }, /*#__PURE__*/_react.default.createElement(_Join.Join, {
153
+ separator: /*#__PURE__*/_react.default.createElement(_Spacer.Spacer, {
154
+ py: 1
155
+ })
156
+ }, hasLogo && /*#__PURE__*/_react.default.createElement(Logo, {
157
+ my: 1
158
+ }), title && /*#__PURE__*/_react.default.createElement(_Text.Text, {
159
+ variant: "lg",
160
+ color: "black100",
161
+ py: hasLogo ? 0 : 1
162
+ }, title))), !hideCloseButton && /*#__PURE__*/_react.default.createElement(CloseIconWrapper, {
163
+ my: 1,
130
164
  onClick: function onClick() {
131
165
  return onClose();
132
166
  }
133
167
  }, /*#__PURE__*/_react.default.createElement(_svgs.CloseIcon, {
134
168
  fill: "black60"
169
+ }))), /*#__PURE__*/_react.default.createElement(_Spacer.Spacer, {
170
+ py: 1
135
171
  })), /*#__PURE__*/_react.default.createElement(ModalScrollContent, {
136
172
  hasLogo: hasLogo,
137
- modalWidth: modalWidth
138
- }, hasLogo && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Flex.Flex, {
139
- justifyContent: "center"
140
- }, /*#__PURE__*/_react.default.createElement(Logo, null)), /*#__PURE__*/_react.default.createElement(_Spacer.Spacer, {
141
- mb: 2
142
- })), title && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Flex.Flex, {
143
- justifyContent: "center"
144
- }, /*#__PURE__*/_react.default.createElement(_Typography.Sans, {
145
- size: "5t",
146
- textAlign: "center",
147
- color: "black100"
148
- }, title)), /*#__PURE__*/_react.default.createElement(_Spacer.Spacer, {
149
- mb: hasLogo ? 2 : [1, 2]
150
- })), children), FixedButton && /*#__PURE__*/_react.default.createElement(FixedButtonWrapper, null, FixedButton))))));
173
+ modalWidth: modalWidth,
174
+ px: 2,
175
+ py: 1,
176
+ pb: 2
177
+ }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(Sentinel, {
178
+ ref: elementRef
179
+ }), children)), FixedButton && /*#__PURE__*/_react.default.createElement(FixedButtonWrapper, {
180
+ isScrolled: isScrolled,
181
+ p: 2
182
+ }, FixedButton))))));
151
183
  };
152
184
 
153
185
  exports.Modal = Modal;
154
186
  var FixedButtonWrapper = (0, _styledComponents.default)(_Flex.Flex).withConfig({
155
187
  displayName: "Modal__FixedButtonWrapper",
156
188
  componentId: "qjtwq0-0"
157
- })(["border-top:1px solid ", ";padding:", "px;", ";flex:0 0 auto;"], (0, _helpers.color)("black10"), (0, _helpers.space)(3), _helpers.media.xs(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: ", "px;\n "])), (0, _helpers.space)(2)));
189
+ })(["box-shadow:", ";flex:0 0 auto;transition:box-shadow 250ms ease-in-out;"], function (_ref2) {
190
+ var isScrolled = _ref2.isScrolled;
191
+ return isScrolled ? _helpers.DROP_SHADOW : "none";
192
+ });
158
193
  var ModalOuterWrapper = (0, _styledComponents.default)(_Box.Box).withConfig({
159
194
  displayName: "Modal__ModalOuterWrapper",
160
195
  componentId: "qjtwq0-1"
161
- })(["position:fixed;top:0;left:0;z-index:9999;width:100vw;height:100vh;background-color:rgba(229,229,229,0.5);opacity:0;pointer-events:", ";&.fadeIn{transition:opacity 250ms ease;transition-delay:1ms;opacity:1;}"], function (props) {
196
+ })(["position:fixed;top:0;left:0;z-index:9999;width:100vw;height:100vh;background-color:", ";opacity:0;pointer-events:", ";&.fadeIn{transition:opacity 250ms ease;transition-delay:1ms;opacity:1;}"], (0, _themeGet.themeGet)("colors.black5"), function (props) {
162
197
  return props.show ? "auto" : "none";
163
198
  });
164
199
  var ModalWrapper = (0, _styledComponents.default)(_Flex.Flex).withConfig({
@@ -168,29 +203,41 @@ var ModalWrapper = (0, _styledComponents.default)(_Flex.Flex).withConfig({
168
203
  var ModalElement = (0, _styledComponents.default)(_Box.Box).withConfig({
169
204
  displayName: "Modal__ModalElement",
170
205
  componentId: "qjtwq0-3"
171
- })(["position:absolute;border-radius:5px;height:", ";max-height:calc(100vh - 80px);min-height:58px;overflow:hidden;background-color:", ";box-shadow:0px 4px 15px rgba(0,0,0,0.15);width:", ";", ";transform:translateY(2000px);&.fadeIn{transition:all 400ms cubic-bezier(0.075,0.82,0.165,1);transition-delay:1ms;transform:translateY(0px);}"], function (props) {
206
+ })(["position:absolute;height:", ";max-height:calc(100vh - 80px);min-height:58px;overflow:hidden;background-color:", ";box-shadow:", ";width:", ";", ";transform:translateY(2000px);&.fadeIn{transition:all 400ms cubic-bezier(0.075,0.82,0.165,1);transition-delay:1ms;transform:translateY(0px);}"], function (props) {
172
207
  return props.height ? props.height : "auto";
173
- }, (0, _helpers.color)("white100"), function (props) {
208
+ }, (0, _themeGet.themeGet)("colors.white100"), _helpers.DROP_SHADOW, function (props) {
174
209
  return props.modalWidth || (props.isWide ? ModalWidth.Wide : ModalWidth.Normal);
175
- }, _helpers.media.xs(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n max-height: 100vh;\n height: 100vh;\n width: 100vw;\n border-radius: 0;\n "]))));
210
+ }, _helpers.media.xs(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n max-height: 100vh;\n height: 100vh;\n width: 100vw;\n border-radius: 0;\n "]))));
176
211
  var ModalFlexContent = (0, _styledComponents.default)(_Flex.Flex).withConfig({
177
212
  displayName: "Modal__ModalFlexContent",
178
213
  componentId: "qjtwq0-4"
179
- })(["position:relative;flex-direction:column;width:100%;overflow:hidden;max-height:calc(100vh - 80px);", ";"], _helpers.media.xs(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n max-height: 100vh;\n "]))));
214
+ })(["position:relative;flex-direction:column;width:100%;overflow:hidden;max-height:calc(100vh - 80px);", ";"], _helpers.media.xs(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n max-height: 100vh;\n "]))));
215
+ var ModalStickyHeader = (0, _styledComponents.default)(_Box.Box).withConfig({
216
+ displayName: "Modal__ModalStickyHeader",
217
+ componentId: "qjtwq0-5"
218
+ })(["box-shadow:", ";transition:box-shadow 250ms ease-in-out;"], function (_ref3) {
219
+ var isScrolled = _ref3.isScrolled;
220
+ return isScrolled ? _helpers.DROP_SHADOW : "none";
221
+ });
180
222
  var ModalScrollContent = (0, _styledComponents.default)(_Flex.Flex).withConfig({
181
223
  displayName: "Modal__ModalScrollContent",
182
- componentId: "qjtwq0-5"
183
- })(["overflow:auto;flex-direction:column;padding:", "px;", ";"], function (props) {
184
- return (0, _helpers.space)(props.hasLogo || props.modalWidth === ModalWidth.Narrow ? 2 : 3);
185
- }, _helpers.media.xs(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n padding: ", "px;\n "])), (0, _helpers.space)(2)));
186
- var CloseIconWrapper = (0, _styledComponents.default)(_Box.Box).withConfig({
187
- displayName: "Modal__CloseIconWrapper",
188
224
  componentId: "qjtwq0-6"
189
- })(["position:absolute;top:", "px;right:", "px;cursor:pointer;"], (0, _helpers.space)(2), (0, _helpers.space)(2));
225
+ })(["overflow:auto;flex-direction:column;"]);
226
+ var CloseIconWrapper = (0, _styledComponents.default)(_Flex.Flex).withConfig({
227
+ displayName: "Modal__CloseIconWrapper",
228
+ componentId: "qjtwq0-7"
229
+ })(["cursor:pointer;"]);
190
230
  var Logo = (0, _styledComponents.default)(_ArtsyLogoBlackIcon.ArtsyLogoBlackIcon).withConfig({
191
231
  displayName: "Modal__Logo",
192
- componentId: "qjtwq0-7"
193
- })(["width:100px;"]);
232
+ componentId: "qjtwq0-8"
233
+ })(["width:78px;"]); // This <div> is positioned such that when it leaves the top of
234
+ // the ModalScrollContent we use IntersectionObserver within the hook
235
+ // to switch on and of the shadows of the sticky elements
236
+
237
+ var Sentinel = (0, _styledComponents.default)(_Box.Box).withConfig({
238
+ displayName: "Modal__Sentinel",
239
+ componentId: "qjtwq0-9"
240
+ })(["position:relative;width:100%;height:0;"]);
194
241
  Modal.displayName = "Modal";
195
242
  ModalWrapper.displayName = "ModalWrapper";
196
243
  ModalScrollContent.displayName = "ModalScrollContent";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/Modal/Modal.tsx"],"names":["ModalWidth","Modal","children","FixedButton","title","show","modalWidth","isWide","hasLogo","onClose","hideCloseButton","wrapperRef","fadeIn","setFadeIn","handleEscapeKey","event","key","document","addEventListener","body","style","overflowY","removeEventListener","handleWrapperClick","target","current","FixedButtonWrapper","Flex","media","xs","ModalOuterWrapper","Box","props","ModalWrapper","ModalElement","height","Wide","Normal","ModalFlexContent","ModalScrollContent","Narrow","CloseIconWrapper","Logo","ArtsyLogoBlackIcon","displayName"],"mappings":"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","sourcesContent":["import React, { SFC, useEffect, useRef, useState } from \"react\"\nimport styled from \"styled-components\"\nimport { color, media, space } from \"../../helpers\"\nimport { CloseIcon } from \"../../svgs\"\nimport { ArtsyLogoBlackIcon } from \"../../svgs/ArtsyLogoBlackIcon\"\nimport { Box } from \"../Box\"\nimport { Flex } from \"../Flex\"\nimport { Spacer } from \"../Spacer\"\nimport { Sans } from \"../Typography\"\n\n/**\n * FIXME: This whole thing needs to be rebuilt from scratch\n */\n\ninterface ModalProps {\n FixedButton?: JSX.Element\n refreshModalContentKey?: string\n hasLogo?: boolean\n height?: string\n modalWidth?: ModalWidth\n isWide?: boolean\n onClose: () => void\n show?: boolean\n title?: string\n /*\n * Hide the X button if we don't want the user to be able to exit the modal without another action closing the modal\n */\n hideCloseButton?: boolean\n}\n\ninterface TransitionElementProps {\n isWide?: boolean\n show?: boolean\n modalWidth?: ModalWidth\n}\n\ninterface ModalScrollContentProps {\n hasLogo?: boolean\n modalWidth?: ModalWidth\n}\n\nexport enum ModalWidth {\n Narrow = \"300px\",\n Normal = \"440px\",\n Wide = \"900px\",\n}\n\n/**\n * Modal.\n * Spec: https://app.zeplin.io/project/5acd19ff49a1429169c3128b/screen/5c75ad115c1db5628cc03c2a\n */\nexport const Modal: SFC<ModalProps> = ({\n children,\n FixedButton,\n title,\n show,\n modalWidth, // modalWidth overwrites isWide if present\n isWide,\n hasLogo,\n onClose,\n hideCloseButton,\n}) => {\n const wrapperRef = useRef(null)\n const [fadeIn, setFadeIn] = useState(false)\n\n const handleEscapeKey = (event) => {\n if (event && event.key === \"Escape\") {\n onClose()\n }\n }\n\n useEffect(() => {\n if (show) {\n setFadeIn(true)\n\n if (!hideCloseButton) {\n // Binds key event for escape to close modal\n document.addEventListener(\"keyup\", handleEscapeKey, true)\n }\n // Fixes the body to disable scroll\n document.body.style.overflowY = \"hidden\"\n } else {\n setFadeIn(false)\n document.body.style.overflowY = \"visible\"\n document.removeEventListener(\"keyup\", handleEscapeKey, true)\n }\n\n return document.removeEventListener(\"keyup\", handleEscapeKey, true)\n }, [show])\n\n const handleWrapperClick = (event) => {\n // If modal X icon is hidden we don't want to close the modal when the wrapper is clicked\n if (!hideCloseButton && event.target === wrapperRef.current) {\n onClose()\n }\n }\n\n if (!show) {\n return null\n }\n\n return (\n <>\n <ModalOuterWrapper show={show} className={fadeIn ? \"fadeIn\" : \"\"}>\n <ModalWrapper ref={wrapperRef} onClick={handleWrapperClick}>\n <ModalElement\n modalWidth={modalWidth}\n isWide={isWide}\n show={show}\n className={fadeIn ? \"fadeIn\" : \"\"}\n >\n <ModalFlexContent>\n {!hideCloseButton && (\n <CloseIconWrapper onClick={() => onClose()}>\n <CloseIcon fill=\"black60\" />\n </CloseIconWrapper>\n )}\n <ModalScrollContent hasLogo={hasLogo} modalWidth={modalWidth}>\n {hasLogo && (\n <>\n <Flex justifyContent=\"center\">\n <Logo />\n </Flex>\n <Spacer mb={2} />\n </>\n )}\n {title && (\n <>\n <Flex justifyContent=\"center\">\n <Sans size=\"5t\" textAlign=\"center\" color=\"black100\">\n {title}\n </Sans>\n </Flex>\n <Spacer mb={hasLogo ? 2 : [1, 2]} />\n </>\n )}\n {children}\n </ModalScrollContent>\n {FixedButton && (\n <FixedButtonWrapper>{FixedButton}</FixedButtonWrapper>\n )}\n </ModalFlexContent>\n </ModalElement>\n </ModalWrapper>\n </ModalOuterWrapper>\n </>\n )\n}\n\nconst FixedButtonWrapper = styled(Flex)`\n border-top: 1px solid ${color(\"black10\")};\n padding: ${space(3)}px;\n ${media.xs`\n padding: ${space(2)}px;\n `};\n flex: 0 0 auto;\n`\n\nconst ModalOuterWrapper = styled(Box)<TransitionElementProps>`\n position: fixed;\n top: 0;\n left: 0;\n z-index: 9999;\n width: 100vw;\n height: 100vh;\n background-color: rgba(229, 229, 229, 0.5);\n opacity: 0;\n pointer-events: ${(props) => (props.show ? \"auto\" : \"none\")};\n\n &.fadeIn {\n transition: opacity 250ms ease;\n transition-delay: 1ms;\n opacity: 1;\n }\n`\n\nconst ModalWrapper = styled(Flex)`\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n justify-content: center;\n align-items: center;\n`\n\nconst ModalElement = styled(Box)<TransitionElementProps>`\n position: absolute;\n border-radius: 5px;\n height: ${(props) => (props.height ? props.height : \"auto\") as any};\n max-height: calc(100vh - 80px);\n min-height: 58px;\n overflow: hidden;\n background-color: ${color(\"white100\")};\n box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.15);\n width: ${(props) =>\n props.modalWidth || (props.isWide ? ModalWidth.Wide : ModalWidth.Normal)};\n ${media.xs`\n max-height: 100vh;\n height: 100vh;\n width: 100vw;\n border-radius: 0;\n `};\n\n transform: translateY(2000px);\n &.fadeIn {\n transition: all 400ms cubic-bezier(0.075, 0.82, 0.165, 1); /* easeOutCirc */\n transition-delay: 1ms;\n transform: translateY(0px);\n }\n`\n\nconst ModalFlexContent = styled(Flex)<ModalScrollContentProps>`\n position: relative;\n flex-direction: column;\n width: 100%;\n overflow: hidden;\n max-height: calc(100vh - 80px);\n ${media.xs`\n max-height: 100vh;\n `};\n`\n\nconst ModalScrollContent = styled(Flex)<ModalScrollContentProps>`\n overflow: auto;\n flex-direction: column;\n padding: ${(props) =>\n space(props.hasLogo || props.modalWidth === ModalWidth.Narrow ? 2 : 3)}px;\n ${media.xs`\n padding: ${space(2)}px;\n `};\n`\n\nconst CloseIconWrapper = styled(Box)`\n position: absolute;\n top: ${space(2)}px;\n right: ${space(2)}px;\n cursor: pointer;\n`\n\nconst Logo = styled(ArtsyLogoBlackIcon)`\n width: 100px;\n`\n\nModal.displayName = \"Modal\"\nModalWrapper.displayName = \"ModalWrapper\"\nModalScrollContent.displayName = \"ModalScrollContent\"\n"],"file":"Modal.js"}
1
+ {"version":3,"sources":["../../../src/elements/Modal/Modal.tsx"],"names":["ModalWidth","Modal","children","FixedButton","title","show","modalWidth","isWide","hasLogo","onClose","hideCloseButton","wrapperRef","fadeIn","setFadeIn","isScrolled","elementRef","handleEscapeKey","event","key","document","addEventListener","body","style","overflowY","removeEventListener","handleWrapperClick","target","current","FixedButtonWrapper","Flex","DROP_SHADOW","ModalOuterWrapper","Box","props","ModalWrapper","ModalElement","height","Wide","Normal","media","xs","ModalFlexContent","ModalStickyHeader","ModalScrollContent","CloseIconWrapper","Logo","ArtsyLogoBlackIcon","Sentinel","displayName"],"mappings":"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","sourcesContent":["import { themeGet } from \"@styled-system/theme-get\"\nimport React, { FC, useEffect, useRef, useState } from \"react\"\nimport styled from \"styled-components\"\nimport { DROP_SHADOW, media } from \"../../helpers\"\nimport { CloseIcon } from \"../../svgs\"\nimport { ArtsyLogoBlackIcon } from \"../../svgs/ArtsyLogoBlackIcon\"\nimport { Box } from \"../Box\"\nimport { Flex } from \"../Flex\"\nimport { Join } from \"../Join\"\nimport { Spacer } from \"../Spacer\"\nimport { Text } from \"../Text\"\nimport { useOnScroll } from \"../../utils/useOnScroll\"\n\n/**\n * FIXME: This whole thing needs to be rebuilt from scratch\n */\n\ninterface ModalProps {\n FixedButton?: JSX.Element\n refreshModalContentKey?: string\n hasLogo?: boolean\n height?: string\n modalWidth?: ModalWidth\n isWide?: boolean\n onClose: () => void\n show?: boolean\n title?: string\n /*\n * Hide the X button if we don't want the user to be able to exit the modal without another action closing the modal\n */\n hideCloseButton?: boolean\n}\n\ninterface TransitionElementProps {\n isWide?: boolean\n show?: boolean\n modalWidth?: ModalWidth\n}\n\ninterface ModalScrollContentProps {\n hasLogo?: boolean\n modalWidth?: ModalWidth\n}\n\nexport enum ModalWidth {\n Narrow = \"300px\",\n Normal = \"440px\",\n Wide = \"900px\",\n}\n\n/**\n * Modal.\n * Spec: https://www.figma.com/file/m6gDpKHEWDbYJyrwsVZDBr/Artsy-3.0-Design-System?node-id=6150%3A7290\n */\nexport const Modal: FC<ModalProps> = ({\n children,\n FixedButton,\n title,\n show,\n modalWidth, // modalWidth overwrites isWide if present\n isWide,\n hasLogo,\n onClose,\n hideCloseButton,\n}) => {\n const wrapperRef = useRef(null)\n const [fadeIn, setFadeIn] = useState(false)\n const { isScrolled, elementRef } = useOnScroll()\n\n const handleEscapeKey = (event) => {\n if (event && event.key === \"Escape\") {\n onClose()\n }\n }\n\n useEffect(() => {\n if (show) {\n setFadeIn(true)\n\n if (!hideCloseButton) {\n // Binds key event for escape to close modal\n document.addEventListener(\"keyup\", handleEscapeKey, true)\n }\n // Fixes the body to disable scroll\n document.body.style.overflowY = \"hidden\"\n } else {\n setFadeIn(false)\n document.body.style.overflowY = \"visible\"\n document.removeEventListener(\"keyup\", handleEscapeKey, true)\n }\n\n return document.removeEventListener(\"keyup\", handleEscapeKey, true)\n }, [show])\n\n const handleWrapperClick = (event) => {\n // If modal X icon is hidden we don't want to close the modal when the wrapper is clicked\n if (!hideCloseButton && event.target === wrapperRef.current) {\n onClose()\n }\n }\n\n if (!show) {\n return null\n }\n\n return (\n <>\n <ModalOuterWrapper show={show} className={fadeIn ? \"fadeIn\" : \"\"}>\n <ModalWrapper ref={wrapperRef} onClick={handleWrapperClick}>\n <ModalElement\n modalWidth={modalWidth}\n isWide={isWide}\n show={show}\n className={fadeIn ? \"fadeIn\" : \"\"}\n >\n <ModalFlexContent>\n <ModalStickyHeader\n position=\"sticky\"\n top={0}\n display=\"flex\"\n justifyContent=\"center\"\n flexDirection=\"column\"\n isScrolled={isScrolled}\n px={2}\n >\n <Spacer my={1} />\n <Flex>\n <Box pr={6} flex={1}>\n <Join separator={<Spacer py={1} />}>\n {hasLogo && <Logo my={1} />}\n {title && (\n <Text\n variant=\"lg\"\n color=\"black100\"\n py={hasLogo ? 0 : 1}\n >\n {title}\n </Text>\n )}\n </Join>\n </Box>\n\n {!hideCloseButton && (\n <CloseIconWrapper my={1} onClick={() => onClose()}>\n <CloseIcon fill=\"black60\" />\n </CloseIconWrapper>\n )}\n </Flex>\n <Spacer py={1} />\n </ModalStickyHeader>\n\n <ModalScrollContent\n hasLogo={hasLogo}\n modalWidth={modalWidth}\n px={2}\n py={1}\n pb={2}\n >\n <>\n <Sentinel ref={elementRef} />\n {children}\n </>\n </ModalScrollContent>\n\n {FixedButton && (\n <FixedButtonWrapper isScrolled={isScrolled} p={2}>\n {FixedButton}\n </FixedButtonWrapper>\n )}\n </ModalFlexContent>\n </ModalElement>\n </ModalWrapper>\n </ModalOuterWrapper>\n </>\n )\n}\n\ninterface ShadowOnScroll {\n isScrolled?: boolean\n}\n\nconst FixedButtonWrapper = styled(Flex)<ShadowOnScroll>`\n box-shadow: ${({ isScrolled }) => (isScrolled ? DROP_SHADOW : \"none\")};\n flex: 0 0 auto;\n transition: box-shadow 250ms ease-in-out;\n`\n\nconst ModalOuterWrapper = styled(Box)<TransitionElementProps>`\n position: fixed;\n top: 0;\n left: 0;\n z-index: 9999;\n width: 100vw;\n height: 100vh;\n background-color: ${themeGet(\"colors.black5\")};\n opacity: 0;\n pointer-events: ${(props) => (props.show ? \"auto\" : \"none\")};\n\n &.fadeIn {\n transition: opacity 250ms ease;\n transition-delay: 1ms;\n opacity: 1;\n }\n`\n\nconst ModalWrapper = styled(Flex)`\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n justify-content: center;\n align-items: center;\n`\n\nconst ModalElement = styled(Box)<TransitionElementProps>`\n position: absolute;\n height: ${(props) => (props.height ? props.height : \"auto\") as any};\n max-height: calc(100vh - 80px);\n min-height: 58px;\n overflow: hidden;\n background-color: ${themeGet(\"colors.white100\")};\n box-shadow: ${DROP_SHADOW};\n width: ${(props) =>\n props.modalWidth || (props.isWide ? ModalWidth.Wide : ModalWidth.Normal)};\n\n ${media.xs`\n max-height: 100vh;\n height: 100vh;\n width: 100vw;\n border-radius: 0;\n `};\n\n transform: translateY(2000px);\n &.fadeIn {\n transition: all 400ms cubic-bezier(0.075, 0.82, 0.165, 1); /* easeOutCirc */\n transition-delay: 1ms;\n transform: translateY(0px);\n }\n`\n\nconst ModalFlexContent = styled(Flex)<ModalScrollContentProps>`\n position: relative;\n flex-direction: column;\n width: 100%;\n overflow: hidden;\n max-height: calc(100vh - 80px);\n ${media.xs`\n max-height: 100vh;\n `};\n`\n\nconst ModalStickyHeader = styled(Box)<ModalScrollContentProps & ShadowOnScroll>`\n box-shadow: ${({ isScrolled }) => (isScrolled ? DROP_SHADOW : \"none\")};\n transition: box-shadow 250ms ease-in-out;\n`\n\nconst ModalScrollContent = styled(Flex)<ModalScrollContentProps>`\n overflow: auto;\n flex-direction: column;\n`\n\nconst CloseIconWrapper = styled(Flex)`\n cursor: pointer;\n`\n\nconst Logo = styled(ArtsyLogoBlackIcon)`\n width: 78px;\n`\n\n// This <div> is positioned such that when it leaves the top of\n// the ModalScrollContent we use IntersectionObserver within the hook\n// to switch on and of the shadows of the sticky elements\nconst Sentinel = styled(Box)`\n position: relative;\n width: 100%;\n height: 0;\n`\n\nModal.displayName = \"Modal\"\nModalWrapper.displayName = \"ModalWrapper\"\nModalScrollContent.displayName = \"ModalScrollContent\"\n"],"file":"Modal.js"}
@@ -13,7 +13,7 @@ export declare const Default: {
13
13
  };
14
14
  };
15
15
  };
16
- export declare const WithTitle: {
16
+ export declare const Title: {
17
17
  (): JSX.Element;
18
18
  story: {
19
19
  name: string;
@@ -24,7 +24,7 @@ export declare const WithTitle: {
24
24
  };
25
25
  };
26
26
  };
27
- export declare const WithLogo: {
27
+ export declare const LongTitle: {
28
28
  (): JSX.Element;
29
29
  story: {
30
30
  name: string;
@@ -35,7 +35,7 @@ export declare const WithLogo: {
35
35
  };
36
36
  };
37
37
  };
38
- export declare const ModalWithFixedButton: {
38
+ export declare const Logo: {
39
39
  (): JSX.Element;
40
40
  story: {
41
41
  name: string;
@@ -46,7 +46,51 @@ export declare const ModalWithFixedButton: {
46
46
  };
47
47
  };
48
48
  };
49
- export declare const WideModal: {
49
+ export declare const LogoAndTitle: {
50
+ (): JSX.Element;
51
+ story: {
52
+ name: string;
53
+ parameters: {
54
+ chromatic: {
55
+ delay: number;
56
+ };
57
+ };
58
+ };
59
+ };
60
+ export declare const FixedButton: {
61
+ (): JSX.Element;
62
+ story: {
63
+ name: string;
64
+ parameters: {
65
+ chromatic: {
66
+ delay: number;
67
+ };
68
+ };
69
+ };
70
+ };
71
+ export declare const FixedButtonNoTitle: {
72
+ (): JSX.Element;
73
+ story: {
74
+ name: string;
75
+ parameters: {
76
+ chromatic: {
77
+ delay: number;
78
+ };
79
+ };
80
+ };
81
+ };
82
+ export declare const FixedButtonNoLogo: {
83
+ (): JSX.Element;
84
+ story: {
85
+ name: string;
86
+ parameters: {
87
+ chromatic: {
88
+ delay: number;
89
+ };
90
+ };
91
+ };
92
+ };
93
+ export declare const Wide: {
50
94
  (): JSX.Element;
51
95
  story: {
52
96
  name: string;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WideModal = exports.ModalWithFixedButton = exports.WithLogo = exports.WithTitle = exports.Default = exports.default = void 0;
6
+ exports.Wide = exports.FixedButtonNoLogo = exports.FixedButtonNoTitle = exports.FixedButton = exports.LogoAndTitle = exports.Logo = exports.LongTitle = exports.Title = exports.Default = exports.default = void 0;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
@@ -17,6 +17,7 @@ var _default = {
17
17
  title: "Components/Modal"
18
18
  };
19
19
  exports.default = _default;
20
+ var content = "\n Chicharrones marfa tumeric squid four loko flexitarian celiac hell of hot chicken \n jianbing salvia enamel pin woke. Migas you probably haven't heard of them church-key \n pok pok banh mi yr ennui ethical subway tile authentic. Sartorial retro roof party, \n gastropub bicycle rights drinking vinegar microdosing swag DIY deep v. Viral hella pop-up, \n banh mi squid poke chambray yuccie biodiesel occupy scenester.\n";
20
21
 
21
22
  var Default = function Default() {
22
23
  return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
@@ -24,7 +25,7 @@ var Default = function Default() {
24
25
  onClose: function onClose() {
25
26
  return null;
26
27
  }
27
- }, "Some example content");
28
+ }, content);
28
29
  };
29
30
 
30
31
  exports.Default = Default;
@@ -37,20 +38,20 @@ Default.story = {
37
38
  }
38
39
  };
39
40
 
40
- var WithTitle = function WithTitle() {
41
+ var Title = function Title() {
41
42
  return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
42
43
  show: true,
43
44
  title: "Modal Title",
44
45
  onClose: function onClose() {
45
46
  return null;
46
47
  }
47
- }, "Some example content");
48
+ }, content);
48
49
  };
49
50
 
50
- exports.WithTitle = WithTitle;
51
- WithTitle.displayName = "WithTitle";
52
- WithTitle.story = {
53
- name: "With title",
51
+ exports.Title = Title;
52
+ Title.displayName = "Title";
53
+ Title.story = {
54
+ name: "Title",
54
55
  parameters: {
55
56
  chromatic: {
56
57
  delay: 500
@@ -58,21 +59,112 @@ WithTitle.story = {
58
59
  }
59
60
  };
60
61
 
61
- var WithLogo = function WithLogo() {
62
+ var LongTitle = function LongTitle() {
63
+ return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
64
+ show: true,
65
+ title: "Modal Title with a longer title or headline text that runs on for mutliple lines",
66
+ onClose: function onClose() {
67
+ return null;
68
+ }
69
+ }, content);
70
+ };
71
+
72
+ exports.LongTitle = LongTitle;
73
+ LongTitle.displayName = "LongTitle";
74
+ LongTitle.story = {
75
+ name: "Long title",
76
+ parameters: {
77
+ chromatic: {
78
+ delay: 500
79
+ }
80
+ }
81
+ };
82
+
83
+ var Logo = function Logo() {
84
+ return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
85
+ show: true,
86
+ hasLogo: true,
87
+ onClose: function onClose() {
88
+ return null;
89
+ }
90
+ }, content);
91
+ };
92
+
93
+ exports.Logo = Logo;
94
+ Logo.displayName = "Logo";
95
+ Logo.story = {
96
+ name: "Logo",
97
+ parameters: {
98
+ chromatic: {
99
+ delay: 500
100
+ }
101
+ }
102
+ };
103
+
104
+ var LogoAndTitle = function LogoAndTitle() {
105
+ return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
106
+ show: true,
107
+ hasLogo: true,
108
+ title: "Modal Title",
109
+ onClose: function onClose() {
110
+ return null;
111
+ }
112
+ }, content);
113
+ };
114
+
115
+ exports.LogoAndTitle = LogoAndTitle;
116
+ LogoAndTitle.displayName = "LogoAndTitle";
117
+ LogoAndTitle.story = {
118
+ name: "Logo and title",
119
+ parameters: {
120
+ chromatic: {
121
+ delay: 500
122
+ }
123
+ }
124
+ };
125
+
126
+ var FixedButton = function FixedButton() {
62
127
  return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
63
128
  show: true,
64
129
  title: "Modal Title",
65
130
  hasLogo: true,
66
131
  onClose: function onClose() {
67
132
  return null;
133
+ },
134
+ FixedButton: /*#__PURE__*/_react.default.createElement(_Button.Button, {
135
+ width: "100%"
136
+ }, "Click me")
137
+ }, content.repeat(5));
138
+ };
139
+
140
+ exports.FixedButton = FixedButton;
141
+ FixedButton.displayName = "FixedButton";
142
+ FixedButton.story = {
143
+ name: "Fixed button",
144
+ parameters: {
145
+ chromatic: {
146
+ delay: 500
68
147
  }
69
- }, "Some example content");
148
+ }
149
+ };
150
+
151
+ var FixedButtonNoTitle = function FixedButtonNoTitle() {
152
+ return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
153
+ show: true,
154
+ hasLogo: true,
155
+ onClose: function onClose() {
156
+ return null;
157
+ },
158
+ FixedButton: /*#__PURE__*/_react.default.createElement(_Button.Button, {
159
+ width: "100%"
160
+ }, "Click me")
161
+ }, content.repeat(5));
70
162
  };
71
163
 
72
- exports.WithLogo = WithLogo;
73
- WithLogo.displayName = "WithLogo";
74
- WithLogo.story = {
75
- name: "With logo",
164
+ exports.FixedButtonNoTitle = FixedButtonNoTitle;
165
+ FixedButtonNoTitle.displayName = "FixedButtonNoTitle";
166
+ FixedButtonNoTitle.story = {
167
+ name: "Fixed button no title",
76
168
  parameters: {
77
169
  chromatic: {
78
170
  delay: 500
@@ -80,7 +172,7 @@ WithLogo.story = {
80
172
  }
81
173
  };
82
174
 
83
- var ModalWithFixedButton = function ModalWithFixedButton() {
175
+ var FixedButtonNoLogo = function FixedButtonNoLogo() {
84
176
  return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
85
177
  show: true,
86
178
  title: "Modal Title",
@@ -90,13 +182,13 @@ var ModalWithFixedButton = function ModalWithFixedButton() {
90
182
  FixedButton: /*#__PURE__*/_react.default.createElement(_Button.Button, {
91
183
  width: "100%"
92
184
  }, "Click me")
93
- }, "Some example content");
185
+ }, content.repeat(5));
94
186
  };
95
187
 
96
- exports.ModalWithFixedButton = ModalWithFixedButton;
97
- ModalWithFixedButton.displayName = "ModalWithFixedButton";
98
- ModalWithFixedButton.story = {
99
- name: "Modal with fixed button",
188
+ exports.FixedButtonNoLogo = FixedButtonNoLogo;
189
+ FixedButtonNoLogo.displayName = "FixedButtonNoLogo";
190
+ FixedButtonNoLogo.story = {
191
+ name: "Fixed button no logo",
100
192
  parameters: {
101
193
  chromatic: {
102
194
  delay: 500
@@ -104,7 +196,7 @@ ModalWithFixedButton.story = {
104
196
  }
105
197
  };
106
198
 
107
- var WideModal = function WideModal() {
199
+ var Wide = function Wide() {
108
200
  return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
109
201
  show: true,
110
202
  title: "Modal Title",
@@ -112,13 +204,13 @@ var WideModal = function WideModal() {
112
204
  onClose: function onClose() {
113
205
  return null;
114
206
  }
115
- }, "Some example content");
207
+ }, content);
116
208
  };
117
209
 
118
- exports.WideModal = WideModal;
119
- WideModal.displayName = "WideModal";
120
- WideModal.story = {
121
- name: "Wide modal",
210
+ exports.Wide = Wide;
211
+ Wide.displayName = "Wide";
212
+ Wide.story = {
213
+ name: "Wide",
122
214
  parameters: {
123
215
  chromatic: {
124
216
  delay: 500
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/Modal/Modal.story.tsx"],"names":["title","Default","story","parameters","chromatic","delay","WithTitle","name","WithLogo","ModalWithFixedButton","WideModal"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;;;eAEe;AACbA,EAAAA,KAAK,EAAE;AADM,C;;;AAIR,IAAMC,OAAO,GAAG,SAAVA,OAAU,GAAM;AAC3B,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAArB,4BADF;AAKD,CANM;;;AAAMA,O;AAQbA,OAAO,CAACC,KAAR,GAAgB;AACdC,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AADE,CAAhB;;AAIO,IAAMC,SAAS,GAAG,SAAZA,SAAY,GAAM;AAC7B,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,KAAK,EAAC,aAAlB;AAAgC,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAAzC,4BADF;AAKD,CANM;;;AAAMA,S;AAQbA,SAAS,CAACJ,KAAV,GAAkB;AAChBK,EAAAA,IAAI,EAAE,YADU;AAEhBJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFI,CAAlB;;AAKO,IAAMG,QAAQ,GAAG,SAAXA,QAAW,GAAM;AAC5B,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,KAAK,EAAC,aAAlB;AAAgC,IAAA,OAAO,MAAvC;AAAwC,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAAjD,4BADF;AAKD,CANM;;;AAAMA,Q;AAQbA,QAAQ,CAACN,KAAT,GAAiB;AACfK,EAAAA,IAAI,EAAE,WADS;AAEfJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFG,CAAjB;;AAKO,IAAMI,oBAAoB,GAAG,SAAvBA,oBAAuB,GAAM;AACxC,sBACE,6BAAC,YAAD;AACE,IAAA,IAAI,MADN;AAEE,IAAA,KAAK,EAAC,aAFR;AAGE,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA,KAHX;AAIE,IAAA,WAAW,eAAE,6BAAC,cAAD;AAAQ,MAAA,KAAK,EAAC;AAAd;AAJf,4BADF;AAUD,CAXM;;;AAAMA,oB;AAabA,oBAAoB,CAACP,KAArB,GAA6B;AAC3BK,EAAAA,IAAI,EAAE,yBADqB;AAE3BJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFe,CAA7B;;AAKO,IAAMK,SAAS,GAAG,SAAZA,SAAY,GAAM;AAC7B,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,KAAK,EAAC,aAAlB;AAAgC,IAAA,MAAM,MAAtC;AAAuC,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAAhD,4BADF;AAKD,CANM;;;AAAMA,S;AAQbA,SAAS,CAACR,KAAV,GAAkB;AAChBK,EAAAA,IAAI,EAAE,YADU;AAEhBJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFI,CAAlB","sourcesContent":["import React from \"react\"\nimport { Button } from \"../Button\"\nimport { Modal } from \"./Modal\"\n\nexport default {\n title: \"Components/Modal\",\n}\n\nexport const Default = () => {\n return (\n <Modal show onClose={() => null}>\n Some example content\n </Modal>\n )\n}\n\nDefault.story = {\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const WithTitle = () => {\n return (\n <Modal show title=\"Modal Title\" onClose={() => null}>\n Some example content\n </Modal>\n )\n}\n\nWithTitle.story = {\n name: \"With title\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const WithLogo = () => {\n return (\n <Modal show title=\"Modal Title\" hasLogo onClose={() => null}>\n Some example content\n </Modal>\n )\n}\n\nWithLogo.story = {\n name: \"With logo\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const ModalWithFixedButton = () => {\n return (\n <Modal\n show\n title=\"Modal Title\"\n onClose={() => null}\n FixedButton={<Button width=\"100%\">Click me</Button>}\n >\n Some example content\n </Modal>\n )\n}\n\nModalWithFixedButton.story = {\n name: \"Modal with fixed button\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const WideModal = () => {\n return (\n <Modal show title=\"Modal Title\" isWide onClose={() => null}>\n Some example content\n </Modal>\n )\n}\n\nWideModal.story = {\n name: \"Wide modal\",\n parameters: { chromatic: { delay: 500 } },\n}\n"],"file":"Modal.story.js"}
1
+ {"version":3,"sources":["../../../src/elements/Modal/Modal.story.tsx"],"names":["title","content","Default","story","parameters","chromatic","delay","Title","name","LongTitle","Logo","LogoAndTitle","FixedButton","repeat","FixedButtonNoTitle","FixedButtonNoLogo","Wide"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;;;eAEe;AACbA,EAAAA,KAAK,EAAE;AADM,C;;AAIf,IAAMC,OAAO,+aAAb;;AAQO,IAAMC,OAAO,GAAG,SAAVA,OAAU,GAAM;AAC3B,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAArB,KACGD,OADH,CADF;AAKD,CANM;;;AAAMC,O;AAQbA,OAAO,CAACC,KAAR,GAAgB;AACdC,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AADE,CAAhB;;AAIO,IAAMC,KAAK,GAAG,SAARA,KAAQ,GAAM;AACzB,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,KAAK,EAAC,aAAlB;AAAgC,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAAzC,KACGN,OADH,CADF;AAKD,CANM;;;AAAMM,K;AAQbA,KAAK,CAACJ,KAAN,GAAc;AACZK,EAAAA,IAAI,EAAE,OADM;AAEZJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFA,CAAd;;AAKO,IAAMG,SAAS,GAAG,SAAZA,SAAY,GAAM;AAC7B,sBACE,6BAAC,YAAD;AACE,IAAA,IAAI,MADN;AAEE,IAAA,KAAK,EAAC,kFAFR;AAGE,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAHX,KAKGR,OALH,CADF;AASD,CAVM;;;AAAMQ,S;AAYbA,SAAS,CAACN,KAAV,GAAkB;AAChBK,EAAAA,IAAI,EAAE,YADU;AAEhBJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFI,CAAlB;;AAKO,IAAMI,IAAI,GAAG,SAAPA,IAAO,GAAM;AACxB,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,OAAO,MAAnB;AAAoB,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAA7B,KACGT,OADH,CADF;AAKD,CANM;;;AAAMS,I;AAQbA,IAAI,CAACP,KAAL,GAAa;AACXK,EAAAA,IAAI,EAAE,MADK;AAEXJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFD,CAAb;;AAKO,IAAMK,YAAY,GAAG,SAAfA,YAAe,GAAM;AAChC,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,OAAO,MAAnB;AAAoB,IAAA,KAAK,EAAC,aAA1B;AAAwC,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAAjD,KACGV,OADH,CADF;AAKD,CANM;;;AAAMU,Y;AAQbA,YAAY,CAACR,KAAb,GAAqB;AACnBK,EAAAA,IAAI,EAAE,gBADa;AAEnBJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFO,CAArB;;AAKO,IAAMM,WAAW,GAAG,SAAdA,WAAc,GAAM;AAC/B,sBACE,6BAAC,YAAD;AACE,IAAA,IAAI,MADN;AAEE,IAAA,KAAK,EAAC,aAFR;AAGE,IAAA,OAAO,MAHT;AAIE,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA,KAJX;AAKE,IAAA,WAAW,eAAE,6BAAC,cAAD;AAAQ,MAAA,KAAK,EAAC;AAAd;AALf,KAOGX,OAAO,CAACY,MAAR,CAAe,CAAf,CAPH,CADF;AAWD,CAZM;;;AAAMD,W;AAcbA,WAAW,CAACT,KAAZ,GAAoB;AAClBK,EAAAA,IAAI,EAAE,cADY;AAElBJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFM,CAApB;;AAKO,IAAMQ,kBAAkB,GAAG,SAArBA,kBAAqB,GAAM;AACtC,sBACE,6BAAC,YAAD;AACE,IAAA,IAAI,MADN;AAEE,IAAA,OAAO,MAFT;AAGE,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA,KAHX;AAIE,IAAA,WAAW,eAAE,6BAAC,cAAD;AAAQ,MAAA,KAAK,EAAC;AAAd;AAJf,KAMGb,OAAO,CAACY,MAAR,CAAe,CAAf,CANH,CADF;AAUD,CAXM;;;AAAMC,kB;AAabA,kBAAkB,CAACX,KAAnB,GAA2B;AACzBK,EAAAA,IAAI,EAAE,uBADmB;AAEzBJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFa,CAA3B;;AAKO,IAAMS,iBAAiB,GAAG,SAApBA,iBAAoB,GAAM;AACrC,sBACE,6BAAC,YAAD;AACE,IAAA,IAAI,MADN;AAEE,IAAA,KAAK,EAAC,aAFR;AAGE,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA,KAHX;AAIE,IAAA,WAAW,eAAE,6BAAC,cAAD;AAAQ,MAAA,KAAK,EAAC;AAAd;AAJf,KAMGd,OAAO,CAACY,MAAR,CAAe,CAAf,CANH,CADF;AAUD,CAXM;;;AAAME,iB;AAabA,iBAAiB,CAACZ,KAAlB,GAA0B;AACxBK,EAAAA,IAAI,EAAE,sBADkB;AAExBJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFY,CAA1B;;AAKO,IAAMU,IAAI,GAAG,SAAPA,IAAO,GAAM;AACxB,sBACE,6BAAC,YAAD;AAAO,IAAA,IAAI,MAAX;AAAY,IAAA,KAAK,EAAC,aAAlB;AAAgC,IAAA,MAAM,MAAtC;AAAuC,IAAA,OAAO,EAAE;AAAA,aAAM,IAAN;AAAA;AAAhD,KACGf,OADH,CADF;AAKD,CANM;;;AAAMe,I;AAQbA,IAAI,CAACb,KAAL,GAAa;AACXK,EAAAA,IAAI,EAAE,MADK;AAEXJ,EAAAA,UAAU,EAAE;AAAEC,IAAAA,SAAS,EAAE;AAAEC,MAAAA,KAAK,EAAE;AAAT;AAAb;AAFD,CAAb","sourcesContent":["import React from \"react\"\nimport { Button } from \"../Button\"\nimport { Modal } from \"./Modal\"\n\nexport default {\n title: \"Components/Modal\",\n}\n\nconst content = `\n Chicharrones marfa tumeric squid four loko flexitarian celiac hell of hot chicken \n jianbing salvia enamel pin woke. Migas you probably haven't heard of them church-key \n pok pok banh mi yr ennui ethical subway tile authentic. Sartorial retro roof party, \n gastropub bicycle rights drinking vinegar microdosing swag DIY deep v. Viral hella pop-up, \n banh mi squid poke chambray yuccie biodiesel occupy scenester.\n`\n\nexport const Default = () => {\n return (\n <Modal show onClose={() => null}>\n {content}\n </Modal>\n )\n}\n\nDefault.story = {\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const Title = () => {\n return (\n <Modal show title=\"Modal Title\" onClose={() => null}>\n {content}\n </Modal>\n )\n}\n\nTitle.story = {\n name: \"Title\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const LongTitle = () => {\n return (\n <Modal\n show\n title=\"Modal Title with a longer title or headline text that runs on for mutliple lines\"\n onClose={() => null}\n >\n {content}\n </Modal>\n )\n}\n\nLongTitle.story = {\n name: \"Long title\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const Logo = () => {\n return (\n <Modal show hasLogo onClose={() => null}>\n {content}\n </Modal>\n )\n}\n\nLogo.story = {\n name: \"Logo\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const LogoAndTitle = () => {\n return (\n <Modal show hasLogo title=\"Modal Title\" onClose={() => null}>\n {content}\n </Modal>\n )\n}\n\nLogoAndTitle.story = {\n name: \"Logo and title\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const FixedButton = () => {\n return (\n <Modal\n show\n title=\"Modal Title\"\n hasLogo\n onClose={() => null}\n FixedButton={<Button width=\"100%\">Click me</Button>}\n >\n {content.repeat(5)}\n </Modal>\n )\n}\n\nFixedButton.story = {\n name: \"Fixed button\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const FixedButtonNoTitle = () => {\n return (\n <Modal\n show\n hasLogo\n onClose={() => null}\n FixedButton={<Button width=\"100%\">Click me</Button>}\n >\n {content.repeat(5)}\n </Modal>\n )\n}\n\nFixedButtonNoTitle.story = {\n name: \"Fixed button no title\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const FixedButtonNoLogo = () => {\n return (\n <Modal\n show\n title=\"Modal Title\"\n onClose={() => null}\n FixedButton={<Button width=\"100%\">Click me</Button>}\n >\n {content.repeat(5)}\n </Modal>\n )\n}\n\nFixedButtonNoLogo.story = {\n name: \"Fixed button no logo\",\n parameters: { chromatic: { delay: 500 } },\n}\n\nexport const Wide = () => {\n return (\n <Modal show title=\"Modal Title\" isWide onClose={() => null}>\n {content}\n </Modal>\n )\n}\n\nWide.story = {\n name: \"Wide\",\n parameters: { chromatic: { delay: 500 } },\n}\n"],"file":"Modal.story.js"}
@@ -18,8 +18,8 @@ var useContainsFocus = function useContainsFocus(_ref) {
18
18
  document.addEventListener("focus", handleFocus, true);
19
19
  document.addEventListener("blur", handleFocus, true);
20
20
  return function () {
21
- document.removeEventListener("focus", handleFocus);
22
- document.removeEventListener("blur", handleFocus);
21
+ document.removeEventListener("focus", handleFocus, true);
22
+ document.removeEventListener("blur", handleFocus, true);
23
23
  };
24
24
  }, [onChange]);
25
25
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/useContainsFocus.ts"],"names":["useContainsFocus","onChange","ref","handleFocus","debounce","current","document","activeElement","contains","addEventListener","removeEventListener","callback","timer","clearTimeout","setTimeout"],"mappings":";;;;;;;AAAA;;AAEO,IAAMA,gBAAgB,GAAG,SAAnBA,gBAAmB,OAI1B;AAAA,MAHJC,QAGI,QAHJA,QAGI;AACJ,MAAMC,GAAG,GAAG,mBAAoB,IAApB,CAAZ;AAEA,wBAAU,YAAM;AACd,QAAMC,WAAW,GAAGC,QAAQ,CAAC,YAAM;AACjC,UAAI,CAACF,GAAG,CAACG,OAAT,EAAkB;AAElBJ,MAAAA,QAAQ,CACNC,GAAG,CAACG,OAAJ,KAAgBC,QAAQ,CAACC,aAAzB,IACEL,GAAG,CAACG,OAAJ,CAAYG,QAAZ,CAAqBF,QAAQ,CAACC,aAA9B,CAFI,CAAR;AAID,KAP2B,CAA5B;AASAD,IAAAA,QAAQ,CAACG,gBAAT,CAA0B,OAA1B,EAAmCN,WAAnC,EAAgD,IAAhD;AACAG,IAAAA,QAAQ,CAACG,gBAAT,CAA0B,MAA1B,EAAkCN,WAAlC,EAA+C,IAA/C;AAEA,WAAO,YAAM;AACXG,MAAAA,QAAQ,CAACI,mBAAT,CAA6B,OAA7B,EAAsCP,WAAtC;AACAG,MAAAA,QAAQ,CAACI,mBAAT,CAA6B,MAA7B,EAAqCP,WAArC;AACD,KAHD;AAID,GAjBD,EAiBG,CAACF,QAAD,CAjBH;AAmBA,SAAO;AAAEC,IAAAA,GAAG,EAAHA;AAAF,GAAP;AACD,CA3BM;AA6BP;AACA;AACA;AACA;AACA;AACA;;;;;AACA,IAAME,QAAQ,GAAG,SAAXA,QAAW,CAACO,QAAD,EAA0B;AACzC,MAAIC,KAAJ;AAEA,SAAO,YAAM;AACXC,IAAAA,YAAY,CAACD,KAAD,CAAZ;AAEAA,IAAAA,KAAK,GAAGE,UAAU,CAAC,YAAM;AACvBH,MAAAA,QAAQ;AACT,KAFiB,EAEf,CAFe,CAAlB;AAGD,GAND;AAOD,CAVD","sourcesContent":["import { useEffect, useRef } from \"react\"\n\nexport const useContainsFocus = ({\n onChange,\n}: {\n onChange(focused: boolean): void\n}) => {\n const ref = useRef<HTMLElement>(null)\n\n useEffect(() => {\n const handleFocus = debounce(() => {\n if (!ref.current) return\n\n onChange(\n ref.current === document.activeElement ||\n ref.current.contains(document.activeElement)\n )\n })\n\n document.addEventListener(\"focus\", handleFocus, true)\n document.addEventListener(\"blur\", handleFocus, true)\n\n return () => {\n document.removeEventListener(\"focus\", handleFocus)\n document.removeEventListener(\"blur\", handleFocus)\n }\n }, [onChange])\n\n return { ref }\n}\n\n/**\n * A simplified debounce that just executes the last function if multiple\n * functions are called within the same tick. Since frequently a blur and a focus\n * will happen concurrently: the last function (the focus) will be executed.\n * If travelling from two elements within the same focus group, `focused` will remain `true`.\n */\nconst debounce = (callback: () => void) => {\n let timer: ReturnType<typeof setTimeout>\n\n return () => {\n clearTimeout(timer)\n\n timer = setTimeout(() => {\n callback()\n }, 0)\n }\n}\n"],"file":"useContainsFocus.js"}
1
+ {"version":3,"sources":["../../src/utils/useContainsFocus.ts"],"names":["useContainsFocus","onChange","ref","handleFocus","debounce","current","document","activeElement","contains","addEventListener","removeEventListener","callback","timer","clearTimeout","setTimeout"],"mappings":";;;;;;;AAAA;;AAEO,IAAMA,gBAAgB,GAAG,SAAnBA,gBAAmB,OAI1B;AAAA,MAHJC,QAGI,QAHJA,QAGI;AACJ,MAAMC,GAAG,GAAG,mBAAoB,IAApB,CAAZ;AAEA,wBAAU,YAAM;AACd,QAAMC,WAAW,GAAGC,QAAQ,CAAC,YAAM;AACjC,UAAI,CAACF,GAAG,CAACG,OAAT,EAAkB;AAElBJ,MAAAA,QAAQ,CACNC,GAAG,CAACG,OAAJ,KAAgBC,QAAQ,CAACC,aAAzB,IACEL,GAAG,CAACG,OAAJ,CAAYG,QAAZ,CAAqBF,QAAQ,CAACC,aAA9B,CAFI,CAAR;AAID,KAP2B,CAA5B;AASAD,IAAAA,QAAQ,CAACG,gBAAT,CAA0B,OAA1B,EAAmCN,WAAnC,EAAgD,IAAhD;AACAG,IAAAA,QAAQ,CAACG,gBAAT,CAA0B,MAA1B,EAAkCN,WAAlC,EAA+C,IAA/C;AAEA,WAAO,YAAM;AACXG,MAAAA,QAAQ,CAACI,mBAAT,CAA6B,OAA7B,EAAsCP,WAAtC,EAAmD,IAAnD;AACAG,MAAAA,QAAQ,CAACI,mBAAT,CAA6B,MAA7B,EAAqCP,WAArC,EAAkD,IAAlD;AACD,KAHD;AAID,GAjBD,EAiBG,CAACF,QAAD,CAjBH;AAmBA,SAAO;AAAEC,IAAAA,GAAG,EAAHA;AAAF,GAAP;AACD,CA3BM;AA6BP;AACA;AACA;AACA;AACA;AACA;;;;;AACA,IAAME,QAAQ,GAAG,SAAXA,QAAW,CAACO,QAAD,EAA0B;AACzC,MAAIC,KAAJ;AAEA,SAAO,YAAM;AACXC,IAAAA,YAAY,CAACD,KAAD,CAAZ;AAEAA,IAAAA,KAAK,GAAGE,UAAU,CAAC,YAAM;AACvBH,MAAAA,QAAQ;AACT,KAFiB,EAEf,CAFe,CAAlB;AAGD,GAND;AAOD,CAVD","sourcesContent":["import { useEffect, useRef } from \"react\"\n\nexport const useContainsFocus = ({\n onChange,\n}: {\n onChange(focused: boolean): void\n}) => {\n const ref = useRef<HTMLElement>(null)\n\n useEffect(() => {\n const handleFocus = debounce(() => {\n if (!ref.current) return\n\n onChange(\n ref.current === document.activeElement ||\n ref.current.contains(document.activeElement)\n )\n })\n\n document.addEventListener(\"focus\", handleFocus, true)\n document.addEventListener(\"blur\", handleFocus, true)\n\n return () => {\n document.removeEventListener(\"focus\", handleFocus, true)\n document.removeEventListener(\"blur\", handleFocus, true)\n }\n }, [onChange])\n\n return { ref }\n}\n\n/**\n * A simplified debounce that just executes the last function if multiple\n * functions are called within the same tick. Since frequently a blur and a focus\n * will happen concurrently: the last function (the focus) will be executed.\n * If travelling from two elements within the same focus group, `focused` will remain `true`.\n */\nconst debounce = (callback: () => void) => {\n let timer: ReturnType<typeof setTimeout>\n\n return () => {\n clearTimeout(timer)\n\n timer = setTimeout(() => {\n callback()\n }, 0)\n }\n}\n"],"file":"useContainsFocus.js"}
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ /**
3
+ * useOnScroll is used to track if an element is scrolled vertically or not
4
+ */
5
+ export declare const useOnScroll: () => {
6
+ isScrolled: boolean;
7
+ elementRef: import("react").MutableRefObject<null>;
8
+ };
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useOnScroll = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
11
+
12
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+
14
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
+
16
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
17
+
18
+ function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
19
+
20
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
21
+
22
+ /**
23
+ * useOnScroll is used to track if an element is scrolled vertically or not
24
+ */
25
+ var useOnScroll = function useOnScroll() {
26
+ var _useState = (0, _react.useState)(false),
27
+ _useState2 = _slicedToArray(_useState, 2),
28
+ isScrolled = _useState2[0],
29
+ setIsScrolled = _useState2[1];
30
+
31
+ var elementRef = (0, _react.useRef)(null);
32
+ var node = elementRef.current;
33
+ (0, _react.useEffect)(function () {
34
+ if (!("IntersectionObserver" in window)) return;
35
+ if (!node) return;
36
+ var observer = new IntersectionObserver(function (_ref) {
37
+ var _ref2 = _slicedToArray(_ref, 1),
38
+ entry = _ref2[0];
39
+
40
+ setIsScrolled(!entry.isIntersecting);
41
+ }, {
42
+ root: null,
43
+ rootMargin: "0px",
44
+ threshold: 1.0
45
+ });
46
+ observer.observe(node);
47
+ return function () {
48
+ observer.unobserve(node);
49
+ };
50
+ }, [node, isScrolled]);
51
+ return {
52
+ isScrolled: isScrolled,
53
+ elementRef: elementRef
54
+ };
55
+ };
56
+
57
+ exports.useOnScroll = useOnScroll;
58
+ //# sourceMappingURL=useOnScroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/useOnScroll.ts"],"names":["useOnScroll","isScrolled","setIsScrolled","elementRef","node","current","window","observer","IntersectionObserver","entry","isIntersecting","root","rootMargin","threshold","observe","unobserve"],"mappings":";;;;;;;AAAA;;;;;;;;;;;;;;AAEA;AACA;AACA;AACO,IAAMA,WAAW,GAAG,SAAdA,WAAc,GAAM;AAAA,kBACK,qBAAS,KAAT,CADL;AAAA;AAAA,MACxBC,UADwB;AAAA,MACZC,aADY;;AAE/B,MAAMC,UAAU,GAAG,mBAAO,IAAP,CAAnB;AACA,MAAMC,IAAI,GAAGD,UAAU,CAACE,OAAxB;AAEA,wBAAU,YAAM;AACd,QAAI,EAAE,0BAA0BC,MAA5B,CAAJ,EAAyC;AACzC,QAAI,CAACF,IAAL,EAAW;AAEX,QAAMG,QAAQ,GAAG,IAAIC,oBAAJ,CACf,gBAAa;AAAA;AAAA,UAAXC,KAAW;;AACXP,MAAAA,aAAa,CAAC,CAACO,KAAK,CAACC,cAAR,CAAb;AACD,KAHc,EAIf;AACEC,MAAAA,IAAI,EAAE,IADR;AAEEC,MAAAA,UAAU,EAAE,KAFd;AAGEC,MAAAA,SAAS,EAAE;AAHb,KAJe,CAAjB;AAWAN,IAAAA,QAAQ,CAACO,OAAT,CAAiBV,IAAjB;AAEA,WAAO,YAAM;AACXG,MAAAA,QAAQ,CAACQ,SAAT,CAAmBX,IAAnB;AACD,KAFD;AAGD,GApBD,EAoBG,CAACA,IAAD,EAAOH,UAAP,CApBH;AAsBA,SAAO;AAAEA,IAAAA,UAAU,EAAVA,UAAF;AAAcE,IAAAA,UAAU,EAAVA;AAAd,GAAP;AACD,CA5BM","sourcesContent":["import { useEffect, useState, useRef } from \"react\"\n\n/**\n * useOnScroll is used to track if an element is scrolled vertically or not\n */\nexport const useOnScroll = () => {\n const [isScrolled, setIsScrolled] = useState(false)\n const elementRef = useRef(null)\n const node = elementRef.current\n\n useEffect(() => {\n if (!(\"IntersectionObserver\" in window)) return\n if (!node) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n setIsScrolled(!entry.isIntersecting)\n },\n {\n root: null,\n rootMargin: \"0px\",\n threshold: 1.0,\n }\n )\n\n observer.observe(node)\n\n return () => {\n observer.unobserve(node)\n }\n }, [node, isScrolled])\n\n return { isScrolled, elementRef }\n}\n"],"file":"useOnScroll.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@artsy/palette",
3
- "version": "18.7.2",
3
+ "version": "18.8.1",
4
4
  "description": "Design system library for react components",
5
5
  "main": "dist/index.js",
6
6
  "publishConfig": {
@@ -174,5 +174,5 @@
174
174
  "<rootDir>/www/"
175
175
  ]
176
176
  },
177
- "gitHead": "4cd304332ad9bf7a28b965d9050f79805a79eae8"
177
+ "gitHead": "dd44b4342111e9a49eaa2a1e60606ba238e5dc27"
178
178
  }