Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin' into feat/multilingualization
Browse files Browse the repository at this point in the history
  • Loading branch information
Qs-F committed Dec 25, 2024
2 parents ffa9c39 + 9094fc4 commit 18d4151
Show file tree
Hide file tree
Showing 80 changed files with 4,206 additions and 335 deletions.
31 changes: 0 additions & 31 deletions .eslintrc.js

This file was deleted.

4 changes: 2 additions & 2 deletions .github/workflows/publishRelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ jobs:
- run: pnpm publish --filter smarthr-ui --no-git-checks
if: ${{ env.IS_PRERELEASE == 'false' }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.KUFU_NPM_RELEASE_TOKEN }}
- run: pnpm publish --filter smarthr-ui --tag prerelease --no-git-checks
if: ${{ env.IS_PRERELEASE == 'true' }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.KUFU_NPM_RELEASE_TOKEN }}
- run: echo NEW_TAG=$(git describe) >> $GITHUB_ENV
- run: git push origin $NEW_TAG
- run: npx ts-node ./packages/smarthr-ui/scripts/getLatestChangelog.ts > ${{ env.CHANGELOG_PATH }}
Expand Down
50 changes: 50 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import smarthr from 'eslint-config-smarthr'
import storybook from 'eslint-plugin-storybook'

/**
* @type {import('eslint').Linter.Config[]}
*/
export default [
...smarthr,
...storybook.configs['flat/recommended'],
{
rules: {
'jsx-a11y/anchor-is-valid': 'warn',
'jsx-a11y/click-events-have-key-events': 'warn',
'jsx-a11y/no-static-element-interactions': 'warn',
'jsx-a11y/label-has-associated-control': [
'error',
{
controlComponents: ['Input', 'InputWithTooltip'],
},
],
'@typescript-eslint/consistent-type-definitions': [
'error',
'type',
],
'smarthr/require-barrel-import': 'off',
'smarthr/a11y-anchor-has-href-attribute': [
'error',
{
checkType: 'allow-spread-attributes',
}
],
'smarthr/a11y-input-has-name-attribute': [
'error',
{
checkType: 'allow-spread-attributes',
}
],
},
},
{
ignores: [
'**/*.{mjs,js}',
'sandbox/',
'storybook-static/',
'packages/smarthr-ui/esm/',
'packages/smarthr-ui/lib/',
'packages/smarthr-ui/.storybook',
]
},
]
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"devDependencies": {
"@commitlint/cli": "^19.6.1",
"@commitlint/config-conventional": "^19.6.0",
"eslint": "^8.57.0",
"eslint-config-smarthr": "^7.3.0",
"eslint": "^9.17.0",
"eslint-config-smarthr": "^8.0.0",
"eslint-plugin-storybook": "^0.11.1",
"husky": "^9.1.7",
"lint-staged": "^15.2.11",
Expand All @@ -31,7 +31,7 @@
"pnpm": {
"overrides": {
"@babel/helper-compilation-targets": "^7.25.9",
"@types/react": "^18.3.17",
"@types/react": "^18.3.18",
"minimist": "1.2.8",
"react": "^19.0.0",
"react-dom": "^19.0.0",
Expand Down
4 changes: 0 additions & 4 deletions packages/smarthr-ui/.eslintignore

This file was deleted.

15 changes: 15 additions & 0 deletions packages/smarthr-ui/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.

### [62.3.1](https://github.com/kufu/smarthr-ui/compare/v62.3.0...v62.3.1) (2024-12-24)


### Bug Fixes

* AppHeader を Server Component から呼べるようにする ([#5226](https://github.com/kufu/smarthr-ui/issues/5226)) ([cc9c481](https://github.com/kufu/smarthr-ui/commit/cc9c4812d05ff76a9a855f5907cd13bd7baa19ff))

## [62.3.0](https://github.com/kufu/smarthr-ui/compare/v62.2.3...v62.3.0) (2024-12-24)


### Features

* AppHeader コンポーネントを追加 ([#5203](https://github.com/kufu/smarthr-ui/issues/5203)) ([4804f44](https://github.com/kufu/smarthr-ui/commit/4804f4479a1173d79a19f1590060131cc67c1c66))
* WarekiPicker を追加 ([#5196](https://github.com/kufu/smarthr-ui/issues/5196)) ([30ea4bf](https://github.com/kufu/smarthr-ui/commit/30ea4bfdc471e1fa0c800180701796e863353d9d))

### [62.2.3](https://github.com/kufu/smarthr-ui/compare/v62.2.2...v62.2.3) (2024-12-18)


Expand Down
8 changes: 4 additions & 4 deletions packages/smarthr-ui/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "smarthr-ui",
"description": "SmartHR ui components built with React.",
"version": "62.2.3",
"version": "62.3.1",
"author": "SmartHR-UI Team",
"dependencies": {
"@smarthr/wareki": "^1.3.0",
Expand All @@ -15,7 +15,7 @@
"react-innertext": "^1.1.5",
"react-transition-group": "^4.4.5",
"tailwind-variants": "^0.3.0",
"tailwindcss": "^3.4.16"
"tailwindcss": "^3.4.17"
},
"devDependencies": {
"@babel/core": "^7.26.0",
Expand Down Expand Up @@ -46,7 +46,7 @@
"@types/lodash.merge": "^4.6.9",
"@types/lodash.range": "^3.2.9",
"@types/node": "^20.17.10",
"@types/react": "^18.3.16",
"@types/react": "^18.3.18",
"@types/react-dom": "^19.0.2",
"@types/react-test-renderer": "^19.0.0",
"@types/react-transition-group": "^4.4.12",
Expand All @@ -64,7 +64,7 @@
"http-server": "^14.1.1",
"jsdom": "^25.0.1",
"memory-fs": "^0.5.0",
"npm-run-all": "^4.1.5",
"npm-run-all2": "^7.0.2",
"playwright": "^1.49.1",
"plop": "^4.0.1",
"postcss": "^8.4.49",
Expand Down
2 changes: 1 addition & 1 deletion packages/smarthr-ui/public/exports/smarthr-ui-props.json

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions packages/smarthr-ui/src/components/AppHeader/AppHeader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
'use client'

import React, { FC } from 'react'

import { DesktopHeader } from './components/desktop/DesktopHeader'
import { MobileHeader } from './components/mobile/MobileHeader'
import { LocaleContextProvider } from './hooks/useLocale'
import { mediaQuery, useMediaQuery } from './hooks/useMediaQuery'
import { HeaderProps } from './types'

export const AppHeader: FC<HeaderProps> = ({ locale, children, ...props }) => {
// NOTE: ヘッダーの出し分けは CSS によって行われているので、useMediaQuery による children の出し分けは本来不要ですが、
// wovn の言語切替カスタム UI の挿入対象となる DOM ("wovn-embedded-widget-anchor" クラスを持った div) が複数描画されていると、
// wovn のスクリプトの仕様上1つ目の DOM にしか UI が挿入されないため、やむを得ず children のみ React のレンダリングレベルでの出し分けをしています。
const isDesktop = useMediaQuery(mediaQuery.desktop)
const isMobile = useMediaQuery(mediaQuery.mobile)

return (
<LocaleContextProvider locale={locale}>
<DesktopHeader {...props}>{isDesktop && children}</DesktopHeader>
<MobileHeader {...props}>{isMobile && children}</MobileHeader>
</LocaleContextProvider>
)
}
60 changes: 60 additions & 0 deletions packages/smarthr-ui/src/components/AppHeader/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
## このコンポーネントについて

props を埋めていくだけで良い感じに共通のヘッダー/ナビゲーションの UI が組み立てられるコンポーネントです。

## どのように使うのか

`types.ts` にある HeaderProps というのが最終的な props なのであり、これらを穴埋めしていくことになります。
`xxxAdditionalContent` 以外の props は積極的に埋めてください。

```ts
export type HeaderProps = ComponentProps<typeof Header> & {
locale?: LocaleProps | null
enableNew?: boolean
appName?: ReactNode
schoolUrl?: string | null
helpPageUrl?: string | null
userInfo?: UserInfoProps | null
desktopAdditionalContent?: ReactNode
navigations?: Navigation[] | null
desktopNavigationAdditionalContent?: ReactNode
releaseNote?: ReleaseNoteProps | null
features?: Array<Launcher['feature']>
mobileAdditionalContent?: ReactNode
}
```
下記に、少し特殊な動きをするものやパッと見分かりづらいであろうと思われる props だけ補足説明を書きます。
- `locale`
- 多言語対応に wovn を使っている場合はこの props は不要です。
- `tenants`
- デスクトップ表示時
- Header コンポーネントと同じです。
- モバイル表示時
- ハンバーガーメニューが表示されている場合はメニューの中に、そうでない場合はデスクトップ表示時と同じ箇所 (ロゴの横) に表示されます。
- もし既存の独自実装ハンバーガーメニュー内にテナント選択の UI があるなどの理由で「ハンバーガーメニューは表示しないがモバイル表示時にヘッダーにテナント選択の UI を表示したくない」という場合は、ウィンドウサイズが 751px 以下のときに tenants props に undefined を渡すようにしてください。
- `navigations`
- ヘッダーの下にナビゲーションが表示されるようになります。
- AppNavi コンポーネントの buttons props とほぼ同じ型のデータを取ります。
- AppNavi コンポーネントの buttons にはなかった、ドロップダウン内でのナビゲーションのグルーピングができるようになっています。
- storybook の「VRT Navigation Dropdown Group」を参考にしてください。
- **navigations props に値が渡されているときのみ、モバイル表示時にハンバーガーメニューが表示されます。独自実装の ハンバーガーメニューが存在する場合は、navigations props を利用するタイミングで移行してください。**
- `desktopAdditionalContent`
- ユーザー名をクリックしたときのドロップダウンの、「個人設定」の下に入れたいものがある場合に使います。
- 見た目の共通化のため、乱用は避けてください
- `desktopNavigationAdditionalContent`
- ナビゲーション内で右寄せ、かつリリースノートの左側に入れたい物がある場合に使います。
- 見た目の共通化のため、乱用は避けてください
- `mobileAdditionalContent`
- モバイル表示時に、メニュー内に何か追加で起きたいものがある場合に使います。
- 見た目の共通化のため、乱用は避けてほしいですが、もし何かしらのパーツを配置する必要がある場合は、デザイナーと相談しながら実装してください。
## 多言語対応について
- wovn を使っているアプリの場合
- 内部で表示されているテキストに関しては、すべて `woven-enabled="true"` がついています。
- 外部から渡すテキストは全て `ReactNode` 型で受け取るようになっているので、`<span woven-enabled="true">ほげ</span>` みたいなものを渡すようにしてください。
- 辞書を持っているアプリの場合
- コンポーネント側で辞書を持っているので、`locale` の props を埋めると内部的に持っているテキストは翻訳されます。
- 外部から渡すテキストはアプリケーション側で翻訳されたものを渡すようにしてください。
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import React, { FC } from 'react'
import { tv } from 'tailwind-variants'

import { AnchorButton } from '../../../Button'
import { FaArrowRightIcon, FaStarIcon } from '../../../Icon'
import { LineClamp } from '../../../LineClamp'
import { Text } from '../../../Text'
import { mediaQuery, useMediaQuery } from '../../hooks/useMediaQuery'
import { useTranslate } from '../../hooks/useTranslate'
import { Launcher } from '../../types'

import { Translate } from './Translate'

const appLauncherFeatures = tv({
slots: {
empty: ['shr-p-1 shr-text-center'],
list: ['shr-list-none', '[&>li]:shr-px-0.5 [&>li]:shr-py-0.25'],
listItem: [
'smarthr-ui-AppLauncher-listItem',
'shr-grid shr-grid-cols-[1rem_1fr_1rem] shr-gap-0.75 shr-min-h-[2.5rem] shr-px-1 shr-py-0 shr-leading-tight shr-text-left shr-whitespace-normal',
],
},
variants: {
favorite: {
false: {
listItem: ['shr-grid-cols-[1fr_1rem]'],
},
},
},
})

type Props = {
features: Array<Launcher['feature']>
page: Launcher['page']
}

export const AppLauncherFeatures: FC<Props> = ({ features, page }) => {
const isDesktop = useMediaQuery(mediaQuery.desktop)
const translate = useTranslate()
const { empty, list, listItem } = appLauncherFeatures()

if (features.length === 0) {
return (
<div className={empty()}>
<Text size="S">
<Translate>{translate('Launcher/emptyText')}</Translate>
</Text>
</div>
)
}

return (
<ul className={list()}>
{features.map((feature) => (
<li key={feature.id}>
<AnchorButton
className={listItem({ favorite: page === 'favorite' })}
variant="text"
href={feature.url}
prefix={page === 'favorite' && <FaStarIcon />}
suffix={<FaArrowRightIcon />}
wide
target="_blank"
>
{isDesktop ? <LineClamp maxLines={2}>{feature.name}</LineClamp> : feature.name}
</AnchorButton>
</li>
))}
</ul>
)
}
Loading

0 comments on commit 18d4151

Please sign in to comment.