smarthr-ui 96.1.0 → 96.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/AppHeader/components/common/CommonButton.cjs +3 -2
- package/lib/components/AppHeader/components/common/CommonButton.cjs.map +1 -1
- package/lib/components/AppHeader/components/common/CommonButton.js +3 -2
- package/lib/components/AppHeader/components/common/CommonButton.js.map +1 -1
- package/lib/components/Base/Base.cjs +7 -1
- package/lib/components/Base/Base.cjs.map +1 -1
- package/lib/components/Base/Base.js +7 -1
- package/lib/components/Base/Base.js.map +1 -1
- package/lib/components/Base/BaseColumn/BaseColumn.cjs +7 -1
- package/lib/components/Base/BaseColumn/BaseColumn.cjs.map +1 -1
- package/lib/components/Base/BaseColumn/BaseColumn.js +7 -1
- package/lib/components/Base/BaseColumn/BaseColumn.js.map +1 -1
- package/lib/components/BottomFixedArea/BottomFixedArea.cjs +1 -3
- package/lib/components/BottomFixedArea/BottomFixedArea.cjs.map +1 -1
- package/lib/components/BottomFixedArea/BottomFixedArea.js +2 -4
- package/lib/components/BottomFixedArea/BottomFixedArea.js.map +1 -1
- package/lib/components/Button/AnchorButton.cjs +2 -7
- package/lib/components/Button/AnchorButton.cjs.map +1 -1
- package/lib/components/Button/AnchorButton.js +2 -7
- package/lib/components/Button/AnchorButton.js.map +1 -1
- package/lib/components/Button/useButtonWrapper.cjs +24 -6
- package/lib/components/Button/useButtonWrapper.cjs.map +1 -1
- package/lib/components/Button/useButtonWrapper.js +24 -6
- package/lib/components/Button/useButtonWrapper.js.map +1 -1
- package/lib/components/Combobox/MultiCombobox/MultiSelectedItem.cjs +8 -4
- package/lib/components/Combobox/MultiCombobox/MultiSelectedItem.cjs.map +1 -1
- package/lib/components/Combobox/MultiCombobox/MultiSelectedItem.js +8 -4
- package/lib/components/Combobox/MultiCombobox/MultiSelectedItem.js.map +1 -1
- package/lib/components/Dialog/DialogBody.cjs +7 -1
- package/lib/components/Dialog/DialogBody.cjs.map +1 -1
- package/lib/components/Dialog/DialogBody.js +7 -1
- package/lib/components/Dialog/DialogBody.js.map +1 -1
- package/lib/components/Dialog/DialogContentInner.cjs +7 -1
- package/lib/components/Dialog/DialogContentInner.cjs.map +1 -1
- package/lib/components/Dialog/DialogContentInner.js +7 -1
- package/lib/components/Dialog/DialogContentInner.js.map +1 -1
- package/lib/components/Dialog/DialogOverlap.cjs +22 -5
- package/lib/components/Dialog/DialogOverlap.cjs.map +1 -1
- package/lib/components/Dialog/DialogOverlap.js +23 -6
- package/lib/components/Dialog/DialogOverlap.js.map +1 -1
- package/lib/components/Dialog/ModelessDialog/ModelessDialog.cjs +7 -1
- package/lib/components/Dialog/ModelessDialog/ModelessDialog.cjs.map +1 -1
- package/lib/components/Dialog/ModelessDialog/ModelessDialog.js +7 -1
- package/lib/components/Dialog/ModelessDialog/ModelessDialog.js.map +1 -1
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.cjs +51 -11
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.cjs.map +1 -1
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.d.ts +3 -4
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.js +52 -12
- package/lib/components/Dialog/RemoteDialogTrigger/RemoteDialogTrigger.js.map +1 -1
- package/lib/components/Dropdown/Dropdown.cjs +3 -3
- package/lib/components/Dropdown/Dropdown.cjs.map +1 -1
- package/lib/components/Dropdown/Dropdown.d.ts +1 -1
- package/lib/components/Dropdown/Dropdown.js +3 -3
- package/lib/components/Dropdown/Dropdown.js.map +1 -1
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.cjs +20 -10
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.cjs.map +1 -1
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.js +21 -11
- package/lib/components/Dropdown/DropdownMenuButton/DropdownMenuButton.js.map +1 -1
- package/lib/components/Dropdown/DropdownTrigger.cjs +33 -16
- package/lib/components/Dropdown/DropdownTrigger.cjs.map +1 -1
- package/lib/components/Dropdown/DropdownTrigger.js +33 -16
- package/lib/components/Dropdown/DropdownTrigger.js.map +1 -1
- package/lib/components/Header/Header.cjs +3 -3
- package/lib/components/Header/Header.cjs.map +1 -1
- package/lib/components/Header/Header.js +3 -3
- package/lib/components/Header/Header.js.map +1 -1
- package/lib/components/Icon/generateIcon.cjs +9 -1
- package/lib/components/Icon/generateIcon.cjs.map +1 -1
- package/lib/components/Icon/generateIcon.js +9 -1
- package/lib/components/Icon/generateIcon.js.map +1 -1
- package/lib/components/Layout/Cluster/Cluster.cjs +4 -0
- package/lib/components/Layout/Cluster/Cluster.cjs.map +1 -1
- package/lib/components/Layout/Cluster/Cluster.d.ts +1 -1
- package/lib/components/Layout/Cluster/Cluster.js +4 -0
- package/lib/components/Layout/Cluster/Cluster.js.map +1 -1
- package/lib/components/Layout/Container/Container.cjs +2 -2
- package/lib/components/Layout/Container/Container.js +2 -2
- package/lib/components/Scroller/Scroller.cjs +12 -19
- package/lib/components/Scroller/Scroller.cjs.map +1 -1
- package/lib/components/Scroller/Scroller.js +13 -20
- package/lib/components/Scroller/Scroller.js.map +1 -1
- package/lib/components/Table/TableReel.cjs +1 -1
- package/lib/components/Table/TableReel.cjs.map +1 -1
- package/lib/components/Table/TableReel.js +1 -1
- package/lib/components/Table/TableReel.js.map +1 -1
- package/lib/components/Table/TableScrollContext.cjs +4 -4
- package/lib/components/Table/TableScrollContext.js +4 -4
- package/lib/components/Table/useReelCells.cjs +13 -7
- package/lib/components/Table/useReelCells.cjs.map +1 -1
- package/lib/components/Table/useReelCells.d.ts +1 -3
- package/lib/components/Table/useReelCells.js +13 -7
- package/lib/components/Table/useReelCells.js.map +1 -1
- package/lib/components/Text/Text.cjs +3 -1
- package/lib/components/Text/Text.cjs.map +1 -1
- package/lib/components/Text/Text.js +3 -1
- package/lib/components/Text/Text.js.map +1 -1
- package/lib/components/TextLink/TextLink.cjs +14 -28
- package/lib/components/TextLink/TextLink.cjs.map +1 -1
- package/lib/components/TextLink/TextLink.js +15 -29
- package/lib/components/TextLink/TextLink.js.map +1 -1
- package/lib/components/TextLink/UpwardLink/UpwardLink.cjs +2 -2
- package/lib/components/TextLink/UpwardLink/UpwardLink.js +2 -2
- package/lib/components/Textarea/Textarea.cjs +7 -6
- package/lib/components/Textarea/Textarea.cjs.map +1 -1
- package/lib/components/Textarea/Textarea.js +7 -6
- package/lib/components/Textarea/Textarea.js.map +1 -1
- package/lib/components/Tooltip/Tooltip.cjs +12 -21
- package/lib/components/Tooltip/Tooltip.cjs.map +1 -1
- package/lib/components/Tooltip/Tooltip.js +14 -23
- package/lib/components/Tooltip/Tooltip.js.map +1 -1
- package/lib/components/Tooltip/TooltipPortal.cjs +2 -2
- package/lib/components/Tooltip/TooltipPortal.cjs.map +1 -1
- package/lib/components/Tooltip/TooltipPortal.d.ts +1 -0
- package/lib/components/Tooltip/TooltipPortal.js +2 -2
- package/lib/components/Tooltip/TooltipPortal.js.map +1 -1
- package/lib/components/Tooltip/tooltipHelper.cjs +2 -2
- package/lib/components/Tooltip/tooltipHelper.cjs.map +1 -1
- package/lib/components/Tooltip/tooltipHelper.js +2 -2
- package/lib/components/Tooltip/tooltipHelper.js.map +1 -1
- package/lib/components/WarekiPicker/WarekiPicker.cjs +2 -3
- package/lib/components/WarekiPicker/WarekiPicker.cjs.map +1 -1
- package/lib/components/WarekiPicker/WarekiPicker.js +2 -3
- package/lib/components/WarekiPicker/WarekiPicker.js.map +1 -1
- package/lib/configureTwMerge.cjs +2 -2
- package/lib/configureTwMerge.js +2 -2
- package/lib/hooks/useDevice/DeviceProvider.cjs +2 -2
- package/lib/hooks/useDevice/DeviceProvider.js +2 -2
- package/lib/hooks/useEnvironment/EnvironmentProvider.cjs +2 -2
- package/lib/hooks/useEnvironment/EnvironmentProvider.js +2 -2
- package/lib/hooks/useOuterClick.cjs +5 -2
- package/lib/hooks/useOuterClick.cjs.map +1 -1
- package/lib/hooks/useOuterClick.js +6 -3
- package/lib/hooks/useOuterClick.js.map +1 -1
- package/lib/hooks/usePortal.cjs +1 -1
- package/lib/hooks/usePortal.cjs.map +1 -1
- package/lib/hooks/usePortal.js +1 -1
- package/lib/hooks/usePortal.js.map +1 -1
- package/lib/hooks/useSV/useSV.cjs +2 -2
- package/lib/hooks/useSV/useSV.js +2 -2
- package/lib/hooks/useTheme.cjs +3 -0
- package/lib/hooks/useTheme.cjs.map +1 -1
- package/lib/hooks/useTheme.js +3 -0
- package/lib/hooks/useTheme.js.map +1 -1
- package/lib/index.cjs +14 -8
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.ts +1 -10
- package/lib/index.js +10 -4
- package/lib/index.js.map +1 -1
- package/lib/intl/locales/index.cjs +1 -0
- package/lib/intl/locales/index.cjs.map +1 -1
- package/lib/intl/locales/index.js +1 -0
- package/lib/intl/locales/index.js.map +1 -1
- package/lib/libs/ua.cjs +1 -2
- package/lib/libs/ua.cjs.map +1 -1
- package/lib/libs/ua.js +1 -2
- package/lib/libs/ua.js.map +1 -1
- package/lib/smarthr-ui-preset.cjs +4 -4
- package/lib/smarthr-ui-preset.js +4 -4
- package/lib/tailwind/color.cjs +9 -0
- package/lib/tailwind/color.cjs.map +1 -1
- package/lib/tailwind/color.d.ts +1 -1
- package/lib/tailwind/color.js +9 -0
- package/lib/tailwind/color.js.map +1 -1
- package/lib/tailwind/fontSize.cjs +10 -0
- package/lib/tailwind/fontSize.cjs.map +1 -1
- package/lib/tailwind/fontSize.d.ts +1 -1
- package/lib/tailwind/fontSize.js +10 -0
- package/lib/tailwind/fontSize.js.map +1 -1
- package/lib/tailwind/index.cjs +10 -2
- package/lib/tailwind/index.cjs.map +1 -1
- package/lib/tailwind/index.js +9 -1
- package/lib/tailwind/index.js.map +1 -1
- package/lib/tailwind/textColor.cjs +9 -0
- package/lib/tailwind/textColor.cjs.map +1 -1
- package/lib/tailwind/textColor.d.ts +1 -1
- package/lib/tailwind/textColor.js +9 -0
- package/lib/tailwind/textColor.js.map +1 -1
- package/lib/themes/createWidth.cjs +1 -3
- package/lib/themes/createWidth.cjs.map +1 -1
- package/lib/themes/createWidth.d.ts +3 -1
- package/lib/themes/createWidth.js +1 -3
- package/lib/themes/createWidth.js.map +1 -1
- package/lib/themes/index.cjs +14 -0
- package/lib/themes/index.cjs.map +1 -1
- package/lib/themes/index.d.ts +7 -1
- package/lib/themes/index.js +9 -1
- package/lib/themes/index.js.map +1 -1
- package/metadata.json +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Text.cjs","sources":["../../../src/components/Text/Text.tsx"],"sourcesContent":["import {\n type ComponentProps,\n type ElementType,\n type PropsWithChildren,\n type ReactNode,\n memo,\n useMemo,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useObjectAttributes } from '../../hooks/useObjectAttributes'\n\nimport type { AbstractSize, CharRelativeSize } from '../../themes'\nimport type { Gap } from '../../types'\n\ntype StyleType =\n | 'screenTitle'\n | 'sectionTitle'\n | 'blockTitle'\n | 'subBlockTitle'\n | 'subSubBlockTitle'\n\nexport const STYLE_TYPE_MAP: { [key in StyleType]: VariantProps<typeof classNameGenerator> } = {\n screenTitle: {\n size: 'XL',\n leading: 'TIGHT',\n weight: 'normal',\n },\n sectionTitle: {\n size: 'L',\n leading: 'TIGHT',\n weight: 'normal',\n },\n blockTitle: {\n size: 'M',\n leading: 'TIGHT',\n weight: 'bold',\n },\n subBlockTitle: {\n size: 'M',\n leading: 'TIGHT',\n weight: 'bold',\n color: 'TEXT_GREY',\n },\n subSubBlockTitle: {\n size: 'S',\n leading: 'TIGHT',\n weight: 'bold',\n color: 'TEXT_GREY',\n },\n}\nconst UNDEFINED_STYLE_VALUES = {\n size: undefined,\n leading: undefined,\n weight: undefined,\n color: undefined,\n}\n\nconst classNameGenerator = tv({\n variants: {\n size: {\n XXS: 'shr-text-2xs',\n XS: 'shr-text-xs',\n S: 'shr-text-sm',\n M: 'shr-text-base',\n L: 'shr-text-lg',\n XL: 'shr-text-xl',\n XXL: 'shr-text-2xl',\n },\n weight: {\n normal: 'shr-font-normal',\n bold: 'shr-font-bold',\n },\n italic: {\n true: 'shr-italic',\n },\n color: {\n TEXT_BLACK: 'shr-text-black',\n TEXT_WHITE: 'shr-text-white',\n TEXT_GREY: 'shr-text-grey',\n TEXT_DISABLED: 'shr-text-disabled',\n TEXT_LINK: 'shr-text-link',\n inherit: 'shr-text-color-inherit',\n },\n leading: {\n NONE: 'shr-leading-none',\n TIGHT: 'shr-leading-tight',\n NORMAL: 'shr-leading-normal',\n LOOSE: 'shr-leading-loose',\n },\n whiteSpace: {\n normal: 'shr-whitespace-normal',\n nowrap: 'shr-whitespace-nowrap',\n pre: 'shr-whitespace-pre',\n 'pre-line': 'shr-whitespace-pre-line',\n 'pre-wrap': 'shr-whitespace-pre-wrap',\n },\n maxLines: {\n 1: 'shr-inline-block shr-w-full shr-overflow-x-clip shr-overflow-ellipsis shr-whitespace-nowrap shr-align-middle',\n 2: 'shr-line-clamp-[2]',\n 3: 'shr-line-clamp-[3]',\n 4: 'shr-line-clamp-[4]',\n 5: 'shr-line-clamp-[5]',\n 6: 'shr-line-clamp-[6]',\n },\n },\n})\n\nconst wrapperClassNameGenerator = tv({\n base: [\n 'smarthr-ui-Icon-extended smarthr-ui-Icon-withText shr-group/iconWrapper shr-inline-flex shr-items-baseline',\n ],\n variants: {\n gap: {\n 0: 'shr-gap-x-0',\n 0.25: 'shr-gap-x-0.25',\n 0.5: 'shr-gap-x-0.5',\n 0.75: 'shr-gap-x-0.75',\n 1: 'shr-gap-x-1',\n 1.25: 'shr-gap-x-1.25',\n 1.5: 'shr-gap-x-1.5',\n 2: 'shr-gap-x-2',\n 2.5: 'shr-gap-x-2.5',\n 3: 'shr-gap-x-3',\n 3.5: 'shr-gap-x-3.5',\n 4: 'shr-gap-x-4',\n 8: 'shr-gap-x-8',\n '-0.25': '-shr-gap-x-0.25',\n '-0.5': '-shr-gap-x-0.5',\n '-0.75': '-shr-gap-x-0.75',\n '-1': '-shr-gap-x-1',\n '-1.25': '-shr-gap-x-1.25',\n '-1.5': '-shr-gap-x-1.5',\n '-2': '-shr-gap-x-2',\n '-2.5': '-shr-gap-x-2.5',\n '-3': '-shr-gap-x-3',\n '-3.5': '-shr-gap-x-3.5',\n '-4': '-shr-gap-x-4',\n '-8': '-shr-gap-x-8',\n X3S: 'shr-gap-x-0.25',\n XXS: 'shr-gap-x-0.5',\n XS: 'shr-gap-x-1',\n S: 'shr-gap-x-1.5',\n M: 'shr-gap-x-2',\n L: 'shr-gap-x-2.5',\n XL: 'shr-gap-x-3',\n XXL: 'shr-gap-x-3.5',\n X3L: 'shr-gap-x-4',\n } as { [key in Gap]: string },\n },\n})\n\ntype ActualIconType =\n | undefined\n | {\n /** テキスト左に設置するアイコン */\n prefix?: ReactNode\n /** テキスト右に設置するアイコン */\n suffix?: ReactNode\n /** アイコンと並べるテキストとの溝 */\n gap?: CharRelativeSize | AbstractSize\n }\ntype IconType = ActualIconType | ReactNode\n\n// VariantProps を使うとコメントが書けない〜🥹\nexport type TextProps<T extends ElementType = 'span'> = VariantProps<typeof classNameGenerator> & {\n /** テキストコンポーネントの HTML タグ名。初期値は span */\n as?: T\n /** 強調するかどうかの真偽値。指定すると em 要素になる */\n emphasis?: boolean\n /** 見た目の種類 */\n styleType?: StyleType\n /** 設置するアイコン */\n icon?: IconType\n}\n\nconst iconObjectConverter = (icon: ReactNode) => (icon ? { prefix: icon } : undefined)\n\nconst ActualText = <T extends ElementType = 'span'>({\n emphasis,\n styleType,\n icon: orgIcon,\n weight = emphasis ? 'bold' : undefined,\n as: Component = emphasis ? 'em' : 'span',\n size,\n italic,\n color,\n leading,\n whiteSpace,\n maxLines,\n className,\n children,\n ...rest\n}: PropsWithChildren<TextProps<T> & ComponentProps<T>>) => {\n if (maxLines !== undefined && (maxLines < 1 || maxLines > 6)) {\n throw new Error('\"maxLines\" は 1 ~ 6 の範囲で指定してください')\n }\n\n const icon = useObjectAttributes<IconType, ActualIconType>(orgIcon, iconObjectConverter)\n const actualClassName = useMemo(() => {\n const styleTypeValues = styleType\n ? STYLE_TYPE_MAP[styleType as StyleType]\n : UNDEFINED_STYLE_VALUES\n\n return classNameGenerator({\n size: size || styleTypeValues.size,\n weight: weight || styleTypeValues.weight,\n color: color || styleTypeValues.color,\n leading: leading || styleTypeValues.leading,\n italic,\n whiteSpace,\n maxLines,\n className,\n })\n }, [size, weight, italic, color, leading, whiteSpace, maxLines, className, styleType])\n const wrapperClassName = useMemo(\n () => (icon ? wrapperClassNameGenerator({ gap: icon.gap || 0.25 }) : ''),\n [icon],\n )\n\n return (\n <Component {...rest} className={actualClassName}>\n {icon ? (\n <span className={wrapperClassName}>\n {icon.prefix}\n {children}\n {icon.suffix}\n </span>\n ) : (\n children\n )}\n </Component>\n )\n}\n\nexport const Text = memo(ActualText) as typeof ActualText\n"],"names":["tv","useObjectAttributes","useMemo","_jsx","_jsxs","memo"],"mappings":";;;;;;;AAsBO,MAAM,cAAc,GAAoE;AAC7F,IAAA,WAAW,EAAE;AACX,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,MAAM,EAAE,QAAQ;AACjB,KAAA;AACD,IAAA,YAAY,EAAE;AACZ,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,MAAM,EAAE,QAAQ;AACjB,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,MAAM,EAAE,MAAM;AACf,KAAA;AACD,IAAA,aAAa,EAAE;AACb,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,KAAK,EAAE,WAAW;AACnB,KAAA;AACD,IAAA,gBAAgB,EAAE;AAChB,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,KAAK,EAAE,WAAW;AACnB,KAAA;;AAEH,MAAM,sBAAsB,GAAG;AAC7B,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,KAAK,EAAE,SAAS;CACjB;AAED,MAAM,kBAAkB,GAAGA,QAAE,CAAC;AAC5B,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,GAAG,EAAE,cAAc;AACnB,YAAA,EAAE,EAAE,aAAa;AACjB,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,CAAC,EAAE,eAAe;AAClB,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,EAAE,EAAE,aAAa;AACjB,YAAA,GAAG,EAAE,cAAc;AACpB,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,MAAM,EAAE,iBAAiB;AACzB,YAAA,IAAI,EAAE,eAAe;AACtB,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,YAAY;AACnB,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,UAAU,EAAE,gBAAgB;AAC5B,YAAA,UAAU,EAAE,gBAAgB;AAC5B,YAAA,SAAS,EAAE,eAAe;AAC1B,YAAA,aAAa,EAAE,mBAAmB;AAClC,YAAA,SAAS,EAAE,eAAe;AAC1B,YAAA,OAAO,EAAE,wBAAwB;AAClC,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,kBAAkB;AACxB,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,MAAM,EAAE,oBAAoB;AAC5B,YAAA,KAAK,EAAE,mBAAmB;AAC3B,SAAA;AACD,QAAA,UAAU,EAAE;AACV,YAAA,MAAM,EAAE,uBAAuB;AAC/B,YAAA,MAAM,EAAE,uBAAuB;AAC/B,YAAA,GAAG,EAAE,oBAAoB;AACzB,YAAA,UAAU,EAAE,yBAAyB;AACrC,YAAA,UAAU,EAAE,yBAAyB;AACtC,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,CAAC,EAAE,8GAA8G;AACjH,YAAA,CAAC,EAAE,oBAAoB;AACvB,YAAA,CAAC,EAAE,oBAAoB;AACvB,YAAA,CAAC,EAAE,oBAAoB;AACvB,YAAA,CAAC,EAAE,oBAAoB;AACvB,YAAA,CAAC,EAAE,oBAAoB;AACxB,SAAA;AACF,KAAA;AACF,CAAA,CAAC;AAEF,MAAM,yBAAyB,GAAGA,QAAE,CAAC;AACnC,IAAA,IAAI,EAAE;QACJ,4GAA4G;AAC7G,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,GAAG,EAAE;AACH,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,MAAM,EAAE,gBAAgB;AACxB,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,MAAM,EAAE,gBAAgB;AACxB,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,MAAM,EAAE,gBAAgB;AACxB,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,MAAM,EAAE,gBAAgB;AACxB,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,EAAE,EAAE,aAAa;AACjB,YAAA,CAAC,EAAE,eAAe;AAClB,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,CAAC,EAAE,eAAe;AAClB,YAAA,EAAE,EAAE,aAAa;AACjB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,GAAG,EAAE,aAAa;AACS,SAAA;AAC9B,KAAA;AACF,CAAA,CAAC;AA0BF,MAAM,mBAAmB,GAAG,CAAC,IAAe,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;AAEtF,MAAM,UAAU,GAAG,CAAiC,EAClD,QAAQ,EACR,SAAS,EACT,IAAI,EAAE,OAAO,EACb,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,EACtC,EAAE,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,EACxC,IAAI,EACJ,MAAM,EACN,KAAK,EACL,OAAO,EACP,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EAC6C,KAAI;AACxD,IAAA,IAAI,QAAQ,KAAK,SAAS,KAAK,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,EAAE;AAC5D,QAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;IACpD;IAEA,MAAM,IAAI,GAAGC,6CAAmB,CAA2B,OAAO,EAAE,mBAAmB,CAAC;AACxF,IAAA,MAAM,eAAe,GAAGC,aAAO,CAAC,MAAK;QACnC,MAAM,eAAe,GAAG;AACtB,cAAE,cAAc,CAAC,SAAsB;cACrC,sBAAsB;AAE1B,QAAA,OAAO,kBAAkB,CAAC;AACxB,YAAA,IAAI,EAAE,IAAI,IAAI,eAAe,CAAC,IAAI;AAClC,YAAA,MAAM,EAAE,MAAM,IAAI,eAAe,CAAC,MAAM;AACxC,YAAA,KAAK,EAAE,KAAK,IAAI,eAAe,CAAC,KAAK;AACrC,YAAA,OAAO,EAAE,OAAO,IAAI,eAAe,CAAC,OAAO;YAC3C,MAAM;YACN,UAAU;YACV,QAAQ;YACR,SAAS;AACV,SAAA,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACtF,IAAA,MAAM,gBAAgB,GAAGA,aAAO,CAC9B,OAAO,IAAI,GAAG,yBAAyB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,EACxE,CAAC,IAAI,CAAC,CACP;AAED,IAAA,QACEC,cAAA,CAAC,SAAS,EAAA,EAAA,GAAK,IAAI,EAAE,SAAS,EAAE,eAAe,EAAA,QAAA,EAC5C,IAAI,IACHC,eAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,gBAAgB,EAAA,QAAA,EAAA,CAC9B,IAAI,CAAC,MAAM,EACX,QAAQ,EACR,IAAI,CAAC,MAAM,CAAA,EAAA,CACP,KAEP,QAAQ,CACT,EAAA,CACS;AAEhB,CAAC;MAEY,IAAI,GAAGC,UAAI,CAAC,UAAU;;;;;"}
|
|
1
|
+
{"version":3,"file":"Text.cjs","sources":["../../../src/components/Text/Text.tsx"],"sourcesContent":["import {\n type ComponentProps,\n type ElementType,\n type PropsWithChildren,\n type ReactNode,\n memo,\n useMemo,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useObjectAttributes } from '../../hooks/useObjectAttributes'\n\nimport type { AbstractSize, CharRelativeSize } from '../../themes'\nimport type { Gap } from '../../types'\n\ntype StyleType =\n | 'screenTitle'\n | 'sectionTitle'\n | 'blockTitle'\n | 'subBlockTitle'\n | 'subSubBlockTitle'\n\nexport const STYLE_TYPE_MAP: { [key in StyleType]: VariantProps<typeof classNameGenerator> } = {\n screenTitle: {\n size: 'XL',\n leading: 'TIGHT',\n weight: 'normal',\n },\n sectionTitle: {\n size: 'L',\n leading: 'TIGHT',\n weight: 'normal',\n },\n blockTitle: {\n size: 'M',\n leading: 'TIGHT',\n weight: 'bold',\n },\n subBlockTitle: {\n size: 'M',\n leading: 'TIGHT',\n weight: 'bold',\n color: 'TEXT_GREY',\n },\n subSubBlockTitle: {\n size: 'S',\n leading: 'TIGHT',\n weight: 'bold',\n color: 'TEXT_GREY',\n },\n}\nconst UNDEFINED_STYLE_VALUES = {\n size: undefined,\n leading: undefined,\n weight: undefined,\n color: undefined,\n}\n\nconst classNameGenerator = tv({\n variants: {\n size: {\n XXS: 'shr-text-2xs',\n XS: 'shr-text-xs',\n S: 'shr-text-sm',\n M: 'shr-text-base',\n L: 'shr-text-lg',\n XL: 'shr-text-xl',\n XXL: 'shr-text-2xl',\n },\n weight: {\n normal: 'shr-font-normal',\n bold: 'shr-font-bold',\n },\n italic: {\n true: 'shr-italic',\n },\n color: {\n TEXT_BLACK: 'shr-text-black',\n TEXT_WHITE: 'shr-text-white',\n TEXT_GREY: 'shr-text-grey',\n TEXT_DISABLED: 'shr-text-disabled',\n TEXT_LINK: 'shr-text-link',\n inherit: 'shr-text-color-inherit',\n },\n leading: {\n NONE: 'shr-leading-none',\n TIGHT: 'shr-leading-tight',\n NORMAL: 'shr-leading-normal',\n LOOSE: 'shr-leading-loose',\n },\n whiteSpace: {\n normal: 'shr-whitespace-normal',\n nowrap: 'shr-whitespace-nowrap',\n pre: 'shr-whitespace-pre',\n 'pre-line': 'shr-whitespace-pre-line',\n 'pre-wrap': 'shr-whitespace-pre-wrap',\n },\n maxLines: {\n 1: 'shr-inline-block shr-w-full shr-overflow-x-clip shr-overflow-ellipsis shr-whitespace-nowrap shr-align-middle',\n 2: 'shr-line-clamp-[2]',\n 3: 'shr-line-clamp-[3]',\n 4: 'shr-line-clamp-[4]',\n 5: 'shr-line-clamp-[5]',\n 6: 'shr-line-clamp-[6]',\n },\n },\n})\n\nconst wrapperClassNameGenerator = tv({\n base: [\n 'smarthr-ui-Icon-extended smarthr-ui-Icon-withText shr-group/iconWrapper shr-inline-flex shr-items-baseline',\n ],\n variants: {\n gap: {\n 0: 'shr-gap-x-0',\n 0.25: 'shr-gap-x-0.25',\n 0.5: 'shr-gap-x-0.5',\n 0.75: 'shr-gap-x-0.75',\n 1: 'shr-gap-x-1',\n 1.25: 'shr-gap-x-1.25',\n 1.5: 'shr-gap-x-1.5',\n 2: 'shr-gap-x-2',\n 2.5: 'shr-gap-x-2.5',\n 3: 'shr-gap-x-3',\n 3.5: 'shr-gap-x-3.5',\n 4: 'shr-gap-x-4',\n 8: 'shr-gap-x-8',\n '-0.25': '-shr-gap-x-0.25',\n '-0.5': '-shr-gap-x-0.5',\n '-0.75': '-shr-gap-x-0.75',\n '-1': '-shr-gap-x-1',\n '-1.25': '-shr-gap-x-1.25',\n '-1.5': '-shr-gap-x-1.5',\n '-2': '-shr-gap-x-2',\n '-2.5': '-shr-gap-x-2.5',\n '-3': '-shr-gap-x-3',\n '-3.5': '-shr-gap-x-3.5',\n '-4': '-shr-gap-x-4',\n '-8': '-shr-gap-x-8',\n X3S: 'shr-gap-x-0.25',\n XXS: 'shr-gap-x-0.5',\n XS: 'shr-gap-x-1',\n S: 'shr-gap-x-1.5',\n M: 'shr-gap-x-2',\n L: 'shr-gap-x-2.5',\n XL: 'shr-gap-x-3',\n XXL: 'shr-gap-x-3.5',\n X3L: 'shr-gap-x-4',\n } as { [key in Gap]: string },\n },\n})\n\ntype ActualIconType =\n | undefined\n | {\n /** テキスト左に設置するアイコン */\n prefix?: ReactNode\n /** テキスト右に設置するアイコン */\n suffix?: ReactNode\n /** アイコンと並べるテキストとの溝 */\n gap?: CharRelativeSize | AbstractSize\n }\ntype IconType = ActualIconType | ReactNode\n\n// VariantProps を使うとコメントが書けない〜🥹\nexport type TextProps<T extends ElementType = 'span'> = VariantProps<typeof classNameGenerator> & {\n /** テキストコンポーネントの HTML タグ名。初期値は span */\n as?: T\n /** 強調するかどうかの真偽値。指定すると em 要素になる */\n emphasis?: boolean\n /** 見た目の種類 */\n styleType?: StyleType\n /** 設置するアイコン */\n icon?: IconType\n}\n\nconst iconObjectConverter = (icon: ReactNode) => (icon ? { prefix: icon } : undefined)\n\nconst ActualText = <T extends ElementType = 'span'>({\n emphasis,\n styleType,\n icon: orgIcon,\n weight = emphasis ? 'bold' : undefined,\n as: Component = emphasis ? 'em' : 'span',\n size,\n italic,\n color,\n leading,\n whiteSpace,\n maxLines,\n className,\n children,\n ...rest\n}: PropsWithChildren<TextProps<T> & ComponentProps<T>>) => {\n if (maxLines !== undefined && (maxLines < 1 || maxLines > 6)) {\n throw new Error('\"maxLines\" は 1 ~ 6 の範囲で指定してください')\n }\n\n const icon = useObjectAttributes<IconType, ActualIconType>(orgIcon, iconObjectConverter)\n const actualClassName = useMemo(() => {\n const styleTypeValues = styleType\n ? STYLE_TYPE_MAP[styleType as StyleType]\n : UNDEFINED_STYLE_VALUES\n\n return classNameGenerator({\n size: size || styleTypeValues.size,\n weight: weight || styleTypeValues.weight,\n color: color || styleTypeValues.color,\n leading: leading || styleTypeValues.leading,\n italic,\n whiteSpace,\n maxLines,\n className,\n })\n }, [size, weight, italic, color, leading, whiteSpace, maxLines, className, styleType])\n const hasIcon = !!icon\n const iconGap = icon?.gap\n\n const wrapperClassName = useMemo(\n () => (hasIcon ? wrapperClassNameGenerator({ gap: iconGap || 0.25 }) : ''),\n [hasIcon, iconGap],\n )\n\n return (\n <Component {...rest} className={actualClassName}>\n {icon ? (\n <span className={wrapperClassName}>\n {icon.prefix}\n {children}\n {icon.suffix}\n </span>\n ) : (\n children\n )}\n </Component>\n )\n}\n\nexport const Text = memo(ActualText) as typeof ActualText\n"],"names":["tv","useObjectAttributes","useMemo","_jsx","_jsxs","memo"],"mappings":"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"}
|
|
@@ -151,7 +151,9 @@ const ActualText = ({ emphasis, styleType, icon: orgIcon, weight = emphasis ? 'b
|
|
|
151
151
|
className,
|
|
152
152
|
});
|
|
153
153
|
}, [size, weight, italic, color, leading, whiteSpace, maxLines, className, styleType]);
|
|
154
|
-
const
|
|
154
|
+
const hasIcon = !!icon;
|
|
155
|
+
const iconGap = icon?.gap;
|
|
156
|
+
const wrapperClassName = useMemo(() => (hasIcon ? wrapperClassNameGenerator({ gap: iconGap || 0.25 }) : ''), [hasIcon, iconGap]);
|
|
155
157
|
return (jsx(Component, { ...rest, className: actualClassName, children: icon ? (jsxs("span", { className: wrapperClassName, children: [icon.prefix, children, icon.suffix] })) : (children) }));
|
|
156
158
|
};
|
|
157
159
|
const Text = memo(ActualText);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Text.js","sources":["../../../src/components/Text/Text.tsx"],"sourcesContent":["import {\n type ComponentProps,\n type ElementType,\n type PropsWithChildren,\n type ReactNode,\n memo,\n useMemo,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useObjectAttributes } from '../../hooks/useObjectAttributes'\n\nimport type { AbstractSize, CharRelativeSize } from '../../themes'\nimport type { Gap } from '../../types'\n\ntype StyleType =\n | 'screenTitle'\n | 'sectionTitle'\n | 'blockTitle'\n | 'subBlockTitle'\n | 'subSubBlockTitle'\n\nexport const STYLE_TYPE_MAP: { [key in StyleType]: VariantProps<typeof classNameGenerator> } = {\n screenTitle: {\n size: 'XL',\n leading: 'TIGHT',\n weight: 'normal',\n },\n sectionTitle: {\n size: 'L',\n leading: 'TIGHT',\n weight: 'normal',\n },\n blockTitle: {\n size: 'M',\n leading: 'TIGHT',\n weight: 'bold',\n },\n subBlockTitle: {\n size: 'M',\n leading: 'TIGHT',\n weight: 'bold',\n color: 'TEXT_GREY',\n },\n subSubBlockTitle: {\n size: 'S',\n leading: 'TIGHT',\n weight: 'bold',\n color: 'TEXT_GREY',\n },\n}\nconst UNDEFINED_STYLE_VALUES = {\n size: undefined,\n leading: undefined,\n weight: undefined,\n color: undefined,\n}\n\nconst classNameGenerator = tv({\n variants: {\n size: {\n XXS: 'shr-text-2xs',\n XS: 'shr-text-xs',\n S: 'shr-text-sm',\n M: 'shr-text-base',\n L: 'shr-text-lg',\n XL: 'shr-text-xl',\n XXL: 'shr-text-2xl',\n },\n weight: {\n normal: 'shr-font-normal',\n bold: 'shr-font-bold',\n },\n italic: {\n true: 'shr-italic',\n },\n color: {\n TEXT_BLACK: 'shr-text-black',\n TEXT_WHITE: 'shr-text-white',\n TEXT_GREY: 'shr-text-grey',\n TEXT_DISABLED: 'shr-text-disabled',\n TEXT_LINK: 'shr-text-link',\n inherit: 'shr-text-color-inherit',\n },\n leading: {\n NONE: 'shr-leading-none',\n TIGHT: 'shr-leading-tight',\n NORMAL: 'shr-leading-normal',\n LOOSE: 'shr-leading-loose',\n },\n whiteSpace: {\n normal: 'shr-whitespace-normal',\n nowrap: 'shr-whitespace-nowrap',\n pre: 'shr-whitespace-pre',\n 'pre-line': 'shr-whitespace-pre-line',\n 'pre-wrap': 'shr-whitespace-pre-wrap',\n },\n maxLines: {\n 1: 'shr-inline-block shr-w-full shr-overflow-x-clip shr-overflow-ellipsis shr-whitespace-nowrap shr-align-middle',\n 2: 'shr-line-clamp-[2]',\n 3: 'shr-line-clamp-[3]',\n 4: 'shr-line-clamp-[4]',\n 5: 'shr-line-clamp-[5]',\n 6: 'shr-line-clamp-[6]',\n },\n },\n})\n\nconst wrapperClassNameGenerator = tv({\n base: [\n 'smarthr-ui-Icon-extended smarthr-ui-Icon-withText shr-group/iconWrapper shr-inline-flex shr-items-baseline',\n ],\n variants: {\n gap: {\n 0: 'shr-gap-x-0',\n 0.25: 'shr-gap-x-0.25',\n 0.5: 'shr-gap-x-0.5',\n 0.75: 'shr-gap-x-0.75',\n 1: 'shr-gap-x-1',\n 1.25: 'shr-gap-x-1.25',\n 1.5: 'shr-gap-x-1.5',\n 2: 'shr-gap-x-2',\n 2.5: 'shr-gap-x-2.5',\n 3: 'shr-gap-x-3',\n 3.5: 'shr-gap-x-3.5',\n 4: 'shr-gap-x-4',\n 8: 'shr-gap-x-8',\n '-0.25': '-shr-gap-x-0.25',\n '-0.5': '-shr-gap-x-0.5',\n '-0.75': '-shr-gap-x-0.75',\n '-1': '-shr-gap-x-1',\n '-1.25': '-shr-gap-x-1.25',\n '-1.5': '-shr-gap-x-1.5',\n '-2': '-shr-gap-x-2',\n '-2.5': '-shr-gap-x-2.5',\n '-3': '-shr-gap-x-3',\n '-3.5': '-shr-gap-x-3.5',\n '-4': '-shr-gap-x-4',\n '-8': '-shr-gap-x-8',\n X3S: 'shr-gap-x-0.25',\n XXS: 'shr-gap-x-0.5',\n XS: 'shr-gap-x-1',\n S: 'shr-gap-x-1.5',\n M: 'shr-gap-x-2',\n L: 'shr-gap-x-2.5',\n XL: 'shr-gap-x-3',\n XXL: 'shr-gap-x-3.5',\n X3L: 'shr-gap-x-4',\n } as { [key in Gap]: string },\n },\n})\n\ntype ActualIconType =\n | undefined\n | {\n /** テキスト左に設置するアイコン */\n prefix?: ReactNode\n /** テキスト右に設置するアイコン */\n suffix?: ReactNode\n /** アイコンと並べるテキストとの溝 */\n gap?: CharRelativeSize | AbstractSize\n }\ntype IconType = ActualIconType | ReactNode\n\n// VariantProps を使うとコメントが書けない〜🥹\nexport type TextProps<T extends ElementType = 'span'> = VariantProps<typeof classNameGenerator> & {\n /** テキストコンポーネントの HTML タグ名。初期値は span */\n as?: T\n /** 強調するかどうかの真偽値。指定すると em 要素になる */\n emphasis?: boolean\n /** 見た目の種類 */\n styleType?: StyleType\n /** 設置するアイコン */\n icon?: IconType\n}\n\nconst iconObjectConverter = (icon: ReactNode) => (icon ? { prefix: icon } : undefined)\n\nconst ActualText = <T extends ElementType = 'span'>({\n emphasis,\n styleType,\n icon: orgIcon,\n weight = emphasis ? 'bold' : undefined,\n as: Component = emphasis ? 'em' : 'span',\n size,\n italic,\n color,\n leading,\n whiteSpace,\n maxLines,\n className,\n children,\n ...rest\n}: PropsWithChildren<TextProps<T> & ComponentProps<T>>) => {\n if (maxLines !== undefined && (maxLines < 1 || maxLines > 6)) {\n throw new Error('\"maxLines\" は 1 ~ 6 の範囲で指定してください')\n }\n\n const icon = useObjectAttributes<IconType, ActualIconType>(orgIcon, iconObjectConverter)\n const actualClassName = useMemo(() => {\n const styleTypeValues = styleType\n ? STYLE_TYPE_MAP[styleType as StyleType]\n : UNDEFINED_STYLE_VALUES\n\n return classNameGenerator({\n size: size || styleTypeValues.size,\n weight: weight || styleTypeValues.weight,\n color: color || styleTypeValues.color,\n leading: leading || styleTypeValues.leading,\n italic,\n whiteSpace,\n maxLines,\n className,\n })\n }, [size, weight, italic, color, leading, whiteSpace, maxLines, className, styleType])\n const wrapperClassName = useMemo(\n () => (icon ? wrapperClassNameGenerator({ gap: icon.gap || 0.25 }) : ''),\n [icon],\n )\n\n return (\n <Component {...rest} className={actualClassName}>\n {icon ? (\n <span className={wrapperClassName}>\n {icon.prefix}\n {children}\n {icon.suffix}\n </span>\n ) : (\n children\n )}\n </Component>\n )\n}\n\nexport const Text = memo(ActualText) as typeof ActualText\n"],"names":["tv","_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Text.js","sources":["../../../src/components/Text/Text.tsx"],"sourcesContent":["import {\n type ComponentProps,\n type ElementType,\n type PropsWithChildren,\n type ReactNode,\n memo,\n useMemo,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { useObjectAttributes } from '../../hooks/useObjectAttributes'\n\nimport type { AbstractSize, CharRelativeSize } from '../../themes'\nimport type { Gap } from '../../types'\n\ntype StyleType =\n | 'screenTitle'\n | 'sectionTitle'\n | 'blockTitle'\n | 'subBlockTitle'\n | 'subSubBlockTitle'\n\nexport const STYLE_TYPE_MAP: { [key in StyleType]: VariantProps<typeof classNameGenerator> } = {\n screenTitle: {\n size: 'XL',\n leading: 'TIGHT',\n weight: 'normal',\n },\n sectionTitle: {\n size: 'L',\n leading: 'TIGHT',\n weight: 'normal',\n },\n blockTitle: {\n size: 'M',\n leading: 'TIGHT',\n weight: 'bold',\n },\n subBlockTitle: {\n size: 'M',\n leading: 'TIGHT',\n weight: 'bold',\n color: 'TEXT_GREY',\n },\n subSubBlockTitle: {\n size: 'S',\n leading: 'TIGHT',\n weight: 'bold',\n color: 'TEXT_GREY',\n },\n}\nconst UNDEFINED_STYLE_VALUES = {\n size: undefined,\n leading: undefined,\n weight: undefined,\n color: undefined,\n}\n\nconst classNameGenerator = tv({\n variants: {\n size: {\n XXS: 'shr-text-2xs',\n XS: 'shr-text-xs',\n S: 'shr-text-sm',\n M: 'shr-text-base',\n L: 'shr-text-lg',\n XL: 'shr-text-xl',\n XXL: 'shr-text-2xl',\n },\n weight: {\n normal: 'shr-font-normal',\n bold: 'shr-font-bold',\n },\n italic: {\n true: 'shr-italic',\n },\n color: {\n TEXT_BLACK: 'shr-text-black',\n TEXT_WHITE: 'shr-text-white',\n TEXT_GREY: 'shr-text-grey',\n TEXT_DISABLED: 'shr-text-disabled',\n TEXT_LINK: 'shr-text-link',\n inherit: 'shr-text-color-inherit',\n },\n leading: {\n NONE: 'shr-leading-none',\n TIGHT: 'shr-leading-tight',\n NORMAL: 'shr-leading-normal',\n LOOSE: 'shr-leading-loose',\n },\n whiteSpace: {\n normal: 'shr-whitespace-normal',\n nowrap: 'shr-whitespace-nowrap',\n pre: 'shr-whitespace-pre',\n 'pre-line': 'shr-whitespace-pre-line',\n 'pre-wrap': 'shr-whitespace-pre-wrap',\n },\n maxLines: {\n 1: 'shr-inline-block shr-w-full shr-overflow-x-clip shr-overflow-ellipsis shr-whitespace-nowrap shr-align-middle',\n 2: 'shr-line-clamp-[2]',\n 3: 'shr-line-clamp-[3]',\n 4: 'shr-line-clamp-[4]',\n 5: 'shr-line-clamp-[5]',\n 6: 'shr-line-clamp-[6]',\n },\n },\n})\n\nconst wrapperClassNameGenerator = tv({\n base: [\n 'smarthr-ui-Icon-extended smarthr-ui-Icon-withText shr-group/iconWrapper shr-inline-flex shr-items-baseline',\n ],\n variants: {\n gap: {\n 0: 'shr-gap-x-0',\n 0.25: 'shr-gap-x-0.25',\n 0.5: 'shr-gap-x-0.5',\n 0.75: 'shr-gap-x-0.75',\n 1: 'shr-gap-x-1',\n 1.25: 'shr-gap-x-1.25',\n 1.5: 'shr-gap-x-1.5',\n 2: 'shr-gap-x-2',\n 2.5: 'shr-gap-x-2.5',\n 3: 'shr-gap-x-3',\n 3.5: 'shr-gap-x-3.5',\n 4: 'shr-gap-x-4',\n 8: 'shr-gap-x-8',\n '-0.25': '-shr-gap-x-0.25',\n '-0.5': '-shr-gap-x-0.5',\n '-0.75': '-shr-gap-x-0.75',\n '-1': '-shr-gap-x-1',\n '-1.25': '-shr-gap-x-1.25',\n '-1.5': '-shr-gap-x-1.5',\n '-2': '-shr-gap-x-2',\n '-2.5': '-shr-gap-x-2.5',\n '-3': '-shr-gap-x-3',\n '-3.5': '-shr-gap-x-3.5',\n '-4': '-shr-gap-x-4',\n '-8': '-shr-gap-x-8',\n X3S: 'shr-gap-x-0.25',\n XXS: 'shr-gap-x-0.5',\n XS: 'shr-gap-x-1',\n S: 'shr-gap-x-1.5',\n M: 'shr-gap-x-2',\n L: 'shr-gap-x-2.5',\n XL: 'shr-gap-x-3',\n XXL: 'shr-gap-x-3.5',\n X3L: 'shr-gap-x-4',\n } as { [key in Gap]: string },\n },\n})\n\ntype ActualIconType =\n | undefined\n | {\n /** テキスト左に設置するアイコン */\n prefix?: ReactNode\n /** テキスト右に設置するアイコン */\n suffix?: ReactNode\n /** アイコンと並べるテキストとの溝 */\n gap?: CharRelativeSize | AbstractSize\n }\ntype IconType = ActualIconType | ReactNode\n\n// VariantProps を使うとコメントが書けない〜🥹\nexport type TextProps<T extends ElementType = 'span'> = VariantProps<typeof classNameGenerator> & {\n /** テキストコンポーネントの HTML タグ名。初期値は span */\n as?: T\n /** 強調するかどうかの真偽値。指定すると em 要素になる */\n emphasis?: boolean\n /** 見た目の種類 */\n styleType?: StyleType\n /** 設置するアイコン */\n icon?: IconType\n}\n\nconst iconObjectConverter = (icon: ReactNode) => (icon ? { prefix: icon } : undefined)\n\nconst ActualText = <T extends ElementType = 'span'>({\n emphasis,\n styleType,\n icon: orgIcon,\n weight = emphasis ? 'bold' : undefined,\n as: Component = emphasis ? 'em' : 'span',\n size,\n italic,\n color,\n leading,\n whiteSpace,\n maxLines,\n className,\n children,\n ...rest\n}: PropsWithChildren<TextProps<T> & ComponentProps<T>>) => {\n if (maxLines !== undefined && (maxLines < 1 || maxLines > 6)) {\n throw new Error('\"maxLines\" は 1 ~ 6 の範囲で指定してください')\n }\n\n const icon = useObjectAttributes<IconType, ActualIconType>(orgIcon, iconObjectConverter)\n const actualClassName = useMemo(() => {\n const styleTypeValues = styleType\n ? STYLE_TYPE_MAP[styleType as StyleType]\n : UNDEFINED_STYLE_VALUES\n\n return classNameGenerator({\n size: size || styleTypeValues.size,\n weight: weight || styleTypeValues.weight,\n color: color || styleTypeValues.color,\n leading: leading || styleTypeValues.leading,\n italic,\n whiteSpace,\n maxLines,\n className,\n })\n }, [size, weight, italic, color, leading, whiteSpace, maxLines, className, styleType])\n const hasIcon = !!icon\n const iconGap = icon?.gap\n\n const wrapperClassName = useMemo(\n () => (hasIcon ? wrapperClassNameGenerator({ gap: iconGap || 0.25 }) : ''),\n [hasIcon, iconGap],\n )\n\n return (\n <Component {...rest} className={actualClassName}>\n {icon ? (\n <span className={wrapperClassName}>\n {icon.prefix}\n {children}\n {icon.suffix}\n </span>\n ) : (\n children\n )}\n </Component>\n )\n}\n\nexport const Text = memo(ActualText) as typeof ActualText\n"],"names":["tv","_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -36,37 +36,23 @@ const prefixWrapperClassName = prefixWrapper();
|
|
|
36
36
|
const suffixWrapperClassName = suffixWrapper();
|
|
37
37
|
const ActualTextLink = React.forwardRef(({ elementAs, href, target, rel, onClick, children, prefix, suffix, className, size, ...rest }, ref) => {
|
|
38
38
|
const Anchor = elementAs || 'a';
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
return suffix;
|
|
45
|
-
}, [prefix, suffix, target]);
|
|
46
|
-
const actualHref = React.useMemo(() => {
|
|
47
|
-
if (href) {
|
|
48
|
-
return href;
|
|
49
|
-
}
|
|
50
|
-
if (onClick) {
|
|
51
|
-
return '';
|
|
52
|
-
}
|
|
53
|
-
return undefined;
|
|
54
|
-
}, [href, onClick]);
|
|
55
|
-
const actualRel = React.useMemo(() => (rel === undefined && target === '_blank' ? 'noopener noreferrer' : rel), [rel, target]);
|
|
39
|
+
// target="_blank" だが OpenInNewTabIcon を表示したくない場合 suffix に null を指定すれば表示しないようにしている
|
|
40
|
+
const actualSuffix = target === '_blank' && !prefix && suffix === undefined ? jsxRuntime.jsx(components_Icon_OpenInNewTabIcon.OpenInNewTabIcon, {}) : suffix;
|
|
41
|
+
const actualHref = href ? href : onClick ? '' : undefined;
|
|
42
|
+
const actualRel = rel === undefined && target === '_blank' ? 'noopener noreferrer' : rel;
|
|
56
43
|
const anchorClassName = React.useMemo(() => anchor({ size, className }), [size, className]);
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
44
|
+
const onClickRef = React.useRef(onClick);
|
|
45
|
+
onClickRef.current = onClick;
|
|
46
|
+
const actualOnClick = React.useCallback((e) => {
|
|
47
|
+
if (!onClickRef.current) {
|
|
48
|
+
return;
|
|
60
49
|
}
|
|
61
|
-
if (href) {
|
|
62
|
-
return onClick;
|
|
63
|
-
}
|
|
64
|
-
return (e) => {
|
|
50
|
+
if (!href) {
|
|
65
51
|
e.preventDefault();
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}, [
|
|
69
|
-
return (jsxRuntime.jsxs(Anchor, { ...rest, ref: ref, href: actualHref, target: target, rel: actualRel, onClick: actualOnClick, className: anchorClassName, children: [prefix && jsxRuntime.jsx("span", { className: prefixWrapperClassName, children: prefix }), children, actualSuffix && jsxRuntime.jsx("span", { className: suffixWrapperClassName, children: actualSuffix })] }));
|
|
52
|
+
}
|
|
53
|
+
onClickRef.current(e);
|
|
54
|
+
}, [href]);
|
|
55
|
+
return (jsxRuntime.jsxs(Anchor, { ...rest, ref: ref, href: actualHref, target: target, rel: actualRel, onClick: onClick && actualOnClick, className: anchorClassName, children: [prefix && jsxRuntime.jsx("span", { className: prefixWrapperClassName, children: prefix }), children, actualSuffix && jsxRuntime.jsx("span", { className: suffixWrapperClassName, children: actualSuffix })] }));
|
|
70
56
|
});
|
|
71
57
|
const TextLink = React.memo(ActualTextLink);
|
|
72
58
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextLink.cjs","sources":["../../../src/components/TextLink/TextLink.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ElementType,\n type FC,\n type MouseEvent,\n type PropsWithoutRef,\n type ReactNode,\n type Ref,\n forwardRef,\n memo,\n useMemo,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { OpenInNewTabIcon } from '../Icon'\n\nimport type { ElementRef, ElementRefProps } from '../../types'\n\ntype ElementProps<T extends ElementType> = Omit<\n ComponentPropsWithoutRef<T>,\n (keyof Props<T> & ElementRefProps<T>) | 'color'\n>\n\ntype Props<T extends ElementType> = VariantProps<typeof classNameGenerator> & {\n /** リンクをクリックした時に発火するコールバック関数 */\n onClick?: (e: MouseEvent) => void\n /** テキストの前に表示するアイコン */\n prefix?: ReactNode\n /** テキストの後ろに表示するアイコン */\n suffix?: ReactNode\n /** TextLinkを利用しつつnext/linkなどと併用する場合に指定する */\n elementAs?: T\n}\n\ntype TextLinkComponent = <T extends ElementType = 'a'>(\n props: Props<T> & ElementProps<T> & ElementRefProps<T>,\n) => ReturnType<FC>\n\nconst classNameGenerator = tv({\n slots: {\n anchor: [\n 'shr-text-link shr-no-underline shr-shadow-underline',\n 'forced-colors:shr-underline',\n '[&:not([href])]:shr-shadow-none [&:not([href])]:forced-colors:shr-no-underline',\n '[.smarthr-ui-Th_&]:shr-text-link-darken',\n ],\n prefixWrapper: 'shr-me-0.25 shr-align-middle',\n suffixWrapper: 'shr-ms-0.25 shr-align-middle',\n },\n variants: {\n size: {\n XS: {\n anchor: 'shr-text-xs',\n },\n S: {\n anchor: 'shr-text-sm',\n },\n M: {\n anchor: 'shr-text-base',\n },\n },\n },\n})\nconst { anchor, prefixWrapper, suffixWrapper } = classNameGenerator()\nconst prefixWrapperClassName = prefixWrapper()\nconst suffixWrapperClassName = suffixWrapper()\n\nconst ActualTextLink: TextLinkComponent = forwardRef(\n <T extends ElementType = 'a'>(\n {\n elementAs,\n href,\n target,\n rel,\n onClick,\n children,\n prefix,\n suffix,\n className,\n size,\n ...rest\n }: PropsWithoutRef<Props<T>> & ElementProps<T>,\n ref: Ref<ElementRef<T>>,\n ) => {\n const Anchor = elementAs || 'a'\n
|
|
1
|
+
{"version":3,"file":"TextLink.cjs","sources":["../../../src/components/TextLink/TextLink.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ElementType,\n type FC,\n type MouseEvent,\n type PropsWithoutRef,\n type ReactNode,\n type Ref,\n forwardRef,\n memo,\n useCallback,\n useMemo,\n useRef,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { OpenInNewTabIcon } from '../Icon'\n\nimport type { ElementRef, ElementRefProps } from '../../types'\n\ntype ElementProps<T extends ElementType> = Omit<\n ComponentPropsWithoutRef<T>,\n (keyof Props<T> & ElementRefProps<T>) | 'color'\n>\n\ntype Props<T extends ElementType> = VariantProps<typeof classNameGenerator> & {\n /** リンクをクリックした時に発火するコールバック関数 */\n onClick?: (e: MouseEvent) => void\n /** テキストの前に表示するアイコン */\n prefix?: ReactNode\n /** テキストの後ろに表示するアイコン */\n suffix?: ReactNode\n /** TextLinkを利用しつつnext/linkなどと併用する場合に指定する */\n elementAs?: T\n}\n\ntype TextLinkComponent = <T extends ElementType = 'a'>(\n props: Props<T> & ElementProps<T> & ElementRefProps<T>,\n) => ReturnType<FC>\n\nconst classNameGenerator = tv({\n slots: {\n anchor: [\n 'shr-text-link shr-no-underline shr-shadow-underline',\n 'forced-colors:shr-underline',\n '[&:not([href])]:shr-shadow-none [&:not([href])]:forced-colors:shr-no-underline',\n '[.smarthr-ui-Th_&]:shr-text-link-darken',\n ],\n prefixWrapper: 'shr-me-0.25 shr-align-middle',\n suffixWrapper: 'shr-ms-0.25 shr-align-middle',\n },\n variants: {\n size: {\n XS: {\n anchor: 'shr-text-xs',\n },\n S: {\n anchor: 'shr-text-sm',\n },\n M: {\n anchor: 'shr-text-base',\n },\n },\n },\n})\nconst { anchor, prefixWrapper, suffixWrapper } = classNameGenerator()\nconst prefixWrapperClassName = prefixWrapper()\nconst suffixWrapperClassName = suffixWrapper()\n\nconst ActualTextLink: TextLinkComponent = forwardRef(\n <T extends ElementType = 'a'>(\n {\n elementAs,\n href,\n target,\n rel,\n onClick,\n children,\n prefix,\n suffix,\n className,\n size,\n ...rest\n }: PropsWithoutRef<Props<T>> & ElementProps<T>,\n ref: Ref<ElementRef<T>>,\n ) => {\n const Anchor = elementAs || 'a'\n // target=\"_blank\" だが OpenInNewTabIcon を表示したくない場合 suffix に null を指定すれば表示しないようにしている\n const actualSuffix =\n target === '_blank' && !prefix && suffix === undefined ? <OpenInNewTabIcon /> : suffix\n const actualHref = href ? href : onClick ? '' : undefined\n const actualRel = rel === undefined && target === '_blank' ? 'noopener noreferrer' : rel\n const anchorClassName = useMemo(() => anchor({ size, className }), [size, className])\n\n const onClickRef = useRef(onClick)\n onClickRef.current = onClick\n\n const actualOnClick = useCallback(\n (e: MouseEvent) => {\n if (!onClickRef.current) {\n return\n }\n\n if (!href) {\n e.preventDefault()\n }\n onClickRef.current(e)\n },\n [href],\n )\n\n return (\n <Anchor\n {...rest}\n ref={ref}\n href={actualHref}\n target={target}\n rel={actualRel}\n onClick={onClick && actualOnClick}\n className={anchorClassName}\n >\n {prefix && <span className={prefixWrapperClassName}>{prefix}</span>}\n {children}\n {actualSuffix && <span className={suffixWrapperClassName}>{actualSuffix}</span>}\n </Anchor>\n )\n },\n)\n\nexport const TextLink = memo(ActualTextLink) as typeof ActualTextLink\n"],"names":["tv","forwardRef","_jsx","OpenInNewTabIcon","useMemo","useRef","useCallback","_jsxs","memo"],"mappings":";;;;;;;;AAwCA,MAAM,kBAAkB,GAAGA,QAAE,CAAC;AAC5B,IAAA,KAAK,EAAE;AACL,QAAA,MAAM,EAAE;YACN,qDAAqD;YACrD,6BAA6B;YAC7B,gFAAgF;YAChF,yCAAyC;AAC1C,SAAA;AACD,QAAA,aAAa,EAAE,8BAA8B;AAC7C,QAAA,aAAa,EAAE,8BAA8B;AAC9C,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE;AACF,gBAAA,MAAM,EAAE,aAAa;AACtB,aAAA;AACD,YAAA,CAAC,EAAE;AACD,gBAAA,MAAM,EAAE,aAAa;AACtB,aAAA;AACD,YAAA,CAAC,EAAE;AACD,gBAAA,MAAM,EAAE,eAAe;AACxB,aAAA;AACF,SAAA;AACF,KAAA;AACF,CAAA,CAAC;AACF,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,kBAAkB,EAAE;AACrE,MAAM,sBAAsB,GAAG,aAAa,EAAE;AAC9C,MAAM,sBAAsB,GAAG,aAAa,EAAE;AAE9C,MAAM,cAAc,GAAsBC,gBAAU,CAClD,CACE,EACE,SAAS,EACT,IAAI,EACJ,MAAM,EACN,GAAG,EACH,OAAO,EACP,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,IAAI,EACJ,GAAG,IAAI,EACqC,EAC9C,GAAuB,KACrB;AACF,IAAA,MAAM,MAAM,GAAG,SAAS,IAAI,GAAG;;IAE/B,MAAM,YAAY,GAChB,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,SAAS,GAAGC,cAAA,CAACC,iDAAgB,KAAG,GAAG,MAAM;AACxF,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE,GAAG,SAAS;AACzD,IAAA,MAAM,SAAS,GAAG,GAAG,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,GAAG,qBAAqB,GAAG,GAAG;IACxF,MAAM,eAAe,GAAGC,aAAO,CAAC,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAErF,IAAA,MAAM,UAAU,GAAGC,YAAM,CAAC,OAAO,CAAC;AAClC,IAAA,UAAU,CAAC,OAAO,GAAG,OAAO;AAE5B,IAAA,MAAM,aAAa,GAAGC,iBAAW,CAC/B,CAAC,CAAa,KAAI;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACvB;QACF;QAEA,IAAI,CAAC,IAAI,EAAE;YACT,CAAC,CAAC,cAAc,EAAE;QACpB;AACA,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACvB,IAAA,CAAC,EACD,CAAC,IAAI,CAAC,CACP;IAED,QACEC,eAAA,CAAC,MAAM,EAAA,EAAA,GACD,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,OAAO,IAAI,aAAa,EACjC,SAAS,EAAE,eAAe,EAAA,QAAA,EAAA,CAEzB,MAAM,IAAIL,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,sBAAsB,EAAA,QAAA,EAAG,MAAM,EAAA,CAAQ,EAClE,QAAQ,EACR,YAAY,IAAIA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,sBAAsB,EAAA,QAAA,EAAG,YAAY,EAAA,CAAQ,CAAA,EAAA,CACxE;AAEb,CAAC,CACF;MAEY,QAAQ,GAAGM,UAAI,CAAC,cAAc;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, useMemo, memo } from 'react';
|
|
2
|
+
import { forwardRef, useMemo, useRef, useCallback, memo } from 'react';
|
|
3
3
|
import { tv as ce } from './../../vendor/.pnpm/tailwind-variants@0.3.1_tailwindcss@3.4.19_ts-node@10.9.2_@swc_core@1.15.17_@types_node@20.19.35_typescript@5.9.3__/vendor/tailwind-variants/dist/index.js';
|
|
4
4
|
import '../Icon/generateIcon.js';
|
|
5
5
|
import { OpenInNewTabIcon } from '../Icon/OpenInNewTabIcon.js';
|
|
@@ -34,37 +34,23 @@ const prefixWrapperClassName = prefixWrapper();
|
|
|
34
34
|
const suffixWrapperClassName = suffixWrapper();
|
|
35
35
|
const ActualTextLink = forwardRef(({ elementAs, href, target, rel, onClick, children, prefix, suffix, className, size, ...rest }, ref) => {
|
|
36
36
|
const Anchor = elementAs || 'a';
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
return suffix;
|
|
43
|
-
}, [prefix, suffix, target]);
|
|
44
|
-
const actualHref = useMemo(() => {
|
|
45
|
-
if (href) {
|
|
46
|
-
return href;
|
|
47
|
-
}
|
|
48
|
-
if (onClick) {
|
|
49
|
-
return '';
|
|
50
|
-
}
|
|
51
|
-
return undefined;
|
|
52
|
-
}, [href, onClick]);
|
|
53
|
-
const actualRel = useMemo(() => (rel === undefined && target === '_blank' ? 'noopener noreferrer' : rel), [rel, target]);
|
|
37
|
+
// target="_blank" だが OpenInNewTabIcon を表示したくない場合 suffix に null を指定すれば表示しないようにしている
|
|
38
|
+
const actualSuffix = target === '_blank' && !prefix && suffix === undefined ? jsx(OpenInNewTabIcon, {}) : suffix;
|
|
39
|
+
const actualHref = href ? href : onClick ? '' : undefined;
|
|
40
|
+
const actualRel = rel === undefined && target === '_blank' ? 'noopener noreferrer' : rel;
|
|
54
41
|
const anchorClassName = useMemo(() => anchor({ size, className }), [size, className]);
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
42
|
+
const onClickRef = useRef(onClick);
|
|
43
|
+
onClickRef.current = onClick;
|
|
44
|
+
const actualOnClick = useCallback((e) => {
|
|
45
|
+
if (!onClickRef.current) {
|
|
46
|
+
return;
|
|
58
47
|
}
|
|
59
|
-
if (href) {
|
|
60
|
-
return onClick;
|
|
61
|
-
}
|
|
62
|
-
return (e) => {
|
|
48
|
+
if (!href) {
|
|
63
49
|
e.preventDefault();
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}, [
|
|
67
|
-
return (jsxs(Anchor, { ...rest, ref: ref, href: actualHref, target: target, rel: actualRel, onClick: actualOnClick, className: anchorClassName, children: [prefix && jsx("span", { className: prefixWrapperClassName, children: prefix }), children, actualSuffix && jsx("span", { className: suffixWrapperClassName, children: actualSuffix })] }));
|
|
50
|
+
}
|
|
51
|
+
onClickRef.current(e);
|
|
52
|
+
}, [href]);
|
|
53
|
+
return (jsxs(Anchor, { ...rest, ref: ref, href: actualHref, target: target, rel: actualRel, onClick: onClick && actualOnClick, className: anchorClassName, children: [prefix && jsx("span", { className: prefixWrapperClassName, children: prefix }), children, actualSuffix && jsx("span", { className: suffixWrapperClassName, children: actualSuffix })] }));
|
|
68
54
|
});
|
|
69
55
|
const TextLink = memo(ActualTextLink);
|
|
70
56
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextLink.js","sources":["../../../src/components/TextLink/TextLink.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ElementType,\n type FC,\n type MouseEvent,\n type PropsWithoutRef,\n type ReactNode,\n type Ref,\n forwardRef,\n memo,\n useMemo,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { OpenInNewTabIcon } from '../Icon'\n\nimport type { ElementRef, ElementRefProps } from '../../types'\n\ntype ElementProps<T extends ElementType> = Omit<\n ComponentPropsWithoutRef<T>,\n (keyof Props<T> & ElementRefProps<T>) | 'color'\n>\n\ntype Props<T extends ElementType> = VariantProps<typeof classNameGenerator> & {\n /** リンクをクリックした時に発火するコールバック関数 */\n onClick?: (e: MouseEvent) => void\n /** テキストの前に表示するアイコン */\n prefix?: ReactNode\n /** テキストの後ろに表示するアイコン */\n suffix?: ReactNode\n /** TextLinkを利用しつつnext/linkなどと併用する場合に指定する */\n elementAs?: T\n}\n\ntype TextLinkComponent = <T extends ElementType = 'a'>(\n props: Props<T> & ElementProps<T> & ElementRefProps<T>,\n) => ReturnType<FC>\n\nconst classNameGenerator = tv({\n slots: {\n anchor: [\n 'shr-text-link shr-no-underline shr-shadow-underline',\n 'forced-colors:shr-underline',\n '[&:not([href])]:shr-shadow-none [&:not([href])]:forced-colors:shr-no-underline',\n '[.smarthr-ui-Th_&]:shr-text-link-darken',\n ],\n prefixWrapper: 'shr-me-0.25 shr-align-middle',\n suffixWrapper: 'shr-ms-0.25 shr-align-middle',\n },\n variants: {\n size: {\n XS: {\n anchor: 'shr-text-xs',\n },\n S: {\n anchor: 'shr-text-sm',\n },\n M: {\n anchor: 'shr-text-base',\n },\n },\n },\n})\nconst { anchor, prefixWrapper, suffixWrapper } = classNameGenerator()\nconst prefixWrapperClassName = prefixWrapper()\nconst suffixWrapperClassName = suffixWrapper()\n\nconst ActualTextLink: TextLinkComponent = forwardRef(\n <T extends ElementType = 'a'>(\n {\n elementAs,\n href,\n target,\n rel,\n onClick,\n children,\n prefix,\n suffix,\n className,\n size,\n ...rest\n }: PropsWithoutRef<Props<T>> & ElementProps<T>,\n ref: Ref<ElementRef<T>>,\n ) => {\n const Anchor = elementAs || 'a'\n
|
|
1
|
+
{"version":3,"file":"TextLink.js","sources":["../../../src/components/TextLink/TextLink.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ElementType,\n type FC,\n type MouseEvent,\n type PropsWithoutRef,\n type ReactNode,\n type Ref,\n forwardRef,\n memo,\n useCallback,\n useMemo,\n useRef,\n} from 'react'\nimport { type VariantProps, tv } from 'tailwind-variants'\n\nimport { OpenInNewTabIcon } from '../Icon'\n\nimport type { ElementRef, ElementRefProps } from '../../types'\n\ntype ElementProps<T extends ElementType> = Omit<\n ComponentPropsWithoutRef<T>,\n (keyof Props<T> & ElementRefProps<T>) | 'color'\n>\n\ntype Props<T extends ElementType> = VariantProps<typeof classNameGenerator> & {\n /** リンクをクリックした時に発火するコールバック関数 */\n onClick?: (e: MouseEvent) => void\n /** テキストの前に表示するアイコン */\n prefix?: ReactNode\n /** テキストの後ろに表示するアイコン */\n suffix?: ReactNode\n /** TextLinkを利用しつつnext/linkなどと併用する場合に指定する */\n elementAs?: T\n}\n\ntype TextLinkComponent = <T extends ElementType = 'a'>(\n props: Props<T> & ElementProps<T> & ElementRefProps<T>,\n) => ReturnType<FC>\n\nconst classNameGenerator = tv({\n slots: {\n anchor: [\n 'shr-text-link shr-no-underline shr-shadow-underline',\n 'forced-colors:shr-underline',\n '[&:not([href])]:shr-shadow-none [&:not([href])]:forced-colors:shr-no-underline',\n '[.smarthr-ui-Th_&]:shr-text-link-darken',\n ],\n prefixWrapper: 'shr-me-0.25 shr-align-middle',\n suffixWrapper: 'shr-ms-0.25 shr-align-middle',\n },\n variants: {\n size: {\n XS: {\n anchor: 'shr-text-xs',\n },\n S: {\n anchor: 'shr-text-sm',\n },\n M: {\n anchor: 'shr-text-base',\n },\n },\n },\n})\nconst { anchor, prefixWrapper, suffixWrapper } = classNameGenerator()\nconst prefixWrapperClassName = prefixWrapper()\nconst suffixWrapperClassName = suffixWrapper()\n\nconst ActualTextLink: TextLinkComponent = forwardRef(\n <T extends ElementType = 'a'>(\n {\n elementAs,\n href,\n target,\n rel,\n onClick,\n children,\n prefix,\n suffix,\n className,\n size,\n ...rest\n }: PropsWithoutRef<Props<T>> & ElementProps<T>,\n ref: Ref<ElementRef<T>>,\n ) => {\n const Anchor = elementAs || 'a'\n // target=\"_blank\" だが OpenInNewTabIcon を表示したくない場合 suffix に null を指定すれば表示しないようにしている\n const actualSuffix =\n target === '_blank' && !prefix && suffix === undefined ? <OpenInNewTabIcon /> : suffix\n const actualHref = href ? href : onClick ? '' : undefined\n const actualRel = rel === undefined && target === '_blank' ? 'noopener noreferrer' : rel\n const anchorClassName = useMemo(() => anchor({ size, className }), [size, className])\n\n const onClickRef = useRef(onClick)\n onClickRef.current = onClick\n\n const actualOnClick = useCallback(\n (e: MouseEvent) => {\n if (!onClickRef.current) {\n return\n }\n\n if (!href) {\n e.preventDefault()\n }\n onClickRef.current(e)\n },\n [href],\n )\n\n return (\n <Anchor\n {...rest}\n ref={ref}\n href={actualHref}\n target={target}\n rel={actualRel}\n onClick={onClick && actualOnClick}\n className={anchorClassName}\n >\n {prefix && <span className={prefixWrapperClassName}>{prefix}</span>}\n {children}\n {actualSuffix && <span className={suffixWrapperClassName}>{actualSuffix}</span>}\n </Anchor>\n )\n },\n)\n\nexport const TextLink = memo(ActualTextLink) as typeof ActualTextLink\n"],"names":["tv","_jsx","_jsxs"],"mappings":";;;;;;AAwCA,MAAM,kBAAkB,GAAGA,EAAE,CAAC;AAC5B,IAAA,KAAK,EAAE;AACL,QAAA,MAAM,EAAE;YACN,qDAAqD;YACrD,6BAA6B;YAC7B,gFAAgF;YAChF,yCAAyC;AAC1C,SAAA;AACD,QAAA,aAAa,EAAE,8BAA8B;AAC7C,QAAA,aAAa,EAAE,8BAA8B;AAC9C,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE;AACF,gBAAA,MAAM,EAAE,aAAa;AACtB,aAAA;AACD,YAAA,CAAC,EAAE;AACD,gBAAA,MAAM,EAAE,aAAa;AACtB,aAAA;AACD,YAAA,CAAC,EAAE;AACD,gBAAA,MAAM,EAAE,eAAe;AACxB,aAAA;AACF,SAAA;AACF,KAAA;AACF,CAAA,CAAC;AACF,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,kBAAkB,EAAE;AACrE,MAAM,sBAAsB,GAAG,aAAa,EAAE;AAC9C,MAAM,sBAAsB,GAAG,aAAa,EAAE;AAE9C,MAAM,cAAc,GAAsB,UAAU,CAClD,CACE,EACE,SAAS,EACT,IAAI,EACJ,MAAM,EACN,GAAG,EACH,OAAO,EACP,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,IAAI,EACJ,GAAG,IAAI,EACqC,EAC9C,GAAuB,KACrB;AACF,IAAA,MAAM,MAAM,GAAG,SAAS,IAAI,GAAG;;IAE/B,MAAM,YAAY,GAChB,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,SAAS,GAAGC,GAAA,CAAC,gBAAgB,KAAG,GAAG,MAAM;AACxF,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE,GAAG,SAAS;AACzD,IAAA,MAAM,SAAS,GAAG,GAAG,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,GAAG,qBAAqB,GAAG,GAAG;IACxF,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAErF,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;AAClC,IAAA,UAAU,CAAC,OAAO,GAAG,OAAO;AAE5B,IAAA,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAa,KAAI;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACvB;QACF;QAEA,IAAI,CAAC,IAAI,EAAE;YACT,CAAC,CAAC,cAAc,EAAE;QACpB;AACA,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACvB,IAAA,CAAC,EACD,CAAC,IAAI,CAAC,CACP;IAED,QACEC,IAAA,CAAC,MAAM,EAAA,EAAA,GACD,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,OAAO,IAAI,aAAa,EACjC,SAAS,EAAE,eAAe,EAAA,QAAA,EAAA,CAEzB,MAAM,IAAID,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,sBAAsB,EAAA,QAAA,EAAG,MAAM,EAAA,CAAQ,EAClE,QAAQ,EACR,YAAY,IAAIA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,sBAAsB,EAAA,QAAA,EAAG,YAAY,EAAA,CAAQ,CAAA,EAAA,CACxE;AAEb,CAAC,CACF;MAEY,QAAQ,GAAG,IAAI,CAAC,cAAc;;;;"}
|
|
@@ -9,12 +9,12 @@ require('../../../themes/createSpacing.cjs');
|
|
|
9
9
|
require('../../../_virtual/index.cjs');
|
|
10
10
|
require('../../../_virtual/index2.cjs');
|
|
11
11
|
require('../../../themes/createColor.cjs');
|
|
12
|
+
require('../../../themes/createTextColor.cjs');
|
|
13
|
+
require('styled-components');
|
|
12
14
|
require('../../../themes/createShadow/defaultShadow.cjs');
|
|
13
15
|
require('../../../themes/createWidth.cjs');
|
|
14
16
|
require('../../../themes/createBackgroundColor.cjs');
|
|
15
17
|
require('../../../themes/createBorder.cjs');
|
|
16
|
-
require('styled-components');
|
|
17
|
-
require('../../../themes/createTextColor.cjs');
|
|
18
18
|
require('../../../hooks/useTheme.cjs');
|
|
19
19
|
var components_Icon_FaIcon = require('../../Icon/FaIcon.cjs');
|
|
20
20
|
require('../../Icon/generateIcon.cjs');
|
|
@@ -7,12 +7,12 @@ import '../../../themes/createSpacing.js';
|
|
|
7
7
|
import '../../../_virtual/index.js';
|
|
8
8
|
import '../../../_virtual/index2.js';
|
|
9
9
|
import '../../../themes/createColor.js';
|
|
10
|
+
import '../../../themes/createTextColor.js';
|
|
11
|
+
import 'styled-components';
|
|
10
12
|
import '../../../themes/createShadow/defaultShadow.js';
|
|
11
13
|
import '../../../themes/createWidth.js';
|
|
12
14
|
import '../../../themes/createBackgroundColor.js';
|
|
13
15
|
import '../../../themes/createBorder.js';
|
|
14
|
-
import 'styled-components';
|
|
15
|
-
import '../../../themes/createTextColor.js';
|
|
16
16
|
import '../../../hooks/useTheme.js';
|
|
17
17
|
import { FaArrowLeftIcon } from '../../Icon/FaIcon.js';
|
|
18
18
|
import '../../Icon/generateIcon.js';
|
|
@@ -14,14 +14,14 @@ var libs_debounce = require('../../libs/debounce.cjs');
|
|
|
14
14
|
require('../../themes/createSpacing.cjs');
|
|
15
15
|
var themes_createFontSize = require('../../themes/createFontSize.cjs');
|
|
16
16
|
require('../../themes/createColor.cjs');
|
|
17
|
-
require('../../themes/
|
|
18
|
-
require('
|
|
17
|
+
require('../../themes/createTextColor.cjs');
|
|
18
|
+
require('styled-components');
|
|
19
19
|
require('../../_virtual/index.cjs');
|
|
20
20
|
require('../../_virtual/index2.cjs');
|
|
21
|
+
require('../../themes/createShadow/defaultShadow.cjs');
|
|
22
|
+
require('../../themes/createWidth.cjs');
|
|
21
23
|
require('../../themes/createBackgroundColor.cjs');
|
|
22
24
|
require('../../themes/createBorder.cjs');
|
|
23
|
-
require('styled-components');
|
|
24
|
-
require('../../themes/createTextColor.cjs');
|
|
25
25
|
var components_VisuallyHiddenText_VisuallyHiddenText = require('../VisuallyHiddenText/VisuallyHiddenText.cjs');
|
|
26
26
|
|
|
27
27
|
const getStringLength = (value) => {
|
|
@@ -76,6 +76,8 @@ const Textarea = React.forwardRef(({ autoFocus, maxLetters, width, className, au
|
|
|
76
76
|
const [interimRows, setInterimRows] = React.useState(rows);
|
|
77
77
|
const [count, setCount] = React.useState(currentValue ? getStringLength(currentValue) : 0);
|
|
78
78
|
const [srCounterMessage, setSrCounterMessage] = React.useState('');
|
|
79
|
+
const onChangeRef = React.useRef(onChange);
|
|
80
|
+
onChangeRef.current = onChange;
|
|
79
81
|
const buildAvailableLetters = React.useCallback((availableLetters) => (jsxRuntime.jsx(intl_Localizer.Localizer, { id: "smarthr-ui/Textarea/availableLetters", defaultText: "\u3042\u3068{availableLetters}\u6587\u5B57", values: { availableLetters } })), []);
|
|
80
82
|
const buildmaxLettersExceeded = React.useCallback((exceededLetters) => (jsxRuntime.jsx(intl_Localizer.Localizer, { id: "smarthr-ui/Textarea/maxLettersExceeded", defaultText: "{exceededLetters}\u6587\u5B57\u30AA\u30FC\u30D0\u30FC", values: { exceededLetters } })), []);
|
|
81
83
|
const buildScreenReaderMaxLettersDescription = React.useCallback((internalMaxLetters) => (jsxRuntime.jsx(intl_Localizer.Localizer, { id: "smarthr-ui/Textarea/screenReaderMaxLettersDescription", defaultText: "\u6700\u5927{maxLetters}\u6587\u5B57\u5165\u529B\u3067\u304D\u307E\u3059", values: { maxLetters: internalMaxLetters } })), []);
|
|
@@ -121,9 +123,8 @@ const Textarea = React.forwardRef(({ autoFocus, maxLetters, width, className, au
|
|
|
121
123
|
e.target.rows = currentRows;
|
|
122
124
|
setInterimRows(currentRows);
|
|
123
125
|
}
|
|
124
|
-
|
|
126
|
+
onChangeRef.current?.(e);
|
|
125
127
|
}, [
|
|
126
|
-
onChange,
|
|
127
128
|
debouncedUpdateCount,
|
|
128
129
|
debouncedUpdateSrCounterMessage,
|
|
129
130
|
autoResize,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.cjs","sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type ComponentPropsWithRef,\n type ReactNode,\n forwardRef,\n startTransition,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useTheme } from '../../hooks/useTheme'\nimport { Localizer } from '../../intl'\nimport { debounce } from '../../libs/debounce'\nimport { defaultHtmlFontSize } from '../../themes'\nimport { VisuallyHiddenText } from '../VisuallyHiddenText'\n\ntype AbstractProps = {\n /** 入力値にエラーがあるかどうか */\n error?: boolean\n /** コンポーネントの幅 */\n width?: number | string\n /** 自動でフォーカスされるかどうか */\n autoFocus?: boolean\n /** 自動で広がるかどうか */\n autoResize?: boolean\n /** 最大行数。超えるとスクロールする。初期値は無限 */\n maxRows?: number\n /** 行数の初期値。省略した場合は2 */\n rows?: number\n /** 入力可能な最大文字数。あと何文字入力できるかの表示が追加される。html的なvalidateは発生しない */\n maxLetters?: number\n /**\n * placeholder属性は非推奨です。別途ヒント用要素の設置を検討してください。\n */\n placeholder?: string\n}\ntype Props = AbstractProps & Omit<ComponentPropsWithRef<'textarea'>, keyof AbstractProps>\ntype TextareaValue = string | number | readonly string[]\n\nconst getStringLength = (value: TextareaValue) => {\n const formattedValue =\n typeof value === 'number' || typeof value === 'string'\n ? `${value}`\n : Array.isArray(value)\n ? value.join(',')\n : ''\n\n // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n const surrogatePairs = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g\n return formattedValue.length - (formattedValue.match(surrogatePairs) || []).length\n}\n\nconst classNameGenerator = tv({\n slots: {\n textareaEl: [\n 'smarthr-ui-Textarea-textarea',\n 'shr-border-shorthand shr-my-[unset] shr-box-border shr-rounded-m shr-bg-white shr-p-0.5 shr-text-base shr-leading-normal shr-text-black shr-opacity-100',\n 'contrast-more:shr-border-high-contrast',\n 'placeholder:shr-text-grey',\n 'focus-visible:shr-focus-indicator',\n 'disabled:shr-pointer-events-none disabled:shr-bg-column disabled:shr-text-disabled disabled:placeholder:shr-text-disabled',\n 'aria-[invalid]:shr-border-danger',\n ],\n counter: 'smarthr-ui-Textarea-counter shr-block shr-text-sm shr-text-black',\n },\n variants: {\n error: {\n true: {\n counter: 'shr-text-danger',\n },\n },\n },\n defaultVariants: {\n error: false,\n },\n})\n\nconst calculateIdealRows = (\n element: HTMLTextAreaElement | null | undefined,\n maxRows: number,\n lineHeightNormal: number,\n): number => {\n if (!element) {\n return 0\n }\n\n // 現在の入力値に応じた行数\n const currentInputValueRows = Math.floor(\n element.scrollHeight / (defaultHtmlFontSize * lineHeightNormal),\n )\n\n return currentInputValueRows < maxRows ? currentInputValueRows : maxRows\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, Props>(\n (\n {\n autoFocus,\n maxLetters,\n width,\n className,\n autoResize = false,\n maxRows = Infinity,\n rows = 2,\n error,\n onChange,\n value,\n defaultValue,\n ...rest\n },\n ref,\n ) => {\n const theme = useTheme()\n const maxLettersId = useId()\n const maxLettersNoticeId = `${maxLettersId}-notice`\n const actualMaxLettersId = maxLetters ? maxLettersId : undefined\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const currentValue = defaultValue || value\n const [interimRows, setInterimRows] = useState(rows)\n const [count, setCount] = useState(currentValue ? getStringLength(currentValue) : 0)\n const [srCounterMessage, setSrCounterMessage] = useState<ReactNode>('')\n\n const buildAvailableLetters = useCallback(\n (availableLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/availableLetters\"\n defaultText=\"あと{availableLetters}文字\"\n values={{ availableLetters }}\n />\n ),\n [],\n )\n\n const buildmaxLettersExceeded = useCallback(\n (exceededLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/maxLettersExceeded\"\n defaultText=\"{exceededLetters}文字オーバー\"\n values={{ exceededLetters }}\n />\n ),\n [],\n )\n\n const buildScreenReaderMaxLettersDescription = useCallback(\n (internalMaxLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/screenReaderMaxLettersDescription\"\n defaultText=\"最大{maxLetters}文字入力できます\"\n values={{ maxLetters: internalMaxLetters }}\n />\n ),\n [],\n )\n\n const getCounterMessage = useCallback(\n (counterValue: number) => {\n if (maxLetters === undefined) return\n\n if (counterValue > maxLetters) {\n // {count}文字オーバー\n return <>{buildmaxLettersExceeded(counterValue - maxLetters)}</>\n }\n\n // あと{count}文字\n return <>{buildAvailableLetters(maxLetters - counterValue)}</>\n },\n [maxLetters, buildAvailableLetters, buildmaxLettersExceeded],\n )\n\n const counterVisualMessage = useMemo(() => getCounterMessage(count), [count, getCounterMessage])\n\n useImperativeHandle<HTMLTextAreaElement | null, HTMLTextAreaElement | null>(\n ref,\n () => textareaRef.current,\n )\n\n const debouncedUpdateCount = useMemo(\n () =>\n maxLetters\n ? debounce((newValue: TextareaValue) => {\n startTransition(() => {\n setCount(getStringLength(newValue))\n })\n }, 200)\n : undefined,\n [maxLetters],\n )\n\n // countが連続で更新されると、スクリーンリーダーが古い値を読み上げてしまうため、メッセージの更新を遅延しています\n const debouncedUpdateSrCounterMessage = useMemo(\n () =>\n maxLetters\n ? debounce((newValue: TextareaValue) => {\n startTransition(() => {\n const counterText = getCounterMessage(getStringLength(newValue))\n\n if (counterText) {\n setSrCounterMessage(counterText)\n }\n })\n }, 1000)\n : undefined,\n [maxLetters, getCounterMessage],\n )\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n debouncedUpdateCount?.(newValue)\n debouncedUpdateSrCounterMessage?.(newValue)\n\n // rowsを初期化 TextareaのscrollHeightが文字列削除時に変更されないため\n e.target.rows = rows\n\n if (autoResize) {\n const currentRows = calculateIdealRows(e.target, maxRows, theme.leading.NORMAL)\n // rowsを直接反映 Textareaのrows propsが状態を変更しても反映されないため\n e.target.rows = currentRows\n setInterimRows(currentRows)\n }\n\n
|
|
1
|
+
{"version":3,"file":"Textarea.cjs","sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type ComponentPropsWithRef,\n type ReactNode,\n forwardRef,\n startTransition,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useTheme } from '../../hooks/useTheme'\nimport { Localizer } from '../../intl'\nimport { debounce } from '../../libs/debounce'\nimport { defaultHtmlFontSize } from '../../themes'\nimport { VisuallyHiddenText } from '../VisuallyHiddenText'\n\ntype AbstractProps = {\n /** 入力値にエラーがあるかどうか */\n error?: boolean\n /** コンポーネントの幅 */\n width?: number | string\n /** 自動でフォーカスされるかどうか */\n autoFocus?: boolean\n /** 自動で広がるかどうか */\n autoResize?: boolean\n /** 最大行数。超えるとスクロールする。初期値は無限 */\n maxRows?: number\n /** 行数の初期値。省略した場合は2 */\n rows?: number\n /** 入力可能な最大文字数。あと何文字入力できるかの表示が追加される。html的なvalidateは発生しない */\n maxLetters?: number\n /**\n * placeholder属性は非推奨です。別途ヒント用要素の設置を検討してください。\n */\n placeholder?: string\n}\ntype Props = AbstractProps & Omit<ComponentPropsWithRef<'textarea'>, keyof AbstractProps>\ntype TextareaValue = string | number | readonly string[]\n\nconst getStringLength = (value: TextareaValue) => {\n const formattedValue =\n typeof value === 'number' || typeof value === 'string'\n ? `${value}`\n : Array.isArray(value)\n ? value.join(',')\n : ''\n\n // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n const surrogatePairs = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g\n return formattedValue.length - (formattedValue.match(surrogatePairs) || []).length\n}\n\nconst classNameGenerator = tv({\n slots: {\n textareaEl: [\n 'smarthr-ui-Textarea-textarea',\n 'shr-border-shorthand shr-my-[unset] shr-box-border shr-rounded-m shr-bg-white shr-p-0.5 shr-text-base shr-leading-normal shr-text-black shr-opacity-100',\n 'contrast-more:shr-border-high-contrast',\n 'placeholder:shr-text-grey',\n 'focus-visible:shr-focus-indicator',\n 'disabled:shr-pointer-events-none disabled:shr-bg-column disabled:shr-text-disabled disabled:placeholder:shr-text-disabled',\n 'aria-[invalid]:shr-border-danger',\n ],\n counter: 'smarthr-ui-Textarea-counter shr-block shr-text-sm shr-text-black',\n },\n variants: {\n error: {\n true: {\n counter: 'shr-text-danger',\n },\n },\n },\n defaultVariants: {\n error: false,\n },\n})\n\nconst calculateIdealRows = (\n element: HTMLTextAreaElement | null | undefined,\n maxRows: number,\n lineHeightNormal: number,\n): number => {\n if (!element) {\n return 0\n }\n\n // 現在の入力値に応じた行数\n const currentInputValueRows = Math.floor(\n element.scrollHeight / (defaultHtmlFontSize * lineHeightNormal),\n )\n\n return currentInputValueRows < maxRows ? currentInputValueRows : maxRows\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, Props>(\n (\n {\n autoFocus,\n maxLetters,\n width,\n className,\n autoResize = false,\n maxRows = Infinity,\n rows = 2,\n error,\n onChange,\n value,\n defaultValue,\n ...rest\n },\n ref,\n ) => {\n const theme = useTheme()\n const maxLettersId = useId()\n const maxLettersNoticeId = `${maxLettersId}-notice`\n const actualMaxLettersId = maxLetters ? maxLettersId : undefined\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const currentValue = defaultValue || value\n const [interimRows, setInterimRows] = useState(rows)\n const [count, setCount] = useState(currentValue ? getStringLength(currentValue) : 0)\n const [srCounterMessage, setSrCounterMessage] = useState<ReactNode>('')\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const buildAvailableLetters = useCallback(\n (availableLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/availableLetters\"\n defaultText=\"あと{availableLetters}文字\"\n values={{ availableLetters }}\n />\n ),\n [],\n )\n\n const buildmaxLettersExceeded = useCallback(\n (exceededLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/maxLettersExceeded\"\n defaultText=\"{exceededLetters}文字オーバー\"\n values={{ exceededLetters }}\n />\n ),\n [],\n )\n\n const buildScreenReaderMaxLettersDescription = useCallback(\n (internalMaxLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/screenReaderMaxLettersDescription\"\n defaultText=\"最大{maxLetters}文字入力できます\"\n values={{ maxLetters: internalMaxLetters }}\n />\n ),\n [],\n )\n\n const getCounterMessage = useCallback(\n (counterValue: number) => {\n if (maxLetters === undefined) return\n\n if (counterValue > maxLetters) {\n // {count}文字オーバー\n return <>{buildmaxLettersExceeded(counterValue - maxLetters)}</>\n }\n\n // あと{count}文字\n return <>{buildAvailableLetters(maxLetters - counterValue)}</>\n },\n [maxLetters, buildAvailableLetters, buildmaxLettersExceeded],\n )\n\n const counterVisualMessage = useMemo(() => getCounterMessage(count), [count, getCounterMessage])\n\n useImperativeHandle<HTMLTextAreaElement | null, HTMLTextAreaElement | null>(\n ref,\n () => textareaRef.current,\n )\n\n const debouncedUpdateCount = useMemo(\n () =>\n maxLetters\n ? debounce((newValue: TextareaValue) => {\n startTransition(() => {\n setCount(getStringLength(newValue))\n })\n }, 200)\n : undefined,\n [maxLetters],\n )\n\n // countが連続で更新されると、スクリーンリーダーが古い値を読み上げてしまうため、メッセージの更新を遅延しています\n const debouncedUpdateSrCounterMessage = useMemo(\n () =>\n maxLetters\n ? debounce((newValue: TextareaValue) => {\n startTransition(() => {\n const counterText = getCounterMessage(getStringLength(newValue))\n\n if (counterText) {\n setSrCounterMessage(counterText)\n }\n })\n }, 1000)\n : undefined,\n [maxLetters, getCounterMessage],\n )\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n debouncedUpdateCount?.(newValue)\n debouncedUpdateSrCounterMessage?.(newValue)\n\n // rowsを初期化 TextareaのscrollHeightが文字列削除時に変更されないため\n e.target.rows = rows\n\n if (autoResize) {\n const currentRows = calculateIdealRows(e.target, maxRows, theme.leading.NORMAL)\n // rowsを直接反映 Textareaのrows propsが状態を変更しても反映されないため\n e.target.rows = currentRows\n setInterimRows(currentRows)\n }\n\n onChangeRef.current?.(e)\n },\n [\n debouncedUpdateCount,\n debouncedUpdateSrCounterMessage,\n autoResize,\n maxRows,\n rows,\n theme.leading.NORMAL,\n ],\n )\n\n // autoFocus時に、フォーカスを当てる\n useEffect(() => {\n if (autoFocus && textareaRef && textareaRef.current) {\n textareaRef.current.focus()\n }\n }, [autoFocus])\n\n // autoResize時に、初期値での高さを指定\n useEffect(() => {\n if (autoResize && textareaRef.current) {\n setInterimRows(calculateIdealRows(textareaRef.current, maxRows, theme.leading.NORMAL))\n }\n }, [setInterimRows, maxRows, autoResize, theme.leading.NORMAL])\n\n // value 変更時にもカウントを更新する\n useEffect(() => {\n if (value && maxLetters) {\n debouncedUpdateCount?.(value)\n debouncedUpdateSrCounterMessage?.(value)\n }\n }, [maxLetters, debouncedUpdateCount, debouncedUpdateSrCounterMessage, value])\n\n const textareaStyle = useMemo(\n () => ({ width: typeof width === 'number' ? `${width}px` : width }),\n [width],\n )\n const countError = maxLetters && count > maxLetters\n const classNames = useMemo(() => {\n const { textareaEl, counter } = classNameGenerator()\n\n return {\n textarea: textareaEl({ className }),\n counter: counter({ error: !!countError }),\n }\n }, [countError, className])\n\n const body = (\n <textarea\n {...rest}\n {...(maxLetters && { 'aria-describedby': `${maxLettersNoticeId} ${actualMaxLettersId}` })}\n data-smarthr-ui-input=\"true\"\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n ref={textareaRef}\n aria-invalid={error || countError || undefined}\n rows={interimRows}\n className={classNames.textarea}\n style={textareaStyle}\n />\n )\n\n return maxLetters ? (\n <span className=\"shr-relative\">\n {body}\n <VisuallyHiddenText id={maxLettersNoticeId}>\n {buildScreenReaderMaxLettersDescription(maxLetters)}\n </VisuallyHiddenText>\n <VisuallyHiddenText aria-live=\"polite\">{srCounterMessage}</VisuallyHiddenText>\n <span id={actualMaxLettersId} aria-hidden={true} className={classNames.counter}>\n {counterVisualMessage}\n </span>\n </span>\n ) : (\n body\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA;;;AAIM;AACE;;;;AAKN;AACF;AAEA;AACE;AACE;;;;;;;;AAQC;AACD;AACD;AACD;AACE;AACE;AACE;AACD;AACF;AACF;AACD;AACE;AACD;AACF;AAED;;AAMI;;;AAIF;;AAKF;AAEO;AAkBH;AACA;AACA;;AAGA;AACA;;;;AAKA;AACA;AAEA;AAWA;AAWA;AAWA;;;AAII;;;;;;;AAWJ;;AAOA;AAGM;;AAEM;AACF;;AAEJ;;AAKN;AAGM;;;;;;AAOI;;;AAMV;AAEI;AACA;AACA;;AAGA;;AAGE;;AAEA;;;AAIF;AACF;;;;;;;AAQC;;;;AAMC;;AAEJ;;;AAIE;AACE;;AAEJ;;;AAIE;AACE;AACA;;;AAIJ;AAIA;AACA;;;AAII;;;AAGJ;;;AAgCF;;"}
|
|
@@ -12,14 +12,14 @@ import { debounce } from '../../libs/debounce.js';
|
|
|
12
12
|
import '../../themes/createSpacing.js';
|
|
13
13
|
import { defaultHtmlFontSize } from '../../themes/createFontSize.js';
|
|
14
14
|
import '../../themes/createColor.js';
|
|
15
|
-
import '../../themes/
|
|
16
|
-
import '
|
|
15
|
+
import '../../themes/createTextColor.js';
|
|
16
|
+
import 'styled-components';
|
|
17
17
|
import '../../_virtual/index.js';
|
|
18
18
|
import '../../_virtual/index2.js';
|
|
19
|
+
import '../../themes/createShadow/defaultShadow.js';
|
|
20
|
+
import '../../themes/createWidth.js';
|
|
19
21
|
import '../../themes/createBackgroundColor.js';
|
|
20
22
|
import '../../themes/createBorder.js';
|
|
21
|
-
import 'styled-components';
|
|
22
|
-
import '../../themes/createTextColor.js';
|
|
23
23
|
import { VisuallyHiddenText } from '../VisuallyHiddenText/VisuallyHiddenText.js';
|
|
24
24
|
|
|
25
25
|
const getStringLength = (value) => {
|
|
@@ -74,6 +74,8 @@ const Textarea = forwardRef(({ autoFocus, maxLetters, width, className, autoResi
|
|
|
74
74
|
const [interimRows, setInterimRows] = useState(rows);
|
|
75
75
|
const [count, setCount] = useState(currentValue ? getStringLength(currentValue) : 0);
|
|
76
76
|
const [srCounterMessage, setSrCounterMessage] = useState('');
|
|
77
|
+
const onChangeRef = useRef(onChange);
|
|
78
|
+
onChangeRef.current = onChange;
|
|
77
79
|
const buildAvailableLetters = useCallback((availableLetters) => (jsx(Localizer, { id: "smarthr-ui/Textarea/availableLetters", defaultText: "\u3042\u3068{availableLetters}\u6587\u5B57", values: { availableLetters } })), []);
|
|
78
80
|
const buildmaxLettersExceeded = useCallback((exceededLetters) => (jsx(Localizer, { id: "smarthr-ui/Textarea/maxLettersExceeded", defaultText: "{exceededLetters}\u6587\u5B57\u30AA\u30FC\u30D0\u30FC", values: { exceededLetters } })), []);
|
|
79
81
|
const buildScreenReaderMaxLettersDescription = useCallback((internalMaxLetters) => (jsx(Localizer, { id: "smarthr-ui/Textarea/screenReaderMaxLettersDescription", defaultText: "\u6700\u5927{maxLetters}\u6587\u5B57\u5165\u529B\u3067\u304D\u307E\u3059", values: { maxLetters: internalMaxLetters } })), []);
|
|
@@ -119,9 +121,8 @@ const Textarea = forwardRef(({ autoFocus, maxLetters, width, className, autoResi
|
|
|
119
121
|
e.target.rows = currentRows;
|
|
120
122
|
setInterimRows(currentRows);
|
|
121
123
|
}
|
|
122
|
-
|
|
124
|
+
onChangeRef.current?.(e);
|
|
123
125
|
}, [
|
|
124
|
-
onChange,
|
|
125
126
|
debouncedUpdateCount,
|
|
126
127
|
debouncedUpdateSrCounterMessage,
|
|
127
128
|
autoResize,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type ComponentPropsWithRef,\n type ReactNode,\n forwardRef,\n startTransition,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useTheme } from '../../hooks/useTheme'\nimport { Localizer } from '../../intl'\nimport { debounce } from '../../libs/debounce'\nimport { defaultHtmlFontSize } from '../../themes'\nimport { VisuallyHiddenText } from '../VisuallyHiddenText'\n\ntype AbstractProps = {\n /** 入力値にエラーがあるかどうか */\n error?: boolean\n /** コンポーネントの幅 */\n width?: number | string\n /** 自動でフォーカスされるかどうか */\n autoFocus?: boolean\n /** 自動で広がるかどうか */\n autoResize?: boolean\n /** 最大行数。超えるとスクロールする。初期値は無限 */\n maxRows?: number\n /** 行数の初期値。省略した場合は2 */\n rows?: number\n /** 入力可能な最大文字数。あと何文字入力できるかの表示が追加される。html的なvalidateは発生しない */\n maxLetters?: number\n /**\n * placeholder属性は非推奨です。別途ヒント用要素の設置を検討してください。\n */\n placeholder?: string\n}\ntype Props = AbstractProps & Omit<ComponentPropsWithRef<'textarea'>, keyof AbstractProps>\ntype TextareaValue = string | number | readonly string[]\n\nconst getStringLength = (value: TextareaValue) => {\n const formattedValue =\n typeof value === 'number' || typeof value === 'string'\n ? `${value}`\n : Array.isArray(value)\n ? value.join(',')\n : ''\n\n // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n const surrogatePairs = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g\n return formattedValue.length - (formattedValue.match(surrogatePairs) || []).length\n}\n\nconst classNameGenerator = tv({\n slots: {\n textareaEl: [\n 'smarthr-ui-Textarea-textarea',\n 'shr-border-shorthand shr-my-[unset] shr-box-border shr-rounded-m shr-bg-white shr-p-0.5 shr-text-base shr-leading-normal shr-text-black shr-opacity-100',\n 'contrast-more:shr-border-high-contrast',\n 'placeholder:shr-text-grey',\n 'focus-visible:shr-focus-indicator',\n 'disabled:shr-pointer-events-none disabled:shr-bg-column disabled:shr-text-disabled disabled:placeholder:shr-text-disabled',\n 'aria-[invalid]:shr-border-danger',\n ],\n counter: 'smarthr-ui-Textarea-counter shr-block shr-text-sm shr-text-black',\n },\n variants: {\n error: {\n true: {\n counter: 'shr-text-danger',\n },\n },\n },\n defaultVariants: {\n error: false,\n },\n})\n\nconst calculateIdealRows = (\n element: HTMLTextAreaElement | null | undefined,\n maxRows: number,\n lineHeightNormal: number,\n): number => {\n if (!element) {\n return 0\n }\n\n // 現在の入力値に応じた行数\n const currentInputValueRows = Math.floor(\n element.scrollHeight / (defaultHtmlFontSize * lineHeightNormal),\n )\n\n return currentInputValueRows < maxRows ? currentInputValueRows : maxRows\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, Props>(\n (\n {\n autoFocus,\n maxLetters,\n width,\n className,\n autoResize = false,\n maxRows = Infinity,\n rows = 2,\n error,\n onChange,\n value,\n defaultValue,\n ...rest\n },\n ref,\n ) => {\n const theme = useTheme()\n const maxLettersId = useId()\n const maxLettersNoticeId = `${maxLettersId}-notice`\n const actualMaxLettersId = maxLetters ? maxLettersId : undefined\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const currentValue = defaultValue || value\n const [interimRows, setInterimRows] = useState(rows)\n const [count, setCount] = useState(currentValue ? getStringLength(currentValue) : 0)\n const [srCounterMessage, setSrCounterMessage] = useState<ReactNode>('')\n\n const buildAvailableLetters = useCallback(\n (availableLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/availableLetters\"\n defaultText=\"あと{availableLetters}文字\"\n values={{ availableLetters }}\n />\n ),\n [],\n )\n\n const buildmaxLettersExceeded = useCallback(\n (exceededLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/maxLettersExceeded\"\n defaultText=\"{exceededLetters}文字オーバー\"\n values={{ exceededLetters }}\n />\n ),\n [],\n )\n\n const buildScreenReaderMaxLettersDescription = useCallback(\n (internalMaxLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/screenReaderMaxLettersDescription\"\n defaultText=\"最大{maxLetters}文字入力できます\"\n values={{ maxLetters: internalMaxLetters }}\n />\n ),\n [],\n )\n\n const getCounterMessage = useCallback(\n (counterValue: number) => {\n if (maxLetters === undefined) return\n\n if (counterValue > maxLetters) {\n // {count}文字オーバー\n return <>{buildmaxLettersExceeded(counterValue - maxLetters)}</>\n }\n\n // あと{count}文字\n return <>{buildAvailableLetters(maxLetters - counterValue)}</>\n },\n [maxLetters, buildAvailableLetters, buildmaxLettersExceeded],\n )\n\n const counterVisualMessage = useMemo(() => getCounterMessage(count), [count, getCounterMessage])\n\n useImperativeHandle<HTMLTextAreaElement | null, HTMLTextAreaElement | null>(\n ref,\n () => textareaRef.current,\n )\n\n const debouncedUpdateCount = useMemo(\n () =>\n maxLetters\n ? debounce((newValue: TextareaValue) => {\n startTransition(() => {\n setCount(getStringLength(newValue))\n })\n }, 200)\n : undefined,\n [maxLetters],\n )\n\n // countが連続で更新されると、スクリーンリーダーが古い値を読み上げてしまうため、メッセージの更新を遅延しています\n const debouncedUpdateSrCounterMessage = useMemo(\n () =>\n maxLetters\n ? debounce((newValue: TextareaValue) => {\n startTransition(() => {\n const counterText = getCounterMessage(getStringLength(newValue))\n\n if (counterText) {\n setSrCounterMessage(counterText)\n }\n })\n }, 1000)\n : undefined,\n [maxLetters, getCounterMessage],\n )\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n debouncedUpdateCount?.(newValue)\n debouncedUpdateSrCounterMessage?.(newValue)\n\n // rowsを初期化 TextareaのscrollHeightが文字列削除時に変更されないため\n e.target.rows = rows\n\n if (autoResize) {\n const currentRows = calculateIdealRows(e.target, maxRows, theme.leading.NORMAL)\n // rowsを直接反映 Textareaのrows propsが状態を変更しても反映されないため\n e.target.rows = currentRows\n setInterimRows(currentRows)\n }\n\n
|
|
1
|
+
{"version":3,"file":"Textarea.js","sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["'use client'\n\nimport {\n type ChangeEvent,\n type ComponentPropsWithRef,\n type ReactNode,\n forwardRef,\n startTransition,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useTheme } from '../../hooks/useTheme'\nimport { Localizer } from '../../intl'\nimport { debounce } from '../../libs/debounce'\nimport { defaultHtmlFontSize } from '../../themes'\nimport { VisuallyHiddenText } from '../VisuallyHiddenText'\n\ntype AbstractProps = {\n /** 入力値にエラーがあるかどうか */\n error?: boolean\n /** コンポーネントの幅 */\n width?: number | string\n /** 自動でフォーカスされるかどうか */\n autoFocus?: boolean\n /** 自動で広がるかどうか */\n autoResize?: boolean\n /** 最大行数。超えるとスクロールする。初期値は無限 */\n maxRows?: number\n /** 行数の初期値。省略した場合は2 */\n rows?: number\n /** 入力可能な最大文字数。あと何文字入力できるかの表示が追加される。html的なvalidateは発生しない */\n maxLetters?: number\n /**\n * placeholder属性は非推奨です。別途ヒント用要素の設置を検討してください。\n */\n placeholder?: string\n}\ntype Props = AbstractProps & Omit<ComponentPropsWithRef<'textarea'>, keyof AbstractProps>\ntype TextareaValue = string | number | readonly string[]\n\nconst getStringLength = (value: TextareaValue) => {\n const formattedValue =\n typeof value === 'number' || typeof value === 'string'\n ? `${value}`\n : Array.isArray(value)\n ? value.join(',')\n : ''\n\n // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n const surrogatePairs = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g\n return formattedValue.length - (formattedValue.match(surrogatePairs) || []).length\n}\n\nconst classNameGenerator = tv({\n slots: {\n textareaEl: [\n 'smarthr-ui-Textarea-textarea',\n 'shr-border-shorthand shr-my-[unset] shr-box-border shr-rounded-m shr-bg-white shr-p-0.5 shr-text-base shr-leading-normal shr-text-black shr-opacity-100',\n 'contrast-more:shr-border-high-contrast',\n 'placeholder:shr-text-grey',\n 'focus-visible:shr-focus-indicator',\n 'disabled:shr-pointer-events-none disabled:shr-bg-column disabled:shr-text-disabled disabled:placeholder:shr-text-disabled',\n 'aria-[invalid]:shr-border-danger',\n ],\n counter: 'smarthr-ui-Textarea-counter shr-block shr-text-sm shr-text-black',\n },\n variants: {\n error: {\n true: {\n counter: 'shr-text-danger',\n },\n },\n },\n defaultVariants: {\n error: false,\n },\n})\n\nconst calculateIdealRows = (\n element: HTMLTextAreaElement | null | undefined,\n maxRows: number,\n lineHeightNormal: number,\n): number => {\n if (!element) {\n return 0\n }\n\n // 現在の入力値に応じた行数\n const currentInputValueRows = Math.floor(\n element.scrollHeight / (defaultHtmlFontSize * lineHeightNormal),\n )\n\n return currentInputValueRows < maxRows ? currentInputValueRows : maxRows\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, Props>(\n (\n {\n autoFocus,\n maxLetters,\n width,\n className,\n autoResize = false,\n maxRows = Infinity,\n rows = 2,\n error,\n onChange,\n value,\n defaultValue,\n ...rest\n },\n ref,\n ) => {\n const theme = useTheme()\n const maxLettersId = useId()\n const maxLettersNoticeId = `${maxLettersId}-notice`\n const actualMaxLettersId = maxLetters ? maxLettersId : undefined\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const currentValue = defaultValue || value\n const [interimRows, setInterimRows] = useState(rows)\n const [count, setCount] = useState(currentValue ? getStringLength(currentValue) : 0)\n const [srCounterMessage, setSrCounterMessage] = useState<ReactNode>('')\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const buildAvailableLetters = useCallback(\n (availableLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/availableLetters\"\n defaultText=\"あと{availableLetters}文字\"\n values={{ availableLetters }}\n />\n ),\n [],\n )\n\n const buildmaxLettersExceeded = useCallback(\n (exceededLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/maxLettersExceeded\"\n defaultText=\"{exceededLetters}文字オーバー\"\n values={{ exceededLetters }}\n />\n ),\n [],\n )\n\n const buildScreenReaderMaxLettersDescription = useCallback(\n (internalMaxLetters: number): ReactNode => (\n <Localizer\n id=\"smarthr-ui/Textarea/screenReaderMaxLettersDescription\"\n defaultText=\"最大{maxLetters}文字入力できます\"\n values={{ maxLetters: internalMaxLetters }}\n />\n ),\n [],\n )\n\n const getCounterMessage = useCallback(\n (counterValue: number) => {\n if (maxLetters === undefined) return\n\n if (counterValue > maxLetters) {\n // {count}文字オーバー\n return <>{buildmaxLettersExceeded(counterValue - maxLetters)}</>\n }\n\n // あと{count}文字\n return <>{buildAvailableLetters(maxLetters - counterValue)}</>\n },\n [maxLetters, buildAvailableLetters, buildmaxLettersExceeded],\n )\n\n const counterVisualMessage = useMemo(() => getCounterMessage(count), [count, getCounterMessage])\n\n useImperativeHandle<HTMLTextAreaElement | null, HTMLTextAreaElement | null>(\n ref,\n () => textareaRef.current,\n )\n\n const debouncedUpdateCount = useMemo(\n () =>\n maxLetters\n ? debounce((newValue: TextareaValue) => {\n startTransition(() => {\n setCount(getStringLength(newValue))\n })\n }, 200)\n : undefined,\n [maxLetters],\n )\n\n // countが連続で更新されると、スクリーンリーダーが古い値を読み上げてしまうため、メッセージの更新を遅延しています\n const debouncedUpdateSrCounterMessage = useMemo(\n () =>\n maxLetters\n ? debounce((newValue: TextareaValue) => {\n startTransition(() => {\n const counterText = getCounterMessage(getStringLength(newValue))\n\n if (counterText) {\n setSrCounterMessage(counterText)\n }\n })\n }, 1000)\n : undefined,\n [maxLetters, getCounterMessage],\n )\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n debouncedUpdateCount?.(newValue)\n debouncedUpdateSrCounterMessage?.(newValue)\n\n // rowsを初期化 TextareaのscrollHeightが文字列削除時に変更されないため\n e.target.rows = rows\n\n if (autoResize) {\n const currentRows = calculateIdealRows(e.target, maxRows, theme.leading.NORMAL)\n // rowsを直接反映 Textareaのrows propsが状態を変更しても反映されないため\n e.target.rows = currentRows\n setInterimRows(currentRows)\n }\n\n onChangeRef.current?.(e)\n },\n [\n debouncedUpdateCount,\n debouncedUpdateSrCounterMessage,\n autoResize,\n maxRows,\n rows,\n theme.leading.NORMAL,\n ],\n )\n\n // autoFocus時に、フォーカスを当てる\n useEffect(() => {\n if (autoFocus && textareaRef && textareaRef.current) {\n textareaRef.current.focus()\n }\n }, [autoFocus])\n\n // autoResize時に、初期値での高さを指定\n useEffect(() => {\n if (autoResize && textareaRef.current) {\n setInterimRows(calculateIdealRows(textareaRef.current, maxRows, theme.leading.NORMAL))\n }\n }, [setInterimRows, maxRows, autoResize, theme.leading.NORMAL])\n\n // value 変更時にもカウントを更新する\n useEffect(() => {\n if (value && maxLetters) {\n debouncedUpdateCount?.(value)\n debouncedUpdateSrCounterMessage?.(value)\n }\n }, [maxLetters, debouncedUpdateCount, debouncedUpdateSrCounterMessage, value])\n\n const textareaStyle = useMemo(\n () => ({ width: typeof width === 'number' ? `${width}px` : width }),\n [width],\n )\n const countError = maxLetters && count > maxLetters\n const classNames = useMemo(() => {\n const { textareaEl, counter } = classNameGenerator()\n\n return {\n textarea: textareaEl({ className }),\n counter: counter({ error: !!countError }),\n }\n }, [countError, className])\n\n const body = (\n <textarea\n {...rest}\n {...(maxLetters && { 'aria-describedby': `${maxLettersNoticeId} ${actualMaxLettersId}` })}\n data-smarthr-ui-input=\"true\"\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n ref={textareaRef}\n aria-invalid={error || countError || undefined}\n rows={interimRows}\n className={classNames.textarea}\n style={textareaStyle}\n />\n )\n\n return maxLetters ? (\n <span className=\"shr-relative\">\n {body}\n <VisuallyHiddenText id={maxLettersNoticeId}>\n {buildScreenReaderMaxLettersDescription(maxLetters)}\n </VisuallyHiddenText>\n <VisuallyHiddenText aria-live=\"polite\">{srCounterMessage}</VisuallyHiddenText>\n <span id={actualMaxLettersId} aria-hidden={true} className={classNames.counter}>\n {counterVisualMessage}\n </span>\n </span>\n ) : (\n body\n )\n },\n)\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA+CA;;;AAIM;AACE;;;;AAKN;AACF;AAEA;AACE;AACE;;;;;;;;AAQC;AACD;AACD;AACD;AACE;AACE;AACE;AACD;AACF;AACF;AACD;AACE;AACD;AACF;AAED;;AAMI;;;AAIF;;AAKF;AAEO;AAkBH;AACA;AACA;;AAGA;AACA;;;;AAKA;AACA;AAEA;AAWA;AAWA;AAWA;;;AAII;;;;;;;AAWJ;;AAOA;AAGM;;AAEM;AACF;;AAEJ;;AAKN;AAGM;;;;;;AAOI;;;AAMV;AAEI;AACA;AACA;;AAGA;;AAGE;;AAEA;;;AAIF;AACF;;;;;;;AAQC;;;;AAMC;;AAEJ;;;AAIE;AACE;;AAEJ;;;AAIE;AACE;AACA;;;AAIJ;AAIA;AACA;;;AAII;;;AAGJ;;;AAgCF;;"}
|