@neo4j-ndl/react 4.16.10 → 4.16.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/lib/cjs/ai/file-tag/FileTag.js +7 -1
  2. package/lib/cjs/ai/file-tag/FileTag.js.map +1 -1
  3. package/lib/cjs/ai/image-tag/ImageTag.js +7 -1
  4. package/lib/cjs/ai/image-tag/ImageTag.js.map +1 -1
  5. package/lib/cjs/ai/prompt/Prompt.js +43 -11
  6. package/lib/cjs/ai/prompt/Prompt.js.map +1 -1
  7. package/lib/cjs/ai/prompt/focusTextareaFromPromptWrapper.js +85 -0
  8. package/lib/cjs/ai/prompt/focusTextareaFromPromptWrapper.js.map +1 -0
  9. package/lib/cjs/date-picker/DatePicker.js +6 -1
  10. package/lib/cjs/date-picker/DatePicker.js.map +1 -1
  11. package/lib/cjs/date-picker/stories/date-picker-in-popover-dialog.story.js +42 -0
  12. package/lib/cjs/date-picker/stories/date-picker-in-popover-dialog.story.js.map +1 -0
  13. package/lib/cjs/date-picker/stories/index.js +5 -1
  14. package/lib/cjs/date-picker/stories/index.js.map +1 -1
  15. package/lib/cjs/time-picker/TimePicker.js +6 -1
  16. package/lib/cjs/time-picker/TimePicker.js.map +1 -1
  17. package/lib/cjs/time-picker/stories/index.js +5 -1
  18. package/lib/cjs/time-picker/stories/index.js.map +1 -1
  19. package/lib/cjs/time-picker/stories/time-picker-in-popover-dialog.story.js +32 -0
  20. package/lib/cjs/time-picker/stories/time-picker-in-popover-dialog.story.js.map +1 -0
  21. package/lib/cjs/timezone-picker/TimeZonePicker.js +6 -1
  22. package/lib/cjs/timezone-picker/TimeZonePicker.js.map +1 -1
  23. package/lib/cjs/timezone-picker/stories/index.js +5 -1
  24. package/lib/cjs/timezone-picker/stories/index.js.map +1 -1
  25. package/lib/cjs/timezone-picker/stories/timezone-picker-in-popover-dialog.story.js +32 -0
  26. package/lib/cjs/timezone-picker/stories/timezone-picker-in-popover-dialog.story.js.map +1 -0
  27. package/lib/esm/ai/file-tag/FileTag.js +7 -1
  28. package/lib/esm/ai/file-tag/FileTag.js.map +1 -1
  29. package/lib/esm/ai/image-tag/ImageTag.js +7 -1
  30. package/lib/esm/ai/image-tag/ImageTag.js.map +1 -1
  31. package/lib/esm/ai/prompt/Prompt.js +43 -11
  32. package/lib/esm/ai/prompt/Prompt.js.map +1 -1
  33. package/lib/esm/ai/prompt/focusTextareaFromPromptWrapper.js +81 -0
  34. package/lib/esm/ai/prompt/focusTextareaFromPromptWrapper.js.map +1 -0
  35. package/lib/esm/date-picker/DatePicker.js +6 -1
  36. package/lib/esm/date-picker/DatePicker.js.map +1 -1
  37. package/lib/esm/date-picker/stories/date-picker-in-popover-dialog.story.js +40 -0
  38. package/lib/esm/date-picker/stories/date-picker-in-popover-dialog.story.js.map +1 -0
  39. package/lib/esm/date-picker/stories/index.js +3 -0
  40. package/lib/esm/date-picker/stories/index.js.map +1 -1
  41. package/lib/esm/time-picker/TimePicker.js +6 -1
  42. package/lib/esm/time-picker/TimePicker.js.map +1 -1
  43. package/lib/esm/time-picker/stories/index.js +3 -0
  44. package/lib/esm/time-picker/stories/index.js.map +1 -1
  45. package/lib/esm/time-picker/stories/time-picker-in-popover-dialog.story.js +30 -0
  46. package/lib/esm/time-picker/stories/time-picker-in-popover-dialog.story.js.map +1 -0
  47. package/lib/esm/timezone-picker/TimeZonePicker.js +6 -1
  48. package/lib/esm/timezone-picker/TimeZonePicker.js.map +1 -1
  49. package/lib/esm/timezone-picker/stories/index.js +3 -0
  50. package/lib/esm/timezone-picker/stories/index.js.map +1 -1
  51. package/lib/esm/timezone-picker/stories/timezone-picker-in-popover-dialog.story.js +30 -0
  52. package/lib/esm/timezone-picker/stories/timezone-picker-in-popover-dialog.story.js.map +1 -0
  53. package/lib/types/ai/file-tag/FileTag.d.ts.map +1 -1
  54. package/lib/types/ai/image-tag/ImageTag.d.ts.map +1 -1
  55. package/lib/types/ai/prompt/Prompt.d.ts.map +1 -1
  56. package/lib/types/ai/prompt/focusTextareaFromPromptWrapper.d.ts +28 -0
  57. package/lib/types/ai/prompt/focusTextareaFromPromptWrapper.d.ts.map +1 -0
  58. package/lib/types/date-picker/DatePicker.d.ts.map +1 -1
  59. package/lib/types/date-picker/stories/date-picker-in-popover-dialog.story.d.ts +24 -0
  60. package/lib/types/date-picker/stories/date-picker-in-popover-dialog.story.d.ts.map +1 -0
  61. package/lib/types/date-picker/stories/index.d.ts +2 -0
  62. package/lib/types/date-picker/stories/index.d.ts.map +1 -1
  63. package/lib/types/time-picker/TimePicker.d.ts.map +1 -1
  64. package/lib/types/time-picker/stories/index.d.ts +2 -0
  65. package/lib/types/time-picker/stories/index.d.ts.map +1 -1
  66. package/lib/types/time-picker/stories/time-picker-in-popover-dialog.story.d.ts +24 -0
  67. package/lib/types/time-picker/stories/time-picker-in-popover-dialog.story.d.ts.map +1 -0
  68. package/lib/types/timezone-picker/TimeZonePicker.d.ts.map +1 -1
  69. package/lib/types/timezone-picker/stories/index.d.ts +2 -0
  70. package/lib/types/timezone-picker/stories/index.d.ts.map +1 -1
  71. package/lib/types/timezone-picker/stories/timezone-picker-in-popover-dialog.story.d.ts +24 -0
  72. package/lib/types/timezone-picker/stories/timezone-picker-in-popover-dialog.story.d.ts.map +1 -0
  73. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"TimeZonePicker.js","sourceRoot":"","sources":["../../../src/timezone-picker/TimeZonePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingPortal,\n offset,\n shift,\n size as sizeMiddleware,\n useDismiss,\n useFloating,\n useInteractions,\n useMergeRefs,\n useTransitionStyles,\n} from '@floating-ui/react';\nimport { ChevronDownIcon } from '@heroicons/react/24/outline';\nimport { tokens } from '@neo4j-ndl/base';\nimport classNames from 'classnames';\nimport type React from 'react';\nimport {\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type CommonProps } from '../_common/types';\nimport { ConditionalWrap } from '../conditional-wrap';\nimport { useIsInsideDialog } from '../dialog/dialog-context';\nimport { ExclamationCircleIconSolid } from '../icons/generated/heroIcons/ExclamationCircleIconSolid';\nimport { useNeedleTheme } from '../theme';\nimport { Typography } from '../typography';\nimport {\n formatTimeZone,\n generateTimeZoneOptions,\n generateUTCTimeZoneOptions,\n isValidUTCFormat,\n parseCustomUTCOffset,\n} from './generate-timezone-options';\nimport {\n useKeyboardNavigation,\n useTimeZonePickerPopover,\n} from './timezone-picker-hooks';\n\nexport type TimeZonePickerProps = {\n /** The value of the timezone picker (IANA timezone identifier) */\n value?: string;\n /** Whether the timezone picker is fluid */\n isFluid?: boolean;\n /** Whether the timezone picker is read only */\n isReadOnly?: boolean;\n /** Whether the timezone picker is required */\n isRequired?: boolean;\n /** Whether the timezone picker is disabled */\n isDisabled?: boolean;\n /** The label of the timezone picker */\n label?: string;\n /** The size of the timezone picker */\n size?: 'small' | 'medium' | 'large';\n /** Manually set the error text */\n errorText?: string;\n /** Callback function triggered when the timezone picker value changes */\n onChange?: (timezone: string) => void;\n /** Callback function triggered when the timezone picker encounters an error */\n onError?: (error: string, timezone: string) => void;\n /**\n * Strategy for the dropdown floating element.\n * By default it is absolute, but if the component is inside of a needle Dialog, it is set to fixed.\n * If this prop is set, no auto-detection of Dialog is done.\n */\n floatingStrategy?: 'absolute' | 'fixed';\n /** Whether the dropdown element is rendered in a portal. */\n isPortaled?: boolean;\n /** Reference date for calculating timezone offsets (useful for DST-aware offset display) */\n referenceDate?: Date;\n /**\n * Display mode: 'city', 'utc', or 'both'\n * 'city' - shows city-based timezones, This should be used when the user needs to select a timezone for themselves or if they are selecting a timezone that's related to a date.\n * 'utc' - shows UTC timezones, This should be used when the user needs to select a timezone for a database entry or a technical application.\n * 'both' - shows both city-based and UTC timezones in separate sections, This should be used when the user needs to select a timezone for a database entry or a technical application, but also wants to see the city-based timezones for context for example a zoned date time.\n * @default 'city'\n * @example\n * <TimeZonePicker mode=\"city\" />\n * <TimeZonePicker mode=\"utc\" />\n * <TimeZonePicker mode=\"both\" />\n */\n mode?: 'city' | 'utc' | 'both';\n};\n\nexport const TimeZonePicker = ({\n isDisabled,\n isFluid,\n isReadOnly,\n isRequired,\n value,\n label,\n onChange,\n className,\n onError,\n style,\n size = 'medium',\n errorText,\n htmlAttributes,\n floatingStrategy,\n isPortaled: isPortaledProp,\n referenceDate,\n mode = 'city',\n ref,\n ...restProps\n}: CommonProps<'input', TimeZonePickerProps>) => {\n const [inputValue, setInputValue] = useState<string>(\n value\n ? formatTimeZone(value, referenceDate)\n : formatTimeZone(\n new Date().toISOString().split('T')[1].split('.')[0],\n referenceDate,\n ),\n );\n const [searchQuery, setSearchQuery] = useState<string>('');\n const listRef = useRef<HTMLUListElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current as HTMLInputElement, []);\n const [error, setError] = useState<string | undefined>(undefined);\n const errorTextId = useId();\n const listboxId = useId();\n\n const timezoneOptions = useMemo(() => {\n if (mode === 'utc') {\n return generateUTCTimeZoneOptions(referenceDate);\n } else if (mode === 'city') {\n return generateTimeZoneOptions(referenceDate);\n } else {\n // 'both' mode - combine both lists, excluding UTC from city list to avoid duplication\n return [\n ...generateUTCTimeZoneOptions(referenceDate),\n ...generateTimeZoneOptions(referenceDate, true), // excludeUTC = true\n ];\n }\n }, [referenceDate, mode]);\n\n const { themeClassName } = useNeedleTheme();\n const { isPopoverOpen, setIsPopoverOpen } = useTimeZonePickerPopover(false);\n\n // Filter options based on search query\n const filteredOptions = useMemo(() => {\n if (!searchQuery) {\n return timezoneOptions;\n }\n\n const query = searchQuery.toLowerCase();\n return timezoneOptions.filter(\n (option) =>\n option.label.toLowerCase().includes(query) ||\n option.value.toLowerCase().includes(query),\n );\n }, [timezoneOptions, searchQuery]);\n\n // Split options into UTC and city-based sections for 'both' mode\n const { utcOptions, cityOptions } = useMemo(() => {\n if (mode !== 'both') {\n return { cityOptions: filteredOptions, utcOptions: [] };\n }\n\n const utc: typeof filteredOptions = [];\n const city: typeof filteredOptions = [];\n\n filteredOptions.forEach((option) => {\n // UTC options are those that start with \"UTC\" in their value or label\n if (\n option.value.toUpperCase().startsWith('UTC') ||\n option.label.toUpperCase().startsWith('UTC')\n ) {\n utc.push(option);\n } else {\n city.push(option);\n }\n });\n\n return { cityOptions: city, utcOptions: utc };\n }, [filteredOptions, mode]);\n\n const { focusedIndex, setFocusedIndex, handleArrowNavigation } =\n useKeyboardNavigation(filteredOptions.length);\n\n const errorToShow =\n errorText !== undefined && errorText !== '' ? errorText : error;\n\n const classes = {\n 'ndl-disabled': isDisabled,\n 'ndl-error': errorToShow !== undefined,\n 'ndl-fluid': isFluid,\n 'ndl-large': size === 'large',\n 'ndl-medium': size === 'medium',\n 'ndl-read-only': isReadOnly,\n 'ndl-small': size === 'small',\n };\n\n const inputWidth = isFluid === true ? '100%' : '16rem';\n\n useEffect(() => {\n if (error !== undefined) {\n onError?.(error, inputValue);\n }\n }, [error, inputValue, onError]);\n\n useEffect(() => {\n setInputValue(value ? formatTimeZone(value, referenceDate) : '');\n }, [value, referenceDate]);\n\n useEffect(() => {\n if (isPopoverOpen) {\n setTimeout(() => {\n listRef.current?.children[focusedIndex]?.scrollIntoView({\n block: 'center',\n inline: 'nearest',\n });\n }, 0);\n } else {\n setTimeout(() => {\n inputRef.current?.blur();\n const selectedIndex =\n filteredOptions.findIndex((opt) => opt.value === value) ?? 0;\n setFocusedIndex(selectedIndex >= 0 ? selectedIndex : 0);\n setSearchQuery('');\n }, 0);\n }\n }, [focusedIndex, isPopoverOpen, value, setFocusedIndex, filteredOptions]);\n\n const handleOnClick = (timezone: string) => {\n if (onChange) {\n onChange(timezone);\n }\n setError(undefined);\n setInputValue(formatTimeZone(timezone, referenceDate));\n setIsPopoverOpen(false);\n setSearchQuery('');\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setSearchQuery(query);\n setInputValue(query);\n\n // In UTC mode (utc or both), validate custom UTC input\n if (\n (mode === 'utc' || mode === 'both') &&\n query.trim().toUpperCase().startsWith('UTC')\n ) {\n if (isValidUTCFormat(query.trim())) {\n setError(undefined);\n } else {\n setError('Invalid UTC format. Use UTC+H:MM or UTC-H:MM');\n }\n return;\n }\n\n // Try to find a matching timezone\n const matchingOption = timezoneOptions.find(\n (opt) =>\n opt.label.toLowerCase().includes(query.toLowerCase()) ||\n opt.value.toLowerCase().includes(query.toLowerCase()),\n );\n\n if (matchingOption) {\n setError(undefined);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (isReadOnly === true || isDisabled === true) {\n e.preventDefault();\n return;\n }\n\n if (e.key === 'Escape') {\n setIsPopoverOpen(false);\n setSearchQuery('');\n setInputValue(value ? formatTimeZone(value, referenceDate) : '');\n }\n\n setIsPopoverOpen(true);\n\n if (e.key === 'Enter') {\n // In UTC mode (utc or both), allow custom UTC input\n if (\n (mode === 'utc' || mode === 'both') &&\n inputValue.trim().toUpperCase().startsWith('UTC')\n ) {\n const parsedOffset = parseCustomUTCOffset(inputValue.trim());\n if (parsedOffset) {\n handleOnClick(parsedOffset);\n return;\n }\n }\n\n if (filteredOptions.length > 0) {\n const selectedOption = filteredOptions[focusedIndex];\n if (selectedOption) {\n handleOnClick(selectedOption.value);\n }\n }\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n handleArrowNavigation(e.key);\n }\n };\n\n /** Custom floating ui solution */\n const isInsideDialog = useIsInsideDialog();\n const isPortaled = isPortaledProp ?? !isInsideDialog;\n const containerRef = useRef<HTMLDivElement>(null);\n const { refs, floatingStyles, context } = useFloating({\n elements: {\n reference: containerRef.current,\n },\n middleware: [\n offset(10),\n flip({\n fallbackPlacements: ['top'],\n fallbackStrategy: 'bestFit',\n }),\n shift({ padding: 5 }),\n sizeMiddleware({\n apply({ availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n padding: 5,\n }),\n ],\n onOpenChange: (open) => {\n setIsPopoverOpen(open);\n },\n open: isDisabled !== true && isReadOnly !== true && isPopoverOpen,\n placement: 'bottom',\n strategy: floatingStrategy ?? (isInsideDialog ? 'fixed' : 'absolute'),\n whileElementsMounted: autoUpdate,\n });\n const dismiss = useDismiss(context);\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss]);\n const { styles: transitionStyles } = useTransitionStyles(context, {\n duration: Number.parseInt(tokens.motion.duration.quick) ?? 0,\n });\n\n const mergedRef = useMergeRefs([refs.setReference, containerRef]);\n\n return (\n <>\n <div\n className={classNames('ndl-timezone-picker', className, {\n ...classes,\n })}\n ref={mergedRef}\n {...getReferenceProps()}\n style={{\n width: isFluid === true ? '100%' : 'fit-content',\n }}\n >\n <label className=\"ndl-timezone-picker-label\">\n {label !== undefined && (\n <Typography\n variant={size === 'large' ? 'body-large' : 'body-medium'}\n >\n {label}\n </Typography>\n )}\n <div\n className=\"ndl-timezone-picker-input-wrapper\"\n style={{\n width: inputWidth,\n ...style,\n }}\n >\n <input\n role=\"combobox\"\n aria-expanded={isPopoverOpen}\n aria-controls={listboxId}\n aria-activedescendant={\n isPopoverOpen && focusedIndex >= 0\n ? `${listboxId}-option-${focusedIndex}`\n : undefined\n }\n aria-label={label}\n aria-invalid={Boolean(errorToShow)}\n aria-describedby={errorToShow ? errorTextId : undefined}\n className=\"ndl-timezone-picker-input\"\n type=\"text\"\n ref={inputRef}\n value={inputValue}\n disabled={isDisabled}\n readOnly={isReadOnly}\n required={isRequired}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onClick={(e) => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n setIsPopoverOpen(true);\n // Select all text on click for easy searching\n e.currentTarget.select();\n }}\n onFocus={(e) => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n // Select all text on focus for easy searching\n e.currentTarget.select();\n }}\n onBlur={(e) => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n\n if (\n e.relatedTarget?.classList.contains(\n 'ndl-timezone-picker-popover-item',\n ) === true\n ) {\n return;\n }\n\n // In UTC mode (utc or both), try to parse custom input on blur\n if (\n (mode === 'utc' || mode === 'both') &&\n inputValue.trim().toUpperCase().startsWith('UTC')\n ) {\n const parsedOffset = parseCustomUTCOffset(inputValue.trim());\n if (parsedOffset) {\n handleOnClick(parsedOffset);\n setError(undefined);\n return;\n }\n }\n\n // Reset to the current value if no valid selection was made\n if (value) {\n setInputValue(formatTimeZone(value, referenceDate));\n } else {\n setInputValue('');\n }\n setSearchQuery('');\n setError(undefined);\n }}\n placeholder={\n mode === 'city'\n ? 'Select timezone'\n : mode === 'utc'\n ? 'Select or type UTC offset (e.g., UTC+5:30)'\n : 'Select timezone or type UTC offset'\n }\n {...htmlAttributes}\n {...restProps}\n />\n <ChevronDownIcon className=\"ndl-icon-svg ndl-timezone-picker-icon\" />\n </div>\n </label>\n {errorToShow !== undefined && (\n <div className=\"ndl-timezone-picker-error-wrapper\" role=\"status\">\n <ExclamationCircleIconSolid className=\"ndl-timezone-picker-error-icon\" />\n <Typography\n variant={size === 'large' ? 'body-medium' : 'body-small'}\n className=\"ndl-timezone-picker-error-text\"\n htmlAttributes={{ id: errorTextId }}\n >\n {errorToShow}\n </Typography>\n </div>\n )}\n </div>\n\n {context.open && (\n <ConditionalWrap\n shouldWrap={isPortaled}\n wrap={(wrapChildren) => (\n <FloatingPortal>{wrapChildren}</FloatingPortal>\n )}\n >\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n >\n <div\n ref={refs.setFloating}\n className={classNames(\n themeClassName,\n 'ndl-timezone-picker-popover',\n {\n ...classes,\n },\n )}\n style={{\n ...transitionStyles,\n ...floatingStyles,\n width:\n isFluid === true\n ? containerRef.current?.clientWidth\n : undefined,\n }}\n {...getFloatingProps()}\n >\n <ul ref={listRef} role=\"listbox\" id={listboxId} tabIndex={-1}>\n {mode === 'both' ? (\n <>\n {utcOptions.length > 0 && (\n <>\n <li className=\"ndl-timezone-picker-section-header\">\n UTC Offsets\n </li>\n {utcOptions.map((option, i) => (\n <li\n id={`${listboxId}-option-${i}`}\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n value={option.value}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleOnClick(option.value);\n setIsPopoverOpen(false);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n tabIndex={-1}\n className={classNames(\n focusedIndex === i ? 'focused' : '',\n 'ndl-timezone-picker-popover-item',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n handleOnClick(option.value);\n }\n }}\n >\n {option.label}\n </li>\n ))}\n </>\n )}\n {cityOptions.length > 0 && (\n <>\n <li className=\"ndl-timezone-picker-section-header\">\n City-Based Timezones\n </li>\n {cityOptions.map((option, i) => {\n const adjustedIndex = i + utcOptions.length;\n return (\n <li\n id={`${listboxId}-option-${adjustedIndex}`}\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n value={option.value}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleOnClick(option.value);\n setIsPopoverOpen(false);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n tabIndex={-1}\n className={classNames(\n focusedIndex === adjustedIndex ? 'focused' : '',\n 'ndl-timezone-picker-popover-item',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n handleOnClick(option.value);\n }\n }}\n >\n {option.label}\n </li>\n );\n })}\n </>\n )}\n {utcOptions.length === 0 && cityOptions.length === 0 && (\n <li className=\"ndl-timezone-picker-popover-item ndl-timezone-picker-no-results\">\n No timezones found\n </li>\n )}\n </>\n ) : (\n <>\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, i) => (\n <li\n id={`${listboxId}-option-${i}`}\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n value={option.value}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleOnClick(option.value);\n setIsPopoverOpen(false);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n tabIndex={-1}\n className={classNames(\n focusedIndex === i ? 'focused' : '',\n 'ndl-timezone-picker-popover-item',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n handleOnClick(option.value);\n }\n }}\n >\n {option.label}\n </li>\n ))\n ) : (\n <li className=\"ndl-timezone-picker-popover-item ndl-timezone-picker-no-results\">\n No timezones found\n </li>\n )}\n </>\n )}\n </ul>\n </div>\n </FloatingFocusManager>\n </ConditionalWrap>\n )}\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"TimeZonePicker.js","sourceRoot":"","sources":["../../../src/timezone-picker/TimeZonePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport {\n autoUpdate,\n type Boundary,\n flip,\n FloatingFocusManager,\n FloatingPortal,\n offset,\n shift,\n size as sizeMiddleware,\n useDismiss,\n useFloating,\n useInteractions,\n useMergeRefs,\n useTransitionStyles,\n} from '@floating-ui/react';\nimport { ChevronDownIcon } from '@heroicons/react/24/outline';\nimport { tokens } from '@neo4j-ndl/base';\nimport classNames from 'classnames';\nimport type React from 'react';\nimport {\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type CommonProps } from '../_common/types';\nimport { ConditionalWrap } from '../conditional-wrap';\nimport { useIsInsideDialog } from '../dialog/dialog-context';\nimport { ExclamationCircleIconSolid } from '../icons/generated/heroIcons/ExclamationCircleIconSolid';\nimport { useNeedleTheme } from '../theme';\nimport { Typography } from '../typography';\nimport {\n formatTimeZone,\n generateTimeZoneOptions,\n generateUTCTimeZoneOptions,\n isValidUTCFormat,\n parseCustomUTCOffset,\n} from './generate-timezone-options';\nimport {\n useKeyboardNavigation,\n useTimeZonePickerPopover,\n} from './timezone-picker-hooks';\n\nexport type TimeZonePickerProps = {\n /** The value of the timezone picker (IANA timezone identifier) */\n value?: string;\n /** Whether the timezone picker is fluid */\n isFluid?: boolean;\n /** Whether the timezone picker is read only */\n isReadOnly?: boolean;\n /** Whether the timezone picker is required */\n isRequired?: boolean;\n /** Whether the timezone picker is disabled */\n isDisabled?: boolean;\n /** The label of the timezone picker */\n label?: string;\n /** The size of the timezone picker */\n size?: 'small' | 'medium' | 'large';\n /** Manually set the error text */\n errorText?: string;\n /** Callback function triggered when the timezone picker value changes */\n onChange?: (timezone: string) => void;\n /** Callback function triggered when the timezone picker encounters an error */\n onError?: (error: string, timezone: string) => void;\n /**\n * Strategy for the dropdown floating element.\n * By default it is absolute, but if the component is inside of a needle Dialog, it is set to fixed.\n * If this prop is set, no auto-detection of Dialog is done.\n */\n floatingStrategy?: 'absolute' | 'fixed';\n /** Whether the dropdown element is rendered in a portal. */\n isPortaled?: boolean;\n /** Reference date for calculating timezone offsets (useful for DST-aware offset display) */\n referenceDate?: Date;\n /**\n * Display mode: 'city', 'utc', or 'both'\n * 'city' - shows city-based timezones, This should be used when the user needs to select a timezone for themselves or if they are selecting a timezone that's related to a date.\n * 'utc' - shows UTC timezones, This should be used when the user needs to select a timezone for a database entry or a technical application.\n * 'both' - shows both city-based and UTC timezones in separate sections, This should be used when the user needs to select a timezone for a database entry or a technical application, but also wants to see the city-based timezones for context for example a zoned date time.\n * @default 'city'\n * @example\n * <TimeZonePicker mode=\"city\" />\n * <TimeZonePicker mode=\"utc\" />\n * <TimeZonePicker mode=\"both\" />\n */\n mode?: 'city' | 'utc' | 'both';\n};\n\nexport const TimeZonePicker = ({\n isDisabled,\n isFluid,\n isReadOnly,\n isRequired,\n value,\n label,\n onChange,\n className,\n onError,\n style,\n size = 'medium',\n errorText,\n htmlAttributes,\n floatingStrategy,\n isPortaled: isPortaledProp,\n referenceDate,\n mode = 'city',\n ref,\n ...restProps\n}: CommonProps<'input', TimeZonePickerProps>) => {\n const [inputValue, setInputValue] = useState<string>(\n value\n ? formatTimeZone(value, referenceDate)\n : formatTimeZone(\n new Date().toISOString().split('T')[1].split('.')[0],\n referenceDate,\n ),\n );\n const [searchQuery, setSearchQuery] = useState<string>('');\n const listRef = useRef<HTMLUListElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current as HTMLInputElement, []);\n const [error, setError] = useState<string | undefined>(undefined);\n const errorTextId = useId();\n const listboxId = useId();\n\n const timezoneOptions = useMemo(() => {\n if (mode === 'utc') {\n return generateUTCTimeZoneOptions(referenceDate);\n } else if (mode === 'city') {\n return generateTimeZoneOptions(referenceDate);\n } else {\n // 'both' mode - combine both lists, excluding UTC from city list to avoid duplication\n return [\n ...generateUTCTimeZoneOptions(referenceDate),\n ...generateTimeZoneOptions(referenceDate, true), // excludeUTC = true\n ];\n }\n }, [referenceDate, mode]);\n\n const { themeClassName } = useNeedleTheme();\n const { isPopoverOpen, setIsPopoverOpen } = useTimeZonePickerPopover(false);\n\n // Filter options based on search query\n const filteredOptions = useMemo(() => {\n if (!searchQuery) {\n return timezoneOptions;\n }\n\n const query = searchQuery.toLowerCase();\n return timezoneOptions.filter(\n (option) =>\n option.label.toLowerCase().includes(query) ||\n option.value.toLowerCase().includes(query),\n );\n }, [timezoneOptions, searchQuery]);\n\n // Split options into UTC and city-based sections for 'both' mode\n const { utcOptions, cityOptions } = useMemo(() => {\n if (mode !== 'both') {\n return { cityOptions: filteredOptions, utcOptions: [] };\n }\n\n const utc: typeof filteredOptions = [];\n const city: typeof filteredOptions = [];\n\n filteredOptions.forEach((option) => {\n // UTC options are those that start with \"UTC\" in their value or label\n if (\n option.value.toUpperCase().startsWith('UTC') ||\n option.label.toUpperCase().startsWith('UTC')\n ) {\n utc.push(option);\n } else {\n city.push(option);\n }\n });\n\n return { cityOptions: city, utcOptions: utc };\n }, [filteredOptions, mode]);\n\n const { focusedIndex, setFocusedIndex, handleArrowNavigation } =\n useKeyboardNavigation(filteredOptions.length);\n\n const errorToShow =\n errorText !== undefined && errorText !== '' ? errorText : error;\n\n const classes = {\n 'ndl-disabled': isDisabled,\n 'ndl-error': errorToShow !== undefined,\n 'ndl-fluid': isFluid,\n 'ndl-large': size === 'large',\n 'ndl-medium': size === 'medium',\n 'ndl-read-only': isReadOnly,\n 'ndl-small': size === 'small',\n };\n\n const inputWidth = isFluid === true ? '100%' : '16rem';\n\n useEffect(() => {\n if (error !== undefined) {\n onError?.(error, inputValue);\n }\n }, [error, inputValue, onError]);\n\n useEffect(() => {\n setInputValue(value ? formatTimeZone(value, referenceDate) : '');\n }, [value, referenceDate]);\n\n useEffect(() => {\n if (isPopoverOpen) {\n setTimeout(() => {\n listRef.current?.children[focusedIndex]?.scrollIntoView({\n block: 'center',\n inline: 'nearest',\n });\n }, 0);\n } else {\n setTimeout(() => {\n inputRef.current?.blur();\n const selectedIndex =\n filteredOptions.findIndex((opt) => opt.value === value) ?? 0;\n setFocusedIndex(selectedIndex >= 0 ? selectedIndex : 0);\n setSearchQuery('');\n }, 0);\n }\n }, [focusedIndex, isPopoverOpen, value, setFocusedIndex, filteredOptions]);\n\n const handleOnClick = (timezone: string) => {\n if (onChange) {\n onChange(timezone);\n }\n setError(undefined);\n setInputValue(formatTimeZone(timezone, referenceDate));\n setIsPopoverOpen(false);\n setSearchQuery('');\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setSearchQuery(query);\n setInputValue(query);\n\n // In UTC mode (utc or both), validate custom UTC input\n if (\n (mode === 'utc' || mode === 'both') &&\n query.trim().toUpperCase().startsWith('UTC')\n ) {\n if (isValidUTCFormat(query.trim())) {\n setError(undefined);\n } else {\n setError('Invalid UTC format. Use UTC+H:MM or UTC-H:MM');\n }\n return;\n }\n\n // Try to find a matching timezone\n const matchingOption = timezoneOptions.find(\n (opt) =>\n opt.label.toLowerCase().includes(query.toLowerCase()) ||\n opt.value.toLowerCase().includes(query.toLowerCase()),\n );\n\n if (matchingOption) {\n setError(undefined);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (isReadOnly === true || isDisabled === true) {\n e.preventDefault();\n return;\n }\n\n if (e.key === 'Escape') {\n setIsPopoverOpen(false);\n setSearchQuery('');\n setInputValue(value ? formatTimeZone(value, referenceDate) : '');\n }\n\n setIsPopoverOpen(true);\n\n if (e.key === 'Enter') {\n // In UTC mode (utc or both), allow custom UTC input\n if (\n (mode === 'utc' || mode === 'both') &&\n inputValue.trim().toUpperCase().startsWith('UTC')\n ) {\n const parsedOffset = parseCustomUTCOffset(inputValue.trim());\n if (parsedOffset) {\n handleOnClick(parsedOffset);\n return;\n }\n }\n\n if (filteredOptions.length > 0) {\n const selectedOption = filteredOptions[focusedIndex];\n if (selectedOption) {\n handleOnClick(selectedOption.value);\n }\n }\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n handleArrowNavigation(e.key);\n }\n };\n\n /** Custom floating ui solution */\n const isInsideDialog = useIsInsideDialog();\n const isPortaled = isPortaledProp ?? !isInsideDialog;\n // Inside a Dialog the popover is fixed and not portaled. A transformed\n // ancestor (e.g. Popover) can make Floating UI under-measure available\n // space, so use the viewport as the boundary instead.\n const floatingBoundary: Boundary = isInsideDialog ? [] : 'clippingAncestors';\n const containerRef = useRef<HTMLDivElement>(null);\n const { refs, floatingStyles, context } = useFloating({\n elements: {\n reference: containerRef.current,\n },\n middleware: [\n offset(10),\n flip({\n fallbackPlacements: ['top'],\n fallbackStrategy: 'bestFit',\n }),\n shift({ boundary: floatingBoundary, padding: 5 }),\n sizeMiddleware({\n apply({ availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n boundary: floatingBoundary,\n padding: 5,\n }),\n ],\n onOpenChange: (open) => {\n setIsPopoverOpen(open);\n },\n open: isDisabled !== true && isReadOnly !== true && isPopoverOpen,\n placement: 'bottom',\n strategy: floatingStrategy ?? (isInsideDialog ? 'fixed' : 'absolute'),\n whileElementsMounted: autoUpdate,\n });\n const dismiss = useDismiss(context);\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss]);\n const { styles: transitionStyles } = useTransitionStyles(context, {\n duration: Number.parseInt(tokens.motion.duration.quick) ?? 0,\n });\n\n const mergedRef = useMergeRefs([refs.setReference, containerRef]);\n\n return (\n <>\n <div\n className={classNames('ndl-timezone-picker', className, {\n ...classes,\n })}\n ref={mergedRef}\n {...getReferenceProps()}\n style={{\n width: isFluid === true ? '100%' : 'fit-content',\n }}\n >\n <label className=\"ndl-timezone-picker-label\">\n {label !== undefined && (\n <Typography\n variant={size === 'large' ? 'body-large' : 'body-medium'}\n >\n {label}\n </Typography>\n )}\n <div\n className=\"ndl-timezone-picker-input-wrapper\"\n style={{\n width: inputWidth,\n ...style,\n }}\n >\n <input\n role=\"combobox\"\n aria-expanded={isPopoverOpen}\n aria-controls={listboxId}\n aria-activedescendant={\n isPopoverOpen && focusedIndex >= 0\n ? `${listboxId}-option-${focusedIndex}`\n : undefined\n }\n aria-label={label}\n aria-invalid={Boolean(errorToShow)}\n aria-describedby={errorToShow ? errorTextId : undefined}\n className=\"ndl-timezone-picker-input\"\n type=\"text\"\n ref={inputRef}\n value={inputValue}\n disabled={isDisabled}\n readOnly={isReadOnly}\n required={isRequired}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onClick={(e) => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n setIsPopoverOpen(true);\n // Select all text on click for easy searching\n e.currentTarget.select();\n }}\n onFocus={(e) => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n // Select all text on focus for easy searching\n e.currentTarget.select();\n }}\n onBlur={(e) => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n\n if (\n e.relatedTarget?.classList.contains(\n 'ndl-timezone-picker-popover-item',\n ) === true\n ) {\n return;\n }\n\n // In UTC mode (utc or both), try to parse custom input on blur\n if (\n (mode === 'utc' || mode === 'both') &&\n inputValue.trim().toUpperCase().startsWith('UTC')\n ) {\n const parsedOffset = parseCustomUTCOffset(inputValue.trim());\n if (parsedOffset) {\n handleOnClick(parsedOffset);\n setError(undefined);\n return;\n }\n }\n\n // Reset to the current value if no valid selection was made\n if (value) {\n setInputValue(formatTimeZone(value, referenceDate));\n } else {\n setInputValue('');\n }\n setSearchQuery('');\n setError(undefined);\n }}\n placeholder={\n mode === 'city'\n ? 'Select timezone'\n : mode === 'utc'\n ? 'Select or type UTC offset (e.g., UTC+5:30)'\n : 'Select timezone or type UTC offset'\n }\n {...htmlAttributes}\n {...restProps}\n />\n <ChevronDownIcon className=\"ndl-icon-svg ndl-timezone-picker-icon\" />\n </div>\n </label>\n {errorToShow !== undefined && (\n <div className=\"ndl-timezone-picker-error-wrapper\" role=\"status\">\n <ExclamationCircleIconSolid className=\"ndl-timezone-picker-error-icon\" />\n <Typography\n variant={size === 'large' ? 'body-medium' : 'body-small'}\n className=\"ndl-timezone-picker-error-text\"\n htmlAttributes={{ id: errorTextId }}\n >\n {errorToShow}\n </Typography>\n </div>\n )}\n </div>\n\n {context.open && (\n <ConditionalWrap\n shouldWrap={isPortaled}\n wrap={(wrapChildren) => (\n <FloatingPortal>{wrapChildren}</FloatingPortal>\n )}\n >\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n >\n <div\n ref={refs.setFloating}\n className={classNames(\n themeClassName,\n 'ndl-timezone-picker-popover',\n {\n ...classes,\n },\n )}\n style={{\n ...transitionStyles,\n ...floatingStyles,\n width:\n isFluid === true\n ? containerRef.current?.clientWidth\n : undefined,\n }}\n {...getFloatingProps()}\n >\n <ul ref={listRef} role=\"listbox\" id={listboxId} tabIndex={-1}>\n {mode === 'both' ? (\n <>\n {utcOptions.length > 0 && (\n <>\n <li className=\"ndl-timezone-picker-section-header\">\n UTC Offsets\n </li>\n {utcOptions.map((option, i) => (\n <li\n id={`${listboxId}-option-${i}`}\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n value={option.value}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleOnClick(option.value);\n setIsPopoverOpen(false);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n tabIndex={-1}\n className={classNames(\n focusedIndex === i ? 'focused' : '',\n 'ndl-timezone-picker-popover-item',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n handleOnClick(option.value);\n }\n }}\n >\n {option.label}\n </li>\n ))}\n </>\n )}\n {cityOptions.length > 0 && (\n <>\n <li className=\"ndl-timezone-picker-section-header\">\n City-Based Timezones\n </li>\n {cityOptions.map((option, i) => {\n const adjustedIndex = i + utcOptions.length;\n return (\n <li\n id={`${listboxId}-option-${adjustedIndex}`}\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n value={option.value}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleOnClick(option.value);\n setIsPopoverOpen(false);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n tabIndex={-1}\n className={classNames(\n focusedIndex === adjustedIndex ? 'focused' : '',\n 'ndl-timezone-picker-popover-item',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n handleOnClick(option.value);\n }\n }}\n >\n {option.label}\n </li>\n );\n })}\n </>\n )}\n {utcOptions.length === 0 && cityOptions.length === 0 && (\n <li className=\"ndl-timezone-picker-popover-item ndl-timezone-picker-no-results\">\n No timezones found\n </li>\n )}\n </>\n ) : (\n <>\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, i) => (\n <li\n id={`${listboxId}-option-${i}`}\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n value={option.value}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleOnClick(option.value);\n setIsPopoverOpen(false);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n tabIndex={-1}\n className={classNames(\n focusedIndex === i ? 'focused' : '',\n 'ndl-timezone-picker-popover-item',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n handleOnClick(option.value);\n }\n }}\n >\n {option.label}\n </li>\n ))\n ) : (\n <li className=\"ndl-timezone-picker-popover-item ndl-timezone-picker-no-results\">\n No timezones found\n </li>\n )}\n </>\n )}\n </ul>\n </div>\n </FloatingFocusManager>\n </ConditionalWrap>\n )}\n </>\n );\n};\n"]}
@@ -23,7 +23,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
23
23
  return (mod && mod.__esModule) ? mod : { "default": mod };
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.TimeZonePickerInDialogSource = exports.TimeZonePickerBothModeSource = exports.TimeZonePickerUTCOnlySource = exports.TimeZonePickerDSTAwareSource = exports.TimeZonePickerDisabledSource = exports.TimeZonePickerSizesSource = exports.TimeZonePickerFluidSource = exports.TimeZonePickerErrorSource = exports.TimeZonePickerDefaultSource = exports.TimeZonePickerInDialog = exports.TimeZonePickerBothMode = exports.TimeZonePickerUTCOnly = exports.TimeZonePickerDSTAware = exports.TimeZonePickerDisabled = exports.TimeZonePickerSizes = exports.TimeZonePickerFluid = exports.TimeZonePickerError = exports.TimeZonePickerDefault = void 0;
26
+ exports.TimeZonePickerInPopoverDialogSource = exports.TimeZonePickerInDialogSource = exports.TimeZonePickerBothModeSource = exports.TimeZonePickerUTCOnlySource = exports.TimeZonePickerDSTAwareSource = exports.TimeZonePickerDisabledSource = exports.TimeZonePickerSizesSource = exports.TimeZonePickerFluidSource = exports.TimeZonePickerErrorSource = exports.TimeZonePickerDefaultSource = exports.TimeZonePickerInPopoverDialog = exports.TimeZonePickerInDialog = exports.TimeZonePickerBothMode = exports.TimeZonePickerUTCOnly = exports.TimeZonePickerDSTAware = exports.TimeZonePickerDisabled = exports.TimeZonePickerSizes = exports.TimeZonePickerFluid = exports.TimeZonePickerError = exports.TimeZonePickerDefault = void 0;
27
27
  var timezone_picker_default_story_1 = require("./timezone-picker-default.story");
28
28
  Object.defineProperty(exports, "TimeZonePickerDefault", { enumerable: true, get: function () { return __importDefault(timezone_picker_default_story_1).default; } });
29
29
  var timezone_picker_error_story_1 = require("./timezone-picker-error.story");
@@ -42,6 +42,8 @@ var timezone_picker_both_mode_story_1 = require("./timezone-picker-both-mode.sto
42
42
  Object.defineProperty(exports, "TimeZonePickerBothMode", { enumerable: true, get: function () { return __importDefault(timezone_picker_both_mode_story_1).default; } });
43
43
  var timezone_picker_in_dialog_story_1 = require("./timezone-picker-in-dialog.story");
44
44
  Object.defineProperty(exports, "TimeZonePickerInDialog", { enumerable: true, get: function () { return __importDefault(timezone_picker_in_dialog_story_1).default; } });
45
+ var timezone_picker_in_popover_dialog_story_1 = require("./timezone-picker-in-popover-dialog.story");
46
+ Object.defineProperty(exports, "TimeZonePickerInPopoverDialog", { enumerable: true, get: function () { return __importDefault(timezone_picker_in_popover_dialog_story_1).default; } });
45
47
  const export_stories_utils_1 = require("../../_common/export-stories-utils");
46
48
  const timezone_picker_both_mode_story_tsx_raw_1 = __importDefault(require("./timezone-picker-both-mode.story.tsx?raw"));
47
49
  const timezone_picker_default_story_tsx_raw_1 = __importDefault(require("./timezone-picker-default.story.tsx?raw"));
@@ -50,6 +52,7 @@ const timezone_picker_dst_aware_story_tsx_raw_1 = __importDefault(require("./tim
50
52
  const timezone_picker_error_story_tsx_raw_1 = __importDefault(require("./timezone-picker-error.story.tsx?raw"));
51
53
  const timezone_picker_fluid_story_tsx_raw_1 = __importDefault(require("./timezone-picker-fluid.story.tsx?raw"));
52
54
  const timezone_picker_in_dialog_story_tsx_raw_1 = __importDefault(require("./timezone-picker-in-dialog.story.tsx?raw"));
55
+ const timezone_picker_in_popover_dialog_story_tsx_raw_1 = __importDefault(require("./timezone-picker-in-popover-dialog.story.tsx?raw"));
53
56
  const timezone_picker_sizes_story_tsx_raw_1 = __importDefault(require("./timezone-picker-sizes.story.tsx?raw"));
54
57
  const timezone_picker_utc_only_story_tsx_raw_1 = __importDefault(require("./timezone-picker-utc-only.story.tsx?raw"));
55
58
  exports.TimeZonePickerDefaultSource = (0, export_stories_utils_1.removeLicenseHeader)(timezone_picker_default_story_tsx_raw_1.default);
@@ -61,4 +64,5 @@ exports.TimeZonePickerDSTAwareSource = (0, export_stories_utils_1.removeLicenseH
61
64
  exports.TimeZonePickerUTCOnlySource = (0, export_stories_utils_1.removeLicenseHeader)(timezone_picker_utc_only_story_tsx_raw_1.default);
62
65
  exports.TimeZonePickerBothModeSource = (0, export_stories_utils_1.removeLicenseHeader)(timezone_picker_both_mode_story_tsx_raw_1.default);
63
66
  exports.TimeZonePickerInDialogSource = (0, export_stories_utils_1.removeLicenseHeader)(timezone_picker_in_dialog_story_tsx_raw_1.default);
67
+ exports.TimeZonePickerInPopoverDialogSource = (0, export_stories_utils_1.removeLicenseHeader)(timezone_picker_in_popover_dialog_story_tsx_raw_1.default);
64
68
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/timezone-picker/stories/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;AAEH,iFAAmF;AAA1E,uJAAA,OAAO,OAAyB;AACzC,6EAA+E;AAAtE,mJAAA,OAAO,OAAuB;AACvC,6EAA+E;AAAtE,mJAAA,OAAO,OAAuB;AACvC,6EAA+E;AAAtE,mJAAA,OAAO,OAAuB;AACvC,mFAAqF;AAA5E,yJAAA,OAAO,OAA0B;AAC1C,qFAAsF;AAA7E,0JAAA,OAAO,OAA0B;AAC1C,mFAAoF;AAA3E,wJAAA,OAAO,OAAyB;AACzC,qFAAsF;AAA7E,0JAAA,OAAO,OAA0B;AAC1C,qFAAsF;AAA7E,0JAAA,OAAO,OAA0B;AAE1C,6EAAyE;AACzE,wHAAwF;AACxF,oHAAqF;AACrF,sHAAuF;AACvF,wHAAwF;AACxF,gHAAiF;AACjF,gHAAiF;AACjF,wHAAwF;AACxF,gHAAiF;AACjF,sHAAsF;AAEzE,QAAA,2BAA2B,GAAG,IAAA,0CAAmB,EAC5D,+CAA8B,CAC/B,CAAC;AACW,QAAA,yBAAyB,GAAG,IAAA,0CAAmB,EAC1D,6CAA4B,CAC7B,CAAC;AACW,QAAA,yBAAyB,GAAG,IAAA,0CAAmB,EAC1D,6CAA4B,CAC7B,CAAC;AACW,QAAA,yBAAyB,GAAG,IAAA,0CAAmB,EAC1D,6CAA4B,CAC7B,CAAC;AACW,QAAA,4BAA4B,GAAG,IAAA,0CAAmB,EAC7D,gDAA+B,CAChC,CAAC;AACW,QAAA,4BAA4B,GAAG,IAAA,0CAAmB,EAC7D,iDAA+B,CAChC,CAAC;AACW,QAAA,2BAA2B,GAAG,IAAA,0CAAmB,EAC5D,gDAA8B,CAC/B,CAAC;AACW,QAAA,4BAA4B,GAAG,IAAA,0CAAmB,EAC7D,iDAA+B,CAChC,CAAC;AACW,QAAA,4BAA4B,GAAG,IAAA,0CAAmB,EAC7D,iDAA+B,CAChC,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nexport { default as TimeZonePickerDefault } from './timezone-picker-default.story';\nexport { default as TimeZonePickerError } from './timezone-picker-error.story';\nexport { default as TimeZonePickerFluid } from './timezone-picker-fluid.story';\nexport { default as TimeZonePickerSizes } from './timezone-picker-sizes.story';\nexport { default as TimeZonePickerDisabled } from './timezone-picker-disabled.story';\nexport { default as TimeZonePickerDSTAware } from './timezone-picker-dst-aware.story';\nexport { default as TimeZonePickerUTCOnly } from './timezone-picker-utc-only.story';\nexport { default as TimeZonePickerBothMode } from './timezone-picker-both-mode.story';\nexport { default as TimeZonePickerInDialog } from './timezone-picker-in-dialog.story';\n\nimport { removeLicenseHeader } from '../../_common/export-stories-utils';\nimport TimeZonePickerBothModeSourceRaw from './timezone-picker-both-mode.story.tsx?raw';\nimport TimeZonePickerDefaultSourceRaw from './timezone-picker-default.story.tsx?raw';\nimport TimeZonePickerDisabledSourceRaw from './timezone-picker-disabled.story.tsx?raw';\nimport TimeZonePickerDSTAwareSourceRaw from './timezone-picker-dst-aware.story.tsx?raw';\nimport TimeZonePickerErrorSourceRaw from './timezone-picker-error.story.tsx?raw';\nimport TimeZonePickerFluidSourceRaw from './timezone-picker-fluid.story.tsx?raw';\nimport TimeZonePickerInDialogSourceRaw from './timezone-picker-in-dialog.story.tsx?raw';\nimport TimeZonePickerSizesSourceRaw from './timezone-picker-sizes.story.tsx?raw';\nimport TimeZonePickerUTCOnlySourceRaw from './timezone-picker-utc-only.story.tsx?raw';\n\nexport const TimeZonePickerDefaultSource = removeLicenseHeader(\n TimeZonePickerDefaultSourceRaw,\n);\nexport const TimeZonePickerErrorSource = removeLicenseHeader(\n TimeZonePickerErrorSourceRaw,\n);\nexport const TimeZonePickerFluidSource = removeLicenseHeader(\n TimeZonePickerFluidSourceRaw,\n);\nexport const TimeZonePickerSizesSource = removeLicenseHeader(\n TimeZonePickerSizesSourceRaw,\n);\nexport const TimeZonePickerDisabledSource = removeLicenseHeader(\n TimeZonePickerDisabledSourceRaw,\n);\nexport const TimeZonePickerDSTAwareSource = removeLicenseHeader(\n TimeZonePickerDSTAwareSourceRaw,\n);\nexport const TimeZonePickerUTCOnlySource = removeLicenseHeader(\n TimeZonePickerUTCOnlySourceRaw,\n);\nexport const TimeZonePickerBothModeSource = removeLicenseHeader(\n TimeZonePickerBothModeSourceRaw,\n);\nexport const TimeZonePickerInDialogSource = removeLicenseHeader(\n TimeZonePickerInDialogSourceRaw,\n);\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/timezone-picker/stories/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;AAEH,iFAAmF;AAA1E,uJAAA,OAAO,OAAyB;AACzC,6EAA+E;AAAtE,mJAAA,OAAO,OAAuB;AACvC,6EAA+E;AAAtE,mJAAA,OAAO,OAAuB;AACvC,6EAA+E;AAAtE,mJAAA,OAAO,OAAuB;AACvC,mFAAqF;AAA5E,yJAAA,OAAO,OAA0B;AAC1C,qFAAsF;AAA7E,0JAAA,OAAO,OAA0B;AAC1C,mFAAoF;AAA3E,wJAAA,OAAO,OAAyB;AACzC,qFAAsF;AAA7E,0JAAA,OAAO,OAA0B;AAC1C,qFAAsF;AAA7E,0JAAA,OAAO,OAA0B;AAC1C,qGAAqG;AAA5F,yKAAA,OAAO,OAAiC;AAEjD,6EAAyE;AACzE,wHAAwF;AACxF,oHAAqF;AACrF,sHAAuF;AACvF,wHAAwF;AACxF,gHAAiF;AACjF,gHAAiF;AACjF,wHAAwF;AACxF,wIAAuG;AACvG,gHAAiF;AACjF,sHAAsF;AAEzE,QAAA,2BAA2B,GAAG,IAAA,0CAAmB,EAC5D,+CAA8B,CAC/B,CAAC;AACW,QAAA,yBAAyB,GAAG,IAAA,0CAAmB,EAC1D,6CAA4B,CAC7B,CAAC;AACW,QAAA,yBAAyB,GAAG,IAAA,0CAAmB,EAC1D,6CAA4B,CAC7B,CAAC;AACW,QAAA,yBAAyB,GAAG,IAAA,0CAAmB,EAC1D,6CAA4B,CAC7B,CAAC;AACW,QAAA,4BAA4B,GAAG,IAAA,0CAAmB,EAC7D,gDAA+B,CAChC,CAAC;AACW,QAAA,4BAA4B,GAAG,IAAA,0CAAmB,EAC7D,iDAA+B,CAChC,CAAC;AACW,QAAA,2BAA2B,GAAG,IAAA,0CAAmB,EAC5D,gDAA8B,CAC/B,CAAC;AACW,QAAA,4BAA4B,GAAG,IAAA,0CAAmB,EAC7D,iDAA+B,CAChC,CAAC;AACW,QAAA,4BAA4B,GAAG,IAAA,0CAAmB,EAC7D,iDAA+B,CAChC,CAAC;AACW,QAAA,mCAAmC,GAAG,IAAA,0CAAmB,EACpE,yDAAsC,CACvC,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nexport { default as TimeZonePickerDefault } from './timezone-picker-default.story';\nexport { default as TimeZonePickerError } from './timezone-picker-error.story';\nexport { default as TimeZonePickerFluid } from './timezone-picker-fluid.story';\nexport { default as TimeZonePickerSizes } from './timezone-picker-sizes.story';\nexport { default as TimeZonePickerDisabled } from './timezone-picker-disabled.story';\nexport { default as TimeZonePickerDSTAware } from './timezone-picker-dst-aware.story';\nexport { default as TimeZonePickerUTCOnly } from './timezone-picker-utc-only.story';\nexport { default as TimeZonePickerBothMode } from './timezone-picker-both-mode.story';\nexport { default as TimeZonePickerInDialog } from './timezone-picker-in-dialog.story';\nexport { default as TimeZonePickerInPopoverDialog } from './timezone-picker-in-popover-dialog.story';\n\nimport { removeLicenseHeader } from '../../_common/export-stories-utils';\nimport TimeZonePickerBothModeSourceRaw from './timezone-picker-both-mode.story.tsx?raw';\nimport TimeZonePickerDefaultSourceRaw from './timezone-picker-default.story.tsx?raw';\nimport TimeZonePickerDisabledSourceRaw from './timezone-picker-disabled.story.tsx?raw';\nimport TimeZonePickerDSTAwareSourceRaw from './timezone-picker-dst-aware.story.tsx?raw';\nimport TimeZonePickerErrorSourceRaw from './timezone-picker-error.story.tsx?raw';\nimport TimeZonePickerFluidSourceRaw from './timezone-picker-fluid.story.tsx?raw';\nimport TimeZonePickerInDialogSourceRaw from './timezone-picker-in-dialog.story.tsx?raw';\nimport TimeZonePickerInPopoverDialogSourceRaw from './timezone-picker-in-popover-dialog.story.tsx?raw';\nimport TimeZonePickerSizesSourceRaw from './timezone-picker-sizes.story.tsx?raw';\nimport TimeZonePickerUTCOnlySourceRaw from './timezone-picker-utc-only.story.tsx?raw';\n\nexport const TimeZonePickerDefaultSource = removeLicenseHeader(\n TimeZonePickerDefaultSourceRaw,\n);\nexport const TimeZonePickerErrorSource = removeLicenseHeader(\n TimeZonePickerErrorSourceRaw,\n);\nexport const TimeZonePickerFluidSource = removeLicenseHeader(\n TimeZonePickerFluidSourceRaw,\n);\nexport const TimeZonePickerSizesSource = removeLicenseHeader(\n TimeZonePickerSizesSourceRaw,\n);\nexport const TimeZonePickerDisabledSource = removeLicenseHeader(\n TimeZonePickerDisabledSourceRaw,\n);\nexport const TimeZonePickerDSTAwareSource = removeLicenseHeader(\n TimeZonePickerDSTAwareSourceRaw,\n);\nexport const TimeZonePickerUTCOnlySource = removeLicenseHeader(\n TimeZonePickerUTCOnlySourceRaw,\n);\nexport const TimeZonePickerBothModeSource = removeLicenseHeader(\n TimeZonePickerBothModeSourceRaw,\n);\nexport const TimeZonePickerInDialogSource = removeLicenseHeader(\n TimeZonePickerInDialogSourceRaw,\n);\nexport const TimeZonePickerInPopoverDialogSource = removeLicenseHeader(\n TimeZonePickerInPopoverDialogSourceRaw,\n);\n"]}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ /**
5
+ *
6
+ * Copyright (c) "Neo4j"
7
+ * Neo4j Sweden AB [http://neo4j.com]
8
+ *
9
+ * This file is part of Neo4j.
10
+ *
11
+ * Neo4j is free software: you can redistribute it and/or modify
12
+ * it under the terms of the GNU General Public License as published by
13
+ * the Free Software Foundation, either version 3 of the License, or
14
+ * (at your option) any later version.
15
+ *
16
+ * This program is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ * GNU General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU General Public License
22
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
23
+ */
24
+ require("@neo4j-ndl/base/lib/neo4j-ds-styles.css");
25
+ const react_1 = require("@neo4j-ndl/react");
26
+ const react_2 = require("react");
27
+ const Component = () => {
28
+ const [selectedTimeZone, setSelectedTimeZone] = (0, react_2.useState)('UTC');
29
+ return ((0, jsx_runtime_1.jsxs)(react_1.Dialog, { isOpen: true, "aria-label": "Dialog", children: [(0, jsx_runtime_1.jsx)(react_1.Dialog.Header, { children: "Using Timezone Picker inside a popover in a dialog" }), (0, jsx_runtime_1.jsx)(react_1.Dialog.Description, { className: "n-flex n-flex-col n-gap-token-32", children: (0, jsx_runtime_1.jsxs)(react_1.Popover, { children: [(0, jsx_runtime_1.jsx)(react_1.Popover.Trigger, { hasButtonWrapper: true, children: (0, jsx_runtime_1.jsx)(react_1.FilledButton, { children: "Open Popover" }) }), (0, jsx_runtime_1.jsx)(react_1.Popover.Content, { className: "n-p-token-16", children: (0, jsx_runtime_1.jsx)(react_1.TimeZonePicker, { label: "Timezone", value: selectedTimeZone, onChange: setSelectedTimeZone, htmlAttributes: { id: 'time-zone-input' } }) })] }) })] }));
30
+ };
31
+ exports.default = Component;
32
+ //# sourceMappingURL=timezone-picker-in-popover-dialog.story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone-picker-in-popover-dialog.story.js","sourceRoot":"","sources":["../../../../src/timezone-picker/stories/timezone-picker-in-popover-dialog.story.tsx"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,mDAAiD;AAEjD,4CAK0B;AAC1B,iCAAiC;AAEjC,MAAM,SAAS,GAAG,GAAG,EAAE;IACrB,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,IAAA,gBAAQ,EAAS,KAAK,CAAC,CAAC;IAExE,OAAO,CACL,wBAAC,cAAM,IAAC,MAAM,EAAE,IAAI,gBAAa,QAAQ,aACvC,uBAAC,cAAM,CAAC,MAAM,qEAEE,EAChB,uBAAC,cAAM,CAAC,WAAW,IAAC,SAAS,EAAC,kCAAkC,YAC9D,wBAAC,eAAO,eACN,uBAAC,eAAO,CAAC,OAAO,IAAC,gBAAgB,kBAC/B,uBAAC,oBAAY,+BAA4B,GACzB,EAClB,uBAAC,eAAO,CAAC,OAAO,IAAC,SAAS,EAAC,cAAc,YACvC,uBAAC,sBAAc,IACb,KAAK,EAAC,UAAU,EAChB,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,mBAAmB,EAC7B,cAAc,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,GACzC,GACc,IACV,GACS,IACd,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,SAAS,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport '@neo4j-ndl/base/lib/neo4j-ds-styles.css';\n\nimport {\n Dialog,\n FilledButton,\n Popover,\n TimeZonePicker,\n} from '@neo4j-ndl/react';\nimport { useState } from 'react';\n\nconst Component = () => {\n const [selectedTimeZone, setSelectedTimeZone] = useState<string>('UTC');\n\n return (\n <Dialog isOpen={true} aria-label=\"Dialog\">\n <Dialog.Header>\n Using Timezone Picker inside a popover in a dialog\n </Dialog.Header>\n <Dialog.Description className=\"n-flex n-flex-col n-gap-token-32\">\n <Popover>\n <Popover.Trigger hasButtonWrapper>\n <FilledButton>Open Popover</FilledButton>\n </Popover.Trigger>\n <Popover.Content className=\"n-p-token-16\">\n <TimeZonePicker\n label=\"Timezone\"\n value={selectedTimeZone}\n onChange={setSelectedTimeZone}\n htmlAttributes={{ id: 'time-zone-input' }}\n />\n </Popover.Content>\n </Popover>\n </Dialog.Description>\n </Dialog>\n );\n};\n\nexport default Component;\n"]}
@@ -32,6 +32,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
32
32
  */
33
33
  import { CleanIconButton, LoadingSpinner, Tooltip } from '@neo4j-ndl/react';
34
34
  import classNames from 'classnames';
35
+ import { useState } from 'react';
35
36
  import { XMarkIconOutline } from '../../icons/generated/heroIcons/XMarkIconOutline';
36
37
  /**
37
38
  * The component is used to display a file in a chat, or in a prompt.
@@ -44,9 +45,14 @@ const FileTag = (_a) => {
44
45
  const Component = isRemovable !== true ? 'button' : 'div';
45
46
  const classes = classNames('ndl-ai-file-tag', className);
46
47
  const file = `${fileName}.${fileType}`;
48
+ const [isRemoveActive, setIsRemoveActive] = useState(false);
47
49
  return (_jsxs(Tooltip, { type: "simple", placement: "bottom", hoverDelay: { close: 0, open: 500 }, children: [_jsx(Tooltip.Trigger, { hasButtonWrapper: true, children: _jsxs(Component, Object.assign({ ref: ref, className: classes, style: style }, (isRemovable ? {} : { onClick }), restProps, htmlAttributes, { children: [_jsx("div", { className: "ndl-ai-file-tag-leading", children: isLoading ? _jsx(LoadingSpinner, { size: "medium" }) : icon }), _jsxs("div", { className: "ndl-ai-file-tag-content", children: [_jsx("span", { className: "ndl-ai-file-tag-content-title", children: fileName }), _jsx("span", { className: "ndl-ai-file-tag-content-type", children: fileType === null || fileType === void 0 ? void 0 : fileType.toUpperCase() })] }), isRemovable && (_jsx(CleanIconButton, { onClick: onClick, description: null, htmlAttributes: {
48
50
  'aria-label': `Remove ${file}`,
49
- }, size: "small", className: "ndl-ai-file-tag-remove", children: _jsx(XMarkIconOutline, {}) }))] })) }), _jsx(Tooltip.Content, { children: file })] }));
51
+ onBlur: () => setIsRemoveActive(false),
52
+ onFocus: () => setIsRemoveActive(true),
53
+ onMouseEnter: () => setIsRemoveActive(true),
54
+ onMouseLeave: () => setIsRemoveActive(false),
55
+ }, size: "small", className: "ndl-ai-file-tag-remove", children: _jsx(XMarkIconOutline, {}) }))] })) }), _jsx(Tooltip.Content, { children: isRemoveActive ? `Remove ${file}` : file })] }));
50
56
  };
51
57
  export { FileTag };
52
58
  //# sourceMappingURL=FileTag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileTag.js","sourceRoot":"","sources":["../../../../src/ai/file-tag/FileTag.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAiBpF;;;;;GAKG;AACH,MAAM,OAAO,GAAG,CAAC,EAY8B,EAAE,EAAE;QAZlC,EACf,OAAO,EACP,WAAW,GAAG,KAAK,EACnB,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,KAAK,EACL,cAAc,EACd,GAAG,EACH,SAAS,GAAG,KAAK,OAE4B,EAD1C,SAAS,cAXG,sHAYhB,CADa;IAEZ,MAAM,SAAS,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;IAEvC,OAAO,CACL,MAAC,OAAO,IACN,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,QAAQ,EAClB,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAEnC,KAAC,OAAO,CAAC,OAAO,IAAC,gBAAgB,kBAC/B,MAAC,SAAS,kBACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,KAAK,IACR,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAEhC,SAAS,EACT,cAAc,eAElB,cAAK,SAAS,EAAC,yBAAyB,YACrC,SAAS,CAAC,CAAC,CAAC,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,GAChD,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,+BAA+B,YAAE,QAAQ,GAAQ,EACjE,eAAM,SAAS,EAAC,8BAA8B,YAC3C,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,EAAE,GACnB,IACH,EACL,WAAW,IAAI,CACd,KAAC,eAAe,IACd,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,IAAI,EACjB,cAAc,EAAE;gCACd,YAAY,EAAE,UAAU,IAAI,EAAE;6BAC/B,EACD,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,wBAAwB,YAElC,KAAC,gBAAgB,KAAG,GACJ,CACnB,KACS,GACI,EAClB,KAAC,OAAO,CAAC,OAAO,cAAE,IAAI,GAAmB,IACjC,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { CleanIconButton, LoadingSpinner, Tooltip } from '@neo4j-ndl/react';\nimport classNames from 'classnames';\n\nimport { type CommonProps } from '../../_common/types';\nimport { XMarkIconOutline } from '../../icons/generated/heroIcons/XMarkIconOutline';\n\ntype FileTagProps = {\n /** The icon that represents the file type */\n icon: React.ReactNode;\n /** The name of the file */\n fileName: string;\n /** The type of the file, e.g. 'pdf', 'docx', 'txt', etc. */\n fileType: string;\n /** Callback function triggered either when the file tag is clicked, or when the remove button is clicked (if isRemovable is true) */\n onClick?: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Whether the file tag is removable */\n isRemovable?: boolean;\n /** Whether the file tag is loading */\n isLoading?: boolean;\n};\n\n/**\n * The component is used to display a file in a chat, or in a prompt.\n * It can be removable and it can be loading.\n *\n * @alpha - Changes to this component may be breaking.\n */\nconst FileTag = ({\n onClick,\n isRemovable = false,\n fileName,\n fileType,\n icon,\n className,\n style,\n htmlAttributes,\n ref,\n isLoading = false,\n ...restProps\n}: CommonProps<React.ElementType, FileTagProps>) => {\n const Component = isRemovable !== true ? 'button' : 'div';\n const classes = classNames('ndl-ai-file-tag', className);\n\n const file = `${fileName}.${fileType}`;\n\n return (\n <Tooltip\n type=\"simple\"\n placement=\"bottom\"\n hoverDelay={{ close: 0, open: 500 }}\n >\n <Tooltip.Trigger hasButtonWrapper>\n <Component\n ref={ref}\n className={classes}\n style={style}\n {...(isRemovable ? {} : { onClick })}\n // what is read by screen readers here?\n {...restProps}\n {...htmlAttributes}\n >\n <div className=\"ndl-ai-file-tag-leading\">\n {isLoading ? <LoadingSpinner size=\"medium\" /> : icon}\n </div>\n <div className=\"ndl-ai-file-tag-content\">\n <span className=\"ndl-ai-file-tag-content-title\">{fileName}</span>\n <span className=\"ndl-ai-file-tag-content-type\">\n {fileType?.toUpperCase()}\n </span>\n </div>\n {isRemovable && (\n <CleanIconButton\n onClick={onClick}\n description={null}\n htmlAttributes={{\n 'aria-label': `Remove ${file}`,\n }}\n size=\"small\"\n className=\"ndl-ai-file-tag-remove\"\n >\n <XMarkIconOutline />\n </CleanIconButton>\n )}\n </Component>\n </Tooltip.Trigger>\n <Tooltip.Content>{file}</Tooltip.Content>\n </Tooltip>\n );\n};\n\nexport { FileTag };\n"]}
1
+ {"version":3,"file":"FileTag.js","sourceRoot":"","sources":["../../../../src/ai/file-tag/FileTag.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAiBpF;;;;;GAKG;AACH,MAAM,OAAO,GAAG,CAAC,EAY8B,EAAE,EAAE;QAZlC,EACf,OAAO,EACP,WAAW,GAAG,KAAK,EACnB,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,KAAK,EACL,cAAc,EACd,GAAG,EACH,SAAS,GAAG,KAAK,OAE4B,EAD1C,SAAS,cAXG,sHAYhB,CADa;IAEZ,MAAM,SAAS,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;IACvC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,OAAO,CACL,MAAC,OAAO,IACN,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,QAAQ,EAClB,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAEnC,KAAC,OAAO,CAAC,OAAO,IAAC,gBAAgB,kBAC/B,MAAC,SAAS,kBACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,KAAK,IACR,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAEhC,SAAS,EACT,cAAc,eAElB,cAAK,SAAS,EAAC,yBAAyB,YACrC,SAAS,CAAC,CAAC,CAAC,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,GAChD,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,+BAA+B,YAAE,QAAQ,GAAQ,EACjE,eAAM,SAAS,EAAC,8BAA8B,YAC3C,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,EAAE,GACnB,IACH,EACL,WAAW,IAAI,CACd,KAAC,eAAe,IACd,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,IAAI,EACjB,cAAc,EAAE;gCACd,YAAY,EAAE,UAAU,IAAI,EAAE;gCAC9B,MAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;gCACtC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;gCACtC,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;gCAC3C,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;6BAC7C,EACD,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,wBAAwB,YAElC,KAAC,gBAAgB,KAAG,GACJ,CACnB,KACS,GACI,EAClB,KAAC,OAAO,CAAC,OAAO,cACb,cAAc,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GACzB,IACV,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { CleanIconButton, LoadingSpinner, Tooltip } from '@neo4j-ndl/react';\nimport classNames from 'classnames';\nimport { useState } from 'react';\n\nimport { type CommonProps } from '../../_common/types';\nimport { XMarkIconOutline } from '../../icons/generated/heroIcons/XMarkIconOutline';\n\ntype FileTagProps = {\n /** The icon that represents the file type */\n icon: React.ReactNode;\n /** The name of the file */\n fileName: string;\n /** The type of the file, e.g. 'pdf', 'docx', 'txt', etc. */\n fileType: string;\n /** Callback function triggered either when the file tag is clicked, or when the remove button is clicked (if isRemovable is true) */\n onClick?: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Whether the file tag is removable */\n isRemovable?: boolean;\n /** Whether the file tag is loading */\n isLoading?: boolean;\n};\n\n/**\n * The component is used to display a file in a chat, or in a prompt.\n * It can be removable and it can be loading.\n *\n * @alpha - Changes to this component may be breaking.\n */\nconst FileTag = ({\n onClick,\n isRemovable = false,\n fileName,\n fileType,\n icon,\n className,\n style,\n htmlAttributes,\n ref,\n isLoading = false,\n ...restProps\n}: CommonProps<React.ElementType, FileTagProps>) => {\n const Component = isRemovable !== true ? 'button' : 'div';\n const classes = classNames('ndl-ai-file-tag', className);\n\n const file = `${fileName}.${fileType}`;\n const [isRemoveActive, setIsRemoveActive] = useState(false);\n\n return (\n <Tooltip\n type=\"simple\"\n placement=\"bottom\"\n hoverDelay={{ close: 0, open: 500 }}\n >\n <Tooltip.Trigger hasButtonWrapper>\n <Component\n ref={ref}\n className={classes}\n style={style}\n {...(isRemovable ? {} : { onClick })}\n // what is read by screen readers here?\n {...restProps}\n {...htmlAttributes}\n >\n <div className=\"ndl-ai-file-tag-leading\">\n {isLoading ? <LoadingSpinner size=\"medium\" /> : icon}\n </div>\n <div className=\"ndl-ai-file-tag-content\">\n <span className=\"ndl-ai-file-tag-content-title\">{fileName}</span>\n <span className=\"ndl-ai-file-tag-content-type\">\n {fileType?.toUpperCase()}\n </span>\n </div>\n {isRemovable && (\n <CleanIconButton\n onClick={onClick}\n description={null}\n htmlAttributes={{\n 'aria-label': `Remove ${file}`,\n onBlur: () => setIsRemoveActive(false),\n onFocus: () => setIsRemoveActive(true),\n onMouseEnter: () => setIsRemoveActive(true),\n onMouseLeave: () => setIsRemoveActive(false),\n }}\n size=\"small\"\n className=\"ndl-ai-file-tag-remove\"\n >\n <XMarkIconOutline />\n </CleanIconButton>\n )}\n </Component>\n </Tooltip.Trigger>\n <Tooltip.Content>\n {isRemoveActive ? `Remove ${file}` : file}\n </Tooltip.Content>\n </Tooltip>\n );\n};\n\nexport { FileTag };\n"]}
@@ -32,6 +32,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
32
32
  */
33
33
  import { CleanIconButton, LoadingSpinner, Tooltip } from '@neo4j-ndl/react';
34
34
  import classNames from 'classnames';
35
+ import { useState } from 'react';
35
36
  import { XMarkIconOutline } from '../../icons/generated/heroIcons/XMarkIconOutline';
36
37
  /**
37
38
  * The component is used to display an image in a chat, or in a prompt.
@@ -44,9 +45,14 @@ const ImageTag = (_a) => {
44
45
  const Component = isRemovable !== true ? 'button' : 'div';
45
46
  const classes = classNames('ndl-ai-image-tag', className);
46
47
  const image = `${fileName}.${fileType}`;
48
+ const [isRemoveActive, setIsRemoveActive] = useState(false);
47
49
  return (_jsxs(Tooltip, { type: "simple", placement: "bottom", hoverDelay: { close: 0, open: 500 }, children: [_jsx(Tooltip.Trigger, { hasButtonWrapper: true, children: _jsxs(Component, Object.assign({ ref: ref, className: classes, style: style }, (isRemovable ? {} : { onClick }), restProps, htmlAttributes, { children: [_jsx("img", { src: src, alt: alt }), isRemovable && (_jsxs(_Fragment, { children: [_jsx("div", { className: "ndl-ai-image-tag-remove-wrapper" }), _jsx(CleanIconButton, { onClick: onClick, description: null, htmlAttributes: {
48
50
  'aria-label': `Remove ${image}`,
49
- }, size: "small", className: "ndl-ai-image-tag-remove", children: _jsx(XMarkIconOutline, {}) })] })), isLoading && (_jsx("div", { className: "ndl-ai-image-tag-loading-overlay", children: _jsx(LoadingSpinner, { size: "medium" }) }))] })) }), _jsx(Tooltip.Content, { children: image })] }));
51
+ onBlur: () => setIsRemoveActive(false),
52
+ onFocus: () => setIsRemoveActive(true),
53
+ onMouseEnter: () => setIsRemoveActive(true),
54
+ onMouseLeave: () => setIsRemoveActive(false),
55
+ }, size: "small", className: "ndl-ai-image-tag-remove", children: _jsx(XMarkIconOutline, {}) })] })), isLoading && (_jsx("div", { className: "ndl-ai-image-tag-loading-overlay", children: _jsx(LoadingSpinner, { size: "medium" }) }))] })) }), _jsx(Tooltip.Content, { children: isRemoveActive ? `Remove ${image}` : image })] }));
50
56
  };
51
57
  export { ImageTag };
52
58
  //# sourceMappingURL=ImageTag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageTag.js","sourceRoot":"","sources":["../../../../src/ai/image-tag/ImageTag.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAmBpF;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,CAAC,EAa8B,EAAE,EAAE;QAblC,EAChB,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,GAAG,EACH,OAAO,EACP,WAAW,GAAG,KAAK,EACnB,SAAS,GAAG,KAAK,EACjB,GAAG,EACH,SAAS,EACT,KAAK,EACL,cAAc,OAEgC,EAD3C,SAAS,cAZI,4HAajB,CADa;IAEZ,MAAM,SAAS,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;IAExC,OAAO,CACL,MAAC,OAAO,IACN,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,QAAQ,EAClB,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAEnC,KAAC,OAAO,CAAC,OAAO,IAAC,gBAAgB,kBAC/B,MAAC,SAAS,kBACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,KAAK,IACR,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAEhC,SAAS,EACT,cAAc,eAElB,cAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAI,EAC1B,WAAW,IAAI,CACd,8BACE,cAAK,SAAS,EAAC,iCAAiC,GAAG,EACnD,KAAC,eAAe,IACd,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,IAAI,EACjB,cAAc,EAAE;wCACd,YAAY,EAAE,UAAU,KAAK,EAAE;qCAChC,EACD,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,yBAAyB,YAEnC,KAAC,gBAAgB,KAAG,GACJ,IACjB,CACJ,EACA,SAAS,IAAI,CACZ,cAAK,SAAS,EAAC,kCAAkC,YAC/C,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,GAAG,GAC5B,CACP,KACS,GACI,EAClB,KAAC,OAAO,CAAC,OAAO,cAAE,KAAK,GAAmB,IAClC,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { CleanIconButton, LoadingSpinner, Tooltip } from '@neo4j-ndl/react';\nimport classNames from 'classnames';\n\nimport { type CommonProps } from '../../_common/types';\nimport { XMarkIconOutline } from '../../icons/generated/heroIcons/XMarkIconOutline';\n\ntype ImageTagProps = {\n /** The source of the image */\n src: string;\n /** The alt text of the image */\n alt: string;\n /** The name of the image */\n fileName: string;\n /** The type of the image, e.g. 'jpg', 'png', 'gif', etc. */\n fileType: string;\n /** Callback function triggered either when the image tag is clicked, or when the remove button is clicked (if isRemovable is true) */\n onClick?: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Whether the image tag is removable */\n isRemovable?: boolean;\n /** Whether the image tag is loading */\n isLoading?: boolean;\n};\n\n/**\n * The component is used to display an image in a chat, or in a prompt.\n * It can be removable and it can be loading.\n *\n * @alpha - Changes to this component may be breaking.\n */\nconst ImageTag = ({\n src,\n fileName,\n fileType,\n alt,\n onClick,\n isRemovable = false,\n isLoading = false,\n ref,\n className,\n style,\n htmlAttributes,\n ...restProps\n}: CommonProps<React.ElementType, ImageTagProps>) => {\n const Component = isRemovable !== true ? 'button' : 'div';\n const classes = classNames('ndl-ai-image-tag', className);\n\n const image = `${fileName}.${fileType}`;\n\n return (\n <Tooltip\n type=\"simple\"\n placement=\"bottom\"\n hoverDelay={{ close: 0, open: 500 }}\n >\n <Tooltip.Trigger hasButtonWrapper>\n <Component\n ref={ref}\n className={classes}\n style={style}\n {...(isRemovable ? {} : { onClick })}\n // what is read by screen readers here?\n {...restProps}\n {...htmlAttributes}\n >\n <img src={src} alt={alt} />\n {isRemovable && (\n <>\n <div className=\"ndl-ai-image-tag-remove-wrapper\" />\n <CleanIconButton\n onClick={onClick}\n description={null}\n htmlAttributes={{\n 'aria-label': `Remove ${image}`,\n }}\n size=\"small\"\n className=\"ndl-ai-image-tag-remove\"\n >\n <XMarkIconOutline />\n </CleanIconButton>\n </>\n )}\n {isLoading && (\n <div className=\"ndl-ai-image-tag-loading-overlay\">\n <LoadingSpinner size=\"medium\" />\n </div>\n )}\n </Component>\n </Tooltip.Trigger>\n <Tooltip.Content>{image}</Tooltip.Content>\n </Tooltip>\n );\n};\n\nexport { ImageTag };\n"]}
1
+ {"version":3,"file":"ImageTag.js","sourceRoot":"","sources":["../../../../src/ai/image-tag/ImageTag.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAmBpF;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,CAAC,EAa8B,EAAE,EAAE;QAblC,EAChB,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,GAAG,EACH,OAAO,EACP,WAAW,GAAG,KAAK,EACnB,SAAS,GAAG,KAAK,EACjB,GAAG,EACH,SAAS,EACT,KAAK,EACL,cAAc,OAEgC,EAD3C,SAAS,cAZI,4HAajB,CADa;IAEZ,MAAM,SAAS,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;IACxC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,OAAO,CACL,MAAC,OAAO,IACN,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,QAAQ,EAClB,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAEnC,KAAC,OAAO,CAAC,OAAO,IAAC,gBAAgB,kBAC/B,MAAC,SAAS,kBACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,KAAK,IACR,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAEhC,SAAS,EACT,cAAc,eAElB,cAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAI,EAC1B,WAAW,IAAI,CACd,8BACE,cAAK,SAAS,EAAC,iCAAiC,GAAG,EACnD,KAAC,eAAe,IACd,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,IAAI,EACjB,cAAc,EAAE;wCACd,YAAY,EAAE,UAAU,KAAK,EAAE;wCAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;wCACtC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;wCACtC,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;wCAC3C,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;qCAC7C,EACD,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,yBAAyB,YAEnC,KAAC,gBAAgB,KAAG,GACJ,IACjB,CACJ,EACA,SAAS,IAAI,CACZ,cAAK,SAAS,EAAC,kCAAkC,YAC/C,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,GAAG,GAC5B,CACP,KACS,GACI,EAClB,KAAC,OAAO,CAAC,OAAO,cACb,cAAc,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,GAC3B,IACV,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { CleanIconButton, LoadingSpinner, Tooltip } from '@neo4j-ndl/react';\nimport classNames from 'classnames';\nimport { useState } from 'react';\n\nimport { type CommonProps } from '../../_common/types';\nimport { XMarkIconOutline } from '../../icons/generated/heroIcons/XMarkIconOutline';\n\ntype ImageTagProps = {\n /** The source of the image */\n src: string;\n /** The alt text of the image */\n alt: string;\n /** The name of the image */\n fileName: string;\n /** The type of the image, e.g. 'jpg', 'png', 'gif', etc. */\n fileType: string;\n /** Callback function triggered either when the image tag is clicked, or when the remove button is clicked (if isRemovable is true) */\n onClick?: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Whether the image tag is removable */\n isRemovable?: boolean;\n /** Whether the image tag is loading */\n isLoading?: boolean;\n};\n\n/**\n * The component is used to display an image in a chat, or in a prompt.\n * It can be removable and it can be loading.\n *\n * @alpha - Changes to this component may be breaking.\n */\nconst ImageTag = ({\n src,\n fileName,\n fileType,\n alt,\n onClick,\n isRemovable = false,\n isLoading = false,\n ref,\n className,\n style,\n htmlAttributes,\n ...restProps\n}: CommonProps<React.ElementType, ImageTagProps>) => {\n const Component = isRemovable !== true ? 'button' : 'div';\n const classes = classNames('ndl-ai-image-tag', className);\n\n const image = `${fileName}.${fileType}`;\n const [isRemoveActive, setIsRemoveActive] = useState(false);\n\n return (\n <Tooltip\n type=\"simple\"\n placement=\"bottom\"\n hoverDelay={{ close: 0, open: 500 }}\n >\n <Tooltip.Trigger hasButtonWrapper>\n <Component\n ref={ref}\n className={classes}\n style={style}\n {...(isRemovable ? {} : { onClick })}\n // what is read by screen readers here?\n {...restProps}\n {...htmlAttributes}\n >\n <img src={src} alt={alt} />\n {isRemovable && (\n <>\n <div className=\"ndl-ai-image-tag-remove-wrapper\" />\n <CleanIconButton\n onClick={onClick}\n description={null}\n htmlAttributes={{\n 'aria-label': `Remove ${image}`,\n onBlur: () => setIsRemoveActive(false),\n onFocus: () => setIsRemoveActive(true),\n onMouseEnter: () => setIsRemoveActive(true),\n onMouseLeave: () => setIsRemoveActive(false),\n }}\n size=\"small\"\n className=\"ndl-ai-image-tag-remove\"\n >\n <XMarkIconOutline />\n </CleanIconButton>\n </>\n )}\n {isLoading && (\n <div className=\"ndl-ai-image-tag-loading-overlay\">\n <LoadingSpinner size=\"medium\" />\n </div>\n )}\n </Component>\n </Tooltip.Trigger>\n <Tooltip.Content>\n {isRemoveActive ? `Remove ${image}` : image}\n </Tooltip.Content>\n </Tooltip>\n );\n};\n\nexport { ImageTag };\n"]}
@@ -37,6 +37,13 @@ import ArrowSendIcon from '../../icons/generated/custom/ArrowSend';
37
37
  import { ArrowSmallUpIconOutline } from '../../icons/generated/heroIcons/ArrowSmallUpIconOutline';
38
38
  import { StopCircleIconOutline } from '../../icons/generated/heroIcons/StopCircleIconOutline';
39
39
  import { XMarkIconOutline } from '../../icons/generated/heroIcons/XMarkIconOutline';
40
+ import { focusTextareaFromPromptWrapper } from './focusTextareaFromPromptWrapper';
41
+ const hasPromptContent = (inputValue) => {
42
+ if (typeof inputValue !== 'string') {
43
+ return false;
44
+ }
45
+ return inputValue.trim().length > 0;
46
+ };
40
47
  /**
41
48
  * The component is used to display the prompt input for an LLM.
42
49
  * It includes a textarea for the user to enter their prompt and a submit button.
@@ -45,6 +52,7 @@ import { XMarkIconOutline } from '../../icons/generated/heroIcons/XMarkIconOutli
45
52
  * @alpha - Changes to this component may be breaking.
46
53
  */
47
54
  const PromptComponent = (_a) => {
55
+ var _b;
48
56
  var { value, onChange, maxRows = 5, isDisabled = false, isRunningPrompt = false, onSubmitPrompt, onCancelPrompt, isSubmitDisabled = false, headerContent, topContent, bottomContent, bottomTrailingContent, disclaimer = 'All information should be verified.', className, style, htmlAttributes, ref, textareaProps } = _a, restProps = __rest(_a, ["value", "onChange", "maxRows", "isDisabled", "isRunningPrompt", "onSubmitPrompt", "onCancelPrompt", "isSubmitDisabled", "headerContent", "topContent", "bottomContent", "bottomTrailingContent", "disclaimer", "className", "style", "htmlAttributes", "ref", "textareaProps"]);
49
57
  const classes = classNames('ndl-ai-prompt', className, {
50
58
  'ndl-disabled': isDisabled,
@@ -60,6 +68,11 @@ const PromptComponent = (_a) => {
60
68
  const element = textareaAboveRef.current;
61
69
  const maxHeight = parseFloat(getComputedStyle(element).maxHeight.replace('px', ''));
62
70
  const scrollHeight = element.scrollHeight;
71
+ // Computed max-height can be non-numeric (e.g. "none"), so bail safely.
72
+ if (!Number.isFinite(maxHeight)) {
73
+ element.classList.remove('ndl-can-scroll');
74
+ return;
75
+ }
63
76
  if (scrollHeight > maxHeight) {
64
77
  element.classList.add('ndl-can-scroll');
65
78
  }
@@ -97,7 +110,17 @@ const PromptComponent = (_a) => {
97
110
  useEffect(() => {
98
111
  if (textareaRef.current !== null) {
99
112
  const computed = window.getComputedStyle(textareaRef.current);
100
- setLineHeight(parseInt(computed.lineHeight));
113
+ const parsedLineHeight = Number.parseFloat(computed.lineHeight);
114
+ if (Number.isFinite(parsedLineHeight) && parsedLineHeight > 0) {
115
+ setLineHeight(parsedLineHeight);
116
+ }
117
+ else {
118
+ // Fallback for cases where line-height is reported as "normal".
119
+ const parsedFontSize = Number.parseFloat(computed.fontSize);
120
+ setLineHeight(Number.isFinite(parsedFontSize) && parsedFontSize > 0
121
+ ? parsedFontSize * 1.2
122
+ : 16);
123
+ }
101
124
  }
102
125
  }, []);
103
126
  const adjustTextareaHeight = useCallback(() => {
@@ -124,16 +147,24 @@ const PromptComponent = (_a) => {
124
147
  adjustTextareaHeight();
125
148
  onChange === null || onChange === void 0 ? void 0 : onChange(e);
126
149
  };
127
- return (_jsxs("div", Object.assign({ ref: ref, className: classes, style: style }, restProps, htmlAttributes, { children: [_jsxs("div", { className: "ndl-ai-prompt-wrapper", children: [Boolean(headerContent) && (_jsx("div", { className: "ndl-ai-prompt-header", children: headerContent })), _jsxs("div", { className: "ndl-ai-prompt-wrapper-inner", children: [Boolean(topContent) && (_jsx("div", { className: "ndl-ai-prompt-textarea-above", ref: textareaAboveRef, children: topContent })), _jsx("textarea", Object.assign({ placeholder: "Ask anything", className: "ndl-ai-prompt-textarea", rows: 1, onChange: handleInput, value: value, ref: textareaRef, disabled: isDisabled, onKeyDown: (e) => {
128
- if (e.key === 'Enter' &&
129
- !e.shiftKey &&
130
- isSubmitDisabled !== true) {
150
+ const handleSubmitClick = (e) => {
151
+ var _a;
152
+ if (hasPromptContent((_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.value)) {
153
+ onSubmitPrompt === null || onSubmitPrompt === void 0 ? void 0 : onSubmitPrompt(e);
154
+ }
155
+ };
156
+ return (_jsxs("div", Object.assign({ ref: ref, className: classes, style: style }, restProps, htmlAttributes, { children: [_jsxs("div", { className: "ndl-ai-prompt-wrapper", children: [Boolean(headerContent) && (_jsx("div", { className: "ndl-ai-prompt-header", children: headerContent })), _jsxs("div", { className: "ndl-ai-prompt-wrapper-inner", onMouseDownCapture: focusTextareaFromPromptWrapper, children: [Boolean(topContent) && (_jsx("div", { className: "ndl-ai-prompt-textarea-above", ref: textareaAboveRef, children: topContent })), _jsx("textarea", Object.assign({ placeholder: "Ask anything", className: "ndl-ai-prompt-textarea", rows: 1, onChange: handleInput, value: value, ref: textareaRef, disabled: isDisabled, "aria-label": (_b = textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps['aria-label']) !== null && _b !== void 0 ? _b : 'Prompt input', onKeyDown: (e) => {
157
+ const nativeEvent = e.nativeEvent;
158
+ const isComposing = nativeEvent.isComposing === true;
159
+ if (e.key === 'Enter' && !isComposing && !e.shiftKey) {
131
160
  e.preventDefault();
132
- if (isRunningPrompt !== true) {
161
+ if (hasPromptContent(e.currentTarget.value) &&
162
+ isSubmitDisabled !== true &&
163
+ isRunningPrompt !== true) {
133
164
  onSubmitPrompt === null || onSubmitPrompt === void 0 ? void 0 : onSubmitPrompt(e);
134
165
  }
135
166
  }
136
- } }, textareaProps)), _jsxs("div", { className: "ndl-ai-prompt-textarea-below", children: [Boolean(bottomContent) && (_jsx("div", { className: "ndl-ai-prompt-textarea-below-leading", children: bottomContent })), _jsxs("div", { className: "ndl-ai-prompt-textarea-below-trailing", children: [bottomTrailingContent, _jsx(SubmitPromptButton, { isDisabled: isSubmitDisabled, isRunningPrompt: isRunningPrompt, onSubmit: onSubmitPrompt, onCancel: onCancelPrompt })] })] })] })] }), Boolean(disclaimer) && (_jsx(Typography, { variant: "body-small", className: "ndl-ai-prompt-footer", children: disclaimer }))] })));
167
+ } }, textareaProps)), _jsxs("div", { className: "ndl-ai-prompt-textarea-below", children: [Boolean(bottomContent) && (_jsx("div", { className: "ndl-ai-prompt-textarea-below-leading", children: bottomContent })), _jsxs("div", { className: "ndl-ai-prompt-textarea-below-trailing", children: [bottomTrailingContent, _jsx(SubmitPromptButton, { isDisabled: isSubmitDisabled, isRunningPrompt: isRunningPrompt, onSubmit: handleSubmitClick, onCancel: onCancelPrompt })] })] })] })] }), Boolean(disclaimer) && (_jsx(Typography, { variant: "body-small", className: "ndl-ai-prompt-footer", children: disclaimer }))] })));
137
168
  };
138
169
  const SubmitPromptButton = ({ onSubmit, onCancel, isDisabled, isRunningPrompt, }) => {
139
170
  return (_jsx(CleanIconButton, { className: "ndl-ai-prompt-submit-button", description: isRunningPrompt === true ? 'Stop' : 'Send', size: "small", isDisabled: isDisabled, onClick: isRunningPrompt === true ? onCancel : onSubmit, children: isRunningPrompt === true ? (_jsx(StopCircleIconOutline, {})) : (_jsx(ArrowSmallUpIconOutline, {})) }));
@@ -152,9 +183,10 @@ const AgentSelect = ({ value, options = [], onChange }) => {
152
183
  const ContextTag = ({ children, onClose }) => {
153
184
  const textRef = useRef(null);
154
185
  const [isTooltipOpen, setIsTooltipOpen] = useState(false);
155
- return (_jsxs(Tooltip, { type: "simple", isOpen: isTooltipOpen, onOpenChange: (isOpen) => {
186
+ const [isRemoveActive, setIsRemoveActive] = useState(false);
187
+ return (_jsxs(Tooltip, { type: "simple", isOpen: isTooltipOpen || isRemoveActive, onOpenChange: (isOpen) => {
156
188
  var _a, _b;
157
- if (isOpen) {
189
+ if (isOpen && !isRemoveActive) {
158
190
  const isTruncated = ((_a = textRef.current) === null || _a === void 0 ? void 0 : _a.scrollWidth) &&
159
191
  ((_b = textRef.current) === null || _b === void 0 ? void 0 : _b.clientWidth) &&
160
192
  textRef.current.scrollWidth > textRef.current.clientWidth;
@@ -162,10 +194,10 @@ const ContextTag = ({ children, onClose }) => {
162
194
  setIsTooltipOpen(true);
163
195
  }
164
196
  }
165
- else {
197
+ else if (!isRemoveActive) {
166
198
  setIsTooltipOpen(false);
167
199
  }
168
- }, hoverDelay: { close: 0, open: 500 }, children: [_jsx(Tooltip.Trigger, { hasButtonWrapper: true, children: _jsxs("div", { className: "ndl-ai-prompt-context-tag", children: [_jsx(ArrowSendIcon, { className: "ndl-ai-prompt-context-tag-icon" }), _jsx(Typography, { variant: "body-medium", className: "ndl-ai-prompt-context-tag-text", ref: textRef, children: children }), _jsx("button", { type: "button", onClick: onClose, "aria-label": `Remove context: ${children}`, className: "ndl-ai-prompt-context-tag-close-button", children: _jsx(XMarkIconOutline, { className: "ndl-ai-prompt-context-tag-icon" }) })] }) }), _jsx(Tooltip.Content, { children: children })] }));
200
+ }, hoverDelay: { close: 0, open: 500 }, children: [_jsx(Tooltip.Trigger, { hasButtonWrapper: true, children: _jsxs("div", { className: "ndl-ai-prompt-context-tag", children: [_jsx(ArrowSendIcon, { className: "ndl-ai-prompt-context-tag-icon" }), _jsx(Typography, { variant: "body-medium", className: "ndl-ai-prompt-context-tag-text", ref: textRef, children: children }), _jsx("button", { type: "button", onClick: onClose, "aria-label": `Remove ${children}`, onMouseEnter: () => setIsRemoveActive(true), onMouseLeave: () => setIsRemoveActive(false), onFocus: () => setIsRemoveActive(true), onBlur: () => setIsRemoveActive(false), className: "ndl-ai-prompt-context-tag-close-button", children: _jsx(XMarkIconOutline, { className: "ndl-ai-prompt-context-tag-icon" }) })] }) }), _jsx(Tooltip.Content, { children: isRemoveActive ? `Remove ${children}` : children })] }));
169
201
  };
170
202
  const Prompt = Object.assign(PromptComponent, {
171
203
  ContextTag: ContextTag,