@tipp/ui 1.2.1 → 1.2.3

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 (78) hide show
  1. package/dist/atoms/field-error-wrapper.js +2 -2
  2. package/dist/atoms/index.js +52 -52
  3. package/dist/atoms/pagination.js +2 -2
  4. package/dist/chunk-5727WFTZ.js +340 -0
  5. package/dist/chunk-5727WFTZ.js.map +1 -0
  6. package/dist/chunk-6UGS5IDT.js +313 -0
  7. package/dist/chunk-6UGS5IDT.js.map +1 -0
  8. package/dist/chunk-AT43BHDX.js +340 -0
  9. package/dist/chunk-AT43BHDX.js.map +1 -0
  10. package/dist/chunk-B4OBVVY3.js +338 -0
  11. package/dist/chunk-B4OBVVY3.js.map +1 -0
  12. package/dist/chunk-BSXB4GUN.js +313 -0
  13. package/dist/chunk-BSXB4GUN.js.map +1 -0
  14. package/dist/chunk-BVA3AK5G.js +320 -0
  15. package/dist/chunk-BVA3AK5G.js.map +1 -0
  16. package/dist/chunk-DDCFN3P4.js +169 -0
  17. package/dist/chunk-DDCFN3P4.js.map +1 -0
  18. package/dist/chunk-E6PYYPLJ.js +340 -0
  19. package/dist/chunk-E6PYYPLJ.js.map +1 -0
  20. package/dist/chunk-EJGR7XIP.js +340 -0
  21. package/dist/chunk-EJGR7XIP.js.map +1 -0
  22. package/dist/chunk-FUFW4U2M.js +123 -0
  23. package/dist/chunk-FUFW4U2M.js.map +1 -0
  24. package/dist/chunk-GN35VNXA.js +340 -0
  25. package/dist/chunk-GN35VNXA.js.map +1 -0
  26. package/dist/chunk-GQ356XUU.js +340 -0
  27. package/dist/chunk-GQ356XUU.js.map +1 -0
  28. package/dist/chunk-KDEE2GKD.js +321 -0
  29. package/dist/chunk-KDEE2GKD.js.map +1 -0
  30. package/dist/chunk-N7LPOMB6.js +169 -0
  31. package/dist/chunk-N7LPOMB6.js.map +1 -0
  32. package/dist/chunk-OGNXJEFF.js +340 -0
  33. package/dist/chunk-OGNXJEFF.js.map +1 -0
  34. package/dist/chunk-OMWKQSGG.js +301 -0
  35. package/dist/chunk-OMWKQSGG.js.map +1 -0
  36. package/dist/chunk-SGV677GX.js +313 -0
  37. package/dist/chunk-SGV677GX.js.map +1 -0
  38. package/dist/chunk-U6ZJC6YG.js +320 -0
  39. package/dist/chunk-U6ZJC6YG.js.map +1 -0
  40. package/dist/chunk-UXHC4TWB.js +169 -0
  41. package/dist/chunk-UXHC4TWB.js.map +1 -0
  42. package/dist/chunk-VA4SUB72.js +340 -0
  43. package/dist/chunk-VA4SUB72.js.map +1 -0
  44. package/dist/chunk-VLENFHWP.js +304 -0
  45. package/dist/chunk-VLENFHWP.js.map +1 -0
  46. package/dist/chunk-WL2KNN6Q.js +320 -0
  47. package/dist/chunk-WL2KNN6Q.js.map +1 -0
  48. package/dist/chunk-XFPHKGAU.js +340 -0
  49. package/dist/chunk-XFPHKGAU.js.map +1 -0
  50. package/dist/chunk-XLJ4PRKX.js +317 -0
  51. package/dist/chunk-XLJ4PRKX.js.map +1 -0
  52. package/dist/chunk-YDXUNJVV.js +320 -0
  53. package/dist/chunk-YDXUNJVV.js.map +1 -0
  54. package/dist/chunk-ZPTZUP5Q.js +304 -0
  55. package/dist/chunk-ZPTZUP5Q.js.map +1 -0
  56. package/dist/index.cjs +41 -5
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.css +8 -3
  59. package/dist/index.css.map +1 -1
  60. package/dist/index.js +68 -68
  61. package/dist/molecules/expand-table/index.js +23 -23
  62. package/dist/molecules/expand-table/row.js +22 -22
  63. package/dist/molecules/index.cjs +41 -5
  64. package/dist/molecules/index.cjs.map +1 -1
  65. package/dist/molecules/index.js +29 -29
  66. package/dist/molecules/navigation.js +23 -23
  67. package/dist/molecules/stepper.cjs.map +1 -1
  68. package/dist/molecules/stepper.d.cts +1 -1
  69. package/dist/molecules/stepper.d.ts +1 -1
  70. package/dist/molecules/stepper.js +3 -3
  71. package/dist/molecules/tag-selector.cjs +114 -53
  72. package/dist/molecules/tag-selector.cjs.map +1 -1
  73. package/dist/molecules/tag-selector.d.cts +1 -0
  74. package/dist/molecules/tag-selector.d.ts +1 -0
  75. package/dist/molecules/tag-selector.js +23 -23
  76. package/package.json +1 -1
  77. package/src/molecules/stepper.tsx +1 -1
  78. package/src/molecules/tag-selector.tsx +52 -5
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/tag-selector.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n ChevronRightIcon,\n Cross1Icon,\n MagnifyingGlassIcon,\n} from '@radix-ui/react-icons';\nimport { Popover } from '../atoms/popover';\nimport { Flex } from '../atoms/flex';\nimport { Button } from '../atoms/button';\nimport { Badge } from '../atoms/badge';\nimport { CheckIcon } from '../icon';\nimport { ScrollArea } from '../atoms/scroll-area';\nimport { Grid } from '../atoms/grid';\nimport { AutoSizingInput, Typo } from '../atoms';\n\ntype ID = string;\ninterface Item {\n name: string;\n id: ID;\n}\n\nconst OPTION_HEIGHT = 32;\n\nexport interface TagSelectorProps<T extends Item> {\n options?: T[];\n selected?: ID[];\n placeholder?: string;\n disabled?: boolean;\n maxCount?: number;\n style?: React.CSSProperties;\n\n onChange?: (selected: ID[]) => void;\n tagRender?: (item: T) => React.ReactElement;\n DropdownContainer?: DropdownContainer<T>;\n}\ntype DropdownContainer<T> = (props: {\n items: T[];\n children: React.ReactElement;\n currentItem?: T;\n}) => React.ReactElement;\n\nconst DefaultDropdownContainer = (props: {\n children: React.ReactElement;\n}): React.ReactElement => {\n return props.children;\n};\n\nexport function TagSelector<T extends Item>(\n props: TagSelectorProps<T>\n): React.ReactElement {\n const {\n options = [],\n tagRender,\n placeholder,\n maxCount = 0,\n DropdownContainer = DefaultDropdownContainer,\n } = props;\n const [selected, setSelected] = useState<string[]>(props.selected || []);\n const [value, setValue] = useState<string>('');\n const [focusIndex, setFocusIndex] = useState<number | null>(null);\n const [open, setOpen] = useState(false);\n const [focus, setFocus] = useState(false);\n\n const fieldRef = useRef<HTMLInputElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const closeRef = useRef<number>(0);\n\n const onFocus = useCallback(() => {\n clearTimeout(closeRef.current);\n setFocus(true);\n setOpen(true);\n }, []);\n\n const onBlur = useCallback(() => {\n closeRef.current = setTimeout(() => {\n setFocus(false);\n setOpen(false);\n setTimeout(() => {\n setValue('');\n }, 100);\n }, 100);\n }, []);\n\n const onChangeValue = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n setValue(e.target.value);\n },\n []\n );\n\n const filteredOptions = useMemo<T[]>(() => {\n return options.filter((option) => {\n return option.name.includes(value);\n });\n }, [options, value]);\n\n const selectedItem = useMemo<T[]>(() => {\n const result = [] as T[];\n selected.forEach((id) => {\n const maybeItem = options.find((option) => option.id === id);\n if (maybeItem) result.push(maybeItem);\n });\n return result;\n }, [options, selected]);\n\n const onDelete = useCallback((id: string) => {\n setSelected((prev) => prev.filter((el) => el !== id));\n }, []);\n\n const onSelect = useCallback(\n (id: string) => {\n if (maxCount && selected.length + 1 > maxCount) return;\n setSelected((prev) => [...prev, id]);\n },\n [maxCount, selected]\n );\n\n const toggleItem = useCallback(\n (id: string) => {\n if (selected.includes(id)) {\n onDelete(id);\n } else {\n onSelect(id);\n }\n },\n [onDelete, onSelect, selected]\n );\n\n const setScroll = useCallback((index: number): void => {\n if (scrollRef.current) {\n const scrollTop = scrollRef.current.scrollTop;\n const clientHeight = scrollRef.current.clientHeight;\n const focusTop = index * OPTION_HEIGHT;\n if (focusTop < scrollTop) {\n scrollRef.current.scrollTop = focusTop;\n } else if (focusTop + OPTION_HEIGHT > scrollTop + clientHeight) {\n scrollRef.current.scrollTop = focusTop + OPTION_HEIGHT - clientHeight;\n }\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const key = e.key;\n\n switch (key) {\n case 'ArrowDown': {\n e.preventDefault();\n let newFocus = 0;\n if (typeof focusIndex === 'number') {\n newFocus = focusIndex + 1 >= options.length ? 0 : focusIndex + 1;\n }\n setFocusIndex(newFocus);\n setScroll(newFocus);\n break;\n }\n\n case 'ArrowUp': {\n e.preventDefault();\n let newFocus = 0;\n if (typeof focusIndex === 'number') {\n newFocus = focusIndex - 1 < 0 ? options.length - 1 : focusIndex - 1;\n }\n setFocusIndex(newFocus);\n setScroll(newFocus);\n break;\n }\n\n case 'Enter':\n setValue('');\n if (focusIndex !== null) {\n toggleItem(filteredOptions[focusIndex]?.id);\n }\n break;\n\n case 'Backspace':\n if (value.length === 0) {\n setSelected((prev) => prev.slice(0, -1));\n }\n break;\n\n case 'Escape':\n setOpen(false);\n break;\n }\n },\n [\n focusIndex,\n value.length,\n setScroll,\n options.length,\n toggleItem,\n filteredOptions,\n ]\n );\n\n useEffect(() => {\n setFocusIndex(null);\n }, [open]);\n\n useEffect(() => {\n setFocusIndex(0);\n }, [filteredOptions]);\n\n return (\n <Popover.Root open={Boolean(filteredOptions.length) && open}>\n <Popover.Trigger>\n <Grid\n align=\"center\"\n className={`tag-selector ${focus ? 'focused' : ''}`}\n columns=\"1fr auto\"\n gap=\"1\"\n onClick={() => fieldRef.current?.focus()}\n >\n <Flex\n align=\"center\"\n gap=\"1\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n wrap=\"wrap\"\n >\n {selectedItem.map((item) => {\n return tagRender ? (\n tagRender(item)\n ) : (\n <Badge key={item.id}>\n {item.name}\n <Button\n onClick={() => {\n onDelete(item.id);\n }}\n variant=\"transparent\"\n >\n <Cross1Icon />\n </Button>\n </Badge>\n );\n })}\n {value.length < 1 && <Typo>{placeholder}</Typo>}\n <AutoSizingInput\n onBlur={onBlur}\n onChange={onChangeValue}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n ref={fieldRef}\n value={value}\n />\n </Flex>\n {focus ? <MagnifyingGlassIcon /> : <ChevronRightIcon />}\n </Grid>\n </Popover.Trigger>\n\n <Popover.Content\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <DropdownContainer\n currentItem={filteredOptions[focusIndex || 0]}\n items={filteredOptions}\n >\n <ScrollArea\n ref={scrollRef}\n scrollbars=\"vertical\"\n style={{ height: OPTION_HEIGHT * 8 }}\n type=\"auto\"\n >\n <Flex direction=\"column\">\n {filteredOptions.map((item, i) => {\n const isSelected = Boolean(\n selected.find((el) => el === item.id)\n );\n const isFocus = i === focusIndex;\n\n return (\n <Button\n key={item.id}\n onClick={() => {\n toggleItem(item.id);\n fieldRef.current?.focus();\n }}\n onMouseEnter={() => {\n setFocusIndex(i);\n }}\n style={{\n width: '100%',\n background: isFocus ? 'var(--accent-a3)' : undefined,\n color: 'var(--gray-12)',\n fontWeight: 400,\n boxShadow: 'none',\n }}\n variant={isSelected ? 'soft' : 'outline'}\n >\n <Flex justify=\"between\" width=\"100%\">\n {item.name}\n {isSelected ? <CheckIcon /> : null}\n </Flex>\n </Button>\n );\n })}\n </Flex>\n </ScrollArea>\n </DropdownContainer>\n </Popover.Content>\n </Popover.Root>\n );\n}\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -1581,7 +1581,9 @@ function TagSelector(props) {
1581
1581
  tagRender,
1582
1582
  placeholder,
1583
1583
  maxCount = 0,
1584
- DropdownContainer = DefaultDropdownContainer
1584
+ DropdownContainer = DefaultDropdownContainer,
1585
+ onChange,
1586
+ size = "medium"
1585
1587
  } = props;
1586
1588
  const [selected, setSelected] = (0, import_react24.useState)(props.selected || []);
1587
1589
  const [value, setValue] = (0, import_react24.useState)("");
@@ -1603,7 +1605,7 @@ function TagSelector(props) {
1603
1605
  setTimeout(() => {
1604
1606
  setValue("");
1605
1607
  }, 100);
1606
- }, 100);
1608
+ }, 300);
1607
1609
  }, []);
1608
1610
  const onChangeValue = (0, import_react24.useCallback)(
1609
1611
  (e) => {
@@ -1708,18 +1710,52 @@ function TagSelector(props) {
1708
1710
  filteredOptions
1709
1711
  ]
1710
1712
  );
1713
+ const placeholderVisible = (0, import_react24.useMemo)(() => {
1714
+ if (selectedItem.length)
1715
+ return false;
1716
+ if (value)
1717
+ return false;
1718
+ if (focus)
1719
+ return false;
1720
+ return true;
1721
+ }, [focus, selectedItem.length, value]);
1722
+ (0, import_react24.useEffect)(() => {
1723
+ onChange == null ? void 0 : onChange(selected);
1724
+ }, [[...selected].sort().join(",")]);
1725
+ (0, import_react24.useEffect)(() => {
1726
+ setSelected(props.selected || []);
1727
+ }, [[...props.selected || []].sort().join(",")]);
1711
1728
  (0, import_react24.useEffect)(() => {
1712
1729
  setFocusIndex(null);
1713
1730
  }, [open]);
1714
1731
  (0, import_react24.useEffect)(() => {
1715
1732
  setFocusIndex(0);
1716
1733
  }, [filteredOptions]);
1734
+ const badgeSize = (0, import_react24.useMemo)(() => {
1735
+ switch (size) {
1736
+ case "large":
1737
+ return "large";
1738
+ case "medium":
1739
+ case "small":
1740
+ default:
1741
+ return "small";
1742
+ }
1743
+ }, [size]);
1744
+ const placeholderVariant = (0, import_react24.useMemo)(() => {
1745
+ switch (size) {
1746
+ case "large":
1747
+ return "subtitle";
1748
+ case "medium":
1749
+ default:
1750
+ return "body";
1751
+ }
1752
+ }, [size]);
1717
1753
  return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_themes29.Popover.Root, { open: Boolean(filteredOptions.length) && open, children: [
1718
1754
  /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_themes29.Popover.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
1719
1755
  import_themes20.Grid,
1720
1756
  {
1721
1757
  align: "center",
1722
- className: `tag-selector ${focus ? "focused" : ""}`,
1758
+ className: `tag-selector ${focus ? "focused" : ""} ${size}`,
1723
1759
  columns: "1fr auto",
1724
1760
  gap: "1",
1725
1761
  onClick: () => {
@@ -1737,7 +1773,7 @@ function TagSelector(props) {
1737
1773
  wrap: "wrap",
1738
1774
  children: [
1739
1775
  selectedItem.map((item) => {
1740
- return tagRender ? tagRender(item) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(Badge, { children: [
1776
+ return tagRender ? tagRender(item) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(Badge, { size: badgeSize, children: [
1741
1777
  item.name,
1742
1778
  /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1743
1779
  Button,
@@ -1751,6 +1787,7 @@ function TagSelector(props) {
1751
1787
  )
1752
1788
  ] }, item.id);
1753
1789
  }),
1790
+ placeholderVisible ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Typo, { color: "gray", variant: placeholderVariant, children: placeholder }) : null,
1754
1791
  /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1755
1792
  AutoSizingInput,
1756
1793
  {
@@ -1758,7 +1795,6 @@ function TagSelector(props) {
1758
1795
  onChange: onChangeValue,
1759
1796
  onFocus,
1760
1797
  onKeyDown: handleKeyDown,
1761
- placeholder,
1762
1798
  ref: fieldRef,
1763
1799
  value
1764
1800
  }