@j2-health/design-system 0.5.2 → 0.5.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 (59) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +0 -12
  2. package/dist/index.cjs +4 -2
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +2 -2
  5. package/dist/index2.js +54 -0
  6. package/dist/src/AppConfigProvider.cjs +1 -0
  7. package/dist/src/AppConfigProvider.cjs.map +1 -1
  8. package/dist/src/components/alert/Alert.cjs +1 -0
  9. package/dist/src/components/alert/Alert.cjs.map +1 -1
  10. package/dist/src/components/checkboxTree/TreeNode.cjs +2 -0
  11. package/dist/src/components/checkboxTree/TreeNode.cjs.map +1 -1
  12. package/dist/src/components/collapse/Collapse.cjs +1 -0
  13. package/dist/src/components/collapse/Collapse.cjs.map +1 -1
  14. package/dist/src/components/drawer/Drawer.cjs +2 -0
  15. package/dist/src/components/drawer/Drawer.cjs.map +1 -1
  16. package/dist/src/components/dropdown/Dropdown.cjs +1 -0
  17. package/dist/src/components/dropdown/Dropdown.cjs.map +1 -1
  18. package/dist/src/components/filterform/FilterGroup.cjs +1 -0
  19. package/dist/src/components/filterform/FilterGroup.cjs.map +1 -1
  20. package/dist/src/components/filterform/FiltersForm.cjs +1 -0
  21. package/dist/src/components/filterform/FiltersForm.cjs.map +1 -1
  22. package/dist/src/components/inputnumber/InputNumber.cjs +1 -0
  23. package/dist/src/components/inputnumber/InputNumber.cjs.map +1 -1
  24. package/dist/src/components/listpopover/ListPopover.cjs +1 -0
  25. package/dist/src/components/listpopover/ListPopover.cjs.map +1 -1
  26. package/dist/src/components/manageColumns/ManageColumnsItem.cjs +1 -0
  27. package/dist/src/components/manageColumns/ManageColumnsItem.cjs.map +1 -1
  28. package/dist/src/components/message/useMessage.cjs +1 -0
  29. package/dist/src/components/message/useMessage.cjs.map +1 -1
  30. package/dist/src/components/modal/Modal.cjs +1 -0
  31. package/dist/src/components/modal/Modal.cjs.map +1 -1
  32. package/dist/src/components/notification/useNotification.cjs +1 -0
  33. package/dist/src/components/notification/useNotification.cjs.map +1 -1
  34. package/dist/src/components/notificationModal/NotificationModal.cjs +2 -0
  35. package/dist/src/components/notificationModal/NotificationModal.cjs.map +1 -1
  36. package/dist/src/components/pagination/Pagination.cjs +1 -0
  37. package/dist/src/components/pagination/Pagination.cjs.map +1 -1
  38. package/dist/src/components/rate/Rate.cjs +2 -0
  39. package/dist/src/components/rate/Rate.cjs.map +1 -1
  40. package/dist/src/components/select/AntdSelect.cjs +1 -0
  41. package/dist/src/components/select/AntdSelect.cjs.map +1 -1
  42. package/dist/src/components/select/Select.cjs +1 -0
  43. package/dist/src/components/select/Select.cjs.map +1 -1
  44. package/dist/src/components/select/SummarizedSelect.cjs +6 -5
  45. package/dist/src/components/select/SummarizedSelect.cjs.map +1 -1
  46. package/dist/src/components/select/SummarizedSelect.js +5 -5
  47. package/dist/src/components/select/SummarizedSelect.js.map +1 -1
  48. package/dist/src/components/steps/Steps.cjs +1 -0
  49. package/dist/src/components/steps/Steps.cjs.map +1 -1
  50. package/dist/src/components/table/Table.cjs +1 -0
  51. package/dist/src/components/table/Table.cjs.map +1 -1
  52. package/dist/src/components/tag/Tag.cjs +1 -0
  53. package/dist/src/components/tag/Tag.cjs.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/_virtual/_rolldown/runtime.js +0 -27
  56. package/dist/src/components/icons/index.cjs +0 -22
  57. package/dist/src/components/icons/index.cjs.map +0 -1
  58. package/dist/src/components/icons/index.js +0 -10
  59. package/dist/src/components/icons/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useNotification.cjs","names":["XCircleIcon","CheckCircleIcon","InfoIcon","WarningCircleIcon","notification","XIcon","cx","s"],"sources":["../../../../src/components/notification/useNotification.tsx"],"sourcesContent":["import { notification } from 'antd'\nimport type { NotificationArgsProps } from 'antd'\nimport s from './Notification.module.css'\nimport {\n CheckCircleIcon,\n InfoIcon,\n WarningCircleIcon,\n XIcon,\n XCircleIcon,\n} from '@phosphor-icons/react'\nimport cx from 'classnames'\nimport React from 'react'\n\ntype NotificationType = 'success' | 'info' | 'warning' | 'error'\n\nexport type OpenNotificationFunc = (\n type: Expand<NotificationType>,\n config: Expand<NotificationArgsProps>\n) => void\n\nconst getIcon = (type: NotificationType) => {\n switch (type) {\n case 'error':\n return (\n <XCircleIcon color=\"var(--j2-color-error)\" weight=\"duotone\" size={24} />\n )\n case 'success':\n return (\n <CheckCircleIcon\n color=\"var(--j2-color-success)\"\n weight=\"duotone\"\n size={24}\n />\n )\n case 'info':\n return (\n <InfoIcon color=\"var(--j2-color-info)\" weight=\"duotone\" size={24} />\n )\n case 'warning':\n return (\n <WarningCircleIcon\n color=\"var(--j2-color-warning)\"\n weight=\"duotone\"\n size={24}\n />\n )\n }\n}\n\nexport const useNotification = () => {\n const [api, contextHolder] = notification.useNotification()\n\n const openNotification: OpenNotificationFunc = (\n type: Expand<NotificationType>,\n config: Expand<NotificationArgsProps>\n ) => {\n const { message, title, btn, actions, ...restConfig } = config\n api[type]({\n icon: getIcon(type),\n ...restConfig,\n title: title ?? message,\n actions: actions ?? btn,\n closeIcon: (\n <XIcon color=\"var(--j2-color-icon)\" size={22} weight=\"regular\" />\n ),\n className: cx({\n [s.messageOnly]: (title ?? message) && !config.description,\n }),\n })\n }\n\n const closeNotification = (key?: React.Key) => {\n api.destroy(key)\n }\n\n return { openNotification, closeNotification, contextHolder }\n}\n"],"mappings":";;;;;;;;;;AAoBA,IAAM,WAAW,SAA2B;CAC1C,QAAQ,MAAR;EACE,KAAK,SACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAD;GAAa,OAAM;GAAwB,QAAO;GAAU,MAAM;EAAK,CAAA;EAE3E,KAAK,WACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,iBAAD;GACE,OAAM;GACN,QAAO;GACP,MAAM;EACP,CAAA;EAEL,KAAK,QACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,UAAD;GAAU,OAAM;GAAuB,QAAO;GAAU,MAAM;EAAK,CAAA;EAEvE,KAAK,WACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,mBAAD;GACE,OAAM;GACN,QAAO;GACP,MAAM;EACP,CAAA;CAEP;AACF;AAEA,IAAa,wBAAwB;CACnC,MAAM,CAAC,KAAK,iBAAiBC,KAAAA,aAAa,gBAAgB;CAE1D,MAAM,oBACJ,MACA,WACG;EACH,MAAM,EAAE,SAAS,OAAO,KAAK,SAAS,GAAG,eAAe;EACxD,IAAI,KAAK,CAAC;GACR,MAAM,QAAQ,IAAI;GAClB,GAAG;GACH,OAAO,SAAS;GAChB,SAAS,WAAW;GACpB,WACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,OAAD;IAAO,OAAM;IAAuB,MAAM;IAAI,QAAO;GAAW,CAAA;GAElE,YAAA,GAAWC,WAAAA,QAAAA,CAAG,GACXC,4BAAAA,QAAE,eAAe,SAAS,YAAY,CAAC,OAAO,YACjD,CAAC;EACH,CAAC;CACH;CAEA,MAAM,qBAAqB,QAAoB;EAC7C,IAAI,QAAQ,GAAG;CACjB;CAEA,OAAO;EAAE;EAAkB;EAAmB;CAAc;AAC9D"}
1
+ {"version":3,"file":"useNotification.cjs","names":["XCircleIcon","CheckCircleIcon","InfoIcon","WarningCircleIcon","notification","XIcon","cx","s"],"sources":["../../../../src/components/notification/useNotification.tsx"],"sourcesContent":["import { notification } from 'antd'\nimport type { NotificationArgsProps } from 'antd'\nimport s from './Notification.module.css'\nimport {\n CheckCircleIcon,\n InfoIcon,\n WarningCircleIcon,\n XIcon,\n XCircleIcon,\n} from '@phosphor-icons/react'\nimport cx from 'classnames'\nimport React from 'react'\n\ntype NotificationType = 'success' | 'info' | 'warning' | 'error'\n\nexport type OpenNotificationFunc = (\n type: Expand<NotificationType>,\n config: Expand<NotificationArgsProps>\n) => void\n\nconst getIcon = (type: NotificationType) => {\n switch (type) {\n case 'error':\n return (\n <XCircleIcon color=\"var(--j2-color-error)\" weight=\"duotone\" size={24} />\n )\n case 'success':\n return (\n <CheckCircleIcon\n color=\"var(--j2-color-success)\"\n weight=\"duotone\"\n size={24}\n />\n )\n case 'info':\n return (\n <InfoIcon color=\"var(--j2-color-info)\" weight=\"duotone\" size={24} />\n )\n case 'warning':\n return (\n <WarningCircleIcon\n color=\"var(--j2-color-warning)\"\n weight=\"duotone\"\n size={24}\n />\n )\n }\n}\n\nexport const useNotification = () => {\n const [api, contextHolder] = notification.useNotification()\n\n const openNotification: OpenNotificationFunc = (\n type: Expand<NotificationType>,\n config: Expand<NotificationArgsProps>\n ) => {\n const { message, title, btn, actions, ...restConfig } = config\n api[type]({\n icon: getIcon(type),\n ...restConfig,\n title: title ?? message,\n actions: actions ?? btn,\n closeIcon: (\n <XIcon color=\"var(--j2-color-icon)\" size={22} weight=\"regular\" />\n ),\n className: cx({\n [s.messageOnly]: (title ?? message) && !config.description,\n }),\n })\n }\n\n const closeNotification = (key?: React.Key) => {\n api.destroy(key)\n }\n\n return { openNotification, closeNotification, contextHolder }\n}\n"],"mappings":";;;;;;;;;;;AAoBA,IAAM,WAAW,SAA2B;CAC1C,QAAQ,MAAR;EACE,KAAK,SACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAD;GAAa,OAAM;GAAwB,QAAO;GAAU,MAAM;EAAK,CAAA;EAE3E,KAAK,WACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,iBAAD;GACE,OAAM;GACN,QAAO;GACP,MAAM;EACP,CAAA;EAEL,KAAK,QACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,UAAD;GAAU,OAAM;GAAuB,QAAO;GAAU,MAAM;EAAK,CAAA;EAEvE,KAAK,WACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,mBAAD;GACE,OAAM;GACN,QAAO;GACP,MAAM;EACP,CAAA;CAEP;AACF;AAEA,IAAa,wBAAwB;CACnC,MAAM,CAAC,KAAK,iBAAiBC,KAAAA,aAAa,gBAAgB;CAE1D,MAAM,oBACJ,MACA,WACG;EACH,MAAM,EAAE,SAAS,OAAO,KAAK,SAAS,GAAG,eAAe;EACxD,IAAI,KAAK,CAAC;GACR,MAAM,QAAQ,IAAI;GAClB,GAAG;GACH,OAAO,SAAS;GAChB,SAAS,WAAW;GACpB,WACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,OAAD;IAAO,OAAM;IAAuB,MAAM;IAAI,QAAO;GAAW,CAAA;GAElE,YAAA,GAAWC,WAAAA,QAAAA,CAAG,GACXC,4BAAAA,QAAE,eAAe,SAAS,YAAY,CAAC,OAAO,YACjD,CAAC;EACH,CAAC;CACH;CAEA,MAAM,qBAAqB,QAAoB;EAC7C,IAAI,QAAQ,GAAG;CACjB;CAEA,OAAO;EAAE;EAAkB;EAAmB;CAAc;AAC9D"}
@@ -1,7 +1,9 @@
1
+ const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
1
2
  const require_Modal = require("../modal/Modal.cjs");
2
3
  const require_NotifcationModal_module = require("./NotifcationModal.module.css.cjs");
3
4
  let react = require("react");
4
5
  let _phosphor_icons_react = require("@phosphor-icons/react");
6
+ _phosphor_icons_react = require_runtime.__toESM(_phosphor_icons_react, 1);
5
7
  let react_jsx_runtime = require("react/jsx-runtime");
6
8
  //#region src/components/notificationModal/NotificationModal.tsx
7
9
  var getNotificationIcon = (type) => {
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationModal.cjs","names":["XCircleIcon","CheckCircleIcon","InfoIcon","WarningCircleIcon","useMemo","styles","Modal"],"sources":["../../../../src/components/notificationModal/NotificationModal.tsx"],"sourcesContent":["import { ModalProps } from 'antd'\nimport {\n CheckCircleIcon,\n InfoIcon,\n WarningCircleIcon,\n XCircleIcon,\n} from '@phosphor-icons/react'\nimport { useMemo, ReactNode } from 'react'\nimport { Modal } from '../modal'\nimport styles from './NotifcationModal.module.css'\n\ntype NotificationType = 'success' | 'info' | 'warning' | 'error'\n\nexport type NotificationModalProps = {\n type: NotificationType\n withContentPadding?: boolean\n} & Omit<ModalProps, 'title'> & {\n title?: ReactNode\n }\n\nconst getNotificationIcon = (type: NotificationType) => {\n switch (type) {\n case 'error':\n return (\n <XCircleIcon color=\"var(--j2-color-error)\" weight=\"fill\" size={24} />\n )\n case 'success':\n return (\n <CheckCircleIcon\n color=\"var(--j2-color-success)\"\n weight=\"fill\"\n size={24}\n />\n )\n case 'info':\n return <InfoIcon color=\"var(--j2-color-info)\" weight=\"fill\" size={24} />\n case 'warning':\n return (\n <WarningCircleIcon\n color=\"var(--j2-color-warning)\"\n weight=\"fill\"\n size={24}\n />\n )\n }\n}\n\nconst NotificationModal = ({\n type,\n title,\n children,\n withContentPadding = true,\n ...props\n}: NotificationModalProps) => {\n const icon = useMemo(() => getNotificationIcon(type), [type])\n\n const titleWithIcon = (\n <div className={styles.modalTitleWithIcon}>\n <div className={styles.modalIcon}>{icon}</div>\n <div className={styles.modalTitleContent}>\n <div className={styles.modalTitleText}>{title}</div>\n </div>\n </div>\n )\n\n return (\n <Modal\n title={titleWithIcon}\n withContentPadding={withContentPadding}\n {...props}\n >\n <div className={styles.modalContentWithIcon}>{children}</div>\n </Modal>\n )\n}\n\nexport { NotificationModal }\n"],"mappings":";;;;;;AAoBA,IAAM,uBAAuB,SAA2B;CACtD,QAAQ,MAAR;EACE,KAAK,SACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAD;GAAa,OAAM;GAAwB,QAAO;GAAO,MAAM;EAAK,CAAA;EAExE,KAAK,WACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,iBAAD;GACE,OAAM;GACN,QAAO;GACP,MAAM;EACP,CAAA;EAEL,KAAK,QACH,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,UAAD;GAAU,OAAM;GAAuB,QAAO;GAAO,MAAM;EAAK,CAAA;EACzE,KAAK,WACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,mBAAD;GACE,OAAM;GACN,QAAO;GACP,MAAM;EACP,CAAA;CAEP;AACF;AAEA,IAAM,qBAAqB,EACzB,MACA,OACA,UACA,qBAAqB,MACrB,GAAG,YACyB;CAC5B,MAAM,QAAA,GAAOC,MAAAA,QAAAA,OAAc,oBAAoB,IAAI,GAAG,CAAC,IAAI,CAAC;CAE5D,MAAM,gBACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAWC,gCAAAA,QAAO;EAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAWA,gCAAAA,QAAO;GAAY,UAAA;EAAU,CAAA,GAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAWA,gCAAAA,QAAO;GACrB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWA,gCAAAA,QAAO;IAAiB,UAAA;GAAW,CAAA;EAChD,CAAA,CACF;;CAGP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,OAAD;EACE,OAAO;EACa;EACpB,GAAI;EAEJ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAWD,gCAAAA,QAAO;GAAuB;EAAc,CAAA;CACvD,CAAA;AAEX"}
1
+ {"version":3,"file":"NotificationModal.cjs","names":["XCircleIcon","CheckCircleIcon","InfoIcon","WarningCircleIcon","useMemo","styles","Modal"],"sources":["../../../../src/components/notificationModal/NotificationModal.tsx"],"sourcesContent":["import { ModalProps } from 'antd'\nimport {\n CheckCircleIcon,\n InfoIcon,\n WarningCircleIcon,\n XCircleIcon,\n} from '@phosphor-icons/react'\nimport { useMemo, ReactNode } from 'react'\nimport { Modal } from '../modal'\nimport styles from './NotifcationModal.module.css'\n\ntype NotificationType = 'success' | 'info' | 'warning' | 'error'\n\nexport type NotificationModalProps = {\n type: NotificationType\n withContentPadding?: boolean\n} & Omit<ModalProps, 'title'> & {\n title?: ReactNode\n }\n\nconst getNotificationIcon = (type: NotificationType) => {\n switch (type) {\n case 'error':\n return (\n <XCircleIcon color=\"var(--j2-color-error)\" weight=\"fill\" size={24} />\n )\n case 'success':\n return (\n <CheckCircleIcon\n color=\"var(--j2-color-success)\"\n weight=\"fill\"\n size={24}\n />\n )\n case 'info':\n return <InfoIcon color=\"var(--j2-color-info)\" weight=\"fill\" size={24} />\n case 'warning':\n return (\n <WarningCircleIcon\n color=\"var(--j2-color-warning)\"\n weight=\"fill\"\n size={24}\n />\n )\n }\n}\n\nconst NotificationModal = ({\n type,\n title,\n children,\n withContentPadding = true,\n ...props\n}: NotificationModalProps) => {\n const icon = useMemo(() => getNotificationIcon(type), [type])\n\n const titleWithIcon = (\n <div className={styles.modalTitleWithIcon}>\n <div className={styles.modalIcon}>{icon}</div>\n <div className={styles.modalTitleContent}>\n <div className={styles.modalTitleText}>{title}</div>\n </div>\n </div>\n )\n\n return (\n <Modal\n title={titleWithIcon}\n withContentPadding={withContentPadding}\n {...props}\n >\n <div className={styles.modalContentWithIcon}>{children}</div>\n </Modal>\n )\n}\n\nexport { NotificationModal }\n"],"mappings":";;;;;;;;AAoBA,IAAM,uBAAuB,SAA2B;CACtD,QAAQ,MAAR;EACE,KAAK,SACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAD;GAAa,OAAM;GAAwB,QAAO;GAAO,MAAM;EAAK,CAAA;EAExE,KAAK,WACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,iBAAD;GACE,OAAM;GACN,QAAO;GACP,MAAM;EACP,CAAA;EAEL,KAAK,QACH,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,UAAD;GAAU,OAAM;GAAuB,QAAO;GAAO,MAAM;EAAK,CAAA;EACzE,KAAK,WACH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,mBAAD;GACE,OAAM;GACN,QAAO;GACP,MAAM;EACP,CAAA;CAEP;AACF;AAEA,IAAM,qBAAqB,EACzB,MACA,OACA,UACA,qBAAqB,MACrB,GAAG,YACyB;CAC5B,MAAM,QAAA,GAAOC,MAAAA,QAAAA,OAAc,oBAAoB,IAAI,GAAG,CAAC,IAAI,CAAC;CAE5D,MAAM,gBACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAWC,gCAAAA,QAAO;EAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAWA,gCAAAA,QAAO;GAAY,UAAA;EAAU,CAAA,GAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAWA,gCAAAA,QAAO;GACrB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWA,gCAAAA,QAAO;IAAiB,UAAA;GAAW,CAAA;EAChD,CAAA,CACF;;CAGP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,OAAD;EACE,OAAO;EACa;EACpB,GAAI;EAEJ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAWD,gCAAAA,QAAO;GAAuB;EAAc,CAAA;CACvD,CAAA;AAEX"}
@@ -2,6 +2,7 @@ const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
2
2
  const require_Pagination_module = require("./Pagination.module.css.cjs");
3
3
  let antd = require("antd");
4
4
  let _phosphor_icons_react = require("@phosphor-icons/react");
5
+ _phosphor_icons_react = require_runtime.__toESM(_phosphor_icons_react, 1);
5
6
  let react_jsx_runtime = require("react/jsx-runtime");
6
7
  let classnames = require("classnames");
7
8
  classnames = require_runtime.__toESM(classnames, 1);
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.cjs","names":["Button","cx","s","CaretLeftIcon","CaretRightIcon","DotsThreeIcon","CaretDoubleLeftIcon","CaretDoubleRightIcon","Select","CaretDownIcon","AntdPagination"],"sources":["../../../../src/components/pagination/Pagination.tsx"],"sourcesContent":["import {\n Pagination as AntdPagination,\n PaginationProps,\n Button,\n Select,\n SelectProps,\n} from 'antd'\nimport cx from 'classnames'\nimport {\n CaretLeftIcon,\n CaretRightIcon,\n CaretDownIcon,\n DotsThreeIcon,\n CaretDoubleLeftIcon,\n CaretDoubleRightIcon,\n} from '@phosphor-icons/react'\n\nimport s from './Pagination.module.css'\n\ntype Overrides = {\n paginationTextLabels?: boolean\n /** Forces small-size rendering independent of the config's own `size`. */\n isSmall?: boolean\n}\n\ntype Props = Expand<PaginationProps & { paginationTextLabels?: boolean }>\n\nconst renderIconButton = (\n icon: React.ReactNode,\n isSmall: boolean,\n customClassName?: string\n) => (\n <Button\n type=\"link\"\n size={isSmall ? 'small' : 'middle'}\n className={cx(customClassName, isSmall ? '!w-6' : '!w-8')}\n >\n {icon}\n </Button>\n)\n\nconst renderJumpItem = (\n icon: React.ReactNode,\n doubleIcon: React.ReactNode,\n isSmall: boolean\n) => (\n <a className=\"ant-pagination-item-link\">\n <div className=\"ant-pagination-item-container\">\n <span className=\"ant-pagination-item-ellipsis\">\n {renderIconButton(icon, isSmall, s['jump-button'])}\n </span>\n <span className=\"ant-pagination-item-link-icon\">\n {renderIconButton(doubleIcon, isSmall, s['jump-button'])}\n </span>\n </div>\n </a>\n)\n\nconst buildItemRender =\n ({ paginationTextLabels, isSmall }: Required<Overrides>) =>\n (\n _page: number,\n type: 'page' | 'prev' | 'next' | 'jump-prev' | 'jump-next',\n element: React.ReactNode\n ) => {\n if (type === 'prev') {\n return (\n <a>\n {paginationTextLabels\n ? 'Previous'\n : renderIconButton(<CaretLeftIcon />, isSmall)}\n </a>\n )\n }\n if (type === 'next') {\n return (\n <a>\n {paginationTextLabels\n ? 'Next'\n : renderIconButton(<CaretRightIcon />, isSmall)}\n </a>\n )\n }\n if (type === 'jump-prev') {\n return renderJumpItem(<DotsThreeIcon />, <CaretDoubleLeftIcon />, isSmall)\n }\n if (type === 'jump-next') {\n return renderJumpItem(\n <DotsThreeIcon />,\n <CaretDoubleRightIcon />,\n isSmall\n )\n }\n return element\n }\n\nconst paginationSelectComponentClass = (selectProps: SelectProps) => (\n <Select {...selectProps} suffixIcon={<CaretDownIcon />} />\n)\n\nconst getPaginationLocale = (isSmall: boolean) => ({\n jump_to: `Go to\\u00A0${isSmall ? ':\\u00A0\\u00A0\\u00A0' : ''}`,\n page: isSmall ? '' : 'page',\n})\n\n/**\n * Applies design-system overrides (Phosphor icons, locale, custom select\n * chrome) to an antd Pagination config. Used by the standalone\n * {@link Pagination} component, and by `<Table>`'s `pagination` prop so\n * both share identical visuals.\n */\nexport const withDesignSystemPaginationOverrides = (\n pagination: PaginationProps,\n { paginationTextLabels = false, isSmall }: Overrides = {}\n): PaginationProps => {\n const small = isSmall ?? pagination.size === 'small'\n return {\n ...pagination,\n locale: { ...getPaginationLocale(small), ...pagination.locale },\n // Keep antd in charge of visibility (including Table's filtered total).\n // showSizeChanger's SelectProps alternative would force it visible.\n selectComponentClass: paginationSelectComponentClass,\n itemRender: buildItemRender({\n paginationTextLabels,\n isSmall: small,\n }),\n }\n}\n\nconst Pagination = ({ paginationTextLabels = false, ...props }: Props) => {\n const enriched = withDesignSystemPaginationOverrides(props, {\n paginationTextLabels,\n })\n return <AntdPagination {...enriched} />\n}\n\nexport { Pagination }\n"],"mappings":";;;;;;;;AA2BA,IAAM,oBACJ,MACA,SACA,oBAEA,iBAAA,GAAA,kBAAA,IAAA,CAACA,KAAAA,QAAD;CACE,MAAK;CACL,MAAM,UAAU,UAAU;CAC1B,YAAA,GAAWC,WAAAA,QAAAA,CAAG,iBAAiB,UAAU,SAAS,MAAM;CAEvD,UAAA;AACK,CAAA;AAGV,IAAM,kBACJ,MACA,YACA,YAEA,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;CAAG,WAAU;CACX,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GACb,UAAA,iBAAiB,MAAM,SAASC,0BAAAA,QAAE,cAAc;EAC7C,CAAA,GACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GACb,UAAA,iBAAiB,YAAY,SAASA,0BAAAA,QAAE,cAAc;EACnD,CAAA,CACH;;AACJ,CAAA;AAGL,IAAM,mBACH,EAAE,sBAAsB,eAEvB,OACA,MACA,YACG;CACH,IAAI,SAAS,QACX,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACG,uBACG,aACA,iBAAiB,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,eAAD,CAAgB,CAAA,GAAG,OAAO,EAC9C,CAAA;CAGP,IAAI,SAAS,QACX,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACG,uBACG,SACA,iBAAiB,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,gBAAD,CAAiB,CAAA,GAAG,OAAO,EAC/C,CAAA;CAGP,IAAI,SAAS,aACX,OAAO,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,eAAD,CAAgB,CAAA,GAAG,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,qBAAD,CAAsB,CAAA,GAAG,OAAO;CAE3E,IAAI,SAAS,aACX,OAAO,eACL,iBAAA,GAAA,kBAAA,IAAA,CAACD,sBAAAA,eAAD,CAAgB,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACE,sBAAAA,sBAAD,CAAuB,CAAA,GACvB,OACF;CAEF,OAAO;AACT;AAEF,IAAM,kCAAkC,gBACtC,iBAAA,GAAA,kBAAA,IAAA,CAACC,KAAAA,QAAD;CAAQ,GAAI;CAAa,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,eAAD,CAAgB,CAAA;AAAI,CAAA;AAG3D,IAAM,uBAAuB,aAAsB;CACjD,SAAS,cAAc,UAAU,kBAAwB;CACzD,MAAM,UAAU,KAAK;AACvB;;;;;;;AAQA,IAAa,uCACX,YACA,EAAE,uBAAuB,OAAO,YAAuB,CAAC,MACpC;CACpB,MAAM,QAAQ,WAAW,WAAW,SAAS;CAC7C,OAAO;EACL,GAAG;EACH,QAAQ;GAAE,GAAG,oBAAoB,KAAK;GAAG,GAAG,WAAW;EAAO;EAG9D,sBAAsB;EACtB,YAAY,gBAAgB;GAC1B;GACA,SAAS;EACX,CAAC;CACH;AACF;AAEA,IAAM,cAAc,EAAE,uBAAuB,OAAO,GAAG,YAAmB;CACxE,MAAM,WAAW,oCAAoC,OAAO,EAC1D,qBACF,CAAC;CACD,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,KAAAA,YAAD,EAAgB,GAAI,SAAW,CAAA;AACxC"}
1
+ {"version":3,"file":"Pagination.cjs","names":["Button","cx","s","CaretLeftIcon","CaretRightIcon","DotsThreeIcon","CaretDoubleLeftIcon","CaretDoubleRightIcon","Select","CaretDownIcon","AntdPagination"],"sources":["../../../../src/components/pagination/Pagination.tsx"],"sourcesContent":["import {\n Pagination as AntdPagination,\n PaginationProps,\n Button,\n Select,\n SelectProps,\n} from 'antd'\nimport cx from 'classnames'\nimport {\n CaretLeftIcon,\n CaretRightIcon,\n CaretDownIcon,\n DotsThreeIcon,\n CaretDoubleLeftIcon,\n CaretDoubleRightIcon,\n} from '@phosphor-icons/react'\n\nimport s from './Pagination.module.css'\n\ntype Overrides = {\n paginationTextLabels?: boolean\n /** Forces small-size rendering independent of the config's own `size`. */\n isSmall?: boolean\n}\n\ntype Props = Expand<PaginationProps & { paginationTextLabels?: boolean }>\n\nconst renderIconButton = (\n icon: React.ReactNode,\n isSmall: boolean,\n customClassName?: string\n) => (\n <Button\n type=\"link\"\n size={isSmall ? 'small' : 'middle'}\n className={cx(customClassName, isSmall ? '!w-6' : '!w-8')}\n >\n {icon}\n </Button>\n)\n\nconst renderJumpItem = (\n icon: React.ReactNode,\n doubleIcon: React.ReactNode,\n isSmall: boolean\n) => (\n <a className=\"ant-pagination-item-link\">\n <div className=\"ant-pagination-item-container\">\n <span className=\"ant-pagination-item-ellipsis\">\n {renderIconButton(icon, isSmall, s['jump-button'])}\n </span>\n <span className=\"ant-pagination-item-link-icon\">\n {renderIconButton(doubleIcon, isSmall, s['jump-button'])}\n </span>\n </div>\n </a>\n)\n\nconst buildItemRender =\n ({ paginationTextLabels, isSmall }: Required<Overrides>) =>\n (\n _page: number,\n type: 'page' | 'prev' | 'next' | 'jump-prev' | 'jump-next',\n element: React.ReactNode\n ) => {\n if (type === 'prev') {\n return (\n <a>\n {paginationTextLabels\n ? 'Previous'\n : renderIconButton(<CaretLeftIcon />, isSmall)}\n </a>\n )\n }\n if (type === 'next') {\n return (\n <a>\n {paginationTextLabels\n ? 'Next'\n : renderIconButton(<CaretRightIcon />, isSmall)}\n </a>\n )\n }\n if (type === 'jump-prev') {\n return renderJumpItem(<DotsThreeIcon />, <CaretDoubleLeftIcon />, isSmall)\n }\n if (type === 'jump-next') {\n return renderJumpItem(\n <DotsThreeIcon />,\n <CaretDoubleRightIcon />,\n isSmall\n )\n }\n return element\n }\n\nconst paginationSelectComponentClass = (selectProps: SelectProps) => (\n <Select {...selectProps} suffixIcon={<CaretDownIcon />} />\n)\n\nconst getPaginationLocale = (isSmall: boolean) => ({\n jump_to: `Go to\\u00A0${isSmall ? ':\\u00A0\\u00A0\\u00A0' : ''}`,\n page: isSmall ? '' : 'page',\n})\n\n/**\n * Applies design-system overrides (Phosphor icons, locale, custom select\n * chrome) to an antd Pagination config. Used by the standalone\n * {@link Pagination} component, and by `<Table>`'s `pagination` prop so\n * both share identical visuals.\n */\nexport const withDesignSystemPaginationOverrides = (\n pagination: PaginationProps,\n { paginationTextLabels = false, isSmall }: Overrides = {}\n): PaginationProps => {\n const small = isSmall ?? pagination.size === 'small'\n return {\n ...pagination,\n locale: { ...getPaginationLocale(small), ...pagination.locale },\n // Keep antd in charge of visibility (including Table's filtered total).\n // showSizeChanger's SelectProps alternative would force it visible.\n selectComponentClass: paginationSelectComponentClass,\n itemRender: buildItemRender({\n paginationTextLabels,\n isSmall: small,\n }),\n }\n}\n\nconst Pagination = ({ paginationTextLabels = false, ...props }: Props) => {\n const enriched = withDesignSystemPaginationOverrides(props, {\n paginationTextLabels,\n })\n return <AntdPagination {...enriched} />\n}\n\nexport { Pagination }\n"],"mappings":";;;;;;;;;AA2BA,IAAM,oBACJ,MACA,SACA,oBAEA,iBAAA,GAAA,kBAAA,IAAA,CAACA,KAAAA,QAAD;CACE,MAAK;CACL,MAAM,UAAU,UAAU;CAC1B,YAAA,GAAWC,WAAAA,QAAAA,CAAG,iBAAiB,UAAU,SAAS,MAAM;CAEvD,UAAA;AACK,CAAA;AAGV,IAAM,kBACJ,MACA,YACA,YAEA,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;CAAG,WAAU;CACX,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GACb,UAAA,iBAAiB,MAAM,SAASC,0BAAAA,QAAE,cAAc;EAC7C,CAAA,GACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GACb,UAAA,iBAAiB,YAAY,SAASA,0BAAAA,QAAE,cAAc;EACnD,CAAA,CACH;;AACJ,CAAA;AAGL,IAAM,mBACH,EAAE,sBAAsB,eAEvB,OACA,MACA,YACG;CACH,IAAI,SAAS,QACX,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACG,uBACG,aACA,iBAAiB,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,eAAD,CAAgB,CAAA,GAAG,OAAO,EAC9C,CAAA;CAGP,IAAI,SAAS,QACX,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACG,uBACG,SACA,iBAAiB,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,gBAAD,CAAiB,CAAA,GAAG,OAAO,EAC/C,CAAA;CAGP,IAAI,SAAS,aACX,OAAO,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,eAAD,CAAgB,CAAA,GAAG,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,qBAAD,CAAsB,CAAA,GAAG,OAAO;CAE3E,IAAI,SAAS,aACX,OAAO,eACL,iBAAA,GAAA,kBAAA,IAAA,CAACD,sBAAAA,eAAD,CAAgB,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACE,sBAAAA,sBAAD,CAAuB,CAAA,GACvB,OACF;CAEF,OAAO;AACT;AAEF,IAAM,kCAAkC,gBACtC,iBAAA,GAAA,kBAAA,IAAA,CAACC,KAAAA,QAAD;CAAQ,GAAI;CAAa,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,eAAD,CAAgB,CAAA;AAAI,CAAA;AAG3D,IAAM,uBAAuB,aAAsB;CACjD,SAAS,cAAc,UAAU,kBAAwB;CACzD,MAAM,UAAU,KAAK;AACvB;;;;;;;AAQA,IAAa,uCACX,YACA,EAAE,uBAAuB,OAAO,YAAuB,CAAC,MACpC;CACpB,MAAM,QAAQ,WAAW,WAAW,SAAS;CAC7C,OAAO;EACL,GAAG;EACH,QAAQ;GAAE,GAAG,oBAAoB,KAAK;GAAG,GAAG,WAAW;EAAO;EAG9D,sBAAsB;EACtB,YAAY,gBAAgB;GAC1B;GACA,SAAS;EACX,CAAC;CACH;AACF;AAEA,IAAM,cAAc,EAAE,uBAAuB,OAAO,GAAG,YAAmB;CACxE,MAAM,WAAW,oCAAoC,OAAO,EAC1D,qBACF,CAAC;CACD,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,KAAAA,YAAD,EAAgB,GAAI,SAAW,CAAA;AACxC"}
@@ -1,6 +1,8 @@
1
+ const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
1
2
  ;/* empty css */
2
3
  let antd = require("antd");
3
4
  let _phosphor_icons_react = require("@phosphor-icons/react");
5
+ _phosphor_icons_react = require_runtime.__toESM(_phosphor_icons_react, 1);
4
6
  let react_jsx_runtime = require("react/jsx-runtime");
5
7
  //#region src/components/rate/Rate.tsx
6
8
  var Rate = ({ count = 5, ...props }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"Rate.cjs","names":["AntdRate","StarIcon"],"sources":["../../../../src/components/rate/Rate.tsx"],"sourcesContent":["import { StarIcon } from '@phosphor-icons/react'\nimport { Rate as AntdRate, RateProps } from 'antd'\nimport './Rate.css'\n\nexport type Props = Expand<RateProps>\n\nexport const Rate = ({ count = 5, ...props }: Props) => {\n return (\n <AntdRate\n {...props}\n className=\"j2-rate\"\n count={count}\n disabled={true}\n allowHalf={true}\n allowClear={true}\n character={<StarIcon weight=\"fill\" />}\n />\n )\n}\n"],"mappings":";;;;;AAMA,IAAa,QAAQ,EAAE,QAAQ,GAAG,GAAG,YAAmB;CACtD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,KAAAA,MAAD;EACE,GAAI;EACJ,WAAU;EACH;EACP,UAAU;EACV,WAAW;EACX,YAAY;EACZ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,UAAD,EAAU,QAAO,OAAQ,CAAA;CACrC,CAAA;AAEL"}
1
+ {"version":3,"file":"Rate.cjs","names":["AntdRate","StarIcon"],"sources":["../../../../src/components/rate/Rate.tsx"],"sourcesContent":["import { StarIcon } from '@phosphor-icons/react'\nimport { Rate as AntdRate, RateProps } from 'antd'\nimport './Rate.css'\n\nexport type Props = Expand<RateProps>\n\nexport const Rate = ({ count = 5, ...props }: Props) => {\n return (\n <AntdRate\n {...props}\n className=\"j2-rate\"\n count={count}\n disabled={true}\n allowHalf={true}\n allowClear={true}\n character={<StarIcon weight=\"fill\" />}\n />\n )\n}\n"],"mappings":";;;;;;;AAMA,IAAa,QAAQ,EAAE,QAAQ,GAAG,GAAG,YAAmB;CACtD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,KAAAA,MAAD;EACE,GAAI;EACJ,WAAU;EACH;EACP,UAAU;EACV,WAAW;EACX,YAAY;EACZ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,UAAD,EAAU,QAAO,OAAQ,CAAA;CACrC,CAAA;AAEL"}
@@ -4,6 +4,7 @@ let react$1 = require_runtime.__toESM(react, 1);
4
4
  react = require_runtime.__toESM(react);
5
5
  let antd = require("antd");
6
6
  let _phosphor_icons_react = require("@phosphor-icons/react");
7
+ _phosphor_icons_react = require_runtime.__toESM(_phosphor_icons_react, 1);
7
8
  let react_jsx_runtime = require("react/jsx-runtime");
8
9
  let _ant_design_icons = require("@ant-design/icons");
9
10
  //#region src/components/select/AntdSelect.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"AntdSelect.cjs","names":["useState","React","Spin","LoadingOutlined","RawAntDSelect","MagnifyingGlassIcon","CaretDownIcon","XCircleIcon"],"sources":["../../../../src/components/select/AntdSelect.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Select as RawAntDSelect, Spin } from 'antd'\nimport { LoadingOutlined } from '@ant-design/icons'\nimport type { SelectProps as AntDSelectProps } from 'antd'\nimport {\n CaretDownIcon,\n MagnifyingGlassIcon,\n XCircleIcon,\n} from '@phosphor-icons/react'\nimport { useState } from 'react'\n\ntype AntdSelectProps = Expand<AntDSelectProps>\n\nexport const AntdSelect = (props: AntdSelectProps) => {\n const [isFocused, setIsFocused] = useState(false)\n\n const handleSearch = (value: string) => {\n if (props.onSearch) {\n props.onSearch(value)\n }\n }\n\n const dropdownRender = React.useCallback(\n (menu: React.ReactElement): React.ReactElement => {\n if (props.loading) {\n return (\n <div className=\"flex items-center justify-between px-3 py-1\">\n <span>Loading...</span>\n <Spin indicator={<LoadingOutlined spin />} size=\"small\" />\n </div>\n )\n }\n\n if (!props.options || (props.options && props.options.length === 0)) {\n return <div className=\"px-3 py-1\">No options</div>\n }\n\n return menu\n },\n [props.loading, props.options?.length]\n )\n\n return (\n <RawAntDSelect\n suffixIcon={\n props.loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : props.showSearch && isFocused ? (\n <MagnifyingGlassIcon size={14} data-testid=\"magnifying-glass\" />\n ) : (\n <CaretDownIcon size={14} data-testid=\"caret-down\" />\n )\n }\n {...props}\n popupRender={dropdownRender}\n removeIcon={<XCircleIcon size={12} />}\n allowClear={\n props.allowClear ? { clearIcon: <XCircleIcon size={14} /> } : false\n }\n showSearch={props.showSearch}\n onSearch={props.onSearch ? handleSearch : undefined}\n onFocus={() => {\n setIsFocused(true)\n }}\n onBlur={() => {\n setIsFocused(false)\n }}\n size={props.size || 'large'}\n />\n )\n}\n"],"mappings":";;;;;;;;;AAaA,IAAa,cAAc,UAA2B;CACpD,MAAM,CAAC,WAAW,iBAAA,GAAgBA,QAAAA,SAAAA,CAAS,KAAK;CAEhD,MAAM,gBAAgB,UAAkB;EACtC,IAAI,MAAM,UACR,MAAM,SAAS,KAAK;CAExB;CAEA,MAAM,iBAAiBC,QAAM,aAC1B,SAAiD;EAChD,IAAI,MAAM,SACR,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,aAAgB,CAAA,GACtB,iBAAA,GAAA,kBAAA,IAAA,CAACC,KAAAA,MAAD;IAAM,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACC,kBAAAA,iBAAD,EAAiB,MAAA,KAAM,CAAA;IAAG,MAAK;GAAS,CAAA,CACtD;;EAIT,IAAI,CAAC,MAAM,WAAY,MAAM,WAAW,MAAM,QAAQ,WAAW,GAC/D,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAU;GAAY,UAAA;EAAe,CAAA;EAGnD,OAAO;CACT,GACA,CAAC,MAAM,SAAS,MAAM,SAAS,MAAM,CACvC;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,KAAAA,QAAD;EACE,YACE,MAAM,UACJ,iBAAA,GAAA,kBAAA,IAAA,CAACF,KAAAA,MAAD;GACE,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACC,kBAAAA,iBAAD,EAAiB,MAAA,KAAM,CAAA;GAClC,MAAK;GACL,eAAY;EACb,CAAA,IACC,MAAM,cAAc,YACtB,iBAAA,GAAA,kBAAA,IAAA,CAACE,sBAAAA,qBAAD;GAAqB,MAAM;GAAI,eAAY;EAAoB,CAAA,IAE/D,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,eAAD;GAAe,MAAM;GAAI,eAAY;EAAc,CAAA;EAGvD,GAAI;EACJ,aAAa;EACb,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,aAAD,EAAa,MAAM,GAAK,CAAA;EACpC,YACE,MAAM,aAAa,EAAE,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAD,EAAa,MAAM,GAAK,CAAA,EAAE,IAAI;EAEhE,YAAY,MAAM;EAClB,UAAU,MAAM,WAAW,eAAe,KAAA;EAC1C,eAAe;GACb,aAAa,IAAI;EACnB;EACA,cAAc;GACZ,aAAa,KAAK;EACpB;EACA,MAAM,MAAM,QAAQ;CACrB,CAAA;AAEL"}
1
+ {"version":3,"file":"AntdSelect.cjs","names":["useState","React","Spin","LoadingOutlined","RawAntDSelect","MagnifyingGlassIcon","CaretDownIcon","XCircleIcon"],"sources":["../../../../src/components/select/AntdSelect.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Select as RawAntDSelect, Spin } from 'antd'\nimport { LoadingOutlined } from '@ant-design/icons'\nimport type { SelectProps as AntDSelectProps } from 'antd'\nimport {\n CaretDownIcon,\n MagnifyingGlassIcon,\n XCircleIcon,\n} from '@phosphor-icons/react'\nimport { useState } from 'react'\n\ntype AntdSelectProps = Expand<AntDSelectProps>\n\nexport const AntdSelect = (props: AntdSelectProps) => {\n const [isFocused, setIsFocused] = useState(false)\n\n const handleSearch = (value: string) => {\n if (props.onSearch) {\n props.onSearch(value)\n }\n }\n\n const dropdownRender = React.useCallback(\n (menu: React.ReactElement): React.ReactElement => {\n if (props.loading) {\n return (\n <div className=\"flex items-center justify-between px-3 py-1\">\n <span>Loading...</span>\n <Spin indicator={<LoadingOutlined spin />} size=\"small\" />\n </div>\n )\n }\n\n if (!props.options || (props.options && props.options.length === 0)) {\n return <div className=\"px-3 py-1\">No options</div>\n }\n\n return menu\n },\n [props.loading, props.options?.length]\n )\n\n return (\n <RawAntDSelect\n suffixIcon={\n props.loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : props.showSearch && isFocused ? (\n <MagnifyingGlassIcon size={14} data-testid=\"magnifying-glass\" />\n ) : (\n <CaretDownIcon size={14} data-testid=\"caret-down\" />\n )\n }\n {...props}\n popupRender={dropdownRender}\n removeIcon={<XCircleIcon size={12} />}\n allowClear={\n props.allowClear ? { clearIcon: <XCircleIcon size={14} /> } : false\n }\n showSearch={props.showSearch}\n onSearch={props.onSearch ? handleSearch : undefined}\n onFocus={() => {\n setIsFocused(true)\n }}\n onBlur={() => {\n setIsFocused(false)\n }}\n size={props.size || 'large'}\n />\n )\n}\n"],"mappings":";;;;;;;;;;AAaA,IAAa,cAAc,UAA2B;CACpD,MAAM,CAAC,WAAW,iBAAA,GAAgBA,QAAAA,SAAAA,CAAS,KAAK;CAEhD,MAAM,gBAAgB,UAAkB;EACtC,IAAI,MAAM,UACR,MAAM,SAAS,KAAK;CAExB;CAEA,MAAM,iBAAiBC,QAAM,aAC1B,SAAiD;EAChD,IAAI,MAAM,SACR,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,aAAgB,CAAA,GACtB,iBAAA,GAAA,kBAAA,IAAA,CAACC,KAAAA,MAAD;IAAM,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACC,kBAAAA,iBAAD,EAAiB,MAAA,KAAM,CAAA;IAAG,MAAK;GAAS,CAAA,CACtD;;EAIT,IAAI,CAAC,MAAM,WAAY,MAAM,WAAW,MAAM,QAAQ,WAAW,GAC/D,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAU;GAAY,UAAA;EAAe,CAAA;EAGnD,OAAO;CACT,GACA,CAAC,MAAM,SAAS,MAAM,SAAS,MAAM,CACvC;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,KAAAA,QAAD;EACE,YACE,MAAM,UACJ,iBAAA,GAAA,kBAAA,IAAA,CAACF,KAAAA,MAAD;GACE,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACC,kBAAAA,iBAAD,EAAiB,MAAA,KAAM,CAAA;GAClC,MAAK;GACL,eAAY;EACb,CAAA,IACC,MAAM,cAAc,YACtB,iBAAA,GAAA,kBAAA,IAAA,CAACE,sBAAAA,qBAAD;GAAqB,MAAM;GAAI,eAAY;EAAoB,CAAA,IAE/D,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,eAAD;GAAe,MAAM;GAAI,eAAY;EAAc,CAAA;EAGvD,GAAI;EACJ,aAAa;EACb,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,aAAD,EAAa,MAAM,GAAK,CAAA;EACpC,YACE,MAAM,aAAa,EAAE,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAD,EAAa,MAAM,GAAK,CAAA,EAAE,IAAI;EAEhE,YAAY,MAAM;EAClB,UAAU,MAAM,WAAW,eAAe,KAAA;EAC1C,eAAe;GACb,aAAa,IAAI;EACnB;EACA,cAAc;GACZ,aAAa,KAAK;EACpB;EACA,MAAM,MAAM,QAAQ;CACrB,CAAA;AAEL"}
@@ -5,6 +5,7 @@ let react = require("react");
5
5
  react = require_runtime.__toESM(react, 1);
6
6
  let antd = require("antd");
7
7
  let _phosphor_icons_react = require("@phosphor-icons/react");
8
+ _phosphor_icons_react = require_runtime.__toESM(_phosphor_icons_react, 1);
8
9
  let react_jsx_runtime = require("react/jsx-runtime");
9
10
  let _ant_design_icons = require("@ant-design/icons");
10
11
  //#region src/components/select/Select.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"Select.cjs","names":["FormikField","useState","Spin","LoadingOutlined","_Fragment","AntDSelect","MagnifyingGlassIcon","CaretDownIcon","XCircleIcon"],"sources":["../../../../src/components/select/Select.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Select as AntDSelect, Spin } from 'antd'\nimport { LoadingOutlined } from '@ant-design/icons'\nimport type {\n SelectProps as AntDSelectProps,\n DefaultOptionType,\n} from 'antd/es/select'\nimport {\n CaretDownIcon,\n MagnifyingGlassIcon,\n XCircleIcon,\n} from '@phosphor-icons/react'\nimport { useState } from 'react'\nimport type { FieldProps } from 'formik'\nimport { FormikField } from '../form/FormikField'\nimport './Select.css'\n\ntype SelectProps = Expand<AntDSelectProps> & {\n name: string\n}\n\ntype GroupOption = { label?: React.ReactNode; options: DefaultOptionType[] }\n\nconst isGroupOption = (\n opt: DefaultOptionType | GroupOption\n): opt is GroupOption =>\n 'options' in opt && Array.isArray((opt as GroupOption).options)\n\nconst flattenOptions = (\n opts: (DefaultOptionType | GroupOption)[] | undefined\n): DefaultOptionType[] => {\n if (!opts) return []\n return opts.flatMap((o) =>\n isGroupOption(o) ? flattenOptions(o.options) : [o]\n )\n}\n\nexport const Select = (props: SelectProps) => (\n <FormikField name={props.name}>\n {({ field, form }) => (\n <SelectControl props={props} field={field} form={form} />\n )}\n </FormikField>\n)\n\nconst SelectControl = ({\n props,\n field,\n form,\n}: { props: SelectProps } & Pick<FieldProps, 'field' | 'form'>) => {\n const [isFocused, setIsFocused] = useState(false)\n const [isSearching, setIsSearching] = useState(false)\n const helpers = form.getFieldHelpers(props.name)\n\n const isMultiple = props.mode === 'multiple'\n const isSearchable = props.mode === 'tags' || (props.showSearch ?? isMultiple)\n const hasOptions = (props.options?.length ?? 0) > 0\n const currentValue: unknown[] = Array.isArray(field.value) ? field.value : []\n const showSelectAllFooter =\n isMultiple &&\n !props.loading &&\n !props.disabled &&\n hasOptions &&\n !isSearching\n\n const handleSearch = (value: string) => {\n setIsSearching(value.length > 0)\n const onSearch =\n typeof props.showSearch === 'object'\n ? (props.showSearch.onSearch ?? props.onSearch)\n : props.onSearch\n onSearch?.(value)\n }\n\n const handleToggleAll = () => {\n if (props.disabled) return\n\n if (currentValue.length === 0) {\n const flat = flattenOptions(\n props.options as (DefaultOptionType | GroupOption)[] | undefined\n )\n const allOptions = flat.filter(\n (opt) => opt.value !== undefined && opt.value !== null && !opt.disabled\n )\n // antd's labelInValue mode expects values shaped as { value, label }\n // rather than raw scalars; mirror that contract so the field state\n // and downstream onChange payload match what consumers expect.\n const payload = props.labelInValue\n ? allOptions.map((opt) => ({ value: opt.value, label: opt.label }))\n : allOptions.map((opt) => opt.value as string | number)\n void helpers.setValue(payload)\n props.onChange?.(payload, allOptions)\n } else {\n void helpers.setValue([])\n props.onChange?.([], [])\n }\n }\n\n const dropdownRender = (menu: React.ReactElement): React.ReactElement => {\n if (props.loading) {\n return (\n <div className=\"flex items-center justify-between px-3 py-1\">\n <span>Loading...</span>\n <Spin indicator={<LoadingOutlined spin />} size=\"small\" />\n </div>\n )\n }\n\n if (!props.options || (props.options && props.options.length === 0)) {\n return <div className=\"px-3 py-1\">No options</div>\n }\n\n if (!showSelectAllFooter) return menu\n\n const label = currentValue.length === 0 ? 'Select all' : 'Clear all'\n\n return (\n <>\n {menu}\n <div className=\"mt-1 pt-1 border-t border-j2-border-secondary\">\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleToggleAll}\n className=\"w-full text-center font-semibold text-sm py-1.5 rounded cursor-pointer text-j2-primary hover:bg-j2-primary-bg-hover bg-transparent border-0\"\n >\n {label}\n </button>\n </div>\n </>\n )\n }\n\n return (\n <AntDSelect\n suffixIcon={\n props.loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : isSearchable && isFocused ? (\n <MagnifyingGlassIcon size={14} data-testid=\"magnifying-glass\" />\n ) : (\n <CaretDownIcon size={14} data-testid=\"caret-down\" />\n )\n }\n {...props}\n id={props.id ?? props.name}\n value={\n field.value === '' || field.value === null ? undefined : field.value\n }\n onChange={(value, option) => {\n void helpers.setValue(value)\n props.onChange?.(value, option)\n }}\n popupRender={dropdownRender}\n removeIcon={<XCircleIcon size={12} />}\n allowClear={\n props.allowClear ? { clearIcon: <XCircleIcon size={14} /> } : false\n }\n showSearch={\n typeof props.showSearch === 'object'\n ? { ...props.showSearch, onSearch: handleSearch }\n : props.showSearch\n }\n onSearch={isSearchable ? handleSearch : undefined}\n onFocus={(event) => {\n setIsFocused(true)\n props.onFocus?.(event)\n }}\n onBlur={(event) => {\n void helpers.setTouched(true)\n setIsFocused(false)\n setIsSearching(false)\n props.onBlur?.(event)\n }}\n size={props.size || 'large'}\n />\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Select.cjs","names":["FormikField","useState","Spin","LoadingOutlined","_Fragment","AntDSelect","MagnifyingGlassIcon","CaretDownIcon","XCircleIcon"],"sources":["../../../../src/components/select/Select.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Select as AntDSelect, Spin } from 'antd'\nimport { LoadingOutlined } from '@ant-design/icons'\nimport type {\n SelectProps as AntDSelectProps,\n DefaultOptionType,\n} from 'antd/es/select'\nimport {\n CaretDownIcon,\n MagnifyingGlassIcon,\n XCircleIcon,\n} from '@phosphor-icons/react'\nimport { useState } from 'react'\nimport type { FieldProps } from 'formik'\nimport { FormikField } from '../form/FormikField'\nimport './Select.css'\n\ntype SelectProps = Expand<AntDSelectProps> & {\n name: string\n}\n\ntype GroupOption = { label?: React.ReactNode; options: DefaultOptionType[] }\n\nconst isGroupOption = (\n opt: DefaultOptionType | GroupOption\n): opt is GroupOption =>\n 'options' in opt && Array.isArray((opt as GroupOption).options)\n\nconst flattenOptions = (\n opts: (DefaultOptionType | GroupOption)[] | undefined\n): DefaultOptionType[] => {\n if (!opts) return []\n return opts.flatMap((o) =>\n isGroupOption(o) ? flattenOptions(o.options) : [o]\n )\n}\n\nexport const Select = (props: SelectProps) => (\n <FormikField name={props.name}>\n {({ field, form }) => (\n <SelectControl props={props} field={field} form={form} />\n )}\n </FormikField>\n)\n\nconst SelectControl = ({\n props,\n field,\n form,\n}: { props: SelectProps } & Pick<FieldProps, 'field' | 'form'>) => {\n const [isFocused, setIsFocused] = useState(false)\n const [isSearching, setIsSearching] = useState(false)\n const helpers = form.getFieldHelpers(props.name)\n\n const isMultiple = props.mode === 'multiple'\n const isSearchable = props.mode === 'tags' || (props.showSearch ?? isMultiple)\n const hasOptions = (props.options?.length ?? 0) > 0\n const currentValue: unknown[] = Array.isArray(field.value) ? field.value : []\n const showSelectAllFooter =\n isMultiple &&\n !props.loading &&\n !props.disabled &&\n hasOptions &&\n !isSearching\n\n const handleSearch = (value: string) => {\n setIsSearching(value.length > 0)\n const onSearch =\n typeof props.showSearch === 'object'\n ? (props.showSearch.onSearch ?? props.onSearch)\n : props.onSearch\n onSearch?.(value)\n }\n\n const handleToggleAll = () => {\n if (props.disabled) return\n\n if (currentValue.length === 0) {\n const flat = flattenOptions(\n props.options as (DefaultOptionType | GroupOption)[] | undefined\n )\n const allOptions = flat.filter(\n (opt) => opt.value !== undefined && opt.value !== null && !opt.disabled\n )\n // antd's labelInValue mode expects values shaped as { value, label }\n // rather than raw scalars; mirror that contract so the field state\n // and downstream onChange payload match what consumers expect.\n const payload = props.labelInValue\n ? allOptions.map((opt) => ({ value: opt.value, label: opt.label }))\n : allOptions.map((opt) => opt.value as string | number)\n void helpers.setValue(payload)\n props.onChange?.(payload, allOptions)\n } else {\n void helpers.setValue([])\n props.onChange?.([], [])\n }\n }\n\n const dropdownRender = (menu: React.ReactElement): React.ReactElement => {\n if (props.loading) {\n return (\n <div className=\"flex items-center justify-between px-3 py-1\">\n <span>Loading...</span>\n <Spin indicator={<LoadingOutlined spin />} size=\"small\" />\n </div>\n )\n }\n\n if (!props.options || (props.options && props.options.length === 0)) {\n return <div className=\"px-3 py-1\">No options</div>\n }\n\n if (!showSelectAllFooter) return menu\n\n const label = currentValue.length === 0 ? 'Select all' : 'Clear all'\n\n return (\n <>\n {menu}\n <div className=\"mt-1 pt-1 border-t border-j2-border-secondary\">\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleToggleAll}\n className=\"w-full text-center font-semibold text-sm py-1.5 rounded cursor-pointer text-j2-primary hover:bg-j2-primary-bg-hover bg-transparent border-0\"\n >\n {label}\n </button>\n </div>\n </>\n )\n }\n\n return (\n <AntDSelect\n suffixIcon={\n props.loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : isSearchable && isFocused ? (\n <MagnifyingGlassIcon size={14} data-testid=\"magnifying-glass\" />\n ) : (\n <CaretDownIcon size={14} data-testid=\"caret-down\" />\n )\n }\n {...props}\n id={props.id ?? props.name}\n value={\n field.value === '' || field.value === null ? undefined : field.value\n }\n onChange={(value, option) => {\n void helpers.setValue(value)\n props.onChange?.(value, option)\n }}\n popupRender={dropdownRender}\n removeIcon={<XCircleIcon size={12} />}\n allowClear={\n props.allowClear ? { clearIcon: <XCircleIcon size={14} /> } : false\n }\n showSearch={\n typeof props.showSearch === 'object'\n ? { ...props.showSearch, onSearch: handleSearch }\n : props.showSearch\n }\n onSearch={isSearchable ? handleSearch : undefined}\n onFocus={(event) => {\n setIsFocused(true)\n props.onFocus?.(event)\n }}\n onBlur={(event) => {\n void helpers.setTouched(true)\n setIsFocused(false)\n setIsSearching(false)\n props.onBlur?.(event)\n }}\n size={props.size || 'large'}\n />\n )\n}\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
2
- const require_index = require("../icons/index.cjs");
3
2
  const require_Tag = require("../tag/Tag.cjs");
4
3
  const require_SummarizedSelect_module = require("./SummarizedSelect.module.css.cjs");
5
4
  let react = require("react");
6
5
  let antd = require("antd");
6
+ let _phosphor_icons_react = require("@phosphor-icons/react");
7
+ _phosphor_icons_react = require_runtime.__toESM(_phosphor_icons_react, 1);
7
8
  let react_jsx_runtime = require("react/jsx-runtime");
8
9
  let classnames = require("classnames");
9
10
  classnames = require_runtime.__toESM(classnames, 1);
@@ -158,7 +159,7 @@ function SummarizedSelect({ searchPlaceholder, formControlPlaceholder, loading,
158
159
  },
159
160
  onKeyDown: handleKeyDown,
160
161
  onClick: (e) => e.stopPropagation(),
161
- prefix: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index.icons_exports.MagnifyingGlassIcon, {
162
+ prefix: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.MagnifyingGlassIcon, {
162
163
  size: 16,
163
164
  className: "text-j2-text-placeholder"
164
165
  }),
@@ -254,7 +255,7 @@ function SummarizedSelect({ searchPlaceholder, formControlPlaceholder, loading,
254
255
  },
255
256
  onKeyDown: handleKeyDown,
256
257
  onClick: (e) => e.stopPropagation(),
257
- prefix: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index.icons_exports.MagnifyingGlassIcon, {
258
+ prefix: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.MagnifyingGlassIcon, {
258
259
  size: 16,
259
260
  className: "text-j2-text-placeholder"
260
261
  }),
@@ -315,7 +316,7 @@ function SummarizedSelect({ searchPlaceholder, formControlPlaceholder, loading,
315
316
  indicator: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_ant_design_icons.LoadingOutlined, { spin: true }),
316
317
  size: "small",
317
318
  "data-testid": "loading-spinner"
318
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index.icons_exports.CaretDownIcon, {
319
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.CaretDownIcon, {
319
320
  weight: "regular",
320
321
  "data-testid": "caret-down"
321
322
  })]
@@ -351,7 +352,7 @@ function SummarizedSelect({ searchPlaceholder, formControlPlaceholder, loading,
351
352
  indicator: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_ant_design_icons.LoadingOutlined, { spin: true }),
352
353
  size: "small",
353
354
  "data-testid": "loading-spinner"
354
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index.icons_exports.CaretDownIcon, {
355
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_phosphor_icons_react.CaretDownIcon, {
355
356
  size: 14,
356
357
  "data-testid": "caret-down"
357
358
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"SummarizedSelect.cjs","names":["useState","useRef","useMemo","Input","icons","Tag","cx","styles","Fragment","Spin","LoadingOutlined","AntdDropdown","Typography","_Fragment","Select"],"sources":["../../../../src/components/select/SummarizedSelect.tsx"],"sourcesContent":["import {\n Dropdown as AntdDropdown,\n Select,\n Spin,\n Input,\n SelectProps,\n InputRef,\n Typography,\n} from 'antd'\nimport { DefaultOptionType } from 'antd/es/select'\nimport { Fragment, useState, useMemo, useRef, useEffect } from 'react'\nimport { LoadingOutlined } from '@ant-design/icons'\nimport * as icons from '../icons'\nimport { Tag } from '../tag'\nimport cx from 'classnames'\n\nimport styles from './SummarizedSelect.module.css'\n\ntype Option = DefaultOptionType\ntype OptionWithLogo = Option & {\n logo: React.ReactNode\n}\n\ntype GroupOption = {\n label: string\n options: Option[]\n}\n\nexport type SelectOption = Option | GroupOption | OptionWithLogo\n\nexport type SummarizedSelectVariant = SelectProps['variant'] | 'headlined'\n\nexport type SummarizedSelectTrigger = 'select' | 'dropdown'\n\ntype BaseProps = Omit<\n SelectProps<string | string[], SelectOption>,\n 'mode' | 'value' | 'onChange' | 'variant'\n> & {\n searchPlaceholder?: string\n formControlPlaceholder?: string\n rootClassName?: string\n popupClassName?: string\n variant?: SummarizedSelectVariant\n /**\n * Shape of the control that opens the popup.\n * - `'select'` (default): antd Select, styled by `variant`.\n * - `'dropdown'`: antd Dropdown with a `Typography.Link` target (label + caret).\n * Ignores `variant` — the trigger is always a link.\n */\n trigger?: SummarizedSelectTrigger\n defaultOpen?: boolean\n\n loading?: boolean\n}\n\ntype SingleProps = {\n multiple?: false\n renderLabel?: undefined\n value: string | undefined\n onChange: (newValue: string) => void\n}\n\ntype MultiProps = {\n multiple: true\n renderLabel: (count: number) => string\n value: string[]\n onChange: (newValue: string[]) => void\n}\n\nexport type Props = BaseProps & (SingleProps | MultiProps)\n\nconst isGroupOption = (option: SelectOption): option is GroupOption => {\n return 'options' in option\n}\n\nconst getAllOptions = (options: SelectOption[] | undefined): Option[] => {\n if (!options) return []\n\n return options.flatMap((option) =>\n isGroupOption(option) ? option.options : [option]\n )\n}\n\nconst filterOptions = (\n options: SelectOption[] | undefined,\n searchValue: string\n): SelectOption[] => {\n if (!options) return []\n if (!searchValue) return options\n\n return options\n .map((option) => {\n if (isGroupOption(option)) {\n const filteredSubOptions = option.options.filter((subOption) =>\n subOption.label\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase())\n )\n return filteredSubOptions.length > 0\n ? { ...option, options: filteredSubOptions }\n : null\n } else {\n return option.label\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase())\n ? option\n : null\n }\n })\n .filter((option): option is SelectOption => option !== null)\n}\n\nexport function SummarizedSelect({\n searchPlaceholder,\n formControlPlaceholder,\n loading,\n multiple,\n value,\n onChange,\n options,\n renderLabel,\n rootClassName,\n popupClassName,\n variant,\n trigger = 'select',\n defaultOpen = false,\n ...props\n}: Props) {\n const isHeadline = variant === 'headlined'\n const antVariant = isHeadline ? 'borderless' : variant\n const [searchValue, setSearchValue] = useState('')\n const [focusTrigger, setFocusTrigger] = useState(defaultOpen ? 1 : 0)\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const inputRef = useRef<InputRef>(null)\n const measureSpanRef = useRef<HTMLSpanElement>(null)\n const [measuredWidth, setMeasuredWidth] = useState<number>()\n\n const displayText = useMemo(() => {\n if (multiple && value.length > 0) {\n return renderLabel(value.length)\n }\n if (!multiple && value) {\n const option = getAllOptions(options).find((opt) => opt.value === value)\n return option ? String(option.label) : String(value)\n }\n return formControlPlaceholder ?? ''\n }, [multiple, value, options, renderLabel, formControlPlaceholder])\n\n useEffect(() => {\n if (!measureSpanRef.current) return\n // padding (22px = 11px each side) + arrow (18px) + border (6px)\n setMeasuredWidth(Math.ceil(measureSpanRef.current.offsetWidth) + 46)\n }, [displayText])\n\n useEffect(() => {\n if (focusTrigger > 0) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n inputRef.current?.focus({ cursor: 'end' })\n }, 100)\n })\n })\n }\n }, [focusTrigger])\n\n const filteredOptions = useMemo(() => {\n return filterOptions(options, searchValue)\n }, [searchValue, options])\n\n const flatFilteredOptions = useMemo(() => {\n return getAllOptions(filteredOptions)\n }, [filteredOptions])\n\n const allFlatOptions = useMemo(() => {\n return getAllOptions(options)\n }, [options])\n\n const handleTagClose = (removedValue: string) => {\n if (!multiple) return\n\n onChange(value.filter((x) => x !== removedValue))\n }\n\n const handleToggleAll = () => {\n if (!multiple) return\n\n const allFilteredValues = getAllOptions(filteredOptions).map(\n (opt) => opt.value as string\n )\n const someSelected = allFilteredValues.some((val) => value.includes(val))\n\n if (someSelected) {\n onChange(value.filter((val) => !allFilteredValues.includes(val)))\n }\n }\n\n const handleSelectFirstOption = () => {\n if (flatFilteredOptions.length === 0) return\n\n const firstOption = flatFilteredOptions[0]\n if (!firstOption) return\n\n const optionValue = firstOption.value as string\n\n if (multiple) {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n } else {\n onChange(optionValue)\n handleOpenChange(false)\n }\n }\n\n const handleOptionClick = (optionValue: string) => {\n if (multiple) {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n } else {\n onChange(optionValue)\n handleOpenChange(false)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Allow these navigation keys to bubble up to Select's native keyboard handler\n const navigationKeys = ['ArrowUp', 'ArrowDown']\n\n // Handle Enter - select first filtered option (custom behavior)\n if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n handleSelectFirstOption()\n return\n }\n\n // Handle Escape - close dropdown (custom behavior)\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n handleOpenChange(false)\n return\n }\n\n // For arrow keys, prevent cursor movement but allow propagation to Select\n if (navigationKeys.includes(e.key)) {\n e.preventDefault() // Prevents cursor from moving to start/end of input text\n // Do NOT call stopPropagation() - let event bubble to Select component\n return\n }\n\n // For all other keys (including Backspace), stop propagation\n // This prevents backspace from removing tags in multiple mode\n e.stopPropagation()\n }\n\n const optionRender: NonNullable<\n SelectProps<string | string[], SelectOption>['optionRender']\n > = (option) => {\n if ('logo' in option.data && option.data.logo) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-4 shrink-0\">{option.data.logo}</div>\n <span className=\"overflow-ellipsis overflow-hidden\">\n {option.label}\n </span>\n </div>\n )\n }\n return <div>{option.label}</div>\n }\n\n const popupRender = (menu: React.ReactElement) => {\n const valueToLabel = (val: string) => {\n const option = allFlatOptions.find((opt) => opt.value === val)\n return option ? (option.label as string) : val\n }\n\n return (\n <div>\n <div className=\"mb-2 px-2 pb-2 border-b -mx-1 mt-1\">\n <Input\n ref={inputRef}\n key={focusTrigger}\n autoFocus\n placeholder={searchPlaceholder || 'Search...'}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n e.stopPropagation()\n e.preventDefault()\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n prefix={\n <icons.MagnifyingGlassIcon\n size={16}\n className=\"text-j2-text-placeholder\"\n />\n }\n allowClear\n />\n </div>\n {multiple && value.length > 0 ? (\n <div className=\"px-2 pb-2\">\n <div className=\"flex flex-wrap gap-y-1\">\n {(value as string[]).map((value) => (\n <Tag\n className=\"opacity-100 z-10 flex max-w-full\"\n key={value}\n status=\"default\"\n closable\n onClose={() => handleTagClose(value)}\n >\n <span\n className=\"overflow-ellipsis overflow-hidden\"\n title={valueToLabel(value)}\n >\n {valueToLabel(value)}\n </span>\n </Tag>\n ))}\n </div>\n </div>\n ) : null}\n <div\n className={cx(styles.menuContainer, 'rounded-lg', {\n [styles.headlinedMenuContainer]: isHeadline,\n [styles.menuContainerMultiple]: multiple,\n })}\n >\n {/* Keyed on the search so antd rebuilds its option list per\n keystroke. Focusing the search input blurs the Select, antd\n starts a close, cancels it because focus stayed in the popup,\n and never clears its `lockOptions` flag -- a locked list keeps\n showing the options it had when the popup opened. */}\n <Fragment key={searchValue}>{menu}</Fragment>\n </div>\n <div className=\"flex justify-between items-center\">\n {multiple && (\n <div className=\"w-full mt-1 pt-1 border-t border-j2-border-secondary\">\n <div\n aria-selected=\"false\"\n className={cx(\n 'ant-select-item ant-select-item-option w-full',\n styles.clearAllButton\n )}\n title=\"Clear all\"\n onClick={handleToggleAll}\n >\n <div className=\"ant-select-item-option-content text-center font-semibold\">\n Clear all\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open)\n if (open) {\n // Trigger focus by updating the counter\n setFocusTrigger((prev) => prev + 1)\n } else {\n setSearchValue('')\n }\n }\n\n const renderDropdownOptionRow = (option: Option) => {\n const optionValue = option.value as string\n const isSelected = multiple\n ? value.includes(optionValue)\n : value === optionValue\n const hasLogo = 'logo' in option && (option as OptionWithLogo).logo\n return (\n <div\n key={optionValue}\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => handleOptionClick(optionValue)}\n className={cx(\n 'px-3 py-1.5 rounded cursor-pointer text-sm',\n isSelected\n ? 'bg-[var(--j2-color-primary)] text-white hover:bg-[var(--j2-color-primary)]'\n : 'hover:bg-[var(--j2-color-bg-hover)]'\n )}\n >\n {hasLogo ? (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-4 shrink-0\">\n {(option as OptionWithLogo).logo}\n </div>\n <span className=\"overflow-hidden overflow-ellipsis\">\n {option.label}\n </span>\n </div>\n ) : (\n option.label\n )}\n </div>\n )\n }\n\n const dropdownPopupRender = () => {\n const valueToLabel = (val: string) => {\n const option = allFlatOptions.find((opt) => opt.value === val)\n return option ? (option.label as string) : val\n }\n\n return (\n <div className=\"bg-white rounded-lg shadow-md p-2 min-w-[240px]\">\n <div className=\"pb-2 border-b border-j2-border-secondary\">\n <Input\n ref={inputRef}\n key={focusTrigger}\n autoFocus\n placeholder={searchPlaceholder || 'Search...'}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n e.stopPropagation()\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n prefix={\n <icons.MagnifyingGlassIcon\n size={16}\n className=\"text-j2-text-placeholder\"\n />\n }\n allowClear\n />\n </div>\n {multiple && value.length > 0 && (\n <div className=\"px-1 pt-2\">\n <div className=\"flex flex-wrap gap-y-1\">\n {(value as string[]).map((v) => (\n <Tag\n className=\"opacity-100 z-10 flex max-w-full\"\n key={v}\n status=\"default\"\n closable\n onClose={() => handleTagClose(v)}\n >\n <span\n className=\"overflow-ellipsis overflow-hidden\"\n title={valueToLabel(v)}\n >\n {valueToLabel(v)}\n </span>\n </Tag>\n ))}\n </div>\n </div>\n )}\n <div\n className=\"max-h-72 overflow-y-auto py-1\"\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-[var(--j2-color-text-secondary)]\">\n No options found\n </div>\n ) : (\n filteredOptions.map((opt) => {\n if (isGroupOption(opt)) {\n return (\n <div key={`group-${opt.label}`}>\n <div className=\"px-3 pt-2 pb-1 text-xs font-semibold uppercase tracking-wide text-[var(--j2-color-text-tertiary)]\">\n {opt.label}\n </div>\n {opt.options.map(renderDropdownOptionRow)}\n </div>\n )\n }\n return renderDropdownOptionRow(opt)\n })\n )}\n </div>\n {multiple && value.length > 0 && (\n <div className=\"mt-1 pt-1 border-t border-j2-border-secondary\">\n <div\n role=\"button\"\n aria-label=\"Clear all\"\n title=\"Clear all\"\n onClick={handleToggleAll}\n className={cx(\n 'text-center font-semibold text-sm py-1.5 rounded cursor-pointer',\n styles.clearAllButton\n )}\n >\n Clear all\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (trigger === 'dropdown') {\n const hasSelection = multiple ? value.length > 0 : Boolean(value)\n const triggerContent = (\n <span className=\"inline-flex items-center gap-1\">\n {hasSelection ? displayText : (formControlPlaceholder ?? 'Select')}\n {loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : (\n <icons.CaretDownIcon weight=\"regular\" data-testid=\"caret-down\" />\n )}\n </span>\n )\n\n return (\n <AntdDropdown\n open={isOpen}\n onOpenChange={handleOpenChange}\n trigger={['click']}\n disabled={props.disabled}\n popupRender={dropdownPopupRender}\n >\n <Typography.Link\n disabled={props.disabled}\n className={cx('inline-flex', rootClassName)}\n >\n {triggerContent}\n </Typography.Link>\n </AntdDropdown>\n )\n }\n\n return (\n <>\n <span\n ref={measureSpanRef}\n aria-hidden\n style={{\n position: 'absolute',\n visibility: 'hidden',\n whiteSpace: 'nowrap',\n fontSize: 'inherit',\n }}\n >\n {displayText}\n </span>\n <Select<string | string[], SelectOption>\n open={isOpen}\n showSearch={false}\n style={{ width: measuredWidth }}\n suffixIcon={\n loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : (\n <icons.CaretDownIcon size={14} data-testid=\"caret-down\" />\n )\n }\n placeholder={formControlPlaceholder}\n mode={multiple ? 'multiple' : undefined}\n value={value}\n maxTagCount={0}\n maxTagPlaceholder={multiple ? () => renderLabel(value.length) : value}\n options={filteredOptions}\n onChange={(val) => {\n if (multiple) {\n if (Array.isArray(val)) {\n onChange(val)\n } else {\n throw new Error('Value should be an array in multiple mode')\n }\n } else {\n if (typeof val === 'string') {\n onChange(val)\n } else {\n throw new Error(\n 'Value should be a string in single selection mode'\n )\n }\n }\n }}\n popupRender={popupRender}\n optionRender={optionRender}\n onOpenChange={handleOpenChange}\n classNames={{\n root: cx(rootClassName, styles.summarizedSelect, {\n [styles.hemisphericSelect]:\n variant !== 'underlined' && variant !== 'headlined',\n [styles.isActive]:\n multiple &&\n value.length > 0 &&\n variant !== 'underlined' &&\n variant !== 'headlined',\n [styles.headlinedSelect]: isHeadline,\n }),\n popup: { root: popupClassName },\n }}\n variant={antVariant}\n {...props}\n />\n </>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SummarizedSelect.cjs","names":["useState","useRef","useMemo","Input","MagnifyingGlassIcon","Tag","cx","styles","Fragment","Spin","LoadingOutlined","CaretDownIcon","AntdDropdown","Typography","_Fragment","Select"],"sources":["../../../../src/components/select/SummarizedSelect.tsx"],"sourcesContent":["import {\n Dropdown as AntdDropdown,\n Select,\n Spin,\n Input,\n SelectProps,\n InputRef,\n Typography,\n} from 'antd'\nimport { DefaultOptionType } from 'antd/es/select'\nimport { Fragment, useState, useMemo, useRef, useEffect } from 'react'\nimport { LoadingOutlined } from '@ant-design/icons'\nimport { CaretDownIcon, MagnifyingGlassIcon } from '@phosphor-icons/react'\nimport { Tag } from '../tag'\nimport cx from 'classnames'\n\nimport styles from './SummarizedSelect.module.css'\n\ntype Option = DefaultOptionType\ntype OptionWithLogo = Option & {\n logo: React.ReactNode\n}\n\ntype GroupOption = {\n label: string\n options: Option[]\n}\n\nexport type SelectOption = Option | GroupOption | OptionWithLogo\n\nexport type SummarizedSelectVariant = SelectProps['variant'] | 'headlined'\n\nexport type SummarizedSelectTrigger = 'select' | 'dropdown'\n\ntype BaseProps = Omit<\n SelectProps<string | string[], SelectOption>,\n 'mode' | 'value' | 'onChange' | 'variant'\n> & {\n searchPlaceholder?: string\n formControlPlaceholder?: string\n rootClassName?: string\n popupClassName?: string\n variant?: SummarizedSelectVariant\n /**\n * Shape of the control that opens the popup.\n * - `'select'` (default): antd Select, styled by `variant`.\n * - `'dropdown'`: antd Dropdown with a `Typography.Link` target (label + caret).\n * Ignores `variant` — the trigger is always a link.\n */\n trigger?: SummarizedSelectTrigger\n defaultOpen?: boolean\n\n loading?: boolean\n}\n\ntype SingleProps = {\n multiple?: false\n renderLabel?: undefined\n value: string | undefined\n onChange: (newValue: string) => void\n}\n\ntype MultiProps = {\n multiple: true\n renderLabel: (count: number) => string\n value: string[]\n onChange: (newValue: string[]) => void\n}\n\nexport type Props = BaseProps & (SingleProps | MultiProps)\n\nconst isGroupOption = (option: SelectOption): option is GroupOption => {\n return 'options' in option\n}\n\nconst getAllOptions = (options: SelectOption[] | undefined): Option[] => {\n if (!options) return []\n\n return options.flatMap((option) =>\n isGroupOption(option) ? option.options : [option]\n )\n}\n\nconst filterOptions = (\n options: SelectOption[] | undefined,\n searchValue: string\n): SelectOption[] => {\n if (!options) return []\n if (!searchValue) return options\n\n return options\n .map((option) => {\n if (isGroupOption(option)) {\n const filteredSubOptions = option.options.filter((subOption) =>\n subOption.label\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase())\n )\n return filteredSubOptions.length > 0\n ? { ...option, options: filteredSubOptions }\n : null\n } else {\n return option.label\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase())\n ? option\n : null\n }\n })\n .filter((option): option is SelectOption => option !== null)\n}\n\nexport function SummarizedSelect({\n searchPlaceholder,\n formControlPlaceholder,\n loading,\n multiple,\n value,\n onChange,\n options,\n renderLabel,\n rootClassName,\n popupClassName,\n variant,\n trigger = 'select',\n defaultOpen = false,\n ...props\n}: Props) {\n const isHeadline = variant === 'headlined'\n const antVariant = isHeadline ? 'borderless' : variant\n const [searchValue, setSearchValue] = useState('')\n const [focusTrigger, setFocusTrigger] = useState(defaultOpen ? 1 : 0)\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const inputRef = useRef<InputRef>(null)\n const measureSpanRef = useRef<HTMLSpanElement>(null)\n const [measuredWidth, setMeasuredWidth] = useState<number>()\n\n const displayText = useMemo(() => {\n if (multiple && value.length > 0) {\n return renderLabel(value.length)\n }\n if (!multiple && value) {\n const option = getAllOptions(options).find((opt) => opt.value === value)\n return option ? String(option.label) : String(value)\n }\n return formControlPlaceholder ?? ''\n }, [multiple, value, options, renderLabel, formControlPlaceholder])\n\n useEffect(() => {\n if (!measureSpanRef.current) return\n // padding (22px = 11px each side) + arrow (18px) + border (6px)\n setMeasuredWidth(Math.ceil(measureSpanRef.current.offsetWidth) + 46)\n }, [displayText])\n\n useEffect(() => {\n if (focusTrigger > 0) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n inputRef.current?.focus({ cursor: 'end' })\n }, 100)\n })\n })\n }\n }, [focusTrigger])\n\n const filteredOptions = useMemo(() => {\n return filterOptions(options, searchValue)\n }, [searchValue, options])\n\n const flatFilteredOptions = useMemo(() => {\n return getAllOptions(filteredOptions)\n }, [filteredOptions])\n\n const allFlatOptions = useMemo(() => {\n return getAllOptions(options)\n }, [options])\n\n const handleTagClose = (removedValue: string) => {\n if (!multiple) return\n\n onChange(value.filter((x) => x !== removedValue))\n }\n\n const handleToggleAll = () => {\n if (!multiple) return\n\n const allFilteredValues = getAllOptions(filteredOptions).map(\n (opt) => opt.value as string\n )\n const someSelected = allFilteredValues.some((val) => value.includes(val))\n\n if (someSelected) {\n onChange(value.filter((val) => !allFilteredValues.includes(val)))\n }\n }\n\n const handleSelectFirstOption = () => {\n if (flatFilteredOptions.length === 0) return\n\n const firstOption = flatFilteredOptions[0]\n if (!firstOption) return\n\n const optionValue = firstOption.value as string\n\n if (multiple) {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n } else {\n onChange(optionValue)\n handleOpenChange(false)\n }\n }\n\n const handleOptionClick = (optionValue: string) => {\n if (multiple) {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n } else {\n onChange(optionValue)\n handleOpenChange(false)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Allow these navigation keys to bubble up to Select's native keyboard handler\n const navigationKeys = ['ArrowUp', 'ArrowDown']\n\n // Handle Enter - select first filtered option (custom behavior)\n if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n handleSelectFirstOption()\n return\n }\n\n // Handle Escape - close dropdown (custom behavior)\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n handleOpenChange(false)\n return\n }\n\n // For arrow keys, prevent cursor movement but allow propagation to Select\n if (navigationKeys.includes(e.key)) {\n e.preventDefault() // Prevents cursor from moving to start/end of input text\n // Do NOT call stopPropagation() - let event bubble to Select component\n return\n }\n\n // For all other keys (including Backspace), stop propagation\n // This prevents backspace from removing tags in multiple mode\n e.stopPropagation()\n }\n\n const optionRender: NonNullable<\n SelectProps<string | string[], SelectOption>['optionRender']\n > = (option) => {\n if ('logo' in option.data && option.data.logo) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-4 shrink-0\">{option.data.logo}</div>\n <span className=\"overflow-ellipsis overflow-hidden\">\n {option.label}\n </span>\n </div>\n )\n }\n return <div>{option.label}</div>\n }\n\n const popupRender = (menu: React.ReactElement) => {\n const valueToLabel = (val: string) => {\n const option = allFlatOptions.find((opt) => opt.value === val)\n return option ? (option.label as string) : val\n }\n\n return (\n <div>\n <div className=\"mb-2 px-2 pb-2 border-b -mx-1 mt-1\">\n <Input\n ref={inputRef}\n key={focusTrigger}\n autoFocus\n placeholder={searchPlaceholder || 'Search...'}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n e.stopPropagation()\n e.preventDefault()\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n prefix={\n <MagnifyingGlassIcon\n size={16}\n className=\"text-j2-text-placeholder\"\n />\n }\n allowClear\n />\n </div>\n {multiple && value.length > 0 ? (\n <div className=\"px-2 pb-2\">\n <div className=\"flex flex-wrap gap-y-1\">\n {(value as string[]).map((value) => (\n <Tag\n className=\"opacity-100 z-10 flex max-w-full\"\n key={value}\n status=\"default\"\n closable\n onClose={() => handleTagClose(value)}\n >\n <span\n className=\"overflow-ellipsis overflow-hidden\"\n title={valueToLabel(value)}\n >\n {valueToLabel(value)}\n </span>\n </Tag>\n ))}\n </div>\n </div>\n ) : null}\n <div\n className={cx(styles.menuContainer, 'rounded-lg', {\n [styles.headlinedMenuContainer]: isHeadline,\n [styles.menuContainerMultiple]: multiple,\n })}\n >\n {/* Keyed on the search so antd rebuilds its option list per\n keystroke. Focusing the search input blurs the Select, antd\n starts a close, cancels it because focus stayed in the popup,\n and never clears its `lockOptions` flag -- a locked list keeps\n showing the options it had when the popup opened. */}\n <Fragment key={searchValue}>{menu}</Fragment>\n </div>\n <div className=\"flex justify-between items-center\">\n {multiple && (\n <div className=\"w-full mt-1 pt-1 border-t border-j2-border-secondary\">\n <div\n aria-selected=\"false\"\n className={cx(\n 'ant-select-item ant-select-item-option w-full',\n styles.clearAllButton\n )}\n title=\"Clear all\"\n onClick={handleToggleAll}\n >\n <div className=\"ant-select-item-option-content text-center font-semibold\">\n Clear all\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open)\n if (open) {\n // Trigger focus by updating the counter\n setFocusTrigger((prev) => prev + 1)\n } else {\n setSearchValue('')\n }\n }\n\n const renderDropdownOptionRow = (option: Option) => {\n const optionValue = option.value as string\n const isSelected = multiple\n ? value.includes(optionValue)\n : value === optionValue\n const hasLogo = 'logo' in option && (option as OptionWithLogo).logo\n return (\n <div\n key={optionValue}\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => handleOptionClick(optionValue)}\n className={cx(\n 'px-3 py-1.5 rounded cursor-pointer text-sm',\n isSelected\n ? 'bg-[var(--j2-color-primary)] text-white hover:bg-[var(--j2-color-primary)]'\n : 'hover:bg-[var(--j2-color-bg-hover)]'\n )}\n >\n {hasLogo ? (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-4 shrink-0\">\n {(option as OptionWithLogo).logo}\n </div>\n <span className=\"overflow-hidden overflow-ellipsis\">\n {option.label}\n </span>\n </div>\n ) : (\n option.label\n )}\n </div>\n )\n }\n\n const dropdownPopupRender = () => {\n const valueToLabel = (val: string) => {\n const option = allFlatOptions.find((opt) => opt.value === val)\n return option ? (option.label as string) : val\n }\n\n return (\n <div className=\"bg-white rounded-lg shadow-md p-2 min-w-[240px]\">\n <div className=\"pb-2 border-b border-j2-border-secondary\">\n <Input\n ref={inputRef}\n key={focusTrigger}\n autoFocus\n placeholder={searchPlaceholder || 'Search...'}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n e.stopPropagation()\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n prefix={\n <MagnifyingGlassIcon\n size={16}\n className=\"text-j2-text-placeholder\"\n />\n }\n allowClear\n />\n </div>\n {multiple && value.length > 0 && (\n <div className=\"px-1 pt-2\">\n <div className=\"flex flex-wrap gap-y-1\">\n {(value as string[]).map((v) => (\n <Tag\n className=\"opacity-100 z-10 flex max-w-full\"\n key={v}\n status=\"default\"\n closable\n onClose={() => handleTagClose(v)}\n >\n <span\n className=\"overflow-ellipsis overflow-hidden\"\n title={valueToLabel(v)}\n >\n {valueToLabel(v)}\n </span>\n </Tag>\n ))}\n </div>\n </div>\n )}\n <div\n className=\"max-h-72 overflow-y-auto py-1\"\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-[var(--j2-color-text-secondary)]\">\n No options found\n </div>\n ) : (\n filteredOptions.map((opt) => {\n if (isGroupOption(opt)) {\n return (\n <div key={`group-${opt.label}`}>\n <div className=\"px-3 pt-2 pb-1 text-xs font-semibold uppercase tracking-wide text-[var(--j2-color-text-tertiary)]\">\n {opt.label}\n </div>\n {opt.options.map(renderDropdownOptionRow)}\n </div>\n )\n }\n return renderDropdownOptionRow(opt)\n })\n )}\n </div>\n {multiple && value.length > 0 && (\n <div className=\"mt-1 pt-1 border-t border-j2-border-secondary\">\n <div\n role=\"button\"\n aria-label=\"Clear all\"\n title=\"Clear all\"\n onClick={handleToggleAll}\n className={cx(\n 'text-center font-semibold text-sm py-1.5 rounded cursor-pointer',\n styles.clearAllButton\n )}\n >\n Clear all\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (trigger === 'dropdown') {\n const hasSelection = multiple ? value.length > 0 : Boolean(value)\n const triggerContent = (\n <span className=\"inline-flex items-center gap-1\">\n {hasSelection ? displayText : (formControlPlaceholder ?? 'Select')}\n {loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : (\n <CaretDownIcon weight=\"regular\" data-testid=\"caret-down\" />\n )}\n </span>\n )\n\n return (\n <AntdDropdown\n open={isOpen}\n onOpenChange={handleOpenChange}\n trigger={['click']}\n disabled={props.disabled}\n popupRender={dropdownPopupRender}\n >\n <Typography.Link\n disabled={props.disabled}\n className={cx('inline-flex', rootClassName)}\n >\n {triggerContent}\n </Typography.Link>\n </AntdDropdown>\n )\n }\n\n return (\n <>\n <span\n ref={measureSpanRef}\n aria-hidden\n style={{\n position: 'absolute',\n visibility: 'hidden',\n whiteSpace: 'nowrap',\n fontSize: 'inherit',\n }}\n >\n {displayText}\n </span>\n <Select<string | string[], SelectOption>\n open={isOpen}\n showSearch={false}\n style={{ width: measuredWidth }}\n suffixIcon={\n loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : (\n <CaretDownIcon size={14} data-testid=\"caret-down\" />\n )\n }\n placeholder={formControlPlaceholder}\n mode={multiple ? 'multiple' : undefined}\n value={value}\n maxTagCount={0}\n maxTagPlaceholder={multiple ? () => renderLabel(value.length) : value}\n options={filteredOptions}\n onChange={(val) => {\n if (multiple) {\n if (Array.isArray(val)) {\n onChange(val)\n } else {\n throw new Error('Value should be an array in multiple mode')\n }\n } else {\n if (typeof val === 'string') {\n onChange(val)\n } else {\n throw new Error(\n 'Value should be a string in single selection mode'\n )\n }\n }\n }}\n popupRender={popupRender}\n optionRender={optionRender}\n onOpenChange={handleOpenChange}\n classNames={{\n root: cx(rootClassName, styles.summarizedSelect, {\n [styles.hemisphericSelect]:\n variant !== 'underlined' && variant !== 'headlined',\n [styles.isActive]:\n multiple &&\n value.length > 0 &&\n variant !== 'underlined' &&\n variant !== 'headlined',\n [styles.headlinedSelect]: isHeadline,\n }),\n popup: { root: popupClassName },\n }}\n variant={antVariant}\n {...props}\n />\n </>\n )\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { icons_exports } from "../icons/index.js";
2
1
  import { Tag as Tag$1 } from "../tag/Tag.js";
3
2
  import SummarizedSelect_module_default from "./SummarizedSelect.module.css.js";
4
3
  import { Fragment, useEffect, useMemo, useRef, useState } from "react";
5
4
  import { Dropdown, Input, Select, Spin, Typography } from "antd";
5
+ import { CaretDownIcon, MagnifyingGlassIcon } from "@phosphor-icons/react";
6
6
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  import cx from "classnames";
8
8
  import { LoadingOutlined } from "@ant-design/icons";
@@ -156,7 +156,7 @@ function SummarizedSelect({ searchPlaceholder, formControlPlaceholder, loading,
156
156
  },
157
157
  onKeyDown: handleKeyDown,
158
158
  onClick: (e) => e.stopPropagation(),
159
- prefix: /* @__PURE__ */ jsx(icons_exports.MagnifyingGlassIcon, {
159
+ prefix: /* @__PURE__ */ jsx(MagnifyingGlassIcon, {
160
160
  size: 16,
161
161
  className: "text-j2-text-placeholder"
162
162
  }),
@@ -252,7 +252,7 @@ function SummarizedSelect({ searchPlaceholder, formControlPlaceholder, loading,
252
252
  },
253
253
  onKeyDown: handleKeyDown,
254
254
  onClick: (e) => e.stopPropagation(),
255
- prefix: /* @__PURE__ */ jsx(icons_exports.MagnifyingGlassIcon, {
255
+ prefix: /* @__PURE__ */ jsx(MagnifyingGlassIcon, {
256
256
  size: 16,
257
257
  className: "text-j2-text-placeholder"
258
258
  }),
@@ -313,7 +313,7 @@ function SummarizedSelect({ searchPlaceholder, formControlPlaceholder, loading,
313
313
  indicator: /* @__PURE__ */ jsx(LoadingOutlined, { spin: true }),
314
314
  size: "small",
315
315
  "data-testid": "loading-spinner"
316
- }) : /* @__PURE__ */ jsx(icons_exports.CaretDownIcon, {
316
+ }) : /* @__PURE__ */ jsx(CaretDownIcon, {
317
317
  weight: "regular",
318
318
  "data-testid": "caret-down"
319
319
  })]
@@ -349,7 +349,7 @@ function SummarizedSelect({ searchPlaceholder, formControlPlaceholder, loading,
349
349
  indicator: /* @__PURE__ */ jsx(LoadingOutlined, { spin: true }),
350
350
  size: "small",
351
351
  "data-testid": "loading-spinner"
352
- }) : /* @__PURE__ */ jsx(icons_exports.CaretDownIcon, {
352
+ }) : /* @__PURE__ */ jsx(CaretDownIcon, {
353
353
  size: 14,
354
354
  "data-testid": "caret-down"
355
355
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"SummarizedSelect.js","names":["icons","Tag","styles","AntdDropdown","_Fragment"],"sources":["../../../../src/components/select/SummarizedSelect.tsx"],"sourcesContent":["import {\n Dropdown as AntdDropdown,\n Select,\n Spin,\n Input,\n SelectProps,\n InputRef,\n Typography,\n} from 'antd'\nimport { DefaultOptionType } from 'antd/es/select'\nimport { Fragment, useState, useMemo, useRef, useEffect } from 'react'\nimport { LoadingOutlined } from '@ant-design/icons'\nimport * as icons from '../icons'\nimport { Tag } from '../tag'\nimport cx from 'classnames'\n\nimport styles from './SummarizedSelect.module.css'\n\ntype Option = DefaultOptionType\ntype OptionWithLogo = Option & {\n logo: React.ReactNode\n}\n\ntype GroupOption = {\n label: string\n options: Option[]\n}\n\nexport type SelectOption = Option | GroupOption | OptionWithLogo\n\nexport type SummarizedSelectVariant = SelectProps['variant'] | 'headlined'\n\nexport type SummarizedSelectTrigger = 'select' | 'dropdown'\n\ntype BaseProps = Omit<\n SelectProps<string | string[], SelectOption>,\n 'mode' | 'value' | 'onChange' | 'variant'\n> & {\n searchPlaceholder?: string\n formControlPlaceholder?: string\n rootClassName?: string\n popupClassName?: string\n variant?: SummarizedSelectVariant\n /**\n * Shape of the control that opens the popup.\n * - `'select'` (default): antd Select, styled by `variant`.\n * - `'dropdown'`: antd Dropdown with a `Typography.Link` target (label + caret).\n * Ignores `variant` — the trigger is always a link.\n */\n trigger?: SummarizedSelectTrigger\n defaultOpen?: boolean\n\n loading?: boolean\n}\n\ntype SingleProps = {\n multiple?: false\n renderLabel?: undefined\n value: string | undefined\n onChange: (newValue: string) => void\n}\n\ntype MultiProps = {\n multiple: true\n renderLabel: (count: number) => string\n value: string[]\n onChange: (newValue: string[]) => void\n}\n\nexport type Props = BaseProps & (SingleProps | MultiProps)\n\nconst isGroupOption = (option: SelectOption): option is GroupOption => {\n return 'options' in option\n}\n\nconst getAllOptions = (options: SelectOption[] | undefined): Option[] => {\n if (!options) return []\n\n return options.flatMap((option) =>\n isGroupOption(option) ? option.options : [option]\n )\n}\n\nconst filterOptions = (\n options: SelectOption[] | undefined,\n searchValue: string\n): SelectOption[] => {\n if (!options) return []\n if (!searchValue) return options\n\n return options\n .map((option) => {\n if (isGroupOption(option)) {\n const filteredSubOptions = option.options.filter((subOption) =>\n subOption.label\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase())\n )\n return filteredSubOptions.length > 0\n ? { ...option, options: filteredSubOptions }\n : null\n } else {\n return option.label\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase())\n ? option\n : null\n }\n })\n .filter((option): option is SelectOption => option !== null)\n}\n\nexport function SummarizedSelect({\n searchPlaceholder,\n formControlPlaceholder,\n loading,\n multiple,\n value,\n onChange,\n options,\n renderLabel,\n rootClassName,\n popupClassName,\n variant,\n trigger = 'select',\n defaultOpen = false,\n ...props\n}: Props) {\n const isHeadline = variant === 'headlined'\n const antVariant = isHeadline ? 'borderless' : variant\n const [searchValue, setSearchValue] = useState('')\n const [focusTrigger, setFocusTrigger] = useState(defaultOpen ? 1 : 0)\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const inputRef = useRef<InputRef>(null)\n const measureSpanRef = useRef<HTMLSpanElement>(null)\n const [measuredWidth, setMeasuredWidth] = useState<number>()\n\n const displayText = useMemo(() => {\n if (multiple && value.length > 0) {\n return renderLabel(value.length)\n }\n if (!multiple && value) {\n const option = getAllOptions(options).find((opt) => opt.value === value)\n return option ? String(option.label) : String(value)\n }\n return formControlPlaceholder ?? ''\n }, [multiple, value, options, renderLabel, formControlPlaceholder])\n\n useEffect(() => {\n if (!measureSpanRef.current) return\n // padding (22px = 11px each side) + arrow (18px) + border (6px)\n setMeasuredWidth(Math.ceil(measureSpanRef.current.offsetWidth) + 46)\n }, [displayText])\n\n useEffect(() => {\n if (focusTrigger > 0) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n inputRef.current?.focus({ cursor: 'end' })\n }, 100)\n })\n })\n }\n }, [focusTrigger])\n\n const filteredOptions = useMemo(() => {\n return filterOptions(options, searchValue)\n }, [searchValue, options])\n\n const flatFilteredOptions = useMemo(() => {\n return getAllOptions(filteredOptions)\n }, [filteredOptions])\n\n const allFlatOptions = useMemo(() => {\n return getAllOptions(options)\n }, [options])\n\n const handleTagClose = (removedValue: string) => {\n if (!multiple) return\n\n onChange(value.filter((x) => x !== removedValue))\n }\n\n const handleToggleAll = () => {\n if (!multiple) return\n\n const allFilteredValues = getAllOptions(filteredOptions).map(\n (opt) => opt.value as string\n )\n const someSelected = allFilteredValues.some((val) => value.includes(val))\n\n if (someSelected) {\n onChange(value.filter((val) => !allFilteredValues.includes(val)))\n }\n }\n\n const handleSelectFirstOption = () => {\n if (flatFilteredOptions.length === 0) return\n\n const firstOption = flatFilteredOptions[0]\n if (!firstOption) return\n\n const optionValue = firstOption.value as string\n\n if (multiple) {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n } else {\n onChange(optionValue)\n handleOpenChange(false)\n }\n }\n\n const handleOptionClick = (optionValue: string) => {\n if (multiple) {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n } else {\n onChange(optionValue)\n handleOpenChange(false)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Allow these navigation keys to bubble up to Select's native keyboard handler\n const navigationKeys = ['ArrowUp', 'ArrowDown']\n\n // Handle Enter - select first filtered option (custom behavior)\n if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n handleSelectFirstOption()\n return\n }\n\n // Handle Escape - close dropdown (custom behavior)\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n handleOpenChange(false)\n return\n }\n\n // For arrow keys, prevent cursor movement but allow propagation to Select\n if (navigationKeys.includes(e.key)) {\n e.preventDefault() // Prevents cursor from moving to start/end of input text\n // Do NOT call stopPropagation() - let event bubble to Select component\n return\n }\n\n // For all other keys (including Backspace), stop propagation\n // This prevents backspace from removing tags in multiple mode\n e.stopPropagation()\n }\n\n const optionRender: NonNullable<\n SelectProps<string | string[], SelectOption>['optionRender']\n > = (option) => {\n if ('logo' in option.data && option.data.logo) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-4 shrink-0\">{option.data.logo}</div>\n <span className=\"overflow-ellipsis overflow-hidden\">\n {option.label}\n </span>\n </div>\n )\n }\n return <div>{option.label}</div>\n }\n\n const popupRender = (menu: React.ReactElement) => {\n const valueToLabel = (val: string) => {\n const option = allFlatOptions.find((opt) => opt.value === val)\n return option ? (option.label as string) : val\n }\n\n return (\n <div>\n <div className=\"mb-2 px-2 pb-2 border-b -mx-1 mt-1\">\n <Input\n ref={inputRef}\n key={focusTrigger}\n autoFocus\n placeholder={searchPlaceholder || 'Search...'}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n e.stopPropagation()\n e.preventDefault()\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n prefix={\n <icons.MagnifyingGlassIcon\n size={16}\n className=\"text-j2-text-placeholder\"\n />\n }\n allowClear\n />\n </div>\n {multiple && value.length > 0 ? (\n <div className=\"px-2 pb-2\">\n <div className=\"flex flex-wrap gap-y-1\">\n {(value as string[]).map((value) => (\n <Tag\n className=\"opacity-100 z-10 flex max-w-full\"\n key={value}\n status=\"default\"\n closable\n onClose={() => handleTagClose(value)}\n >\n <span\n className=\"overflow-ellipsis overflow-hidden\"\n title={valueToLabel(value)}\n >\n {valueToLabel(value)}\n </span>\n </Tag>\n ))}\n </div>\n </div>\n ) : null}\n <div\n className={cx(styles.menuContainer, 'rounded-lg', {\n [styles.headlinedMenuContainer]: isHeadline,\n [styles.menuContainerMultiple]: multiple,\n })}\n >\n {/* Keyed on the search so antd rebuilds its option list per\n keystroke. Focusing the search input blurs the Select, antd\n starts a close, cancels it because focus stayed in the popup,\n and never clears its `lockOptions` flag -- a locked list keeps\n showing the options it had when the popup opened. */}\n <Fragment key={searchValue}>{menu}</Fragment>\n </div>\n <div className=\"flex justify-between items-center\">\n {multiple && (\n <div className=\"w-full mt-1 pt-1 border-t border-j2-border-secondary\">\n <div\n aria-selected=\"false\"\n className={cx(\n 'ant-select-item ant-select-item-option w-full',\n styles.clearAllButton\n )}\n title=\"Clear all\"\n onClick={handleToggleAll}\n >\n <div className=\"ant-select-item-option-content text-center font-semibold\">\n Clear all\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open)\n if (open) {\n // Trigger focus by updating the counter\n setFocusTrigger((prev) => prev + 1)\n } else {\n setSearchValue('')\n }\n }\n\n const renderDropdownOptionRow = (option: Option) => {\n const optionValue = option.value as string\n const isSelected = multiple\n ? value.includes(optionValue)\n : value === optionValue\n const hasLogo = 'logo' in option && (option as OptionWithLogo).logo\n return (\n <div\n key={optionValue}\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => handleOptionClick(optionValue)}\n className={cx(\n 'px-3 py-1.5 rounded cursor-pointer text-sm',\n isSelected\n ? 'bg-[var(--j2-color-primary)] text-white hover:bg-[var(--j2-color-primary)]'\n : 'hover:bg-[var(--j2-color-bg-hover)]'\n )}\n >\n {hasLogo ? (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-4 shrink-0\">\n {(option as OptionWithLogo).logo}\n </div>\n <span className=\"overflow-hidden overflow-ellipsis\">\n {option.label}\n </span>\n </div>\n ) : (\n option.label\n )}\n </div>\n )\n }\n\n const dropdownPopupRender = () => {\n const valueToLabel = (val: string) => {\n const option = allFlatOptions.find((opt) => opt.value === val)\n return option ? (option.label as string) : val\n }\n\n return (\n <div className=\"bg-white rounded-lg shadow-md p-2 min-w-[240px]\">\n <div className=\"pb-2 border-b border-j2-border-secondary\">\n <Input\n ref={inputRef}\n key={focusTrigger}\n autoFocus\n placeholder={searchPlaceholder || 'Search...'}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n e.stopPropagation()\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n prefix={\n <icons.MagnifyingGlassIcon\n size={16}\n className=\"text-j2-text-placeholder\"\n />\n }\n allowClear\n />\n </div>\n {multiple && value.length > 0 && (\n <div className=\"px-1 pt-2\">\n <div className=\"flex flex-wrap gap-y-1\">\n {(value as string[]).map((v) => (\n <Tag\n className=\"opacity-100 z-10 flex max-w-full\"\n key={v}\n status=\"default\"\n closable\n onClose={() => handleTagClose(v)}\n >\n <span\n className=\"overflow-ellipsis overflow-hidden\"\n title={valueToLabel(v)}\n >\n {valueToLabel(v)}\n </span>\n </Tag>\n ))}\n </div>\n </div>\n )}\n <div\n className=\"max-h-72 overflow-y-auto py-1\"\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-[var(--j2-color-text-secondary)]\">\n No options found\n </div>\n ) : (\n filteredOptions.map((opt) => {\n if (isGroupOption(opt)) {\n return (\n <div key={`group-${opt.label}`}>\n <div className=\"px-3 pt-2 pb-1 text-xs font-semibold uppercase tracking-wide text-[var(--j2-color-text-tertiary)]\">\n {opt.label}\n </div>\n {opt.options.map(renderDropdownOptionRow)}\n </div>\n )\n }\n return renderDropdownOptionRow(opt)\n })\n )}\n </div>\n {multiple && value.length > 0 && (\n <div className=\"mt-1 pt-1 border-t border-j2-border-secondary\">\n <div\n role=\"button\"\n aria-label=\"Clear all\"\n title=\"Clear all\"\n onClick={handleToggleAll}\n className={cx(\n 'text-center font-semibold text-sm py-1.5 rounded cursor-pointer',\n styles.clearAllButton\n )}\n >\n Clear all\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (trigger === 'dropdown') {\n const hasSelection = multiple ? value.length > 0 : Boolean(value)\n const triggerContent = (\n <span className=\"inline-flex items-center gap-1\">\n {hasSelection ? displayText : (formControlPlaceholder ?? 'Select')}\n {loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : (\n <icons.CaretDownIcon weight=\"regular\" data-testid=\"caret-down\" />\n )}\n </span>\n )\n\n return (\n <AntdDropdown\n open={isOpen}\n onOpenChange={handleOpenChange}\n trigger={['click']}\n disabled={props.disabled}\n popupRender={dropdownPopupRender}\n >\n <Typography.Link\n disabled={props.disabled}\n className={cx('inline-flex', rootClassName)}\n >\n {triggerContent}\n </Typography.Link>\n </AntdDropdown>\n )\n }\n\n return (\n <>\n <span\n ref={measureSpanRef}\n aria-hidden\n style={{\n position: 'absolute',\n visibility: 'hidden',\n whiteSpace: 'nowrap',\n fontSize: 'inherit',\n }}\n >\n {displayText}\n </span>\n <Select<string | string[], SelectOption>\n open={isOpen}\n showSearch={false}\n style={{ width: measuredWidth }}\n suffixIcon={\n loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : (\n <icons.CaretDownIcon size={14} data-testid=\"caret-down\" />\n )\n }\n placeholder={formControlPlaceholder}\n mode={multiple ? 'multiple' : undefined}\n value={value}\n maxTagCount={0}\n maxTagPlaceholder={multiple ? () => renderLabel(value.length) : value}\n options={filteredOptions}\n onChange={(val) => {\n if (multiple) {\n if (Array.isArray(val)) {\n onChange(val)\n } else {\n throw new Error('Value should be an array in multiple mode')\n }\n } else {\n if (typeof val === 'string') {\n onChange(val)\n } else {\n throw new Error(\n 'Value should be a string in single selection mode'\n )\n }\n }\n }}\n popupRender={popupRender}\n optionRender={optionRender}\n onOpenChange={handleOpenChange}\n classNames={{\n root: cx(rootClassName, styles.summarizedSelect, {\n [styles.hemisphericSelect]:\n variant !== 'underlined' && variant !== 'headlined',\n [styles.isActive]:\n multiple &&\n value.length > 0 &&\n variant !== 'underlined' &&\n variant !== 'headlined',\n [styles.headlinedSelect]: isHeadline,\n }),\n popup: { root: popupClassName },\n }}\n variant={antVariant}\n {...props}\n />\n </>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SummarizedSelect.js","names":["Tag","styles","AntdDropdown","_Fragment"],"sources":["../../../../src/components/select/SummarizedSelect.tsx"],"sourcesContent":["import {\n Dropdown as AntdDropdown,\n Select,\n Spin,\n Input,\n SelectProps,\n InputRef,\n Typography,\n} from 'antd'\nimport { DefaultOptionType } from 'antd/es/select'\nimport { Fragment, useState, useMemo, useRef, useEffect } from 'react'\nimport { LoadingOutlined } from '@ant-design/icons'\nimport { CaretDownIcon, MagnifyingGlassIcon } from '@phosphor-icons/react'\nimport { Tag } from '../tag'\nimport cx from 'classnames'\n\nimport styles from './SummarizedSelect.module.css'\n\ntype Option = DefaultOptionType\ntype OptionWithLogo = Option & {\n logo: React.ReactNode\n}\n\ntype GroupOption = {\n label: string\n options: Option[]\n}\n\nexport type SelectOption = Option | GroupOption | OptionWithLogo\n\nexport type SummarizedSelectVariant = SelectProps['variant'] | 'headlined'\n\nexport type SummarizedSelectTrigger = 'select' | 'dropdown'\n\ntype BaseProps = Omit<\n SelectProps<string | string[], SelectOption>,\n 'mode' | 'value' | 'onChange' | 'variant'\n> & {\n searchPlaceholder?: string\n formControlPlaceholder?: string\n rootClassName?: string\n popupClassName?: string\n variant?: SummarizedSelectVariant\n /**\n * Shape of the control that opens the popup.\n * - `'select'` (default): antd Select, styled by `variant`.\n * - `'dropdown'`: antd Dropdown with a `Typography.Link` target (label + caret).\n * Ignores `variant` — the trigger is always a link.\n */\n trigger?: SummarizedSelectTrigger\n defaultOpen?: boolean\n\n loading?: boolean\n}\n\ntype SingleProps = {\n multiple?: false\n renderLabel?: undefined\n value: string | undefined\n onChange: (newValue: string) => void\n}\n\ntype MultiProps = {\n multiple: true\n renderLabel: (count: number) => string\n value: string[]\n onChange: (newValue: string[]) => void\n}\n\nexport type Props = BaseProps & (SingleProps | MultiProps)\n\nconst isGroupOption = (option: SelectOption): option is GroupOption => {\n return 'options' in option\n}\n\nconst getAllOptions = (options: SelectOption[] | undefined): Option[] => {\n if (!options) return []\n\n return options.flatMap((option) =>\n isGroupOption(option) ? option.options : [option]\n )\n}\n\nconst filterOptions = (\n options: SelectOption[] | undefined,\n searchValue: string\n): SelectOption[] => {\n if (!options) return []\n if (!searchValue) return options\n\n return options\n .map((option) => {\n if (isGroupOption(option)) {\n const filteredSubOptions = option.options.filter((subOption) =>\n subOption.label\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase())\n )\n return filteredSubOptions.length > 0\n ? { ...option, options: filteredSubOptions }\n : null\n } else {\n return option.label\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase())\n ? option\n : null\n }\n })\n .filter((option): option is SelectOption => option !== null)\n}\n\nexport function SummarizedSelect({\n searchPlaceholder,\n formControlPlaceholder,\n loading,\n multiple,\n value,\n onChange,\n options,\n renderLabel,\n rootClassName,\n popupClassName,\n variant,\n trigger = 'select',\n defaultOpen = false,\n ...props\n}: Props) {\n const isHeadline = variant === 'headlined'\n const antVariant = isHeadline ? 'borderless' : variant\n const [searchValue, setSearchValue] = useState('')\n const [focusTrigger, setFocusTrigger] = useState(defaultOpen ? 1 : 0)\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const inputRef = useRef<InputRef>(null)\n const measureSpanRef = useRef<HTMLSpanElement>(null)\n const [measuredWidth, setMeasuredWidth] = useState<number>()\n\n const displayText = useMemo(() => {\n if (multiple && value.length > 0) {\n return renderLabel(value.length)\n }\n if (!multiple && value) {\n const option = getAllOptions(options).find((opt) => opt.value === value)\n return option ? String(option.label) : String(value)\n }\n return formControlPlaceholder ?? ''\n }, [multiple, value, options, renderLabel, formControlPlaceholder])\n\n useEffect(() => {\n if (!measureSpanRef.current) return\n // padding (22px = 11px each side) + arrow (18px) + border (6px)\n setMeasuredWidth(Math.ceil(measureSpanRef.current.offsetWidth) + 46)\n }, [displayText])\n\n useEffect(() => {\n if (focusTrigger > 0) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setTimeout(() => {\n inputRef.current?.focus({ cursor: 'end' })\n }, 100)\n })\n })\n }\n }, [focusTrigger])\n\n const filteredOptions = useMemo(() => {\n return filterOptions(options, searchValue)\n }, [searchValue, options])\n\n const flatFilteredOptions = useMemo(() => {\n return getAllOptions(filteredOptions)\n }, [filteredOptions])\n\n const allFlatOptions = useMemo(() => {\n return getAllOptions(options)\n }, [options])\n\n const handleTagClose = (removedValue: string) => {\n if (!multiple) return\n\n onChange(value.filter((x) => x !== removedValue))\n }\n\n const handleToggleAll = () => {\n if (!multiple) return\n\n const allFilteredValues = getAllOptions(filteredOptions).map(\n (opt) => opt.value as string\n )\n const someSelected = allFilteredValues.some((val) => value.includes(val))\n\n if (someSelected) {\n onChange(value.filter((val) => !allFilteredValues.includes(val)))\n }\n }\n\n const handleSelectFirstOption = () => {\n if (flatFilteredOptions.length === 0) return\n\n const firstOption = flatFilteredOptions[0]\n if (!firstOption) return\n\n const optionValue = firstOption.value as string\n\n if (multiple) {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n } else {\n onChange(optionValue)\n handleOpenChange(false)\n }\n }\n\n const handleOptionClick = (optionValue: string) => {\n if (multiple) {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n } else {\n onChange(optionValue)\n handleOpenChange(false)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Allow these navigation keys to bubble up to Select's native keyboard handler\n const navigationKeys = ['ArrowUp', 'ArrowDown']\n\n // Handle Enter - select first filtered option (custom behavior)\n if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n handleSelectFirstOption()\n return\n }\n\n // Handle Escape - close dropdown (custom behavior)\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n handleOpenChange(false)\n return\n }\n\n // For arrow keys, prevent cursor movement but allow propagation to Select\n if (navigationKeys.includes(e.key)) {\n e.preventDefault() // Prevents cursor from moving to start/end of input text\n // Do NOT call stopPropagation() - let event bubble to Select component\n return\n }\n\n // For all other keys (including Backspace), stop propagation\n // This prevents backspace from removing tags in multiple mode\n e.stopPropagation()\n }\n\n const optionRender: NonNullable<\n SelectProps<string | string[], SelectOption>['optionRender']\n > = (option) => {\n if ('logo' in option.data && option.data.logo) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-4 shrink-0\">{option.data.logo}</div>\n <span className=\"overflow-ellipsis overflow-hidden\">\n {option.label}\n </span>\n </div>\n )\n }\n return <div>{option.label}</div>\n }\n\n const popupRender = (menu: React.ReactElement) => {\n const valueToLabel = (val: string) => {\n const option = allFlatOptions.find((opt) => opt.value === val)\n return option ? (option.label as string) : val\n }\n\n return (\n <div>\n <div className=\"mb-2 px-2 pb-2 border-b -mx-1 mt-1\">\n <Input\n ref={inputRef}\n key={focusTrigger}\n autoFocus\n placeholder={searchPlaceholder || 'Search...'}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n e.stopPropagation()\n e.preventDefault()\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n prefix={\n <MagnifyingGlassIcon\n size={16}\n className=\"text-j2-text-placeholder\"\n />\n }\n allowClear\n />\n </div>\n {multiple && value.length > 0 ? (\n <div className=\"px-2 pb-2\">\n <div className=\"flex flex-wrap gap-y-1\">\n {(value as string[]).map((value) => (\n <Tag\n className=\"opacity-100 z-10 flex max-w-full\"\n key={value}\n status=\"default\"\n closable\n onClose={() => handleTagClose(value)}\n >\n <span\n className=\"overflow-ellipsis overflow-hidden\"\n title={valueToLabel(value)}\n >\n {valueToLabel(value)}\n </span>\n </Tag>\n ))}\n </div>\n </div>\n ) : null}\n <div\n className={cx(styles.menuContainer, 'rounded-lg', {\n [styles.headlinedMenuContainer]: isHeadline,\n [styles.menuContainerMultiple]: multiple,\n })}\n >\n {/* Keyed on the search so antd rebuilds its option list per\n keystroke. Focusing the search input blurs the Select, antd\n starts a close, cancels it because focus stayed in the popup,\n and never clears its `lockOptions` flag -- a locked list keeps\n showing the options it had when the popup opened. */}\n <Fragment key={searchValue}>{menu}</Fragment>\n </div>\n <div className=\"flex justify-between items-center\">\n {multiple && (\n <div className=\"w-full mt-1 pt-1 border-t border-j2-border-secondary\">\n <div\n aria-selected=\"false\"\n className={cx(\n 'ant-select-item ant-select-item-option w-full',\n styles.clearAllButton\n )}\n title=\"Clear all\"\n onClick={handleToggleAll}\n >\n <div className=\"ant-select-item-option-content text-center font-semibold\">\n Clear all\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open)\n if (open) {\n // Trigger focus by updating the counter\n setFocusTrigger((prev) => prev + 1)\n } else {\n setSearchValue('')\n }\n }\n\n const renderDropdownOptionRow = (option: Option) => {\n const optionValue = option.value as string\n const isSelected = multiple\n ? value.includes(optionValue)\n : value === optionValue\n const hasLogo = 'logo' in option && (option as OptionWithLogo).logo\n return (\n <div\n key={optionValue}\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => handleOptionClick(optionValue)}\n className={cx(\n 'px-3 py-1.5 rounded cursor-pointer text-sm',\n isSelected\n ? 'bg-[var(--j2-color-primary)] text-white hover:bg-[var(--j2-color-primary)]'\n : 'hover:bg-[var(--j2-color-bg-hover)]'\n )}\n >\n {hasLogo ? (\n <div className=\"flex items-center gap-2\">\n <div className=\"h-4 shrink-0\">\n {(option as OptionWithLogo).logo}\n </div>\n <span className=\"overflow-hidden overflow-ellipsis\">\n {option.label}\n </span>\n </div>\n ) : (\n option.label\n )}\n </div>\n )\n }\n\n const dropdownPopupRender = () => {\n const valueToLabel = (val: string) => {\n const option = allFlatOptions.find((opt) => opt.value === val)\n return option ? (option.label as string) : val\n }\n\n return (\n <div className=\"bg-white rounded-lg shadow-md p-2 min-w-[240px]\">\n <div className=\"pb-2 border-b border-j2-border-secondary\">\n <Input\n ref={inputRef}\n key={focusTrigger}\n autoFocus\n placeholder={searchPlaceholder || 'Search...'}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n e.stopPropagation()\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n prefix={\n <MagnifyingGlassIcon\n size={16}\n className=\"text-j2-text-placeholder\"\n />\n }\n allowClear\n />\n </div>\n {multiple && value.length > 0 && (\n <div className=\"px-1 pt-2\">\n <div className=\"flex flex-wrap gap-y-1\">\n {(value as string[]).map((v) => (\n <Tag\n className=\"opacity-100 z-10 flex max-w-full\"\n key={v}\n status=\"default\"\n closable\n onClose={() => handleTagClose(v)}\n >\n <span\n className=\"overflow-ellipsis overflow-hidden\"\n title={valueToLabel(v)}\n >\n {valueToLabel(v)}\n </span>\n </Tag>\n ))}\n </div>\n </div>\n )}\n <div\n className=\"max-h-72 overflow-y-auto py-1\"\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-[var(--j2-color-text-secondary)]\">\n No options found\n </div>\n ) : (\n filteredOptions.map((opt) => {\n if (isGroupOption(opt)) {\n return (\n <div key={`group-${opt.label}`}>\n <div className=\"px-3 pt-2 pb-1 text-xs font-semibold uppercase tracking-wide text-[var(--j2-color-text-tertiary)]\">\n {opt.label}\n </div>\n {opt.options.map(renderDropdownOptionRow)}\n </div>\n )\n }\n return renderDropdownOptionRow(opt)\n })\n )}\n </div>\n {multiple && value.length > 0 && (\n <div className=\"mt-1 pt-1 border-t border-j2-border-secondary\">\n <div\n role=\"button\"\n aria-label=\"Clear all\"\n title=\"Clear all\"\n onClick={handleToggleAll}\n className={cx(\n 'text-center font-semibold text-sm py-1.5 rounded cursor-pointer',\n styles.clearAllButton\n )}\n >\n Clear all\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (trigger === 'dropdown') {\n const hasSelection = multiple ? value.length > 0 : Boolean(value)\n const triggerContent = (\n <span className=\"inline-flex items-center gap-1\">\n {hasSelection ? displayText : (formControlPlaceholder ?? 'Select')}\n {loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : (\n <CaretDownIcon weight=\"regular\" data-testid=\"caret-down\" />\n )}\n </span>\n )\n\n return (\n <AntdDropdown\n open={isOpen}\n onOpenChange={handleOpenChange}\n trigger={['click']}\n disabled={props.disabled}\n popupRender={dropdownPopupRender}\n >\n <Typography.Link\n disabled={props.disabled}\n className={cx('inline-flex', rootClassName)}\n >\n {triggerContent}\n </Typography.Link>\n </AntdDropdown>\n )\n }\n\n return (\n <>\n <span\n ref={measureSpanRef}\n aria-hidden\n style={{\n position: 'absolute',\n visibility: 'hidden',\n whiteSpace: 'nowrap',\n fontSize: 'inherit',\n }}\n >\n {displayText}\n </span>\n <Select<string | string[], SelectOption>\n open={isOpen}\n showSearch={false}\n style={{ width: measuredWidth }}\n suffixIcon={\n loading ? (\n <Spin\n indicator={<LoadingOutlined spin />}\n size=\"small\"\n data-testid=\"loading-spinner\"\n />\n ) : (\n <CaretDownIcon size={14} data-testid=\"caret-down\" />\n )\n }\n placeholder={formControlPlaceholder}\n mode={multiple ? 'multiple' : undefined}\n value={value}\n maxTagCount={0}\n maxTagPlaceholder={multiple ? () => renderLabel(value.length) : value}\n options={filteredOptions}\n onChange={(val) => {\n if (multiple) {\n if (Array.isArray(val)) {\n onChange(val)\n } else {\n throw new Error('Value should be an array in multiple mode')\n }\n } else {\n if (typeof val === 'string') {\n onChange(val)\n } else {\n throw new Error(\n 'Value should be a string in single selection mode'\n )\n }\n }\n }}\n popupRender={popupRender}\n optionRender={optionRender}\n onOpenChange={handleOpenChange}\n classNames={{\n root: cx(rootClassName, styles.summarizedSelect, {\n [styles.hemisphericSelect]:\n variant !== 'underlined' && variant !== 'headlined',\n [styles.isActive]:\n multiple &&\n value.length > 0 &&\n variant !== 'underlined' &&\n variant !== 'headlined',\n [styles.headlinedSelect]: isHeadline,\n }),\n popup: { root: popupClassName },\n }}\n variant={antVariant}\n {...props}\n />\n </>\n )\n}\n"],"mappings":"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"}
@@ -3,6 +3,7 @@ const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
3
3
  const require_useSteps = require("./useSteps.cjs");
4
4
  let antd = require("antd");
5
5
  let _phosphor_icons_react = require("@phosphor-icons/react");
6
+ _phosphor_icons_react = require_runtime.__toESM(_phosphor_icons_react, 1);
6
7
  let react_jsx_runtime = require("react/jsx-runtime");
7
8
  let classnames = require("classnames");
8
9
  classnames = require_runtime.__toESM(classnames, 1);