Showing preview only (3,337K chars total). Download the full file or copy to clipboard to get everything.
Repository: titicacadev/triple-frontend
Branch: main
Commit: c3eaf391ca0b
Files: 1423
Total size: 2.7 MB
Directory structure:
gitextract_zxt6lxx8/
├── .browserslistrc
├── .editorconfig
├── .eslintrc.js
├── .github/
│ ├── CODEOWNERS
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── add-label.yaml
│ ├── cd.yaml
│ ├── ci.yaml
│ ├── pr-closed.yaml
│ ├── tag-with-comment.yaml
│ └── update-changelog.yaml
├── .gitignore
├── .husky/
│ └── pre-commit
├── .npmrc
├── .prettierignore
├── .prettierrc
├── .storybook/
│ ├── decorators.tsx
│ ├── main.ts
│ ├── preview.ts
│ └── public/
│ └── mockServiceWorker.js
├── .stylelintrc.json
├── .swcrc
├── .vscode/
│ └── settings.json
├── CHANGELOG-archive-201911.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MIGRATION.md
├── README.md
├── chromatic.config.json
├── codecov.yml
├── examples/
│ ├── nextjs-app/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── app/
│ │ │ ├── layout.tsx
│ │ │ ├── page.tsx
│ │ │ └── template.tsx
│ │ ├── lib/
│ │ │ ├── registry.tsx
│ │ │ └── theme.tsx
│ │ ├── next.config.mjs
│ │ ├── package.json
│ │ └── tsconfig.json
│ └── nextjs-pages/
│ ├── .gitignore
│ ├── README.md
│ ├── next.config.mjs
│ ├── package.json
│ ├── pages/
│ │ ├── _app.tsx
│ │ ├── _document.tsx
│ │ └── index.tsx
│ └── tsconfig.json
├── global.d.ts
├── jest-setup.js
├── jest.config.js
├── lerna.json
├── package.json
├── packages/
│ ├── ab-experiments/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── google-optimize-context/
│ │ │ │ ├── README.md
│ │ │ │ ├── context.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ └── triple-ab-experiment-context/
│ │ │ ├── README.md
│ │ │ ├── context.tsx
│ │ │ ├── index.ts
│ │ │ └── service.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── constants/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── regex.test.ts
│ │ │ └── regex.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── fetcher/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── add-fetchers-to-gssp.test.ts
│ │ │ ├── add-fetchers-to-gssp.ts
│ │ │ ├── auth-guarded-methods.ts
│ │ │ ├── factories.test.ts
│ │ │ ├── factories.ts
│ │ │ ├── fetcher.ts
│ │ │ ├── index.ts
│ │ │ ├── make-request-params.test.ts
│ │ │ ├── make-request-params.ts
│ │ │ ├── methods.ts
│ │ │ ├── response-handler.ts
│ │ │ ├── safe-parse-json.test.ts
│ │ │ ├── safe-parse-json.ts
│ │ │ ├── server-fetch.ts
│ │ │ ├── session-refresh.ts
│ │ │ └── types.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── i18n/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── interpolate.ts
│ │ │ ├── locales/
│ │ │ │ ├── en.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── ja.ts
│ │ │ │ ├── ko.ts
│ │ │ │ └── zh-TW.ts
│ │ │ └── types.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── intersection-observer/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── lazy-loaded-intersection-observer.tsx
│ │ │ ├── static-intersection-observer.tsx
│ │ │ └── use-intersection.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── meta-tags/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── app-router/
│ │ │ │ ├── generate-apple-smart-banner-meta.ts
│ │ │ │ ├── generate-common-meta.ts
│ │ │ │ ├── generate-essential-content-meta.ts
│ │ │ │ ├── generate-facebook-app-link-meta.ts
│ │ │ │ ├── generate-facebook-open-graph-meta.ts
│ │ │ │ ├── generate-triple-default-meta.ts
│ │ │ │ └── index.ts
│ │ │ ├── constants.ts
│ │ │ ├── index.ts
│ │ │ ├── pages-router/
│ │ │ │ ├── apple-smart-banner-meta.tsx
│ │ │ │ ├── common-meta.tsx
│ │ │ │ ├── essential-content-meta.test.tsx
│ │ │ │ ├── essential-content-meta.tsx
│ │ │ │ ├── facebook-app-link-meta.tsx
│ │ │ │ ├── facebook-open-graph-meta.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── theme-color-meta.tsx
│ │ │ ├── structured-data/
│ │ │ │ ├── article-script.tsx
│ │ │ │ ├── breadcrumb-list-script.tsx
│ │ │ │ ├── discussion-forum-posting-script.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── local-business-script.tsx
│ │ │ │ ├── product-script.tsx
│ │ │ │ ├── qa-page-script.tsx
│ │ │ │ └── review-script.tsx
│ │ │ ├── types/
│ │ │ │ ├── index.ts
│ │ │ │ ├── schema.ts
│ │ │ │ └── structured-data-script-props.ts
│ │ │ └── utils.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── middlewares/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── chain.ts
│ │ │ ├── index.ts
│ │ │ ├── refresh-session/
│ │ │ │ ├── index.ts
│ │ │ │ ├── next-13.ts
│ │ │ │ └── next-14.ts
│ │ │ ├── set-web-device-id.ts
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ ├── apply-set-cookie.ts
│ │ │ ├── get-domain.ts
│ │ │ └── get-triple-app.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── react-hooks/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── hooks.stories.tsx
│ │ │ ├── index.ts
│ │ │ ├── mocks/
│ │ │ │ └── lottie.sample.json
│ │ │ ├── use-body-scroll-lock.ts
│ │ │ ├── use-debounce.test.ts
│ │ │ ├── use-debounce.ts
│ │ │ ├── use-error-handler.ts
│ │ │ ├── use-fetch.ts
│ │ │ ├── use-interval.test.ts
│ │ │ ├── use-interval.ts
│ │ │ ├── use-local-storage.test.ts
│ │ │ ├── use-local-storage.ts
│ │ │ ├── use-lottie.tsx
│ │ │ ├── use-scroll-to-anchor.ts
│ │ │ ├── use-scroll-to-element.ts
│ │ │ ├── use-session-storage.test.ts
│ │ │ ├── use-session-storage.ts
│ │ │ └── use-visibility-change.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── router/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── common/
│ │ │ │ ├── add-web-url-base.test.tsx
│ │ │ │ ├── add-web-url-base.ts
│ │ │ │ ├── default-router.ts
│ │ │ │ ├── disabled-link-notifier.test.tsx
│ │ │ │ ├── disabled-link-notifier.ts
│ │ │ │ ├── router-guarded-link.test.tsx
│ │ │ │ ├── router-guarded-link.tsx
│ │ │ │ ├── target.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── use-rel.test.ts
│ │ │ │ └── use-rel.ts
│ │ │ ├── external/
│ │ │ │ ├── hook.ts
│ │ │ │ ├── href-handler.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── link.tsx
│ │ │ │ └── utils.ts
│ │ │ ├── href-to-props/
│ │ │ │ ├── index.ts
│ │ │ │ ├── use-href-to-props.test.tsx
│ │ │ │ └── use-href-to-props.ts
│ │ │ ├── index.ts
│ │ │ ├── links/
│ │ │ │ ├── index.ts
│ │ │ │ ├── use-make-inlink.ts
│ │ │ │ ├── use-make-outlink.ts
│ │ │ │ ├── use-open-inlink.test.ts
│ │ │ │ ├── use-open-inlink.ts
│ │ │ │ ├── use-open-native-link.test.tsx
│ │ │ │ ├── use-open-native-link.ts
│ │ │ │ ├── use-open-outlink.test.ts
│ │ │ │ └── use-open-outlink.ts
│ │ │ ├── local/
│ │ │ │ ├── base-path.test.ts
│ │ │ │ ├── base-path.ts
│ │ │ │ ├── hook.ts
│ │ │ │ ├── href-handler.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── link.tsx
│ │ │ └── navigate/
│ │ │ ├── canonization.spec.ts
│ │ │ ├── canonization.ts
│ │ │ ├── index.ts
│ │ │ ├── use-isomorphic-navigate.ts
│ │ │ ├── use-navigate.test.tsx
│ │ │ └── use-navigate.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── scroll-to-element/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── scroll-position-calculators.test.ts
│ │ │ ├── scroll-position-calculators.ts
│ │ │ ├── scroll-to-element.ts
│ │ │ ├── scroll.ts
│ │ │ └── types.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── standard-action-handler/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── converse.tsx
│ │ │ ├── copy-to-clipboard.ts
│ │ │ ├── fetch-api.ts
│ │ │ ├── handler.ts
│ │ │ ├── hook.ts
│ │ │ ├── image-download.ts
│ │ │ ├── index.ts
│ │ │ ├── initialize.ts
│ │ │ ├── invoke-cta.ts
│ │ │ ├── new-window.test.ts
│ │ │ ├── new-window.ts
│ │ │ ├── require-triple-client.tsx
│ │ │ ├── scroll-to-element.ts
│ │ │ ├── serial.ts
│ │ │ ├── services/
│ │ │ │ ├── copy.ts
│ │ │ │ └── share.ts
│ │ │ ├── share.ts
│ │ │ ├── show-toast.ts
│ │ │ └── types.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── tds-theme/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── foundations/
│ │ │ │ └── colors.ts
│ │ │ ├── global-style.ts
│ │ │ ├── index.ts
│ │ │ ├── styled.ts
│ │ │ └── theme/
│ │ │ ├── default.ts
│ │ │ ├── index.ts
│ │ │ └── types.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── tds-ui/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── commons.ts
│ │ │ ├── components/
│ │ │ │ ├── accordion/
│ │ │ │ │ ├── accordion-content.tsx
│ │ │ │ │ ├── accordion-context.tsx
│ │ │ │ │ ├── accordion-folded.tsx
│ │ │ │ │ ├── accordion-title.tsx
│ │ │ │ │ ├── accordion.stories.tsx
│ │ │ │ │ ├── accordion.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── action-sheet/
│ │ │ │ │ ├── action-sheet-body.tsx
│ │ │ │ │ ├── action-sheet-context.tsx
│ │ │ │ │ ├── action-sheet-item.tsx
│ │ │ │ │ ├── action-sheet-overlay.tsx
│ │ │ │ │ ├── action-sheet-title.tsx
│ │ │ │ │ ├── action-sheet.stories.tsx
│ │ │ │ │ ├── action-sheet.test.tsx
│ │ │ │ │ ├── action-sheet.tsx
│ │ │ │ │ ├── constants.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── action-sheet-select/
│ │ │ │ │ ├── action-sheet-select-button.tsx
│ │ │ │ │ ├── action-sheet-select-context.tsx
│ │ │ │ │ ├── action-sheet-select-option.tsx
│ │ │ │ │ ├── action-sheet-select-options.tsx
│ │ │ │ │ ├── action-sheet-select.stories.tsx
│ │ │ │ │ ├── action-sheet-select.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── alert/
│ │ │ │ │ ├── alert.stories.tsx
│ │ │ │ │ ├── alert.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── button/
│ │ │ │ │ ├── basic-button.tsx
│ │ │ │ │ ├── button-base.test.tsx
│ │ │ │ │ ├── button-base.tsx
│ │ │ │ │ ├── button-container.ts
│ │ │ │ │ ├── button-group.ts
│ │ │ │ │ ├── button-icon.tsx
│ │ │ │ │ ├── button.stories.tsx
│ │ │ │ │ ├── button.tsx
│ │ │ │ │ ├── icon-button.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── normal-button.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ ├── carousel/
│ │ │ │ │ ├── carousel-item.tsx
│ │ │ │ │ ├── carousel.stories.tsx
│ │ │ │ │ ├── carousel.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── mocks/
│ │ │ │ │ └── carousel.sample.json
│ │ │ │ ├── checkbox/
│ │ │ │ │ ├── checkbox-base.tsx
│ │ │ │ │ ├── checkbox.stories.tsx
│ │ │ │ │ ├── checkbox.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── checkbox-group/
│ │ │ │ │ ├── checkbox-group-context.tsx
│ │ │ │ │ ├── checkbox-group-error.tsx
│ │ │ │ │ ├── checkbox-group-help.tsx
│ │ │ │ │ ├── checkbox-group-label.tsx
│ │ │ │ │ ├── checkbox-group.stories.tsx
│ │ │ │ │ ├── checkbox-group.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── use-checkbox-group.tsx
│ │ │ │ ├── confirm/
│ │ │ │ │ ├── confirm.stories.tsx
│ │ │ │ │ ├── confirm.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── confirm-selector/
│ │ │ │ │ ├── confirm-selector-base.tsx
│ │ │ │ │ ├── confirm-selector.stories.tsx
│ │ │ │ │ ├── confirm-selector.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── container/
│ │ │ │ │ ├── container.stories.tsx
│ │ │ │ │ ├── container.test.tsx
│ │ │ │ │ ├── container.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── content-elements/
│ │ │ │ │ ├── content-elements.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── drawer/
│ │ │ │ │ ├── drawer.stories.tsx
│ │ │ │ │ ├── drawer.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── drawer-button/
│ │ │ │ │ ├── drawer-button.stories.tsx
│ │ │ │ │ ├── drawer-button.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── fieldset/
│ │ │ │ │ ├── fieldset-context.tsx
│ │ │ │ │ ├── fieldset-legend.tsx
│ │ │ │ │ ├── fieldset.stories.tsx
│ │ │ │ │ ├── fieldset.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── use-fieldset.tsx
│ │ │ │ ├── flex-box/
│ │ │ │ │ ├── flex-box.stories.tsx
│ │ │ │ │ ├── flex-box.test.tsx
│ │ │ │ │ ├── flex-box.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── form-field/
│ │ │ │ │ ├── form-field-context.tsx
│ │ │ │ │ ├── form-field-error.tsx
│ │ │ │ │ ├── form-field-help.tsx
│ │ │ │ │ ├── form-field-label.tsx
│ │ │ │ │ ├── form-field.stories.tsx
│ │ │ │ │ ├── form-field.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── use-form-field-state.ts
│ │ │ │ ├── gender-selector/
│ │ │ │ │ ├── gender-selector-item.tsx
│ │ │ │ │ ├── gender-selector.stories.tsx
│ │ │ │ │ ├── gender-selector.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hr/
│ │ │ │ │ ├── hr.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── icon/
│ │ │ │ │ ├── icon.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── image/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── circular.ts
│ │ │ │ │ ├── context.tsx
│ │ │ │ │ ├── fixed-dimensions-frame.tsx
│ │ │ │ │ ├── fixed-ratio-frame.tsx
│ │ │ │ │ ├── image.stories.tsx
│ │ │ │ │ ├── image.tsx
│ │ │ │ │ ├── img.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── link-indicator.tsx
│ │ │ │ │ ├── optimized-img.tsx
│ │ │ │ │ ├── overlay.tsx
│ │ │ │ │ ├── placeholder.tsx
│ │ │ │ │ └── source-url.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── input/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── input.stories.tsx
│ │ │ │ │ └── input.tsx
│ │ │ │ ├── label/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── label.stories.tsx
│ │ │ │ │ └── label.tsx
│ │ │ │ ├── list/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── list.stories.tsx
│ │ │ │ │ ├── list.test.tsx
│ │ │ │ │ └── list.tsx
│ │ │ │ ├── long-clickable/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── long-clickable.stories.tsx
│ │ │ │ │ └── long-clickable.tsx
│ │ │ │ ├── modal/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── modal-action.tsx
│ │ │ │ │ ├── modal-actions.tsx
│ │ │ │ │ ├── modal-body.tsx
│ │ │ │ │ ├── modal-context.tsx
│ │ │ │ │ ├── modal-description.tsx
│ │ │ │ │ ├── modal-title.tsx
│ │ │ │ │ ├── modal.stories.tsx
│ │ │ │ │ ├── modal.test.tsx
│ │ │ │ │ └── modal.tsx
│ │ │ │ ├── navbar/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── navbar.stories.tsx
│ │ │ │ │ ├── navbar.tsx
│ │ │ │ │ ├── search-navbar.stories.tsx
│ │ │ │ │ └── search-navbar.tsx
│ │ │ │ ├── numeric-spinner/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── numeric-spinner-base.tsx
│ │ │ │ │ ├── numeric-spinner.stories.tsx
│ │ │ │ │ └── numeric-spinner.tsx
│ │ │ │ ├── popup/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── popup.stories.tsx
│ │ │ │ │ ├── popup.test.tsx
│ │ │ │ │ └── popup.tsx
│ │ │ │ ├── radio/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── radio-base.tsx
│ │ │ │ │ ├── radio.stories.tsx
│ │ │ │ │ └── radio.tsx
│ │ │ │ ├── radio-group/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── radio-group-context.tsx
│ │ │ │ │ ├── radio-group-error.tsx
│ │ │ │ │ ├── radio-group-help.tsx
│ │ │ │ │ ├── radio-group-label.tsx
│ │ │ │ │ ├── radio-group.stories.tsx
│ │ │ │ │ ├── radio-group.tsx
│ │ │ │ │ └── use-radio-group.tsx
│ │ │ │ ├── rating/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── rating.stories.tsx
│ │ │ │ │ └── rating.tsx
│ │ │ │ ├── responsive/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── responsive.test.tsx
│ │ │ │ │ └── responsive.tsx
│ │ │ │ ├── section/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── section.stories.tsx
│ │ │ │ │ ├── section.test.tsx
│ │ │ │ │ └── section.tsx
│ │ │ │ ├── segment/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── segment.stories.tsx
│ │ │ │ │ └── segment.tsx
│ │ │ │ ├── select/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── select.stories.tsx
│ │ │ │ │ └── select.tsx
│ │ │ │ ├── skeleton/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── skeleton.stories.tsx
│ │ │ │ │ └── skeleton.tsx
│ │ │ │ ├── slider/
│ │ │ │ │ ├── handle.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── range-slider.stories.tsx
│ │ │ │ │ ├── range-slider.tsx
│ │ │ │ │ ├── single-slider.stories.tsx
│ │ │ │ │ ├── single-slider.tsx
│ │ │ │ │ ├── slider-base.tsx
│ │ │ │ │ ├── track.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ ├── spinner/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── rolling-spinner.stories.tsx
│ │ │ │ │ ├── rolling-spinner.tsx
│ │ │ │ │ ├── spinner.stories.tsx
│ │ │ │ │ └── spinner.tsx
│ │ │ │ ├── stack/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── stack.stories.tsx
│ │ │ │ │ ├── stack.test.tsx
│ │ │ │ │ └── stack.tsx
│ │ │ │ ├── sticky-header/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── sticky-header.stories.tsx
│ │ │ │ │ ├── sticky-header.test.tsx
│ │ │ │ │ └── sticky-header.tsx
│ │ │ │ ├── table/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── table.stories.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ ├── tabs/
│ │ │ │ │ ├── basic-tab-list.tsx
│ │ │ │ │ ├── basic-tab.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── pointing-tab-context.tsx
│ │ │ │ │ ├── pointing-tab-list.tsx
│ │ │ │ │ ├── pointing-tab.tsx
│ │ │ │ │ ├── rounded-tab-list.tsx
│ │ │ │ │ ├── rounded-tab.tsx
│ │ │ │ │ ├── tab-base.tsx
│ │ │ │ │ ├── tab-list-base.tsx
│ │ │ │ │ ├── tab-list.tsx
│ │ │ │ │ ├── tab-panel.tsx
│ │ │ │ │ ├── tab.tsx
│ │ │ │ │ ├── tabs-context.tsx
│ │ │ │ │ ├── tabs.stories.tsx
│ │ │ │ │ ├── tabs.test.tsx
│ │ │ │ │ ├── tabs.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ ├── tag/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tag.stories.tsx
│ │ │ │ │ └── tag.tsx
│ │ │ │ ├── text/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── text.stories.tsx
│ │ │ │ │ ├── text.test.tsx
│ │ │ │ │ ├── text.tsx
│ │ │ │ │ └── typography.tsx
│ │ │ │ ├── textarea/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── textarea.stories.tsx
│ │ │ │ │ └── textarea.tsx
│ │ │ │ ├── tooltip/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tooltip.stories.tsx
│ │ │ │ │ └── tooltip.tsx
│ │ │ │ ├── video/
│ │ │ │ │ ├── context.tsx
│ │ │ │ │ ├── controls.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mute-unmute-button.tsx
│ │ │ │ │ ├── play-pause-button.tsx
│ │ │ │ │ ├── seeker.tsx
│ │ │ │ │ ├── sources.tsx
│ │ │ │ │ ├── use-video-control.ts
│ │ │ │ │ ├── use-video-ref.ts
│ │ │ │ │ ├── utils.tsx
│ │ │ │ │ ├── video-element.tsx
│ │ │ │ │ ├── video-frame.tsx
│ │ │ │ │ ├── video.stories.tsx
│ │ │ │ │ └── video.tsx
│ │ │ │ └── visually-hidden/
│ │ │ │ ├── index.ts
│ │ │ │ ├── visually-hidden.test.tsx
│ │ │ │ └── visually-hidden.tsx
│ │ │ ├── index.ts
│ │ │ ├── mixins/
│ │ │ │ ├── border-radius.ts
│ │ │ │ ├── box.ts
│ │ │ │ ├── centered.ts
│ │ │ │ ├── clearing.ts
│ │ │ │ ├── ellipsis.ts
│ │ │ │ ├── horizontal-scroll.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── layering.ts
│ │ │ │ ├── margin-padding.ts
│ │ │ │ ├── max-lines.ts
│ │ │ │ ├── positioning.ts
│ │ │ │ ├── safe-area.ts
│ │ │ │ └── text-style.ts
│ │ │ └── utils/
│ │ │ ├── merge-refs.ts
│ │ │ ├── should-forward-prop.ts
│ │ │ └── unit.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── tds-widget/
│ │ ├── .eslintignore
│ │ ├── .prettierignore
│ │ ├── .stylelintignore
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── ad-banners/
│ │ │ │ ├── api.ts
│ │ │ │ ├── content-details-banner.tsx
│ │ │ │ ├── horizontal-entity.tsx
│ │ │ │ ├── horizontal-list-view.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── list-section.ts
│ │ │ │ ├── list-top-banners.tsx
│ │ │ │ ├── typing.ts
│ │ │ │ ├── vertical-entity.tsx
│ │ │ │ └── vertical-list-view.tsx
│ │ │ ├── app-banner/
│ │ │ │ ├── app-banner.stories.tsx
│ │ │ │ ├── app-banner.tsx
│ │ │ │ └── index.ts
│ │ │ ├── app-installation-cta/
│ │ │ │ ├── article-card-cta.tsx
│ │ │ │ ├── banner-cta.stories.tsx
│ │ │ │ ├── banner-cta.tsx
│ │ │ │ ├── chatbot-cta.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── elements.tsx
│ │ │ │ ├── floating-button-cta.stories.tsx
│ │ │ │ ├── floating-button-cta.tsx
│ │ │ │ ├── image-banner.stories.tsx
│ │ │ │ ├── image-banner.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── interfaces.ts
│ │ │ │ ├── service.ts
│ │ │ │ ├── text-banner.stories.tsx
│ │ │ │ └── text-banner.tsx
│ │ │ ├── author/
│ │ │ │ ├── author-intro.tsx
│ │ │ │ ├── author.stories.tsx
│ │ │ │ ├── author.tsx
│ │ │ │ └── index.ts
│ │ │ ├── booking-completion/
│ │ │ │ ├── booking-completion.stories.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── chat/
│ │ │ │ ├── bubble/
│ │ │ │ │ ├── altered.tsx
│ │ │ │ │ ├── bubble-ui.tsx
│ │ │ │ │ ├── bubble.stories.tsx
│ │ │ │ │ ├── bubble.tsx
│ │ │ │ │ ├── button.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── elements.tsx
│ │ │ │ │ ├── full-text-message-view.tsx
│ │ │ │ │ ├── image.tsx
│ │ │ │ │ ├── images.stories.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── item/
│ │ │ │ │ │ ├── image.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── text.tsx
│ │ │ │ │ ├── nol/
│ │ │ │ │ │ ├── bubble-ui.tsx
│ │ │ │ │ │ ├── coupon.tsx
│ │ │ │ │ │ ├── full-text-view/
│ │ │ │ │ │ │ ├── elements.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── styles.ts
│ │ │ │ │ ├── parent/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── parent-message.tsx
│ │ │ │ │ │ ├── parent-ui.tsx
│ │ │ │ │ │ └── parent.stories.tsx
│ │ │ │ │ ├── product.tsx
│ │ │ │ │ ├── rich.tsx
│ │ │ │ │ ├── text.tsx
│ │ │ │ │ └── type.ts
│ │ │ │ ├── bubble-container/
│ │ │ │ │ ├── bubble-container.stories.tsx
│ │ │ │ │ ├── bubble-container.tsx
│ │ │ │ │ ├── bubble-info.tsx
│ │ │ │ │ ├── elements.tsx
│ │ │ │ │ ├── icons.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── chat/
│ │ │ │ │ ├── chat-room-messages/
│ │ │ │ │ │ ├── chat-api-service.ts
│ │ │ │ │ │ ├── chat-message-context.tsx
│ │ │ │ │ │ ├── chat-room-messages-provider.tsx
│ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── messages.tsx
│ │ │ │ │ │ ├── use-chat-room-messages.ts
│ │ │ │ │ │ ├── use-pending-intersections.ts
│ │ │ │ │ │ ├── use-scroll.tsx
│ │ │ │ │ │ └── use-unread-messages.ts
│ │ │ │ │ ├── chat-scroll-container.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── messages-reducer.ts
│ │ │ │ │ ├── room-context.tsx
│ │ │ │ │ └── scroll-context.tsx
│ │ │ │ ├── expired/
│ │ │ │ │ ├── elements.tsx
│ │ │ │ │ ├── expired.stories.tsx
│ │ │ │ │ ├── expired.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── icons/
│ │ │ │ │ ├── ExclamationMarkIcon.tsx
│ │ │ │ │ ├── arrow-bottom-16-icon.tsx
│ │ │ │ │ ├── arrow-right-icon.tsx
│ │ │ │ │ ├── arrow-top-icon.tsx
│ │ │ │ │ ├── reply-meesage-icon.tsx
│ │ │ │ │ ├── reply-message-icon.tsx
│ │ │ │ │ ├── select-photo-icon.tsx
│ │ │ │ │ ├── send-icon.tsx
│ │ │ │ │ ├── talk-icon.tsx
│ │ │ │ │ └── text-full-view-arrow-icon.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── input-area/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── input-area-ui/
│ │ │ │ │ │ ├── elements.ts
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── input-area.stories.tsx
│ │ │ │ │ ├── nol-input-area-ui/
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ └── use-input-resize-observer.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── list/
│ │ │ │ │ ├── hooks.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── reducer.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── messages/
│ │ │ │ │ ├── date-divider.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── messages.stories.tsx
│ │ │ │ │ ├── type.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── navbar/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── navbar.stories.tsx
│ │ │ │ ├── nol-theme-provider/
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── converter.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── nol-theme-provider.tsx
│ │ │ │ ├── preview/
│ │ │ │ │ ├── elements.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── preview.stories.tsx
│ │ │ │ │ ├── preview.tsx
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── reservation-info/
│ │ │ │ │ ├── elements.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── reservation-info.stories.tsx
│ │ │ │ │ └── reservation-info.tsx
│ │ │ │ ├── scroll-buttons-area/
│ │ │ │ │ ├── elements.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── scroll-buttons.tsx
│ │ │ │ ├── types/
│ │ │ │ │ ├── base.ts
│ │ │ │ │ ├── image.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── message.ts
│ │ │ │ │ ├── pusher.ts
│ │ │ │ │ ├── room.ts
│ │ │ │ │ ├── ui.ts
│ │ │ │ │ ├── unread.ts
│ │ │ │ │ └── user.ts
│ │ │ │ └── utils/
│ │ │ │ ├── a-tag-navigator.ts
│ │ │ │ ├── image.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── profile.ts
│ │ │ │ └── user.ts
│ │ │ ├── content-sharing/
│ │ │ │ ├── content-sharing.stories.tsx
│ │ │ │ ├── content-sharing.tsx
│ │ │ │ └── index.ts
│ │ │ ├── date-picker/
│ │ │ │ ├── constants.ts
│ │ │ │ ├── date-styles.stories.tsx
│ │ │ │ ├── day-picker.stories.tsx
│ │ │ │ ├── day-picker.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── mixins.ts
│ │ │ │ ├── picker-frame.ts
│ │ │ │ ├── range-picker-v2/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── picker-frame.ts
│ │ │ │ │ └── range-picker.tsx
│ │ │ │ ├── range-picker-v2.stories.tsx
│ │ │ │ ├── range-picker.stories.tsx
│ │ │ │ ├── range-picker.test.tsx
│ │ │ │ ├── range-picker.tsx
│ │ │ │ ├── service.ts
│ │ │ │ ├── use-disabled-days.ts
│ │ │ │ ├── use-public-holidays.ts
│ │ │ │ └── utils.ts
│ │ │ ├── directions-finder/
│ │ │ │ ├── ask-to-the-local.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── direction-buttons.tsx
│ │ │ │ ├── directions-finder.stories.tsx
│ │ │ │ └── index.ts
│ │ │ ├── flicking-carousel/
│ │ │ │ ├── arrow-icon.tsx
│ │ │ │ ├── flicking-carousel.stories.tsx
│ │ │ │ ├── flicking-carousel.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── mocks/
│ │ │ │ └── carousel.sample.json
│ │ │ ├── footer/
│ │ │ │ ├── elements/
│ │ │ │ │ ├── awards.tsx
│ │ │ │ │ ├── button-area/
│ │ │ │ │ │ ├── button.tsx
│ │ │ │ │ │ ├── dropdown.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── company-info.tsx
│ │ │ │ │ ├── divider.tsx
│ │ │ │ │ ├── extra-link-group.tsx
│ │ │ │ │ └── link-group.tsx
│ │ │ │ ├── footers/
│ │ │ │ │ ├── default-footer.tsx
│ │ │ │ │ ├── footer.stories.tsx
│ │ │ │ │ ├── logo-footer.stories.tsx
│ │ │ │ │ └── logo-footer.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── mocks/
│ │ │ │ │ └── footer.json
│ │ │ │ └── utils/
│ │ │ │ ├── constants.ts
│ │ │ │ ├── type.ts
│ │ │ │ └── use-footer-info.tsx
│ │ │ ├── hub-form/
│ │ │ │ ├── cell.tsx
│ │ │ │ ├── cta.tsx
│ │ │ │ ├── hub-form.stories.tsx
│ │ │ │ ├── hub-form.tsx
│ │ │ │ └── index.ts
│ │ │ ├── image-carousel/
│ │ │ │ ├── carousel.tsx
│ │ │ │ ├── content.tsx
│ │ │ │ ├── image-carousel.stories.tsx
│ │ │ │ ├── image-carousel.tsx
│ │ │ │ ├── image-content.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── mocks/
│ │ │ │ │ ├── image-carousel.sample.json
│ │ │ │ │ └── video-carousel.sample.json
│ │ │ │ ├── page-label.tsx
│ │ │ │ ├── types.ts
│ │ │ │ └── video-content.tsx
│ │ │ ├── image-source/
│ │ │ │ ├── image-source.tsx
│ │ │ │ └── index.ts
│ │ │ ├── image-viewer/
│ │ │ │ ├── detail-viewer/
│ │ │ │ │ ├── image.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── video.tsx
│ │ │ │ ├── image-viewer.stories.tsx
│ │ │ │ ├── image-viewer.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── listing-filter/
│ │ │ │ ├── index.ts
│ │ │ │ ├── listing-filter-expanding-filter-entry.stories.tsx
│ │ │ │ ├── listing-filter-filter-entry.stories.tsx
│ │ │ │ ├── listing-filter-primary-filter-entry.stories.tsx
│ │ │ │ ├── listing-filter.stories.tsx
│ │ │ │ └── listing-filter.tsx
│ │ │ ├── location-properties/
│ │ │ │ ├── index.tsx
│ │ │ │ ├── location-properties.stories.tsx
│ │ │ │ ├── location-properties.tsx
│ │ │ │ └── property-item.tsx
│ │ │ ├── map/
│ │ │ │ ├── focus-tracker.tsx
│ │ │ │ ├── index.test.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── map-view.tsx
│ │ │ │ ├── map.stories.tsx
│ │ │ │ ├── mock.ts
│ │ │ │ ├── mocks/
│ │ │ │ │ └── hotel-recommandations.json
│ │ │ │ ├── overlay/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── markers/
│ │ │ │ │ │ ├── flexible-marker.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── poi-dot-marker.tsx
│ │ │ │ │ │ └── primary-marker/
│ │ │ │ │ │ ├── bubble-marker.tsx
│ │ │ │ │ │ ├── circle-marker/
│ │ │ │ │ │ │ ├── circle-marker-base.tsx
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── dot-marker.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── pin-marker/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── pin-marker.tsx
│ │ │ │ │ ├── polygon.tsx
│ │ │ │ │ └── polyline.tsx
│ │ │ │ ├── types.ts
│ │ │ │ └── utilities.ts
│ │ │ ├── media/
│ │ │ │ ├── index.ts
│ │ │ │ └── media.tsx
│ │ │ ├── nearby-pois/
│ │ │ │ ├── index.ts
│ │ │ │ ├── nearby-pois.stories.tsx
│ │ │ │ ├── nearby-pois.tsx
│ │ │ │ ├── poi-entry.tsx
│ │ │ │ ├── reducer.ts
│ │ │ │ ├── service.ts
│ │ │ │ └── types.ts
│ │ │ ├── poi-detail/
│ │ │ │ ├── actions/
│ │ │ │ │ ├── actions.stories.tsx
│ │ │ │ │ ├── actions.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── tooltip/
│ │ │ │ │ └── tooltip.tsx
│ │ │ │ ├── area-names.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── copy-action-sheet-item.tsx
│ │ │ │ ├── copy-action-sheet.tsx
│ │ │ │ ├── detail-header/
│ │ │ │ │ ├── business-hours-icons.tsx
│ │ │ │ │ ├── business-hours-note.tsx
│ │ │ │ │ ├── index.test.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── detail-header-v2/
│ │ │ │ │ ├── index.test.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── detail-header-v2.stories.tsx
│ │ │ │ ├── detail-header.stories.tsx
│ │ │ │ ├── image-carousel/
│ │ │ │ │ ├── carousel-section.tsx
│ │ │ │ │ ├── carousel.tsx
│ │ │ │ │ ├── cta-overlay.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── note.tsx
│ │ │ │ │ └── placeholder.tsx
│ │ │ │ ├── image-carousel.stories.tsx
│ │ │ │ ├── images-provider.tsx
│ │ │ │ ├── images-reducer.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── mocks/
│ │ │ │ │ ├── inventory-item.json
│ │ │ │ │ └── recommended-articles.json
│ │ │ │ ├── recommended-articles/
│ │ │ │ │ ├── api-client.ts
│ │ │ │ │ ├── article-entry.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── more-button.tsx
│ │ │ │ │ ├── recommended-articles.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ ├── recommended-articles.stories.tsx
│ │ │ │ ├── types.ts
│ │ │ │ └── use-fetch-images.tsx
│ │ │ ├── poi-list-elements/
│ │ │ │ ├── carousel-element.tsx
│ │ │ │ ├── compact-poi-list-element.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── extended-poi-list-element.tsx
│ │ │ │ ├── get-type-names.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── mocks/
│ │ │ │ │ ├── hotels.sample.json
│ │ │ │ │ └── pois.sample.json
│ │ │ │ ├── poi-card-element/
│ │ │ │ │ ├── direction-button.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── poi-card-element.tsx
│ │ │ │ ├── poi-card-element.stories.tsx
│ │ │ │ ├── poi-carousel-element.stories.tsx
│ │ │ │ ├── poi-list-element.stories.tsx
│ │ │ │ ├── poi-list-element.tsx
│ │ │ │ └── types.ts
│ │ │ ├── pricing/
│ │ │ │ ├── fixed-pricing-v2/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── purchase-button-loading-indicator.tsx
│ │ │ │ │ └── purchase-button.tsx
│ │ │ │ ├── fixed-pricing-v2.stories.tsx
│ │ │ │ ├── fixed-pricing.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── pricing.stories.tsx
│ │ │ │ └── pricing.tsx
│ │ │ ├── public-header/
│ │ │ │ ├── categories.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── extra-action-item.tsx
│ │ │ │ ├── extra-action-separator.tsx
│ │ │ │ ├── extra-actions-container.tsx
│ │ │ │ ├── header-menu-button.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── public-header-deeplink.tsx
│ │ │ │ ├── public-header.spec.tsx
│ │ │ │ ├── public-header.stories.tsx
│ │ │ │ ├── public-header.tsx
│ │ │ │ ├── side-menu/
│ │ │ │ │ ├── auth-button.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── menu-list.tsx
│ │ │ │ │ ├── overlay.tsx
│ │ │ │ │ ├── profile.tsx
│ │ │ │ │ └── type.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── use-auto-hide.ts
│ │ │ │ └── use-deeplink-href.ts
│ │ │ ├── recommended-contents/
│ │ │ │ ├── index.ts
│ │ │ │ ├── mocks/
│ │ │ │ │ └── recommended-contents.sample.json
│ │ │ │ ├── recommended-contents.stories.tsx
│ │ │ │ └── recommended-contents.tsx
│ │ │ ├── replies/
│ │ │ │ ├── auto-resizing-textarea.tsx
│ │ │ │ ├── context.tsx
│ │ │ │ ├── guide-text.tsx
│ │ │ │ ├── hook.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── list/
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── not-exist-replies.tsx
│ │ │ │ │ └── reply.tsx
│ │ │ │ ├── register.test.tsx
│ │ │ │ ├── register.tsx
│ │ │ │ ├── replies-api-client.test.ts
│ │ │ │ ├── replies-api-client.ts
│ │ │ │ ├── replies.stories.tsx
│ │ │ │ ├── replies.tsx
│ │ │ │ ├── reply-tree-manipulators.test.tsx
│ │ │ │ ├── reply-tree-manipulators.ts
│ │ │ │ ├── reply.test.tsx
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── resource-list-elements/
│ │ │ │ ├── extended-resource-list-element.stories.tsx
│ │ │ │ ├── extended-resource-list-element.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── resource-list-element-stats.stories.tsx
│ │ │ │ ├── resource-list-element-stats.tsx
│ │ │ │ ├── review-scrap-stat.stories.tsx
│ │ │ │ └── review-scrap-stat.tsx
│ │ │ ├── review/
│ │ │ │ ├── components/
│ │ │ │ │ ├── filter-context.tsx
│ │ │ │ │ ├── filter.tsx
│ │ │ │ │ ├── full-list-button.tsx
│ │ │ │ │ ├── infinite-list/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── infinite-list.tsx
│ │ │ │ │ │ ├── latest-reviews-infinite.tsx
│ │ │ │ │ │ ├── popular-reviews-infinite.tsx
│ │ │ │ │ │ ├── rating-infinite-list.tsx
│ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── mileage-button.tsx
│ │ │ │ │ ├── my-review-action-sheet.tsx
│ │ │ │ │ ├── others-review-action-sheet.tsx
│ │ │ │ │ ├── review-element/
│ │ │ │ │ │ ├── badges.tsx
│ │ │ │ │ │ ├── comment.tsx
│ │ │ │ │ │ ├── foldable-comment.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ ├── media/
│ │ │ │ │ │ │ ├── compare-media.ts
│ │ │ │ │ │ │ ├── elements.ts
│ │ │ │ │ │ │ ├── image.tsx
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── media-wrapper.tsx
│ │ │ │ │ │ │ ├── medium.tsx
│ │ │ │ │ │ │ └── video.tsx
│ │ │ │ │ │ ├── pinned-message.tsx
│ │ │ │ │ │ ├── purchaseInfo.tsx
│ │ │ │ │ │ └── user.tsx
│ │ │ │ │ ├── review-placeholder-with-rating.tsx
│ │ │ │ │ ├── reviews-shorten.tsx
│ │ │ │ │ ├── reviews.tsx
│ │ │ │ │ ├── shorten-list/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── latest-reviews.tsx
│ │ │ │ │ │ ├── popular-reviews.tsx
│ │ │ │ │ │ ├── rating-reviews.tsx
│ │ │ │ │ │ ├── reviews-list.tsx
│ │ │ │ │ │ ├── services.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── sorting-context.tsx
│ │ │ │ │ ├── sorting-options-action-sheet.tsx
│ │ │ │ │ ├── sorting-options.tsx
│ │ │ │ │ ├── types.tsx
│ │ │ │ │ └── write-button.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── data/
│ │ │ │ │ └── graphql/
│ │ │ │ │ ├── client.ts
│ │ │ │ │ ├── generated.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mutation.graphql
│ │ │ │ │ └── query.graphql
│ │ │ │ ├── index.ts
│ │ │ │ ├── mocks/
│ │ │ │ │ ├── review-element.duo-images.json
│ │ │ │ │ ├── review-element.duo-videos.json
│ │ │ │ │ ├── review-element.mono-image.json
│ │ │ │ │ ├── review-element.mono-video.json
│ │ │ │ │ ├── review-element.more-images.json
│ │ │ │ │ ├── review-element.more-vidoes.json
│ │ │ │ │ ├── review-element.penta-images.json
│ │ │ │ │ ├── review-element.quad-images.json
│ │ │ │ │ ├── review-element.tri-images.json
│ │ │ │ │ ├── review-element.tri-videos.json
│ │ │ │ │ └── reviews.ts
│ │ │ │ ├── review-element.stories.tsx
│ │ │ │ ├── reviews-placeholder.stories.tsx
│ │ │ │ ├── reviews-shorten.stories.tsx
│ │ │ │ ├── reviews.stories.tsx
│ │ │ │ ├── services/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── use-client-actions.tsx
│ │ │ │ │ └── use-reviews.ts
│ │ │ │ └── utils.ts
│ │ │ ├── scrap/
│ │ │ │ ├── constants.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── provider.tsx
│ │ │ │ ├── reducer.ts
│ │ │ │ ├── services.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── use-scrap.ts
│ │ │ ├── scrap-button/
│ │ │ │ ├── hooks.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── outline-scrap-button.stories.tsx
│ │ │ │ ├── outline-scrap-button.tsx
│ │ │ │ ├── overlay-scrap-button.stories.tsx
│ │ │ │ ├── overlay-scrap-button.tsx
│ │ │ │ ├── scrap-button-mask.test.tsx
│ │ │ │ ├── scrap-button-mask.tsx
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── search/
│ │ │ │ ├── index.ts
│ │ │ │ ├── search.stories.tsx
│ │ │ │ └── search.tsx
│ │ │ ├── social-reviews/
│ │ │ │ ├── external-links.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── social-review.tsx
│ │ │ │ └── social-reviews.stories.tsx
│ │ │ ├── static-map/
│ │ │ │ ├── index.ts
│ │ │ │ ├── static-map.stories.tsx
│ │ │ │ └── static-map.tsx
│ │ │ └── user-verification/
│ │ │ ├── confirmation-services.test.ts
│ │ │ ├── confirmation-services.ts
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ ├── use-user-verification.test.ts
│ │ │ ├── use-user-verification.ts
│ │ │ ├── verification-request.stories.tsx
│ │ │ ├── verification-request.tsx
│ │ │ ├── verified-message.spec.tsx
│ │ │ └── verified-message.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-document/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── animation.stories.tsx
│ │ │ ├── elements/
│ │ │ │ ├── anchor.tsx
│ │ │ │ ├── animation.tsx
│ │ │ │ ├── coupon/
│ │ │ │ │ ├── coupon-download-buttons.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── modals.tsx
│ │ │ │ │ ├── utils.test.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── embedded.tsx
│ │ │ │ ├── external-video.tsx
│ │ │ │ ├── images.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── itinerary/
│ │ │ │ │ ├── badge.ts
│ │ │ │ │ ├── icons.tsx
│ │ │ │ │ ├── itinerary-map.tsx
│ │ │ │ │ ├── poi-card.tsx
│ │ │ │ │ ├── save-to-itinerary.tsx
│ │ │ │ │ ├── tag-label.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── use-computed-itineraries.ts
│ │ │ │ │ ├── use-computed-map.ts
│ │ │ │ │ ├── use-handle-add-pois-to-trip.ts
│ │ │ │ │ ├── use-safety-poi.ts
│ │ │ │ │ └── with-type-circle-badge.tsx
│ │ │ │ ├── itinerary.tsx
│ │ │ │ ├── links.tsx
│ │ │ │ ├── list.tsx
│ │ │ │ ├── note.tsx
│ │ │ │ ├── pois.tsx
│ │ │ │ ├── regions.tsx
│ │ │ │ ├── shared/
│ │ │ │ │ ├── display-containers.tsx
│ │ │ │ │ ├── document-carousel.tsx
│ │ │ │ │ ├── generate-click-handler.ts
│ │ │ │ │ └── resource-list.tsx
│ │ │ │ ├── sticky-tabs.tsx
│ │ │ │ ├── table.tsx
│ │ │ │ ├── text/
│ │ │ │ │ ├── headings.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── plain.tsx
│ │ │ │ └── tna/
│ │ │ │ ├── index.tsx
│ │ │ │ ├── price-policy-coupon-info.tsx
│ │ │ │ ├── product.tsx
│ │ │ │ ├── slot.tsx
│ │ │ │ ├── types.ts
│ │ │ │ └── use-generate-coupon.ts
│ │ │ ├── heading.stories.tsx
│ │ │ ├── hr.stories.tsx
│ │ │ ├── images.stories.tsx
│ │ │ ├── index.ts
│ │ │ ├── links.stories.tsx
│ │ │ ├── list.stories.tsx
│ │ │ ├── mocks/
│ │ │ │ ├── hotel.sample.json
│ │ │ │ ├── images-frame.sample.json
│ │ │ │ ├── images.sample.json
│ │ │ │ ├── pois.sample.json
│ │ │ │ ├── slots.sample.json
│ │ │ │ ├── triple-document.embedded.json
│ │ │ │ ├── triple-document.itinerary.json
│ │ │ │ ├── triple-document.regions.json
│ │ │ │ └── triple-document.sample.json
│ │ │ ├── pois.stories.tsx
│ │ │ ├── prop-context/
│ │ │ │ ├── deep-link.ts
│ │ │ │ ├── guest-mode.ts
│ │ │ │ ├── image-click-handler.ts
│ │ │ │ ├── image-source.ts
│ │ │ │ ├── link-click-handler.ts
│ │ │ │ ├── media-config.tsx
│ │ │ │ └── resource-click-handler.ts
│ │ │ ├── tna-slot.stories.tsx
│ │ │ ├── triple-document.stories.tsx
│ │ │ ├── triple-document.tsx
│ │ │ ├── types.ts
│ │ │ └── use-resource-event-tracker.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-email-document/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── common/
│ │ │ │ ├── box.ts
│ │ │ │ ├── fluid-table.tsx
│ │ │ │ ├── handlebars-anchor.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── reset.ts
│ │ │ ├── components/
│ │ │ │ ├── index.ts
│ │ │ │ ├── preview.test.tsx
│ │ │ │ └── preview.tsx
│ │ │ ├── elements/
│ │ │ │ ├── dividers.test.tsx
│ │ │ │ ├── dividers.tsx
│ │ │ │ ├── embedded.test.tsx
│ │ │ │ ├── embedded.tsx
│ │ │ │ ├── heading.test.tsx
│ │ │ │ ├── heading.tsx
│ │ │ │ ├── images.test.tsx
│ │ │ │ ├── images.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── links.test.tsx
│ │ │ │ ├── links.tsx
│ │ │ │ ├── note.test.tsx
│ │ │ │ ├── note.tsx
│ │ │ │ ├── text.test.tsx
│ │ │ │ └── text.tsx
│ │ │ ├── embedded.stories.tsx
│ │ │ ├── full-email-template.tsx
│ │ │ ├── heading.stories.tsx
│ │ │ ├── hr.stories.tsx
│ │ │ ├── images.stories.tsx
│ │ │ ├── index.ts
│ │ │ ├── links.stories.tsx
│ │ │ ├── note.stories.tsx
│ │ │ ├── preview.stories.tsx
│ │ │ ├── text.stories.tsx
│ │ │ ├── triple-email-document.test.tsx
│ │ │ └── triple-email-document.tsx
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-fallback-action/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── constant.ts
│ │ │ ├── index.ts
│ │ │ ├── triple-fallback-action-remover.tsx
│ │ │ ├── triple-fallback-action.test.tsx
│ │ │ ├── triple-fallback-action.tsx
│ │ │ └── use-triple-fallback-action-remover.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-header/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── frame/
│ │ │ │ ├── common.ts
│ │ │ │ ├── effects/
│ │ │ │ │ ├── common.ts
│ │ │ │ │ ├── flying.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── rotate.tsx
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── zoom.tsx
│ │ │ │ ├── frame.tsx
│ │ │ │ ├── image.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── text.tsx
│ │ │ ├── index.ts
│ │ │ ├── layer/
│ │ │ │ ├── index.ts
│ │ │ │ ├── layer.tsx
│ │ │ │ └── transitions/
│ │ │ │ ├── fade-in-out.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── marquee.tsx
│ │ │ │ ├── rolling.tsx
│ │ │ │ └── slide.tsx
│ │ │ ├── lottie/
│ │ │ │ ├── index.ts
│ │ │ │ ├── lottie.tsx
│ │ │ │ └── use-lottie.ts
│ │ │ ├── mocks/
│ │ │ │ ├── framer-type.sample.json
│ │ │ │ └── lottie-type.sample.json
│ │ │ ├── motion-container.ts
│ │ │ ├── service.ts
│ │ │ ├── triple-header.stories.tsx
│ │ │ ├── triple-header.tsx
│ │ │ └── types.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-web/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── client-app/
│ │ │ │ ├── context.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── use-client-app-actions.mdx
│ │ │ │ ├── use-client-app-actions.test.tsx
│ │ │ │ ├── use-client-app-actions.ts
│ │ │ │ ├── use-client-app-callback.mdx
│ │ │ │ ├── use-client-app-callback.test.tsx
│ │ │ │ ├── use-client-app-callback.ts
│ │ │ │ ├── use-client-app.mdx
│ │ │ │ ├── use-client-app.test.tsx
│ │ │ │ ├── use-client-app.ts
│ │ │ │ ├── use-feature-flag.mdx
│ │ │ │ ├── use-feature-flag.test.tsx
│ │ │ │ └── use-feature-flag.ts
│ │ │ ├── env/
│ │ │ │ ├── context.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── use-env.mdx
│ │ │ │ ├── use-env.test.tsx
│ │ │ │ └── use-env.ts
│ │ │ ├── event-tracking/
│ │ │ │ ├── context.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── libs/
│ │ │ │ │ └── firebase-analytics.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── use-set-firebase-user-id.mdx
│ │ │ │ ├── use-set-firebase-user-id.ts
│ │ │ │ ├── use-track-event-with-metadata.mdx
│ │ │ │ ├── use-track-event-with-metadata.ts
│ │ │ │ ├── use-track-event.mdx
│ │ │ │ ├── use-track-event.ts
│ │ │ │ ├── use-track-screen.mdx
│ │ │ │ ├── use-track-screen.ts
│ │ │ │ ├── use-triple-web-device-id.ts
│ │ │ │ ├── use-utm.mdx
│ │ │ │ ├── use-utm.ts
│ │ │ │ └── utils/
│ │ │ │ ├── track-event.ts
│ │ │ │ └── track-screen.ts
│ │ │ ├── hash-router/
│ │ │ │ ├── context.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── use-hash-router.mdx
│ │ │ │ └── use-hash-router.ts
│ │ │ ├── i18n/
│ │ │ │ ├── context.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── use-i18n.mdx
│ │ │ │ ├── use-i18n.test.tsx
│ │ │ │ ├── use-i18n.ts
│ │ │ │ ├── use-translation.mdx
│ │ │ │ ├── use-translation.test.tsx
│ │ │ │ └── use-translation.ts
│ │ │ ├── index.ts
│ │ │ ├── modal/
│ │ │ │ ├── app-install-cta-modal-context.ts
│ │ │ │ ├── components/
│ │ │ │ │ ├── app-install-cta-modal.tsx
│ │ │ │ │ └── login-cta-modal.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── context.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── login-cta-modal-context.ts
│ │ │ │ ├── types.ts
│ │ │ │ ├── use-app-install-cta-modal.mdx
│ │ │ │ ├── use-app-install-cta-modal.ts
│ │ │ │ ├── use-login-cta-modal.mdx
│ │ │ │ └── use-login-cta-modal.ts
│ │ │ ├── providers/
│ │ │ │ ├── app-install-cta-modal-provider.tsx
│ │ │ │ ├── event-metadata-provider.tsx
│ │ │ │ ├── event-tracking-provider.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── login-cta-modal-provider.tsx
│ │ │ │ └── triple-web.tsx
│ │ │ ├── session/
│ │ │ │ ├── context.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.tsx
│ │ │ │ ├── use-login.mdx
│ │ │ │ ├── use-login.ts
│ │ │ │ ├── use-logout.mdx
│ │ │ │ ├── use-logout.ts
│ │ │ │ ├── use-session-availability.mdx
│ │ │ │ ├── use-session-availability.test.tsx
│ │ │ │ ├── use-session-availability.ts
│ │ │ │ ├── use-session-callback.mdx
│ │ │ │ ├── use-session-callback.test.tsx
│ │ │ │ ├── use-session-callback.ts
│ │ │ │ ├── use-session.mdx
│ │ │ │ ├── use-session.test.tsx
│ │ │ │ ├── use-session.ts
│ │ │ │ └── utils/
│ │ │ │ ├── redirect.spec.ts
│ │ │ │ └── redirect.ts
│ │ │ └── user-agent/
│ │ │ ├── context.tsx
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ ├── use-user-agent.mdx
│ │ │ ├── use-user-agent.test.tsx
│ │ │ └── use-user-agent.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-web-nextjs/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── initializers/
│ │ │ │ ├── client-app.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── session.ts
│ │ │ │ └── user-agent.ts
│ │ │ └── providers/
│ │ │ ├── app-install-cta-modal-provider.mdx
│ │ │ ├── app-install-cta-modal-provider.tsx
│ │ │ ├── event-metadata-provider.mdx
│ │ │ ├── event-metadata-provider.tsx
│ │ │ ├── event-tracking-provider.mdx
│ │ │ ├── event-tracking-provider.tsx
│ │ │ ├── index.ts
│ │ │ ├── login-cta-modal-provider.mdx
│ │ │ ├── login-cta-modal-provider.tsx
│ │ │ ├── triple-web.mdx
│ │ │ └── triple-web.tsx
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-web-nextjs-pages/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── helpers/
│ │ │ │ ├── client-app.ts
│ │ │ │ ├── session.ts
│ │ │ │ └── user-agent.ts
│ │ │ ├── index.ts
│ │ │ ├── initializers/
│ │ │ │ ├── client-app.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── session.ts
│ │ │ │ └── user-agent.ts
│ │ │ ├── providers/
│ │ │ │ ├── app-install-cta-modal-provider.mdx
│ │ │ │ ├── app-install-cta-modal-provider.tsx
│ │ │ │ ├── event-metadata-provider.mdx
│ │ │ │ ├── event-metadata-provider.tsx
│ │ │ │ ├── event-tracking-provider.mdx
│ │ │ │ ├── event-tracking-provider.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── login-cta-modal-provider.mdx
│ │ │ │ ├── login-cta-modal-provider.tsx
│ │ │ │ ├── triple-web.mdx
│ │ │ │ └── triple-web.tsx
│ │ │ └── ssr-utils/
│ │ │ ├── auth-guard.test.ts
│ │ │ ├── auth-guard.ts
│ │ │ ├── get-client-app.ts
│ │ │ ├── get-session-availability.ts
│ │ │ ├── get-user-agent.ts
│ │ │ ├── index.ts
│ │ │ └── put-invalid-session-id-remover.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-web-test-utils/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── create-test-wrapper.tsx
│ │ │ └── index.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── triple-web-utils/
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── check-client-app.test.ts
│ │ │ ├── check-client-app.ts
│ │ │ ├── index.ts
│ │ │ ├── regex.ts
│ │ │ ├── user-agent.ts
│ │ │ └── user.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ ├── type-definitions/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── geojson.ts
│ │ │ ├── image.ts
│ │ │ ├── index.ts
│ │ │ ├── inventory-item.ts
│ │ │ ├── listing-poi.ts
│ │ │ ├── translated-property.ts
│ │ │ └── triple-document.ts
│ │ ├── tsconfig.build.json
│ │ ├── tsconfig.json
│ │ └── vite.config.mts
│ └── view-utilities/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── debounce.ts
│ │ ├── derive-current-state-and-count.ts
│ │ ├── find-folded-position.ts
│ │ ├── format-number.spec.ts
│ │ ├── format-number.ts
│ │ ├── generate-deep-link/
│ │ │ ├── README.md
│ │ │ ├── index.ts
│ │ │ ├── make-deep-link-generator.test.ts
│ │ │ ├── make-deep-link-generator.ts
│ │ │ ├── param-injectors.test.ts
│ │ │ └── param-injectors.ts
│ │ ├── generate-share-image-url.ts
│ │ ├── index.ts
│ │ ├── measure-distance.spec.ts
│ │ ├── measure-distance.ts
│ │ ├── normalize-query-keys/
│ │ │ ├── index.test.ts
│ │ │ └── index.ts
│ │ ├── routelist/
│ │ │ ├── index.ts
│ │ │ ├── routelist.spec.ts
│ │ │ └── routelist.ts
│ │ ├── strict-query/
│ │ │ ├── index.test.ts
│ │ │ └── index.ts
│ │ ├── timestamp.ts
│ │ ├── url.spec.ts
│ │ └── url.ts
│ ├── tsconfig.build.json
│ ├── tsconfig.json
│ └── vite.config.mts
├── pnpm-workspace.yaml
├── renovate.json
├── scripts/
│ └── changelog.js
├── stories/
│ └── introduction.mdx
├── tsconfig.json
├── tsconfig.test.json
└── vite.config.mts
================================================
FILE CONTENTS
================================================
================================================
FILE: .browserslistrc
================================================
[production]
iOS >= 13.4, last 3 Safari versions, > 0.5% in KR, not dead
[development]
last 1 chrome version
================================================
FILE: .editorconfig
================================================
# http://editorconfig.org
root = true
[*.{js,ts,tsx}]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
max_line_length = 80
trim_trailing_whitespace = true
[*.{json,yml,yaml}]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
================================================
FILE: .eslintrc.js
================================================
/** @type import('eslint').Linter.Config */
module.exports = {
root: true,
extends: [
'@titicaca/eslint-config-triple',
'@titicaca/eslint-config-triple/frontend',
'@titicaca/eslint-config-triple/prettier',
'plugin:storybook/recommended',
],
overrides: [
{
files: ['*.test.*', '*.spec.*'],
extends: [
'plugin:jest/style',
'plugin:jest/recommended',
'plugin:jest-dom/recommended',
'plugin:testing-library/react',
],
},
],
}
================================================
FILE: .github/CODEOWNERS
================================================
* @titicacadev/frontend
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!-- 이 PR을 요약한 내용으로 위 제목 폼을 채워 주세요. -->
## PR 설명
<!-- PR의 목적, PR이 구현하는 기획이나 디자인(figma, slack or jira) 등 리뷰어가 참고할 내용을 적어주세요. -->
## 변경 내역
<!-- 실제 변경이 발생한 부분을 위주로 서술해주세요. -->
<!-- 필요하다면 코드 레벨의 설명도 곁들일 수 있습니다. -->
<!-- 리뷰어가 변경점에 대해 빠르게 이해를 할 수 있도록 서술해주세요. -->
## 체크리스트
<!-- 프로젝트별로 반드시 확인해야 하는 항목을 나열해주세요. -->
<!-- 각 항목을 읽어 보시고, 해당하는 항목의 주석을 해제해주세요. -->
<!-- 조금이라도 명확하지 않은 부분이 있다면 슬랙 #triple-web-dev 채널로 질문해주세요! -->
<!-- - [x] 주요 동선의 통합 테스트를 진행하셨나요? -->
<!-- - [x] 기획자/디자이너에게 확인을 받았나요? 혹은 확인이 필요없는 이슈인가요? -->
## 스크린샷 & URL
<!-- 이 변경과 관련있는 스크린샷을 첨부해 주세요. -->
<!-- 반드시 필요한 게 아니라면 생략 가능합니다. -->
<!-- 변경 사항을 확인할 수 있는 샘플 URL을 알려주세요. 바로 동작하는 링크일수록 좋습니다. -->
================================================
FILE: .github/workflows/add-label.yaml
================================================
name: Label a PR with its updated packages
on:
pull_request:
types: [opened, synchronize, ready_for_review]
jobs:
label-pr:
if: ${{ github.event.pull_request.draft == false && github.event.pull_request.user.login != 'triple-bot' && !contains(github.event.pull_request.labels.*.name, 'release') }}
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
- name: Get changed packages
run: |
RESPONSE=$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/${{ github.repository }}/compare/${{ github.event.pull_request.base.ref }}...${{ github.event.pull_request.head.ref }}")
if [[ $(echo "$RESPONSE" | jq '.total_commits') == null ]]; then
echo $RESPONSE | jq '.message'
exit 1
fi
CHANGED_PACKAGES=$(echo "$RESPONSE" | jq '[.files[].filename | capture("packages/(?<packageName>[^/]+)/") .packageName] | unique | tostring')
echo "CHANGED_PACKAGES=$CHANGED_PACKAGES" >> $GITHUB_ENV
- name: Label PR
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PACKAGE_LABELS=$(echo ${{ env.CHANGED_PACKAGES }} | jq .)
curl -X POST \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels \
-d "{\"labels\": $PACKAGE_LABELS }"
================================================
FILE: .github/workflows/cd.yaml
================================================
name: CD
on:
push:
branches-ignore:
- '**'
tags:
- 'release-prod-*'
- 'release-pr-*'
env:
GITHUB_API_URL_BASE: https://api.github.com/repos/${{ github.repository }}
# Node.js
NODE_VERSION: 'lts/*'
PNPM_VERSION: '9'
NPM_REGISTRY_URL: 'https://registry.npmjs.org'
NODE_AUTH_TOKEN: ${{ secrets.READ_ONLY_NPM_TOKEN }}
HUSKY: 0
# Nx Cloud
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
jobs:
wait-for-ci:
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
# cache: 'pnpm'
- name: Wait for CI
uses: fountainhead/action-wait-for-check@v1.1.0
id: wait-for-ci
with:
token: ${{ secrets.GITHUB_TOKEN }}
checkName: build
- name: Shutdown workflow
if: steps.wait-for-ci.outputs.conclusion != 'success'
run: node -e 'process.exit(1)'
release:
needs: wait-for-ci
if: startsWith(github.event.ref, 'refs/tags/release-prod-')
runs-on: ${{ vars.NOL_RUNNER }}
permissions:
contents: read
id-token: write # npm provenance를 위한 OIDC 토큰 발급 권한
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
# cache: 'pnpm'
- name: Get release version
run: echo "DEPLOY_VERSION=v$(cat ./lerna.json | jq -r '.version')" >> $GITHUB_ENV
- name: Install dependencies
env:
NODE_AUTH_TOKEN: ${{ secrets.READ_ONLY_NPM_TOKEN }}
run: pnpm install
- run: pnpm run build
- name: Release
run: pnpm -r publish --no-git-checks --provenance
tag:
needs: release
if: success()
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- uses: actions/checkout@v4
- name: Get released version
run: echo "TAG_NAME=v$(cat ./lerna.json | jq -r '.version')" >> $GITHUB_ENV
- name: Create tag object
id: create-tag-object
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-tag-object
run: |
curl --url $GITHUB_API_URL_BASE/git/tags \
-f \
--request POST \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
-H 'Content-Type: application/json' \
-d "{\"tag\":\"$TAG_NAME\",\"message\":\"released at \`${{ github.event.updated_at }}\`\",\"object\":\"${GITHUB_SHA}\",\"type\":\"commit\"}" \
> tag.json
echo "::set-output name=tag-sha::$(node -p -e 'require(`./tag.json`).sha')"
- name: Check tag ref exist
id: check-tag-ref
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#get-a-reference
run: |
curl --url $GITHUB_API_URL_BASE/git/refs/tags/$TAG_NAME \
-sI \
-o /dev/null \
-w "%{http_code}" \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
> status
echo "::set-output name=status::$(cat status)"
- name: Create new tag ref
if: ${{ steps.check-tag-ref.outputs.status != '200' }}
env:
TAG_SHA: ${{ steps.create-tag-object.outputs.tag-sha }}
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-reference
run: |
curl --url $GITHUB_API_URL_BASE/git/refs \
-f \
--request POST \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
-H 'Content-Type: application/json' \
-d "{\"ref\":\"refs/tags/$TAG_NAME\",\"sha\":\"$TAG_SHA\"}"
- name: Update tag ref
if: ${{ steps.check-tag-ref.outputs.status == '200' }}
env:
TAG_SHA: ${{ steps.create-tag-object.outputs.tag-sha }}
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#update-a-reference
run: |
curl --url $GITHUB_API_URL_BASE/git/refs/tags/$TAG_NAME \
-f \
--request PATCH \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
-H 'Content-Type: application/json' \
-d "{\"force\":true,\"sha\":\"${TAG_SHA}\"}"
canary-release:
needs: wait-for-ci
if: startsWith(github.event.ref, 'refs/tags/release-pr-')
runs-on: ${{ vars.NOL_RUNNER }}
permissions:
contents: read
id-token: write # npm provenance를 위한 OIDC 토큰 발급 권한
issues: write # PR 코멘트 작성 권한
pull-requests: write # PR 코멘트 작성 권한
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
# cache: 'pnpm'
- name: Get release version
env:
TAG_NAME: ${{ github.event.ref }}
run: |
NEXT_VERSION=$(node -e "const [major, minor, patch] = require('./lerna.json').version.split('.');console.log(['v'+major, minor, parseInt(patch, 10) + 1].join('.'))")
PR_NUMBER=${TAG_NAME:21} # refs/tags/release-pr-<num>에서 <num>만 추출
REF_COUNT=$(node -p -e "Math.max(0, parseInt((\"$(git describe --always --long --dirty --match "v*.*.*")\".match(/^(?:.*@)?.*-(\d+)-.*?$/) || ['0', '0'])[1], 10) - 1)")
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV
echo "DEPLOY_VERSION=$NEXT_VERSION-pr-$PR_NUMBER.$REF_COUNT" >> $GITHUB_ENV
- name: Install dependencies
env:
NODE_AUTH_TOKEN: ${{ secrets.READ_ONLY_NPM_TOKEN }}
run: pnpm install
- run: pnpm run build
- run: |
pnpm exec lerna version $DEPLOY_VERSION \
--amend \
--force-publish \
--ignore-scripts \
--no-git-tag-version \
--preid "pr-$PR_NUMBER" \
--yes
- name: Publish as canary
run: pnpm -r publish --tag canary --no-git-checks --provenance
- name: Notify released version on pull request
run: |
curl \
--url $GITHUB_API_URL_BASE/issues/${{ env.PR_NUMBER }}/comments \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/json" \
-f --request POST \
-d "{\"body\":\"${{ env.DEPLOY_VERSION }} has been published!\"}"
================================================
FILE: .github/workflows/ci.yaml
================================================
name: CI
on:
push:
branches:
- '**'
tags-ignore:
- '**'
env:
# Node.js
NODE_VERSION: 'lts/*'
PNPM_VERSION: '9'
NPM_REGISTRY_URL: 'https://registry.npmjs.org'
NODE_AUTH_TOKEN: ${{ secrets.READ_ONLY_NPM_TOKEN }}
HUSKY: 0
# Nx Cloud
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
jobs:
check-dependencies:
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
cache: 'pnpm'
- run: pnpm install
- name: If working tree dirty, shutdown job
id: check-working-tree-clean
run: |
if [[ $(git diff --stat) != '' ]]; then
git diff --stat
exit 1
fi
lint:
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
cache: 'pnpm'
- run: pnpm install
- name: Lint
id: lint
run: pnpm run lint
build:
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
cache: 'pnpm'
- run: pnpm install
- name: Build
id: build
run: pnpm run build
test:
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
cache: 'pnpm'
- run: pnpm install
- name: Generate coverage report
id: test
run: pnpm run test:coverage -- --ci --reporters github-actions --reporters summary --maxWorkers 2
- name: Upload coverage to Codecov
id: upload-coverage-to-codecov
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
directory: ./coverage
chromatic-deployment:
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
cache: 'pnpm'
- run: pnpm install
- name: Publish to Chromatic
if: github.ref != 'refs/heads/main'
id: publish-to-chromatic
uses: chromaui/action@latest
with:
token: ${{ secrets.GITHUB_TOKEN }}
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
zip: true
- name: Publish to Chromatic and auto accept changes
if: github.ref == 'refs/heads/main'
uses: chromaui/action@latest
with:
token: ${{ secrets.GITHUB_TOKEN }}
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
autoAcceptChanges: true
================================================
FILE: .github/workflows/pr-closed.yaml
================================================
name: PR Closed
on:
pull_request:
types:
- closed
env:
GITHUB_API_URL_BASE: https://api.github.com/repos/${{ github.repository }}
TAG_NAME: release-pr-${{ github.event.pull_request.number }}
jobs:
delete-release-tag:
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- name: Check tag ref exist
id: check-tag-ref
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#get-a-reference
run: |
curl --url $GITHUB_API_URL_BASE/git/refs/tags/$TAG_NAME \
-sI \
-o /dev/null \
-w "%{http_code}" \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
> status
echo "::set-output name=status::$(cat status)"
- name: Delete release tag of this pull request
uses: dev-drprasad/delete-tag-and-release@v0.2.1
with:
delete_release: true
tag_name: ${{ env.TAG_NAME }}
repo: ${{ github.repository }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/tag-with-comment.yaml
================================================
name: tag-with-comment
on:
issue_comment:
types:
- 'created'
env:
GITHUB_API_URL_BASE: https://api.github.com/repos/${{ github.repository }}
# Node.js
NODE_VERSION: 'lts/*'
PNPM_VERSION: '9'
NPM_REGISTRY_URL: 'https://registry.npmjs.org'
SLACK_GITHUB_REPOSITORY: ${{ github.repository }}
jobs:
tag-with-comment:
if: github.event.issue.state == 'open' && github.event.issue.pull_request && endsWith(github.event.comment.body, 'release-canary')
runs-on: ${{ vars.NOL_RUNNER }}
steps:
- uses: pnpm/action-setup@v3
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
- name: Recognize head SHA of pull request
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.READ_ONLY_NPM_TOKEN }}
run: |
pnpm dlx @titicaca/gha-tools fetch-github-pr ${{ github.event.issue.number }}
PR_SHA=$(cat ./pr.json | jq -r '.head.sha')
PR_REF=$(cat ./pr.json | jq -r '.head.ref')
echo "PR_NUMBER=${{ github.event.issue.number }}" >> $GITHUB_ENV
echo "PR_SHA=$PR_SHA" >> $GITHUB_ENV
echo "PR_REF=$PR_REF" >> $GITHUB_ENV
echo "SLACK_GITHUB_REF=$PR_REF" >> $GITHUB_ENV
echo "PR_SHORT_SHA=${PR_SHA:0:7}" >> $GITHUB_ENV
echo "PR_TITLE=$(cat ./pr.json | jq -r '.title')" >> $GITHUB_ENV
echo "TAG_NAME=release-pr-${{ github.event.issue.number }}" >> $GITHUB_ENV
- name: Leave reaction to comment
run: |
curl \
--url https://api.github.com/repos/${{ github.repository }}/issues/comments/${{ github.event.comment.id }}/reactions \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.squirrel-girl-preview+json" \
-H "Content-Type: application/json" \
-f --request POST \
-d "{\"content\":\"+1\"}"
- name: Create tag object
id: create-tag-object
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-tag-object
run: |
curl --url $GITHUB_API_URL_BASE/git/tags \
-f \
--request POST \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
-H 'Content-Type: application/json' \
-d "{\"tag\":\"$TAG_NAME\",\"message\":\"released at \`${{ github.event.updated_at }}\`\",\"object\":\"${PR_SHA}\",\"type\":\"commit\"}" \
> tag.json
echo "::set-output name=tag-sha::$(node -p -e 'require(`./tag.json`).sha')"
- name: Check tag ref exist
id: check-tag-ref
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#get-a-reference
run: |
curl --url $GITHUB_API_URL_BASE/git/refs/tags/$TAG_NAME \
-sI \
-o /dev/null \
-w "%{http_code}" \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
> status
echo "::set-output name=status::$(cat status)"
- name: Create new tag ref
if: ${{ steps.check-tag-ref.outputs.status != '200' }}
env:
TAG_SHA: ${{ steps.create-tag-object.outputs.tag-sha }}
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#create-a-reference
run: |
curl --url $GITHUB_API_URL_BASE/git/refs \
-f \
--request POST \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
-H 'Content-Type: application/json' \
-d "{\"ref\":\"refs/tags/$TAG_NAME\",\"sha\":\"$TAG_SHA\"}"
- name: Update tag ref
if: ${{ steps.check-tag-ref.outputs.status == '200' }}
env:
TAG_SHA: ${{ steps.create-tag-object.outputs.tag-sha }}
# https://docs.github.com/en/free-pro-team@latest/rest/reference/git#update-a-reference
run: |
curl --url $GITHUB_API_URL_BASE/git/refs/tags/$TAG_NAME \
-f \
--request PATCH \
-H 'Authorization: token ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}' \
-H 'Content-Type: application/json' \
-d "{\"force\":true,\"sha\":\"${TAG_SHA}\"}"
================================================
FILE: .github/workflows/update-changelog.yaml
================================================
name: Update CHANGELOG
on:
pull_request:
types:
- labeled
env:
COMMIT_USER_EMAIL: triple-bot@interpark.com
COMMIT_USER_NAME: TRIPLE Bot
CURRENT_VERSION: ${{ github.event.pull_request.milestone.title }}
NODE_VERSION: 'lts/*'
NPM_REGISTRY_URL: 'https://registry.npmjs.org'
NODE_AUTH_TOKEN: ${{ secrets.READ_ONLY_NPM_TOKEN }}
jobs:
update-changelog:
runs-on: ${{ vars.NOL_RUNNER }}
if: ${{ github.event.label.name == 'release' }}
steps:
- name: Check if a milestone exists on PR
run: |
if [[ $(echo ${{ github.event.pull_request.milestone }}) == "" ]]; then
echo "마일스톤을 등록해 주세요."
exit 1
fi
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.TRIPLE_BOT_GITHUB_TOKEN }}
ref: ${{ github.event.pull_request.head.ref }}
- name: Setup Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
registry-url: ${{ env.NPM_REGISTRY_URL }}
- name: Execute Changelog JavaScript
run: node scripts/changelog.js
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Run prettier on CHANGELOG.md
run: npx prettier --no-config --write CHANGELOG.md
- name: Commit and push updated CHANGELOG
run: |
git config --local user.email "${{ env.COMMIT_USER_EMAIL }}"
git config --local user.name "${{ env.COMMIT_USER_NAME }}"
git add CHANGELOG.md
git commit -m "Update ${{ env.CURRENT_VERSION }} CHANGELOG"
git push
================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# storybook cache
storybook-static
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# Build output
packages/*/lib
# Triple environment
packages/*/package-lock.json
.DS_Store
# IntelliJ
.idea
# docs
docs/storybook-static/
# swc
.swc
# vscode
.vscode/*
!.vscode/settings.json
================================================
FILE: .husky/pre-commit
================================================
pnpm exec lint-staged
================================================
FILE: .npmrc
================================================
engine-strict=true
================================================
FILE: .prettierignore
================================================
pnpm-lock.yaml
================================================
FILE: .prettierrc
================================================
"@titicaca/prettier-config-triple"
================================================
FILE: .storybook/decorators.tsx
================================================
import React from 'react'
import { GlobalStyle, defaultTheme } from '../packages/tds-theme/src'
import { TripleWeb } from '../packages/triple-web/src'
import { isMobile } from '../packages/triple-web-utils/src'
import { ThemeProvider } from 'styled-components'
import { UAParser } from 'ua-parser-js'
export function themeDecorator(Story) {
return (
<ThemeProvider theme={defaultTheme}>
<GlobalStyle />
<Story />
</ThemeProvider>
)
}
export function tripleWebProviderDecorator(Story, context) {
const ua = new UAParser(navigator.userAgent).getResult()
return (
<TripleWeb
clientAppProvider={null}
envProvider={{
appUrlScheme: 'dev-soto',
basePath: '/',
webUrlBase: 'https://triple-dev.titicaca-corp.com',
facebookAppId: '',
defaultPageTitle: '',
defaultPageDescription: '',
googleMapsApiKey: 'AIzaSyDuSWU_yBwuQzeyRFcTqhyifqNX_8oaXI4',
afOnelinkId: '',
afOnelinkPid: '',
afOnelinkSubdomain: '',
webAssetsUrl: 'https://assets.triple-dev.titicaca-corp.com',
}}
i18nProvider={{
defaultLocale: 'ko',
locale: context.globals.locale,
}}
sessionProvider={{
user: null,
}}
userAgentProvider={{
...ua,
isMobile: isMobile(ua),
}}
>
<Story />
</TripleWeb>
)
}
================================================
FILE: .storybook/main.ts
================================================
import fs from 'fs'
import type { Options } from '@swc/core'
import type { StorybookConfig } from '@storybook/nextjs'
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin')
const EXCEPT_PACKAGES = ['middlewares']
const stories = fs
.readdirSync('packages')
.filter((pkg) => !EXCEPT_PACKAGES.includes(pkg))
.map((pkg) => `../packages/${pkg}/src/**/*.@(mdx|stories.@(js|jsx|ts|tsx))`)
const config: StorybookConfig = {
stories: ['../stories/**/*.mdx', ...stories],
addons: [
'@storybook/addon-webpack5-compiler-swc',
'@storybook/addon-links',
'@storybook/addon-essentials',
'@storybook/addon-onboarding',
'@chromatic-com/storybook',
],
typescript: {
reactDocgenTypescriptOptions: {
tsconfigPath: 'tsconfig.test.json',
propFilter: (prop) => {
if (prop.name === 'css') {
return false
}
if (prop.declarations !== undefined && prop.declarations.length > 0) {
const hasPropAdditionalDescription = prop.declarations.find(
(declaration) => {
return !declaration.fileName.includes('node_modules')
},
)
return Boolean(hasPropAdditionalDescription)
}
return true
},
},
reactDocgen: 'react-docgen-typescript',
},
framework: {
name: '@storybook/nextjs',
options: {
strictMode: true,
},
},
swc: (config: Options): Options => {
return {
...config,
jsc: {
...config.jsc,
experimental: {
plugins: [['@swc/plugin-styled-components', {}]],
},
},
}
},
webpackFinal: async (config) => {
if (config.resolve) {
config.resolve.plugins = [
new TsconfigPathsPlugin({
configFile: 'tsconfig.test.json',
}),
]
config.resolve.fallback = { fs: false }
}
return config
},
docs: {},
staticDirs: ['./public'],
}
export default config
================================================
FILE: .storybook/preview.ts
================================================
import type { Preview } from '@storybook/react'
import { initialize, mswLoader } from 'msw-storybook-addon'
import { mockDateDecorator } from 'storybook-mock-date-decorator'
import { themeDecorator, tripleWebProviderDecorator } from './decorators'
// Initialize MSW
initialize({
onUnhandledRequest: 'bypass',
serviceWorker: { url: '/mockServiceWorker.js' },
})
const preview: Preview = {
loaders: [mswLoader],
decorators: [mockDateDecorator, themeDecorator, tripleWebProviderDecorator],
tags: ['autodocs'],
globalTypes: {
locale: {
name: 'Locale',
toolbar: {
icon: 'globe',
items: [
{ value: 'ko', right: '🇰🇷', title: '한국어' },
{ value: 'ja', right: '🇯🇵', title: '일본어' },
{ value: 'zh-TW', right: '🇨🇳', title: '중국어(번체)' },
],
dynamicTitle: true,
},
},
},
initialGlobals: {
locale: 'ko',
},
}
export default preview
================================================
FILE: .storybook/public/mockServiceWorker.js
================================================
/* eslint-disable */
/* tslint:disable */
/**
* Mock Service Worker (1.2.1).
* @see https://github.com/mswjs/msw
* - Please do NOT modify this file.
* - Please do NOT serve this file on production.
*/
const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70'
const activeClientIds = new Set()
self.addEventListener('install', function () {
self.skipWaiting()
})
self.addEventListener('activate', function (event) {
event.waitUntil(self.clients.claim())
})
self.addEventListener('message', async function (event) {
const clientId = event.source.id
if (!clientId || !self.clients) {
return
}
const client = await self.clients.get(clientId)
if (!client) {
return
}
const allClients = await self.clients.matchAll({
type: 'window',
})
switch (event.data) {
case 'KEEPALIVE_REQUEST': {
sendToClient(client, {
type: 'KEEPALIVE_RESPONSE',
})
break
}
case 'INTEGRITY_CHECK_REQUEST': {
sendToClient(client, {
type: 'INTEGRITY_CHECK_RESPONSE',
payload: INTEGRITY_CHECKSUM,
})
break
}
case 'MOCK_ACTIVATE': {
activeClientIds.add(clientId)
sendToClient(client, {
type: 'MOCKING_ENABLED',
payload: true,
})
break
}
case 'MOCK_DEACTIVATE': {
activeClientIds.delete(clientId)
break
}
case 'CLIENT_CLOSED': {
activeClientIds.delete(clientId)
const remainingClients = allClients.filter((client) => {
return client.id !== clientId
})
// Unregister itself when there are no more clients
if (remainingClients.length === 0) {
self.registration.unregister()
}
break
}
}
})
self.addEventListener('fetch', function (event) {
const { request } = event
const accept = request.headers.get('accept') || ''
// Bypass server-sent events.
if (accept.includes('text/event-stream')) {
return
}
// Bypass navigation requests.
if (request.mode === 'navigate') {
return
}
// Opening the DevTools triggers the "only-if-cached" request
// that cannot be handled by the worker. Bypass such requests.
if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {
return
}
// Bypass all requests when there are no active clients.
// Prevents the self-unregistered worked from handling requests
// after it's been deleted (still remains active until the next reload).
if (activeClientIds.size === 0) {
return
}
// https://github.com/mswjs/msw-storybook-addon/issues/36#issuecomment-1496150729
const url = new URL(event.request.url)
if (!url.pathname.startsWith('/api/')) {
// Do not propagate this event to other listeners (from MSW)
event.stopImmediatePropagation()
}
// Generate unique request ID.
const requestId = Math.random().toString(16).slice(2)
event.respondWith(
handleRequest(event, requestId).catch((error) => {
if (error.name === 'NetworkError') {
console.warn(
'[MSW] Successfully emulated a network error for the "%s %s" request.',
request.method,
request.url,
)
return
}
// At this point, any exception indicates an issue with the original request/response.
console.error(
`\
[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`,
request.method,
request.url,
`${error.name}: ${error.message}`,
)
}),
)
})
async function handleRequest(event, requestId) {
const client = await resolveMainClient(event)
const response = await getResponse(event, client, requestId)
// Send back the response clone for the "response:*" life-cycle events.
// Ensure MSW is active and ready to handle the message, otherwise
// this message will pend indefinitely.
if (client && activeClientIds.has(client.id)) {
;(async function () {
const clonedResponse = response.clone()
sendToClient(client, {
type: 'RESPONSE',
payload: {
requestId,
type: clonedResponse.type,
ok: clonedResponse.ok,
status: clonedResponse.status,
statusText: clonedResponse.statusText,
body:
clonedResponse.body === null ? null : await clonedResponse.text(),
headers: Object.fromEntries(clonedResponse.headers.entries()),
redirected: clonedResponse.redirected,
},
})
})()
}
return response
}
// Resolve the main client for the given event.
// Client that issues a request doesn't necessarily equal the client
// that registered the worker. It's with the latter the worker should
// communicate with during the response resolving phase.
async function resolveMainClient(event) {
const client = await self.clients.get(event.clientId)
if (client?.frameType === 'top-level') {
return client
}
const allClients = await self.clients.matchAll({
type: 'window',
})
return allClients
.filter((client) => {
// Get only those clients that are currently visible.
return client.visibilityState === 'visible'
})
.find((client) => {
// Find the client ID that's recorded in the
// set of clients that have registered the worker.
return activeClientIds.has(client.id)
})
}
async function getResponse(event, client, requestId) {
const { request } = event
const clonedRequest = request.clone()
function passthrough() {
// Clone the request because it might've been already used
// (i.e. its body has been read and sent to the client).
const headers = Object.fromEntries(clonedRequest.headers.entries())
// Remove MSW-specific request headers so the bypassed requests
// comply with the server's CORS preflight check.
// Operate with the headers as an object because request "Headers"
// are immutable.
delete headers['x-msw-bypass']
return fetch(clonedRequest, { headers })
}
// Bypass mocking when the client is not active.
if (!client) {
return passthrough()
}
// Bypass initial page load requests (i.e. static assets).
// The absence of the immediate/parent client in the map of the active clients
// means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet
// and is not ready to handle requests.
if (!activeClientIds.has(client.id)) {
return passthrough()
}
// Bypass requests with the explicit bypass header.
// Such requests can be issued by "ctx.fetch()".
if (request.headers.get('x-msw-bypass') === 'true') {
return passthrough()
}
// Notify the client that a request has been intercepted.
const clientMessage = await sendToClient(client, {
type: 'REQUEST',
payload: {
id: requestId,
url: request.url,
method: request.method,
headers: Object.fromEntries(request.headers.entries()),
cache: request.cache,
mode: request.mode,
credentials: request.credentials,
destination: request.destination,
integrity: request.integrity,
redirect: request.redirect,
referrer: request.referrer,
referrerPolicy: request.referrerPolicy,
body: await request.text(),
bodyUsed: request.bodyUsed,
keepalive: request.keepalive,
},
})
switch (clientMessage.type) {
case 'MOCK_RESPONSE': {
return respondWithMock(clientMessage.data)
}
case 'MOCK_NOT_FOUND': {
return passthrough()
}
case 'NETWORK_ERROR': {
const { name, message } = clientMessage.data
const networkError = new Error(message)
networkError.name = name
// Rejecting a "respondWith" promise emulates a network error.
throw networkError
}
}
return passthrough()
}
function sendToClient(client, message) {
return new Promise((resolve, reject) => {
const channel = new MessageChannel()
channel.port1.onmessage = (event) => {
if (event.data && event.data.error) {
return reject(event.data.error)
}
resolve(event.data)
}
client.postMessage(message, [channel.port2])
})
}
function sleep(timeMs) {
return new Promise((resolve) => {
setTimeout(resolve, timeMs)
})
}
async function respondWithMock(response) {
await sleep(response.delay)
return new Response(response.body, response)
}
================================================
FILE: .stylelintrc.json
================================================
{
"extends": ["@titicaca/stylelint-config-triple"]
}
================================================
FILE: .swcrc
================================================
{
"$schema": "https://json.schemastore.org/swcrc",
"module": {
"type": "commonjs"
},
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"react": {
"runtime": "automatic"
}
},
"experimental": {
"plugins": [["@swc/plugin-styled-components", {}]]
}
}
}
================================================
FILE: .vscode/settings.json
================================================
{
"eslint.workingDirectories": [{ "mode": "auto" }]
}
================================================
FILE: CHANGELOG-archive-201911.md
================================================
## 0.12.0 (2019-08-30)
- `Checkbox` 에서도 error style 을 이용 할 수 있도록 변경
_Olaf_
## 0.11.3 (2019-08-29)
- `withField` 모든 폼에서 error, help 를 이용 할 수 있도록 변경
_Olaf_
## 0.11.2 (2019-08-28)
- `RecommendedContents` 두번째 컨텐츠의 우측 마진 제거
_Torres_
## 0.11.1 (2019-08-20)
- `RecommendedContents` title에 개행이 들어가있으면 띄워쓰기로 대체
_Torres_
## 0.11.0 (2019-08-19)
- `Pricing` suffix 제거, price text size 21px 로 변경
_Olaf_
## 0.10.0 (2019-08-16)
- `Pricing`에 custom label, description 추가
_Olaf_
- `TripleDocument`에 `Table`요소 추가
_Torres_
## 0.9.0 (2019-08-14)
- `ActionSheet` React.ReactNode type 의 title 도 받을 수 있도록 변경
_Olaf_
## 0.8.2 (2019-08-13)
- `Image` 의 `SourceUrl` line-height를 1.2로 변경
_Torres_
## 0.8.1 (2019-08-07)
- `Radio` onChange 인자 값 수정
_Olaf_
## 0.8.0 (2019-08-07)
- `Radio` option 구조 변경
_Olaf_
## 0.7.2 (2019-08-06)
- `Radio` padding 값 수정
_Olaf_
## 0.7.1 (2019-08-05)
- `Radio Text` line Height 수정
_Olaf_
## 0.7.0 (2019-08-05)
- `Select, Radio` padding 값 수정
_Olaf_
## 0.6.31 (2019-08-05)
- `Numeric` padding 값 수정
_Olaf_
## 0.6.30 (2019-08-02)
- `Recommended Contents` 모바일 뷰에서 `Recommended Content`를 1 층에 2 개씩 표시
_Torres_
## 0.6.29 (2019-08-01)
- `Confirm Selector`의 스타일 적용 범위를 수정
_Olaf_
## 0.6.28 (2019-07-30)
- `Recommended Content`의 제목, `Text`의 `maxLines`를 써서 두 줄 표시 후 말 줄임
_Torres_
## 0.6.27 (2019-07-30)
- `Nummeric Spinner` 요소들이 고정 width 를 가지도록 변경
_Olaf_
## 0.6.26 (2019-07-26)
- `Nummeric Spinner` padding 값 수정
- `Radio` border radius 수정
_Olaf_
## 0.6.25 (2019-07-26)
- `ListingFilter` 버튼 타입의 height 통일
_Luffy_
## 0.6.24 (2019-07-25)
- `ListingFilter` 버튼의 height 변경
- `Label` 의 red color 를 Global Color 를 쓰지 않는 것으로 변경
- `ExtendedResourceListElement` 를 외부에 export 하면서 컴포넌트 디렉토리 위치 변경
_Luffy_
## 0.6.23 (2019-07-24)
- `Radio` 의 line Height 를 수정한다.
_Olaf_
## 0.6.22 (2019-07-24)
- `RecommendedContent` 에 `background-position: center` 스타일 적용
_Torres_
## 0.6.21 (2019-07-24)
- `Global Style` body 에 style 추가
_Olaf_
## 0.6.20 (2019-07-24)
- `ReviewsList` 이미지에 `cursor: pointer` 추가
_Torres_
## 0.6.19 (2019-07-23)
- `Form` 요소들에게 border radius 2px 추가
_Olaf_
## 0.6.18 (2019-07-23)
- `Radio, Select` padding 값 수정, `Listing Filter` 버튼 사이즈 조절
_Olaf_
## 0.6.17 (2019-07-19)
- `Pricing` 컴포넌트의 버튼 font-weight:bold 처리
_Torres_
## 0.6.16 (2019-07-19)
- `RecommendedContents` 컴포넌트 추가
_Torres_
## 0.6.15 (2019-07-19)
- `Confirm Selector` 구조 변경
_Olaf_
## 0.6.14 (2019-07-17)
- `Clickable Components`의 style 에 `cursor: pointer` 추가
_Torres_
## 0.6.13 (2019-07-17)
- `TripleDocument`의 `list`타입에 기본 margin 추가 ({top: 10, left: 30, right: 30})
_Luffy_
## 0.6.12 (2019-07-11)
- `Select`에 placeholder condition 을 추가한다.
_Olaf_
- `ExtendedResourceListElement` 에 `hideScrapButton` props 추가
_luffy_
## 0.6.11 (2019-07-10)
- `TripleDocument`에 `list`타입에 `rawHTML` 형태의 Text 인입 시 버그 수정.
_luffy_
## 0.6.10 (2019-07-09)
- `TripleDocument`에 `list`타입을 추가합니다.
_luffy_
## 0.6.9 (2019-07-05)
- `Accordion`에서 `{...props}`를 넘기지 않는 버그 수정
_jayg_
## 0.6.8 (2019-07-04)
- `ConfirmSelector` 에 Align option 을 추가합니다.
_Olaf_
## 0.6.7 (2019-07-03)
- `WrappedComponent`에서 발생하는 DOM attribute warning 제거
_jayg_
- `ExtendedPoiListElement`에서 `small_square` 사이즈 이미지 사용하도록 변경
_Eeyore_
## 0.6.6 (2019-07-02)
- `poi` 에 base price 가 없을 경우 그어진 가격을 미노출하도록 변경
_Olaf_
## 0.6.5 (2019-07-02)
- `scrap-button`이 올바르게 `top`, `right` 속성 적용할 수 있도록 수정
_jayg_
## 0.6.4 (2019-06-27)
- `commons` index.js 에서 export 하도록 변경
_Olaf_
## 0.6.3 (2019-06-27)
- `text` declare 에러를 없애기 위해 title component 의 이름을 변경합니다.
_Olaf_
## 0.6.2 (2019-06-27)
- `commons` 를 export 하도록 변경
_Olaf_
## 0.6.1 (2019-06-27)
- `Footer` 회사 소개(triple-corp.com 링크) 추가
_Torres_
- `utilities`, `resource-list-element`, `image`, `poi`, `product`, `region`, `review`, `section`, `tna`, `trieple-document` ts 로 변환
_jayg_
## 0.6.0 (2019-06-26)
- `tsconfig.json` 추가
_Olaf_
## 0.5.0 (2019-06-24)
- `Author`에 `bioOverride` 추가 및 새로운 모델 스펙에 맞춰서 props 변경
- `Author` ts 로 변환
_Royd_
- `action-sheet`, `image`, `input`, `label`, `pager`, `pricing`, `public-header`, `responsive`, `scrap-button`, `select`, `spinner`, `tabs` ts 로 변환
_jayg_
## 0.4.13 (2019-06-24)
- `accordion`, `app-banner`, `carousel`, `checkbox`, `content-elements`, `list`, `form-filed` ts 로 변환
- javascript dot notation 을 typescript 에 맞춰 `React.PureComponent`의 static 멤버로 변경
_jayg_
## 0.4.12 (2019-06-21)
- `table`, `textarea`, `icon`, `tag`, `rating`, `drawer`, `footer`, `segment` ts 로 변환
_jayg_
## 0.4.11 (2019-06-20)
- `Radio` style 변경
- `Numeric Spinner` 를 ts 로 변환
_Olaf_
## 0.4.10 (2019-06-14)
- `ReviewsList` onUnfoldButtonClick 을 받음
- `AppBanner` onCTAClick props 추가
_Torres_
- `radio`, `modal`을 ts 로 변환
_jayg_
## 0.4.9 (2019-06-14)
- `container` 오타 수정
- `button`을 ts 로 변환
_jayg_
## 0.4.8 (2019-06-14)
- global color, size 를 별도로 관리
- csstype 패키지 추가
- `Container`를 ts 로 변환
_jayg_
## 0.4.7 (2019-06-12)
- `AppBanner` 에 `maxWidth` props 추가
_Torres_
- `PublicHeader`에 `minWidth` props 추가
_Torres_
- `navbar`, `text` 를 ts 로 변환
_jayg_
## 0.4.6 (2019-06-12)
- typescript declaration 생성 및 빌드 과정에 포함
- `hr`를 ts 로 변환
_jayg_
## 0.4.5 (2019-06-11)
- typescript 지원을 위하여 webpack, babel 설정 변경
_jayg_
## 0.4.4 (2019-06-04)
- `form-field` export 방식 변경
_Olaf_
## 0.4.3 (2019-06-04)
- `form-field` hoc 를 외부로 내보내도록 변경
_Olaf_
## 0.4.2 (2019-06-03)
- `ExtendedResourceListElement` text name 한 줄 말줄임에서 두 줄 말줄임으로 변경
_Olaf_
## 0.4.1 (2019-05-27)
- `poi` Promotion tag condition 조건 변경
_Olaf_
## 0.4.0 (2019-05-27)
- `Pricing` floated container 를 % 로 나두도록 조절
_Olaf_
- `Button` padding large size 추가
_Olaf_
- `Textarea` reset style 추가
_Olaf_
- `Pricing` IphoneX 대응 css 추가
_Olaf_
- `Icon` 에 margin, padding option 을 추가합니다.
_Olaf_
- `input` 의 reset css 를 추가합니다.
_Olaf_
- `poi element` 의 tag 를 노출 할 수 있도록 변경
_Olaf_
- `block` 타입의 `links`의 margin-top 을 45px 에서 30px 로 변경
_Royd_
- `Date Picker` border-collapse 추가
_Olaf_
- `Poi List` tags props 와 default tags 추가
_Olaf_
- `TripleDocument`내의 links 요소의 스타일에서 `padding` 대신에 `margin` 사용
_Royd_
- `Global-style` 의 b, strong 에 bold 추가
_Royd_
- `Form` message 부분 2 줄시 style 깨지는 문제 해결
_Olaf_
- `Confirm Box` 의 centered option 시 padding 제거
_Olaf_
- `RangeDatePicker` isBlocked function 에 memoize 적용
_Olaf_
- `RangeDatePicker` onChange Event 이름 변경 및 두 날짜 모두 선택된 후 날짜 선택시 date 가 reset 되도록 변경
_Olaf_
- global-style 에 font-family 적용 및 각 element 에서 font-family 스타일 제거
_Royd_
- `Text.Title` line-height 값을 1.2 로 설정
_Royd_
- `ExtendedResourceListElement`의 `pricingNote` 값을 '세금 포함'으로 변경
_Eeyore_
- `TripleDocument` 의 `Images` 에서 `onLinkClick` 지원
_Torres_
- `Note` 의 `margin` 값 조정
_Torres_
- `Label`에 `margin` prop 추가
_Royd_
- `ListingFilter` line-height 디폴트 값을 1.2 로 설정
_Royd_
- `Container` min Height , max Height option 추가
_Olaf_
- `ListingFilter` iOS 모바일에서 터치 스크롤 이슈 해결 [#465](https://github.com/titicacadev/triple-design-system/pull/465)
_Royd_
## 0.3.1 (2019-04-24)
- `Modal` Alert Modal 추가
_Olaf_
- `Text` line-height 디폴트 값을 1.2 로 설정
_Royd_
- `Rating` 에 `onClick` 추가
_Torres_
- `text` red color 추가
_Olaf_
- global-style 에 `select` 태그를 위한 reset 스타일 추가
_Royd_
- `ActionSheet` 최대 높이 수정
_Eeyore_
- `Drawer` 요소 추가
_Eeyore_
## 0.3.0 (2019-04-11)
- `ExtendedResourceListElement`에 `pricingNote` 추가
_Eeyore_
- `Form` option 추가 및 style 변경
```
1. onChange event 중첩 해결
2. form field padding, margin option 제거
3. confirmbox filltype option 추가
```
_Olaf_
- `Pricing` 잘못된 base <--> sale 순서 바로잡음
_Eeyore_
- `Form Field` margin, padding option 추가 및 error message absolute style 추가
_Olaf_
- `Numeric Spinner` 추가
_Olaf_
- `Form` 요소들 Change EvnetHandler 동작 방식 통일
```js
onChange={(e) => onChange(e, e.target.value)}
```
_Olaf_
- `Button`에서 `ButtonIcon`에 `size` props 추가
_Torres_
- `PoiListElement`에서 `prices`와 `starRating` 처리 (호텔 관련 필드)
_Royd_
- `Forms` 컴포넌트 추가
```
1. Input
2. Checkbox (ConfirmSelector)
3. Selectbox (GenderSelector)
4. Textarea
```
_Olaf_
- `DatePicker` Style 변경
```
1. selcted class size 변경 40px -> 32px
2. 평일 주말 color 구분
3. week header 를 top 고정이 아닌 달마다 보이도록 변경
4. range picker 의 경우 nights (end - start) value 를 넘겨주도록 추가
5. table border spacing 추가
```
_Olaf_
- `Table` 컴포넌트 추가
```
<Table type="horizontal"}
<Table type="vertical"}
```
_Olaf_
- `ActionSheet.Item` 에 `checked` 상태 추가
_Eeyore_
## 0.2.8 (2019-04-03)
- `ListingFilter` 컴포넌트 개편
```
<ListingFilter.PrimaryFilterEntry>
5.17-5.20, 3명
</ListingFilter.PrimaryFilterEntry>
<ListingFilter.ExpandingFilterEntry>
침대타입
</ListingFilter.ExpandingFilterEntry>
<ListingFilter.FilterEntry>
무료취소
</ListingFilter.FilterEntry>
<ListingFilter.FilterEntry withIcon active>
음식점
</ListingFilter.FilterEntry>
```
_Eeyore_
- `Tabs` 컴포넌트 추가
_Eeyore_
- `Section` 컴포넌트에 default prop 추가
```
minWidth = 320,
maxWidth = 760,
padding = { left: 30, right: 30 },
```
_Royd_
- basic 타입의 `Button` 간소화
`borderRadius`, `fontSize` prop 삭제
`inverted`, `compact` prop 지원
```
<button basic compact inverted color="blue">버튼</Button>
```
_Royd_
- `TripleDocument` Image 목록 컴포넌트에서 캡션 유무에 따른 마진 분기
_Eeyore_
- `Text` 컴포넌트에 number 타입의 `size` prop 지원
_Royd_
- `Text` 컴포넌트의 `size` prop 에서 `"larger"` 삭제
_Royd_
- `Spinner` 추가
_Olaf_
- promo 타입의 `Label` 컴포넌트 추가
```
<Label promo emphasized size="medium" color="purple">최대 24%</Label>
<Label promo size="small" color="red">지정일 사용</Label>
```
_Royd_
- 스토리보드에 jsx 애드온 추가
_Olaf_
- `TripleDocument` 본문 컴포넌트의 alpha 값 `0.8`에서 `0.9`로 수정
_Torres_
- `TripleDocument` Image 목록 컴포넌트에 `"block"` display 지원
_Torres_
================================================
FILE: CHANGELOG.md
================================================
# CHANGELOG
## v14.2.3
### router
- feat: Add peer dependency of triple-web-to-native-interfaces [#3783](https://github.com/titicacadev/triple-frontend/pull/3783)
### standard-action-handler
- feat: Add peer dependency of triple-web-to-native-interfaces [#3783](https://github.com/titicacadev/triple-frontend/pull/3783)
### tds-widget
- feat: Add peer dependency of triple-web-to-native-interfaces [#3783](https://github.com/titicacadev/triple-frontend/pull/3783)
- feat: 놀 파트너 쿠폰 신규 추가 [#3788](https://github.com/titicacadev/triple-frontend/pull/3788)
### triple-web
- feat: Add peer dependency of triple-web-to-native-interfaces [#3783](https://github.com/titicacadev/triple-frontend/pull/3783)
## v14.2.2
```
### tds-widget
- [fix] legacy mileage 경로 수정 [#3773](https://github.com/titicacadev/triple-frontend/pull/3773)
- fix: 쿠폰 버튼 컬러 오류 수정 [#3777](https://github.com/titicacadev/triple-frontend/pull/3777)
- [DMTALK-606] room/member 초기화 로직을 재사용 가능한 함수로 추출 [#3778](https://github.com/titicacadev/triple-frontend/pull/3778)
```
## v14.2.1
```
### chat
- feat(chat): ReservationInfo에 actions prop 추가 [#3771](https://github.com/titicacadev/triple-frontend/pull/3771)
### tds-widget
- feat(chat): ReservationInfo에 actions prop 추가 [#3771](https://github.com/titicacadev/triple-frontend/pull/3771)
```
## v14.2.0
```
### fetcher
- feat: package version update [#3766](https://github.com/titicacadev/triple-frontend/pull/3766)
### middlewares
- feat: package version update [#3766](https://github.com/titicacadev/triple-frontend/pull/3766)
### react-hooks
- [NACS-686] NPM OIDC trusted publisher 수정 [#3767](https://github.com/titicacadev/triple-frontend/pull/3767)
### tds-widget
- [tds-widget] map-view가 default zoom level props를 받을 수 있도록 수정 [#3768](https://github.com/titicacadev/triple-frontend/pull/3768)
### triple-web
- feat: package version update [#3766](https://github.com/titicacadev/triple-frontend/pull/3766)
### triple-web-nextjs-pages
- feat: package version update [#3766](https://github.com/titicacadev/triple-frontend/pull/3766)
```
## v14.1.9
### react-hooks
- [chore] triple-web-to-native-interfaces 및 lottie-web 버전 업데이트 [#3761](https://github.com/titicacadev/triple-frontend/pull/3761)
### router
- [chore] triple-web-to-native-interfaces 및 lottie-web 버전 업데이트 [#3761](https://github.com/titicacadev/triple-frontend/pull/3761)
- [fix] rotuer hook에 usecallback 추가 [#3763](https://github.com/titicacadev/triple-frontend/pull/3763)
### standard-action-handler
- [chore] triple-web-to-native-interfaces 및 lottie-web 버전 업데이트 [#3761](https://github.com/titicacadev/triple-frontend/pull/3761)
### tds-theme
- [fix] styled-component v6 Pseudoselectors breaking change 반영 [#3762](https://github.com/titicacadev/triple-frontend/pull/3762)
### tds-ui
- [fix] styled-component v6 Pseudoselectors breaking change 반영 [#3762](https://github.com/titicacadev/triple-frontend/pull/3762)
### tds-widget
- [chore] triple-web-to-native-interfaces 및 lottie-web 버전 업데이트 [#3761](https://github.com/titicacadev/triple-frontend/pull/3761)
- [fix] styled-component v6 Pseudoselectors breaking change 반영 [#3762](https://github.com/titicacadev/triple-frontend/pull/3762)
### triple-header
- [chore] triple-web-to-native-interfaces 및 lottie-web 버전 업데이트 [#3761](https://github.com/titicacadev/triple-frontend/pull/3761)
### triple-web
- [chore] triple-web-to-native-interfaces 및 lottie-web 버전 업데이트 [#3761](https://github.com/titicacadev/triple-frontend/pull/3761)
## v14.1.8
```
### triple-web
- v13.48.1 변경사항을 적용합니다. [#3758](https://github.com/titicacadev/triple-frontend/pull/3758)
```
## v14.1.7
```
### tds-ui
- [DMTALK-557] 탭 focused 오류 수정 [#3748](https://github.com/titicacadev/triple-frontend/pull/3748)
- v13.46.1, v13.47.0, v13.48.1 변경사항을 반영합니다. [#3752](https://github.com/titicacadev/triple-frontend/pull/3752)
### tds-widget
- [DMTALK-526] 채팅방 나가기 [#3746](https://github.com/titicacadev/triple-frontend/pull/3746)
- v13.46.1, v13.47.0, v13.48.1 변경사항을 반영합니다. [#3752](https://github.com/titicacadev/triple-frontend/pull/3752)
```
## v14.1.6
### tds-widget
- [DMTALK-555] dismissKeyboardOnSend 옵션 추가 [#3747](https://github.com/titicacadev/triple-frontend/pull/3747)
## v14.1.5
```
### tds-widget
- [TPB-3385] InvitationInterface 에 validInvitation 필드 추가 [#3741](https://github.com/titicacadev/triple-frontend/pull/3741)
- [DMTALK-533] usePendingIntersections 추가 [#3742](https://github.com/titicacadev/triple-frontend/pull/3742)
- [DMTALK-505] 타입 업데이트 [#3743](https://github.com/titicacadev/triple-frontend/pull/3743)
```
## v14.1.4
```
### tds-widget
- [tds-widget] focus tracker에 disabled props를 추가합니다. [#3739](https://github.com/titicacadev/triple-frontend/pull/3739)
```
## v14.1.3
### tds-ui
- [tds-ui] 체크박스 사이즈 설정 prop을 추가합니다. [#3732](https://github.com/titicacadev/triple-frontend/pull/3732)
- [tds-ui, tds-widget] 컴포넌트에 color props 추가 [#3735](https://github.com/titicacadev/triple-frontend/pull/3735)
### tds-widget
- [DMTALK-472] 채팅 디자인 개선사항 반영 [#3734](https://github.com/titicacadev/triple-frontend/pull/3734)
- [tds-ui, tds-widget] 컴포넌트에 color props 추가 [#3735](https://github.com/titicacadev/triple-frontend/pull/3735)
- [DMTALK-487] Chat/nol-input-area-ui 디자인 수정사항 반영 [#3736](https://github.com/titicacadev/triple-frontend/pull/3736)
- [tds-widget] focus tracker에 autoZoomThreshold props 추가 [#3737](https://github.com/titicacadev/triple-frontend/pull/3737)
## v14.1.2
```
### tds-widget
- [DMTALK-217] welcomeMessage 전송시 UI 오류 수정 [#3688](https://github.com/titicacadev/triple-frontend/pull/3688)
- [DMTALK-249] 재문의 가능여부 타입 정의 [#3727](https://github.com/titicacadev/triple-frontend/pull/3727)
- [DMTALK-403] refactor: pusher data 타입 분리 [#3728](https://github.com/titicacadev/triple-frontend/pull/3728)
- fix: rebase 누락 적용 [#3730](https://github.com/titicacadev/triple-frontend/pull/3730)
```
## 14.1.1
```
### middlewares
- [middleware] next14용 미들웨어에 applySetCookie 적용 [#3717](https://github.com/titicacadev/triple-frontend/pull/3717)
### tds-widget
- [DMTALK-416] 채팅 > 디자인 개선 적용 [#3715](https://github.com/titicacadev/triple-frontend/pull/3715)
- [DMTALK-425] input resize observer 옵션 변경 [#3722](https://github.com/titicacadev/triple-frontend/pull/3722)
- [DMTALK-432] 쿠폰 메시지 디자인 변경 [#3723](https://github.com/titicacadev/triple-frontend/pull/3723)
- [DMTALK-422] 이벤트 로깅을 위한 onClick 핸들러 전달 [#3724](https://github.com/titicacadev/triple-frontend/pull/3724)
```
## 14.1.0
```
### tds-theme
- [tds-theme] vermilion 컬러를 찾지 못하는 오류 수정 [#3691](https://github.com/titicacadev/triple-frontend/pull/3691)
### tds-ui
- [tds-widget] react-day-picker의 props를 받을 수 있도록 추가 [#3689](https://github.com/titicacadev/triple-frontend/pull/3689)
- [tds-ui] 체크박스 체크 위치 수정 [#3692](https://github.com/titicacadev/triple-frontend/pull/3692)
- [tds-ui] popup에 id props를 추가합니다. [#3695](https://github.com/titicacadev/triple-frontend/pull/3695)
- [tds-ui] ActionSheetItem에 plus icon 추가 [#3712](https://github.com/titicacadev/triple-frontend/pull/3712)
- [tds-ui] carousel-item 추가 prop 받을 수 있도록 수정 [#3716](https://github.com/titicacadev/triple-frontend/pull/3716)
### tds-widget
- [tds-widget] react-day-picker의 props를 받을 수 있도록 추가 [#3689](https://github.com/titicacadev/triple-frontend/pull/3689)
- [DMTALK-165] chat 컴포넌트 커스텀 필드 추가, 스타일 및 타입 수정 [#3690](https://github.com/titicacadev/triple-frontend/pull/3690)
- [DMTALK-316] message payload 내 extra 노출 [#3698](https://github.com/titicacadev/triple-frontend/pull/3698)
- [DMTALK-317] interactionStatusSlot 추가 [#3699](https://github.com/titicacadev/triple-frontend/pull/3699)
- [DMTALK-234] scroll-bottom-buttons 리셋 로직 추가 [#3700](https://github.com/titicacadev/triple-frontend/pull/3700)
- [DMTALK-310] ChatChannelEvents 타입 정의 [#3701](https://github.com/titicacadev/triple-frontend/pull/3701)
- [DMTALK-304] 쿠폰 메시지 추가 [#3703](https://github.com/titicacadev/triple-frontend/pull/3703)
- chat > expired 컴포넌트 배경색 변경 [#3704](https://github.com/titicacadev/triple-frontend/pull/3704)
- [DMTALK-374] RICH 버블의 블록을 각각의 버블로 분리하는 옵션을 제공하고 버튼 버블을 추가합니다. [#3707](https://github.com/titicacadev/triple-frontend/pull/3707)
- [tds-widget] RangePicker에서 publicHoliday를 props로 받아올 수 있도록 수정합니다. [#3710](https://github.com/titicacadev/triple-frontend/pull/3710)
- [DMTALK-396] 프로필 이미지 object-fit 변경 [#3711](https://github.com/titicacadev/triple-frontend/pull/3711)
- [DMTALK-374] parent message로 스크롤 되지 않는 오류 수정 [#3718](https://github.com/titicacadev/triple-frontend/pull/3718)
- [tds-widget] map에서 fitBounds 비활성화 props 추가 [#3720](https://github.com/titicacadev/triple-frontend/pull/3720)
### triple-web
- [triple-web] multiple hash 지원 [#3706](https://github.com/titicacadev/triple-frontend/pull/3706)
```
## 14.0.13
```
### middlewares
- (Chat) [DMTALK-60] 챗룸 컴포넌트 추가 [#3608](https://github.com/titicacadev/triple-frontend/pull/3608)
### router
- [DMTALK-183] 링크 두번 열리는 오류 수정 [#3681](https://github.com/titicacadev/triple-frontend/pull/3681)
### tds-widget
- (Chat) 채팅 버블 부가 정보 커스텀 스타일 프롭스 추가 [#3574](https://github.com/titicacadev/triple-frontend/pull/3574)
- (Chat) 누락된 타입 export 및 props 추가 [#3585](https://github.com/titicacadev/triple-frontend/pull/3585)
- tds-widget/chat에서 triple-web 디펜던시를 제거 [#3586](https://github.com/titicacadev/triple-frontend/pull/3586)
- (chat) 커스텀이 가능한 채팅 리스트 공통 컴포넌트를 만든다. [#3588](https://github.com/titicacadev/triple-frontend/pull/3588)
- (Chat) [DMTALK-31] 채팅 공통타입 정리 [#3589](https://github.com/titicacadev/triple-frontend/pull/3589)
- (Chat) [DMTALK-32] 채팅 메시지 플로우 공통화 [#3593](https://github.com/titicacadev/triple-frontend/pull/3593)
- (Chat) [DMTALK-51] 사용자 식별자 제외 API 응답 마이그레이션 [#3601](https://github.com/titicacadev/triple-frontend/pull/3601)
- (Chat) 채팅 리스트 기본 기능 로직을 확장 가능하게 제공한다. [#3602](https://github.com/titicacadev/triple-frontend/pull/3602)
- (Chat) [DMTALK-60] 챗룸 컴포넌트 추가 [#3608](https://github.com/titicacadev/triple-frontend/pull/3608)
- [EPIC] tds-widget/chat을 확장하고 서비스간 중복 로직을 공통화 합니다 (v14) - 2/2 [#3614](https://github.com/titicacadev/triple-frontend/pull/3614)
- [DMTALK-86] Chat 스타일 / 컴포넌트 확장 가능하도록 수정 [#3616](https://github.com/titicacadev/triple-frontend/pull/3616)
- [DMTALK-88] 초대 및 채팅방 만료 정책 타입 추가 [#3620](https://github.com/titicacadev/triple-frontend/pull/3620)
- [DMTALK-90] 새로운 메시지 수신 시 bottom scroll 여부 컨트롤 추가 [#3621](https://github.com/titicacadev/triple-frontend/pull/3621)
- fix: onChatRestart 기본값 제거 [#3623](https://github.com/titicacadev/triple-frontend/pull/3623)
- (Chat) nol-chat getMessages 응답값 migration [#3626](https://github.com/titicacadev/triple-frontend/pull/3626)
- [DMTALK-67] ReservationLabel export 및 일부 Preview element css override 되도록 수정 [#3627](https://github.com/titicacadev/triple-frontend/pull/3627)
- [DMTALK-112] 새로운 메시지 UI 추가 [#3628](https://github.com/titicacadev/triple-frontend/pull/3628)
- [DMTALK] 조건문 내 오타 수정 [#3629](https://github.com/titicacadev/triple-frontend/pull/3629)
- [DMTALK] `ProductMetaData, BookingMetaData` type 스웨거와 싱크 [#3633](https://github.com/titicacadev/triple-frontend/pull/3633)
- [DMTALK] get messages 응답 인터페이스 변경 대응 [#3634](https://github.com/titicacadev/triple-frontend/pull/3634)
- [DMTALK] refactor: export 네이밍 변경 [#3635](https://github.com/titicacadev/triple-frontend/pull/3635)
- [DMTALK] get messages 응답 인터페이스 변경 대응 [#3639](https://github.com/titicacadev/triple-frontend/pull/3639)
- [DMTALK] Preview 날짜 표기 방식 util 추가 [#3644](https://github.com/titicacadev/triple-frontend/pull/3644)
- [DMTALK-126] 첫 메시지 전송 시 룸 생성 전 pending message 처리 [#3647](https://github.com/titicacadev/triple-frontend/pull/3647)
- [DMTALK-135] 예약정보 UI 디자인 수정 반영 [#3650](https://github.com/titicacadev/triple-frontend/pull/3650)
- [DMTALK-133] 상대방 메시지 실시간 받을 경우 스크롤이 올라가도록 수정 [#3653](https://github.com/titicacadev/triple-frontend/pull/3653)
- [DMTALK] 중복 UI 정리 및 NolThemeProvider 생성 [#3657](https://github.com/titicacadev/triple-frontend/pull/3657)
- [DMTALK-148] refactor: nol-theme-provider 사용 [#3661](https://github.com/titicacadev/triple-frontend/pull/3661)
- [DMTALK] 잘못된 간격 수정 [#3662](https://github.com/titicacadev/triple-frontend/pull/3662)
- [DMTALK-130] 안드로이드 스크롤 오류 관련 프롭스 추가 [#3663](https://github.com/titicacadev/triple-frontend/pull/3663)
- [DMTALK] 네트워크 없을 경우 실패 아이콘 미노출되는 이슈 수정 [#3665](https://github.com/titicacadev/triple-frontend/pull/3665)
- [DMTALK-156] 간격 수정 및 문구 변경으로 인한 max-width 수정 [#3666](https://github.com/titicacadev/triple-frontend/pull/3666)
- [DMTALK-158] 누락된 디펜던시 및 message sanitize 추가 [#3667](https://github.com/titicacadev/triple-frontend/pull/3667)
- [DMTALK] 채팅창 상세에서 상품/예약정보 접기펼치기 영역 확대 [#3668](https://github.com/titicacadev/triple-frontend/pull/3668)
- [DMTALK] 취소 후 만료정책 추가 [#3669](https://github.com/titicacadev/triple-frontend/pull/3669)
- [DMTALK] 상품/예약정보 접기펼치기 영역 - 클릭이벤트 조건 수정 [#3670](https://github.com/titicacadev/triple-frontend/pull/3670)
- [DMTALK-176] 디자인 QA [#3675](https://github.com/titicacadev/triple-frontend/pull/3675)
- [DMTALK-177] 전체보기 뷰 지오챗 스타일 오류 수정 [#3678](https://github.com/titicacadev/triple-frontend/pull/3678)
- moment 라이브러리를 date-fns로 변경합니다. [#3679](https://github.com/titicacadev/triple-frontend/pull/3679)
- reservation info min-height 수정 [#3680](https://github.com/titicacadev/triple-frontend/pull/3680)
- [DMTALK-183] 링크 두번 열리는 오류 수정 [#3681](https://github.com/titicacadev/triple-frontend/pull/3681)
- [DMTALK-184] 아이콘 오류 수정 [#3683](https://github.com/titicacadev/triple-frontend/pull/3683)
- [EPIC] tds-widget/chat을 확장하고 서비스간 중복 로직을 공통화 합니다 (v14) - 1 / 2 [#3684](https://github.com/titicacadev/triple-frontend/pull/3684)
### triple-document
- moment 라이브러리를 date-fns로 변경합니다. [#3679](https://github.com/titicacadev/triple-frontend/pull/3679)
### triple-web
- (Chat) [DMTALK-60] 챗룸 컴포넌트 추가 [#3608](https://github.com/titicacadev/triple-frontend/pull/3608)
### view-utilities
- (Chat) [DMTALK-60] 챗룸 컴포넌트 추가 [#3608](https://github.com/titicacadev/triple-frontend/pull/3608)
- moment 라이브러리를 date-fns로 변경합니다. [#3679](https://github.com/titicacadev/triple-frontend/pull/3679)
```
## 14.0.12
```
### ab-experiments
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
- [KLZT-882] 클라이언트 세션 갱신 로직을 추가합니다. [#3631](https://github.com/titicacadev/triple-frontend/pull/3631)
### constants
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
### fetcher
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
- [KLZT-882] 클라이언트 세션 갱신 로직을 추가합니다. [#3631](https://github.com/titicacadev/triple-frontend/pull/3631)
- [middlware] 세션 갱신 로직을 수정합니다. [#3660](https://github.com/titicacadev/triple-frontend/pull/3660)
### middlewares
- v13.43.0 이후의 변경사항을 적용합니다. [#3603](https://github.com/titicacadev/triple-frontend/pull/3603)
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
- [middlware] 세션 갱신 로직을 수정합니다. [#3660](https://github.com/titicacadev/triple-frontend/pull/3660)
### router
- [router] openNativeLink에서 href가 아닌 path를 param으로 넘겨주도록 수정 [#3571](https://github.com/titicacadev/triple-frontend/pull/3571)
### standard-action-handler
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
### tds-ui
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
### tds-widget
- v13.41.0 ~ v13.42.1 변경사항을 반영합니다. [#3562](https://github.com/titicacadev/triple-frontend/pull/3562)
- v13.43.0 이후의 변경사항을 적용합니다. [#3603](https://github.com/titicacadev/triple-frontend/pull/3603)
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
- [KLZT-882] 클라이언트 세션 갱신 로직을 추가합니다. [#3631](https://github.com/titicacadev/triple-frontend/pull/3631)
### triple-document
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
- [KLZT-882] 클라이언트 세션 갱신 로직을 추가합니다. [#3631](https://github.com/titicacadev/triple-frontend/pull/3631)
### triple-header
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
- [KLZT-882] 클라이언트 세션 갱신 로직을 추가합니다. [#3631](https://github.com/titicacadev/triple-frontend/pull/3631)
### triple-web
- v13.43.0 이후의 변경사항을 적용합니다. [#3603](https://github.com/titicacadev/triple-frontend/pull/3603)
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
### triple-web-nextjs
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
### triple-web-nextjs-pages
- [Epic] NOL 회원 통합 (v14) [#3604](https://github.com/titicacadev/triple-frontend/pull/3604)
- [KLZT-882] 클라이언트 세션 갱신 로직을 추가합니다. [#3631](https://github.com/titicacadev/triple-frontend/pull/3631)
### view-utilities
- v13.43.0 이후의 변경사항을 적용합니다. [#3603](https://github.com/titicacadev/triple-frontend/pull/3603)
```
## 14.0.11
### tds-widget
- v13.40.0 변경사항을 적용합니다. [#3545](https://github.com/titicacadev/triple-frontend/pull/3545)
### triple-web
- [triple-web] 앱설치유도 모달 및 로그인 모달의 showOptions를 수정합니다. [#3540](https://github.com/titicacadev/triple-frontend/pull/3540)
### view-utilities
- v13.40.1 변경사항을 적용합니다. [#3547](https://github.com/titicacadev/triple-frontend/pull/3547)
## 14.0.10
### triple-web
- [triple-web] 웹뷰에서는 nativeTrackScreen만 실행하도록 수정합니다. [#3536](https://github.com/titicacadev/triple-frontend/pull/3536)
## 14.0.9
### tds-ui
- App router에서 use client 문제 수정 [#3514](https://github.com/titicacadev/triple-frontend/pull/3514)
- [tds-ui] onChange 함수가 중복 실행되지 않도록 수정합니다. [#3532](https://github.com/titicacadev/triple-frontend/pull/3532)
### tds-widget
- App router에서 use client 문제 수정 [#3514](https://github.com/titicacadev/triple-frontend/pull/3514)
### triple-email-document
- v13.39.0 수정사항을 반영합니다. [#3519](https://github.com/titicacadev/triple-frontend/pull/3519)
### triple-web
- App router에서 use client 문제 수정 [#3514](https://github.com/titicacadev/triple-frontend/pull/3514)
- triple-web-nextjs-pages에 ssr-utils 추가 [#3518](https://github.com/titicacadev/triple-frontend/pull/3518)
### triple-web-nextjs
- App router에서 use client 문제 수정 [#3514](https://github.com/titicacadev/triple-frontend/pull/3514)
- triple-web-nextjs-pages에 ssr-utils 추가 [#3518](https://github.com/titicacadev/triple-frontend/pull/3518)
### triple-web-nextjs-pages
- App router에서 use client 문제 수정 [#3514](https://github.com/titicacadev/triple-frontend/pull/3514)
- triple-web-nextjs-pages에 ssr-utils 추가 [#3518](https://github.com/titicacadev/triple-frontend/pull/3518)
## 14.0.8
### tds-widget
v13.38.1 변경사항을 적용합니다. [#3521](https://github.com/titicacadev/triple-frontend/pull/3521)
## 14.0.7
### meta-tags
- [meta-tags] 앱라우터용 메타태그 및 QaPageScript, DiscussionForumPostingScript를 추가합니다. [#3500](https://github.com/titicacadev/triple-frontend/pull/3500)
### middlewares
- [middleware] 세션 쿠키 리프레시 로직을 수정합니다. [#3498](https://github.com/titicacadev/triple-frontend/pull/3498)
### triple-web
- [triple-web] web track event는 클라이언트 웹뷰가 아닐 때만 로깅하도록 수정합니다. [#3507](https://github.com/titicacadev/triple-frontend/pull/3507)
### tds-widget
- v13.37.0, v13.38.0 변경사항을 적용합니다. [#3512](https://github.com/titicacadev/triple-frontend/pull/3512)
### type-definitions
- v13.37.0, v13.38.0 변경사항을 적용합니다. [#3512](https://github.com/titicacadev/triple-frontend/pull/3512)
## v14.0.6
### tds-widget
- [tds-widget] beforeScrapedChange시 파람에 eventParam을 넘기도록 수정합니다. [#3493](https://github.com/titicacadev/triple-frontend/pull/3493)
### triple-web
- [triple-web] firebaseAnalytics 인스턴스를 가져오지 못하는 이슈를 해결합니다. [#3492](https://github.com/titicacadev/triple-frontend/pull/3492)
- [triple-web] 모달을 띄울 때 trackScreen이 호출되는 문제를 해결합니다. [#3496](https://github.com/titicacadev/triple-frontend/pull/3496)
- [triple-web] 로그인 모달 버튼 함수 수정 [#3497](https://github.com/titicacadev/triple-frontend/pull/3497)
## v14.0.5
### router
- [view-utilities, router] routelist에 라운지홈을 추가합니다. useNavigate에서 deeplink 이동 로직을 추가합니다 [#3486](https://github.com/titicacadev/triple-frontend/pull/3486)
- 앱에서 navigate 동작 수정 [#3487](https://github.com/titicacadev/triple-frontend/pull/3487)
### tds-widget
- 앱 외부에서도 스크랩이 가능하도록 옵션 추가 [#3489](https://github.com/titicacadev/triple-frontend/pull/3489)
### triple-web
- 앱에서 navigate 동작 수정 [#3487](https://github.com/titicacadev/triple-frontend/pull/3487)
- LoginCtaModal 기본 return url에서 hash 제거 [#3488](https://github.com/titicacadev/triple-frontend/pull/3488)
### triple-web-nextjs
- 앱에서 navigate 동작 수정 [#3487](https://github.com/titicacadev/triple-frontend/pull/3487)
### triple-web-nextjs-pages
- 앱에서 navigate 동작 수정 [#3487](https://github.com/titicacadev/triple-frontend/pull/3487)
### triple-web-utils
- 앱에서 navigate 동작 수정 [#3487](https://github.com/titicacadev/triple-frontend/pull/3487)
### view-utilities
- [view-utilities, router] routelist에 라운지홈을 추가합니다. useNavigate에서 deeplink 이동 로직을 추가합니다 [#3486](https://github.com/titicacadev/triple-frontend/pull/3486)
## v14.0.4
### i18n
- triple-web 테스트 추가 [#3472](https://github.com/titicacadev/triple-frontend/pull/3472)
### router
- Link 컴포넌트에서 불필요한 inline style 제거 [#3482](https://github.com/titicacadev/triple-frontend/pull/3482)
### standard-action-handler
- 타입 에러 수정 [#3471](https://github.com/titicacadev/triple-frontend/pull/3471)
### tds-ui
- Card radius prop 이름 변경 [#3463](https://github.com/titicacadev/triple-frontend/pull/3463)
- Carousel containerPadding, margin prop 복구 [#3470](https://github.com/titicacadev/triple-frontend/pull/3470)
- 타입 에러 수정 [#3471](https://github.com/titicacadev/triple-frontend/pull/3471)
### tds-widget
- ScrapsProvider에 onScrapeFailed prop 넘길 수 있도록 추가 [#3469](https://github.com/titicacadev/triple-frontend/pull/3469)
- 타입 에러 수정 [#3471](https://github.com/titicacadev/triple-frontend/pull/3471)
- 13.35.0 - 13.36.0 변경사항을 14에 반영 [#3479](https://github.com/titicacadev/triple-frontend/pull/3479)
### triple-document
- #3437 변경사항을 적용합니다 [#3466](https://github.com/titicacadev/triple-frontend/pull/3466)
- 타입 에러 수정 [#3471](https://github.com/titicacadev/triple-frontend/pull/3471)
### triple-web
- triple-web 테스트 추가 [#3472](https://github.com/titicacadev/triple-frontend/pull/3472)
- 13.35.0 - 13.36.0 변경사항을 14에 반영 [#3479](https://github.com/titicacadev/triple-frontend/pull/3479)
### triple-web-nextjs
- [triple-web-nextjs] promise error 해결 [#3473](https://github.com/titicacadev/triple-frontend/pull/3473)
- 13.35.0 - 13.36.0 변경사항을 14에 반영 [#3479](https://github.com/titicacadev/triple-frontend/pull/3479)
### triple-web-nextjs-pages
- 13.35.0 - 13.36.0 변경사항을 14에 반영 [#3479](https://github.com/titicacadev/triple-frontend/pull/3479)
### triple-web-test-utils
- 타입 에러 수정 [#3471](https://github.com/titicacadev/triple-frontend/pull/3471)
### triple-web-utils
- 13.35.0 - 13.36.0 변경사항을 14에 반영 [#3479](https://github.com/titicacadev/triple-frontend/pull/3479)
## v14.0.3
### standard-action-handler
- 13.31.0 - 13.34.0 변경사항을 14에 반영 [#3460](https://github.com/titicacadev/triple-frontend/pull/3460)
### tds-ui
- 13.31.0 - 13.34.0 변경사항을 14에 반영 [#3460](https://github.com/titicacadev/triple-frontend/pull/3460)
### tds-widget
- user-verification service export 추가 [#3442](https://github.com/titicacadev/triple-frontend/pull/3442)
- 13.31.0 - 13.34.0 변경사항을 14에 반영 [#3460](https://github.com/titicacadev/triple-frontend/pull/3460)
### triple-web
- useClientAppCallback의 fn, appInstallCtaModalOptions 파라미터 순서 변경 [#3440](https://github.com/titicacadev/triple-frontend/pull/3440)
### view-utilities
- 13.31.0 - 13.34.0 변경사항을 14에 반영 [#3460](https://github.com/titicacadev/triple-frontend/pull/3460)
## v14.0.2
### tds-widget
- node querystring 대신 qs 사용 [#3423](https://github.com/titicacadev/triple-frontend/pull/3423)
## v14.0.1
### ab-experiments
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
### fetcher
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
### i18n
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### intersection-observer
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
### meta-tags
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### middlewares
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
### router
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### standard-action-handler
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### tds-theme
- styled components에 transient prop 사용 [#3326](https://github.com/titicacadev/triple-frontend/pull/3326)
### tds-ui
- v13 변경사항 리베이스 [#3315](https://github.com/titicacadev/triple-frontend/pull/3315)
- styled components 6 prop forward warning 수정 [#3323](https://github.com/titicacadev/triple-frontend/pull/3323)
- styled components에 transient prop 사용 [#3326](https://github.com/titicacadev/triple-frontend/pull/3326)
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
- FlickingCarousel을 원상복구 [#3359](https://github.com/titicacadev/triple-frontend/pull/3359)
- v14 버그 수정 [#3369](https://github.com/titicacadev/triple-frontend/pull/3369)
### tds-widget
- [v14] beforeScrapedChange prop 복구 [#3289](https://github.com/titicacadev/triple-frontend/pull/3289)
- querystring 대신 qs 모듈 사용 [#3314](https://github.com/titicacadev/triple-frontend/pull/3314)
- styled components 6 prop forward warning 수정 [#3323](https://github.com/titicacadev/triple-frontend/pull/3323)
- styled components에 transient prop 사용 [#3326](https://github.com/titicacadev/triple-frontend/pull/3326)
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
- [v14] POI 대표 이미지 오류 수정 [#3356](https://github.com/titicacadev/triple-frontend/pull/3356)
- FlickingCarousel을 원상복구 [#3359](https://github.com/titicacadev/triple-frontend/pull/3359)
- [migration] v13.26.3 이후 변경사항 v14에 반영 [#3374](https://github.com/titicacadev/triple-frontend/pull/3374)
- [migration] v13.29.0~v13.31.0 변경사항을 v14에 반영합니다. [#3381](https://github.com/titicacadev/triple-frontend/pull/3381)
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
- [v14] 캐러셀 관련 이슈 수정 [#3409](https://github.com/titicacadev/triple-frontend/pull/3409)
### triple-document
- styled components에 transient prop 사용 [#3326](https://github.com/titicacadev/triple-frontend/pull/3326)
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### triple-email-document
- styled components에 transient prop 사용 [#3326](https://github.com/titicacadev/triple-frontend/pull/3326)
### triple-header
- styled components에 transient prop 사용 [#3326](https://github.com/titicacadev/triple-frontend/pull/3326)
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### triple-web
- v13 변경사항 리베이스 [#3315](https://github.com/titicacadev/triple-frontend/pull/3315)
- v14 버그 수정 [#3369](https://github.com/titicacadev/triple-frontend/pull/3369)
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### triple-web-nextjs
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
- v14 버그 수정 [#3369](https://github.com/titicacadev/triple-frontend/pull/3369)
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### triple-web-nextjs-pages
- 스토리북 8 업그레이드 [#3341](https://github.com/titicacadev/triple-frontend/pull/3341)
- v14 버그 수정 [#3369](https://github.com/titicacadev/triple-frontend/pull/3369)
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
### triple-web-test-utils
- i18next 제거 & triple-web에 i18n context 추가 [#3387](https://github.com/titicacadev/triple-frontend/pull/3387)
## v14
### ab-experiments
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### action-sheet
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### ad-banners
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### app-banner
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### app-installation-cta
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### author
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### booking-completion
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### carousel
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### chat
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### color-palette
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### constants
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### content-sharing
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### core-elements
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### date-picker
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### directions-finder
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### drawer-button
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### fetcher
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### footer
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### form
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### hub-form
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### i18n
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### icons
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### image-carousel
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### image-viewer
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### intersection-observer
- [v14] 빌드 에러 수정 1 [#3077](https://github.com/titicacadev/triple-frontend/pull/3077)
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- [v14] QA 버그 수정 [#3162](https://github.com/titicacadev/triple-frontend/pull/3162)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- styled-components 6 업그레이드 [#3268](https://github.com/titicacadev/triple-frontend/pull/3268)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### listing-filter
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### location-properties
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### map
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### meta-tags
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### middlewares
- middleware 패키지 추가 및 세션 갱신 middlware 추가 [#3185](https://github.com/titicacadev/triple-frontend/pull/3185)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### modals
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### nearby-pois
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### poi-detail
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### poi-list-elements
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### popup
- V14 에픽 브랜치 [#3189](https://github.com/titicacadev/triple-frontend/pull/3189)
### react-hooks
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- [v14] 타입 개선과 버그 수정 [#3128](https://github.com/titicacadev/triple-frontend/pull/3128)
- [v14] QA 버그 수정 [#3162](https://github.com/titicacadev/triple-frontend/pull/3162)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- styled-components 6 업그레이드 [#3268](https://github.com/titicacadev/triple-frontend/pull/3268)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### react-triple-client-interfaces
- [v14] 스토리북 코드 수정 [#3063](https://github.com/titicacadev/triple-frontend/pull/3063)
- [v14] react-triple-client-interfaces 패키지 제거 [#3068](https://github.com/titicacadev/triple-frontend/pull/3068)
### router
- [v14] useIsomorphicNavigation 복구 및 replies 마이그레이션 [#3062](https://github.com/titicacadev/triple-frontend/pull/3062)
- [v14] react-triple-client-interfaces 패키지 제거 [#3068](https://github.com/titicacadev/triple-frontend/pull/3068)
- [v14] 새로운 open link 훅 추가 [#3071](https://github.com/titicacadev/triple-frontend/pull/3071)
- [v14] useClientAppActions import path 수정 [#3072](https://github.com/titicacadev/triple-frontend/pull/3072)
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- [v14] 테스트 코드를 수정합니다. [#3087](https://github.com/titicacadev/triple-frontend/pull/3087)
- [v14] 컴포넌트형 링크 제거하고 useMake 훅 추가 [#3099](https://github.com/titicacadev/triple-frontend/pull/3099)
- [v14] TripleWeb 사용 편의성 보완 [#3117](https://github.com/titicacadev/triple-frontend/pull/3117)
- [triple-web] TransitionModal을 AppInstallCtaModal로 변경합니다. [#3249](https://github.com/titicacadev/triple-frontend/pull/3249)
- 타입 문제 수정 [#3261](https://github.com/titicacadev/triple-frontend/pull/3261)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### scroll-spy
- [v14] 빌드 에러 수정 1 [#3077](https://github.com/titicacadev/triple-frontend/pull/3077)
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- [V14] scroll-spy 패키지 제거 [#3089](https://github.com/titicacadev/triple-frontend/pull/3089)
### scroll-to-element
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### standard-action-handler
- [v14] standard-action-handler 마이그레이션 [#3061](https://github.com/titicacadev/triple-frontend/pull/3061)
- [v14] useExternalRouter 제거 [#3067](https://github.com/titicacadev/triple-frontend/pull/3067)
- [v14] react-triple-client-interfaces 패키지 제거 [#3068](https://github.com/titicacadev/triple-frontend/pull/3068)
- [v14] 새로운 open link 훅 추가 [#3071](https://github.com/titicacadev/triple-frontend/pull/3071)
- [v14] useClientAppActions import path 수정 [#3072](https://github.com/titicacadev/triple-frontend/pull/3072)
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- [v14] 테스트 코드를 수정합니다. [#3087](https://github.com/titicacadev/triple-frontend/pull/3087)
- [triple-web] TransitionModal을 AppInstallCtaModal로 변경합니다. [#3249](https://github.com/titicacadev/triple-frontend/pull/3249)
- 타입 문제 수정 [#3261](https://github.com/titicacadev/triple-frontend/pull/3261)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- styled-components 6 업그레이드 [#3268](https://github.com/titicacadev/triple-frontend/pull/3268)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
### tds-theme
- [v14] ES Module 사용, 빌드 오류 일부 수정 [#3081](https://github.com/titicacadev/triple-frontend/pull/3081)
- [v14] subpath exports 제거, intersection-observer 개선 [#3085](https://github.com/titicacadev/triple-frontend/pull/3085)
- Vite 빌드 [#3264](https://github.com/titicacadev/triple-frontend/pull/3264)
- styled-components 6 업그레이드 [#3268](https://github.com/titicacadev/triple-frontend/pull/3268)
- ES Module 빌드 [#3275](https://github.com/titicacadev/triple-frontend/pull/3275)
## v13.48.1
```
### react-contexts
- [react-contexts] 웹뷰일 때 trackScreen이 호출되지 않는 이슈를 해결합니다. [#3756](https://github.com/titicacadev/triple-frontend/pull/3756)
```
## v13.48.0
### footer
- [footer] 리뉴얼된 푸터 UI를 적용합니다. [#3751](https://github.com/titicacadev/triple-frontend/pull/3751)
## v13.47.0
### action-sheet
- [STAY-1323] ActionSheetItem 이 overflow 속성을 받을 수 있도록 수정(optional) [#3714](https://github.com/titicacadev/triple-frontend/pull/3714)
## 13.46.1
### poi-detail
- [INTTNA-2259] 상세 헤더 TNA 공급사 리뷰로 사용하기 위해 리뷰 개수만 확인하여 리뷰보기 노출 [3705](https://github.com/titicacadev/triple-frontend/pull/3705)
## 13.46.0
### ab-experiments
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
### ad-banners
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
### constants
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 세션 리프레쉬 로직을 수정합니다. [#3592](https://github.com/titicacadev/triple-frontend/pull/3592)
### core-elements
- [footer] 푸터에 버튼, 링크, 드롭다운을 원격으로 설정할 수 있도록 수정합니다. [#3615](https://github.com/titicacadev/triple-frontend/pull/3615)
### date-picker
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
### fetcher
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
- [fetcher] authFetcherize에서 refresh의 apiUriBase를 fetcher와 통일합니다. [#3645](https://github.com/titicacadev/triple-frontend/pull/3645)
- [KLZT-910] 서버의 401 에러의 AccessTokenExpiredException를 구분합니다. [#3646](https://github.com/titicacadev/triple-frontend/pull/3646)
- [ui-flow] authGuard에서 firstTrial시 NEED_LOGIN 응답시 NEED_LOGIN_IDENTIFIER 리턴 [#3655](https://github.com/titicacadev/triple-frontend/pull/3655)
### footer
- [footer] 푸터에 버튼, 링크, 드롭다운을 원격으로 설정할 수 있도록 수정합니다. [#3615](https://github.com/titicacadev/triple-frontend/pull/3615)
- [footer] footer의 disclaimer maxWidth 삭제 [#3648](https://github.com/titicacadev/triple-frontend/pull/3648)
- [footer] 푸터 버튼에 key props를 추가합니다. [#3652](https://github.com/titicacadev/triple-frontend/pull/3652)
### nearby-pois
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
### poi-detail
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
### public-header
- [public-header, react-contexts] NOL 연동 회원의 경우 웹 사이드바 프로필에서 provider를 노출하지 않습니다. [#3580](https://github.com/titicacadev/triple-frontend/pull/3580)
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [public-header] provider 타입 추가에 따른 프로필 변경 [#3607](https://github.com/titicacadev/triple-frontend/pull/3607)
- [public-header] NOL 멤버스 문구를 NOL 회원으로 변경합니다. [#3659](https://github.com/titicacadev/triple-frontend/pull/3659)
### react-contexts
- [public-header, react-contexts] NOL 연동 회원의 경우 웹 사이드바 프로필에서 provider를 노출하지 않습니다. [#3580](https://github.com/titicacadev/triple-frontend/pull/3580)
- [react-contexts] NOL 통합 유저일 경우 로그아웃시 redirect합니다. [#3581](https://github.com/titicacadev/triple-frontend/pull/3581)
- [react-contexts] 트리플 deviceId를 추가하는 미들웨어를 작성합니다. [#3584](https://github.com/titicacadev/triple-frontend/pull/3584)
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 세션 리프레쉬 로직을 수정합니다. [#3592](https://github.com/titicacadev/triple-frontend/pull/3592)
- [react-contexts] setWebDeviceId 미들웨어에 applySetCookie를 적용합니다. [#3594](https://github.com/titicacadev/triple-frontend/pull/3594)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
- [react-contexts] 세션 체크 API로 변경 [#3605](https://github.com/titicacadev/triple-frontend/pull/3605)
- [public-header] provider 타입 추가에 따른 프로필 변경 [#3607](https://github.com/titicacadev/triple-frontend/pull/3607)
- [react-contexts] 미들웨어에 chain 및 기타 미들웨어의 export를 추가합니다. [#3609](https://github.com/titicacadev/triple-frontend/pull/3609)
- [react-contexts] setWebDeviceId 미들웨어에 domain을 추가합니다. [#3610](https://github.com/titicacadev/triple-frontend/pull/3610)
- [react-contexts] trackScreen에 nol_device_id를 기록하도록 수정합니다. [#3617](https://github.com/titicacadev/triple-frontend/pull/3617)
- [react-contexts] 일반 로그아웃시 reload 추가 [#3641](https://github.com/titicacadev/triple-frontend/pull/3641)
- [KLZT-910] 서버의 401 에러의 AccessTokenExpiredException를 구분합니다. [#3646](https://github.com/titicacadev/triple-frontend/pull/3646)
### replies
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
### review
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
- [KLZT-910] 서버의 401 에러의 AccessTokenExpiredException를 구분합니다. [#3646](https://github.com/titicacadev/triple-frontend/pull/3646)
### standard-action-handler
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [KLZT-910] 서버의 401 에러의 AccessTokenExpiredException를 구분합니다. [#3646](https://github.com/titicacadev/triple-frontend/pull/3646)
### triple-document
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
### triple-header
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
### ui-flow
- [public-header, react-contexts] NOL 연동 회원의 경우 웹 사이드바 프로필에서 provider를 노출하지 않습니다. [#3580](https://github.com/titicacadev/triple-frontend/pull/3580)
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
- [ui-flow] authGuard에서 firstTrial시 NEED_LOGIN 응답시 NEED_LOGIN_IDENTIFIER 리턴 [#3655](https://github.com/titicacadev/triple-frontend/pull/3655)
### user-verification
- [Epic] NOL 회원 통합 [#3590](https://github.com/titicacadev/triple-frontend/pull/3590)
- [react-contexts] 클라이언트 세션 갱신 로직을 추가합니다. [#3595](https://github.com/titicacadev/triple-frontend/pull/3595)
## 13.45.1
### view-utilities
- [view-utilities] routelist의 static-pages 정규식을 수정합니다. [#3598](https://github.com/titicacadev/triple-frontend/pull/3598)
## 13.45.0
### view-utilities
- [KLZT-885] routelist에 static-pages, community, game을 추가합니다. [#3596](https://github.com/titicacadev/triple-frontend/pull/3596)
## 13.44.0
### footer
- [footer, react-contexts] 푸터 정보를 footer.json으로 관리하도록 수정합니다 [#3577](https://github.com/titicacadev/triple-frontend/pull/3577)
### react-contexts
- [footer, react-contexts] 푸터 정보를 footer.json으로 관리하도록 수정합니다 [#3577](https://github.com/titicacadev/triple-frontend/pull/3577)
## 13.43.0
### react-contexts
- session refresh middleware 추가 [#3564](https://github.com/titicacadev/triple-frontend/pull/3564)
## 13.42.1
### chat
- (chat)fix: file input에 사진만 업로드 가능하도록 accept 추가 [#3552](https://github.com/titicacadev/triple-frontend/pull/3552)
## 13.42.0
### chat
- (chat) 트리플 앱 디펜던시 제거 [#3554](https://github.com/titicacadev/triple-frontend/pull/3554)
## v13.41.0
### chat
- [chat] 메세지에 IntersectionObserver와 ref를 추가합니다. [#3109](https://github.com/titicacadev/triple-frontend/pull/3109)
- [chat] 부모 메세지 UI를 추가합니다 [#3111](https://github.com/titicacadev/triple-frontend/pull/3111)
- [chat] 버블 스타일을 수정하고 날짜 및 시간 표기, 프로필 생략 기능을 추가합니다. [#3116](https://github.com/titicacadev/triple-frontend/pull/3116)
- [chat] 메세지에 답장하기 아이콘을 추가합니다. [#3127](https://github.com/titicacadev/triple-frontend/pull/3127)
- [chat] epic: geochat 기능을 chat 패키지에 추가합니다. [#3130](https://github.com/titicacadev/triple-frontend/pull/3130)
- [chat] 답장하기 아이콘의 렌더링 조건을 수정합니다. [#3132](https://github.com/titicacadev/triple-frontend/pull/3132)
- [chat] 긴 글 메세지의 전체보기 뷰를 추가합니다. [#3134](https://github.com/titicacadev/triple-frontend/pull/3134)
- [chat] openMenu의 타입 오류를 수정합니다. [#3139](https://github.com/titicacadev/triple-frontend/pull/3139)
- [chat] 지오챗 버블의 기능을 추가합니다. [#3146](https://github.com/titicacadev/triple-frontend/pull/3146)
- [chat] intersection observer 교체 외 스타일 수정 [#3444](https://github.com/titicacadev/triple-frontend/pull/3444)
- [chat] aTagNavigator가 외부 브라우저에서 열리도록 수정합니다. [#3551](https://github.com/titicacadev/triple-frontend/pull/3551)
- [chat] 답장하기 버튼에 data-id 추가 [#3556](https://github.com/titicacadev/triple-frontend/pull/3556)
## 13.40.1
### view-utilities
- [view-utilities] tna public_routerlist 정규식 수정 [#3542](https://github.com/titicacadev/triple-frontend/pull/3542)
## 13.40.0
### footer
- [footer] 푸터 내 문의메일 정보 변경 [#3543](https://github.com/titicacadev/triple-frontend/pull/3543)
## 13.39.0
### triple-email-document
- [triple-email-template] default 링크 스타일을 추가하고, 스크롤 포커싱 이슈를 해결합니다 [#3517](https://github.com/titicacadev/triple-frontend/pull/3517)
## v13.38.1
### footer
- [footer] 푸터의 맞춤법을 수정합니다. [#3516](https://github.com/titicacadev/triple-frontend/pull/3516)
## v13.38.0
### footer
- [footer] 푸터의 회사명, 대표명을 변경합니다. [#3505](https://github.com/titicacadev/triple-frontend/pull/3505)
### review
- [Reivew] 리뷰 플레이스홀더 마진 값을 수정합니다. [#3509](https://github.com/titicacadev/triple-frontend/pull/3509)
## v13.37.0
### triple-media
- KLZT-766 영상기본음소거 [#3503](https://github.com/titicacadev/triple-frontend/pull/3503)
### type-definitions
- KLZT-766 영상기본음소거 [#3503](https://github.com/titicacadev/triple-frontend/pull/3503)
## v13.36.0
### react-contexts
- [INTHOTEL-2407] defaultImage와 중복되는 이미지 필터링 [#3474](https://github.com/titicacadev/triple-frontend/pull/3474)
- triple-web-to-native-interfaces 패키지 버전업 대응 [#3475](https://github.com/titicacadev/triple-frontend/pull/3475)
### search
- triple-web-to-native-interfaces 패키지 버전업 대응 [#3475](https://github.com/titicacadev/triple-frontend/pull/3475)
### standard-action-handler
- triple-web-to-native-interfaces 패키지 버전업 대응 [#3475](https://github.com/titicacadev/triple-frontend/pull/3475)
## v13.35.0
### react-triple-client-interfaces
- [MAC용 트리플 앱 개발 지원] client meta data에 isMacApp 플래그 추가 [#3439](https://github.com/titicacadev/triple-frontend/pull/3439)
### triple-document
- [KLZT-668] 아티클 추천코스의 POI에 한줄 소개 영역을 추가합니다. [#3437](https://github.com/titicacadev/triple-frontend/pull/3437)
## v13.34.0
### modals
- [KLZT-663] converse에 로그인 유도 모달을 추가합니다 [#3429](https://github.com/titicacadev/triple-frontend/pull/3429)
### standard-action-handler
- [KLZT-663] converse에 로그인 유도 모달을 추가합니다 [#3429](https://github.com/titicacadev/triple-frontend/pull/3429)
### view-utilities
- [KLZT-677] routelist에 tna, air hub 추가 [#3443](https://github.com/titicacadev/triple-frontend/pull/3443)
## v13.33.0
### footer
- [KLZT-671] 푸터 내 통신판매업 신고번호 변경 [#3435](https://github.com/titicacadev/triple-frontend/pull/3435)
## v13.32.0
### review
- [KLZT-655] 리뷰 정렬 옵션 변경 시 무관한 element로 포커싱이 되는 버그를 수정합니다. [#3425](https://github.com/titicacadev/triple-frontend/pull/3425)
- [WATF-397] 리뷰 컴포넌트 내 배너를 prop으로 받도록 수정합니다. [#3433](https://github.com/titicacadev/triple-frontend/pull/3433)
## v13.31.0
### react-contexts
- [react-contexts] ScrapProvider에서 스크랩 실패 시 콜백함수를 props로 받습니다. [#3418](https://github.com/titicacadev/triple-frontend/pull/3418)
### review
- [KLZT-103] 리뷰 컴포넌트 렌더링 버그를 수정합니다. [#3407](https://github.com/titicacadev/triple-frontend/pull/3407)
## v13.30.0
### footer
- [KLZT-622] 푸터 주소 변경 [#3413](https://github.com/titicacadev/triple-frontend/pull/3413)
## v13.29.0
### footer
- [footer] 푸터 KINT 진입점에 FA 로깅을 추가합니다. [#3379](https://github.com/titicacadev/triple-frontend/pull/3379)
### react-contexts
- [react-contexts] images-api v2 적용 [#3345](https://github.com/titicacadev/triple-frontend/pull/3345)
## v13.28.0
### footer
- [footer] 푸터에 트리플 코리아 링크를 추가합니다. [#3370](https://github.com/titicacadev/triple-frontend/pull/3370)
## v13.27.1
### review
- [review] travel-restritions-api 관련 코드를 제거하기 위해 코드젠 generated.tsx를 재생성합니다 [#3357](https://github.com/titicacadev/triple-frontend/pull/3357)
## v13.27.0
### public-header
- [public-header] 헤더에 사이드바를 추가합니다. [#3328](https://github.com/titicacadev/triple-frontend/pull/3328)
## v13.26.4
### footer
- [footer] 푸터 통신판매업 신고번호를 변경합니다. [#3329](https://github.com/titicacadev/triple-frontend/pull/3329)
## v13.26.3
### action-sheet
- [action-sheet] pointer select revert [#3313](https://github.com/titicacadev/triple-frontend/pull/3313)
### react-contexts
- [react-contexts] user의 마일리지 뱃지 이미지 타입을 수정합니다. [#3310](https://github.com/titicacadev/triple-frontend/pull/3310)
## v13.26.2
### action-sheet
- [action-sheet] 액션 시트에서 lockScroll을 해제할 수 있도록 옵션 제공 [#3295](https://github.com/titicacadev/triple-frontend/pull/3295)
### react-contexts
- [react-hooks] user 타입에 email 필드를 추가합니다. [#3304](https://github.com/titicacadev/triple-frontend/pull/3304)
### react-hooks
- [react-hooks] user 타입에 email 필드를 추가합니다. [#3304](https://github.com/titicacadev/triple-frontend/pull/3304)
## v13.26.1
### review
- [review] 리뷰 상세 딥링크의 regionId 파라미터 null처리 추가 [#3266](https://github.com/titicacadev/triple-frontend/pull/3266)
## v13.26.0
### footer
- [footer] 인터파크 사업장 주소 변경 [#3247](https://github.com/titicacadev/triple-frontend/pull/3247)
## v13.25.3
### triple-document
- triple-document 내 쿠폰 모달 닫기 버튼 문구 수정 [#3243](https://github.com/titicacadev/triple-frontend/pull/3243)
### core-elements
- input error border-color 변경 [#3244](https://github.com/titicacadev/triple-frontend/pull/3244)
## v13.25.2
### triple-document
- [triple-document] StickyTabs 이미지에 object-fit 적용 [#3238](https://github.com/titicacadev/triple-frontend/pull/3238)
### view-utilities
- [view-utilities] 맞춤일정 페이지를 routelist에 추가합니다. [#3239](https://github.com/titicacadev/triple-frontend/pull/3239)
## v13.25.1
### core-elements
- form field error color 변경 [#3234](https://github.com/titicacadev/triple-frontend/pull/3234)
### triple-document
- sticky-tabs의 z-index 수정 [#3235](https://github.com/titicacadev/triple-frontend/pull/3235)
## v13.25.0
### triple-header, triple-document
- triple-header가 로티 애니메이션 타입을 지원합니다.
- triple-document에 Animation Element를 추가합니다. [#3210](https://github.com/titicacadev/triple-frontend/pull/3210)
### triple-document
- StickyTabs element 추가합니다. [#3220](https://github.com/titicacadev/triple-frontend/pull/3220)
## v13.24.0
### triple-document
- 추천코스가 페스타 타입을 지원하도록 합니다. [#3202](https://github.com/titicacadev/triple-frontend/pull/3202)
## v13.23.1
### image-viewer
- [image-viewer] 첫번째 이미지를 클릭했을 때 비정상적으로 작동하는 버그를 수정합니다. [#3187](https://github.com/titicacadev/triple-frontend/pull/3187)
## v13.23.0
### modals
- [modals] 앱설치유도 모달에 POI 기본정보 type을 추가합니다. [#3182](https://github.com/titicacadev/triple-frontend/pull/3182)
### public-header
- [public-header] 헤더 로고에 onClick props를 추가합니다. [#3183](https://github.com/titicacadev/triple-frontend/pull/3183)
## v13.22.0
### image-viewer
- [image-viewer] 확대뷰/격자뷰를 위한 이미지 뷰어 패키지를 생성합니다 [#3165](https://github.com/titicacadev/triple-frontend/pull/3165)
- [image-viewer] 이미지 확대뷰 팝업을 생성합니다 [#3166](https://github.com/titicacadev/triple-frontend/pull/3166)
- [image-viewer] 동영상 확대뷰를 작성합니다 [#3170](https://github.com/titicacadev/triple-frontend/pull/3170)
- [image-viewer] 이미지 확대뷰에서 핀치 줌 기능을 적용합니다 [#3172](https://github.com/titicacadev/triple-frontend/pull/3172)
- [review, image-viewer] 이미지 뷰어에서 ImagesContext를 제거하고 리뷰 컴포넌트에 이미지 뷰어를 적용합니다 [#3173](https://github.com/titicacadev/triple-frontend/pull/3173)
- [image-viewer, poi-detail, review] 이미지 확대뷰 fa 이벤트를 추가합니다 [#3175](https://github.com/titicacadev/triple-frontend/pull/3175)
- [image-viewer] 더블 클릭으로 인한 이미지 확대를 disable합니다 [#3176](https://github.com/titicacadev/triple-frontend/pull/3176)
- [reviews] 이미지 확대뷰 QA [#3179](https://github.com/titicacadev/triple-frontend/pull/3179)
### meta-tags
- [meta-tags] 불필요 주석 제거 [#3163](https://github.com/titicacadev/triple-frontend/pull/3163)
### poi-detail
- [image-viewer] 확대뷰/격자뷰를 위한 이미지 뷰어 패키지를 생성합니다 [#3165](https://github.com/titicacadev/triple-frontend/pull/3165)
- [poi-detail, review] 이미지 캐러셀의 cta 조건을 수정합니다 [#3171](https://github.com/titicacadev/triple-frontend/pull/3171)
- [poi-detail] 이지역꿀정보의 fa를 추가합니다 [#3174](https://github.com/titicacadev/triple-frontend/pull/3174)
- [image-viewer, poi-detail, review] 이미지 확대뷰 fa 이벤트를 추가합니다 [#3175](https://github.com/titicacadev/triple-frontend/pull/3175)
- [poi-detail] 이지역꿀정보 영역 디자인을 수정합니다 [#3178](https://github.com/titicacadev/triple-frontend/pull/3178)
### review
- [image-viewer] 확대뷰/격자뷰를 위한 이미지 뷰어 패키지를 생성합니다 [#3165](https://github.com/titicacadev/triple-frontend/pull/3165)
- [poi-detail, review] 이미지 캐러셀의 cta 조건을 수정합니다 [#3171](https://github.com/titicacadev/triple-frontend/pull/3171)
- [review, image-viewer] 이미지 뷰어에서 ImagesContext를 제거하고 리뷰 컴포넌트에 이미지 뷰어를 적용합니다 [#3173](https://github.com/titicacadev/triple-frontend/pull/3173)
- [image-viewer, poi-detail, review] 이미지 확대뷰 fa 이벤트를 추가합니다 [#3175](https://github.com/titicacadev/triple-frontend/pull/3175)
- [reviews] 유저 photo가 없을 때 디폴트 프로필을 설정합니다 [#3180](https://github.com/titicacadev/triple-frontend/pull/3180)
### triple-document
- [triple-document] itinerary의 transportation 타입에 bike를 추가합니다 [#3177](https://github.com/titicacadev/triple-frontend/pull/3177)
## v13.21.1
### review
- [reviews] 리뷰 더보기의 로그인 returnUrl을 리뷰 목록 페이지로 수정합니다. [#3167](https://github.com/titicacadev/triple-frontend/pull/3167)
## v13.21.0
### modals
- [review] 웹에서도 리뷰 더보기 버튼을 통해 리뷰 상세 페이지에 접근할 수 있도록 수정합니다 [#3156](https://github.com/titicacadev/triple-frontend/pull/3156)
- [modals] loginCtaModal의 로그인 클릭시에도 리퍼럴 이벤트를 기록하도록 수정합니다 [#3157](https://github.com/titicacadev/triple-frontend/pull/3157)
### poi-detail
- [poi-detail] 저장 유도 툴팁을 추가합니다 [#3152](https://github.com/titicacadev/triple-frontend/pull/3152)
### review
- [review] 웹에서도 리뷰 더보기 버튼을 통해 리뷰 상세 페이지에 접근할 수 있도록 수정합니다 [#3156](https://github.com/titicacadev/triple-frontend/pull/3156)
- [review] 맞춤 일정 배너를 노출합니다 [#3158](https://github.com/titicacadev/triple-frontend/pull/3158)
### triple-document
- [triple-document] note가 markdownText를 지원하도록 수정합니다 [#3148](https://github.com/titicacadev/triple-frontend/pull/3148)
### view-utilities
- [review] 웹에서도 리뷰 더보기 버튼을 통해 리뷰 상세 페이지에 접근할 수 있도록 수정합니다 [#3156](https://github.com/titicacadev/triple-frontend/pull/3156)
- [view-utilities] 항공 시세 페이지를 routelist에 추가합니다 [#3160](https://github.com/titicacadev/triple-frontend/pull/3160)
## v13.20.0
### view-utilities
- [view-utilities] 말줄임 함수 수정 [#3154](https://github.com/titicacadev/triple-frontend/pull/3154)
## v13.19.2
### modals
- TransitionModal에 타입을 추가합니다. [#3144](https://github.com/titicacadev/triple-frontend/pull/3144)
## v13.19.1
### nearby-pois
- [nearby-pois] 더보기 버튼 클릭 시 api 호출이 중복되는 이슈 수정 [#3140](https://github.com/titicacadev/triple-frontend/pull/3140)
- [nearby-pois] pois 중복을 제거하는 로직을 수정합니다. [#3141](https://github.com/titicacadev/triple-frontend/pull/3141)
## v13.19.0
### standard-action-handler
- [standard-action-handler] requireTripleClient 함수 추가 [#3121](https://github.com/titicacadev/triple-frontend/pull/3121)
### triple-document
- [triple-document] tna slot의 타이틀을 두줄 노출하도록 수정 [#3133](https://github.com/titicacadev/triple-frontend/pull/3133)
## v13.18.3
### poi-detail
- [poi-detail] DetailHeader의 아이콘을 정렬합니다. [#3126](https://github.com/titicacadev/triple-frontend/pull/3126)
- [poi-detail] 리뷰 영상 관련 툴팁 노출 버그를 수정합니다 [#3129](https://github.com/titicacadev/triple-frontend/pull/3129)
## v13.18.2
### modals
- [Review] notifyReviewDeleted 중복 호출 제거 및 리뷰 메뉴 선택 시 앱 설치 유도팝업 노출 [#3118](https://github.com/titicacadev/triple-frontend/pull/3118)
### review
- [Review] notifyReviewDeleted 중복 호출 제거 및 리뷰 메뉴 선택 시 앱 설치 유도팝업 노출 [#3118](https://github.com/titicacadev/triple-frontend/pull/3118)
## v13.18.1
### review
- [review] 좋아요 카운트 버그 수정 [#3115](https://github.com/titicacadev/triple-frontend/pull/3115)
## v13.18.0
### chat
- [Chat refactor] Bubble 리팩토링 [#2980](https://github.com/titicacadev/triple-frontend/pull/2980)
- [Chat refactor] 채팅의 default 네브바와 input ui를 추가합니다. [#2982](https://github.com/titicacadev/triple-frontend/pull/2982)
- [Chat refactor] 스크롤을 위한 context와 container를 작성합니다. [#2985](https://github.com/titicacadev/triple-frontend/pull/2985)
- [Chat refactor] messagesReducer를 추가합니다. [#2986](https://github.com/titicacadev/triple-frontend/pull/2986)
- [epic] Chat 리팩토링 [#2994](https://github.com/titicacadev/triple-frontend/pull/2994)
- [Chat refactor] BubbleUI의 prop 변경 [#2998](https://github.com/titicacadev/triple-frontend/pull/2998)
- [Chat refactor] 사용하지 않는 파일을 제거합니다. [#2999](https://github.com/titicacadev/triple-frontend/pull/2999)
- [Chat refactor] 메시지 리스트를 렌더링하는 Messages 컴포넌트 생성 [#3003](https://github.com/titicacadev/triple-frontend/pull/3003)
- [Chat refactor] Bubble의 default click 설정 [#3008](https://github.com/titicacadev/triple-frontend/pull/3008)
- [chat refactor] constants의 export를 추가하고 다중 이미지 업로드 옵션을 추가합니다. [#3031](https://github.com/titicacadev/triple-frontend/pull/3031)
- [Chat refactor] Bubble 스타일 설정 추가 및 스토리북 추가 [#3044](https://github.com/titicacadev/triple-frontend/pull/3044)
- [chat refactor] scroll context에 스크롤 방지 옵션을 추가합니다. [#3051](https://github.com/titicacadev/triple-frontend/pull/3051)
- [Chat] react-triple-client-interfaces의 Dependencies 수정 [#3088](https://github.com/titicacadev/triple-frontend/pull/3088)
- [chat refactor] 메세지에 unreadCount를 계산하기 위한 prop을 추가합니다. [#3095](https://github.com/titicacadev/triple-frontend/pull/3095)
- [Chat Refactor] MessagesReducer의 액션을 추가하고 타입을 수정합니다. [#3104](https://github.com/titicacadev/triple-frontend/pull/3104)
## v13.17.0
### replies
- 댓글 작성, 삭제 handle function prop을 추가합니다 [#3098](https://github.com/titicacadev/triple-frontend/pull/3098)
### reply
- 댓글 작성, 삭제 handle function prop을 추가합니다 [#3098](https://github.com/titicacadev/triple-frontend/pull/3098)
### triple-document
- [triple-document] 추천 일정의 '내 일정으로 담기' 로직을 수정합니다. [#3096](https://github.com/titicacadev/triple-frontend/pull/3096)
## v13.16.0
### directions-finder
- [directions-finder] grab 호출 버튼에 Intersecting Observer를 추가합니다. [#3082](https://github.com/titicacadev/triple-frontend/pull/3082)
### i18n
- [Review] 예약 상품 상세 정보 노출 [#3070](https://github.com/titicacadev/triple-frontend/pull/3070)
### meta-tags
- [meta-tags] reviewRating에 bestRating, worstRating을 추가합니다. [#3079](https://github.com/titicacadev/triple-frontend/pull/3079)
### review
- [Review] 예약 상품 상세 정보 노출 [#3070](https://github.com/titicacadev/triple-frontend/pull/3070)
## v13.15.0
### directions-finder
- [directions-finder] grab 호출 버튼을 추가합니다. [#3032](https://github.com/titicacadev/triple-frontend/pull/3032)
### i18n
- [directions-finder] grab 호출 버튼을 추가합니다. [#3032](https://github.com/titicacadev/triple-frontend/pull/3032)
### meta-tags
- [meta-tags] 리뷰 스니펫에 inLanguage 항목을 추가합니다. [#3074](https://github.com/titicacadev/triple-frontend/pull/3074)
## v13.14.2
### react-contexts
- [react-contexts] 틱톡 픽셀의 누락된 track 메소드를 추가합니다. [#3064](https://github.com/titicacadev/triple-frontend/pull/3064)
## v13.14.1
### resource-list-element
- ExtendedResourceListElement badge 디자인 수정 [#3057](https://github.com/titicacadev/triple-frontend/pull/3057)
### triple-header
- [TFC-52] 트리플 헤더 블링크 이슈 [#2783](https://github.com/titicacadev/triple-frontend/pull/2783)
## v13.14.0
### chat
- [Chat] 좋아요 기능 추가 [#3017](https://github.com/titicacadev/triple-frontend/pull/3017)
### react-contexts
- [react-contexts] 틱톡 pixel 이벤트를 추가합니다. [#3053](https://github.com/titicacadev/triple-frontend/pull/3053)
### resource-list-element
- ExtendedResourceListElement에 badge 영역 추가 [#3048](https://github.com/titicacadev/triple-frontend/pull/3048)
## v13.13.0
### poi-detail
- [type-definitions] GuestModeType 타입 추가 및 적용 [#3028](https://github.com/titicacadev/triple-frontend/pull/3028)
### poi-list-elements
- [type-definitions] GuestModeType 타입 추가 및 적용 [#3028](https://github.com/titicacadev/triple-frontend/pull/3028)
### triple-document
- [triple-document] 가이드 일정영역 서울콘 대응 [#3025](https://github.com/titicacadev/triple-frontend/pull/3025)
- [type-definitions] GuestModeType 타입 추가 및 적용 [#3028](https://github.com/titicacadev/triple-frontend/pull/3028)
### type-definitions
- [type-definitions] GuestModeType 타입 추가 및 적용 [#3028](https://github.com/titicacadev/triple-frontend/pull/3028)
## v13.12.0
### view-utilities
- [view-utilities] 로그인 없이 이동할 수 있는 페이지 주소 목록에 웹일정판 path 추가 [#3015](https://github.com/titicacadev/triple-frontend/pull/3015)
## v13.11.0
### poi-detail
- [Poi-detail] image carousel 서울콘 대응 [#2991](https://github.com/titicacadev/triple-frontend/pull/2991)
### poi-list-elements
- [Poi-list-elements] POI의 이름과 리전명 영역에 대표어값이 가장 우선적으로 표기되도록 함 [#2989](https://github.com/titicacadev/triple-frontend/pull/2989)
- [Poi-list-elements] POI 리스트에서 스크랩 버튼을 숨길 수 있도록 함 [#2990](https://github.com/titicacadev/triple-frontend/pull/2990)
### standard-action-handler
- [standard-action-handler] API 응답 일반화 노출 기능을 추가합니다. [#2947](https://github.com/titicacadev/triple-frontend/pull/2947)
### triple-document
- [Poi-list-elements] POI 리스트에서 스크랩 버튼을 숨길 수 있도록 함 [#2990](https://github.com/titicacadev/triple-frontend/pull/2990)
## v13.10.1
### chat
- [chat] beforeSendMessages를 리듀서에서 제거합니다. [#2988](https://github.com/titicacadev/triple-frontend/pull/2988)
## v13.10.0
### action-sheet
- [action-sheet] action sheet item에 아이콘 추가 [#2979](https://github.com/titicacadev/triple-frontend/pull/2979)
### app-installation-cta
- [react-hooks] useLocalStorage, useSessionStorage 추가 [#2961](https://github.com/titicacadev/triple-frontend/pull/2961)
### chat
- [Chat] Message에 sender 정보를 포함하는 api 변경에 대응합니다. [#2973](https://github.com/titicacadev/triple-frontend/pull/2973)
### poi-detail
- [react-hooks] useLocalStorage, useSessionStorage 추가 [#2961](https://github.com/titicacadev/triple-frontend/pull/2961)
### react-hooks
- [react-hooks] useLocalStorage, useSessionStorage 추가 [#2961](https://github.com/titicacadev/triple-frontend/pull/2961)
## v13.9.0
### chat
- [Chat] received, sent 구분 기준 변경 [#2968](https://github.com/titicacadev/triple-frontend/pull/2968)
- [chat] beforeSentMessages 초기 props만 저장하도록 수정 [#2969](https://github.com/titicacadev/triple-frontend/pull/2969)
- [chat] beforeSentMessages 기본값 불필요하므로 제거 [#2975](https://github.com/titicacadev/triple-frontend/pull/2975)
### footer
- [footer] Award Footer의 인증마크 변경 [#2974](https://github.com/titicacadev/triple-frontend/pull/2974)
## v13.8.1
### chat
- [chat] 채팅 인입 후 메시지 전송시 상품/예약정보 중복노출 [#2960](https://github.com/titicacadev/triple-frontend/pull/2960)
## v13.8.0
### chat
- [Chat] Product bubble 추가 [#2891](https://github.com/titicacadev/triple-frontend/pull/2891)
### core-elements
- [Chat] Product bubble 추가 [#2891](https://github.com/titicacadev/triple-frontend/pull/2891)
## v13.7.0
### chat
- [Chat] message에 blinded 필드를 추가합니다. [#2886](https://github.com/titicacadev/triple-frontend/pull/2886)
- [Chat] 전송 실패 메시지 처리 방식 변경 [#2938](https://github.com/titicacadev/triple-frontend/pull/2938)
- [Chat] RoomMetadata의 타입을 변경합니다. [#2939](https://github.com/titicacadev/triple-frontend/pull/2939)
- [Chat] 채팅 bubble의 link 스타일을 수정합니다. [#2944](https://github.com/titicacadev/triple-frontend/pull/2944)
## v13.6.0
### i18n
- i18n 영어 설정을 추가합니다. [#2923](https://github.com/titicacadev/triple-frontend/pull/2923)
### map
- 구글맵 load script 언어 옵션 추가 [#2918](https://github.com/titicacadev/triple-frontend/pull/2918)
## v13.5.0
### i18n
- [reviews] 리뷰에 사진/동영상 필터를 지원합니다. [#2896](https://github.com/titicacadev/triple-frontend/pull/2896)
### review
- [reviews] 리뷰에 사진/동영상 필터를 지원합니다. [#2896](https://github.com/titicacadev/triple-frontend/pull/2896)
- [reviews] 코드를 리팩토링합니다. [#2904](https://github.com/titicacadev/triple-frontend/pull/2904)
- [reviews] 정렬 옵션 및 필터가 싱크되도록 지원합니다. [#2907](https://github.com/titicacadev/triple-frontend/pull/2907)
### web-storage
- web storage error boundary 컴포넌트 타입 수정 [#2912](https://github.com/titicacadev/triple-frontend/pull/2912)
## v13.4.0
### chat
- [Chat] RoomInterface에 roomType을 추가합니다. [#2900](https://github.com/titicacadev/triple-frontend/pull/2900)
- [Chat] 채팅 리트라이 이벤트를 위한 props를 추가합니다. [#2905](https://github.com/titicacadev/triple-frontend/pull/2905)
### common
- tsconfig emit 관련 설정을 tsconfig.build.json 으로 이동 [#2898](https://github.com/titicacadev/triple-frontend/pull/2898)
### core-elements
- image-source 패키지 추가 [#2876](https://github.com/titicacadev/triple-frontend/pull/2876)
### image-carousel
- image-source 패키지 추가 [#2876](https://github.com/titicacadev/triple-frontend/pull/2876)
### image-source
- image-source 패키지 추가 [#2876](https://github.com/titicacadev/triple-frontend/pull/2876)
### location-properties
- [LocationProperties] 액션시트에서 누락된 주소를 복원합니다. [#2903](https://github.com/titicacadev/triple-frontend/pull/2903)
### poi-detail
- image-source 패키지 추가 [#2876](https://github.com/titicacadev/triple-frontend/pull/2876)
### review
- 리뷰 컴포넌트를 리펙토링합니다. [#2892](https://github.com/titicacadev/triple-frontend/pull/2892)
### triple-document
- image-source 패키지 추가 [#2876](https://github.com/titicacadev/triple-frontend/pull/2876)
### triple-media
- image-source 패키지 추가 [#2876](https://github.com/titicacadev/triple-frontend/pull/2876)
## v13.3.0
### chat
- [Chat] iOS 모바일에서 init 시점에 infinite scroll 로직 실행되는 오류 수정 [#2868](https://github.com/titicacadev/triple-frontend/pull/2868)
- Chat에 disableUnreadCount props를 추가합니다. [#2884](https://github.com/titicacadev/triple-frontend/pull/2884)
### resource-list-element
- [resource-list-element] 광고 표기 위치와 디자인을 수정합니다. [#2858](https://github.com/titicacadev/triple-frontend/pull/2858)
## v13.2.4
### slider
- [slider] SliderBase disabled 상태 추가 [#2824](https://github.com/titicacadev/triple-frontend/pull/2824)
## v13.2.3
### chat
- [chat] chat image url 생성 시 cloudinaryBucket을 우선적으로 사용하도록 변경 [#2838](https://github.com/titicacadev/triple-frontend/pull/2838)
### modals
- (modal) modal flexible 옵션을 추가합니다. [#2841](https://github.com/titicacadev/triple-frontend/pull/2841)
## v13.2.2
### directions-finder
- 현지에서 길묻기 ellipsis 옵션 삭제 [#2834](https://github.com/titicacadev/triple-frontend/pull/2834)
### view-utilities
- feat: debounce에 leading, trailing 옵션 추가 [#2740](https://github.com/titicacadev/triple-frontend/pull/2740)
## v13.2.1
### react-contexts
- react-contexts의 middleware export 경로를 복구합니다. [#2829](https://github.com/titicacadev/triple-frontend/pull/2829)
## v13.2.0
### color-palette
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### core-elements
- react-test-renderer -> testing-library 변경 [#2814](https://github.com/titicacadev/triple-frontend/pull/2814)
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### date-picker
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
- mockdate 대신 storybook-mock-date-decorator 사용 [#2816](https://github.com/titicacadev/triple-frontend/pull/2816)
### directions-finder
- 현지에서 길묻기 팝업 글씨 크기를 조정합니다. [#2812](https://github.com/titicacadev/triple-frontend/pull/2812)
### fetcher
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### image-carousel
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### map
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### meta-tags
- app directory용 메타태그 유틸 함수를 작성합니다. [#2789](https://github.com/titicacadev/triple-frontend/pull/2789)
- react-test-renderer -> testing-library 변경 [#2814](https://github.com/titicacadev/triple-frontend/pull/2814)
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
- app-directory 관련 코드를 TF에서 삭제합니다. [#2826](https://github.com/titicacadev/triple-frontend/pull/2826)
### modals
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### public-header
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### react-contexts
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
- app-directory 관련 코드를 TF에서 삭제합니다. [#2826](https://github.com/titicacadev/triple-frontend/pull/2826)
### react-triple-client-interfaces
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### replies
- react-test-renderer -> testing-library 변경 [#2814](https://github.com/titicacadev/triple-frontend/pull/2814)
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### router
- react-test-renderer -> testing-library 변경 [#2814](https://github.com/titicacadev/triple-frontend/pull/2814)
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### scrap-button
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### scroll-spy
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### scroll-to-element
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### triple-email-document
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### triple-fallback-action
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### ui-flow
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### user-verification
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
### view-utilities
- 테스트 코드 린트 [#2815](https://github.com/titicacadev/triple-frontend/pull/2815)
- app-directory 관련 코드를 TF에서 삭제합니다. [#2826](https://github.com/titicacadev/triple-frontend/pull/2826)
## v13.2.0
### core-elements
- react-test-renderer -> testing-library 변경 [#2814](https://github.com/titicacadev/triple-frontend/pull/2814)
### date-picker
- mockdate 대신 storybook-mock-date-decorator 사용 [#2816](https://github.com/titicacadev/triple-frontend/pull/2816)
### directions-finder
- 현지에서 길묻기 팝업 글씨 크기를 조정합니다 [#2812](https://github.com/titicacadev/triple-frontend/pull/2812)
### meta-tags
- app directory용 메타태그 유틸 함수를 작성합니다. [#2789](https://github.com/titicacadev/triple-frontend/pull/2789)
- react-test-renderer -> testing-library 변경 [#2814](https://github.com/titicacadev/triple-frontend/pull/2814)
- app-directory 관련 코드를 TF에서 삭제합니다. [#2826](https://github.com/titicacadev/triple-frontend/pull/2826)
### react-contexts
- app-directory 관련 코드를 TF에서 삭제합니다. [#2826](https://github.com/titicacadev/triple-frontend/pull/2826)
### replies
- react-test-renderer -> testing-library 변경 [#2814](https://github.com/titicacadev/triple-frontend/pull/2814)
### router
- react-test-renderer -> testing-library 변경 [#2814](https://github.com/titicacadev/triple-frontend/pull/2814)
### view-utilities
- app-directory 관련 코드를 TF에서 삭제합니다. [#2826](https://github.com/titicacadev/triple-frontend/pull/2826)
## v13.1.3
### react-contexts
- firebase 버전을 v9.15.0으로 다운그레이드합니다. [#2811](https://github.com/titicacadev/triple-frontend/pull/2811)
## v13.1.2
### react-contexts
- [react-contexts] ios cookie fixation 기준 버전 변경 [#2800](https://github.com/titicacadev/triple-frontend/pull/2800)
## v13.1.1
### triple-document
- 쿠폰 색상 HEX fixation 을 지원합니다. [#2791](https://github.com/titicacadev/triple-frontend/pull/2791)
### view-utilities
- view-utilities의 package.json main 필드를 복구합니다. [#2792](https://github.com/titicacadev/triple-frontend/pull/2792)
## v13.1.0
### action-sheet
- focus trap 테스트가 랜덤하게 실패하는 현상 수정 [#2785](https://github.com/titicacadev/triple-frontend/pull/2785)
### core-elements
- workspace root의 의존성 제거 및 이동 [#2777](https://github.com/titicacadev/triple-frontend/pull/2777)
### form
- workspace root의 의존성 제거 및 이동 [#2777](https://github.com/titicacadev/triple-frontend/pull/2777)
### map
- workspace root의 의존성 제거 및 이동 [#2777](https://github.com/titicacadev/triple-frontend/pull/2777)
### modals
- TransitionModal에 community TransitionType 추가 [#2774](https://github.com/titicacadev/triple-frontend/pull/2774)
- workspace root의 의존성 제거 및 이동 [#2777](https://github.com/titicacadev/triple-frontend/pull/2777)
- focus trap 테스트가 랜덤하게 실패하는 현상 수정 [#2785](https://github.com/titicacadev/triple-frontend/pull/2785)
### popup
- focus trap 테스트가 랜덤하게 실패하는 현상 수정 [#2785](https://github.com/titicacadev/triple-frontend/pull/2785)
### react-contexts
- app 디렉토리용 eventTrackingProvider를 작성합니다. [#2768](https://github.com/titicacadev/triple-frontend/pull/2768)
- /api/users/me의 타입을 최신화합니다. [#2770](https://github.com/titicacadev/triple-frontend/pull/2770)
- workspace root의 의존성 제거 및 이동 [#2777](https://github.com/titicacadev/triple-frontend/pull/2777)
### triple-document
- triple-document 쿠폰 개선 [#2743](https://github.com/titicacadev/triple-frontend/pull/2743)
### view-utilities
- view-utilities에 common, client export 경로를 추가하고 query 관련 유틸함수를 작성합니다. [#2784](https://github.com/titicacadev/triple-frontend/pull/2784)
## v13.0.2
### review
- TF13 review fix [#2766](https://github.com/titicacadev/triple-frontend/pull/2766)
## v13.0.1
### ad-banners
- Revert egjs flicking 업데이트 [#2765](https://github.com/titicacadev/triple-frontend/pull/2765)
### carousel
- Revert egjs flicking 업데이트 [#2765](https://github.com/titicacadev/triple-frontend/pull/2765)
### image-carousel
- Revert egjs flicking 업데이트 [#2765](https://github.com/titicacadev/triple-frontend/pull/2765)
### poi-detail
- Revert egjs flicking 업데이트 [#2765](https://github.com/titicacadev/triple-frontend/pull/2765)
## v13
### action-sheet
- Headless UI -> Floating UI 변경 [#2567](https://github.com/titicacadev/triple-frontend/pull/2567)
### Breaking Change
- [meta-tag] 구조화된 데이터 스크립트를 작성합니다. [#2674](https://github.com/titicacadev/triple-frontend/pull/2674)
### core-elements
- Headless UI -> Floating UI 변경 [#2567](https://github.com/titicacadev/triple-frontend/pull/2567)
### i18n
- i18n 번체 토큰 디렉토리 이름을 zh에서 zh-TW로 수정합니다. [#2446](https://github.com/titicacadev/triple-frontend/pull/2446)
### meta-tags
- [meta-tag] 구조화된 데이터 스크립트를 작성합니다. [#2674](https://github.com/titicacadev/triple-frontend/pull/2674)
- 구조화된 데이터에 ReviewScript를 추가합니다. [#2726](https://github.com/titicacadev/triple-frontend/pull/2726)
### modals
- Headless UI -> Floating UI 변경 [#2567](https://github.com/titicacadev/triple-frontend/pull/2567)
### popup
- Headless UI -> Floating UI 변경 [#2567](https://github.com/titicacadev/triple-frontend/pull/2567)
### review
- [TFC-97] 호텔 리뷰 개선 - 더보기 UX 개선 (v13 용) [#2734](https://github.com/titicacadev/triple-frontend/pull/2734)
- [review] mutation, 디자인 버그 수정 [#2736](https://github.com/titicacadev/triple-frontend/pull/2736)
## v12.21.1
### triple-document
- [triple-document] POI 가격 0원 개선 - 0원일 때 일시품절 텍스트로 노출 [#2737](https://github.com/titicacadev/triple-frontend/pull/2737)
## v12.21.0
### review
- [TFC-97] 호텔 리뷰 개선 - 더보기 UX 개선 [#2731](https://github.com/titicacadev/triple-frontend/pull/2731)
## v12.20.0
### chat
- chat 구현에서 Polling을 제거하고 스크롤 동작 버그를 수정합니다. [#2687](https://github.com/titicacadev/triple-frontend/pull/2687)
## v12.19.1
### core-elements
- [core-elements] radio-group, checkbox-group export [#2707](https://github.com/titicacadev/triple-frontend/pull/2707)
## v12.19.0
### footer
- [footer] 푸터 사명 변경 [#2690](https://github.com/titicacadev/triple-frontend/pull/2690)
### image-carousel
- 비디오 자동 재생 시에 간헐적으로 발생하는 NotAllowedError를 핸들링합니다. [#2693](https://github.com/titicacadev/triple-frontend/pull/2693)
### review
- 비디오 자동 재생 시에 간헐적으로 발생하는 NotAllowedError를 핸들링합니다. [#2693](https://github.com/titicacadev/triple-frontend/pull/2693)
## v12.18.3
### constants
- e-mail 유효성 검증이 특수문자, 이모지 등을 허용하는 현상을 수정합니다. [#2649](https://github.com/titicacadev/triple-frontend/pull/2649)
## v12.18.2
### modals
- [modals] Modal height가 스크린 높이보다 커도 스크롤 가능하도록 수정 [#2661](https://github.com/titicacadev/triple-frontend/pull/2661)
### triple-document
- [triple-document] 표시가보다 판매가가 큰 경우 할인율과 표시가가 미노출되도록 수정합니다. [#2662](https://github.com/titicacadev/triple-frontend/pull/2662)
## v12.18.1
### footer
- [Footer] 로그인 버튼 a -> button으로 수정 [#2646](https://github.com/titicacadev/triple-frontend/pull/2646)
### meta-tags
- [meta-tags] article script의 date 형식에 validation을 추가합니다. [#2653](https://github.com/titicacadev/triple-frontend/pull/2653)
## v12.18.0
### router
- [ Router ] LocalLink 컴포넌트에 shallow property를 추가합니다. [#2639](https://github.com/titicacadev/triple-frontend/pull/2639)
## v12.17.0
### core-elements
- [core-elements] CheckboxGroup, RadioGroup 접근성 수정 [#2581](https://github.com/titicacadev/triple-frontend/pull/2581)
- [core-elements] Fieldset 추가 [#2582](https://github.com/titicacadev/triple-frontend/pull/2582)
### review
- PinnedMessage의 text 필드를 추가합니다. [#2606](https://github.com/titicacadev/triple-frontend/pull/2606)
### triple-email-document
- [triple-email-document] 이메일에서 도메인이 없는 링크 클릭 시, 정상적으로 랜딩되지 않는 이슈를 수정합니다. [#2559](https://github.com/titicacadev/triple-frontend/pull/2559)
- [triple-email-document] 링크 Element에 존재하는 URL 변환하는 로직을 제거합니다. [#2610](https://github.com/titicacadev/triple-frontend/pull/2610)
## v12.16.0
### core-elements
- react-aria 패키지 제거 [#2551](https://github.com/titicacadev/triple-frontend/pull/2551)
### modals
- 외부 클릭하면 닫는 테스트가 랜덤하게 실패하는 문제 수정 [#2560](https://github.com/titicacadev/triple-frontend/pull/2560)
### action-sheet
- 외부 클릭하면 닫는 테스트가 랜덤하게 실패하는 문제 수정 [#2560](https://github.com/titicacadev/triple-frontend/pull/2560)
### app-installation-cta
- 플로팅 버튼 디자인을 v1 버전으로 되돌립니다 [#2561](https://github.com/titicacadev/triple-frontend/pull/2561)
## v12.15.0
### common
- CHANGELOG 자동화를 구현합니다. [#2518](https://github.com/titicacadev/triple-frontend/pull/2518)
- chore: 불필요한 의존성 제거 [#2519](https://github.com/titicacadev/triple-frontend/pull/2519)
- ci: renovate-pr-fix 삭제 [#2533](https://github.com/titicacadev/triple-frontend/pull/2533)
### action-sheet
- ActionSheet, Modal, Popup 접근성 테스트 추가 [#2480](https://github.com/titicacadev/triple-frontend/pull/2480)
### review
- 리뷰 목록에 pinned message를 노출합니다. [#2403](https://github.com/titicacadev/triple-frontend/pull/2403)
### popup
- [popup] 외부 클릭시 닫는 테스트 제거 [#2532](https://github.com/titicacadev/triple-frontend/pull/2532)
- ActionSheet, Modal, Popup 접근성 테스트 추가 [#2480](https://github.com/titicacadev/triple-frontend/pull/2480)
### modals
- [ Modals ] Confirm body에 css prop을 추가합니다. [#2546](https://github.com/titicacadev/triple-frontend/pull/2546)
- ActionSheet, Modal, Popup 접근성 테스트 추가 [#2480](https://github.com/titicacadev/triple-frontend/pull/2480)
## 12.14.0
- lint 캐시 가능하도록 설정 [#2471](https://github.com/titicacadev/triple-frontend/pull/2471)
### action-sheet
- action-sheet-item에 notice 아이콘 추가 [#2472](https://github.com/titicacadev/triple-frontend/pull/2472)
## 12.13.0
- turbo 제거, lerna + nx 사용 [#2462](https://github.com/titicacadev/triple-frontend/pull/2465)
- 타입스크립트 빌드 컨픽 개선 [#2465](https://github.com/titicacadev/triple-frontend/pull/2462)
### core-elements
- List 에 marker prop 을 추가합니다. [#2463](https://github.com/titicacadev/triple-frontend/pull/2463)
### modals
- Panel에 webkit-mask-image 속성 제거 [#2468](https://github.com/titicacadev/triple-frontend/pull/2468)
### react-triple-client-interfaces
- TripleClientMetadataContext에 shouldUpdateUserAgentOnMount props를 추가합니다 [#2464](https://github.com/titicacadev/triple-frontend/pull/2464)
## 12.12.2
### replies
- 댓글 따봉 아이콘이 짤리던 현상을 수정합니다. [#2458](https://github.com/titicacadev/triple-frontend/pull/2458)
## 12.12.1
### triple-media
- 이미지 여백 제거를 위해 display: block 속성 추가 [#2456](https://github.com/titicacadev/triple-frontend/pull/2456)
## 12.12.0
- Headless UI으로 변경 [#2432](https://github.com/titicacadev/triple-frontend/pull/2432)
- React Aria에 버그가 많아서 Accessible overlay 컴포넌트 라이브러리를 [Headless UI](https://headlessui.com/)로 변경합니다.
- 변경된 컴포넌트:
- action-sheet
- core-elements/Drawer
- drawer-button
- modals
- popup
- react-transition-group -> Headless UI Transition으로 변경합니다.
- ActionSheet, Modals, Popup이 열려 있으면 스크롤이 막힙니다.
- Modal.Action에 cursor: pointer를 추가합니다.
- Drawer, DrawerButton에 `duration` prop을 추가합니다.
### view-utilities
- PUBLIC_ROUTELIST_REGEXES에 여행기 상세 주소 추가 [#2455](https://github.com/titicacadev/triple-frontend/pull/2455)
### default-footer
- Default Footer 에서 css 속성 사용 가능하도록 수정 [#2440](https://github.com/titicacadev/triple-frontend/pull/2440)
## 12.11.0
### common
- Typescript 최신버전 적용 및 타입에러 수정 [#2435](https://github.com/titicacadev/triple-frontend/pull/2435)
### ab-experiments
- CSR 방식으로 A/B테스트 메타데이터를 가져올 때 세션 유무는 체크하지 않도록 합니다. [#2436](https://github.com/titicacadev/triple-frontend/pull/2436)
### triple-header
- 트리플헤더 날아오기 효과의 속도를 변경합니다. [#2414](https://github.com/titicacadev/triple-frontend/pull/2414)
## 12.10.0
### meta-tags
- og-tag img URL을 변경합니다. [#2430](https://github.com/titicacadev/triple-frontend/pull/2430)
## 12.9.0
### common
- npm 9 이상 버전 사용 [#2426](https://github.com/titicacadev/triple-frontend/pull/2426)
### app-installation-cta
- 플로팅 버튼 3차 UI 변경안 반영 [#2417](https://github.com/titicacadev/triple-frontend/pull/2417)
### meta-tags
- breadcrumb, article 스크립트를 추가합니다. [#2400](https://github.com/titicacadev/triple-frontend/pull/2400)
- ThemeColorMeta의 기본 props color와 README를 일부 수정합니다. [#2428](https://github.com/titicacadev/triple-frontend/pull/2428)
## 12.8.1
### directions-finder
- drawer action 조건 추가 [#2424](https://github.com/titicacadev/triple-frontend/pull/2424)
## 12.8.0
### core-elements
- img, video global style height: auto 제거 [#2422](https://github.com/titicacadev/triple-frontend/pull/2422)
### meta-tags
- Theme color를 추가합니다. [#2420](https://github.com/titicacadev/triple-frontend/pull/2420)
### ui-flow
- authGuard의 refreshInAppSession 실행조건을 수정합니다. [#2419](https://github.com/titicacadev/triple-frontend/pull/2419)
## 12.7.0
### core-elements
- Drawer의 layeringProps을 제거하고 z-index를 9999로 변경합니다. [#2404](https://github.com/titicacadev/triple-frontend/pull/2404)
- Drawer를 Portal로 렌더합니다. [#2404](https://github.com/titicacadev/triple-frontend/pull/2404)
- gender-selector 에 disabled 속성을 추가합니다. [#2410](https://github.com/titicacadev/triple-frontend/pull/2410)
### drawer-button
- DrawerButton의 layeringProps를 제거합니다. [#2404](https://github.com/titicacadev/triple-frontend/pull/2404)
### modals
- DrawerButton의 layeringProps를 제거합니다. [#2404](https://github.com/titicacadev/triple-frontend/pull/2404)
- 설치유도팝업 문구를 수정합니다. [#2415](https://github.com/titicacadev/triple-frontend/pull/2415)
### popup
- Popup의 layeringProps을 제거하고 z-index를 9999로 변경합니다. [#2404](https://github.com/titicacadev/triple-frontend/pull/2404)
- Popup을 Portal로 렌더합니다 [#2404](https://github.com/titicacadev/triple-frontend/pull/2404)
## 12.6.0
### intersection-observer
- Lazy loaded IntersectionObserver를 deprecate 합니다. [#2407](https://github.com/titicacadev/triple-frontend/pull/2407)
## 12.5.2
### review
- 최근여행 리뷰 개수 표시 오류를 수정합니다. [#2401](https://github.com/titicacadev/triple-frontend/pull/2401)
## 12.5.1
### public-header
- PublicHeader의 일부 css 속성을 수정합니다 [#2397](https://github.com/titicacadev/triple-frontend/pull/2397)
## 12.5.0
### common
- @titicaca/next-i18next 추가 [#2388](https://github.com/titicacadev/triple-frontend/pull/2388)
- 의존성 버전을 wildcard로 변경 [#2390](https://github.com/titicacadev/triple-frontend/pull/2390)
### chat, core-elements, react-contexts
- 더 적절한 의존성 사용 [#2389](https://github.com/titicacadev/triple-frontend/pull/2389)
### modal
- 설치유도팝업 TransitionType에 loungeHome을 추가합니다. [#2392](https://github.com/titicacadev/triple-frontend/pull/2392)
### triple-header
- layout shift 를 개선합니다. [#2391](https://github.com/titicacadev/triple-frontend/pull/2391)
### view-utilities
- public route list에 /redirect를 제거하고 /benefit을 추가합니다. [#2396](https://github.com/titicacadev/triple-frontend/pull/2396)
## 12.4.0
### common
- 리뷰, 푸터, 설치/로그인 유도 팝업에 적용된 이벤트 로깅 로직을 수정합니다. [#2354](https://github.com/titicacadev/triple-frontend/pull/2354)
### footer
- Award 푸터를 추가합니다. [#2375](https://github.com/titicacadev/triple-frontend/pull/2375)
### listing-filter, review
- ui-renewal 디자인 개선사항을 수정합니다. [#2378](https://github.com/titicacadev/triple-frontend/pull/2378)
### public-header
- 라운지 홈 공통헤더를 추가합니다. [#2342](https://github.com/titicacadev/triple-frontend/pull/2342)
## 12.3.0
### action-sheet
- pointer-events css 추가 [#2380](https://github.com/titicacadev/triple-frontend/pull/2380)
### action-sheet, modals
- underlayProps, overlayProps, FocusScope 위치 변경 [#2370](https://github.com/titicacadev/triple-frontend/pull/2370)
### poi-detail
- POI 상세페이지에서 사용되는 Actions 컴포넌트 하단 HR1 너비를 수정합니다. [#2372](https://github.com/titicacadev/triple-frontend/pull/2372)
### review
- 댓글 개수를 표시할 때 pinned message도 포함하여 표시합니다. [#2373](https://github.com/titicacadev/triple-frontend/pull/2373)
### triple-header
- 트리플헤더를 추가합니다. [#2329](https://github.com/titicacadev/triple-frontend/pull/2329)
### view-utilities
- parsedQuery의 특정 key 값을 추출하는 함수를 생성합니다. [#2368](https://github.com/titicacadev/triple-frontend/pull/2368)
## 12.2.1
### action-sheet, modals
- @react/aria에서 리랜더를 유발하는 usePreventScroll 제거 [#2363](https://github.com/titicacadev/triple-frontend/pull/2363)
## 12.2.0
### action-sheet
- 액션시트 열고 닫히는 transition이 일부 브라우저에서 layout shift 되지 않도록 수정 [#2358](https://github.com/titicacadev/triple-frontend/pull/2358)
### common
- CI 속도 개선 [#2340](https://github.com/titicacadev/triple-frontend/pull/2340)
- CD workflow 에러 수정 [#2351](https://github.com/titicacadev/triple-frontend/pull/2351)
- css prop과 centered prop이 충돌하는 문제 수정 [#2352](https://github.com/titicacadev/triple-frontend/pull/2352)
### core-elements
- story title을 소문자로 변경 [#2345](https://github.com/titicacadev/triple-frontend/pull/2345)
- ConfirmSelector 디자인 수정 [#2359](https://github.com/titicacadev/triple-frontend/pull/2359)
- Rating 컴포넌트에 최대값,최소값 설정 추가 [#2364](https://github.com/titicacadev/triple-frontend/pull/2364)
### modals
- modal handler onClose 실행 분기문 이전 버전과 동일하게 변경 [#2347](https://github.com/titicacadev/triple-frontend/pull/2347)
### poi-detail
- Actions 스토리가 빌드마다 변경되는 현상 수정 [#2346](https://github.com/titicacadev/triple-frontend/pull/2346)
### view-utilities
- public route list에 `/redirect`를 추가합니다. [#2355](https://github.com/titicacadev/triple-frontend/pull/2355)
## 12.1.1
### action-sheet
- 액션시트 아이템의 클릭 이벤트 조건을 수정합니다. [#2338](https://github.com/titicacadev/triple-frontend/pull/2338)
## 12.1.0
### common
- i18n translation key에 한국어 fallback을 추가합니다 [#2332](https://github.com/titicacadev/triple-frontend/pull/2332)
### chat
- 초기 메시지가 prop으로 있을 경우 api 호출하지 않도록 수정 [#2331](https://github.com/titicacadev/triple-frontend/pull/2331)
## 12.0.0 (ui-renewal)
### common
- Storybook을 root에서 빌드 [#2189](https://github.com/titicacadev/triple-frontend/pull/2189)
- css prop 추가 [#2153](https://github.com/titicacadev/triple-frontend/pull/2153)
- Global css prop 사용 [#2284](https://github.com/titicacadev/triple-frontend/pull/2284)
- global-style 개선 [#2194](https://github.com/titicacadev/triple-frontend/pull/2194)
- color-palette 대신 css variable 사용 [#2280](https://github.com/titicacadev/triple-frontend/pull/2280)
- Compounded 컴포넌트(Subcomponent)를 고유의 컴포넌트로 분리 [#2303](https://github.com/titicacadev/triple-frontend/pull/2303)
- build:ci 스크립트 제거 [#2276](https://github.com/titicacadev/triple-frontend/pull/2276)
- peer dependencies 수정 [#2286](https://github.com/titicacadev/triple-frontend/pull/2286)
### action-sheet
ActionSheet
- ActionSheet 컴포넌트 접근성 개선 [#2229](https://github.com/titicacadev/triple-frontend/pull/2229)
- Portal에 렌더합니다.
- ESC 버튼을 누르면 액션시트를 닫습니다.
- 외부의 오버레이를 누르면 액션시트를 닫습니다.
- 키보드를 사용한 포커스는 액션시트 내부에서만 이동합니다. 액션시트가 닫히면 이전의 포커스로 되돌아 갑니다.
- (Breaking Change) 액션시트 내에서 발생한 이벤트가 버블링 되도록 변경되었습니다.
- (Breaking Change) export default가 제거되었습니다. [#2281](https://github.com/titicacadev/triple-frontend/pull/2281)
### chat
- triple-chat-frontend를 기반으로 chat widget component를 생성합니다. [#2246](https://github.com/titicacadev/triple-frontend/pull/2246)
### core-elements
Accordion
- 접근성을 개선합니다. [#2217](https://github.com/titicacadev/triple-frontend/pull/2217)
- (Breaking Change) Context를 사용해서 active prop을 각자 서브 컴포넌트마다 전달하지 않고 상위 Accordion 컴포넌트에만 전달할 수 있도록 변경합니다.
Button
- 리팩토링 [#2264](https://github.com/titicacadev/triple-frontend/pull/2264)
Checkbox
- Checkbox, CheckboxGroup 컴포넌트가 새로 추가되었습니다. [#2239](https://github.com/titicacadev/triple-frontend/pull/2239)
- 선택된 모양을 이미지 대신 svg로 그리도록 변경합니다.
- `variant?: 'square' | 'rounded'` prop을 추가합니다. (기본값 'square')
ConfirmSelector
- 리팩토링 [#2251](https://github.com/titicacadev/triple-frontend/pull/2251)
- 기존의 prop중에 안 쓰이거나 사실상 필요 없는 것들을 제거했습니다. `placeholder, textAlign, borderless, fillType, error, padding`
FormField
- withField hoc를 대체할 FormField 컴포넌트 추가 [#2257](https://github.com/titicacadev/triple-frontend/pull/2257)
GenderSelector
- 리팩토링 [#2253](https://github.com/titicacadev/triple-frontend/pull/2253)
Input
- 접근성을 개선합니다. [#2274](https://github.com/titicacadev/triple-frontend/pull/2274)
- (Breaking Change) onChange 두번째 파라미터 value를 제거합니다.
NumericSpinner
- 접근성을 개선합니다. [#2250](https://github.com/titicacadev/triple-frontend/pull/2250)
Portal
- Portal 컴포넌트를 추가합니다. [#2228](https://github.com/titicacadev/triple-frontend/pull/2228)
Radio
- 접근성을 개선합니다. [#2235](https://github.com/titicacadev/triple-frontend/pull/2235)
- RadioGroup 컴포넌트가 새로 추가되었습니다.
- 선택된 모양을 이미지 대신 css로 그리도록 변경합니다.
Select
- Select 컴포넌트 접근성 개선 [#2259](https://github.com/titicacadev/triple-frontend/pull/2259)
Tabs
- Tabs 컴포넌트 접근성 개선 [#2270](https://github.com/titicacadev/triple-frontend/pull/2270)
- (Breaking Change) 접근성 지원을 위해 Tabs 컴포넌트 사용 방법이 변경되었습니다.
- `TabList`, `Tab`, `TabPanel` 서브 컴포넌트를 추가했습니다. 이 서브 컴포넌트들로 탭을 구성해야 합니다.
- `options` prop을 제거하고 children을 사용하도록 합니다.
- prop 이름을 변경합니다. `type` -> `variant`
- onChange prop의 첫번쨰 파라미터 `event`를 제거합니다.
- 키보드 포커스를 지원합니다.
- table 대신 flex css를 사용하도록 변경합니다.
TextArea
- 접근성을 개선합니다. [#2268](https://github.com/titicacadev/triple-frontend/pull/2268)
Tooltip
- [core-elements] Tooltip 컴포넌트에 role="tooltip" 추가 [#2271](https://github.com/titicacadev/triple-frontend/pull/2271)
### modals
- Modal 컴포넌트 접근성 개선 [#2228](https://github.com/titicacadev/triple-frontend/pull/2228)
- Portal에 렌더합니다.
- Body, Title, Description 서브 컴포넌트를 추가합니다.
- ESC 버튼을 누르면 모달을 닫습니다.
- 외부의 오버레이를 누르면 모달을 닫습니다.
- 키보드를 사용한 포커스는 모달 내부에서만 이동합니다. 모달이 닫히면 이전의 포커스로 되돌아 갑니다.
### slider
SingleSlider, RangeSlider
- 접근성 개선 [#2273](https://github.com/titicacadev/triple-frontend/pull/2273)
## 11.1.0
### react-contexts
- 웹 로그아웃 시 401 응답도 정상적으로 처리하도록 합니다. [#2313](https://github.com/titicacadev/triple-frontend/pull/2313)
## 11.0.0
### common
- TF에 국제화를 도입합니다. [#2232](https://github.com/titicacadev/triple-frontend/pull/2232)
## 10.4.0
### triple-document
- regions element의 바로가기 버튼 위치를 조정합니다. [#2291](https://github.com/titicacadev/triple-frontend/pull/2291)
### footer
- 회사 소개 영역을 제거합니다. [#2285](https://github.com/titicacadev/triple-frontend/pull/2285)
### web-storage, poi-detail
- web-storage 오류 처리 함수 추가 [#2266](https://github.com/titicacadev/triple-frontend/pull/2266)
## 10.3.0
### app-installation-cta
- 배너 CTA의 Dimmed 영역을 제거합니다. [#2265](https://github.com/titicacadev/triple-frontend/pull/2265)
- 플로팅 버튼의 디자인을 리뉴얼합니다. [#2262](https://github.com/titicacadev/triple-frontend/pull/2262)
## 10.2.1
### core-elements
- 블랙프라이데이 대응을 위한 블랙색상 레이블을 추가합니다. [#2260](https://github.com/titicacadev/triple-frontend/pull/2260)
## 10.2.0
### react-contexts
- [react-contexts] checkIfReviewed 에러 로깅에 정보 추가 [#2245](https://github.com/titicacadev/triple-frontend/pull/2245)
### core-elements, image-carousel, review
- 비디오 자동재생 문제 해결 [#2244](https://github.com/titicacadev/triple-frontend/pull/2244)
### poi-detail
- 리뷰 쓰기 영역에 툴팁 추가 [#2240](https://github.com/titicacadev/triple-frontend/pull/2240)
### common
- [Fix] prettier 명령어를 js,ts,tsx도 검사하도록 수정합니다. [#2236](https://github.com/titicacadev/triple-frontend/pull/2236)
## 10.1.0
### common
- Update dependency @swc/core to v1.3.10 [#2225](https://github.com/titicacadev/triple-frontend/pull/2225)
- v9 to v10 마이그레이션 문서 추가 [#2221](https://github.com/titicacadev/triple-frontend/pull/2221)
- Update dependency @sentry/nextjs to v7.16.0 [#2219](https://github.com/titicacadev/triple-frontend/pull/2219)
### react-contexts
- 세션 고정 방지 기능 추가 [#2223](https://github.com/titicacadev/triple-frontend/pull/2223)
## 10.0.1
### triple-document
- 디폴트 이미지 컨테이너 설정 [#2224](https://github.com/titicacadev/triple-frontend/pull/2224)
## 10.0.0
### common
- nothing-to-commit 에러를 무시합니다. [#2216](https://github.com/titicacadev/triple-frontend/pull/2216)
### react-context
- firebase v9 업그레이드 [#2202](https://github.com/titicacadev/triple-frontend/pull/2202)
## 9.7.0
### core-element
- tabs에 rounded-tab 추가합니다. [#2200](https://github.com/titicacadev/triple-frontend/pull/2200)
## 9.6.1
### common
- renovate-pr-fix GHA에서 TRIPLE_BOT_GITHUB_TOKEN를 사용하여 트리거합니다. [#2178](https://github.com/titicacadev/triple-frontend/pull/2178)
### triple-document
- 아티클 어드민에 사용되는 이미지 가로배열(default) margin props 누락 수정 [#2184](https://github.com/titicacadev/triple-frontend/pull/2184)
## 9.6.0
### triple-document
- 어드민 페이지 이미지 분할 기능 [#2134](https://github.com/titicacadev/triple-frontend/pull/2134)
### core-elements, reviews, image-carousel, poi-detail
- 동영상 리뷰 지원 [#2142](https://github.com/titicacadev/triple-frontend/pull/2142)
### constants
- PASSPORT_NUMBER_REGEX를 15개로 고정 [2144](https://github.com/titicacadev/triple-frontend/pull/2144)
## 9.5.0
### modals
- TransitionModal props에 action click optional props를 추가합니다. [#2121](https://github.com/titicacadev/triple-frontend/pull/2121)
### common
- update dependency @swc/core to v1.2.244 [#2119](https://github.com/titicacadev/triple-frontend/pull/2119)
## 9.4.0
### common
- pin dependency typescript to v4.3.5 [#2114](https://github.com/titicacadev/triple-frontend/pull/2114)
- update dependency @swc/core to v1.2.241 [#2111](https://github.com/titicacadev/triple-frontend/pull/2111)
- update dependency @sentry/nextjs to v7.11.1 [#2109](https://github.com/titicacadev/triple-frontend/pull/2109)
### triple-email-document
- 비율에 따라 이미지를 렌더링합니다. [#2104](https://github.com/titicacadev/triple-frontend/pull/2104)
## 9.3.0
### footer
- [footer] 대표자 변경: 김강세 --> 최휘영 [#2106](https://github.com/titicacadev/triple-frontend/pull/2106)
### i18n
- i18next triple-web-assets backend를 추가합니다. [#2102](https://github.com/titicacadev/triple-frontend/pull/2102)
## 9.2.0
### view-utilities
- AppsFlyer 파라미터 중 is_retargeting 값을 true로 설정합니다. [#2099](https://github.com/titicacadev/triple-frontend/pull/2099)
## 9.1.0
### common
- storybook 6.5로 업데이트 [#2094](https://github.com/titicacadev/triple-frontend/pull/2094)
### footer
- [footer] 사명 변경 [#2095](https://github.com/titicacadev/triple-frontend/pull/2095)
### public-header
- public-header props를 추가합니다. [#2097](https://github.com/titicacadev/triple-frontend/pull/2097)
## 9.0.3
### review
- graphql mutation을 수정합니다. [#2092](https://github.com/titicacadev/triple-frontend/pull/2092)
## 9.0.2
### review
- 리뷰 패키지 내 QueryProvider export를 제거합니다. [#2089](https://github.com/titicacadev/triple-frontend/pull/2089)
- Review 스키마의 badges 쿼리 및 타입을 수정하고 추가 디자인 QA를 적용합니다. [#2090](https://github.com/titicacadev/triple-frontend/pull/2090)
## 9.0.1
### review
- use-reviews 내 useQuery options을 수정합니다. [#2087](https://github.com/titicacadev/triple-frontend/pull/2087)
## 9.0.0
### common
- KOREAN_REGEX에서 "|"를 제거. [#2077](https://github.com/titicacadev/triple-frontend/pull/2077)
### map
- Mapview zoom이 제대로 잡히지 않는 오류를 수정합니다. [#2078](https://github.com/titicacadev/triple-frontend/pull/2078)
### core-elements
- input, textarea에 font 초기화 [#2081](https://github.com/titicacadev/triple-frontend/pull/2081)
### review
- 아키텍쳐 및 graphql 적용합니다. [#2079](https://github.com/titicacadev/triple-frontend/pull/2079)
- 최근방문한 리뷰를 구분하고 관련 내용을 추가합니다. [#2085](https://github.com/titicacadev/triple-frontend/pull/2085)
## 8.1.2
### ad-banners
- 이벤트 수집이 안되는 오류를 해결합니다. [#2075](https://github.com/titicacadev/triple-frontend/pull/2075)
## 8.1.1
### map
- 의도되지 않은 spinner를 제거합니다. [#2072](https://github.com/titicacadev/triple-frontend/pull/2072)
### triple-document
- StandardActionHandler 새 창 열기 기능에 필요한 props를 추가합니다. [#2071](https://github.com/titicacadev/triple-frontend/pull/2071)
## 8.1.0
### replies
- FixedBottom 컨테이너에 safeAreaInsetMixin을 추가합니다. [#2063](https://github.com/titicacadev/triple-frontend/pull/2063)
- 노출하는 댓글 갯수를 변경할 수 있도록 props를 추가합니다. [#2066](https://github.com/titicacadev/triple-frontend/pull/2066)
### triple-document
- images 요소의 이벤트 핸들러를 Override할 수 있도록 합니다. [#2065](https://github.com/titicacadev/triple-frontend/pull/2065)
### core-elements
- navbar title을 세로 중앙 정렬하기 위해 line-height를 활용합니다. [#2067](https://github.com/titicacadev/triple-frontend/pull/2067)
## 8.0.0
### common
- update dependency @swc/core to v1.2.192 [#2057](https://github.com/titicacadev/triple-frontend/pull/2057)
- update dependency @swc/core to v1.2.182 [#2051](https://github.com/titicacadev/triple-frontend/pull/2051)
- update internal packages [#2049](https://github.com/titicacadev/triple-frontend/pull/2049)
- 패키지 내 isomorphic-fetch를 제거하고 fetcher로 대체합니다. [#2045](https://github.com/titicacadev/triple-frontend/pull/2045)
### social-reviews
- ExternalLink의 imageUrl이 있을 때만 Image 노출 [#2060](https://github.com/titicacadev/triple-frontend/pull/2060)
- ExternalLinks 컴포넌트 구현 [#2054](https://github.com/titicacadev/triple-frontend/pull/2054)
### react-contexts
- images-context 내 images를 가져오는 fetch부분을 수정합니다. [#2058](https://github.com/titicacadev/triple-frontend/pull/2058)
### triple-email-document
- element를 수정하고, component를 제거합니다. [#2056](https://github.com/titicacadev/triple-frontend/pull/2056)
### standard-action-handler
- 스크롤 액션을 추가합니다. [#2055](https://github.com/titicacadev/triple-frontend/pull/2055)
### scroll-to-element
- 스크롤 액션을 관리하는 패키지를 추가합니다. [#2053](https://github.com/titicacadev/triple-frontend/pull/2053)
## 7.5.0
### common
- update dependency next to v12.1.6 [#2047](https://github.com/titicacadev/triple-frontend/pull/2047)
- update dependency @swc/core to v1.2.174 [#2046](https://github.com/titicacadev/triple-frontend/pull/2046)
### triple-email-document
- elements를 확장합니다. [#2039](https://github.com/titicacadev/triple-frontend/pull/2039)
### poi-detail
- 운영시간, 휴무일을 조건에 따라 렌더링합니다. [#2031](https://github.com/titicacadev/triple-frontend/pull/2031)
## 7.4.0
### common
- update dependency next to v12.1.5 [#2029](https://github.com/titicacadev/triple-frontend/pull/2029)
- update dependency @sentry/nextjs to v6.19.7 [#2037](https://github.com/titicacadev/triple-frontend/pull/2037)
- update internal packages to v4.17.0 [#2028](https://github.com/titicacadev/triple-frontend/pull/2028)
- update dependency @swc/core to v1.2.173 [#2042](https://github.com/titicacadev/triple-frontend/pull/2042)
- update dependency @swc/core to v1.2.172 [#2034](https://github.com/titicacadev/triple-frontend/pull/2034)
- update dependency @swc/core to v1.2.168 [#2033](https://github.com/titicacadev/triple-frontend/pull/2033)
### date-picker
- day-picker의 fromMonth, toMonth가 동작되도록 수정 [#2036](https://github.com/titicacadev/triple-frontend/pull/2036)
### react-context
- notifyReviewDeleted 중복 호출 제거 [#2041](https://github.com/titicacadev/triple-frontend/pull/2041)
### poi-detail
- areas, vicinity deprecated 처리, areaName 추가 [#2035](https://github.com/titicacadev/triple-frontend/pull/2035)
### react-triple-cliend-interfaces
- web-to-native-interfaces 모듈을 peerDependencies로 설정 [#2040](https://github.com/titicacadev/triple-frontend/pull/2040)
## 7.3.0
### color-palette
- red50 color 추가 [#2030](https://github.com/titicacadev/triple-frontend/pull/2030)
### core-elements
- global style 에 red50 color 추가 [#2030](https://github.com/titicacadev/triple-frontend/pull/2030)
## 7.2.0
### common
- turborepo 추가 [#2011](https://github.com/titicacadev/triple-frontend/pull/2011)
- codecov patch check를 끕니다. [#2026](https://github.com/titicacadev/triple-frontend/pull/2026)
- Chromatic 변경 사항에서 오늘 날짜 제외 [#2017](https://github.com/titicacadev/triple-frontend/pull/2017)
- Update Internal Packages to v4.16.0 [#2020](https://github.com/titicacadev/triple-frontend/pull/2020)
- Update SWC Packages [#2013](https://github.com/titicacadev/triple-frontend/pull/2013)
- update dependency @swc/core to v1.2.165 [#2023](https://github.com/titicacadev/triple-frontend/pull/2023)
- update dependency next to v12.1.4 [#2016](https://github.com/titicacadev/triple-frontend/pull/2016)
- update dependency @sentry/nextjs to v6.19.6 [#2000](https://github.com/titicacadev/triple-frontend/pull/2000)
### triple-document
- Tna Slot에 셀프패키지 노출 [#2024](https://github.com/titicacadev/triple-frontend/pull/2024)
### replies
- 입력창을 화면 최하단에 고정하는 props를 추가합니다. [#2014](https://github.com/titicacadev/triple-frontend/pull/2014)
## 7.1.0
### common
- Update dependency @swc/core to v1.2.159 [#2012](https://github.com/titicacadev/triple-frontend/pull/2012)
### user-verification
- Docs의 오타를 수정합니다. [#2019](https://github.com/titicacadev/triple-frontend/pull/2019)
- External promotion에 대응 가능하도록 인터페이스를 확장합니다. [#2018](https://github.com/titicacadev/triple-frontend/pull/2018)
### triple-document
- 타이머 기능 그룹 다운로드 버튼에 적용 [#2015](https://github.com/titicacadev/triple-frontend/pull/2015)
## 7.0.0
### common
- Update dependency @sentry/nextjs to v6.18.1 [#1966](https://github.com/titicacadev/triple-frontend/pull/1966)
- Update dependency @swc/core to v1.2.148 [#1975](https://github.com/titicacadev/triple-frontend/pull/1975)
- Update titicacadev/triple-content packages to v4.13.0 [#1976](https://github.com/titicacadev/triple-frontend/pull/1976)
- npm 버전 8.5이상으로 강제하고 node version을 17.7.0으로 변경합니다. [#2004](https://github.com/titicacadev/triple-frontend/pull/2004)
### Package별 ESLint 활성화
- eslint-config-triple v3의 점진적 적용을 위해 린트 검사를 비활성화했던 패키지 중 남은 25개 package에 대해 린팅을 적용하여 활성화를 완료합니다. 네이밍 컨벤션이나 no-any 규칙을 수정하면서 발생한 Breaking Change를 포함합니다. (changes on public-header, poi-detail, intersection-observer, scrap-button, style-box, type-definitions, react-hooks, web-storage, listing-filter, static-page-contents, poi-list-elements, form, ab-experiments, app-banner, slider, search, recommended-contents, pricing, app-installation-cta, image-carousel, hub-form, content-sharing, author, action-sheet, i18n) [#1755](https://github.com/titicacadev/triple-frontend/issues/1755)
### react-triple-client-interfaces 적용
- react-triple-client-interfaces 패키지로 웹-앱 동작을 분기합니다.
- public-header [#1898](https://github.com/titicacadev/triple-frontend/pull/1898)
- router [#2002](https://github.com/titicacadev/triple-frontend/pull/2002)
- poi-detail [#2005](https://github.com/titicacadev/triple-frontend/pull/2005)
- ui-flow [#2007](https://github.com/titicacadev/triple-frontend/pull/2007)
- review, directions-finder, loction-properties [#2008](https://github.com/titicacadev/triple-frontend/pull/2008)
### standard-action-handler
- standard-action-handler Hook을 생성합니다. [#1967](https://github.com/titicacadev/triple-frontend/pull/1967)
### replies
- 입력창의 오류를 해결합니다. [#1972](https://github.com/titicacadev/triple-frontend/pull/1972)
## 6.4.0
### common
- codecov 컨픽을 추가하고 threshold을 조금 느슨하게 설정 [#1958](https://github.com/titicacadev/triple-frontend/pull/1958)
- TF 패키지 내 react 참조를 제거합니다. [#1959](https://github.com/titicacadev/triple-frontend/pull/1959)
- 구버전 클라이언트 대응 분기(semver)를 제거합니다. [#1960](https://github.com/titicacadev/triple-frontend/pull/1960)
### resource-list-element
- ExtendedResourceListElement의 가변 높이를 보장하도록 수정합니다. [#1968](https://github.com/titicacadev/triple-frontend/pull/1968)
### triple-document
- 쿠폰 발급 시각 타이머 적용 [#1961](https://github.com/titicacadev/triple-frontend/pull/1961)
### user-verification
- 인증여부 확인 API 경로를 변경합니다. [#1963](https://github.com/titicacadev/triple-frontend/pull/1963)
### triple-fallback-action
- 서버에서 useLayoutEffect를 호출하지 않도록 변경 [#1955](https://github.com/titicacadev/triple-frontend/pull/1955)
### replies
- 답글이 달려있는 댓글 삭제 시 액션시트를 비활성화 합니다. [#1937](https://github.com/titicacadev/triple-frontend/pull/1937)
- 이전 댓글 더보기 렌더링 조건을 수정합니다. [#1944](https://github.com/titicacadev/triple-frontend/pull/1944)
- 입력창의 placeholder를 수정합니다. [#1948](https://github.com/titicacadev/triple-frontend/pull/1948)
- 답글을 생성 시간 기준으로 오름차순 정렬합니다. [#1949](https://github.com/titicacadev/triple-frontend/pull/1949)
- 불필요한 코드를 제거합니다. [#1953](https://github.com/titicacadev/triple-frontend/pull/1953)
- 프로필 및 멘션을 클릭했을 때, 액션을 추가합니다. [#1970](https://github.com/titicacadev/triple-frontend/pull/1970)
- 답글이 달려있는 댓글을 삭제할 때, 답글 순서가 바뀌는 오류를 수정합니다. [#1952](https://github.com/titicacadev/triple-frontend/pull/1952)
### standard-action-handler
- 새창열기 기능 추가 [#1939](https://github.com/titicacadev/triple-frontend/pull/1939)
- 이미지 다운로드 기능 추가 [#1951](https://github.com/titicacadev/triple-frontend/pull/1951)
## 6.3.0
### view-utilities
- makeDeepLinkGenerator가 지원하는 옵션을 확장합니다. [#1940](https://github.com/titicacadev/triple-frontend/pull/1940)
### triple-fallback-action
- Triple Fallback Action 패키지 추가 [#1935](https://github.com/titicacadev/triple-frontend/pull/1935)
### meta-tags
- CommonMeta에 manifest link 엘리먼트 추가 [#1933](https://github.com/titicacadev/triple-frontend/pull/1933)
### react-triple-client-interfaces
- App과 AppName을 외부로 노출 [#1931](https://github.com/titicacadev/triple-frontend/pull/1931)
### triple-email-template
- React 참조 코드를 제거합니다. [#1936](https://github.com/titicacadev/triple-frontend/pull/1936)
- FullEmailTemplate를 추가합니다. [#1929](https://github.com/titicacadev/triple-frontend/pull/1929)
### replies
- 삭제 완료 toast를 렌더링합니다. [#1943](https://github.com/titicacadev/triple-frontend/pull/1943)
- 액션시트 타이틀을 수정합니다. [#1942](https://github.com/titicacadev/triple-frontend/pull/1942)
- 닉네임이 9자 이상일 때, 말줄임표로 표기합니다. [#1934](https://github.com/titicacadev/triple-frontend/pull/1934)
- 비로그인 상태일 때, 로그인 유도 모달 노출 [#1927](https://github.com/titicacadev/triple-frontend/pull/1927)
## 6.2.1
### modal
- 업데이트된 session-context를 반영하여 README를 수정합니다. [#1928](https://github.com/titicacadev/triple-frontend/pull/1928)
### map
- FocusTracker에 activeAutoZoom props을 추가합니다. [#1926](https://github.com/titicacadev/triple-frontend/pull/1926)
## 6.2.0
### core-elements
- gap props추가 [#1916](https://github.com/titicacadev/triple-frontend/pull/1916)
### map
- PoiDotMarker의 props, type 및 CircleMarker의 type 등을 export 합니다. [#1917](https://github.com/titicacadev/triple-frontend/pull/1917)
### router
- LocalLink, ExternalLink 내용 보충 [#1911](https://github.com/titicacadev/triple-frontend/pull/1911)
### triple-email-document
- Migration에 필요한 Type을 내보내고, Color 표현을 수정합니다. [#1923](https://github.com/titicacadev/triple-frontend/pull/1923)
- Text Element를 최신화합니다. [#1924](https://github.com/titicacadev/triple-frontend/pull/1924)
- Footer, Preview를 추가합니다. [#1919](https://github.com/titicacadev/triple-frontend/pull/1919)
- triple-email-document 관련 storybook 코드를 추가합니다. [#1903](https://github.com/titicacadev/triple-frontend/pull/1903)
- 패키지를 추가합니다. [#1895](https://github.com/titicacadev/triple-frontend/pull/1895)
### standard-action-handler
- Standard Action Handler ReadMe 작성 [#1912](https://github.com/titicacadev/triple-frontend/pull/1912)
## 6.1.1
### map
- FlexibleMarker의 content type을 수정합니다. [#1906](https://github.com/titicacadev/triple-frontend/pull/1906)
## 6.1.0
### common
- 스크립트 위치를 scripts/ 디렉토리로 통일합니다. make-test-tsconfig에서 패키지 목록을 만드는 로직을 개선합니다 [#1891](https://github.com/titicacadev/triple-frontend/pull/1891)
- v6 마이그레이션 가이드에 map 패키지 내용을 수정합니다 [#1896](https://github.com/titicacadev/triple-frontend/pull/1896)
- v6 마이그레이션 가이드에 react-triple-client-interfaces에 대응하는 내용을 추가합니다 [#1890](https://github.com/titicacadev/triple-frontend/pull/1890)
- v6 마이그레이션 가이드에 누락된 map 패키지 내용을 작성합니다 [#1892](https://github.com/titicacadev/triple-frontend/pull/1892)
- v6 마이그레이션 가이드에 누락된 내용을 채웁니다 [#1889](https://github.com/titicacadev/triple-frontend/pull/1889)
### poi-detail
- PoiDetail 의 NoteContainer 수정으로 인해 생겼던 버그를 수정합니다 [#1900](https://github.com/titicacadev/triple-frontend/pull/1900)
### replies
- 새로고침 이슈를 해결합니다 [#1872](https://github.com/titicacadev/triple-frontend/pull/1872)
### map
- flexibleMarker에 누락된 props을 추가합니다 [#1904](https://github.com/titicacadev/triple-frontend/pull/1904)
- 패키지의 README를 수정합니다 [#1896](https://github.com/titicacadev/triple-frontend/pull/1896)
## 6.0.0
### common
- 실패 알림을 보내는 step이 job이 실패했을 때 실행되도록 처리 [#1882](https://github.com/titicacadev/triple-frontend/pull/1882)
- package 별 누락된 dependencies 추가 [#1881](https://github.com/titicacadev/triple-frontend/pull/1881)
- CI 워크플로의 job을 정리합니다 [#1880](https://github.com/titicacadev/triple-frontend/pull/1880)
- npm script 정리 [#1878](https://github.com/titicacadev/triple-frontend/pull/1878)
- 패키지별 package.json을 표준화합니다 [#1870](https://github.com/titicacadev/triple-frontend/pull/1870)
- Sentry 패키지 의존성을 정리합니다 [#1856](https://github.com/titicacadev/triple-frontend/pull/1856)
- Storybook 패키지 최신 버전 설치 [#1858](https://github.com/titicacadev/triple-frontend/pull/1858)
- Create LICENSE [#1840](https://github.com/titicacadev/triple-frontend/pull/1840/files)
- Storybook 주소를 갱신합니다 [#1839](https://github.com/titicacadev/triple-frontend/pull/1839/files)
### poi-detail
- image-carousel 내부의 노트 컴포넌트를 수정합니다 [#1874](https://github.com/titicacadev/triple-frontend/pull/1874)
### router
- LocalLink, ExternalLink가 앵커 태그를 직접 렌더링하도록 변경합니다 [#1873](https://github.com/titicacadev/triple-frontend/pull/1873)
### user-verification
- react-triple-client-interfaces를 이용합니다 [#1871](https://github.com/titicacadev/triple-frontend/pull/1871)
### replies
- 댓글&답글에 신고하기 기능을 추가합니다 [#1838](https://github.com/titicacadev/triple-frontend/pull/1838)
- 댓글&답글 좋아요 반응 기능을 추가합니다 [#1845](https://github.com/titicacadev/triple-frontend/pull/1845)
### react-triple-client-interfaces
- router의 app-bridge를 이전합니다 [#1875](https://github.com/titicacadev/triple-frontend/pull/1875)
- useTripleClientFeatureFlag 훅을 추가합니다 [#1866](https://github.com/titicacadev/triple-frontend/pull/1866)
- react-triple-client-interfaces 패키지를 추가합니다 [#1832](https://github.com/titicacadev/triple-frontend/pull/1832)
### ui-flow
- ui-flow 디렉토리의 ESLint 검사를 활성화합니다 [#1857](https://github.com/titicacadev/triple-frontend/pull/1857)
### core-elements
- core-elements 디렉토리의 ESLint, Stylelint 검사를 활성화합니다 [#1850](https://github.com/titicacadev/triple-frontend/pull/1850)
### app-installation-cta
- 배너 CTA 오버레이 클릭시, 해당 배너가 닫히도록 합니다 [#1847](https://github.com/titicacadev/triple-frontend/pull/1847)
### triple-document
- triple-doucment의 불필요한 영역의snapshot을 ignore합니다 [#1844](https://github.com/titicacadev/triple-frontend/pull/1844)
### ad-banners
- ad-banners의 ListDirection enum의 멤버 네이밍 변경 [#1787](https://github.com/titicacadev/triple-frontend/pull/1787)
### map
- 오버레이 컴포넌트들을 정리합니다 [#1865](https://github.com/titicacadev/triple-frontend/pull/1865)
- Map 구조 변경 및 기능을 추가합니다 [#1831](https://github.com/titicacadev/triple-frontend/pull/1831)
- Map 디렉토리의 ESLint 검사를 활성화하고 오류를 수정합니다 [#1841](https://github.com/titicacadev/triple-frontend/pull/1841)
### modals
- login CTA 모달 관련 네이밍을 변경합니다 [#1791](https://github.com/titicacadev/triple-frontend/pull/1791)
### fetcher
- fetcher 패키지의 일부 인터페이스 이름 변경 [#1767](https://github.com/titicacadev/triple-frontend/pull/1767)
### footer
- CSFooter 컴포넌트 및 관련 코드 제거 [#1807](https://github.com/titicacadev/triple-frontend/pull/1807)
### react-contexts
- user-agent-context의 isPublic과 app 속성에 deprecation notice를 추가합니다[#1863](https://github.com/titicacadev/triple-frontend/pull/1863)
- useHistoryContext 제거 [#1834](https://github.com/titicacadev/triple-frontend/pull/1834)
- useURIHash -> useUriHash [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- HistoryProvider의 prop 이름 변경: loginCTAModalHash -> loginCtaModalHash [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- HashStrategy의 멤버 네이밍 변경 [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- GAParams -> GoogleAnalyticsParams [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- FAParams -> FirebaseAnalyticsParams [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- withUTMContext -> withUtmContext [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- WithUTMContextBaseProps -> WithUtmContextBaseProps [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- useUTMContext -> useUtmContext [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- UTMProvider -> UtmProvider [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
- extractUTMContextFromQuery -> extractUtmContextFromQuery [#1798](https://github.com/titicacadev/triple-frontend/pull/1798)
## 5.2.1
### router
- useNavigate 훅으로 특정 URL을 라우팅하지 못하는 문제를 수정합니다. [#1836](https://github.com/titicacadev/triple-frontend/pull/1836)
### react-hooks
- scrollToElement의 props을 수정합니다. [#1833](https://github.com/titicacadev/triple-frontend/pull/1833)
### view-utilities
- 앱스플라이어 UTM 파라미터 규칙을 수정합니다. [#1827](https://github.com/titicacadev/triple-frontend/pull/1827)
## 5.2.0
### ad-banners
- router 패키지 의존성 추가 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
- history-context의 `navigate` 대신 router 패키지의 `useNavigate` 사용 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
### booking-completion
- router 패키지 의존성 추가 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
- history-context의 `navigate` 대신 router 패키지의 `useNavigate` 사용 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
### footer
- router 패키지 의존성 추가 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
- history-context의 `navigate` 대신 router 패키지의 `useNavigate` 사용 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
### nearby-pois
- router 패키지 의존성 추가 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
- history-context의 `navigate` 대신 router 패키지의 `useNavigate` 사용 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
### replies
- replies 디렉토리의 ESLint 검사를 활성화하고 오류를 수정합니다. [#1810](https://github.com/titicacadev/triple-frontend/pull/1810)
- 댓글/답글 삭제하기 기능을 추가합니다. [#1761](https://github.com/titicacadev/triple-frontend/pull/1761)
### review
- router 패키지 의존성 추가 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
- history-context의 `navigate` 대신 router 패키지의 `useNavigate` 사용 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
### router
- router 패키지의 link 모듈을 제거합니다. [#1828](https://github.com/titicacadev/triple-frontend/pull/1828)
- 앱 전용 쿼리를 inlink일 때만 사용하도록 변경 [#1816](https://github.com/titicacadev/triple-frontend/pull/1816)
- router 패키지에 라우터 훅 함수를 구현 [#1703](https://github.com/titicacadev/triple-frontend/pull/1703)
### scroll-spy
- scroll-spy 패키지를 추가합니다. [#1803](https://github.com/titicacadev/triple-frontend/pull/1803)
### social-reviews
- router 패키지 의존성 추가 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
- history-context의 `navigate` 대신 router 패키지의 `useNavigate` 사용 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
### standard-action-handler
- 텍스트 복사 기능을 추가합니다. [#1813](https://github.com/titicacadev/triple-frontend/pull/1813)
### triple-document
- router 패키지 의존성 추가 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
- history-context의 `navigate` 대신 router 패키지의 `useNavigate` 사용 [#1800](https://github.com/titicacadev/triple-frontend/pull/1800)
### user-verification
- use-user-verification 테스트 과정에서 발생하는 워닝 제거 [#1818](https://github.com/titicacadev/triple-frontend/pull/1818)
- triple-frontend에서 사용하는 openWindow를 router 함수로 대체합니다. [#1814](https://github.com/titicacadev/triple-frontend/pull/1814)
### view-utilities
- moment 의존성 수정 및 date format이 영어로 표기되는 문제를 fix합니다. [#1824](https://github.com/titicacadev/triple-frontend/pull/1824)
- 항공 기획전, 투어티켓 기획전 라우터 추가 [#1815](https://github.com/titicacadev/triple-frontend/pull/1815)
### integration-test
- router 패키지와 modals 패키지의 상호작용을 테스트하는 코드를 추가합니다. 이를 위해 "integration-test" 패키지를 추가합니다. [#1825](https://github.com/titicacadev/triple-frontend/pull/1825)
### Etc.
- storybook 배포 제거 [#1817](https://github.com/titicacadev/triple-frontend/pull/1817)
## 5.1.2
### ESLint 검사
- user-verification 디렉토리의 ESLint 검사를 활성화하고 오류를 수정합니다. [#1809](https://github.com/titicacadev/triple-frontend/pull/1809)
### common
- 마이그레이션 문서에 v1 to v2 문서 링크 추가 [#1808](https://github.com/titicacadev/triple-frontend/pull/1808)
### router
- default alert을 추가합니다. [#1806](https://github.com/titicacadev/triple-frontend/pull/1806)
## 5.1.1
### fetcher
- request의 body 타입을 "unknown"으로 완화 [#1802](https://github.com/titicacadev/triple-frontend/pull/1802)
### ESLint 검사
- react-contexts [#1797](https://github.com/titicacadev/triple-frontend/pull/1797)
- docs [#1801](https://github.com/titicacadev/triple-frontend/pull/1801)
## 5.1.0
### ESLint 검사
- triple-document 디렉토리 ESLint 검사 활성화 및 린트 오류 수정 [#1795](https://github.com/titicacadev/triple-frontend/pull/1795)
- standard-action-handler 디렉토리 ESLint 검사 활성화 및 린트 오류 수정 [#1794](https://github.com/titicacadev/triple-frontend/pull/1794)
- review 디렉토리 ESLint 오류 수정 [#1793](https://github.com/titicacadev/triple-frontend/pull/1793)
- modals 디렉토리의 ESLint 검사 활성화 [#1790](https://github.com/titicacadev/triple-frontend/pull/1790)
- footer 디렉토리의 ESLint 검사를 활성화합니다. [#1788](https://github.com/titicacadev/triple-frontend/pull/1788)
- ad-banners 패키지의 ESLint 검사를 활성화합니다. [#1786](https://github.com/titicacadev/triple-frontend/pull/1786)
### fetcher
- 응답 형식을 수정합니다 [#1785](https://github.com/titicacadev/triple-frontend/pull/1785)
### router
- router 패키지에 useNavigate 훅을 추가합니다. [#1784](https://github.com/titicacadev/triple-frontend/pull/1784)
### date-picker
- RangePicker V2 컴포넌트를 생성합니다. [#1749](https://github.com/titicacadev/triple-frontend/pull/1749)
- RangePickerV2 작업 중, deprecated된 요소를 분리 합니다 [#1775](https://github.com/titicacadev/triple-frontend/pull/1775)
### common
- codecov를 연결합니다 [#1776](https://github.com/titicacadev/triple-frontend/pull/1776)
- PR 템플릿 업데이트 [#1773](https://github.com/titicacadev/triple-frontend/pull/1773)
## 5.0.1
### core-elements
- Select, Input의 css를 수정합니다. [#1762](https://github.com/titicacadev/triple-frontend/pull/1762)
## 5.0.0
### Breaking Changes
#### common
- deprecate된 환경 변수 prop을 제거합니다. [#1729](https://github.com/titicacadev/triple-frontend/pull/1729)
#### core-elements
- Text.Html/Text.WithRef 삭제 [#1747](https://github.com/titicacadev/triple-frontend/pull/1747)
#### react-contexts
- env context의 기본값 null로 설정 [#1731](https://github.com/titicacadev/triple-frontend/pull/1731)
- ab-experiment-context를 triple-ab-experiment-context로 이름 변경 후, ab-experiment 패키지로 이전합니다. [#1730](https://github.com/titicacadev/triple-frontend/pull/1730)
### New Features
#### common
- content-utilities 패키지 정리 [#1760](https://github.com/titicacadev/triple-frontend/pull/1760)
- Resolve lint errors of view-utilities package [#1758](https://github.com/titicacadev/triple-frontend/pull/1758)
- 수정할 린트 오류가 없는 패키지의 린트 검사를 활성화합니다. [#1757](https://github.com/titicacadev/triple-frontend/pull/1757)
- CI에서 빌드와 테스트 순서 변경 [#1748](https://github.com/titicacadev/triple-frontend/pull/1748)
- 타입 에러 해결 [#1746](https://github.com/titicacadev/triple-frontend/pull/1746)
- storybook이 타입 체크를 하는 옵션 추가 및 스토리북 파일의 타입 오류 수정 [#1743](https://github.com/titicacadev/triple-frontend/pull/1743)
- ts-jest를 설정하고, 실패하는 테스트를 수정합니다. [#1742](https://github.com/titicacadev/triple-frontend/pull/1742)
- eslint 오류 수정 과정에서 작업한 리팩토링 [#1738](https://github.com/titicacadev/triple-frontend/pull/1738)
- eslint-config-triple v3 적용 [#1737](https://github.com/titicacadev/triple-frontend/pull/1737)
- Chromatic CI 추가 [#1732](https://github.com/titicacadev/triple-frontend/pull/1732)
#### poi-list-elements
- 저장버튼과 poi name이 겹치는 문제를 해결합니다 [#1754](https://github.com/titicacadev/triple-frontend/pull/1754)
#### replies
- 댓글/답글 서비스 로직을 개선합니다. [#1745](https://github.com/titicacadev/triple-frontend/pull/1745)
- 댓글/답글 수정하기 기능을 추가합니다 [#1712](https://github.com/titicacadev/triple-frontend/pull/1712)
## 4.1.4
### triple-document
- TextHtml을 TripleDocument의 마크다운을 위한 컴포넌트로 구현합니다 [#1739](https://github.com/titicacadev/triple-frontend/pull/1739)
## 4.1.3
### triple-document
- Text의 중복 줄바꿈을 제거하는 함수 추가 [#1735](https://github.com/titicacadev/triple-frontend/pull/1735)
## 4.1.2
### app-installation-cta
- floating-button-cta 디자인 오류를 해결합니다. [#1724](https://github.com/titicacadev/triple-frontend/pull/1724)
### replies
- 자식 컴포넌트의 이벤트를 막습니다. [#1723](https://github.com/titicacadev/triple-frontend/pull/1723)
## 4.1.1
### react-contexts
- `SessionContextProvider.getInitialProps`를 클라이언트에서 실행할 때 인앱 환경을 제대로 감지하지 못하는 문제 수정 [#1720](https://github.com/titicacadev/triple-frontend/pull/1720)
## 4.1.0
## search
- 렌더링 직후 input 엘리먼트의 focus 메서드를 호출 [#1684](https://github.com/titicacadev/triple-frontend/pull/1684)
## core-elements
- form-field에 required 디자인 추가 [#1709](https://github.com/titicacadev/triple-frontend/pull/1709)
## replies
- 댓글 컴포넌트 리팩토링 [#1711](https://github.com/titicacadev/triple-frontend/pull/1711)
## ab-experiments
- Peer 의존성으로 Next.js 12 허용 [#1713](https://github.com/titicacadev/triple-frontend/pull/1713)
## fetcher
- Peer 의존성으로 Next.js 12 허용 [#1713](https://github.com/titicacadev/triple-frontend/pull/1713)
- 응답 객체에 status, url이 없는 문제 해결 [#1717](https://github.com/titicacadev/triple-frontend/pull/1717)
## intersection-observer
- Peer 의존성으로 Next.js 12 허용 [#1713](https://github.com/titicacadev/triple-frontend/pull/1713)
## meta-tags
- Peer 의존성으로 Next.js 12 허용 [#1713](https://github.com/titicacadev/triple-frontend/pull/1713)
## react-contexts
- Peer 의존성으로 Next.js 12 허용 [#1713](https://github.com/titicacadev/triple-frontend/pull/1713)
## router
- Peer 의존성으로 Next.js 12 허용 [#1713](https://github.com/titicacadev/triple-frontend/pull/1713)
## ui-flow
- Peer 의존성으로 Next.js 12 허용 [#1713](https://github.com/titicacadev/triple-frontend/pull/1713)
## app-installation-cta
- `BannerCTA`의 이미지 배너의 앱으로 가는 버튼과 배너를 닫는 버튼의 문구를 prop으로 받는 기능 추가 [#1714](https://github.com/titicacadev/triple-frontend/pull/1714)
- `BannerCTA`의 텍스트 배너를 비활성화하는 prop 추가 [#1714](https://github.com/titicacadev/triple-frontend/pull/1714)
## 4.0.0
### Breaking Changes
- floating-install-button 패키지 제거 [#1683](https://github.com/titicacadev/triple-frontend/pull/1683)
- frontend-devtools 패키지 제거 [#1696](https://github.com/titicacadev/triple-frontend/pull/1696)
#### fetcher
- fetcher 응답 타입에서 `error`, `result`, body 관련 속성 제거 [#1624](https://github.com/titicacadev/triple-frontend/pull/1624)
#### react-contexts
- `SessionContextProvider`의 prop 변경 [#1705](https://github.com/titicacadev/triple-frontend/pull/1705)
- `useSessionContext` 훅 제거 [#1705](https://github.com/titicacadev/triple-frontend/pull/1705)
### New Features
#### fetcher
- fetcher 응답 타입에 `parsedBody` 추가 [#1624](https://github.com/titicacadev/triple-frontend/pull/1624)
#### date-picker
- `DayPicker`, `RangePicker` 컴포넌트에 오늘 날짜 표시를 숨길 수 있는 prop 추가 [#1688](https://github.com/titicacadev/triple-frontend/pull/1688)
- `DayPicker` 컴포넌트에 달 페이지를 바꿀 수 있는 버튼을 표시하는 prop 추가 [#1688](https://github.com/titicacadev/triple-frontend/pull/1688)
- `DayPicker` 컴포넌트의 날짜 영역 컴포넌트를 커스텀할 수 있는 기능 추가 [#1692](https://github.com/titicacadev/triple-frontend/pull/1692)
#### react-contexts
- humps 패키지 제거 [#1691](https://github.com/titicacadev/triple-frontend/pull/1691)
- `SessionContextProvider`에 `getInitialProps` 메서드 추가 [#1705](https://github.com/titicacadev/triple-frontend/pull/1705)
- `useSessionAvailability`, `useSessionControllers`, `useUser` 훅 추가 [#1705](https://github.com/titicacadev/triple-frontend/pull/1705)
- `getSessionAvailablityFromRequest` 함수 추가 [#1705](https://github.com/titicacadev/triple-frontend/pull/1705)
- `putInvalidSessionRemover` 함수 추가 [#1705](https://github.com/titicacadev/triple-frontend/pull/1705)
#### core-elements
- 폼 컴포넌트의 error 타입에 boolean 값도 들어갈 수 있도록 변경 [#1694](https://github.com/titicacadev/triple-frontend/pull/1694)
- `SearchNavbar` 컴포넌트의 뒤로가기 아이콘 타입을 prop으로 받도록 처리 [#1706](https://github.com/titicacadev/triple-frontend/pull/1706)
#### search
- `FullScreenSearchView` 컴포넌트의 뒤로가기 아이콘 타입을 prop으로 받도록 처리 [#1706](https://github.com/titicacadev/triple-frontend/pull/1706)
### Bug Fix
#### router
- `LocalLink`가 앱 전용 쿼리를 추가할 때 기존 쿼리를 보존하지 않는 문제 수정 [#1699](https://github.com/titicacadev/triple-frontend/pull/1699)
### Etc.
- `@swc/core` patch 버전 업그레이드 [#1687](https://github.com/titicacadev/triple-frontend/pull/1687)
- README에서 브랜치 이름을 "master"에서 "main"으로 교정합니다. [#1695](https://github.com/titicacadev/triple-frontend/pull/1695)
- tsc 설정을 개선합니다. [#1697](https://github.com/titicacadev/triple-frontend/pull/1697)
- router 패키지의 코드를 정리합니다. [#1701](https://github.com/titicacadev/triple-frontend/pull/1701)
## 3.4.1
### footer
- 배경 색상 범위를 수정합니다. (#1685)
## 3.4.0
### ui-flow
- authGuard 테스트 재작성 (#1681)
- ui-flow의 authGuard 코드를 정리합니다. (#1674)
### footer
- 320px 이하 화면을 대응합니다. (#1680)
- maxWidth의 값을 변경합니다. (#1679)
### replies
- 이전 댓글&답글 더보기 로직을 수정합니다. (#1676)
- 대댓글 작성 기능을 추가합니다. (#1668)
- 댓글&답글 마크업 및 디자인을 수정합니다. (#1651)
### fetcher
- fetcher 코드를 정리합니다. (#1673)
- addFetchersToGSSP 함수가 토큰을 갱신할 때 API 낭비를 줄입니다. (#1667)
### core-elements
- stack, responsive, section 리팩토링 (#1672)
- text에 css prop 추가 및 코드 개선 (#1664)
### location-properies
- property-item 리팩토링 (#1671)
## 3.3.1
### common
- 배포용 패키지는 babel로 빌드합니다. (#1669)
## 3.3.0
### react-contexts
- API 요청이 성공했을 때에만 로그아웃 후 처리를 수행합니다. (#1665)
### triple-document
- 쿠폰 다운로드 Alert 타이틀 문구를 개선합니다. (#1663)
- 쿠폰 다운로드 시도 시, API 호출 전 verification state 체크하는 부분을 제거합니다. (#1662)
- 웹 브라우저에서 쿠폰을 다운로드할 수 있는 기능 추가 (#1658)
- 쿠폰 그룹 다운로드할 때 인증에 실패하면 인증 프로세스 시작 (#1657)
- 쿠폰 그룹 다운로드 컴포넌트 리팩토링 (#1656)
- `InAppCouponDownloadButton` 리팩토링 (#1655)
### poi-detail
- maxWidth={0} 제거 (#1661)
### react-hooks
- Public 환경에서 visibilitychange 이벤트에 subscribe합니다. (#1660)
### core-elements
- container, flex-box, sticky-header에 css prop 추가 및 코드 개선 (#1654)
- Container 유닛 테스트 추가 (#1650)
- as, css prop을 지원하는 컴포넌트와 타입 추가 (#1643)
### date-picker
- range-picker test에서 query 함수로 getAllBy 사용 (#1652)
### replies
- 댓글을 작성할 수 있도록 수정합니다. (#1649)
### docs
- popup 스토리 수정 (#1648)
- 댓글 컴포넌트의 스토리북에 control 기능을 추가합니다. (#1647)
- storybook-addon-next-router 추가 (#1646)
### router
- Link 컴포넌트의 자식 노드에 덮어쓰이는 속성이 있을 때 경고를 추가합니다. (#1645)
### form
- action-sheet-selector default label 수정 (#1641)
### etc
- swc를 사용해 빌드합니다. (#1642)
- tag object를 만들 때 SHA 참조 수정 (#1640)
## 3.2.1
### modal
- 버튼에 box-sizing css 추가 (#1638)
## 3.2.0
### common
- doc의 자체 eslint 규칙을 root로 통합합니다. (#1635)
- 린트 관련 스크립트 정리 (#1634)
- CD 워크플로에 카나리 릴리즈 job을 추가합니다. (#1628)
- 태그 삭제 API를 Github Actions로 대체 (#1627)
### view-utilities
- 호텔의 라우터 경로 중 요금 상세페이지에 대한 ROUTERLIST_REGEXES를 추가합니다. (#1632)
## 3.1.0
### core-elements
- GlobalColorSet (skyblue, lightpurple)을 추가합니다. (#1617)
### view-utilities
- 호텔의 라우터 경로중 요금 상세에 대한 ROUTERLIST_REGEXES 를 추가합니다 (#1616)
### common
- PR에 붙이는 태그에 PR 넘버 추가 (#1614)
## 3.0.2
### core-elements
- sticky-header의 zTier, zIndex 기본 값 수정 (#1621)
### view-utilities
- 오타 수정 (#1622)
## 3.0.1
## common
- CI/CD에서 의존성을 설치할 때 .npm을 캐싱 ([#1615](https://github.com/titicacadev/triple-frontend/pull/1615))
- 버전 관리 방법을 lerna로 원상복구 ([#1613](https://github.com/titicacadev/triple-frontend/pull/1613))
- lerna bootstrap 관련 스크립트 제거 ([#1613](https://github.com/titicacadev/triple-frontend/pull/1613))
## core-elements
- z-index의 기본 값이 중복으로 설정되는 것을 방지 ([#1618](https://github.com/titicacadev/triple-frontend/pull/1618))
## fetcher
- 응답이 ok일 때 `result`에 할당 ([#1619](https://github.com/titicacadev/triple-frontend/pull/1619))
## 3.0.0
### public-header
- BREAKING CHANGE: 디자인 변경 사항 반영 (#1586)
### react-contexts
- BREAKING CHANGE: env-context에 필수 props 추가 afOnelinkSubdomain, afOnelinkId, afOnelinkPid (#1586)
### core-elements
- sticky-header 컴포넌트 추가 (#1586)
## 2.41.0
### replies
- 댓글 컴포넌트를 추가합니다 (#1599)
### standard-action-handler
- Clipboard API에 fallback 함수로 execCommand 함수를 추가합니다. (#1601)
### triple-document
- 쿠폰 다운로드 버튼에서 사용하는 API 요청에 새로운 fetcher 인터페이스 사용 (#1602)
### fetcher
- fetcher 재시도 조건에서 body 존재유무를 제거합니다. (#1604)
### view-utilities
- param-injector에 injectIsSearchAd 추가 (#1605)
### core-elements
- input에 ref prop을 추가합니다. (#1606)
### common
- 패키지의 버전을 올릴 때 lerna 의존성을 제거합니다. 그리고 의존성 변경을 누락했는지 확인하는 job을 추가합니다. (#1607)
- package-lock 업데이트 (#1608)
## 2.40.0
### poi-detail
- 추천 아티클 '더 알아보기' 영역에 onClick을 추가합니다 (#1588)
- 추천 아티클 size 및 button을 변경합니다 (#1589)
### fetcher
- HttpError를 좀 더 유용하게 기록합니다. (#1594)
### view-utillities
- appsflyer 어트리뷰션 오타를 수정합니다 (#1595)
- 필요한 appsflyer 어트리뷰션를 추가합니다 (#1597)
## 2.39.0
### core-elements
- numeric-spinner 오타 수정 (#1574)
- cursor option을 추가합니다 (#1580)
### fetcher
- JSON 파싱 에러를 조용히 넘기도록 수정 (#1575)
- 새로운 fetcher 개선사항 (#1579)
### footer
- DefaultFooter 앱 다운 버튼 숨김 옵션 추가 (#1581)
### modals
- 모달의 Default Action 을 방지하는 로직을 추가합니다 (#1577)
### poi-detail
- POI DetailHeader V2 버전 지도보기에 대한 액션이 존재할때만 노출합니다 (#1583)
- RecommendedArticles가 zoneId를 받을 수 있도록 합니다 (#1585)
### public-header
- AutoHidingPublicHeader 추가 (#1578)
### triple-document
- PricePolicyCouponInfo의 쿠폰 노출 정책에 대한 강조색상을 확장합니다 (#1584)
## 2.38.1
### triple-document
- 잘못된 아이콘 파일명을 수정합니다. (#1570)
### booking-completion
- 일정추가 버튼의 텍스트를 수정합니다. (#1567)
## 2.38.0
### docs
- storieOf API 대신 CSF 포맷으로 스토리 변경 (#1562)
### triple-document
- @titicaca/scrap-button 의존성을 추가합니다. (#1564)
### react-contexts
- ScrapsProvider에 enableTrackEvent prop 추가 (#1565)
### scrap-button
- 스크랩 버튼에 이벤트 추가 (#1565)
## 2.37.0
### fetcher
- README 재작성 (#1559)
### react-contexts
- 오타수정 (#1558)
### static-map
- 반응형 이미지 지원을 위해 source 태그를 사용합니다. (#1555)
### ab-experiments
- A/B 테스트 패키지를 추가합니다. (#1552)
## 2.36.0
### react-contexts
- scraps context에 tna 타입 추가 (#1551)
### triple-document
- TNA 슬롯 컴포넌트에 저장 버튼 추가 (#1551)
### pricing
- Pricing 컴포넌트의 priceLabelOverride Props 의 타입을 확장합니다 (#1549)
## 2.35.0
### booking-completion
- 내 일정으로 담기 버튼을 추가합니다. (#1545)
### triple-document
- 추천코스에 노출되는 내 일정으로 담기 버튼을 숨김 처리합니다. (#1543)
### modals
- modal의 width를 조절할수 있는 prop을 추가 (#1542)
### fetcher
- fetcher 모듈에 새로운 인증 방식을 추가; getServerSideProps에서 fetcher를 쉽게 사용할 수 있는 방법 마련 (#1533)
## 2.34.0
### map
- CirclePin에 alwaysClickable props를 추가합니다. (#1528)
### core-elements
- BaseButton의 active border-style을 제거합니다. (#1531)
### modals
- 액션 문구의 줄바뀜 현상을 수정합니다. (#1535)
### fetcher
- Fetch함수의 파라미터를 생성하는 로직을 별도 함수로 분리합니다. (#1532)
### react-contexts
- SessionContext의 logout 함수에서 logout API를 호출합니다. (#1534)
- 새로운 인증 방식을 적용했을 때, 페이지의 인증 여부를 SessionContext로 공급합니다. (#1536)
## 2.33.0
### triple-document
- TripleDocument의 DefaultClickHandler에 trackWithMetadata를 추가합니다 (#1526)
### static-map
- 지도영역 크기의 기본척도를 개선합니다 (#1521)
### react-contexts
- Canonized URL을 Routability 체크에만 이용합니다. (#1517)
- UTM Parameter를 trackScreen의 additionalMetadata로 전달합니다. (#1509)
## 2.32.0
### common
- Next.js 11 사용을 준비합니다. (#1510)
- ⬆️ node 16 사용 (#1511)
- sync-deps: 의존성 변경을 필요한 곳에 반영하는 명령어 (#1516)
Release Docs 워크플로가 실패하는 문제를 수정합니다. (#1518)
### triple-document
- tna element를 AB테스트 결과에 맞게 수정합니다. (#1515)
### react-context
- viewItem을 EventTrackingProvider에서 기록합니다. (#1507)
- trackScreen, trackEvent 호출 시 native client accessbility를 체크하지 않습니다. (#1513)
- EventTrackingProvider가 호출하는 trackScreen은 warn message를 출력하지 않도록 합니다. (#1512)
## 2.31.0
### common
- react 17을 준비합니다. (#1469)
### react-contexts
- 콜백 함수에서 발생한 에러를 React ErrorBoundary가 잡을 수 있도록 해주는 함수 `useErrorHandler` Hook 추가 (#1489)
- EventTrackingProvider에서 trackScreen을 수행합니다. (#1504)
- 공통 EventMetadata 를 추가하기 위한 Context API 를 추가합니다 (#1503)
### fetcher
- fetcher의 파라미터에 withApiUriBase, cookie를 추가합니다. (#1502)
### meta-tags
- 기본 OG 이미지 수정 (#1501)
### triple-document
- 아티클 내의 쿠폰선택에 관한 이벤트 로깅을 생성합니다. (#1499)
### web-storage
- @titicaca/web-storage: 효율적인 WebStorage API 에러 처리 (#1489)
### app-installation-cta
- WebStorage API 적용 (#1489)
## 2.30.2
### poi-list-element
- 관광지 리스트 poi blank image를 변경합니다 (#1498)
## 2.30.1
### static-map
- tna 아이콘 추가합니다 (#1494)
## 2.30.0
### footer
- Sotrybook Footer 오류 해결을 위한 Decorator 추가 (#1490)
### react-contexts
- `event-tracking-context`에서 firebase 참조 경로를 수정합니다. (#1488)
- `SessionContextProvider`에서 `/api/users/me` 요청을 제거합니다. (#1488)
### router
- inlink일때 AllowSource를 리턴하는 로직을 개선합니다. (#1486)
### booking-completion
- 리전을 가지고 도시메인으로 넘길때 useAppCallback으로 감싸줍니다. (#1481)
### triple-document
- 아티클 추천코스에 조건 별 Poi 행정구역명 표기 추가 (#1479)
### map
- TNA 마커 추가 (#1472)
## 2.29.1
### pricing
- FixedPricingV2 컴포넌트의 `PurchaseButtonLoadingIndicator` 애니메이션 동작 방식을 수정합니다. (#1476)
### core-elements
- `global-style` 에 blue500 color set 을 추가합니다. (#1476)
### color-palette
- `colors` 에 blue500을 추가합니다. (#1476)
## 2.29.0
### poi-list-element
- categories 타입 변경 및 PoiGQL categories를 사용합니다 (#1473)
### pricing
- FixedPricingV2 컴포넌트를 새로 생성합니다. (#1470)
### ui-flow
- 앱 환경에서 authGuard가 작동할 수 있도록 확장 (#1468)
- useSessionCallback 에 useAuthWeb 옵션 추가 (#1463)
### react-context
- Event Tracking Context에 Firebase Web 연동을 추가합니다. (#1434)
- trackSimpleEvent 퇴장을 준비합니다. (#1460)
- ab-experiment-context에 experiment_impression 액션의 이벤트를 추가합니다. (#1461)
### triple-document
- PoiGQL를 렌더링 할 수 있도록 합니다. (#1467)
- content-web에서 displayName 타입 에러를 해결합니다. (#1465)
- Custom element 사용 시 warning을 제거합니다. (#1459)
- 쿠폰 관련 로직을 정리합니다. (#1457)
### github
- 릴리즈된 버전을 PR 댓글로 추가합니다 (#1462)
- CANARY_VERSION 환경변수로 노출되지 않는 문제 수정 (#1464)
## 2.28.1
### poi-detail
- `DetailHeader` V2 리뷰 노출 로직을 수정합니다. (#1456)
## 2.28.0
### poi-detail
- `DetailHeader` V2 타이틀고 영문 타이틀 사이의 간격을 수정합니다. (#1452)
### pricing
- `FixedPricing` 컴포넌트의 패딩을 외부에서 수정할 수 있게 인터페이스를 추가합니다. (#1452)
### listing-filter
- `listing-filter` container의 padding을 외부에서 수정할 수 있게 인터페이스를 추가합니다. (#1452)
### Triple-document
- Tna Element 교체 (#1418)
### react-context
- useABExperimentContext 훅 추가 (#1453)
## 2.27.7
### poi-detail
- Detail-Header V2 리뷰 Rating과 숫자 사이의 간격을 조절합니다 (#1450)
## 2.27.6
### review
- POI 상세 리뷰에서 닉네임이 콘텐츠 박스 밖으로 나오는 오류를 수정합니다. (#1448)
## 2.27.5
### poi-detail
- DetailHeader V2 리뷰 섹션의 로직을 수정합니다 (#1445)
## 2.27.4
### router
- router 패키지의 문서를 보강합니다. (#1440)
### ui-flow
- file기반 라우팅을 사용하지 않고 rewrites를 쓸 때 authGuard가 제대로 작동하지 않는 문제 수정 (#1441)
### review
- POI 상세 리뷰에서 텍스트 겹치는 오류를 수정합니다. (#1443)
## 2.27.3
### poi-list-elements
- 행정구역 표기 추천검색 및 경로검색 결과 문구 반영합니다.(#1417)
## 2.27.2
### react-contexts
- Google Analytics의 SPA Event Tracking 방식을 적용합니다. (#1431)
## 2.27.1
### core-elements
- PointingTab non-active 상태의 컬러를 변경합니다. (#1428)
### review
- 리뷰 땡쓰 이벤트가 반대로 기록되고, 액션 이름에 있던 오타를 수정합니다. (#1429)
## 2.27.0
### ui-flow
- Option을 추가합니다. `allowNonMembers`, `authType`을 지원합니다. (#1424, #1426)
### footer
- 다운로드 버튼 줄바뀜을 수정합니다. (#1425)
## 2.26.0
### Footer
- Footer 링크를 개선합니다. (#1419)
## 2.25.0
### Pricing
- `discountRate` 컴포넌트를 위한 스타일 확장을 진행합니다. (#1412)
- `Text` Inline 속성으로 인한 `margin-bottom`이 작동하지 않는 버그를 수정합니다 (#1415)
### react-contexts
- `parseApp` 함수 외부로 노출 (#1414)
### ui-flow
- authGuard: getServerSideProps에서 로그인 여부를 검사하는 HOC (#1414)
### footer
- `DefaultFooter` 버튼 디자인 수정 (#1413)
## 2.24.0
### modals
- `modals` navigate() 후 true를 반환합니다. (#1408)
### react-contexts
- `react-contexts` authBasePath를 deprecate합니다. (#1407)
### Pricing
- FixedPricing 컴포넌트의 툴팁 색상을 Props 인자값으로 받습니다. (#1406)
### poi-detail
- DetailHeader 스타일 확장 (#1390)
## 2.23.2
### react-contexts
- Logout 구현 (#1404)
## 2.23.1
### poi-list-elements
- type optional 적용 (#1402)
## 2.23.0
### user-verification
- 일반 브라우저에서 user-verification 패키지를 사용 (#1399)
### poi-list-elements
- 아티클 상세 행정구역 표기 (#1392)
### public-header
- PublicHeader에 내 예약 목록으로 가는 링크를 추가합니다. (#1397)
### footer
- Default 푸터 디자인수정 (#1400)
## 2.22.3
### review
- 댓글 아이콘에 trackEvent를 추가 합니다 (#1391)
## 2.22.2
### review
- reviews storybook 에러를 해결합니다 (#1387)
- 댓글 아이콘 클릭 시 리뷰 상세페이지 댓글 섹션으로 이동하는 핸들러 추가 (#1385)
## 2.22.1
### poi-detail
- `ImageCarousel`에 `height` 인터페이스를 제공합니다. (#1383)
### image-carousel
- `height` 인터페이스를 제공합니다. (#1383)
## 2.22.0
### poi-detail
- `ImageCarousel`에 `padding`, `borderRadius` 인터페이스를 제공합니다. (#1381)
### review
- 대댓글이 없어도 댓글 아이콘 표시 (#1374)
### modals
- `useLoginCTAModal`이 `setReturnUrl`인터페이스를 제공합니다. (#1373)
### ui-flow
- `useSessionCallback`에 `returnUrl`을 명시할 수 있도록 합니다. (#1373)
### booking-completion
- compact, myBookingButtonTitle props 추가 (#1380)
## 2.21.1
### triple-document
- fetcher 의존성 추가 (#1377)
## 2.21.0
### poi-list-elements
- PoiListElement notes의 타입을 완화 (#1369)
### core-elements
- navbar의 title을 사용 시 children을 flexible하게 관리 (#1366)
- search-navbar의 높이를 일반 navbar와 동일하게 맞춰 수정합니다. (#1329)
### view-utilities
- generateUrl이 입력받은 query의 형식을 존중하여 병합합니다 (#1365)
### review
- messageCount 컴포넌트 추가 (#1360)
## 2.20.1
### react-contexts
- history-context 에서 url에 Hash 삽입 시 arrayFormat을 repeat 형태로 유지합니다. (#1363)
### fetcher
- customHeader를 명시해도 sessionId 보존 (#1358)
## 2.20.0
### nearby-pois
- regionId 의존성을 제거합니다 (#1355)
### view-utilities
- generateUrl 함수에 arrayFormat 옵션 인자를 추가합니다 (#1354)
## 2.19.0
### resource-list-element
- 지역명을 받을수 있도록 prop을 추가합니다. (#1348)
## 2.18.2
### triple-document
- 쿠폰 그룹 다운로드 모달, 로직 수정 (#1344)
## 2.18.1
### poi-detail
- areas type 수정 (#1342)
## 2.18.0
### static-map
- `static-map` zoom level과 frame을 제어 가능하도록 합니다. (#1310)
### view-utilities
- generateUrl 함수가 base URL의 query를 보존하지 못하는 문제 수정 (#1316)
### config
- eslint-config-triple@2.4.0 설치 (#1338)
### triple-document
- `triple-document`에서 prop으로 전달하던 값을 Context API로 공급합니다. (#1318)
- 쿠폰 그룹 다운로드 지원 (#1322)
### poi-detail, nearby-pois, poi-list-elements
- 리전없는 행정구역 표기 추가 (#1332)
### review
- 리뷰 클릭 핸들러 reviewId 타입 fix (#1337)
- 리뷰 팝업 모달 핸들러 정리, 이미지 누를 시 중복 모달 제거, 리뷰 더보기 누를시 팝업 모달 제거 (#1317)
### core-elements
- Stack 컴포넌트를 추가합니다. (#1248)
- Navbar Item 버튼이미지를 추가합니다 (#1311)
### intersection-observer
- useIntersection Hook을 추가합니다 (#1326)
### fetcher
- responseError를 get하는 로직을 추가합니다. (#1324)
## 2.17.0
### package.json
- 의존성을 추가하는 스크립트 작성 (#1309)
### core-elements
- Image.Overlay 컴포넌트에 기본 zTier 값을 추가합니다 (#1308)
### poi-list-elements
- POICardElement의 스크랩 버튼을 무조건 표시합니다 (#1307)
### modals
- transition-modal 팝업 오류 수정 (#1306)
### fetcher
- 응답의 content-type에 json이 포함되어있을 때만 json 파싱 (#1305)
### view-utilities, react-contexts
- normalize-query-keys 모듈을 추가합니다. (#1304)
### husky
- Husky v6 적용 (#1303)
### modals
- transition-modal 팝업 오류 수정 (#1306)
## 2.16.1
### core-elements
- Dark 테마 일 시 배경색 white 지정 (#1300)
## 2.16.0
### fetcher
- 특정 ErrorStatus에서 reFetch 시도합니다 (#1295)
### modals
- transition-modal 디자인 통일 (icon. description) (#1297)
### core-elements
- 사파리에서 발생하는 border-radius 버그 수정 (#1292)
### triple-document, user-verification
- 사용자 인증 플로우를 확장합니다. (#1280)
### router
- local-link 스크롤 이슈 수정 (#1289)
## 2.15.1
### common
- @egjs/flicking, @egjs/react-flicking을 최신 버전으로 업그레이드합니다. (#1287)
### core-elements
- Image.Overlay 컴포넌트 z-index 제거 (#1286)
### review
- Image Dimmer의 z-index를 제거합니다. (#1286)
## 2.15.0
### router
- Link 컴포넌트에 `트리플 전용 쿼리 파라미터`를 Optional Props 으로 추가 (#1256)
### triple-document
- `triple-document` 타임라인 영역 min-width 적용 (#1276)
### color-palette
- `white900` 추가 (#1277)
### core-elements
- global-style `--color-white900` 추가 (#1277)
- root에 정의된 colorSet만 사용하도록 `getCssVariableColor` 함수를 추가합니다. (#1275)
- Version up `content-utilities` (#1274)
### reviews
- Images 컴포넌트 추가 (#1277)
- User 컴포넌트 수정 (#1281)
### popup, action-sheet
- CSSTransion 컴포넌트 props 로 추가합니다. (#1279)
## 2.14.1
### react-contexts
- [Hitory Context] Canonization 시 유실되는 `/outlink` query param을 보존합니다. (#1270)
### poi-list-elements
- POI 목록 요소에 area 정보를 표시합니다. (#1271)
## 2.14.0
### common
- `Storybook` 사용법 링크를 추가합니다 (#1268)
- `docs`를 빌드하는 Dockerfile을 개선합니다. (#1265)
### review
- `shortend` 리뷰 개수 4개로 수정 (#1249)
- 유저 탈퇴 시에도 별점 노출 (#1249)
- 유저 프로필 여행자 클럽 정보 대신 리뷰 개수 노출 (#1249)
### core-elements
- Videon 컴포넌트 브라우저 지원을 위한 리스너 수정 (#1267)
## 2.13.1
### view-utilities
- strictQuery가 boolean 값을 결정하는 기준을 완화합니다. (#1264)
### triple-document
- local 빌드시 type에러를 수정합니다 (#1259)
### core-elements
- Video 컴포넌트 Pending 로직 변경을 위한 리스너 추가 (#1263)
## 2.13.0
### common
- 개발 환경에서 테스트 파일에 동일한 타입스크립트 설정을 적용하도록 변경 (#1234)
- 테스트 파일이 빌드되지 않도록 babel 설정 수정 (#1234)
- `build-watch`가 지켜보는 파일 범위 축소 및 로그 간소화 (#1243)
- docs.standalone 빌드 실패 문제 해결 (#1252)
- 사용하지 않는 Dockerfile 제거 (#1255)
- 사용 빈도가 낮은 GCP, GHA Manifest 삭제 (#1254)
- 패키지 의존성 그래프 개선 (#1244)
### color-palette
- 색상 변수 및 `getColor` 함수 deprecate 처리 (#1230)
### core-elements
- `global-style`에 기본 색상을 CSS 상수로 추가 (#1230)
- `VideoFrame`, `VideoElement` 컴포넌트 추가 (#1206)
- `Video` 컴포넌트 구조 정리 (#1206)
### react-contexts
- [Device Context] `autoplay`와 `networkType` 값 추가 및 request header에서 이들을 파싱하는 함수 추가 (#1221)
- [Scraps Context] 스크랩 여부를 컴포넌트 트리 전체가 한 객체에 저장하도록 처리 (#1231)
### fetcher
- Body의 Stringfy하지 않는 옵션 추가 (#1241)
### popup
- 팝업 컨테이너 하단 패딩 제거 (#1236)
### triple-document
- links 컴포넌트 중 "list" 타입의 links를 기본 links 컴포넌트로 fallback 처리 (#1247)
### docs
- Storybook 6 사용 (#1245)
- `triple-document` 스토리 정비 (#1246)
## 2.12.1
### poi-detail
- RecommendedArticles 하단 링크 TEXT 수정 (#1237)
## 2.12.0
### type-definitions
- [type-definitions] 인벤토리 API 응답 타이핑 (#1223)
### poi-detail
- RecommendedArticles, TransitionModal Text 수정 (#1232)
### core-elements
- optimizedImg를 사용함에 필요한 optimized Prop 추가 (#1185)
### triple-document
- `Ship` 아이콘 추가 (#1226)
### common
- 버전을 올리고 `package-lock.json`, `docs/package-lock.json` 업데이트 하는 스크립트 추가 (#1222)
## 2.11.0
### app-installation-cta
- article-card-cta 컴포넌트 추가 및 story doc 추가 (#1197)
### date-picker
- DayPicker-wrapper를 768로 제한 (#1216)
### core-elements, action-sheet, app-installation-cta, floating-install-button, popup
- 화면 레이아웃을 벗어나는 UI의 최대 너비 제한 (#1212)
### common
- npm@7 사용 이후 의존성 설치에 실패하는 문제 수정 (#1213)
- `react-contexts` 패키지를 사용할 때 peer Dependency로 의존하도록 수정 (#1215)
- 빌드, 개발 과정에 [TypeScript의 Project Reference 설정](https://www.typescriptlang.org/docs/handbook/project-references.html) 적용 (#1215)
### react-contexts
- [images-context] reFetch Action 추가 (#1210)
### triple-document
- [tag-label] 태그라벨 안 이미지 변경, square 모서리 부분 수정 (#1195)
- [poi] poi 추천코스에 하나만 넣으면 zoom level이 너무 커져 default zoom 값 수정 (#1195)
### carousel
- carousel 패키지 추가 (#1120)
### core-elements
- [carousel] Carousel 컴포넌트 deprecated 주석 명시 (#1120)
### view-utilities
- query 값의 타입을 확정해서 사용할 수 있게 해주는 `strictQuery` 추가 (#1201)
## 2.10.1
### common
- [common] peerDependencies에 이미 있는 모듈을 devDependencies에서 제거합니다 (#1186)
### triple-document
- 지도, 추천코스 아이템이 없는 케이스에 대한 예외처리 (#1194)
## 2.10.0
### social-reviews
- Support placeholder image for social reviews (#1193)
### triple-document
- 임의의 anchor 컴포넌트 추가 (#1190)
- 지도,추천코스 > 일정담기 이벤트 핸들처리 로직 추가 (#1191)
## 2.9.2
### triple-document
- 지도, 추천코스 Poi 메모 영역 line-height 값 조정 (#1184)
## 2.9.1
### triple-document
- 지도, 추천코스 Poi 카드 타이틀, 메모 말줄임 처리 (#1180)
## 2.9.0
### date-picker
- enableSameDay가 false일 때 같은날짜를 무시하는 로직 개선 (#1174)
### triple-document
- optimized prop를 추가 (#1165)
- Triple Document에 지도, 추천컴포넌트 추가 (#1167)
### footer
- Default Footer 안 wording을 변경합니다 (#1168)
- Footer 패키지에서 사용하는 react-contexts를 peerDependencies에 추가합니다 (#1177)
### triple-media
- OptimizedImg 컴포넌트를 추가합니다 (#1163)
### image-carousel
- flicking isPaying 시 clickEvent를 발생 시키지 않음
useRef를 사용하여, react-flicking 내부 인터페이스 사용 (#1162)
## 2.8.0
### common
- tsconfig.tsbuildinfo 파일의 change event를 무시합니다. (#1153)
- npm workspaces 사용 (#1152)
- package-lock 업데이트 (#1154, #1155)
- 컴포넌트의 underline 설정이 우선하도록 && hack 추가 (#1157)
### core-elements
- lazy loading 및 cloudinary optimization처리되는 `OptimizedImg`를 추가합니다. (#1145)
## 2.7.3
### react-contexts
- `ab-experiment-context`의 `ABExperimentProvider`에서 실험 정보 API를
세션이 있을 때만 호출하도록 수정 (#1150)
## 2.7.2
### react-contexts
- `ab-experiment-context`의 `useABExperimentVariant`에 실험 시작 이벤트에 attribute를 추가할 수 있는 파라미터 추가 (#1148)
## 2.7.1
### react-contexts
- `experiment-context`의 `useABExperimentConversionTracker`의 반환 함수 타입 수정 (#1146)
## 2.7.0
### react-contexts
- `experiment-context` 모듈 추가 (#1123)
### map
- `@types/googlemaps` 버전에 ~ 사용 (#1143)
### router
- link 모듈 구현 (#1121)
- 키 누르고 링크를 눌렀을 때 기본 앵커 태그처럼 작동하도록 처리 (#1142)
## 2.6.0
### react-contexts
- tna 상세프로그램 더보기 router를 추가합니다. (#1135)
### Modals
- tna type의 description을 수정합니다. (#1130)
### MapView
- `bounds`, `padding` ,`onLoad` prop 을 추가합니다. (#1131)
- 구글맵 `Libraries` 옵션 설정 관련 performance warning 이슈 해결 (#1127)
## 2.5.0
### map
- `MapView` 컴포넌트를 추가합니다.
### react-contexts
- in-app 내비게이션에도 URL canonization을 적용합니다. (#1090)
- `navigate()` 에서 tna 상세로의 링크를 허용합니다. (#1113)
### recommended-contents
- ul 바로 아래에 li 태그가 들어가도록 수정 (#1117)
### meta-tag
- Facebook OpenGraph의 `title`, `description` 태그 기본값을 `env-context`에서 가져옵니다. (#1112)
### poi-detail
- Image carousel의 가로폭을 768 기반으로 변경합니다. (#1114)
### public-header
- 로고 이미지 비율을 바로잡습니다. (#1115)
### resource-list-element
- 가격정보를 `children` 으로 받을 수 있도록합니다. (#1109, #1110)
### navbar
- `maxWidth` 가 기본값을 100%를 가지도록 처리합니다. (#1108)
## 2.4.1
### ad-banners
- `ContentDetailsBanner` 컴포넌트 Click Event contentType 수집
## 2.4.0
### common
- `HistoryProvider`, `SessionContextProvider` 를 Storybook Decorator로 제공합니다. (#1080)
- 760 대신 768을 기준으로 큰 화면 레이아웃을 구성합니다. (#1091)
### ad-banners
- `ListTopBanners` 컴포넌트 `margin` 추가 (#1092)
- `ListTopBanners` 컴포넌트 `contentId` props를 optional props로 수정 (#1092)
- `ContentDetailsBanner` 컴포넌트 추가 (#1099)
### date-picker
- 공휴일을 추가합니다 (#1097)
### react-contexts
- 환경 변수를 공급하는 context 추가. `EnvProvider`, `useEnv` (#1059)
- `HistoryProvider`에 env context 적용 및 `appUrlScheme`, `webUrlBase` prop deprecate 처리 (#1059)
- `SessionContextProvider`에 env context 적용 및 `authBasePath` prop deprecate 처리 (#1059)
- `withEventTrackingProvider` 에 `options` 파라미터추가 (#1087)
- `pageLabel` State를 삭제합니다. (#1094)
### resource-list-element
- `resource`를 optional하게 받을수 있도록 수정합니다. (#1093)
### reviews
- env context 적용 및 `ReviewContainer`의 `appUrlScheme` prop deprecate 처리 (#1059)
### search
- `Search` 컴포넌트에서 `backOrClose` 제거 (#1096)
### footer
- `CSFooter`에 env context 적용 및 `appUrlScheme` prop deprecate 처리 (#1059)
### meta-tags
- `AppleSmartBannerMeta`와 `FacebookAppLinkMeta`에 env context 적용 및 `appUrlScheme` prop deprecate 처리 (#1059)
- `EssentialContentMeta`의 `canonicalUrl` prop의 기본 값 제거 및 값이 없을 때 태그 표시 안 함 (#1095)
- `FacebookOpenGraphMeta`의 `canonicalUrl`을 필수 prop으로 변경 (#1095)
## 2.3.1
### ui-flow
- `GuardedScrapsProvider`가 export되지 않는 문제를 수정합니다. ([#1084](#https://github.com/titicacadev/triple-frontend/pull/1084))
## 2.3.0
### core-elements
- `H1Props`의 `children`을 `PropsWithChildren`으로 표현 ([#1074](https://github.com/titicacadev/triple-frontend/pull/1074))
### ui-flow
- 패키지 추가 ([#1063](https://github.com/titicacadev/triple-frontend/pull/1063))
- `GuardedScrapsProvider` 추가 ([#1065](https://github.com/titicacadev/triple-frontend/pull/1065))
### action-sheet
- 기본 `zTier`를 3으로 설정합니다. ([#1070](https://github.com/titicacadev/triple-frontend/pull/1070))
### poi-detail
- 헤더의 거점지역 형식을 수
gitextract_zxt6lxx8/ ├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .github/ │ ├── CODEOWNERS │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ ├── add-label.yaml │ ├── cd.yaml │ ├── ci.yaml │ ├── pr-closed.yaml │ ├── tag-with-comment.yaml │ └── update-changelog.yaml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .npmrc ├── .prettierignore ├── .prettierrc ├── .storybook/ │ ├── decorators.tsx │ ├── main.ts │ ├── preview.ts │ └── public/ │ └── mockServiceWorker.js ├── .stylelintrc.json ├── .swcrc ├── .vscode/ │ └── settings.json ├── CHANGELOG-archive-201911.md ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── MIGRATION.md ├── README.md ├── chromatic.config.json ├── codecov.yml ├── examples/ │ ├── nextjs-app/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── app/ │ │ │ ├── layout.tsx │ │ │ ├── page.tsx │ │ │ └── template.tsx │ │ ├── lib/ │ │ │ ├── registry.tsx │ │ │ └── theme.tsx │ │ ├── next.config.mjs │ │ ├── package.json │ │ └── tsconfig.json │ └── nextjs-pages/ │ ├── .gitignore │ ├── README.md │ ├── next.config.mjs │ ├── package.json │ ├── pages/ │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ └── index.tsx │ └── tsconfig.json ├── global.d.ts ├── jest-setup.js ├── jest.config.js ├── lerna.json ├── package.json ├── packages/ │ ├── ab-experiments/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── google-optimize-context/ │ │ │ │ ├── README.md │ │ │ │ ├── context.tsx │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── triple-ab-experiment-context/ │ │ │ ├── README.md │ │ │ ├── context.tsx │ │ │ ├── index.ts │ │ │ └── service.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── constants/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── regex.test.ts │ │ │ └── regex.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── fetcher/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── add-fetchers-to-gssp.test.ts │ │ │ ├── add-fetchers-to-gssp.ts │ │ │ ├── auth-guarded-methods.ts │ │ │ ├── factories.test.ts │ │ │ ├── factories.ts │ │ │ ├── fetcher.ts │ │ │ ├── index.ts │ │ │ ├── make-request-params.test.ts │ │ │ ├── make-request-params.ts │ │ │ ├── methods.ts │ │ │ ├── response-handler.ts │ │ │ ├── safe-parse-json.test.ts │ │ │ ├── safe-parse-json.ts │ │ │ ├── server-fetch.ts │ │ │ ├── session-refresh.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── i18n/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── interpolate.ts │ │ │ ├── locales/ │ │ │ │ ├── en.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ja.ts │ │ │ │ ├── ko.ts │ │ │ │ └── zh-TW.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── intersection-observer/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── lazy-loaded-intersection-observer.tsx │ │ │ ├── static-intersection-observer.tsx │ │ │ └── use-intersection.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── meta-tags/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app-router/ │ │ │ │ ├── generate-apple-smart-banner-meta.ts │ │ │ │ ├── generate-common-meta.ts │ │ │ │ ├── generate-essential-content-meta.ts │ │ │ │ ├── generate-facebook-app-link-meta.ts │ │ │ │ ├── generate-facebook-open-graph-meta.ts │ │ │ │ ├── generate-triple-default-meta.ts │ │ │ │ └── index.ts │ │ │ ├── constants.ts │ │ │ ├── index.ts │ │ │ ├── pages-router/ │ │ │ │ ├── apple-smart-banner-meta.tsx │ │ │ │ ├── common-meta.tsx │ │ │ │ ├── essential-content-meta.test.tsx │ │ │ │ ├── essential-content-meta.tsx │ │ │ │ ├── facebook-app-link-meta.tsx │ │ │ │ ├── facebook-open-graph-meta.tsx │ │ │ │ ├── index.ts │ │ │ │ └── theme-color-meta.tsx │ │ │ ├── structured-data/ │ │ │ │ ├── article-script.tsx │ │ │ │ ├── breadcrumb-list-script.tsx │ │ │ │ ├── discussion-forum-posting-script.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── local-business-script.tsx │ │ │ │ ├── product-script.tsx │ │ │ │ ├── qa-page-script.tsx │ │ │ │ └── review-script.tsx │ │ │ ├── types/ │ │ │ │ ├── index.ts │ │ │ │ ├── schema.ts │ │ │ │ └── structured-data-script-props.ts │ │ │ └── utils.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── middlewares/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── chain.ts │ │ │ ├── index.ts │ │ │ ├── refresh-session/ │ │ │ │ ├── index.ts │ │ │ │ ├── next-13.ts │ │ │ │ └── next-14.ts │ │ │ ├── set-web-device-id.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ ├── apply-set-cookie.ts │ │ │ ├── get-domain.ts │ │ │ └── get-triple-app.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── react-hooks/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── hooks.stories.tsx │ │ │ ├── index.ts │ │ │ ├── mocks/ │ │ │ │ └── lottie.sample.json │ │ │ ├── use-body-scroll-lock.ts │ │ │ ├── use-debounce.test.ts │ │ │ ├── use-debounce.ts │ │ │ ├── use-error-handler.ts │ │ │ ├── use-fetch.ts │ │ │ ├── use-interval.test.ts │ │ │ ├── use-interval.ts │ │ │ ├── use-local-storage.test.ts │ │ │ ├── use-local-storage.ts │ │ │ ├── use-lottie.tsx │ │ │ ├── use-scroll-to-anchor.ts │ │ │ ├── use-scroll-to-element.ts │ │ │ ├── use-session-storage.test.ts │ │ │ ├── use-session-storage.ts │ │ │ └── use-visibility-change.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── router/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── common/ │ │ │ │ ├── add-web-url-base.test.tsx │ │ │ │ ├── add-web-url-base.ts │ │ │ │ ├── default-router.ts │ │ │ │ ├── disabled-link-notifier.test.tsx │ │ │ │ ├── disabled-link-notifier.ts │ │ │ │ ├── router-guarded-link.test.tsx │ │ │ │ ├── router-guarded-link.tsx │ │ │ │ ├── target.ts │ │ │ │ ├── types.ts │ │ │ │ ├── use-rel.test.ts │ │ │ │ └── use-rel.ts │ │ │ ├── external/ │ │ │ │ ├── hook.ts │ │ │ │ ├── href-handler.ts │ │ │ │ ├── index.ts │ │ │ │ ├── link.tsx │ │ │ │ └── utils.ts │ │ │ ├── href-to-props/ │ │ │ │ ├── index.ts │ │ │ │ ├── use-href-to-props.test.tsx │ │ │ │ └── use-href-to-props.ts │ │ │ ├── index.ts │ │ │ ├── links/ │ │ │ │ ├── index.ts │ │ │ │ ├── use-make-inlink.ts │ │ │ │ ├── use-make-outlink.ts │ │ │ │ ├── use-open-inlink.test.ts │ │ │ │ ├── use-open-inlink.ts │ │ │ │ ├── use-open-native-link.test.tsx │ │ │ │ ├── use-open-native-link.ts │ │ │ │ ├── use-open-outlink.test.ts │ │ │ │ └── use-open-outlink.ts │ │ │ ├── local/ │ │ │ │ ├── base-path.test.ts │ │ │ │ ├── base-path.ts │ │ │ │ ├── hook.ts │ │ │ │ ├── href-handler.ts │ │ │ │ ├── index.ts │ │ │ │ └── link.tsx │ │ │ └── navigate/ │ │ │ ├── canonization.spec.ts │ │ │ ├── canonization.ts │ │ │ ├── index.ts │ │ │ ├── use-isomorphic-navigate.ts │ │ │ ├── use-navigate.test.tsx │ │ │ └── use-navigate.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── scroll-to-element/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── scroll-position-calculators.test.ts │ │ │ ├── scroll-position-calculators.ts │ │ │ ├── scroll-to-element.ts │ │ │ ├── scroll.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── standard-action-handler/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── converse.tsx │ │ │ ├── copy-to-clipboard.ts │ │ │ ├── fetch-api.ts │ │ │ ├── handler.ts │ │ │ ├── hook.ts │ │ │ ├── image-download.ts │ │ │ ├── index.ts │ │ │ ├── initialize.ts │ │ │ ├── invoke-cta.ts │ │ │ ├── new-window.test.ts │ │ │ ├── new-window.ts │ │ │ ├── require-triple-client.tsx │ │ │ ├── scroll-to-element.ts │ │ │ ├── serial.ts │ │ │ ├── services/ │ │ │ │ ├── copy.ts │ │ │ │ └── share.ts │ │ │ ├── share.ts │ │ │ ├── show-toast.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── tds-theme/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── foundations/ │ │ │ │ └── colors.ts │ │ │ ├── global-style.ts │ │ │ ├── index.ts │ │ │ ├── styled.ts │ │ │ └── theme/ │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── tds-ui/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── commons.ts │ │ │ ├── components/ │ │ │ │ ├── accordion/ │ │ │ │ │ ├── accordion-content.tsx │ │ │ │ │ ├── accordion-context.tsx │ │ │ │ │ ├── accordion-folded.tsx │ │ │ │ │ ├── accordion-title.tsx │ │ │ │ │ ├── accordion.stories.tsx │ │ │ │ │ ├── accordion.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── action-sheet/ │ │ │ │ │ ├── action-sheet-body.tsx │ │ │ │ │ ├── action-sheet-context.tsx │ │ │ │ │ ├── action-sheet-item.tsx │ │ │ │ │ ├── action-sheet-overlay.tsx │ │ │ │ │ ├── action-sheet-title.tsx │ │ │ │ │ ├── action-sheet.stories.tsx │ │ │ │ │ ├── action-sheet.test.tsx │ │ │ │ │ ├── action-sheet.tsx │ │ │ │ │ ├── constants.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── action-sheet-select/ │ │ │ │ │ ├── action-sheet-select-button.tsx │ │ │ │ │ ├── action-sheet-select-context.tsx │ │ │ │ │ ├── action-sheet-select-option.tsx │ │ │ │ │ ├── action-sheet-select-options.tsx │ │ │ │ │ ├── action-sheet-select.stories.tsx │ │ │ │ │ ├── action-sheet-select.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── alert/ │ │ │ │ │ ├── alert.stories.tsx │ │ │ │ │ ├── alert.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── button/ │ │ │ │ │ ├── basic-button.tsx │ │ │ │ │ ├── button-base.test.tsx │ │ │ │ │ ├── button-base.tsx │ │ │ │ │ ├── button-container.ts │ │ │ │ │ ├── button-group.ts │ │ │ │ │ ├── button-icon.tsx │ │ │ │ │ ├── button.stories.tsx │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── icon-button.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── normal-button.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── carousel/ │ │ │ │ │ ├── carousel-item.tsx │ │ │ │ │ ├── carousel.stories.tsx │ │ │ │ │ ├── carousel.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── mocks/ │ │ │ │ │ └── carousel.sample.json │ │ │ │ ├── checkbox/ │ │ │ │ │ ├── checkbox-base.tsx │ │ │ │ │ ├── checkbox.stories.tsx │ │ │ │ │ ├── checkbox.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── checkbox-group/ │ │ │ │ │ ├── checkbox-group-context.tsx │ │ │ │ │ ├── checkbox-group-error.tsx │ │ │ │ │ ├── checkbox-group-help.tsx │ │ │ │ │ ├── checkbox-group-label.tsx │ │ │ │ │ ├── checkbox-group.stories.tsx │ │ │ │ │ ├── checkbox-group.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── use-checkbox-group.tsx │ │ │ │ ├── confirm/ │ │ │ │ │ ├── confirm.stories.tsx │ │ │ │ │ ├── confirm.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── confirm-selector/ │ │ │ │ │ ├── confirm-selector-base.tsx │ │ │ │ │ ├── confirm-selector.stories.tsx │ │ │ │ │ ├── confirm-selector.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── container/ │ │ │ │ │ ├── container.stories.tsx │ │ │ │ │ ├── container.test.tsx │ │ │ │ │ ├── container.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── content-elements/ │ │ │ │ │ ├── content-elements.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── drawer/ │ │ │ │ │ ├── drawer.stories.tsx │ │ │ │ │ ├── drawer.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── drawer-button/ │ │ │ │ │ ├── drawer-button.stories.tsx │ │ │ │ │ ├── drawer-button.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── fieldset/ │ │ │ │ │ ├── fieldset-context.tsx │ │ │ │ │ ├── fieldset-legend.tsx │ │ │ │ │ ├── fieldset.stories.tsx │ │ │ │ │ ├── fieldset.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── use-fieldset.tsx │ │ │ │ ├── flex-box/ │ │ │ │ │ ├── flex-box.stories.tsx │ │ │ │ │ ├── flex-box.test.tsx │ │ │ │ │ ├── flex-box.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── form-field/ │ │ │ │ │ ├── form-field-context.tsx │ │ │ │ │ ├── form-field-error.tsx │ │ │ │ │ ├── form-field-help.tsx │ │ │ │ │ ├── form-field-label.tsx │ │ │ │ │ ├── form-field.stories.tsx │ │ │ │ │ ├── form-field.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── use-form-field-state.ts │ │ │ │ ├── gender-selector/ │ │ │ │ │ ├── gender-selector-item.tsx │ │ │ │ │ ├── gender-selector.stories.tsx │ │ │ │ │ ├── gender-selector.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── hr/ │ │ │ │ │ ├── hr.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── icon/ │ │ │ │ │ ├── icon.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── image/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── circular.ts │ │ │ │ │ ├── context.tsx │ │ │ │ │ ├── fixed-dimensions-frame.tsx │ │ │ │ │ ├── fixed-ratio-frame.tsx │ │ │ │ │ ├── image.stories.tsx │ │ │ │ │ ├── image.tsx │ │ │ │ │ ├── img.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── link-indicator.tsx │ │ │ │ │ ├── optimized-img.tsx │ │ │ │ │ ├── overlay.tsx │ │ │ │ │ ├── placeholder.tsx │ │ │ │ │ └── source-url.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── input/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input.stories.tsx │ │ │ │ │ └── input.tsx │ │ │ │ ├── label/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── label.stories.tsx │ │ │ │ │ └── label.tsx │ │ │ │ ├── list/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── list.stories.tsx │ │ │ │ │ ├── list.test.tsx │ │ │ │ │ └── list.tsx │ │ │ │ ├── long-clickable/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── long-clickable.stories.tsx │ │ │ │ │ └── long-clickable.tsx │ │ │ │ ├── modal/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── modal-action.tsx │ │ │ │ │ ├── modal-actions.tsx │ │ │ │ │ ├── modal-body.tsx │ │ │ │ │ ├── modal-context.tsx │ │ │ │ │ ├── modal-description.tsx │ │ │ │ │ ├── modal-title.tsx │ │ │ │ │ ├── modal.stories.tsx │ │ │ │ │ ├── modal.test.tsx │ │ │ │ │ └── modal.tsx │ │ │ │ ├── navbar/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── navbar.stories.tsx │ │ │ │ │ ├── navbar.tsx │ │ │ │ │ ├── search-navbar.stories.tsx │ │ │ │ │ └── search-navbar.tsx │ │ │ │ ├── numeric-spinner/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── numeric-spinner-base.tsx │ │ │ │ │ ├── numeric-spinner.stories.tsx │ │ │ │ │ └── numeric-spinner.tsx │ │ │ │ ├── popup/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── popup.stories.tsx │ │ │ │ │ ├── popup.test.tsx │ │ │ │ │ └── popup.tsx │ │ │ │ ├── radio/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── radio-base.tsx │ │ │ │ │ ├── radio.stories.tsx │ │ │ │ │ └── radio.tsx │ │ │ │ ├── radio-group/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── radio-group-context.tsx │ │ │ │ │ ├── radio-group-error.tsx │ │ │ │ │ ├── radio-group-help.tsx │ │ │ │ │ ├── radio-group-label.tsx │ │ │ │ │ ├── radio-group.stories.tsx │ │ │ │ │ ├── radio-group.tsx │ │ │ │ │ └── use-radio-group.tsx │ │ │ │ ├── rating/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── rating.stories.tsx │ │ │ │ │ └── rating.tsx │ │ │ │ ├── responsive/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── responsive.test.tsx │ │ │ │ │ └── responsive.tsx │ │ │ │ ├── section/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── section.stories.tsx │ │ │ │ │ ├── section.test.tsx │ │ │ │ │ └── section.tsx │ │ │ │ ├── segment/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── segment.stories.tsx │ │ │ │ │ └── segment.tsx │ │ │ │ ├── select/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── select.stories.tsx │ │ │ │ │ └── select.tsx │ │ │ │ ├── skeleton/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── skeleton.stories.tsx │ │ │ │ │ └── skeleton.tsx │ │ │ │ ├── slider/ │ │ │ │ │ ├── handle.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── range-slider.stories.tsx │ │ │ │ │ ├── range-slider.tsx │ │ │ │ │ ├── single-slider.stories.tsx │ │ │ │ │ ├── single-slider.tsx │ │ │ │ │ ├── slider-base.tsx │ │ │ │ │ ├── track.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── spinner/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── rolling-spinner.stories.tsx │ │ │ │ │ ├── rolling-spinner.tsx │ │ │ │ │ ├── spinner.stories.tsx │ │ │ │ │ └── spinner.tsx │ │ │ │ ├── stack/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stack.stories.tsx │ │ │ │ │ ├── stack.test.tsx │ │ │ │ │ └── stack.tsx │ │ │ │ ├── sticky-header/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── sticky-header.stories.tsx │ │ │ │ │ ├── sticky-header.test.tsx │ │ │ │ │ └── sticky-header.tsx │ │ │ │ ├── table/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── table.stories.tsx │ │ │ │ │ └── table.tsx │ │ │ │ ├── tabs/ │ │ │ │ │ ├── basic-tab-list.tsx │ │ │ │ │ ├── basic-tab.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── pointing-tab-context.tsx │ │ │ │ │ ├── pointing-tab-list.tsx │ │ │ │ │ ├── pointing-tab.tsx │ │ │ │ │ ├── rounded-tab-list.tsx │ │ │ │ │ ├── rounded-tab.tsx │ │ │ │ │ ├── tab-base.tsx │ │ │ │ │ ├── tab-list-base.tsx │ │ │ │ │ ├── tab-list.tsx │ │ │ │ │ ├── tab-panel.tsx │ │ │ │ │ ├── tab.tsx │ │ │ │ │ ├── tabs-context.tsx │ │ │ │ │ ├── tabs.stories.tsx │ │ │ │ │ ├── tabs.test.tsx │ │ │ │ │ ├── tabs.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── tag/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── tag.stories.tsx │ │ │ │ │ └── tag.tsx │ │ │ │ ├── text/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── text.stories.tsx │ │ │ │ │ ├── text.test.tsx │ │ │ │ │ ├── text.tsx │ │ │ │ │ └── typography.tsx │ │ │ │ ├── textarea/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── textarea.stories.tsx │ │ │ │ │ └── textarea.tsx │ │ │ │ ├── tooltip/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── tooltip.stories.tsx │ │ │ │ │ └── tooltip.tsx │ │ │ │ ├── video/ │ │ │ │ │ ├── context.tsx │ │ │ │ │ ├── controls.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── mute-unmute-button.tsx │ │ │ │ │ ├── play-pause-button.tsx │ │ │ │ │ ├── seeker.tsx │ │ │ │ │ ├── sources.tsx │ │ │ │ │ ├── use-video-control.ts │ │ │ │ │ ├── use-video-ref.ts │ │ │ │ │ ├── utils.tsx │ │ │ │ │ ├── video-element.tsx │ │ │ │ │ ├── video-frame.tsx │ │ │ │ │ ├── video.stories.tsx │ │ │ │ │ └── video.tsx │ │ │ │ └── visually-hidden/ │ │ │ │ ├── index.ts │ │ │ │ ├── visually-hidden.test.tsx │ │ │ │ └── visually-hidden.tsx │ │ │ ├── index.ts │ │ │ ├── mixins/ │ │ │ │ ├── border-radius.ts │ │ │ │ ├── box.ts │ │ │ │ ├── centered.ts │ │ │ │ ├── clearing.ts │ │ │ │ ├── ellipsis.ts │ │ │ │ ├── horizontal-scroll.ts │ │ │ │ ├── index.ts │ │ │ │ ├── layering.ts │ │ │ │ ├── margin-padding.ts │ │ │ │ ├── max-lines.ts │ │ │ │ ├── positioning.ts │ │ │ │ ├── safe-area.ts │ │ │ │ └── text-style.ts │ │ │ └── utils/ │ │ │ ├── merge-refs.ts │ │ │ ├── should-forward-prop.ts │ │ │ └── unit.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── tds-widget/ │ │ ├── .eslintignore │ │ ├── .prettierignore │ │ ├── .stylelintignore │ │ ├── package.json │ │ ├── src/ │ │ │ ├── ad-banners/ │ │ │ │ ├── api.ts │ │ │ │ ├── content-details-banner.tsx │ │ │ │ ├── horizontal-entity.tsx │ │ │ │ ├── horizontal-list-view.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── list-section.ts │ │ │ │ ├── list-top-banners.tsx │ │ │ │ ├── typing.ts │ │ │ │ ├── vertical-entity.tsx │ │ │ │ └── vertical-list-view.tsx │ │ │ ├── app-banner/ │ │ │ │ ├── app-banner.stories.tsx │ │ │ │ ├── app-banner.tsx │ │ │ │ └── index.ts │ │ │ ├── app-installation-cta/ │ │ │ │ ├── article-card-cta.tsx │ │ │ │ ├── banner-cta.stories.tsx │ │ │ │ ├── banner-cta.tsx │ │ │ │ ├── chatbot-cta.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── elements.tsx │ │ │ │ ├── floating-button-cta.stories.tsx │ │ │ │ ├── floating-button-cta.tsx │ │ │ │ ├── image-banner.stories.tsx │ │ │ │ ├── image-banner.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── interfaces.ts │ │ │ │ ├── service.ts │ │ │ │ ├── text-banner.stories.tsx │ │ │ │ └── text-banner.tsx │ │ │ ├── author/ │ │ │ │ ├── author-intro.tsx │ │ │ │ ├── author.stories.tsx │ │ │ │ ├── author.tsx │ │ │ │ └── index.ts │ │ │ ├── booking-completion/ │ │ │ │ ├── booking-completion.stories.tsx │ │ │ │ └── index.tsx │ │ │ ├── chat/ │ │ │ │ ├── bubble/ │ │ │ │ │ ├── altered.tsx │ │ │ │ │ ├── bubble-ui.tsx │ │ │ │ │ ├── bubble.stories.tsx │ │ │ │ │ ├── bubble.tsx │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── elements.tsx │ │ │ │ │ ├── full-text-message-view.tsx │ │ │ │ │ ├── image.tsx │ │ │ │ │ ├── images.stories.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── item/ │ │ │ │ │ │ ├── image.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── text.tsx │ │ │ │ │ ├── nol/ │ │ │ │ │ │ ├── bubble-ui.tsx │ │ │ │ │ │ ├── coupon.tsx │ │ │ │ │ │ ├── full-text-view/ │ │ │ │ │ │ │ ├── elements.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.ts │ │ │ │ │ ├── parent/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parent-message.tsx │ │ │ │ │ │ ├── parent-ui.tsx │ │ │ │ │ │ └── parent.stories.tsx │ │ │ │ │ ├── product.tsx │ │ │ │ │ ├── rich.tsx │ │ │ │ │ ├── text.tsx │ │ │ │ │ └── type.ts │ │ │ │ ├── bubble-container/ │ │ │ │ │ ├── bubble-container.stories.tsx │ │ │ │ │ ├── bubble-container.tsx │ │ │ │ │ ├── bubble-info.tsx │ │ │ │ │ ├── elements.tsx │ │ │ │ │ ├── icons.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── chat/ │ │ │ │ │ ├── chat-room-messages/ │ │ │ │ │ │ ├── chat-api-service.ts │ │ │ │ │ │ ├── chat-message-context.tsx │ │ │ │ │ │ ├── chat-room-messages-provider.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── messages.tsx │ │ │ │ │ │ ├── use-chat-room-messages.ts │ │ │ │ │ │ ├── use-pending-intersections.ts │ │ │ │ │ │ ├── use-scroll.tsx │ │ │ │ │ │ └── use-unread-messages.ts │ │ │ │ │ ├── chat-scroll-container.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── messages-reducer.ts │ │ │ │ │ ├── room-context.tsx │ │ │ │ │ └── scroll-context.tsx │ │ │ │ ├── expired/ │ │ │ │ │ ├── elements.tsx │ │ │ │ │ ├── expired.stories.tsx │ │ │ │ │ ├── expired.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── icons/ │ │ │ │ │ ├── ExclamationMarkIcon.tsx │ │ │ │ │ ├── arrow-bottom-16-icon.tsx │ │ │ │ │ ├── arrow-right-icon.tsx │ │ │ │ │ ├── arrow-top-icon.tsx │ │ │ │ │ ├── reply-meesage-icon.tsx │ │ │ │ │ ├── reply-message-icon.tsx │ │ │ │ │ ├── select-photo-icon.tsx │ │ │ │ │ ├── send-icon.tsx │ │ │ │ │ ├── talk-icon.tsx │ │ │ │ │ └── text-full-view-arrow-icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── input-area/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── input-area-ui/ │ │ │ │ │ │ ├── elements.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── input-area.stories.tsx │ │ │ │ │ ├── nol-input-area-ui/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── use-input-resize-observer.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── list/ │ │ │ │ │ ├── hooks.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── reducer.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── messages/ │ │ │ │ │ ├── date-divider.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── messages.stories.tsx │ │ │ │ │ ├── type.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── navbar/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── navbar.stories.tsx │ │ │ │ ├── nol-theme-provider/ │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── converter.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── nol-theme-provider.tsx │ │ │ │ ├── preview/ │ │ │ │ │ ├── elements.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── preview.stories.tsx │ │ │ │ │ ├── preview.tsx │ │ │ │ │ └── utils.ts │ │ │ │ ├── reservation-info/ │ │ │ │ │ ├── elements.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── reservation-info.stories.tsx │ │ │ │ │ └── reservation-info.tsx │ │ │ │ ├── scroll-buttons-area/ │ │ │ │ │ ├── elements.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── scroll-buttons.tsx │ │ │ │ ├── types/ │ │ │ │ │ ├── base.ts │ │ │ │ │ ├── image.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── message.ts │ │ │ │ │ ├── pusher.ts │ │ │ │ │ ├── room.ts │ │ │ │ │ ├── ui.ts │ │ │ │ │ ├── unread.ts │ │ │ │ │ └── user.ts │ │ │ │ └── utils/ │ │ │ │ ├── a-tag-navigator.ts │ │ │ │ ├── image.ts │ │ │ │ ├── index.ts │ │ │ │ ├── profile.ts │ │ │ │ └── user.ts │ │ │ ├── content-sharing/ │ │ │ │ ├── content-sharing.stories.tsx │ │ │ │ ├── content-sharing.tsx │ │ │ │ └── index.ts │ │ │ ├── date-picker/ │ │ │ │ ├── constants.ts │ │ │ │ ├── date-styles.stories.tsx │ │ │ │ ├── day-picker.stories.tsx │ │ │ │ ├── day-picker.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── mixins.ts │ │ │ │ ├── picker-frame.ts │ │ │ │ ├── range-picker-v2/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── picker-frame.ts │ │ │ │ │ └── range-picker.tsx │ │ │ │ ├── range-picker-v2.stories.tsx │ │ │ │ ├── range-picker.stories.tsx │ │ │ │ ├── range-picker.test.tsx │ │ │ │ ├── range-picker.tsx │ │ │ │ ├── service.ts │ │ │ │ ├── use-disabled-days.ts │ │ │ │ ├── use-public-holidays.ts │ │ │ │ └── utils.ts │ │ │ ├── directions-finder/ │ │ │ │ ├── ask-to-the-local.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── direction-buttons.tsx │ │ │ │ ├── directions-finder.stories.tsx │ │ │ │ └── index.ts │ │ │ ├── flicking-carousel/ │ │ │ │ ├── arrow-icon.tsx │ │ │ │ ├── flicking-carousel.stories.tsx │ │ │ │ ├── flicking-carousel.tsx │ │ │ │ ├── index.ts │ │ │ │ └── mocks/ │ │ │ │ └── carousel.sample.json │ │ │ ├── footer/ │ │ │ │ ├── elements/ │ │ │ │ │ ├── awards.tsx │ │ │ │ │ ├── button-area/ │ │ │ │ │ │ ├── button.tsx │ │ │ │ │ │ ├── dropdown.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── company-info.tsx │ │ │ │ │ ├── divider.tsx │ │ │ │ │ ├── extra-link-group.tsx │ │ │ │ │ └── link-group.tsx │ │ │ │ ├── footers/ │ │ │ │ │ ├── default-footer.tsx │ │ │ │ │ ├── footer.stories.tsx │ │ │ │ │ ├── logo-footer.stories.tsx │ │ │ │ │ └── logo-footer.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── mocks/ │ │ │ │ │ └── footer.json │ │ │ │ └── utils/ │ │ │ │ ├── constants.ts │ │ │ │ ├── type.ts │ │ │ │ └── use-footer-info.tsx │ │ │ ├── hub-form/ │ │ │ │ ├── cell.tsx │ │ │ │ ├── cta.tsx │ │ │ │ ├── hub-form.stories.tsx │ │ │ │ ├── hub-form.tsx │ │ │ │ └── index.ts │ │ │ ├── image-carousel/ │ │ │ │ ├── carousel.tsx │ │ │ │ ├── content.tsx │ │ │ │ ├── image-carousel.stories.tsx │ │ │ │ ├── image-carousel.tsx │ │ │ │ ├── image-content.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── mocks/ │ │ │ │ │ ├── image-carousel.sample.json │ │ │ │ │ └── video-carousel.sample.json │ │ │ │ ├── page-label.tsx │ │ │ │ ├── types.ts │ │ │ │ └── video-content.tsx │ │ │ ├── image-source/ │ │ │ │ ├── image-source.tsx │ │ │ │ └── index.ts │ │ │ ├── image-viewer/ │ │ │ │ ├── detail-viewer/ │ │ │ │ │ ├── image.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── video.tsx │ │ │ │ ├── image-viewer.stories.tsx │ │ │ │ ├── image-viewer.tsx │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── listing-filter/ │ │ │ │ ├── index.ts │ │ │ │ ├── listing-filter-expanding-filter-entry.stories.tsx │ │ │ │ ├── listing-filter-filter-entry.stories.tsx │ │ │ │ ├── listing-filter-primary-filter-entry.stories.tsx │ │ │ │ ├── listing-filter.stories.tsx │ │ │ │ └── listing-filter.tsx │ │ │ ├── location-properties/ │ │ │ │ ├── index.tsx │ │ │ │ ├── location-properties.stories.tsx │ │ │ │ ├── location-properties.tsx │ │ │ │ └── property-item.tsx │ │ │ ├── map/ │ │ │ │ ├── focus-tracker.tsx │ │ │ │ ├── index.test.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── map-view.tsx │ │ │ │ ├── map.stories.tsx │ │ │ │ ├── mock.ts │ │ │ │ ├── mocks/ │ │ │ │ │ └── hotel-recommandations.json │ │ │ │ ├── overlay/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── markers/ │ │ │ │ │ │ ├── flexible-marker.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── poi-dot-marker.tsx │ │ │ │ │ │ └── primary-marker/ │ │ │ │ │ │ ├── bubble-marker.tsx │ │ │ │ │ │ ├── circle-marker/ │ │ │ │ │ │ │ ├── circle-marker-base.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── dot-marker.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── pin-marker/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── pin-marker.tsx │ │ │ │ │ ├── polygon.tsx │ │ │ │ │ └── polyline.tsx │ │ │ │ ├── types.ts │ │ │ │ └── utilities.ts │ │ │ ├── media/ │ │ │ │ ├── index.ts │ │ │ │ └── media.tsx │ │ │ ├── nearby-pois/ │ │ │ │ ├── index.ts │ │ │ │ ├── nearby-pois.stories.tsx │ │ │ │ ├── nearby-pois.tsx │ │ │ │ ├── poi-entry.tsx │ │ │ │ ├── reducer.ts │ │ │ │ ├── service.ts │ │ │ │ └── types.ts │ │ │ ├── poi-detail/ │ │ │ │ ├── actions/ │ │ │ │ │ ├── actions.stories.tsx │ │ │ │ │ ├── actions.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── tooltip/ │ │ │ │ │ └── tooltip.tsx │ │ │ │ ├── area-names.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── copy-action-sheet-item.tsx │ │ │ │ ├── copy-action-sheet.tsx │ │ │ │ ├── detail-header/ │ │ │ │ │ ├── business-hours-icons.tsx │ │ │ │ │ ├── business-hours-note.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── detail-header-v2/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── detail-header-v2.stories.tsx │ │ │ │ ├── detail-header.stories.tsx │ │ │ │ ├── image-carousel/ │ │ │ │ │ ├── carousel-section.tsx │ │ │ │ │ ├── carousel.tsx │ │ │ │ │ ├── cta-overlay.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── note.tsx │ │ │ │ │ └── placeholder.tsx │ │ │ │ ├── image-carousel.stories.tsx │ │ │ │ ├── images-provider.tsx │ │ │ │ ├── images-reducer.ts │ │ │ │ ├── index.ts │ │ │ │ ├── mocks/ │ │ │ │ │ ├── inventory-item.json │ │ │ │ │ └── recommended-articles.json │ │ │ │ ├── recommended-articles/ │ │ │ │ │ ├── api-client.ts │ │ │ │ │ ├── article-entry.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── more-button.tsx │ │ │ │ │ ├── recommended-articles.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── recommended-articles.stories.tsx │ │ │ │ ├── types.ts │ │ │ │ └── use-fetch-images.tsx │ │ │ ├── poi-list-elements/ │ │ │ │ ├── carousel-element.tsx │ │ │ │ ├── compact-poi-list-element.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── extended-poi-list-element.tsx │ │ │ │ ├── get-type-names.ts │ │ │ │ ├── index.ts │ │ │ │ ├── mocks/ │ │ │ │ │ ├── hotels.sample.json │ │ │ │ │ └── pois.sample.json │ │ │ │ ├── poi-card-element/ │ │ │ │ │ ├── direction-button.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── poi-card-element.tsx │ │ │ │ ├── poi-card-element.stories.tsx │ │ │ │ ├── poi-carousel-element.stories.tsx │ │ │ │ ├── poi-list-element.stories.tsx │ │ │ │ ├── poi-list-element.tsx │ │ │ │ └── types.ts │ │ │ ├── pricing/ │ │ │ │ ├── fixed-pricing-v2/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── purchase-button-loading-indicator.tsx │ │ │ │ │ └── purchase-button.tsx │ │ │ │ ├── fixed-pricing-v2.stories.tsx │ │ │ │ ├── fixed-pricing.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── pricing.stories.tsx │ │ │ │ └── pricing.tsx │ │ │ ├── public-header/ │ │ │ │ ├── categories.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── extra-action-item.tsx │ │ │ │ ├── extra-action-separator.tsx │ │ │ │ ├── extra-actions-container.tsx │ │ │ │ ├── header-menu-button.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── public-header-deeplink.tsx │ │ │ │ ├── public-header.spec.tsx │ │ │ │ ├── public-header.stories.tsx │ │ │ │ ├── public-header.tsx │ │ │ │ ├── side-menu/ │ │ │ │ │ ├── auth-button.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── menu-list.tsx │ │ │ │ │ ├── overlay.tsx │ │ │ │ │ ├── profile.tsx │ │ │ │ │ └── type.ts │ │ │ │ ├── types.ts │ │ │ │ ├── use-auto-hide.ts │ │ │ │ └── use-deeplink-href.ts │ │ │ ├── recommended-contents/ │ │ │ │ ├── index.ts │ │ │ │ ├── mocks/ │ │ │ │ │ └── recommended-contents.sample.json │ │ │ │ ├── recommended-contents.stories.tsx │ │ │ │ └── recommended-contents.tsx │ │ │ ├── replies/ │ │ │ │ ├── auto-resizing-textarea.tsx │ │ │ │ ├── context.tsx │ │ │ │ ├── guide-text.tsx │ │ │ │ ├── hook.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── list/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── not-exist-replies.tsx │ │ │ │ │ └── reply.tsx │ │ │ │ ├── register.test.tsx │ │ │ │ ├── register.tsx │ │ │ │ ├── replies-api-client.test.ts │ │ │ │ ├── replies-api-client.ts │ │ │ │ ├── replies.stories.tsx │ │ │ │ ├── replies.tsx │ │ │ │ ├── reply-tree-manipulators.test.tsx │ │ │ │ ├── reply-tree-manipulators.ts │ │ │ │ ├── reply.test.tsx │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ ├── resource-list-elements/ │ │ │ │ ├── extended-resource-list-element.stories.tsx │ │ │ │ ├── extended-resource-list-element.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── resource-list-element-stats.stories.tsx │ │ │ │ ├── resource-list-element-stats.tsx │ │ │ │ ├── review-scrap-stat.stories.tsx │ │ │ │ └── review-scrap-stat.tsx │ │ │ ├── review/ │ │ │ │ ├── components/ │ │ │ │ │ ├── filter-context.tsx │ │ │ │ │ ├── filter.tsx │ │ │ │ │ ├── full-list-button.tsx │ │ │ │ │ ├── infinite-list/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── infinite-list.tsx │ │ │ │ │ │ ├── latest-reviews-infinite.tsx │ │ │ │ │ │ ├── popular-reviews-infinite.tsx │ │ │ │ │ │ ├── rating-infinite-list.tsx │ │ │ │ │ │ ├── services.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── mileage-button.tsx │ │ │ │ │ ├── my-review-action-sheet.tsx │ │ │ │ │ ├── others-review-action-sheet.tsx │ │ │ │ │ ├── review-element/ │ │ │ │ │ │ ├── badges.tsx │ │ │ │ │ │ ├── comment.tsx │ │ │ │ │ │ ├── foldable-comment.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── media/ │ │ │ │ │ │ │ ├── compare-media.ts │ │ │ │ │ │ │ ├── elements.ts │ │ │ │ │ │ │ ├── image.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── media-wrapper.tsx │ │ │ │ │ │ │ ├── medium.tsx │ │ │ │ │ │ │ └── video.tsx │ │ │ │ │ │ ├── pinned-message.tsx │ │ │ │ │ │ ├── purchaseInfo.tsx │ │ │ │ │ │ └── user.tsx │ │ │ │ │ ├── review-placeholder-with-rating.tsx │ │ │ │ │ ├── reviews-shorten.tsx │ │ │ │ │ ├── reviews.tsx │ │ │ │ │ ├── shorten-list/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── latest-reviews.tsx │ │ │ │ │ │ ├── popular-reviews.tsx │ │ │ │ │ │ ├── rating-reviews.tsx │ │ │ │ │ │ ├── reviews-list.tsx │ │ │ │ │ │ ├── services.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── sorting-context.tsx │ │ │ │ │ ├── sorting-options-action-sheet.tsx │ │ │ │ │ ├── sorting-options.tsx │ │ │ │ │ ├── types.tsx │ │ │ │ │ └── write-button.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── data/ │ │ │ │ │ └── graphql/ │ │ │ │ │ ├── client.ts │ │ │ │ │ ├── generated.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── mutation.graphql │ │ │ │ │ └── query.graphql │ │ │ │ ├── index.ts │ │ │ │ ├── mocks/ │ │ │ │ │ ├── review-element.duo-images.json │ │ │ │ │ ├── review-element.duo-videos.json │ │ │ │ │ ├── review-element.mono-image.json │ │ │ │ │ ├── review-element.mono-video.json │ │ │ │ │ ├── review-element.more-images.json │ │ │ │ │ ├── review-element.more-vidoes.json │ │ │ │ │ ├── review-element.penta-images.json │ │ │ │ │ ├── review-element.quad-images.json │ │ │ │ │ ├── review-element.tri-images.json │ │ │ │ │ ├── review-element.tri-videos.json │ │ │ │ │ └── reviews.ts │ │ │ │ ├── review-element.stories.tsx │ │ │ │ ├── reviews-placeholder.stories.tsx │ │ │ │ ├── reviews-shorten.stories.tsx │ │ │ │ ├── reviews.stories.tsx │ │ │ │ ├── services/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── use-client-actions.tsx │ │ │ │ │ └── use-reviews.ts │ │ │ │ └── utils.ts │ │ │ ├── scrap/ │ │ │ │ ├── constants.ts │ │ │ │ ├── context.ts │ │ │ │ ├── index.ts │ │ │ │ ├── provider.tsx │ │ │ │ ├── reducer.ts │ │ │ │ ├── services.ts │ │ │ │ ├── types.ts │ │ │ │ └── use-scrap.ts │ │ │ ├── scrap-button/ │ │ │ │ ├── hooks.ts │ │ │ │ ├── index.ts │ │ │ │ ├── outline-scrap-button.stories.tsx │ │ │ │ ├── outline-scrap-button.tsx │ │ │ │ ├── overlay-scrap-button.stories.tsx │ │ │ │ ├── overlay-scrap-button.tsx │ │ │ │ ├── scrap-button-mask.test.tsx │ │ │ │ ├── scrap-button-mask.tsx │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ ├── search/ │ │ │ │ ├── index.ts │ │ │ │ ├── search.stories.tsx │ │ │ │ └── search.tsx │ │ │ ├── social-reviews/ │ │ │ │ ├── external-links.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── social-review.tsx │ │ │ │ └── social-reviews.stories.tsx │ │ │ ├── static-map/ │ │ │ │ ├── index.ts │ │ │ │ ├── static-map.stories.tsx │ │ │ │ └── static-map.tsx │ │ │ └── user-verification/ │ │ │ ├── confirmation-services.test.ts │ │ │ ├── confirmation-services.ts │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ ├── use-user-verification.test.ts │ │ │ ├── use-user-verification.ts │ │ │ ├── verification-request.stories.tsx │ │ │ ├── verification-request.tsx │ │ │ ├── verified-message.spec.tsx │ │ │ └── verified-message.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-document/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── animation.stories.tsx │ │ │ ├── elements/ │ │ │ │ ├── anchor.tsx │ │ │ │ ├── animation.tsx │ │ │ │ ├── coupon/ │ │ │ │ │ ├── coupon-download-buttons.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── modals.tsx │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── embedded.tsx │ │ │ │ ├── external-video.tsx │ │ │ │ ├── images.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── itinerary/ │ │ │ │ │ ├── badge.ts │ │ │ │ │ ├── icons.tsx │ │ │ │ │ ├── itinerary-map.tsx │ │ │ │ │ ├── poi-card.tsx │ │ │ │ │ ├── save-to-itinerary.tsx │ │ │ │ │ ├── tag-label.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── use-computed-itineraries.ts │ │ │ │ │ ├── use-computed-map.ts │ │ │ │ │ ├── use-handle-add-pois-to-trip.ts │ │ │ │ │ ├── use-safety-poi.ts │ │ │ │ │ └── with-type-circle-badge.tsx │ │ │ │ ├── itinerary.tsx │ │ │ │ ├── links.tsx │ │ │ │ ├── list.tsx │ │ │ │ ├── note.tsx │ │ │ │ ├── pois.tsx │ │ │ │ ├── regions.tsx │ │ │ │ ├── shared/ │ │ │ │ │ ├── display-containers.tsx │ │ │ │ │ ├── document-carousel.tsx │ │ │ │ │ ├── generate-click-handler.ts │ │ │ │ │ └── resource-list.tsx │ │ │ │ ├── sticky-tabs.tsx │ │ │ │ ├── table.tsx │ │ │ │ ├── text/ │ │ │ │ │ ├── headings.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── plain.tsx │ │ │ │ └── tna/ │ │ │ │ ├── index.tsx │ │ │ │ ├── price-policy-coupon-info.tsx │ │ │ │ ├── product.tsx │ │ │ │ ├── slot.tsx │ │ │ │ ├── types.ts │ │ │ │ └── use-generate-coupon.ts │ │ │ ├── heading.stories.tsx │ │ │ ├── hr.stories.tsx │ │ │ ├── images.stories.tsx │ │ │ ├── index.ts │ │ │ ├── links.stories.tsx │ │ │ ├── list.stories.tsx │ │ │ ├── mocks/ │ │ │ │ ├── hotel.sample.json │ │ │ │ ├── images-frame.sample.json │ │ │ │ ├── images.sample.json │ │ │ │ ├── pois.sample.json │ │ │ │ ├── slots.sample.json │ │ │ │ ├── triple-document.embedded.json │ │ │ │ ├── triple-document.itinerary.json │ │ │ │ ├── triple-document.regions.json │ │ │ │ └── triple-document.sample.json │ │ │ ├── pois.stories.tsx │ │ │ ├── prop-context/ │ │ │ │ ├── deep-link.ts │ │ │ │ ├── guest-mode.ts │ │ │ │ ├── image-click-handler.ts │ │ │ │ ├── image-source.ts │ │ │ │ ├── link-click-handler.ts │ │ │ │ ├── media-config.tsx │ │ │ │ └── resource-click-handler.ts │ │ │ ├── tna-slot.stories.tsx │ │ │ ├── triple-document.stories.tsx │ │ │ ├── triple-document.tsx │ │ │ ├── types.ts │ │ │ └── use-resource-event-tracker.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-email-document/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── common/ │ │ │ │ ├── box.ts │ │ │ │ ├── fluid-table.tsx │ │ │ │ ├── handlebars-anchor.tsx │ │ │ │ ├── index.ts │ │ │ │ └── reset.ts │ │ │ ├── components/ │ │ │ │ ├── index.ts │ │ │ │ ├── preview.test.tsx │ │ │ │ └── preview.tsx │ │ │ ├── elements/ │ │ │ │ ├── dividers.test.tsx │ │ │ │ ├── dividers.tsx │ │ │ │ ├── embedded.test.tsx │ │ │ │ ├── embedded.tsx │ │ │ │ ├── heading.test.tsx │ │ │ │ ├── heading.tsx │ │ │ │ ├── images.test.tsx │ │ │ │ ├── images.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── links.test.tsx │ │ │ │ ├── links.tsx │ │ │ │ ├── note.test.tsx │ │ │ │ ├── note.tsx │ │ │ │ ├── text.test.tsx │ │ │ │ └── text.tsx │ │ │ ├── embedded.stories.tsx │ │ │ ├── full-email-template.tsx │ │ │ ├── heading.stories.tsx │ │ │ ├── hr.stories.tsx │ │ │ ├── images.stories.tsx │ │ │ ├── index.ts │ │ │ ├── links.stories.tsx │ │ │ ├── note.stories.tsx │ │ │ ├── preview.stories.tsx │ │ │ ├── text.stories.tsx │ │ │ ├── triple-email-document.test.tsx │ │ │ └── triple-email-document.tsx │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-fallback-action/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── constant.ts │ │ │ ├── index.ts │ │ │ ├── triple-fallback-action-remover.tsx │ │ │ ├── triple-fallback-action.test.tsx │ │ │ ├── triple-fallback-action.tsx │ │ │ └── use-triple-fallback-action-remover.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-header/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── frame/ │ │ │ │ ├── common.ts │ │ │ │ ├── effects/ │ │ │ │ │ ├── common.ts │ │ │ │ │ ├── flying.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── rotate.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ └── zoom.tsx │ │ │ │ ├── frame.tsx │ │ │ │ ├── image.tsx │ │ │ │ ├── index.ts │ │ │ │ └── text.tsx │ │ │ ├── index.ts │ │ │ ├── layer/ │ │ │ │ ├── index.ts │ │ │ │ ├── layer.tsx │ │ │ │ └── transitions/ │ │ │ │ ├── fade-in-out.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── marquee.tsx │ │ │ │ ├── rolling.tsx │ │ │ │ └── slide.tsx │ │ │ ├── lottie/ │ │ │ │ ├── index.ts │ │ │ │ ├── lottie.tsx │ │ │ │ └── use-lottie.ts │ │ │ ├── mocks/ │ │ │ │ ├── framer-type.sample.json │ │ │ │ └── lottie-type.sample.json │ │ │ ├── motion-container.ts │ │ │ ├── service.ts │ │ │ ├── triple-header.stories.tsx │ │ │ ├── triple-header.tsx │ │ │ └── types.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-web/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── client-app/ │ │ │ │ ├── context.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ ├── use-client-app-actions.mdx │ │ │ │ ├── use-client-app-actions.test.tsx │ │ │ │ ├── use-client-app-actions.ts │ │ │ │ ├── use-client-app-callback.mdx │ │ │ │ ├── use-client-app-callback.test.tsx │ │ │ │ ├── use-client-app-callback.ts │ │ │ │ ├── use-client-app.mdx │ │ │ │ ├── use-client-app.test.tsx │ │ │ │ ├── use-client-app.ts │ │ │ │ ├── use-feature-flag.mdx │ │ │ │ ├── use-feature-flag.test.tsx │ │ │ │ └── use-feature-flag.ts │ │ │ ├── env/ │ │ │ │ ├── context.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ ├── use-env.mdx │ │ │ │ ├── use-env.test.tsx │ │ │ │ └── use-env.ts │ │ │ ├── event-tracking/ │ │ │ │ ├── context.ts │ │ │ │ ├── index.ts │ │ │ │ ├── libs/ │ │ │ │ │ └── firebase-analytics.ts │ │ │ │ ├── types.ts │ │ │ │ ├── use-set-firebase-user-id.mdx │ │ │ │ ├── use-set-firebase-user-id.ts │ │ │ │ ├── use-track-event-with-metadata.mdx │ │ │ │ ├── use-track-event-with-metadata.ts │ │ │ │ ├── use-track-event.mdx │ │ │ │ ├── use-track-event.ts │ │ │ │ ├── use-track-screen.mdx │ │ │ │ ├── use-track-screen.ts │ │ │ │ ├── use-triple-web-device-id.ts │ │ │ │ ├── use-utm.mdx │ │ │ │ ├── use-utm.ts │ │ │ │ └── utils/ │ │ │ │ ├── track-event.ts │ │ │ │ └── track-screen.ts │ │ │ ├── hash-router/ │ │ │ │ ├── context.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── use-hash-router.mdx │ │ │ │ └── use-hash-router.ts │ │ │ ├── i18n/ │ │ │ │ ├── context.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ ├── use-i18n.mdx │ │ │ │ ├── use-i18n.test.tsx │ │ │ │ ├── use-i18n.ts │ │ │ │ ├── use-translation.mdx │ │ │ │ ├── use-translation.test.tsx │ │ │ │ └── use-translation.ts │ │ │ ├── index.ts │ │ │ ├── modal/ │ │ │ │ ├── app-install-cta-modal-context.ts │ │ │ │ ├── components/ │ │ │ │ │ ├── app-install-cta-modal.tsx │ │ │ │ │ └── login-cta-modal.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── context.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── login-cta-modal-context.ts │ │ │ │ ├── types.ts │ │ │ │ ├── use-app-install-cta-modal.mdx │ │ │ │ ├── use-app-install-cta-modal.ts │ │ │ │ ├── use-login-cta-modal.mdx │ │ │ │ └── use-login-cta-modal.ts │ │ │ ├── providers/ │ │ │ │ ├── app-install-cta-modal-provider.tsx │ │ │ │ ├── event-metadata-provider.tsx │ │ │ │ ├── event-tracking-provider.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── login-cta-modal-provider.tsx │ │ │ │ └── triple-web.tsx │ │ │ ├── session/ │ │ │ │ ├── context.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── types.tsx │ │ │ │ ├── use-login.mdx │ │ │ │ ├── use-login.ts │ │ │ │ ├── use-logout.mdx │ │ │ │ ├── use-logout.ts │ │ │ │ ├── use-session-availability.mdx │ │ │ │ ├── use-session-availability.test.tsx │ │ │ │ ├── use-session-availability.ts │ │ │ │ ├── use-session-callback.mdx │ │ │ │ ├── use-session-callback.test.tsx │ │ │ │ ├── use-session-callback.ts │ │ │ │ ├── use-session.mdx │ │ │ │ ├── use-session.test.tsx │ │ │ │ ├── use-session.ts │ │ │ │ └── utils/ │ │ │ │ ├── redirect.spec.ts │ │ │ │ └── redirect.ts │ │ │ └── user-agent/ │ │ │ ├── context.tsx │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ ├── use-user-agent.mdx │ │ │ ├── use-user-agent.test.tsx │ │ │ └── use-user-agent.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-web-nextjs/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── initializers/ │ │ │ │ ├── client-app.ts │ │ │ │ ├── index.ts │ │ │ │ ├── session.ts │ │ │ │ └── user-agent.ts │ │ │ └── providers/ │ │ │ ├── app-install-cta-modal-provider.mdx │ │ │ ├── app-install-cta-modal-provider.tsx │ │ │ ├── event-metadata-provider.mdx │ │ │ ├── event-metadata-provider.tsx │ │ │ ├── event-tracking-provider.mdx │ │ │ ├── event-tracking-provider.tsx │ │ │ ├── index.ts │ │ │ ├── login-cta-modal-provider.mdx │ │ │ ├── login-cta-modal-provider.tsx │ │ │ ├── triple-web.mdx │ │ │ └── triple-web.tsx │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-web-nextjs-pages/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── helpers/ │ │ │ │ ├── client-app.ts │ │ │ │ ├── session.ts │ │ │ │ └── user-agent.ts │ │ │ ├── index.ts │ │ │ ├── initializers/ │ │ │ │ ├── client-app.ts │ │ │ │ ├── index.ts │ │ │ │ ├── session.ts │ │ │ │ └── user-agent.ts │ │ │ ├── providers/ │ │ │ │ ├── app-install-cta-modal-provider.mdx │ │ │ │ ├── app-install-cta-modal-provider.tsx │ │ │ │ ├── event-metadata-provider.mdx │ │ │ │ ├── event-metadata-provider.tsx │ │ │ │ ├── event-tracking-provider.mdx │ │ │ │ ├── event-tracking-provider.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── login-cta-modal-provider.mdx │ │ │ │ ├── login-cta-modal-provider.tsx │ │ │ │ ├── triple-web.mdx │ │ │ │ └── triple-web.tsx │ │ │ └── ssr-utils/ │ │ │ ├── auth-guard.test.ts │ │ │ ├── auth-guard.ts │ │ │ ├── get-client-app.ts │ │ │ ├── get-session-availability.ts │ │ │ ├── get-user-agent.ts │ │ │ ├── index.ts │ │ │ └── put-invalid-session-id-remover.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-web-test-utils/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── create-test-wrapper.tsx │ │ │ └── index.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── triple-web-utils/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── check-client-app.test.ts │ │ │ ├── check-client-app.ts │ │ │ ├── index.ts │ │ │ ├── regex.ts │ │ │ ├── user-agent.ts │ │ │ └── user.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ ├── type-definitions/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── geojson.ts │ │ │ ├── image.ts │ │ │ ├── index.ts │ │ │ ├── inventory-item.ts │ │ │ ├── listing-poi.ts │ │ │ ├── translated-property.ts │ │ │ └── triple-document.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── vite.config.mts │ └── view-utilities/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── debounce.ts │ │ ├── derive-current-state-and-count.ts │ │ ├── find-folded-position.ts │ │ ├── format-number.spec.ts │ │ ├── format-number.ts │ │ ├── generate-deep-link/ │ │ │ ├── README.md │ │ │ ├── index.ts │ │ │ ├── make-deep-link-generator.test.ts │ │ │ ├── make-deep-link-generator.ts │ │ │ ├── param-injectors.test.ts │ │ │ └── param-injectors.ts │ │ ├── generate-share-image-url.ts │ │ ├── index.ts │ │ ├── measure-distance.spec.ts │ │ ├── measure-distance.ts │ │ ├── normalize-query-keys/ │ │ │ ├── index.test.ts │ │ │ └── index.ts │ │ ├── routelist/ │ │ │ ├── index.ts │ │ │ ├── routelist.spec.ts │ │ │ └── routelist.ts │ │ ├── strict-query/ │ │ │ ├── index.test.ts │ │ │ └── index.ts │ │ ├── timestamp.ts │ │ ├── url.spec.ts │ │ └── url.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── vite.config.mts ├── pnpm-workspace.yaml ├── renovate.json ├── scripts/ │ └── changelog.js ├── stories/ │ └── introduction.mdx ├── tsconfig.json ├── tsconfig.test.json └── vite.config.mts
Showing preview only (232K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2403 symbols across 828 files)
FILE: .storybook/decorators.tsx
function themeDecorator (line 8) | function themeDecorator(Story) {
function tripleWebProviderDecorator (line 17) | function tripleWebProviderDecorator(Story, context) {
FILE: .storybook/main.ts
constant EXCEPT_PACKAGES (line 8) | const EXCEPT_PACKAGES = ['middlewares']
FILE: .storybook/public/mockServiceWorker.js
constant INTEGRITY_CHECKSUM (line 11) | const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70'
function handleRequest (line 148) | async function handleRequest(event, requestId) {
function resolveMainClient (line 182) | async function resolveMainClient(event) {
function getResponse (line 205) | async function getResponse(event, client, requestId) {
function sendToClient (line 286) | function sendToClient(client, message) {
function sleep (line 302) | function sleep(timeMs) {
function respondWithMock (line 308) | async function respondWithMock(response) {
FILE: examples/nextjs-app/app/layout.tsx
function RootLayout (line 11) | function RootLayout({
FILE: examples/nextjs-app/app/page.tsx
function Home (line 1) | function Home() {
FILE: examples/nextjs-app/app/template.tsx
function Template (line 4) | async function Template({ children }: PropsWithChildren) {
FILE: examples/nextjs-app/lib/registry.tsx
function StyledComponentsRegistry (line 12) | function StyledComponentsRegistry({
function shouldForwardProp (line 42) | function shouldForwardProp(propName: string, target: WebTarget) {
FILE: examples/nextjs-app/lib/theme.tsx
function ThemeProvider (line 7) | function ThemeProvider({ children }: PropsWithChildren) {
FILE: examples/nextjs-pages/pages/_app.tsx
type MyAppProps (line 12) | type MyAppProps = BuildTripleWebPropsResult
function MyApp (line 14) | function MyApp({
function shouldForwardProp (line 61) | function shouldForwardProp(propName: string, target: WebTarget) {
FILE: examples/nextjs-pages/pages/_document.tsx
function Document (line 3) | function Document() {
FILE: examples/nextjs-pages/pages/index.tsx
function Home (line 1) | function Home() {
FILE: jest-setup.js
class ResizeObserver (line 9) | class ResizeObserver {
method observe (line 10) | observe() {}
method unobserve (line 12) | unobserve() {}
method disconnect (line 14) | disconnect() {}
FILE: packages/ab-experiments/src/google-optimize-context/context.tsx
type Window (line 11) | interface Window {
constant GOOGLE_OPTIMIZE_SCRIPT_ID (line 16) | const GOOGLE_OPTIMIZE_SCRIPT_ID = 'google-optimize-script'
function GoogleOptimizeExperimentProvider (line 20) | function GoogleOptimizeExperimentProvider({
function useExperimentVariant (line 72) | function useExperimentVariant<T>({ variants }: { variants: T[] }) {
FILE: packages/ab-experiments/src/triple-ab-experiment-context/context.tsx
type TripleABExperimentMetas (line 16) | interface TripleABExperimentMetas {
function TripleABExperimentProvider (line 22) | function TripleABExperimentProvider({
function useTripleABExperimentMeta (line 78) | function useTripleABExperimentMeta(
type OptionalAttributes (line 101) | interface OptionalAttributes {
type ReservedAttributes (line 108) | type ReservedAttributes =
type EventAttributes (line 113) | type EventAttributes<T = OptionalAttributes> = keyof T &
function useTripleABExperimentConversionTracker (line 125) | function useTripleABExperimentConversionTracker(
function useTripleABExperimentImpressionTracker (line 159) | function useTripleABExperimentImpressionTracker(
function useTripleABExperimentVariant (line 193) | function useTripleABExperimentVariant<T, U = OptionalAttributes>(
function useTripleABExperimentContext (line 225) | function useTripleABExperimentContext() {
FILE: packages/ab-experiments/src/triple-ab-experiment-context/service.ts
type TripleABExperimentMeta (line 3) | interface TripleABExperimentMeta {
function getTripleABExperiment (line 8) | async function getTripleABExperiment(
FILE: packages/constants/src/index.ts
constant SESSION_KEY (line 4) | const SESSION_KEY = 'x-soto-session'
constant TP_TK (line 5) | const TP_TK = 'TP_TK'
constant TP_SE (line 6) | const TP_SE = 'TP_SE'
constant X_TRIPLE_WEB_DEVICE_ID (line 7) | const X_TRIPLE_WEB_DEVICE_ID = 'x-triple-web-device-id'
FILE: packages/constants/src/regex.ts
constant KOREAN_MIDDLE_DOT_UNICODES (line 5) | const KOREAN_MIDDLE_DOT_UNICODES = '\u318D\u119E\u11A2\u2022\u2025\u00B7...
constant KOREAN_VOWEL_UNICODES (line 6) | const KOREAN_VOWEL_UNICODES = '\u314F-\u3163'
constant ENNAME_REGEX (line 14) | const ENNAME_REGEX = /^[A-Z\s]+$/
constant KONAME_REGEX (line 15) | const KONAME_REGEX = /^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]+$/
constant NAME_REGEX (line 16) | const NAME_REGEX = /^([가-힣]{1,100}|[a-zA-Z]{2,32})$/
constant FULL_NAME_REGEX (line 17) | const FULL_NAME_REGEX =
constant EMAIL_REGEX (line 20) | const EMAIL_REGEX =
constant PHONE_REGEX (line 22) | const PHONE_REGEX =
constant DATE_REGEX (line 24) | const DATE_REGEX =
constant CARD_NUMBER_REGEX (line 26) | const CARD_NUMBER_REGEX = /^[1-9][0-9]{11,15}$/
constant CARD_PASSWORD_NUMBER_REGEX (line 27) | const CARD_PASSWORD_NUMBER_REGEX = /^[0-9]{2}$/
constant ONLY_MONTH_DAY_DATE_REGEX (line 28) | const ONLY_MONTH_DAY_DATE_REGEX =
constant ZIP_CODE_REGEX (line 30) | const ZIP_CODE_REGEX = /^[0-9]{5}$/
constant ADDRESS_REGEX (line 31) | const ADDRESS_REGEX = /^([a-zA-Z]|[0-9]|[ ]){1,35}$/
constant SLASH_HYPHEN_REGEX (line 33) | const SLASH_HYPHEN_REGEX = /(\/|-)/g
constant KOREAN_REGEX (line 34) | const KOREAN_REGEX = /[ㄱ-ㅎㅏ-ㅣ가-힣]+/g
constant PASSPORT_NUMBER_REGEX (line 35) | const PASSPORT_NUMBER_REGEX = /[^A-Z0-9]{15}/g
constant ALPHABET_REGEX (line 36) | const ALPHABET_REGEX = /([^a-zA-Z])+/g
constant PASSPORT_NAME_REGEX (line 37) | const PASSPORT_NAME_REGEX = new RegExp(
FILE: packages/fetcher/src/add-fetchers-to-gssp.test.ts
method get (line 60) | get(key: string) {
method get (line 107) | get() {
method get (line 155) | get() {
method get (line 231) | get() {
FILE: packages/fetcher/src/add-fetchers-to-gssp.ts
function addFetchersToGssp (line 20) | function addFetchersToGssp<Props, CustomContext = Record<string, never>>(
function createRefresh (line 86) | function createRefresh({
function createCookieOverrider (line 99) | function createCookieOverrider() {
FILE: packages/fetcher/src/factories.test.ts
function makeTestSuite (line 5) | function makeTestSuite(testingFunction: typeof ssrFetcherize) {
FILE: packages/fetcher/src/factories.ts
type BaseFetcher (line 11) | type BaseFetcher<Extending = unknown> = <
type ExtendFetcher (line 19) | type ExtendFetcher<Fetcher extends BaseFetcher, Extending> = <
function ssrFetcherize (line 43) | function ssrFetcherize<Fetcher extends BaseFetcher>(
constant NEED_LOGIN_IDENTIFIER (line 83) | const NEED_LOGIN_IDENTIFIER = 'NEED_LOGIN'
function isTripleHref (line 92) | function isTripleHref(href: string): boolean {
function authFetcherize (line 104) | function authFetcherize<Fetcher extends BaseFetcher>(
function i18nFetcherize (line 188) | function i18nFetcherize<Fetcher extends BaseFetcher>(
FILE: packages/fetcher/src/fetcher.ts
function fetcher (line 5) | async function fetcher<SuccessBody, FailureBody = unknown>(
function makeFetchRetryable (line 45) | function makeFetchRetryable({
function readResponseBody (line 86) | function readResponseBody(response: Response) {
FILE: packages/fetcher/src/make-request-params.ts
function makeRequestParams (line 5) | function makeRequestParams(
FILE: packages/fetcher/src/methods.ts
function addMethod (line 9) | function addMethod(
FILE: packages/fetcher/src/response-handler.ts
function captureHttpError (line 7) | function captureHttpError<
constant ACCESS_TOKEN_EXPIRED_EXCEPTION (line 19) | const ACCESS_TOKEN_EXPIRED_EXCEPTION = 'AccessTokenExpiredException'
constant NEED_REFRESH_IDENTIFIER (line 20) | const NEED_REFRESH_IDENTIFIER = 'NEED_REFRESH'
type ErrorResponseBody (line 22) | interface ErrorResponseBody {
type ResponseWithError (line 28) | type ResponseWithError = Pick<Response, 'headers' | 'ok' | 'status' | 'u...
function handle401Error (line 33) | async function handle401Error<SuccessBody, FailureBody>(
FILE: packages/fetcher/src/safe-parse-json.ts
function safeParseJson (line 1) | async function safeParseJson(
FILE: packages/fetcher/src/server-fetch.ts
function serverFetcherize (line 20) | function serverFetcherize<Fetcher extends BaseFetcher>(
function removeInvalidCookies (line 50) | function removeInvalidCookies(_cookies: string) {
function isValidCookieValue (line 61) | function isValidCookieValue(value?: string | null) {
FILE: packages/fetcher/src/session-refresh.ts
type SetCookie (line 5) | type SetCookie = Record<string, string>
function sessionRefresh (line 13) | async function sessionRefresh({
function sessionRefreshOnSSR (line 31) | async function sessionRefreshOnSSR({
FILE: packages/fetcher/src/types.ts
type RequestOptions (line 3) | type RequestOptions = Omit<RequestInit, 'body'> & {
type HttpMethods (line 26) | enum HttpMethods {
type HttpErrorResponse (line 34) | interface HttpErrorResponse extends Error {
type SuccessOrFailureBody (line 42) | type SuccessOrFailureBody<SuccessBody, FailureBody> =
type HttpResponse (line 46) | type HttpResponse<SuccessBody, FailureBody = unknown> = Pick<
FILE: packages/i18n/src/types.ts
type I18nKeys (line 3) | type I18nKeys = typeof ko
FILE: packages/intersection-observer/src/lazy-loaded-intersection-observer.tsx
type IntersectionObserverProps (line 5) | interface IntersectionObserverProps extends ReactIntersectionObserverPro...
function importReactIntersectionObserver (line 9) | async function importReactIntersectionObserver() {
function IntersectionObserver (line 42) | function IntersectionObserver({
FILE: packages/intersection-observer/src/use-intersection.ts
function useIntersection (line 4) | function useIntersection<T extends Element>(
FILE: packages/meta-tags/src/app-router/generate-apple-smart-banner-meta.ts
function generateAppleSmartBannerMeta (line 5) | function generateAppleSmartBannerMeta({
FILE: packages/meta-tags/src/app-router/generate-common-meta.ts
function generateCommonMeta (line 3) | function generateCommonMeta(): Metadata {
FILE: packages/meta-tags/src/app-router/generate-essential-content-meta.ts
function generateEssentialContentMeta (line 3) | function generateEssentialContentMeta({
FILE: packages/meta-tags/src/app-router/generate-facebook-app-link-meta.ts
function generateFacebookAppLinkMeta (line 5) | function generateFacebookAppLinkMeta({
FILE: packages/meta-tags/src/app-router/generate-facebook-open-graph-meta.ts
function generateFacebookOpenGraphMeta (line 6) | function generateFacebookOpenGraphMeta({
FILE: packages/meta-tags/src/app-router/generate-triple-default-meta.ts
function generateTripleDefaultMeta (line 9) | function generateTripleDefaultMeta(): Metadata {
FILE: packages/meta-tags/src/constants.ts
constant DEFAULT_APP_ID (line 1) | const DEFAULT_APP_ID = '1225499481'
constant DEFAULT_APP_PACKAGE_NAME (line 2) | const DEFAULT_APP_PACKAGE_NAME = 'com.titicacacorp.triple'
constant DEFAULT_THEME_COLOR (line 3) | const DEFAULT_THEME_COLOR = '#1FC1B6'
constant DEFAULT_OG_IMAGE (line 4) | const DEFAULT_OG_IMAGE = {
FILE: packages/meta-tags/src/pages-router/apple-smart-banner-meta.tsx
function AppleSmartBannerMeta (line 6) | function AppleSmartBannerMeta({
FILE: packages/meta-tags/src/pages-router/common-meta.tsx
function CommonMeta (line 3) | function CommonMeta() {
FILE: packages/meta-tags/src/pages-router/essential-content-meta.test.tsx
function MockHead (line 8) | function MockHead({ children }: { children: Array<React.ReactElement> }) {
FILE: packages/meta-tags/src/pages-router/essential-content-meta.tsx
function EssentialContentMeta (line 4) | function EssentialContentMeta({
FILE: packages/meta-tags/src/pages-router/facebook-app-link-meta.tsx
function FacebookAppLinkMeta (line 6) | function FacebookAppLinkMeta({
FILE: packages/meta-tags/src/pages-router/facebook-open-graph-meta.tsx
function FacebookOpenGraphMeta (line 6) | function FacebookOpenGraphMeta({
FILE: packages/meta-tags/src/pages-router/theme-color-meta.tsx
function ThemeColorMeta (line 6) | function ThemeColorMeta({
FILE: packages/meta-tags/src/structured-data/article-script.tsx
function ArticleScript (line 6) | function ArticleScript(props: ArticleScriptProps) {
FILE: packages/meta-tags/src/structured-data/breadcrumb-list-script.tsx
function BreadcrumbListScript (line 6) | function BreadcrumbListScript(props: BreadcrumbListScriptProps) {
FILE: packages/meta-tags/src/structured-data/discussion-forum-posting-script.tsx
function DiscussionForumPostingScript (line 6) | function DiscussionForumPostingScript(
FILE: packages/meta-tags/src/structured-data/local-business-script.tsx
function LocalBusinessScript (line 6) | function LocalBusinessScript({
FILE: packages/meta-tags/src/structured-data/product-script.tsx
function ProductScript (line 6) | function ProductScript(props: ProductScriptProps) {
FILE: packages/meta-tags/src/structured-data/qa-page-script.tsx
function QaPageScript (line 6) | function QaPageScript(props: QaPageScriptProps) {
FILE: packages/meta-tags/src/structured-data/review-script.tsx
function ReviewScript (line 6) | function ReviewScript({ reviews }: ReviewScriptProps) {
FILE: packages/meta-tags/src/types/schema.ts
type Author (line 3) | interface Author {
type ListItem (line 9) | interface ListItem {
type AddressSchema (line 15) | interface AddressSchema {
type GeoSchema (line 23) | interface GeoSchema {
type AggregateRatingSchema (line 28) | interface AggregateRatingSchema {
type AggregateOfferSchema (line 36) | interface AggregateOfferSchema {
type ReviewSchema (line 44) | interface ReviewSchema {
type ItemAvailability (line 60) | enum ItemAvailability {
type OpeningHoursSpecificationSchema (line 73) | interface OpeningHoursSpecificationSchema {
type Global (line 79) | type Global = 'inherit' | 'initial' | 'revert' | 'unset'
type RGB (line 80) | type RGB = `rgb(${number}, ${number}, ${number})`
type RGBA (line 81) | type RGBA = `rgba(${number}, ${number}, ${number}, ${number})`
type HEX (line 82) | type HEX = `#${string}`
type ThemeColor (line 84) | type ThemeColor = RGB | RGBA | HEX | Global
type InteractionStatisticType (line 86) | type InteractionStatisticType = 'LikeAction' | 'CommentAction'
type InteractionStatistic (line 88) | interface InteractionStatistic {
type CommentType (line 95) | interface CommentType {
type Answer (line 103) | interface Answer {
FILE: packages/meta-tags/src/types/structured-data-script-props.ts
type ArticleScriptProps (line 17) | interface ArticleScriptProps {
type BreadcrumbListScriptProps (line 26) | interface BreadcrumbListScriptProps {
type LocalBusinessScriptProps (line 30) | interface LocalBusinessScriptProps {
type ProductScriptProps (line 47) | interface ProductScriptProps {
type ReviewScriptProps (line 56) | interface ReviewScriptProps {
type DiscussionForumPostingScriptProps (line 60) | interface DiscussionForumPostingScriptProps {
type QaPageScriptProps (line 71) | interface QaPageScriptProps {
FILE: packages/meta-tags/src/utils.ts
constant SCHEMA_SCRIPT_TYPE_MAP (line 1) | const SCHEMA_SCRIPT_TYPE_MAP = {
constant SCHEMA_TYPE_MAP (line 8) | const SCHEMA_TYPE_MAP: Record<string, string> = {
type Formatter (line 25) | type Formatter = (value: string) => string | undefined
constant VALUE_FORMATTER_MAP (line 27) | const VALUE_FORMATTER_MAP: Record<string, Formatter> = {
function createScript (line 33) | function createScript<T extends object>(data: T, type: string) {
function filterValidValue (line 42) | function filterValidValue<T extends object>(originObj: T): T {
function addSchemaType (line 58) | function addSchemaType<T extends object>(originObj: T): T {
function formatValue (line 87) | function formatValue<T extends object>(originObj: T): T {
function formatAvailability (line 110) | function formatAvailability(availability: string) {
function toISOString (line 114) | function toISOString(dateString: string) {
function mergeObj (line 125) | function mergeObj<T1 extends object, T2 extends object>(obj1: T1, obj2: ...
function isObject (line 129) | function isObject<T>(data: T) {
function isArrayOfObject (line 133) | function isArrayOfObject<T>(data: T) {
function isValidValue (line 137) | function isValidValue<T>([_, value]: [key: string, value: T]) {
function pipe (line 149) | function pipe<T extends object>(...functions: ((arg: T) => T)[]) {
FILE: packages/middlewares/src/chain.ts
function chain (line 5) | function chain(
FILE: packages/middlewares/src/refresh-session/next-13.ts
function refreshSessionMiddleware (line 24) | function refreshSessionMiddleware(next: NextMiddleware) {
function deriveAllCookies (line 100) | function deriveAllCookies(cookies: { name: string; value: string }[]) {
FILE: packages/middlewares/src/refresh-session/next-14.ts
function refreshSessionMiddleware (line 26) | function refreshSessionMiddleware(next: NextMiddleware) {
function deriveAllCookies (line 107) | function deriveAllCookies(cookies: { name: string; value: string }[]) {
function changeSetCookieDomainOnLocalhost (line 111) | function changeSetCookieDomainOnLocalhost(
FILE: packages/middlewares/src/set-web-device-id.ts
function setWebDeviceIdMiddleware (line 14) | function setWebDeviceIdMiddleware(next: NextMiddleware) {
FILE: packages/middlewares/src/types.ts
type MiddlewareFactory (line 3) | type MiddlewareFactory = (middleware: NextMiddleware) => NextMiddleware
FILE: packages/middlewares/src/utils/apply-set-cookie.ts
function applySetCookie (line 11) | function applySetCookie(req: NextRequest, res: NextResponse) {
FILE: packages/middlewares/src/utils/get-domain.ts
function getDomain (line 4) | function getDomain(request: NextRequest) {
FILE: packages/middlewares/src/utils/get-triple-app.ts
function getIsTripleApp (line 4) | function getIsTripleApp(request: NextRequest) {
FILE: packages/react-hooks/src/hooks.stories.tsx
function ScrollElement (line 27) | function ScrollElement() {
function ScrollToAnchorComponent (line 47) | function ScrollToAnchorComponent({ useAlias }: { useAlias: boolean }) {
type ScrollToAnchorCustomArgs (line 76) | interface ScrollToAnchorCustomArgs {
function VisibilityChange (line 92) | function VisibilityChange() {
function Lottie (line 102) | function Lottie() {
FILE: packages/react-hooks/src/use-body-scroll-lock.ts
type BodyScrollLockState (line 3) | interface BodyScrollLockState {
function useBodyScrollLock (line 15) | function useBodyScrollLock(lock = false) {
FILE: packages/react-hooks/src/use-debounce.ts
function useDebouncedState (line 3) | function useDebouncedState<T>(
FILE: packages/react-hooks/src/use-error-handler.ts
function useErrorHandler (line 6) | function useErrorHandler() {
FILE: packages/react-hooks/src/use-fetch.ts
type FetchResponse (line 6) | interface FetchResponse {
type FetchStatus (line 12) | interface FetchStatus extends FetchResponse {
function useFetch (line 22) | function useFetch(url: string, options?: any): FetchStatus {
FILE: packages/react-hooks/src/use-interval.ts
function useInterval (line 7) | function useInterval(
FILE: packages/react-hooks/src/use-local-storage.ts
function trigger (line 7) | function trigger(key: string) {
function getSnapshot (line 13) | function getSnapshot(key: string, initialValue: string | undefined) {
function getServerSnapshot (line 22) | function getServerSnapshot(initialValue: string | undefined) {
function useLocalStorage (line 33) | function useLocalStorage(
FILE: packages/react-hooks/src/use-lottie.tsx
function useLottie (line 4) | function useLottie<T extends HTMLElement>({
FILE: packages/react-hooks/src/use-scroll-to-anchor.ts
function useScrollToAnchor (line 4) | function useScrollToAnchor(option?: {
FILE: packages/react-hooks/src/use-scroll-to-element.ts
function useScrollToElement (line 9) | function useScrollToElement() {
FILE: packages/react-hooks/src/use-session-storage.ts
function trigger (line 7) | function trigger(key: string) {
function getSnapshot (line 13) | function getSnapshot(key: string, initialValue: string | undefined) {
function getServerSnapshot (line 22) | function getServerSnapshot(initialValue: string | undefined) {
function useSessionStorage (line 33) | function useSessionStorage(
FILE: packages/react-hooks/src/use-visibility-change.ts
function useVisibilityChange (line 3) | function useVisibilityChange(
FILE: packages/router/src/common/add-web-url-base.test.tsx
constant MOCK_URL_BASE (line 6) | const MOCK_URL_BASE = 'https://triple.guide'
FILE: packages/router/src/common/add-web-url-base.ts
function useWebUrlBaseAdder (line 4) | function useWebUrlBaseAdder() {
FILE: packages/router/src/common/default-router.ts
function useDefaultRouter (line 4) | function useDefaultRouter() {
FILE: packages/router/src/common/disabled-link-notifier.test.tsx
function createWrapper (line 9) | function createWrapper({
FILE: packages/router/src/common/disabled-link-notifier.ts
type AllowSource (line 9) | type AllowSource = 'all' | 'app' | 'app-with-session' | 'none'
type AllowSourceProps (line 11) | interface AllowSourceProps {
function useDisabledLinkNotifierCreator (line 20) | function useDisabledLinkNotifierCreator({
function defaultAlert (line 52) | function defaultAlert(message: string) {
FILE: packages/router/src/common/router-guarded-link.test.tsx
function mockDisabledLinkNotifierCreatorHook (line 96) | function mockDisabledLinkNotifierCreatorHook(disabled: boolean) {
FILE: packages/router/src/common/router-guarded-link.tsx
function RouterGuardedLink (line 13) | function RouterGuardedLink({
FILE: packages/router/src/common/target.ts
type TargetType (line 1) | type TargetType = 'current' | 'new' | 'browser'
type TargetProps (line 3) | interface TargetProps {
constant ANCHOR_TARGET_MAP (line 12) | const ANCHOR_TARGET_MAP: {
FILE: packages/router/src/common/types.ts
type HrefProps (line 5) | interface HrefProps {
type LnbTargetType (line 9) | type LnbTargetType = 'trip' | 'zone' | 'region'
type AppSpecificLinkProps (line 11) | interface AppSpecificLinkProps {
type LinkCommonProps (line 43) | type LinkCommonProps = {
FILE: packages/router/src/common/use-rel.ts
type LinkType (line 4) | type LinkType =
type RelListProps (line 19) | interface RelListProps {
function useRel (line 28) | function useRel(relList: LinkType[] = []): string {
FILE: packages/router/src/external/hook.ts
function useExternalRouter (line 12) | function useExternalRouter() {
FILE: packages/router/src/external/href-handler.ts
function useExternalHrefHandler (line 10) | function useExternalHrefHandler() {
FILE: packages/router/src/external/link.tsx
function ExternalLink (line 11) | function ExternalLink({
FILE: packages/router/src/external/utils.ts
function checkHrefIsAbsoluteUrl (line 3) | function checkHrefIsAbsoluteUrl(href: string): boolean {
FILE: packages/router/src/href-to-props/use-href-to-props.test.tsx
function createWrapper (line 13) | function createWrapper({ isPublic }: { isPublic: boolean }) {
FILE: packages/router/src/href-to-props/use-href-to-props.ts
function removeTripleDomain (line 16) | function removeTripleDomain({
function stringifyParsedQuery (line 50) | function stringifyParsedQuery(
function stripAppBridge (line 68) | function stripAppBridge(href: string): string {
function canonizeHref (line 100) | function canonizeHref({
function getTarget (line 121) | function getTarget({
function getAllowSource (line 148) | function getAllowSource({
function useHrefToProps (line 178) | function useHrefToProps(params?: {
FILE: packages/router/src/links/use-make-inlink.ts
type InlinkLnbType (line 6) | type InlinkLnbType = 'trip' | 'zone' | 'region'
type MakeInlinkOptions (line 8) | interface MakeInlinkOptions {
function useMakeInlink (line 37) | function useMakeInlink() {
function getLnb (line 77) | function getLnb(type: InlinkLnbType, id: string) {
FILE: packages/router/src/links/use-make-outlink.ts
type MakeOutlinkOptions (line 6) | interface MakeOutlinkOptions {
function useMakeOutlink (line 17) | function useMakeOutlink() {
FILE: packages/router/src/links/use-open-inlink.ts
type OpenInlinkOptions (line 5) | type OpenInlinkOptions = MakeInlinkOptions
function useOpenInlink (line 7) | function useOpenInlink() {
FILE: packages/router/src/links/use-open-native-link.ts
function useOpenNativeLink (line 8) | function useOpenNativeLink() {
FILE: packages/router/src/links/use-open-outlink.ts
type OpenOutlinkOptions (line 5) | type OpenOutlinkOptions = MakeOutlinkOptions
function useOpenOutlink (line 7) | function useOpenOutlink() {
FILE: packages/router/src/local/base-path.ts
function useBasePathAdder (line 4) | function useBasePathAdder() {
function addBasePath (line 10) | function addBasePath(href: string, basePath: string): string {
FILE: packages/router/src/local/hook.ts
function useLocalRouter (line 12) | function useLocalRouter() {
FILE: packages/router/src/local/href-handler.ts
type NextjsRoutingOptions (line 11) | interface NextjsRoutingOptions {
function useLocalHrefHandler (line 28) | function useLocalHrefHandler() {
FILE: packages/router/src/local/link.tsx
function isKeyPressingClick (line 16) | function isKeyPressingClick(e: MouseEvent<HTMLAnchorElement>): boolean {
function LocalLink (line 24) | function LocalLink({
FILE: packages/router/src/navigate/canonization.ts
function canonizeTargetAddress (line 4) | function canonizeTargetAddress({
FILE: packages/router/src/navigate/use-isomorphic-navigate.ts
function pushRouter (line 9) | async function pushRouter(
function replaceRouter (line 25) | async function replaceRouter(
function backOrClose (line 41) | function backOrClose() {
function closeWindow (line 49) | function closeWindow() {
function asyncBack (line 53) | function asyncBack(backer = Router.back): Promise<void> {
function useIsomorphicNavigate (line 66) | function useIsomorphicNavigate() {
FILE: packages/router/src/navigate/use-navigate.ts
function useNavigate (line 21) | function useNavigate({
function defaultChangeLocationHref (line 144) | function defaultChangeLocationHref(href: string) {
FILE: packages/scroll-to-element/src/scroll-position-calculators.ts
function initialScrollPosition (line 1) | function initialScrollPosition(): {
function calculateScrollOffset (line 13) | function calculateScrollOffset({
function getDocumentHeight (line 36) | function getDocumentHeight(): number {
function deriveScrollPosition (line 49) | function deriveScrollPosition(element: Element, alignment?: string): num...
FILE: packages/scroll-to-element/src/scroll-to-element.ts
function scrollToElement (line 5) | function scrollToElement(
FILE: packages/scroll-to-element/src/scroll.ts
function scroll (line 6) | function scroll({
function animate (line 31) | function animate() {
FILE: packages/scroll-to-element/src/types.ts
type ScrollOptions (line 1) | interface ScrollOptions {
FILE: packages/standard-action-handler/src/converse.tsx
constant HASH_CONVERSE_MODAL (line 8) | const HASH_CONVERSE_MODAL = 'hash.converse-modal'
type ModalType (line 10) | type ModalType = 'login' | 'error' | 'normal'
constant NEED_LOGIN_CONTENT (line 12) | const NEED_LOGIN_CONTENT: {
function converse (line 22) | async function converse({
function OpenModal (line 66) | function OpenModal({
function fetchApi (line 93) | async function fetchApi(
function getOnActions (line 122) | function getOnActions(
FILE: packages/standard-action-handler/src/copy-to-clipboard.ts
function copyToClipboard (line 6) | async function copyToClipboard({
FILE: packages/standard-action-handler/src/fetch-api.ts
function fetchApi (line 5) | async function fetchApi({
FILE: packages/standard-action-handler/src/handler.ts
class Handler (line 6) | class Handler {
method constructor (line 11) | public constructor({
method execute (line 25) | public async execute(url: string, params?: NavigateOptions) {
method toFunction (line 46) | public toFunction() {
FILE: packages/standard-action-handler/src/hook.ts
function useStandardActionHandler (line 11) | function useStandardActionHandler(options?: ContextOptions) {
FILE: packages/standard-action-handler/src/image-download.ts
function imageDownload (line 5) | async function imageDownload({
FILE: packages/standard-action-handler/src/initialize.ts
function initialize (line 17) | function initialize(
FILE: packages/standard-action-handler/src/invoke-cta.ts
function invokeCta (line 3) | async function invokeCta({
FILE: packages/standard-action-handler/src/new-window.ts
function newWindow (line 5) | async function newWindow({
FILE: packages/standard-action-handler/src/require-triple-client.tsx
function requireTripleClient (line 5) | async function requireTripleClient({
FILE: packages/standard-action-handler/src/scroll-to-element.ts
function scrollToElement (line 6) | async function scrollToElement({
FILE: packages/standard-action-handler/src/serial.ts
function serial (line 5) | async function serial({
function sleep (line 25) | function sleep(seconds: number) {
FILE: packages/standard-action-handler/src/services/copy.ts
function createClipboardCopier (line 6) | function createClipboardCopier() {
function copyWithClipboard (line 16) | async function copyWithClipboard({
function copyWithDomApi (line 28) | function copyWithDomApi({ text, message }: { text: string; message: stri...
function copyTextNativeInterface (line 40) | function copyTextNativeInterface({
FILE: packages/standard-action-handler/src/services/share.ts
constant DEFAULT_IMAGE (line 8) | const DEFAULT_IMAGE =
type SharingParams (line 11) | interface SharingParams {
function createShareUrl (line 19) | function createShareUrl() {
function navigatorShare (line 29) | function navigatorShare({ params }: { params: SharingParams }) {
function copyUrlToClipboard (line 39) | function copyUrlToClipboard({
function shareNativeInterface (line 56) | function shareNativeInterface({
FILE: packages/standard-action-handler/src/share.ts
function share (line 6) | async function share({
function getSharingParams (line 27) | function getSharingParams() {
function getMetadata (line 40) | function getMetadata({ property }: { property: string }) {
FILE: packages/standard-action-handler/src/show-toast.ts
function showToast (line 6) | async function showToast({
FILE: packages/standard-action-handler/src/types.ts
type NavigateOptions (line 4) | interface NavigateOptions {
type TargetType (line 10) | type TargetType = 'current' | 'new' | 'browser'
type ContextOptions (line 12) | interface ContextOptions {
type WebActionParams (line 29) | interface WebActionParams {
type WebAction (line 38) | type WebAction = (webActionParams: WebActionParams) => Promise<boolean>
FILE: packages/tds-theme/src/styled.ts
type DefaultTheme (line 6) | interface DefaultTheme extends Theme {}
type Attributes (line 10) | interface Attributes {
FILE: packages/tds-theme/src/theme/types.ts
type Theme (line 3) | type Theme = typeof defaultTheme
FILE: packages/tds-ui/src/commons.ts
type MarginPadding (line 3) | type MarginPadding = Partial<
type BaseSizes (line 13) | type BaseSizes = 'small' | 'medium' | 'large'
type GlobalSizes (line 18) | type GlobalSizes =
type GlobalColorSet (line 26) | enum GlobalColorSet {
type GlobalColors (line 33) | type GlobalColors = 'blue' | 'gray' | 'white' | 'red'
function GetGlobalColor (line 35) | function GetGlobalColor(colorString: GlobalColors | string) {
type Ratio (line 42) | type Ratio =
type FrameRatioAndSizes (line 55) | type FrameRatioAndSizes =
constant MEDIA_FRAME_OPTIONS (line 71) | const MEDIA_FRAME_OPTIONS: {
type CarouselSizes (line 84) | type CarouselSizes = Exclude<
FILE: packages/tds-ui/src/components/accordion/accordion-content.tsx
type AccordionContentProps (line 7) | type AccordionContentProps = PropsWithChildren
FILE: packages/tds-ui/src/components/accordion/accordion-context.tsx
type AccordionContextValue (line 3) | interface AccordionContextValue {
function useAccordion (line 14) | function useAccordion() {
FILE: packages/tds-ui/src/components/accordion/accordion-folded.tsx
type AccordionFoldedProps (line 7) | type AccordionFoldedProps = PropsWithChildren
FILE: packages/tds-ui/src/components/accordion/accordion-title.tsx
type AccordionTitleProps (line 33) | type AccordionTitleProps = PropsWithChildren
FILE: packages/tds-ui/src/components/accordion/accordion.tsx
type AccordionProps (line 5) | interface AccordionProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/action-sheet-select/action-sheet-select-button.tsx
type ActionSheetSelectButtonProps (line 37) | type ActionSheetSelectButtonProps = HTMLAttributes<HTMLButtonElement>
FILE: packages/tds-ui/src/components/action-sheet-select/action-sheet-select-context.tsx
type ActionSheetSelectContextValue (line 8) | interface ActionSheetSelectContextValue {
function useActionSheetSelect (line 28) | function useActionSheetSelect() {
FILE: packages/tds-ui/src/components/action-sheet-select/action-sheet-select-option.tsx
type ActionSheetSelectOptionProps (line 24) | interface ActionSheetSelectOptionProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/action-sheet-select/action-sheet-select-options.tsx
type ActionSheetSelectOptions (line 16) | type ActionSheetSelectOptions = Pick<
FILE: packages/tds-ui/src/components/action-sheet-select/action-sheet-select.tsx
type ActionSheetSelectProps (line 17) | interface ActionSheetSelectProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/action-sheet/action-sheet-body.tsx
type SheetProps (line 11) | interface SheetProps {
type ActionSheetBodyProps (line 59) | interface ActionSheetBodyProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/action-sheet/action-sheet-context.tsx
type ActionSheetContextValue (line 3) | interface ActionSheetContextValue {
function useActionSheet (line 12) | function useActionSheet() {
FILE: packages/tds-ui/src/components/action-sheet/action-sheet-item.tsx
constant URL_BY_NAMES (line 41) | const URL_BY_NAMES: { [key: string]: string } = {
constant CHECKED_ICON_URL (line 57) | const CHECKED_ICON_URL = 'https://assets.triple.guide/images/checkbox-on...
type ActionSheetItemProps (line 75) | interface ActionSheetItemProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/action-sheet/action-sheet-overlay.tsx
type ActionSheetOverlayProps (line 23) | interface ActionSheetOverlayProps {
FILE: packages/tds-ui/src/components/action-sheet/action-sheet-title.tsx
type ActionSheetTitleProps (line 6) | interface ActionSheetTitleProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/action-sheet/action-sheet.stories.tsx
type Story (line 47) | type Story = StoryObj<typeof ActionSheet>
FILE: packages/tds-ui/src/components/action-sheet/action-sheet.test.tsx
function ThemeWrapper (line 9) | function ThemeWrapper({ children }: PropsWithChildren<unknown>) {
FILE: packages/tds-ui/src/components/action-sheet/action-sheet.tsx
type ActionSheetProps (line 19) | interface ActionSheetProps
FILE: packages/tds-ui/src/components/action-sheet/constants.tsx
constant TRANSITION_DURATION (line 1) | const TRANSITION_DURATION = 120
FILE: packages/tds-ui/src/components/alert/alert.tsx
type AlertProps (line 5) | interface AlertProps {
FILE: packages/tds-ui/src/components/button/basic-button.tsx
type Color (line 6) | type Color = keyof Theme['colors']
constant BASIC_INVERTED_COLORS (line 8) | const BASIC_INVERTED_COLORS: Partial<Record<Color, string>> = {
type BasicButtonOwnProps (line 13) | interface BasicButtonOwnProps extends ButtonBaseMixinProps {
FILE: packages/tds-ui/src/components/button/button-base.tsx
constant SIZES (line 13) | const SIZES: Record<ButtonSize, ReturnType<typeof css>> = {
type ButtonBaseMixinProps (line 27) | interface ButtonBaseMixinProps extends MarginMixinProps {
type ButtonBaseProps (line 47) | type ButtonBaseProps = ButtonBaseMixinProps &
FILE: packages/tds-ui/src/components/button/button-container.ts
type ButtonContainerProps (line 8) | interface ButtonContainerProps {
FILE: packages/tds-ui/src/components/button/button-group.ts
type ButtonGroupProps (line 8) | interface ButtonGroupProps {
FILE: packages/tds-ui/src/components/button/button-icon.tsx
type ButtonIconSize (line 5) | type ButtonIconSize = 'tiny' | 'small'
constant BUTTON_ICON_STYLES (line 7) | const BUTTON_ICON_STYLES: Record<ButtonIconSize, ReturnType<typeof css>>...
type ButtonIconProps (line 22) | interface ButtonIconProps {
FILE: packages/tds-ui/src/components/button/button.tsx
type ButtonOwnProps (line 11) | interface ButtonOwnProps
type ButtonProps (line 25) | type ButtonProps = ButtonOwnProps &
FILE: packages/tds-ui/src/components/button/icon-button.tsx
constant ICON_BUTTON_URLS (line 6) | const ICON_BUTTON_URLS = {
type Icon (line 16) | type Icon = keyof typeof ICON_BUTTON_URLS
constant ICON_PADDINGS (line 18) | const ICON_PADDINGS: Partial<Record<ButtonSize, ReturnType<typeof css>>>...
type IconButtonMixinProps (line 22) | interface IconButtonMixinProps extends ButtonBaseMixinProps {
FILE: packages/tds-ui/src/components/button/normal-button.tsx
constant NORMAL_PADDINGS (line 7) | const NORMAL_PADDINGS: Partial<Record<ButtonSize, ReturnType<typeof css>...
constant COMPACT_NORMAL_PADDINGS (line 13) | const COMPACT_NORMAL_PADDINGS: Partial<
type NormalButtonMixinProps (line 19) | interface NormalButtonMixinProps extends ButtonBaseMixinProps {
FILE: packages/tds-ui/src/components/button/types.ts
type ButtonSize (line 1) | type ButtonSize = 'tiny' | 'small' | 'large'
FILE: packages/tds-ui/src/components/carousel/carousel-item.tsx
constant CAROUSEL_WIDTH_SIZES (line 7) | const CAROUSEL_WIDTH_SIZES = {
constant CAROUSEL_LEFT_SPACING_SIZES (line 14) | const CAROUSEL_LEFT_SPACING_SIZES = {
function CarouselItem (line 34) | function CarouselItem({
FILE: packages/tds-ui/src/components/carousel/carousel.stories.tsx
type Story (line 21) | type Story = StoryObj<typeof Carousel>
FILE: packages/tds-ui/src/components/carousel/carousel.tsx
type CarouselBaseProps (line 8) | interface CarouselBaseProps extends MarginMixinProps {
type CarouselProps (line 36) | type CarouselProps = PropsWithChildren<CarouselBaseProps>
function Carousel (line 38) | function Carousel({
FILE: packages/tds-ui/src/components/checkbox-group/checkbox-group-context.tsx
type CheckboxGroupContextValue (line 3) | interface CheckboxGroupContextValue {
FILE: packages/tds-ui/src/components/checkbox-group/checkbox-group-error.tsx
type CheckboxGroupErrorProps (line 8) | type CheckboxGroupErrorProps = PropsWithChildren
FILE: packages/tds-ui/src/components/checkbox-group/checkbox-group-help.tsx
type CheckboxGroupHelpProps (line 8) | type CheckboxGroupHelpProps = PropsWithChildren
FILE: packages/tds-ui/src/components/checkbox-group/checkbox-group-label.tsx
type LabelProps (line 8) | interface LabelProps {
type CheckboxGroupLabelProps (line 42) | type CheckboxGroupLabelProps = PropsWithChildren
FILE: packages/tds-ui/src/components/checkbox-group/checkbox-group.stories.tsx
type Story (line 46) | type Story = StoryObj<typeof CheckboxGroup>
FILE: packages/tds-ui/src/components/checkbox-group/checkbox-group.tsx
type CheckboxGroupProps (line 8) | interface CheckboxGroupProps
FILE: packages/tds-ui/src/components/checkbox-group/use-checkbox-group.tsx
function useCheckboxGroup (line 5) | function useCheckboxGroup() {
FILE: packages/tds-ui/src/components/checkbox/checkbox-base.tsx
type CheckboxVariant (line 6) | type CheckboxVariant = 'square' | 'round'
type CheckboxBaseProps (line 42) | interface CheckboxBaseProps
FILE: packages/tds-ui/src/components/checkbox/checkbox.stories.tsx
type Story (line 36) | type Story = StoryObj<typeof Checkbox>
FILE: packages/tds-ui/src/components/checkbox/checkbox.tsx
type CheckboxProps (line 29) | interface CheckboxProps extends CheckboxBaseProps, PropsWithChildren {}
FILE: packages/tds-ui/src/components/confirm-selector/confirm-selector-base.tsx
type ConfirmSelectorBaseProps (line 36) | type ConfirmSelectorBaseProps = InputHTMLAttributes<HTMLInputElement>
FILE: packages/tds-ui/src/components/confirm-selector/confirm-selector.tsx
type ConfirmSelectorProps (line 25) | interface ConfirmSelectorProps
FILE: packages/tds-ui/src/components/confirm/confirm.tsx
type ConfirmProps (line 5) | interface ConfirmProps {
FILE: packages/tds-ui/src/components/container/container.stories.tsx
type Story (line 20) | type Story = StoryObj<typeof Container>
FILE: packages/tds-ui/src/components/container/container.test.tsx
function ThemeWrapper (line 8) | function ThemeWrapper({ children }: PropsWithChildren<unknown>) {
FILE: packages/tds-ui/src/components/container/container.tsx
type ContainerProps (line 16) | type ContainerProps = PropsWithChildren<{
FILE: packages/tds-ui/src/components/drawer-button/drawer-button.stories.tsx
type Story (line 30) | type Story = StoryObj<typeof DrawerButton>
FILE: packages/tds-ui/src/components/drawer-button/drawer-button.tsx
type DrawerButtonProps (line 17) | type DrawerButtonProps = Omit<DrawerProps, 'overflow'> & ButtonProps
function DrawerButton (line 19) | function DrawerButton({
FILE: packages/tds-ui/src/components/drawer/drawer.stories.tsx
type Story (line 39) | type Story = StoryObj<typeof Drawer>
FILE: packages/tds-ui/src/components/drawer/drawer.tsx
constant TRANSITION_DURATION (line 11) | const TRANSITION_DURATION = 300
type DrawerContainerProps (line 13) | interface DrawerContainerProps {
type DrawerProps (line 33) | interface DrawerProps extends PropsWithChildren {
function Drawer (line 43) | function Drawer({
FILE: packages/tds-ui/src/components/fieldset/fieldset-context.tsx
type FieldsetContextValue (line 3) | interface FieldsetContextValue {
FILE: packages/tds-ui/src/components/fieldset/fieldset-legend.tsx
type LegendProps (line 8) | interface LegendProps {
type FieldsetLegendProps (line 29) | type FieldsetLegendProps = PropsWithChildren
FILE: packages/tds-ui/src/components/fieldset/fieldset.stories.tsx
type Story (line 45) | type Story = StoryObj<typeof Fieldset>
FILE: packages/tds-ui/src/components/fieldset/fieldset.tsx
type FieldsetProps (line 5) | interface FieldsetProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/fieldset/use-fieldset.tsx
function useFieldset (line 5) | function useFieldset() {
FILE: packages/tds-ui/src/components/flex-box/flex-box.stories.tsx
type Story (line 81) | type Story = StoryObj<typeof FlexBox>
FILE: packages/tds-ui/src/components/flex-box/flex-box.tsx
type FlexItemOwnProps (line 8) | interface FlexItemOwnProps extends ContainerProps {
type FlexItemProps (line 30) | type FlexItemProps = FlexItemOwnProps & HTMLAttributes<Element>
type FlexBoxProps (line 43) | interface FlexBoxProps
FILE: packages/tds-ui/src/components/form-field/form-field-context.tsx
type FormFieldContextValue (line 3) | interface FormFieldContextValue {
function useFormField (line 20) | function useFormField() {
FILE: packages/tds-ui/src/components/form-field/form-field-error.tsx
type FormFieldErrorProps (line 8) | type FormFieldErrorProps = PropsWithChildren
FILE: packages/tds-ui/src/components/form-field/form-field-help.tsx
type FormFieldHelpProps (line 8) | type FormFieldHelpProps = PropsWithChildren
FILE: packages/tds-ui/src/components/form-field/form-field-label.tsx
type LabelProps (line 9) | interface LabelProps {
type FormFieldLabelProps (line 44) | type FormFieldLabelProps = PropsWithChildren
FILE: packages/tds-ui/src/components/form-field/form-field.stories.tsx
type Story (line 60) | type Story = StoryObj<typeof FormField>
FILE: packages/tds-ui/src/components/form-field/form-field.tsx
type FormFieldProps (line 9) | interface FormFieldProps
FILE: packages/tds-ui/src/components/form-field/use-form-field-state.ts
type UseFormFieldStateParams (line 3) | interface UseFormFieldStateParams {
function useFormFieldState (line 8) | function useFormFieldState(params: UseFormFieldStateParams) {
FILE: packages/tds-ui/src/components/gender-selector/gender-selector-item.tsx
type GenderSelectorItemProps (line 30) | interface GenderSelectorItemProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/gender-selector/gender-selector.stories.tsx
type Story (line 32) | type Story = StoryObj<typeof GenderSelector>
FILE: packages/tds-ui/src/components/gender-selector/gender-selector.tsx
type GenderSelectorProps (line 5) | type GenderSelectorProps = Omit<RadioGroupProps, 'children'>
FILE: packages/tds-ui/src/components/hr/hr.ts
type HrProps (line 5) | interface HrProps {
constant HR1 (line 10) | const HR1 = styled.div.withConfig({ shouldForwardProp })<HrProps>`
constant HR2 (line 22) | const HR2 = styled.div.withConfig({ shouldForwardProp })<HrProps>`
constant HR3 (line 34) | const HR3 = styled.div.withConfig({
constant HR4 (line 41) | const HR4 = styled.div`
constant HR5 (line 50) | const HR5 = styled.div`
constant HR6 (line 59) | const HR6 = styled.div`
constant HR7 (line 68) | const HR7 = styled.div.withConfig({ shouldForwardProp })<HrProps>`
FILE: packages/tds-ui/src/components/icon/icon.ts
type Icons (line 7) | type Icons = 'save' | 'web' | 'call' | 'map' | 'arrowRight'
constant URL_BY_NAMES (line 9) | const URL_BY_NAMES: { [key in Icons]: string } = {
constant SIZES (line 17) | const SIZES: Partial<Record<GlobalSizes, string>> = {
FILE: packages/tds-ui/src/components/image/circular.ts
constant ROUND_SIZES (line 7) | const ROUND_SIZES: Partial<Record<GlobalSizes, number>> = {
FILE: packages/tds-ui/src/components/image/context.tsx
type ImageStateContextValue (line 9) | interface ImageStateContextValue {
function ImageStateContextProvider (line 17) | function ImageStateContextProvider({
function useImageState (line 41) | function useImageState() {
FILE: packages/tds-ui/src/components/image/fixed-dimensions-frame.tsx
constant IMAGE_HEIGHT_OPTIONS (line 10) | const IMAGE_HEIGHT_OPTIONS: Partial<Record<GlobalSizes, string>> = {
function ImageFixedDimensionsFrame (line 37) | function ImageFixedDimensionsFrame({
FILE: packages/tds-ui/src/components/image/fixed-ratio-frame.tsx
function useContentAbsolute (line 21) | function useContentAbsolute() {
function ImageFixedRatioFrame (line 49) | function ImageFixedRatioFrame({
FILE: packages/tds-ui/src/components/image/image.stories.tsx
type Story (line 11) | type Story = StoryObj<typeof Image>
FILE: packages/tds-ui/src/components/image/image.tsx
function Image (line 14) | function Image({
FILE: packages/tds-ui/src/components/image/img.tsx
function ImageImg (line 33) | function ImageImg(props: ComponentPropsWithoutRef<'img'>) {
FILE: packages/tds-ui/src/components/image/link-indicator.tsx
function ImageLinkIndicator (line 13) | function ImageLinkIndicator() {
FILE: packages/tds-ui/src/components/image/optimized-img.tsx
type OptimizedImgProps (line 10) | interface OptimizedImgProps {
function ImageOptimizedImg (line 42) | function ImageOptimizedImg({
FILE: packages/tds-ui/src/components/image/overlay.tsx
type OverlayType (line 9) | type OverlayType = 'gradient' | 'dark'
function ImageOverlay (line 43) | function ImageOverlay({
FILE: packages/tds-ui/src/components/image/placeholder.tsx
function ImagePlaceholder (line 32) | function ImagePlaceholder({ src }: { src?: string }) {
FILE: packages/tds-ui/src/components/image/source-url.tsx
function ImageSourceUrl (line 18) | function ImageSourceUrl({ children }: PropsWithChildren<unknown>) {
FILE: packages/tds-ui/src/components/input/input.tsx
type InputProps (line 36) | interface InputProps
FILE: packages/tds-ui/src/components/label/label.stories.tsx
type Story (line 50) | type Story = StoryObj<typeof Label>
FILE: packages/tds-ui/src/components/label/label.tsx
type LabelColor (line 9) | type LabelColor =
constant LABEL_COLORS (line 21) | const LABEL_COLORS: {
type RadioLabelProps (line 92) | interface RadioLabelProps {
constant PROMO_SIZES (line 116) | const PROMO_SIZES = {
type PromoLabelProps (line 143) | interface PromoLabelProps {
type LabelProps (line 200) | interface LabelProps extends PromoLabelProps, RadioLabelProps {
class Label (line 213) | class Label extends PureComponent<
method render (line 219) | public render() {
FILE: packages/tds-ui/src/components/list/list.stories.tsx
type Story (line 20) | type Story = StoryObj<typeof List>
FILE: packages/tds-ui/src/components/list/list.tsx
type ListBaseProp (line 8) | interface ListBaseProp {
type DividerOptions (line 15) | interface DividerOptions {
type ListItemProps (line 21) | interface ListItemProps {
class List (line 121) | class List extends PureComponent<
method render (line 126) | public render() {
FILE: packages/tds-ui/src/components/long-clickable/long-clickable.tsx
type LongClickableComponentProps (line 10) | interface LongClickableComponentProps<T = Element> {
function longClickable (line 18) | function longClickable<T extends LongClickableComponentProps>(
FILE: packages/tds-ui/src/components/modal/modal-action.tsx
constant ACTION_COLORS (line 6) | const ACTION_COLORS: Partial<Record<GlobalColors, string>> = {
FILE: packages/tds-ui/src/components/modal/modal-context.tsx
type ModalContextValue (line 3) | interface ModalContextValue {
function useModal (line 14) | function useModal() {
FILE: packages/tds-ui/src/components/modal/modal-description.tsx
type ModalDescriptionProps (line 7) | type ModalDescriptionProps = PropsWithChildren
FILE: packages/tds-ui/src/components/modal/modal-title.tsx
type ModalTitleProps (line 12) | type ModalTitleProps = PropsWithChildren
FILE: packages/tds-ui/src/components/modal/modal.stories.tsx
type Story (line 32) | type Story = StoryObj<typeof Modal>
FILE: packages/tds-ui/src/components/modal/modal.test.tsx
function ThemeWrapper (line 9) | function ThemeWrapper({ children }: PropsWithChildren<unknown>) {
FILE: packages/tds-ui/src/components/modal/modal.tsx
type ModalProps (line 41) | interface ModalProps extends PropsWithChildren {
FILE: packages/tds-ui/src/components/navbar/navbar.stories.tsx
type Story (line 49) | type Story = StoryObj<typeof Navbar>
FILE: packages/tds-ui/src/components/navbar/navbar.tsx
type NavbarProps (line 19) | interface NavbarProps {
type IconNames (line 84) | type IconNames =
constant ICON_URL_BY_NAMES (line 104) | const ICON_URL_BY_NAMES: { [key in IconNames]: string } = {
type NavbarItemProps (line 126) | interface NavbarItemProps {
function NavbarWrapper (line 183) | function NavbarWrapper({
function Navbar (line 219) | function Navbar({
FILE: packages/tds-ui/src/components/navbar/search-navbar.stories.tsx
type Story (line 31) | type Story = StoryObj<typeof SearchNavbar>
FILE: packages/tds-ui/src/components/navbar/search-navbar.tsx
type InputProps (line 59) | interface InputProps {
function SearchNavbar (line 97) | function SearchNavbar({
FILE: packages/tds-ui/src/components/numeric-spinner/numeric-spinner-base.tsx
function clamp (line 7) | function clamp(value: number, min: number, max: number) {
type NumericSpinnerBaseProps (line 36) | interface NumericSpinnerBaseProps {
FILE: packages/tds-ui/src/components/numeric-spinner/numeric-spinner.stories.tsx
type Story (line 51) | type Story = StoryObj<typeof NumericSpinner>
FILE: packages/tds-ui/src/components/numeric-spinner/numeric-spinner.tsx
type NumericSpinnerProps (line 11) | interface NumericSpinnerProps extends NumericSpinnerBaseProps {
FILE: packages/tds-ui/src/components/popup/popup.stories.tsx
type Story (line 25) | type Story = StoryObj<typeof Popup>
FILE: packages/tds-ui/src/components/popup/popup.test.tsx
function ThemeWrapper (line 9) | function ThemeWrapper({ children }: PropsWithChildren<unknown>) {
FILE: packages/tds-ui/src/components/popup/popup.tsx
type NavbarIcon (line 16) | type NavbarIcon = 'close' | 'back'
constant TRANSITION_DURATION (line 18) | const TRANSITION_DURATION = 300
type PopupProps (line 49) | interface PopupProps extends PropsWithChildren {
function Popup (line 79) | function Popup({
FILE: packages/tds-ui/src/components/radio-group/radio-group-context.tsx
type RadioGroupContextValue (line 3) | interface RadioGroupContextValue {
FILE: packages/tds-ui/src/components/radio-group/radio-group-error.tsx
type RadioGroupErrorProps (line 8) | type RadioGroupErrorProps = PropsWithChildren
FILE: packages/tds-ui/src/components/radio-group/radio-group-help.tsx
type RadioGroupHelpProps (line 8) | type RadioGroupHelpProps = PropsWithChildren
FILE: packages/tds-ui/src/components/radio-group/radio-group-label.tsx
type LabelProps (line 8) | interface LabelProps {
type RadioGroupLabelProps (line 42) | type RadioGroupLabelProps = PropsWithChildren
FILE: packages/tds-ui/src/components/radio-group/radio-group.stories.tsx
type Story (line 34) | type Story = StoryObj<typeof RadioGroup>
FILE: packages/tds-ui/src/components/radio-group/radio-group.tsx
type RadioGroupProps (line 8) | interface RadioGroupProps
FILE: packages/tds-ui/src/components/radio-group/use-radio-group.tsx
function useRadioGroup (line 5) | function useRadioGroup() {
FILE: packages/tds-ui/src/components/radio/radio-base.tsx
type RadioBaseProps (line 31) | type RadioBaseProps = InputHTMLAttributes<HTMLInputElement>
FILE: packages/tds-ui/src/components/radio/radio.tsx
type RadioProps (line 28) | type RadioProps = RadioBaseProps & PropsWithChildren
FILE: packages/tds-ui/src/components/rating/rating.stories.tsx
type Story (line 31) | type Story = StoryObj<typeof Rating>
FILE: packages/tds-ui/src/components/rating/rating.tsx
constant SIZES (line 7) | const SIZES: Partial<Record<GlobalSizes, string>> = {
constant MARGINS (line 13) | const MARGINS: Partial<Record<GlobalSizes, string>> = {
constant IMAGE_PREFIXES (line 18) | const IMAGE_PREFIXES: Partial<Record<GlobalSizes, string>> = {
function Rating (line 46) | function Rating({
FILE: packages/tds-ui/src/components/responsive/responsive.tsx
type ResponsiveProps (line 6) | type ResponsiveProps = PropsWithChildren<{
FILE: packages/tds-ui/src/components/section/section.tsx
type SectionProps (line 6) | interface SectionProps extends ContainerProps {
function Section (line 11) | function Section({ children, divider, anchor, ...props }: SectionProps) {
FILE: packages/tds-ui/src/components/segment/segment.stories.tsx
type Story (line 11) | type Story = StoryObj<typeof Card>
FILE: packages/tds-ui/src/components/segment/segment.tsx
type BoxProps (line 18) | interface BoxProps {
type CardProps (line 34) | interface CardProps
function Card (line 45) | function Card({
FILE: packages/tds-ui/src/components/select/select.stories.tsx
type Story (line 25) | type Story = StoryObj<typeof Select>
constant STORY_OPTIONS (line 27) | const STORY_OPTIONS = [
FILE: packages/tds-ui/src/components/select/select.tsx
type OptionValueType (line 43) | type OptionValueType = string | number | readonly string[]
type SelectOption (line 45) | interface SelectOption {
type SelectOwnProps (line 50) | interface SelectOwnProps {
type SelectProps (line 59) | type SelectProps = SelectOwnProps &
FILE: packages/tds-ui/src/components/skeleton/skeleton.tsx
type SkeletonProps (line 33) | type SkeletonProps = ContainerProps & { height?: number | string }
function SkeletonText (line 59) | function SkeletonText({ height = '16px', ...props }: SkeletonProps) {
function SkeletonCircle (line 70) | function SkeletonCircle({
function SkeletonButton (line 89) | function SkeletonButton({
FILE: packages/tds-ui/src/components/slider/handle.tsx
type Props (line 25) | interface Props {
function Handle (line 34) | function Handle({
FILE: packages/tds-ui/src/components/slider/range-slider.tsx
type RangeSliderProps (line 8) | interface RangeSliderProps extends Omit<SliderBaseProps, 'labelComponent...
function RangeSlider (line 15) | function RangeSlider({
FILE: packages/tds-ui/src/components/slider/single-slider.tsx
type SingleSliderProps (line 7) | interface SingleSliderProps
function SingleSlider (line 23) | function SingleSlider({
FILE: packages/tds-ui/src/components/slider/slider-base.tsx
type SliderBaseProps (line 18) | interface SliderBaseProps {
constant LINEAR_FN_SET (line 56) | const LINEAR_FN_SET: ValueTransformer[] = [IDENTICAL_SCALE, IDENTICAL_SC...
constant EXPONENT (line 58) | const EXPONENT = 1 / Math.E
constant NON_LINEAR_FN_SET (line 59) | const NON_LINEAR_FN_SET: ValueTransformer[] = [
function SliderBase (line 83) | function SliderBase({
FILE: packages/tds-ui/src/components/slider/track.tsx
type Props (line 17) | interface Props {
function Track (line 24) | function Track({ active, left, right, getTrackProps }: Props) {
FILE: packages/tds-ui/src/components/slider/types.ts
type SliderValue (line 1) | type SliderValue = readonly number[]
type ValueTransformer (line 3) | type ValueTransformer = (x: number) => number
FILE: packages/tds-ui/src/components/spinner/rolling-spinner.tsx
function RollingSpinner (line 122) | function RollingSpinner({
FILE: packages/tds-ui/src/components/spinner/spinner.tsx
function Spinner (line 45) | function Spinner({
FILE: packages/tds-ui/src/components/stack/stack.stories.tsx
type Story (line 43) | type Story = StoryObj<typeof Stack>
FILE: packages/tds-ui/src/components/stack/stack.tsx
type StackProps (line 29) | interface StackProps extends ContainerProps {
function Stack (line 44) | function Stack({ children, horizontal, ...props }: StackProps) {
FILE: packages/tds-ui/src/components/sticky-header/sticky-header.tsx
type StickyHeaderProps (line 13) | type StickyHeaderProps = PropsWithChildren<LayeringMixinProps>
function StickyHeader (line 15) | function StickyHeader({
FILE: packages/tds-ui/src/components/table/table.stories.tsx
type Story (line 19) | type Story = StoryObj<typeof Table>
FILE: packages/tds-ui/src/components/table/table.tsx
type TableType (line 9) | type TableType = 'vertical' | 'horizontal'
type TableEntity (line 11) | interface TableEntity {
type TableRow (line 14) | type TableRow = TableEntity[]
type TableBodyProps (line 16) | interface TableBodyProps {
type TableProps (line 21) | interface TableProps extends TableBodyProps {
constant BACKGROUND_COLORS (line 25) | const BACKGROUND_COLORS: { [key: string]: string } = {
function HorizontalTable (line 98) | function HorizontalTable({ head, body }: TableBodyProps) {
function VerticalTable (line 132) | function VerticalTable({ head, body }: TableBodyProps) {
function Table (line 174) | function Table({ head, body, type }: TableProps) {
FILE: packages/tds-ui/src/components/tabs/pointing-tab-context.tsx
type PointingTabContextValue (line 3) | interface PointingTabContextValue<
function usePointingTab (line 15) | function usePointingTab<Value extends number | string | symbol>() {
FILE: packages/tds-ui/src/components/tabs/pointing-tab-list.tsx
type PointValue (line 8) | interface PointValue {
type StyledTabListBaseProps (line 13) | interface StyledTabListBaseProps {
FILE: packages/tds-ui/src/components/tabs/pointing-tab.tsx
type StyledTabBaseProps (line 7) | interface StyledTabBaseProps {
FILE: packages/tds-ui/src/components/tabs/rounded-tab-list.tsx
type StyledTabListBaseProps (line 6) | interface StyledTabListBaseProps {
FILE: packages/tds-ui/src/components/tabs/tab-base.tsx
type TabBaseProps (line 17) | interface TabBaseProps<Value> extends PropsWithChildren {
function TabBaseComponent (line 24) | function TabBaseComponent<Value extends number | string | symbol>(
FILE: packages/tds-ui/src/components/tabs/tab-list-base.tsx
type TabListBaseProps (line 4) | type TabListBaseProps = PropsWithChildren
FILE: packages/tds-ui/src/components/tabs/tab-list.tsx
type TabListProps (line 7) | type TabListProps = TabListBaseProps
FILE: packages/tds-ui/src/components/tabs/tab-panel.tsx
type TabPanelProps (line 5) | interface TabPanelProps<Value> extends PropsWithChildren {
FILE: packages/tds-ui/src/components/tabs/tab.tsx
type TabProps (line 7) | type TabProps<Value> = TabBaseProps<Value>
FILE: packages/tds-ui/src/components/tabs/tabs-context.tsx
type TabsContextValue (line 5) | interface TabsContextValue<Value extends number | string | symbol> {
function useTabs (line 17) | function useTabs<Value extends number | string | symbol>() {
FILE: packages/tds-ui/src/components/tabs/tabs.stories.tsx
type Story (line 24) | type Story = StoryObj<typeof Tabs>
FILE: packages/tds-ui/src/components/tabs/tabs.tsx
type TabsProps (line 6) | interface TabsProps<Value extends number | string | symbol>
function handleFocusChanged (line 38) | function handleFocusChanged(newValue: Value) {
FILE: packages/tds-ui/src/components/tabs/types.ts
type TabVariant (line 1) | type TabVariant = 'basic' | 'pointing' | 'rounded'
FILE: packages/tds-ui/src/components/tag/tag.tsx
type TagColors (line 8) | type TagColors = 'special' | 'pink' | 'purple' | 'default'
constant COLORS (line 10) | const COLORS: { [key in TagColors]: string } = {
constant BG_COLORS (line 17) | const BG_COLORS: { [key in TagColors]: string } = {
constant PADDING_SIZE (line 24) | const PADDING_SIZE: Partial<Record<GlobalSizes, MarginPadding>> = {
FILE: packages/tds-ui/src/components/text/text.stories.tsx
type Story (line 19) | type Story = StoryObj<typeof Text>
FILE: packages/tds-ui/src/components/text/text.test.tsx
function ThemeWrapper (line 8) | function ThemeWrapper({ children }: PropsWithChildren<unknown>) {
FILE: packages/tds-ui/src/components/text/text.tsx
function rgba (line 17) | function rgba({ color, alpha }: { color?: string; alpha?: number }) {
type TextProps (line 21) | type TextProps = PropsWithChildren<{
type TextTitleBaseProps (line 80) | interface TextTitleBaseProps {
type TextTitleProps (line 92) | type TextTitleProps = PropsWithChildren<TextTitleBaseProps>
function TextTitle (line 94) | function TextTitle({ children, margin, ...props }: TextTitleProps) {
FILE: packages/tds-ui/src/components/text/typography.tsx
type H1Props (line 7) | type H1Props = TextProps & {
type H2Props (line 14) | type H2Props = TextProps
type H3Props (line 15) | type H3Props = TextProps
type H4Props (line 16) | type H4Props = TextProps
type ParagraphProps (line 17) | type ParagraphProps = TextProps
function H1 (line 19) | function H1({
function H2 (line 47) | function H2({ children, ...props }: H2Props) {
function H3 (line 55) | function H3({ children, ...props }: H3Props) {
function H4 (line 63) | function H4({ children, ...props }: H4Props) {
function Paragraph (line 71) | function Paragraph({ children, ...props }: ParagraphProps) {
FILE: packages/tds-ui/src/components/textarea/textarea.stories.tsx
type Story (line 27) | type Story = StoryObj<typeof Textarea>
FILE: packages/tds-ui/src/components/textarea/textarea.tsx
constant COLORS (line 13) | const COLORS: Partial<Record<GlobalColors, string>> = {
type TextareaProps (line 44) | interface TextareaProps
FILE: packages/tds-ui/src/components/tooltip/tooltip.stories.tsx
type Story (line 23) | type Story = StoryObj<typeof Tooltip>
FILE: packages/tds-ui/src/components/tooltip/tooltip.tsx
type PointingOptions (line 4) | interface PointingOptions {
type TooltipFrameProps (line 10) | interface TooltipFrameProps {
type TooltipProps (line 20) | interface TooltipProps extends Partial<TooltipFrameProps> {
constant DEFAULT_POINTING_OPTION (line 26) | const DEFAULT_POINTING_OPTION = {
constant DEFAULT_BACKGROUND_COLOR (line 32) | const DEFAULT_BACKGROUND_COLOR = 'rgba(13, 208, 175, 1)'
constant POINTING_BASE_STYLE (line 34) | const POINTING_BASE_STYLE = css`
function Tooltip (line 127) | function Tooltip({
FILE: packages/tds-ui/src/components/video/context.tsx
type VideoStateContextValue (line 5) | interface VideoStateContextValue {
function VideoStateContextProvider (line 12) | function VideoStateContextProvider({
function VideoWrapper (line 32) | function VideoWrapper({
function useVideoState (line 47) | function useVideoState() {
FILE: packages/tds-ui/src/components/video/controls.tsx
type Props (line 71) | interface Props {
function Controls (line 78) | function Controls({
FILE: packages/tds-ui/src/components/video/mute-unmute-button.tsx
constant MUTE_BUTTON_IMAGE_URL (line 4) | const MUTE_BUTTON_IMAGE_URL =
constant UNMUTE_BUTTON_IMAGE_URL (line 6) | const UNMUTE_BUTTON_IMAGE_URL =
type MuteUnmutButtonBaseProps (line 9) | interface MuteUnmutButtonBaseProps {
type Props (line 33) | interface Props {
function MuteUnmuteButton (line 40) | function MuteUnmuteButton({
FILE: packages/tds-ui/src/components/video/play-pause-button.tsx
constant PLAY_BUTTON_IMAGE_URL (line 4) | const PLAY_BUTTON_IMAGE_URL =
constant PAUSE_BUTTON_IMAGE_URL (line 6) | const PAUSE_BUTTON_IMAGE_URL =
type BaseProps (line 9) | interface BaseProps {
type Props (line 37) | interface Props {
function PlayPauseButton (line 44) | function PlayPauseButton({
FILE: packages/tds-ui/src/components/video/seeker.tsx
function Seeker (line 61) | function Seeker({
FILE: packages/tds-ui/src/components/video/sources.tsx
constant MEDIA_CDN_URL_BASE (line 3) | const MEDIA_CDN_URL_BASE = 'https://media.triple.guide'
constant FORMATS (line 4) | const FORMATS = ['webm', 'mp4', 'ogv']
function Sources (line 6) | function Sources({
FILE: packages/tds-ui/src/components/video/use-video-control.ts
function useVideoControl (line 5) | function useVideoControl({
FILE: packages/tds-ui/src/components/video/use-video-ref.ts
function useVideoRef (line 3) | function useVideoRef() {
FILE: packages/tds-ui/src/components/video/utils.tsx
function formatTime (line 1) | function formatTime(totalSeconds: number) {
function pad2 (line 8) | function pad2(original: string) {
FILE: packages/tds-ui/src/components/video/video-element.tsx
type Props (line 44) | interface Props {
FILE: packages/tds-ui/src/components/video/video-frame.tsx
function VideoFrame (line 31) | function VideoFrame({
FILE: packages/tds-ui/src/components/video/video.stories.tsx
type Story (line 11) | type Story = StoryObj<typeof Video>
FILE: packages/tds-ui/src/components/video/video.tsx
type Props (line 8) | interface Props {
FILE: packages/tds-ui/src/components/visually-hidden/visually-hidden.tsx
type VisuallyHiddenProps (line 18) | type VisuallyHiddenProps = PropsWithChildren
FILE: packages/tds-ui/src/mixins/border-radius.ts
type BorderRadiusMixinProps (line 3) | interface BorderRadiusMixinProps {
FILE: packages/tds-ui/src/mixins/box.ts
type ShadowMixinProps (line 12) | interface ShadowMixinProps {
type KeyOfShadowSize (line 45) | type KeyOfShadowSize = keyof typeof ShadowSizeMap
type ShadowSizeMapType (line 46) | type ShadowSizeMapType = { [key in KeyOfShadowSize]: string }
FILE: packages/tds-ui/src/mixins/centered.ts
type CenteredMixinProps (line 3) | interface CenteredMixinProps {
FILE: packages/tds-ui/src/mixins/clearing.ts
type ClearingMixinProps (line 3) | interface ClearingMixinProps {
FILE: packages/tds-ui/src/mixins/ellipsis.ts
type EllipsisMixinProps (line 3) | interface EllipsisMixinProps {
FILE: packages/tds-ui/src/mixins/horizontal-scroll.ts
type HorizontalScrollMixinProps (line 3) | interface HorizontalScrollMixinProps {
FILE: packages/tds-ui/src/mixins/layering.ts
type LayeringMixinProps (line 3) | interface LayeringMixinProps {
FILE: packages/tds-ui/src/mixins/margin-padding.ts
function formatMarginPadding (line 6) | function formatMarginPadding(
type MarginMixinProps (line 35) | interface MarginMixinProps {
type PaddingMixinProps (line 42) | interface PaddingMixinProps {
FILE: packages/tds-ui/src/mixins/max-lines.ts
type MaxLinesMixinProps (line 3) | interface MaxLinesMixinProps {
FILE: packages/tds-ui/src/mixins/positioning.ts
type PositioningMixinProps (line 6) | interface PositioningMixinProps {
FILE: packages/tds-ui/src/mixins/safe-area.ts
type SafeAreaInsetMixinProps (line 6) | interface SafeAreaInsetMixinProps {
FILE: packages/tds-ui/src/mixins/text-style.ts
function getTextStyle (line 85) | function getTextStyle(type: KeyOfTextStyleMap) {
type KeyOfTextStyleMap (line 89) | type KeyOfTextStyleMap = keyof typeof textStyleMap
type TextStyleMapType (line 90) | type TextStyleMapType = { [key in KeyOfTextStyleMap]: string }
type TextStyleMixinProps (line 92) | interface TextStyleMixinProps {
FILE: packages/tds-ui/src/utils/merge-refs.ts
function mergeRefs (line 3) | function mergeRefs<T = unknown>(
FILE: packages/tds-widget/src/ad-banners/api.ts
type ContentType (line 6) | type ContentType =
type BannerTypes (line 13) | enum BannerTypes {
type UserLocation (line 18) | interface UserLocation {
type AdBannersFetchingParams (line 23) | interface AdBannersFetchingParams {
function getAdBanners (line 42) | async function getAdBanners({
function postAdBannerEvent (line 82) | async function postAdBannerEvent({
function getSearchQuery (line 119) | function getSearchQuery(
function getRequestBody (line 149) | function getRequestBody(
FILE: packages/tds-widget/src/ad-banners/content-details-banner.tsx
type EventAttributes (line 15) | interface EventAttributes {
type AdSystemBannerProps (line 22) | interface AdSystemBannerProps {
type InventoryBannerProps (line 34) | interface InventoryBannerProps {
type AdBannersProps (line 44) | type AdBannersProps = {
function isPropsForInventoryApi (line 51) | function isPropsForInventoryApi(
function useAdBannerProps (line 57) | function useAdBannerProps(props: AdBannersProps) {
function ContentDetailsBanner (line 154) | function ContentDetailsBanner(props: AdBannersProps) {
FILE: packages/tds-widget/src/ad-banners/horizontal-entity.tsx
type HorizontalEntityProps (line 6) | interface HorizontalEntityProps {
FILE: packages/tds-widget/src/ad-banners/horizontal-list-view.tsx
type HorizontalListViewProps (line 12) | interface HorizontalListViewProps {
constant FLICKING_DEFAULT_INDEX (line 24) | const FLICKING_DEFAULT_INDEX = 0
constant FLICKING_CONFIG (line 25) | const FLICKING_CONFIG: Partial<FlickingOptions> = {
FILE: packages/tds-widget/src/ad-banners/list-top-banners.tsx
type EventAttributes (line 16) | interface EventAttributes {
type AdSystemBannerProps (line 23) | interface AdSystemBannerProps {
type InventoryBannerProps (line 35) | interface InventoryBannerProps {
type AdBannersProps (line 45) | type AdBannersProps = {
constant COMPONENT_SET (line 53) | const COMPONENT_SET = {
function isPropsForInventoryApi (line 58) | function isPropsForInventoryApi(
function useAdBannerProps (line 64) | function useAdBannerProps(props: AdBannersProps) {
function fetchBanners (line 166) | async function fetchBanners() {
FILE: packages/tds-widget/src/ad-banners/typing.ts
type Banner (line 1) | interface Banner {
type ListDirection (line 8) | enum ListDirection {
FILE: packages/tds-widget/src/ad-banners/vertical-entity.tsx
type VerticalEntityProps (line 8) | interface VerticalEntityProps {
FILE: packages/tds-widget/src/ad-banners/vertical-list-view.tsx
type VerticalListViewProps (line 9) | interface VerticalListViewProps {
FILE: packages/tds-widget/src/app-banner/app-banner.tsx
type Props (line 65) | type Props = {
function AppBanner (line 73) | function AppBanner({
FILE: packages/tds-widget/src/app-installation-cta/article-card-cta.tsx
function ArticleCardCta (line 7) | function ArticleCardCta({
FILE: packages/tds-widget/src/app-installation-cta/banner-cta.tsx
type BannerCtaProps (line 10) | interface BannerCtaProps extends CtaProps {
function BannerCta (line 27) | function BannerCta({
FILE: packages/tds-widget/src/app-installation-cta/chatbot-cta.tsx
type ChatbotCtaProps (line 21) | interface ChatbotCtaProps extends CtaProps {
function ChatbotCta (line 36) | function ChatbotCta({
FILE: packages/tds-widget/src/app-installation-cta/constants.ts
type BannerExitStrategy (line 1) | enum BannerExitStrategy {
constant FLOATING_BUTTON_CLOSED_STORAGE_KEY (line 6) | const FLOATING_BUTTON_CLOSED_STORAGE_KEY = 'close_install_button'
constant CHATBOT_CLOSED_STORAGE_KEY (line 7) | const CHATBOT_CLOSED_STORAGE_KEY = 'triple_chatbotad_closed'
constant EVENT_CHATBOT_CTA_READY (line 8) | const EVENT_CHATBOT_CTA_READY = 'triple_chatbot_cta_ready'
FILE: packages/tds-widget/src/app-installation-cta/elements.tsx
constant CONTENT_MIN_WIDTH (line 31) | const CONTENT_MIN_WIDTH = 320
constant CONTENT_MAX_WIDTH (line 32) | const CONTENT_MAX_WIDTH = 768
constant MIN_DESKTOP_WIDTH (line 108) | const MIN_DESKTOP_WIDTH = 1142
type FloatingButtonProps (line 163) | interface FloatingButtonProps {
FILE: packages/tds-widget/src/app-installation-cta/floating-button-cta.tsx
type FloatingButtonCtaProps (line 26) | interface FloatingButtonCtaProps extends CtaProps {
function FloatingButtonCta (line 51) | function FloatingButtonCta({
FILE: packages/tds-widget/src/app-installation-cta/image-banner.tsx
type ImageBannerProps (line 13) | interface ImageBannerProps extends CtaProps {
function ImageBanner (line 20) | function ImageBanner({
FILE: packages/tds-widget/src/app-installation-cta/interfaces.ts
type CtaProps (line 3) | interface CtaProps {
FILE: packages/tds-widget/src/app-installation-cta/service.ts
function fetchInventoryItems (line 3) | async function fetchInventoryItems({
FILE: packages/tds-widget/src/app-installation-cta/text-banner.tsx
type TextBannerProps (line 6) | interface TextBannerProps extends CtaProps {
function TextBanner (line 11) | function TextBanner({
FILE: packages/tds-widget/src/author/author-intro.tsx
function AuthorIntro (line 16) | function AuthorIntro({
FILE: packages/tds-widget/src/author/author.tsx
function Author (line 6) | function Author({
FILE: packages/tds-widget/src/booking-completion/index.tsx
type Region (line 8) | interface Region {
type BookingCompletionProps (line 13) | interface BookingCompletionProps {
function BookingCompletion (line 65) | function BookingCompletion({
FILE: packages/tds-widget/src/chat/bubble-container/bubble-container.tsx
constant CHAT_CONTAINER_STYLES (line 19) | const CHAT_CONTAINER_STYLES = {
type ContainerBaseProp (line 25) | interface ContainerBaseProp {
type SentBubbleContainerProp (line 58) | type SentBubbleContainerProp = PropsWithChildren<
function SentBubbleContainer (line 67) | function SentBubbleContainer({
type ReceivedBubbleContainerProp (line 146) | type ReceivedBubbleContainerProp = PropsWithChildren<
function ReceivedBubbleContainer (line 163) | function ReceivedBubbleContainer({
type BubbleContainerProp (line 251) | type BubbleContainerProp = { my: boolean } & SentBubbleContainerProp &
function BubbleContainer (line 254) | function BubbleContainer({
FILE: packages/tds-widget/src/chat/bubble-container/bubble-info.tsx
function BubbleInfo (line 32) | function BubbleInfo({
FILE: packages/tds-widget/src/chat/bubble-container/elements.tsx
function Thanks (line 75) | function Thanks({
FILE: packages/tds-widget/src/chat/bubble-container/icons.tsx
function RetryIcon (line 1) | function RetryIcon() {
function DeleteIcon (line 27) | function DeleteIcon() {
FILE: packages/tds-widget/src/chat/bubble/altered.tsx
function AlteredBubble (line 17) | function AlteredBubble({
FILE: packages/tds-widget/src/chat/bubble/bubble-ui.tsx
type BubbleType (line 37) | type BubbleType = (typeof BubbleTypeArray)[number]
type CompositeBubbleType (line 38) | type CompositeBubbleType = (typeof CompositeBubbleTypeArray)[number]
type BubbleUIPropBase (line 40) | interface BubbleUIPropBase {
type CompositeBubbleUIPropBase (line 45) | type CompositeBubbleUIPropBase = Omit<BubbleUIPropBase, 'type'> & {
type TextBubbleUIProp (line 49) | interface TextBubbleUIProp extends BubbleUIPropBase {
type ImageBubbleUIProp (line 54) | interface ImageBubbleUIProp extends BubbleUIPropBase {
type RichBubbleUIProp (line 59) | interface RichBubbleUIProp
type ProductBubbleUIProp (line 66) | interface ProductBubbleUIProp extends BubbleUIPropBase {
type ButtonBubbleUIProp (line 71) | interface ButtonBubbleUIProp extends BubbleUIPropBase {
type CouponBubbleUIProp (line 76) | interface CouponBubbleUIProp extends CompositeBubbleUIPropBase {
type BubbleUIProps (line 81) | type BubbleUIProps = (
function BubbleUI (line 135) | function BubbleUI({
FILE: packages/tds-widget/src/chat/bubble/bubble.tsx
function BaseBubble (line 35) | function BaseBubble({
function BubbleWithParentMessage (line 59) | function BubbleWithParentMessage({
FILE: packages/tds-widget/src/chat/bubble/button.tsx
constant ARROW_ICON (line 9) | const ARROW_ICON = ` <svg xmlns="http://www.w3.org/2000/svg" width="11" ...
function ButtonBubble (line 35) | function ButtonBubble({
FILE: packages/tds-widget/src/chat/bubble/constants.ts
constant ALTERNATIVE_TEXT_MESSAGE (line 1) | const ALTERNATIVE_TEXT_MESSAGE = {
FILE: packages/tds-widget/src/chat/bubble/elements.tsx
type BadgeProps (line 12) | interface BadgeProps {
FILE: packages/tds-widget/src/chat/bubble/full-text-message-view.tsx
function FullTextMessageView (line 18) | function FullTextMessageView({
FILE: packages/tds-widget/src/chat/bubble/image.tsx
constant DEFAULT_IMAGE_NUM_IN_ROW (line 10) | const DEFAULT_IMAGE_NUM_IN_ROW = 3
constant MAX_IMAGE_WIDTH (line 18) | const MAX_IMAGE_WIDTH = 247
function ImageBubble (line 20) | function ImageBubble({
function allocateImages (line 79) | function allocateImages(
FILE: packages/tds-widget/src/chat/bubble/images.stories.tsx
function RenderImageBubble (line 32) | function RenderImageBubble() {
FILE: packages/tds-widget/src/chat/bubble/item/image.tsx
function ImageItem (line 9) | function ImageItem({
FILE: packages/tds-widget/src/chat/bubble/item/text.tsx
function TextItem (line 13) | function TextItem({
FILE: packages/tds-widget/src/chat/bubble/nol/bubble-ui.tsx
type NolBubbleType (line 16) | type NolBubbleType = (typeof NolBubbleTypeArray)[number]
type NolCouponContentBubbleUIProp (line 18) | interface NolCouponContentBubbleUIProp extends BubbleUIPropBase {
type NolCouponButtonBubbleUIProp (line 23) | interface NolCouponButtonBubbleUIProp extends BubbleUIPropBase {
type NolCouponContentPartnerBubbleUIProp (line 28) | interface NolCouponContentPartnerBubbleUIProp extends BubbleUIPropBase {
type NolBubbleUIProps (line 33) | type NolBubbleUIProps =
function isNolBubbleType (line 38) | function isNolBubbleType(type: string): type is NolBubbleType {
function NolBubbleUI (line 42) | function NolBubbleUI({
FILE: packages/tds-widget/src/chat/bubble/nol/coupon.tsx
function DownloadIcon (line 31) | function DownloadIcon({ disabled }: { disabled?: boolean }) {
function NolCouponContentBubble (line 149) | function NolCouponContentBubble({ coupon, onClick }: CouponBubbleProp) {
function NolCouponButtonBubble (line 215) | function NolCouponButtonBubble({
function NolCouponContentPartnerBubble (line 237) | function NolCouponContentPartnerBubble({
FILE: packages/tds-widget/src/chat/bubble/nol/styles.ts
constant PARTNER_ROOM_BUBBLE_STYLE (line 5) | const PARTNER_ROOM_BUBBLE_STYLE = {
constant NOL_SPACING (line 32) | const NOL_SPACING = {
constant NOL_BUBBLE_BASE_STYLE (line 40) | const NOL_BUBBLE_BASE_STYLE = css`
constant NOL_PARTNER_ROOM_BUBBLE_STYLE (line 47) | const NOL_PARTNER_ROOM_BUBBLE_STYLE = {
constant NOL_BUBBLE_INFO_BASE_STYLE (line 101) | const NOL_BUBBLE_INFO_BASE_STYLE = css`
constant RETRY_SVG (line 106) | const RETRY_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="16" he...
constant DELETE_SVG (line 111) | const DELETE_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="12" h...
constant NOL_PARTNER_ROOM_BUBBLE_INFO_STYLE (line 120) | const NOL_PARTNER_ROOM_BUBBLE_INFO_STYLE = {
FILE: packages/tds-widget/src/chat/bubble/parent/parent-message.tsx
type ParentMessageType (line 11) | interface ParentMessageType {
function ParentMessage (line 22) | function ParentMessage({
FILE: packages/tds-widget/src/chat/bubble/parent/parent-ui.tsx
type ParentMessageInterface (line 12) | interface ParentMessageInterface {
type TextParentMessage (line 16) | interface TextParentMessage extends ParentMessageInterface {
type ImageParentMessage (line 23) | interface ImageParentMessage extends ParentMessageInterface {
type ParentMessageUIProp (line 30) | type ParentMessageUIProp = (TextParentMessage | ImageParentMessage) & {
function ParentMessageUI (line 37) | function ParentMessageUI({
function getTextPreview (line 99) | function getTextPreview({
FILE: packages/tds-widget/src/chat/bubble/product.tsx
constant PRODUCT_BADGE_COLOR (line 16) | const PRODUCT_BADGE_COLOR: Record<
constant PRODUCT_BADGE_LABEL (line 27) | const PRODUCT_BADGE_LABEL: Record<CustomerBookingStatus, string> = {
FILE: packages/tds-widget/src/chat/bubble/rich.tsx
function RichBubble (line 31) | function RichBubble({
FILE: packages/tds-widget/src/chat/bubble/text.tsx
constant MAX_VIEWABLE_TEXT_LENGTH (line 13) | const MAX_VIEWABLE_TEXT_LENGTH = 300
function TextBubble (line 27) | function TextBubble({
function TextBubbleWithFullTextView (line 97) | function TextBubbleWithFullTextView({
FILE: packages/tds-widget/src/chat/bubble/type.ts
type BubbleCSSProp (line 9) | interface BubbleCSSProp {
type BaseBubbleProp (line 18) | type BaseBubbleProp = BubbleCSSProp & {
type BubbleProp (line 29) | type BubbleProp = BaseBubbleProp & {
type TextBubbleProp (line 33) | type TextBubbleProp = {
type RichBubbleProp (line 54) | type RichBubbleProp = {
type ImageBubbleProp (line 66) | interface ImageBubbleProp {
type ProductBubbleProp (line 81) | type ProductBubbleProp = {
type CouponBubbleClickType (line 86) | type CouponBubbleClickType = 'download' | 'product'
type CouponBubbleProp (line 88) | interface CouponBubbleProp {
type BlindedBubbleProp (line 95) | type BlindedBubbleProp = {
type LinkButtonAction (line 101) | interface LinkButtonAction {
type ButtonAction (line 106) | interface ButtonAction {
type ButtonProps (line 110) | interface ButtonProps {
type LinkButtonProps (line 115) | interface LinkButtonProps {
type ButtonBubbleProp (line 120) | type ButtonBubbleProp = {
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/chat-api-service.ts
type BodyType (line 13) | type BodyType = BodyInit | { [key: string]: any } | undefined
type ChatFetcherOptions (line 15) | interface ChatFetcherOptions<B = BodyType> {
type ChatFetcher (line 22) | type ChatFetcher<
type ReactionPayload (line 28) | interface ReactionPayload {
type Sender (line 33) | interface Sender {
class ChatApiService (line 41) | class ChatApiService<T = UserType> {
method constructor (line 49) | public constructor(fetcher: ChatFetcher, isTripleChat = false) {
method getRoomMemberMe (line 54) | public getRoomMemberMe({
method getMessages (line 62) | public getMessages({
method sendMessage (line 79) | public sendMessage({
method fetchGetUnreadRoom (line 97) | public fetchGetUnreadRoom({
method updateLastSeenMessageId (line 109) | public updateLastSeenMessageId({
method addReaction (line 125) | public addReaction({ messageId, reactionType }: ReactionPayload) {
method removeReaction (line 132) | public removeReaction({ messageId, reactionType }: ReactionPayload) {
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/chat-message-context.tsx
type ChatMessagesProviderProps (line 25) | interface ChatMessagesProviderProps<T = UserType> {
type ChatMessagesContextValue (line 36) | interface ChatMessagesContextValue<T = UserType> {
function ChatMessagesProvider (line 58) | function ChatMessagesProvider<T = UserType>({
function useChatApiService (line 142) | function useChatApiService<T = UserType>() {
function useChatMessagesContext (line 152) | function useChatMessagesContext<T = UserType>() {
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/chat-room-messages-provider.tsx
type ChatRoomMessagesProviderProps (line 12) | interface ChatRoomMessagesProviderProps<
function ChatRoomMessagesProvider (line 19) | function ChatRoomMessagesProvider<
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/constants.ts
constant DEFAULT_MESSAGE_PROPERTIES (line 3) | const DEFAULT_MESSAGE_PROPERTIES: Partial<ChatMessageInterface> = {
constant REACTION_ENABLED_MESSAGE_PROPERTIES (line 7) | const REACTION_ENABLED_MESSAGE_PROPERTIES: Partial<ChatMessageInterface> =
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/messages.tsx
type ChatRoomMessageInterface (line 19) | type ChatRoomMessageInterface<T = UserType> = Omit<
type OriginalMessagesPropTypes (line 26) | type OriginalMessagesPropTypes<T = UserType> = ComponentProps<
function Messages (line 30) | function Messages<T = UserType>({
function richMessageSplitter (line 80) | function richMessageSplitter<T = UserType>(
function bubbleMessageConverter (line 99) | function bubbleMessageConverter<T = UserType>(
function convertMessages (line 141) | function convertMessages<T = UserType>(
function getDisplayedPayload (line 180) | function getDisplayedPayload<T = UserType>({
function getMessageTypeAndValue (line 200) | function getMessageTypeAndValue<T = UserType>(
function convertChatUserToMessageUser (line 220) | function convertChatUserToMessageUser<T = UserType>(
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/use-chat-room-messages.ts
type ChatMessagesProps (line 31) | interface ChatMessagesProps<
function useChatMessages (line 42) | function useChatMessages<
function findSenderFromRoomMembers (line 615) | function findSenderFromRoomMembers<
function filterPendingMessage (line 630) | function filterPendingMessage<T>(
function compareChatMessagePayloads (line 646) | function compareChatMessagePayloads<T extends ChatMessagePayloadType>(
function ensureMessageWithNumberId (line 661) | function ensureMessageWithNumberId<T>(message: ChatMessageInterface<T>) {
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/use-pending-intersections.ts
type PendingIntersection (line 4) | interface PendingIntersection {
function usePendingIntersections (line 10) | function usePendingIntersections(
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/use-scroll.tsx
function useScroll (line 5) | function useScroll() {
FILE: packages/tds-widget/src/chat/chat/chat-room-messages/use-unread-messages.ts
function useUnreadMessages (line 10) | function useUnreadMessages<T = UserType>() {
FILE: packages/tds-widget/src/chat/chat/chat-scroll-container.tsx
type ChatScrollContainerProps (line 7) | interface ChatScrollContainerProps {
function ChatScrollContainer (line 22) | function ChatScrollContainer({
FILE: packages/tds-widget/src/chat/chat/constants.ts
constant DEFAULT_MESSAGE_ID_PREFIX (line 1) | const DEFAULT_MESSAGE_ID_PREFIX = 'message'
constant REPLY_BUTTON_DATA_ID (line 3) | const REPLY_BUTTON_DATA_ID = 'reply-button'
FILE: packages/tds-widget/src/chat/chat/messages-reducer.ts
type MessagesActions (line 3) | enum MessagesActions {
type UnsentMessage (line 16) | type UnsentMessage<
type MessageBase (line 22) | interface MessageBase<Id = string | number, Sender = unknown> {
type MessagesState (line 29) | interface MessagesState<Message extends MessageBase<Id>, Id = string> {
type MessagesAction (line 50) | type MessagesAction<Message extends MessageBase<Id>, Id = string> =
function MessagesReducer (line 97) | function MessagesReducer<Message extends MessageBase<Id>, Id = string>(
function useMessagesReducer (line 209) | function useMessagesReducer<
function deduplicateAndSortMessages (line 218) | function deduplicateAndSortMessages<
FILE: packages/tds-widget/src/chat/chat/room-context.tsx
type RoomProviderProps (line 6) | interface RoomProviderProps<T = ChatRoomInterface, U = ChatRoomUser> {
type RoomContextValue (line 11) | interface RoomContextValue<T = ChatRoomInterface, U = ChatRoomUser> {
function RoomProvider (line 20) | function RoomProvider<T = ChatRoomInterface, U = ChatRoomUser>({
function useRoom (line 48) | function useRoom<T = ChatRoomInterface, U = ChatRoomUser>() {
FILE: packages/tds-widget/src/chat/chat/scroll-context.tsx
type ScrollOptions (line 19) | interface ScrollOptions {
type ScrollContextValue (line 30) | interface ScrollContextValue {
function ScrollProvider (line 55) | function ScrollProvider({ children }: { children: ReactNode }) {
function useScroll (line 160) | function useScroll() {
FILE: packages/tds-widget/src/chat/expired/expired.tsx
type ExpiredProps (line 5) | interface ExpiredProps {
constant DEFAULT_DESCRIPTION (line 11) | const DEFAULT_DESCRIPTION = `추가 문의가 필요하신 경우\n파트너에게 새로운 채팅으로 문의해주세요.`
function ExpiredImpl (line 16) | function ExpiredImpl(
FILE: packages/tds-widget/src/chat/icons/ExclamationMarkIcon.tsx
function ExclamationMarkIcon (line 8) | function ExclamationMarkIcon({
FILE: packages/tds-widget/src/chat/icons/arrow-bottom-16-icon.tsx
function ArrowBottom16Icon (line 1) | function ArrowBottom16Icon({
FILE: packages/tds-widget/src/chat/icons/arrow-right-icon.tsx
function ArrowRight (line 3) | function ArrowRight({
FILE: packages/tds-widget/src/chat/icons/arrow-top-icon.tsx
function ArrowTopIcon (line 1) | function ArrowTopIcon({
FILE: packages/tds-widget/src/chat/icons/reply-meesage-icon.tsx
function ReplyMessageIcon (line 1) | function ReplyMessageIcon() {
FILE: packages/tds-widget/src/chat/icons/reply-message-icon.tsx
function ReplyMessageIcon (line 1) | function ReplyMessageIcon() {
FILE: packages/tds-widget/src/chat/icons/select-photo-icon.tsx
function SelectPhotoIcon (line 1) | function SelectPhotoIcon({ ...props }) {
FILE: packages/tds-widget/src/chat/icons/send-icon.tsx
function SendIcon (line 1) | function SendIcon({
FILE: packages/tds-widget/src/chat/icons/talk-icon.tsx
function TalkIcon (line 1) | function TalkIcon({
FILE: packages/tds-widget/src/chat/icons/text-full-view-arrow-icon.tsx
function TextFullViewArrowIcon (line 1) | function TextFullViewArrowIcon({
FILE: packages/tds-widget/src/chat/input-area/input-area-ui/index.tsx
constant MIN_TEXTAREA_HEIGHT (line 14) | const MIN_TEXTAREA_HEIGHT = 20
constant MAX_TEXTAREA_HEIGHT (line 15) | const MAX_TEXTAREA_HEIGHT = 100
constant MAX_TEXT_LENGTH (line 16) | const MAX_TEXT_LENGTH = 2000
type InputAreaUIProps (line 18) | interface InputAreaUIProps {
function InputAreaUI (line 34) | function InputAreaUI({
FILE: packages/tds-widget/src/chat/input-area/nol-input-area-ui/index.tsx
constant MAX_TEXT_LENGTH (line 11) | const MAX_TEXT_LENGTH = 1000
constant TEXTAREA_MIN_HEIGHT (line 12) | const TEXTAREA_MIN_HEIGHT = 19
constant TEXTAREA_MAX_HEIGHT (line 13) | const TEXTAREA_MAX_HEIGHT = 110
constant INPUT_AREA_HEIGHT (line 14) | const INPUT_AREA_HEIGHT = 60
function NolInputAreaUIImpl (line 98) | function NolInputAreaUIImpl(
FILE: packages/tds-widget/src/chat/input-area/nol-input-area-ui/types.ts
type SelectActionButtonProps (line 5) | type SelectActionButtonProps =
type WithDefaultImageUploadButton (line 9) | interface WithDefaultImageUploadButton
type WithCustomSelectActionButton (line 12) | interface WithCustomSelectActionButton {
type NolInputAreaUIBaseProps (line 16) | interface NolInputAreaUIBaseProps
type NolInputAreaUIProps (line 30) | type NolInputAreaUIProps = NolInputAreaUIBaseProps &
FILE: packages/tds-widget/src/chat/input-area/nol-input-area-ui/use-input-resize-observer.ts
function useInputResizeObserver (line 5) | function useInputResizeObserver(defaultHeight: number) {
FILE: packages/tds-widget/src/chat/input-area/utils.ts
function textAreaAutoResize (line 3) | function textAreaAutoResize(e: SyntheticEvent, maxHeight: number) {
function handleSendClick (line 10) | function handleSendClick(
FILE: packages/tds-widget/src/chat/list/hooks.ts
function useExtensibleReducer (line 33) | function useExtensibleReducer<
FILE: packages/tds-widget/src/chat/list/types.ts
type BaseChatListState (line 10) | interface BaseChatListState<F, T = RoomType, U = UserType> {
type ChatListActions (line 28) | type ChatListActions = ValueOf<typeof ChatListActions>
type BaseChatListAction (line 30) | type BaseChatListAction<F, T = RoomType, U = UserType> =
type ExtensionAction (line 44) | type ExtensionAction<T extends { action: string }> = {
type ExtensionReducers (line 50) | type ExtensionReducers<S, T extends { action: string }> = {
type Extension (line 54) | interface Extension<
type ExtensibleReducerResult (line 68) | type ExtensibleReducerResult<
FILE: packages/tds-widget/src/chat/list/utils.ts
function createExtension (line 10) | function createExtension<
function isBaseChatListAction (line 24) | function isBaseChatListAction<
FILE: packages/tds-widget/src/chat/messages/date-divider.tsx
function DateDivider (line 4) | function DateDivider({ date, ...props }: { date: Date }) {
FILE: packages/tds-widget/src/chat/messages/index.tsx
type MessagesProp (line 22) | interface MessagesProp<
function Messages (line 88) | function Messages<
FILE: packages/tds-widget/src/chat/messages/type.ts
type MessageBase (line 12) | interface MessageBase<User extends UserInterface> {
type MessageInterface (line 22) | type MessageInterface<
type BubbleMessageInterface (line 36) | type BubbleMessageInterface<
FILE: packages/tds-widget/src/chat/messages/utils.ts
function isBubbleType (line 13) | function isBubbleType(type: string): type is BubbleType {
function isCompositeBubbleType (line 17) | function isCompositeBubbleType(
function compareSender (line 23) | function compareSender<
function compareDate (line 39) | function compareDate<
FILE: packages/tds-widget/src/chat/navbar/index.tsx
type NavbarItemType (line 4) | enum NavbarItemType {
type NavbarItem (line 9) | interface NavbarItem {
type ChatNavbarUIProps (line 14) | interface ChatNavbarUIProps {
function ChatNavbarUI (line 19) | function ChatNavbarUI({
FILE: packages/tds-widget/src/chat/nol-theme-provider/constants.ts
constant NOL_COLOR (line 1) | const NOL_COLOR = {
FILE: packages/tds-widget/src/chat/nol-theme-provider/nol-theme-provider.tsx
function NolThemeProvider (line 7) | function NolThemeProvider<T extends { [key: string]: string }>({
FILE: packages/tds-widget/src/chat/preview/preview.tsx
type PreviewProps (line 17) | interface PreviewProps<T, U> {
function Preview (line 35) | function Preview<T = RoomType, U = UserType>({
FILE: packages/tds-widget/src/chat/preview/utils.ts
constant DATE_FORMAT (line 5) | const DATE_FORMAT = 'yyyy.MM.dd'
function convertDateTime (line 32) | function convertDateTime(
function formatRelativeTime (line 45) | function formatRelativeTime(
FILE: packages/tds-widget/src/chat/reservation-info/elements.tsx
constant RESERVATION_INFO_MIN_CONTENT_HEIGHT (line 8) | const RESERVATION_INFO_MIN_CONTENT_HEIGHT = 40
constant PRODUCT_INFO_MIN_CONTENT_HEIGHT (line 9) | const PRODUCT_INFO_MIN_CONTENT_HEIGHT = 24.5
type LabelColor (line 122) | type LabelColor = 'blue' | 'red' | 'gray'
function getLabelColorVariants (line 140) | function getLabelColorVariants(color: LabelColor, nolTheme: any) {
FILE: packages/tds-widget/src/chat/reservation-info/reservation-info.stories.tsx
constant BOOKING_INFO (line 21) | const BOOKING_INFO: ReservationInfoProps = {
constant PRODUCT_INFO (line 41) | const PRODUCT_INFO: ReservationInfoProps = {
FILE: packages/tds-widget/src/chat/reservation-info/reservation-info.tsx
type ReservationInfoActionType (line 30) | type ReservationInfoActionType = 'default' | 'link'
type ReservationInfoActionPropsBase (line 32) | interface ReservationInfoActionPropsBase {
type DefaultReservationInfoActionProps (line 36) | interface DefaultReservationInfoActionProps
type LinkReservationInfoActionProps (line 42) | interface LinkReservationInfoActionProps
type ReservationInfoActionProps (line 48) | type ReservationInfoActionProps =
type ReservationInfoProps (line 52) | type ReservationInfoProps = {
function ReservationInfoImpl (line 73) | function ReservationInfoImpl(
FILE: packages/tds-widget/src/chat/scroll-buttons-area/elements.tsx
function ScrollToBottomButton (line 27) | function ScrollToBottomButton({
function NewMessage (line 114) | function NewMessage<T = UserType>({
FILE: packages/tds-widget/src/chat/scroll-buttons-area/index.tsx
type InspectionConfig (line 17) | interface InspectionConfig {
type ScrollButtonsAreaProps (line 22) | interface ScrollButtonsAreaProps<T = UserType>
type ScrollButtonsAreaHandler (line 30) | interface ScrollButtonsAreaHandler {
function ScrollButtonsAreaImpl (line 38) | function ScrollButtonsAreaImpl<T = UserType>(
FILE: packages/tds-widget/src/chat/scroll-buttons-area/scroll-buttons.tsx
type ScrollButtonsProps (line 8) | interface ScrollButtonsProps<T = UserType> {
function ScrollButtons (line 23) | function ScrollButtons<T = UserType>({
FILE: packages/tds-widget/src/chat/types/base.ts
type ValueOf (line 1) | type ValueOf<T> = T[keyof T]
type ChatChannelEventsType (line 11) | type ChatChannelEventsType = ValueOf<typeof ChatChannelEvents>
type ChatChannelInfo (line 13) | interface ChatChannelInfo {
FILE: packages/tds-widget/src/chat/types/image.ts
type CloudinaryImageInterface (line 1) | interface CloudinaryImageInterface {
type ImageMetadataInterface (line 22) | interface ImageMetadataInterface {
type MetaDataInterface (line 29) | interface MetaDataInterface {
type TokenInterface (line 51) | interface TokenInterface {
FILE: packages/tds-widget/src/chat/types/message.ts
type DisplayTargetAll (line 11) | type DisplayTargetAll = 'all'
type ReactionType (line 13) | type ReactionType = 'thanks'
type ChatMessagePayloadType (line 15) | enum ChatMessagePayloadType {
type RichItemType (line 27) | type RichItemType =
type RichItemBase (line 32) | interface RichItemBase {
type RichItemText (line 36) | interface RichItemText extends RichItemBase {
type RichItemImages (line 40) | interface RichItemImages extends RichItemBase {
type RichItemButton (line 45) | interface RichItemButton extends RichItemBase {
type RichItem (line 54) | type RichItem = RichItemText | RichItemImages | RichItemButton
type ChatMessagePayloadBase (line 56) | interface ChatMessagePayloadBase {
type ChatTextMessagePayload (line 61) | interface ChatTextMessagePayload extends ChatMessagePayloadBase {
type ChatImagesMessagePayload (line 66) | interface ChatImagesMessagePayload extends ChatMessagePayloadBase {
type ChatRichMessagePayload (line 71) | interface ChatRichMessagePayload extends ChatMessagePayloadBase {
type ChatProductMessagePayload (line 76) | interface ChatProductMessagePayload extends ChatMessagePayloadBase {
type ChatCouponMessagePayload (line 81) | interface ChatCouponMessagePayload extends ChatMessagePayloadBase {
type ChatMessagePayload (line 86) | type ChatMessagePayload =
type ChatAlternativeMessagePayload (line 93) | type ChatAlternativeMessagePayload =
type TripleChatMessageInterface (line 100) | interface TripleChatMessageInterface<T = UserType>
type ChatMessageInterface (line 112) | interface ChatMessageInterface<T = UserType> {
type WelcomeMessageInterface (line 124) | type WelcomeMessageInterface<T = UserType> = UnsentMessage<
type CustomerBookingStatus (line 133) | type CustomerBookingStatus =
type ProductItem (line 140) | interface ProductItem {
type CouponItem (line 150) | interface CouponItem {
FILE: packages/tds-widget/src/chat/types/pusher.ts
type ChannelUser (line 6) | interface ChannelUser<T = UserType>
type ChannelRoom (line 11) | interface ChannelRoom<T = RoomType> {
type ChannelRoomMetadata (line 21) | interface ChannelRoomMetadata {
type UnreadChatMessage (line 25) | interface UnreadChatMessage<T = UserType>
type UnreadChatMessageData (line 37) | interface UnreadChatMessageData<T = UserType> {
type ChatMessageData (line 46) | interface ChatMessageData<T = UserType> {
type JoinedChatData (line 51) | interface JoinedChatData<T = RoomType, U = UserType> {
type LeftChatData (line 58) | interface LeftChatData<T = RoomType, U = UserType> {
FILE: packages/tds-widget/src/chat/types/room.ts
type RoomType (line 15) | type RoomType = ValueOf<typeof RoomType>
type RoomListResultInterface (line 17) | interface RoomListResultInterface<T = RoomInterface> {
type RoomListResultWithPagingInterface (line 22) | interface RoomListResultWithPagingInterface<T = RoomInterface>
type RoomMetaDataType (line 28) | type RoomMetaDataType = 'EVENT' | 'PRODUCT' | 'BOOKING'
type RoomMetaDataBase (line 30) | interface RoomMetaDataBase {
type EventRoomMetaData (line 34) | interface EventRoomMetaData extends RoomMetaDataBase, EventMetaData {
type ProductRoomMetaData (line 38) | interface ProductRoomMetaData extends RoomMetaDataBase, ProductMetaData {
type BookingRoomMetaData (line 42) | interface BookingRoomMetaData extends RoomMetaDataBase, BookingMetaData {
type EventMetaData (line 46) | interface EventMetaData {
type UserMetaData (line 51) | interface UserMetaData {
type ProductMetaData (line 56) | interface ProductMetaData {
type BookingMetaData (line 67) | interface BookingMetaData {
type DateOfUseDate (line 76) | interface DateOfUseDate {
type DateOfUseRange (line 81) | interface DateOfUseRange {
type ChatRoomMetadataMap (line 87) | interface ChatRoomMetadataMap {
type ChatRoomMetadata (line 91) | type ChatRoomMetadata<T, U = ChatRoomMetadataMap> = T extends keyof U
type ExpirePolicyType (line 95) | type ExpirePolicyType = 'AFTER_DATE_OF_USE' | 'AFTER_MESSAGE' | 'AFTER_C...
type ExpirePolicyBase (line 97) | interface ExpirePolicyBase {
type AfterDateOfUsePolicy (line 110) | interface AfterDateOfUsePolicy extends ExpirePolicyBase {
type AfterMessagePolicy (line 114) | interface AfterMessagePolicy extends ExpirePolicyBase {
type AfterCancelPolicy (line 118) | interface AfterCancelPolicy extends ExpirePolicyBase {
type ExpirePolicy (line 122) | type ExpirePolicy =
type PreDirectRoomInterface (line 131) | interface PreDirectRoomInterface<T = RoomType, U = UserType> {
type InvitationRoomInterface (line 145) | interface InvitationRoomInterface<
type ChatRoomDetailInterface (line 160) | interface ChatRoomDetailInterface<
type ChatRoomListItemInterface (line 188) | interface ChatRoomListItemInterface<T = RoomType, U = UserType>
type ChatRoomInterface (line 207) | type ChatRoomInterface<
function isPreDirectRoom (line 220) | function isPreDirectRoom<
function isCreatedChatRoom (line 231) | function isCreatedChatRoom<
type RoomInterface (line 244) | interface RoomInterface<T = RoomType, U = UserType> {
type InvitationType (line 264) | type InvitationType = ValueOf<typeof InvitationType>
type InvitationAcceptInterface (line 266) | interface InvitationAcceptInterface {
type InvitationInterface (line 272) | interface InvitationInterface<
FILE: packages/tds-widget/src/chat/types/ui.ts
type BackgroundColor (line 1) | type BackgroundColor = 'mint' | 'blue' | 'gray' | 'darkGray'
type BackgroundColorInterface (line 3) | interface BackgroundColorInterface {
type BubbleStyle (line 8) | interface BubbleStyle<T extends 'sent' | 'received'> {
type ChatBubbleStyle (line 20) | interface ChatBubbleStyle {
FILE: packages/tds-widget/src/chat/types/unread.ts
type HasUnreadInterface (line 4) | interface HasUnreadInterface {
type HasUnreadOfRoomInterface (line 8) | interface HasUnreadOfRoomInterface extends HasUnreadInterface {
type OtherUnreadInterface (line 13) | interface OtherUnreadInterface {
type UpdatedChatData (line 26) | interface UpdatedChatData<T = UserType> {
FILE: packages/tds-widget/src/chat/types/user.ts
type UserType (line 9) | type UserType = ValueOf<typeof UserType>
type UserInterface (line 14) | interface UserInterface {
type ProfileInterface (line 21) | interface ProfileInterface {
type TripleChatUserInterface (line 30) | interface TripleChatUserInterface<T = UserType>
type TripleChatRoomMemberInterface (line 46) | interface TripleChatRoomMemberInterface<T = UserType>
type ChatRoomUser (line 51) | type ChatRoomUser<T = UserType> =
type ChatUserInterface (line 58) | interface ChatUserInterface<T = UserType> {
type ChatRoomMemberInterface (line 69) | interface ChatRoomMemberInterface<T = UserType>
type PreDirectRoomMemberInterface (line 79) | interface PreDirectRoomMemberInterface<T = UserType>
type ChatUserProfileInterface (line 87) | interface ChatUserProfileInterface {
function isChatRoomMember (line 93) | function isChatRoomMember<T = UserType>(
FILE: packages/tds-widget/src/chat/utils/a-tag-navigator.ts
function useATagNavigator (line 5) | function useATagNavigator(
FILE: packages/tds-widget/src/chat/utils/image.ts
function getProfileImageUrl (line 10) | function getProfileImageUrl<T = UserType>(
constant MAX_CHAT_IMAGE_WIDTH (line 27) | const MAX_CHAT_IMAGE_WIDTH = 224
function generatePreviewImage (line 29) | function generatePreviewImage({
FILE: packages/tds-widget/src/chat/utils/profile.ts
constant DEFAULT_MAX_USERNAME_LENGTH (line 1) | const DEFAULT_MAX_USERNAME_LENGTH = 10
function formatUsername (line 3) | function formatUsername({
FILE: packages/tds-widget/src/chat/utils/user.ts
function getUserIdentifier (line 10) | function getUserIdentifier<T = UserType>(
function shouldUseLegacyMemberId (line 24) | function shouldUseLegacyMemberId(room: ChatRoomInterface) {
FILE: packages/tds-widget/src/content-sharing/content-sharing.tsx
type Method (line 10) | enum Method {
function ContentSharing (line 19) | function ContentSharing({
FILE: packages/tds-widget/src/date-picker/constants.ts
constant LOCALE (line 6) | const LOCALE = 'ko'
constant WEEKDAY_SHORT_LABEL (line 7) | const WEEKDAY_SHORT_LABEL = moment.localeData('ko').weekdaysShort()
constant LOCALE_UTILS (line 8) | const LOCALE_UTILS = { ...MomentLocaleUtils, formatMonthTitle }
FILE: packages/tds-widget/src/date-picker/day-picker.tsx
function DayPicker (line 31) | function DayPicker({
FILE: packages/tds-widget/src/date-picker/mixins.ts
function todayMixin (line 3) | function todayMixin({
function rangeMixin (line 54) | function rangeMixin({
function dateLabelMixin (line 90) | function dateLabelMixin({
FILE: packages/tds-widget/src/date-picker/picker-frame.ts
function generateSelectedCircleStyle (line 5) | function generateSelectedCircleStyle(
type PickerFrameProps (line 75) | interface PickerFrameProps {
FILE: packages/tds-widget/src/date-picker/range-picker-v2/picker-frame.ts
function generateSelectedStyle (line 5) | function generateSelectedStyle({
type PickerFrameProps (line 59) | interface PickerFrameProps {
FILE: packages/tds-widget/src/date-picker/range-picker-v2/range-picker.tsx
function getInitialMonth (line 48) | function getInitialMonth() {
function RangePickerV2 (line 52) | function RangePickerV2({
FILE: packages/tds-widget/src/date-picker/range-picker.tsx
function getInitialMonth (line 70) | function getInitialMonth() {
function RangePicker (line 74) | function RangePicker({
FILE: packages/tds-widget/src/date-picker/service.ts
type Holiday (line 3) | interface Holiday {
function fetchPublicHolidays (line 10) | async function fetchPublicHolidays(
FILE: packages/tds-widget/src/date-picker/use-disabled-days.ts
type DisableDaysProps (line 5) | interface DisableDaysProps {
function useDisabledDays (line 11) | function useDisabledDays({
FILE: packages/tds-widget/src/date-picker/use-public-holidays.ts
constant EMPTY_ARRAY (line 7) | const EMPTY_ARRAY: Holiday[] = []
function usePublicHolidays (line 9) | function usePublicHolidays({
FILE: packages/tds-widget/src/date-picker/utils.ts
function formatMonthTitle (line 3) | function formatMonthTitle(d: Date, locale = 'ko'): string {
function isValidDate (line 8) | function isValidDate(d: unknown): boolean {
function generatePaddedRange (line 12) | function generatePaddedRange(from: Date, to: Date): Date[] {
FILE: packages/tds-widget/src/directions-finder/ask-to-the-local.tsx
function AskToTheLocal (line 42) | function AskToTheLocal({
FILE: packages/tds-widget/src/directions-finder/constants.ts
constant HASH_ASK_TO_LOCALS_POPUP (line 1) | const HASH_ASK_TO_LOCALS_POPUP = 'popup.ask-to-locals'
FILE: packages/tds-widget/src/directions-finder/direction-buttons.tsx
function DirectionButtons (line 21) | function DirectionButtons({
FILE: packages/tds-widget/src/flicking-carousel/arrow-icon.tsx
constant SVG_ATTRIBUTES_BY_DIRECTION (line 3) | const SVG_ATTRIBUTES_BY_DIRECTION = {
function ArrowIcon (line 16) | function ArrowIcon({ direction }: { direction: 'left' | 'right' }) {
FILE: packages/tds-widget/src/flicking-carousel/flicking-carousel.stories.tsx
type Story (line 20) | type Story = StoryObj<typeof FlickingCarousel>
FILE: packages/tds-widget/src/flicking-carousel/flicking-carousel.tsx
type CarouselBaseProps (line 16) | interface CarouselBaseProps {
type FlickingCarouselProps (line 21) | type FlickingCarouselProps = PropsWithChildren<CarouselBaseProps>
constant FLICK_ATTRIBUTES (line 68) | const FLICK_ATTRIBUTES: Partial<FlickingOptions> = {
function FlickingCarousel (line 94) | function FlickingCarousel({
FILE: packages/tds-widget/src/footer/elements/awards.tsx
function AwardGroup (line 44) | function AwardGroup({ awards }: { awards: FooterAward[] }) {
FILE: packages/tds-widget/src/footer/elements/button-area/button.tsx
constant BUTTON_LIST (line 61) | const BUTTON_LIST: Record<string, ReactNode> = {
function LoginLogoutButton (line 65) | function LoginLogoutButton() {
function LinkButton (line 95) | function LinkButton({
FILE: packages/tds-widget/src/footer/elements/button-area/dropdown.tsx
function Dropdown (line 41) | function Dropdown({
function DropdownArrow (line 109) | function DropdownArrow() {
FILE: packages/tds-widget/src/footer/elements/button-area/index.tsx
function ButtonArea (line 6) | function ButtonArea({ buttons }: { buttons: FooterButton[] }) {
FILE: packages/tds-widget/src/footer/elements/company-info.tsx
type CompanyInfoProps (line 66) | interface CompanyInfoProps {
function CompanyInfo (line 74) | function CompanyInfo({
function ArrowIcon (line 132) | function ArrowIcon({ businessExpanded }: { businessExpanded: boolean }) {
FILE: packages/tds-widget/src/footer/elements/extra-link-group.tsx
function ExtraLinkGroup (line 17) | function ExtraLinkGroup({ extraLinks }: { extraLinks: FooterLink[] }) {
function ExtraLink (line 26) | function ExtraLink({ label, url, faEventAction }: FooterLink) {
FILE: packages/tds-widget/src/footer/elements/link-group.tsx
function LinkGroup (line 27) | function LinkGroup({ links }: { links: FooterLink[] }) {
FILE: packages/tds-widget/src/footer/footers/default-footer.tsx
type DefaultFooterProps (line 48) | interface DefaultFooterProps {
function DefaultFooter (line 54) | function DefaultFooter({
FILE: packages/tds-widget/src/footer/footers/logo-footer.tsx
function LogoFooter (line 19) | function LogoFooter() {
FILE: packages/tds-widget/src/footer/utils/constants.ts
constant FOOTER_MIN_HEIGHTS (line 1) | const FOOTER_MIN_HEIGHTS = {
constant DESKTOP_MIN_WIDTH (line 8) | const DESKTOP_MIN_WIDTH = 768
FILE: packages/tds-widget/src/footer/utils/type.ts
type FooterInfo (line 1) | interface FooterInfo {
type FooterText (line 10) | interface FooterText {
type FooterLink (line 16) | interface FooterLink {
type FooterAward (line 23) | interface FooterAward {
type FooterButtonBase (line 29) | interface FooterButtonBase {
type FooterDefaultButton (line 39) | interface FooterDefaultButton extends FooterButtonBase {
type FooterLinkButton (line 43) | interface FooterLinkButton extends FooterButtonBase {
type FooterDropdownButton (line 50) | interface FooterDropdownButton extends FooterButtonBase {
type FooterButton (line 56) | type FooterButton =
FILE: packages/tds-widget/src/footer/utils/use-footer-info.tsx
constant FOOTER_INFO_ASSET_FILE_PATH (line 6) | const FOOTER_INFO_ASSET_FILE_PATH = '/footer/footer.json'
function useFooterInfo (line 8) | function useFooterInfo() {
FILE: packages/tds-widget/src/hub-form/cell.tsx
type StyleType (line 5) | type StyleType = 'SCHEDULE' | 'PEOPLE' | 'ORIGIN' | 'DESTINATION' | 'SEA...
constant STYLE_BY_TYPES (line 7) | const STYLE_BY_TYPES: { [type in StyleType]: ReturnType<typeof css> } = {
function Cell (line 50) | function Cell({
function Value (line 72) | function Value({ children }: PropsWithChildren<unknown>) {
function Placeholder (line 80) | function Placeholder({ children }: PropsWithChildren<unknown>) {
FILE: packages/tds-widget/src/hub-form/cta.tsx
function Cta (line 4) | function Cta({
FILE: packages/tds-widget/src/hub-form/hub-form.tsx
function HubForm (line 19) | function HubForm({
FILE: packages/tds-widget/src/image-carousel/carousel.tsx
type CarouselProps (line 7) | interface CarouselProps
function Carousel (line 29) | function Carousel({
FILE: packages/tds-widget/src/image-carousel/content.tsx
type Props (line 15) | interface Props {
function Content (line 27) | function Content({
FILE: packages/tds-widget/src/image-carousel/image-carousel.stories.tsx
type Story (line 35) | type Story = StoryObj<typeof ImageCarousel>
FILE: packages/tds-widget/src/image-carousel/image-carousel.tsx
type ImageCarouselProps (line 12) | interface ImageCarouselProps extends Omit<CarouselProps, 'pageLabelRende...
function ImageCarousel (line 28) | function ImageCarousel({
FILE: packages/tds-widget/src/image-carousel/image-content.tsx
type Props (line 9) | interface Props {
function ImageContent (line 20) | function ImageContent({
FILE: packages/tds-widget/src/image-carousel/page-label.tsx
function PageLabel (line 18) | function PageLabel({ currentIndex, totalCount }: RendererParams) {
FILE: packages/tds-widget/src/image-carousel/types.ts
type CarouselImageMeta (line 3) | interface CarouselImageMeta extends ImageMeta {
type RendererParams (line 7) | interface RendererParams {
FILE: packages/tds-widget/src/image-carousel/video-content.tsx
type Props (line 10) | interface Props {
constant HEIGHT_OPTIONS (line 19) | const HEIGHT_OPTIONS: Partial<Record<GlobalSizes, string>> = {
constant PLAY_BUTTON_IMAGE_URL (line 64) | const PLAY_BUTTON_IMAGE_URL =
function VideoContent (line 86) | function VideoContent({
FILE: packages/tds-widget/src/image-source/image-source.tsx
type ImageSourceProps (line 3) | interface ImageSourceProps {
function ImageSource (line 7) | function ImageSource({ sourceUrl }: ImageSourceProps) {
FILE: packages/tds-widget/src/image-viewer/detail-viewer/image.tsx
constant COMMON_WRAPPER_STYLE (line 16) | const COMMON_WRAPPER_STYLE = { width: '100%', height: '100%', margin: 'a...
function Image (line 18) | function Image({
FILE: packages/tds-widget/src/image-viewer/detail-viewer/index.tsx
constant SOURCE_HEIGHT (line 49) | const SOURCE_HEIGHT = 54
type DetailViewerProp (line 51) | interface DetailViewerProp {
function DetailViewer (line 63) | function DetailViewer({
FILE: packages/tds-widget/src/image-viewer/detail-viewer/video.tsx
type VideoProps (line 5) | interface VideoProps {
function Video (line 11) | function Video({
FILE: packages/tds-widget/src/image-viewer/image-viewer.tsx
constant NAVBAR_HEIGHT (line 7) | const NAVBAR_HEIGHT = 52
type ImageViewerPopupProps (line 15) | interface ImageViewerPopupProps
function ImageViewerPopup (line 28) | function ImageViewerPopup({
type DetailViewerContainerProp (line 70) | interface DetailViewerContainerProp
function DetailViewerContainer (line 83) | function DetailViewerContainer({
FILE: packages/tds-widget/src/listing-filter/listing-filter.tsx
constant ACTIVE_EXPANDER_ICON_URL (line 24) | const ACTIVE_EXPANDER_ICON_URL =
constant INACTIVE_EXPANDER_ICON_URL (line 26) | const INACTIVE_EXPANDER_ICON_URL =
constant PRIMARY_ICON_URL (line 28) | const PRIMARY_ICON_URL = 'https://assets.triple.guide/images/ico-filter-...
type ExpandingFilterEntryProps (line 70) | interface ExpandingFilterEntryProps extends HTMLAttributes<HTMLElement> {
function ExpandingFilterEntry (line 75) | function ExpandingFilterEntry({
type FilterEntryProps (line 162) | interface FilterEntryProps extends HTMLAttributes<HTMLElement> {
function FilterEntry (line 170) | function FilterEntry({
class ListingFilter (line 203) | class ListingFilter extends PureComponent<{
method render (line 213) | public render() {
FILE: packages/tds-widget/src/location-properties/location-properties.tsx
type ExtraProperty (line 12) | interface ExtraProperty {
function LocationProperties (line 17) | function LocationProperties({
FILE: packages/tds-widget/src/location-properties/property-item.tsx
constant ACTION_SHEET_PREFIX (line 16) | const ACTION_SHEET_PREFIX = 'location-properties.copy-action-sheet'
type PropertyItemProps (line 18) | interface PropertyItemProps {
type LongClickableItemContainerProps (line 27) | type LongClickableItemContainerProps = LongClickableComponentProps &
function PropertyItem (line 33) | function PropertyItem({
FILE: packages/tds-widget/src/map/focus-tracker.tsx
constant AUTO_ZOOM_THRESHOLD (line 5) | const AUTO_ZOOM_THRESHOLD = 10
type FocusTrackerProps (line 7) | interface FocusTrackerProps {
function FocusTracker (line 14) | function FocusTracker({
FILE: packages/tds-widget/src/map/index.test.tsx
constant MOCK_MAP_VIEW (line 5) | const MOCK_MAP_VIEW: WithGoogleMapProps = {
FILE: packages/tds-widget/src/map/map-view.tsx
constant MAX_LAT (line 17) | const MAX_LAT = (Math.atan(Math.sinh(Math.PI)) * 180) / Math.PI
constant DEFAULT_BOUNDS_PADDING (line 19) | const DEFAULT_BOUNDS_PADDING = {
constant DEFAULT_MAP_OPTIONS (line 26) | const DEFAULT_MAP_OPTIONS: google.maps.MapOptions = {
constant DEFAULT_MAP_CONTAINER_STYLE (line 43) | const DEFAULT_MAP_CONTAINER_STYLE: CSSProperties = {
type WithGoogleMapProps (line 48) | interface WithGoogleMapProps extends GoogleMapProps {
constant GOOGLE_MAP_LIBRARIES (line 90) | const GOOGLE_MAP_LIBRARIES = ['geometry' as const]
function MapView (line 97) | function MapView({
FILE: packages/tds-widget/src/map/map.stories.tsx
constant GOOGLE_MAPS_API_KEY (line 20) | const GOOGLE_MAPS_API_KEY = 'AIzaSyDuSWU_yBwuQzeyRFcTqhyifqNX_8oaXI4'
FILE: packages/tds-widget/src/map/overlay/markers/flexible-marker.tsx
function FlexibleMarker (line 9) | function FlexibleMarker({
FILE: packages/tds-widget/src/map/overlay/markers/poi-dot-marker.tsx
type DotWithPopOverMarkerProps (line 21) | interface DotWithPopOverMarkerProps
function PoiDotMarker (line 38) | function PoiDotMarker({
function DotWithPopOverMarker (line 45) | function DotWithPopOverMarker({
FILE: packages/tds-widget/src/map/overlay/markers/primary-marker/bubble-marker.tsx
type BubbleMarkerProps (line 4) | interface BubbleMarkerProps {
constant BUBBLE_HEIGHT (line 8) | const BUBBLE_HEIGHT = 32
function BubbleMarker (line 43) | function BubbleMarker({
FILE: packages/tds-widget/src/map/overlay/markers/primary-marker/circle-marker/circle-marker-base.tsx
type MarkerBaseProps (line 4) | interface MarkerBaseProps {
constant MAX_ZINDEX_WEIGHT (line 21) | const MAX_ZINDEX_WEIGHT = 100
function withActive (line 48) | function withActive({
FILE: packages/tds-widget/src/map/overlay/markers/primary-marker/circle-marker/index.tsx
type CircleType (line 12) | type CircleType = 'attraction' | 'restaurant' | 'hotel'
type CircleMarkerProps (line 14) | interface CircleMarkerProps
constant CIRCLE_MARKER (line 21) | const CIRCLE_MARKER: {
function CircleMarker (line 43) | function CircleMarker({
FILE: packages/tds-widget/src/map/overlay/markers/primary-marker/dot-marker.tsx
type DotMarkerProps (line 4) | interface DotMarkerProps {
constant BUBBLE_HEIGHT (line 11) | const BUBBLE_HEIGHT = 32
function DotMarker (line 53) | function DotMarker({
FILE: packages/tds-widget/src/map/overlay/markers/primary-marker/pin-marker/pin-marker.tsx
type PinMarkerType (line 5) | type PinMarkerType =
function getColorOfType (line 12) | function getColorOfType(type: PinMarkerType) {
function getActivePinImageUrl (line 29) | function getActivePinImageUrl(type: PinMarkerType) {
type HocProps (line 39) | type HocProps = Omit<Parameters<typeof CircleMarker>[0], 'color' | 'src'>
function PinWithCircleMarker (line 41) | function PinWithCircleMarker(type: PinMarkerType) {
FILE: packages/tds-widget/src/map/overlay/polygon.tsx
type PolygonProps (line 15) | type PolygonProps = {
function Polygon (line 19) | function Polygon({ paths, ...rest }: PolygonProps) {
FILE: packages/tds-widget/src/map/overlay/polyline.tsx
function PolylineBase (line 15) | function PolylineBase({ path, ...rest }: google.maps.PolylineOptions) {
function withCustomOptions (line 32) | function withCustomOptions(options: google.maps.PolylineOptions) {
FILE: packages/tds-widget/src/map/types.ts
type BaseResourceType (line 7) | interface BaseResourceType {
type PoiType (line 12) | enum PoiType {
type Price (line 21) | interface Price {
type HotelResourceType (line 32) | interface HotelResourceType {
type RecommendationHotelResourceType (line 52) | interface RecommendationHotelResourceType {
type RecommendationItineraryCardResourceType (line 59) | interface RecommendationItineraryCardResourceType {
type RecommendationItineraryResourceType (line 74) | interface RecommendationItineraryResourceType {
type RecommendationItineraryPoiCard (line 80) | interface RecommendationItineraryPoiCard {
FILE: packages/tds-widget/src/map/utilities.ts
function getGeometry (line 1) | function getGeometry(coordinates: [number, number][]) {
function literalToString (line 33) | function literalToString(
function getShiftLatLng (line 53) | function getShiftLatLng(
FILE: packages/tds-widget/src/media/media.tsx
type MediaMeta (line 12) | type MediaMeta = ImageMeta
type MediaProps (line 14) | type MediaProps = {
function Media (line 28) | function Media({
FILE: packages/tds-widget/src/nearby-pois/nearby-pois.tsx
constant INITIAL_STATE (line 26) | const INITIAL_STATE: NearbyPoisState = {
constant EVENT_LABELS (line 40) | const EVENT_LABELS: { [key in NearByPoiType]: string } = {
constant DEFAULT_PAGE_SIZE (line 45) | const DEFAULT_PAGE_SIZE = 3
constant SUBSEQUENT_PAGE_SIZE (line 46) | const SUBSEQUENT_PAGE_SIZE = 10
function NearbyPois (line 48) | function NearbyPois({
FILE: packages/tds-widget/src/nearby-pois/poi-entry.tsx
function PoiEntry (line 11) | function PoiEntry({
FILE: packages/tds-widget/src/nearby-pois/reducer.ts
constant FETCH_POIS (line 3) | const FETCH_POIS = 'nearby-pois/FETCH_POIS'
constant APPEND_POIS (line 4) | const APPEND_POIS = 'nearby-pois/APPEND_POIS'
constant SET_CURRENT_TAB (line 5) | const SET_CURRENT_TAB = 'nearby-pois/SET_CURRENT_TAB'
type NearbyPoisAction (line 7) | type NearbyPoisAction = ReturnType<
type NearbyPoisState (line 11) | interface NearbyPoisState {
function setFetchingStatus (line 25) | function setFetchingStatus({ type }: { type: NearByPoiType }) {
function appendPois (line 32) | function appendPois({
function setCurrentTab (line 51) | function setCurrentTab({ type }: { type: NearByPoiType }) {
function nearbyPoisReducer (line 58) | function nearbyPoisReducer(
function deduplicateAndMergePoiList (line 92) | function deduplicateAndMergePoiList(
FILE: packages/tds-widget/src/nearby-pois/service.ts
function fetchPois (line 6) | async function fetchPois({
FILE: packages/tds-widget/src/nearby-pois/types.ts
type NearByPoiType (line 6) | type NearByPoiType = 'attraction' | 'restaurant'
type ListingPoi (line 7) | type ListingPoi = ListingAttraction | ListingRestaurant
FILE: packages/tds-widget/src/poi-detail/actions/actions.tsx
type TOOLTIP_TYPE (line 20) | type TOOLTIP_TYPE = 'SCRAPE' | 'REVIEW'
constant REVIEW_TOOLTIP_EXPOSED (line 22) | const REVIEW_TOOLTIP_EXPOSED = 'REVIEW_TOOLTIP_EXPOSED'
constant SCRAPE_TOOLTIP_EXPOSED (line 23) | const SCRAPE_TOOLTIP_EXPOSED = 'SCRAPE_TOOLTIP_EXPOSED'
function PoiDetailActions (line 25) | function PoiDetailActions({
FILE: packages/tds-widget/src/poi-detail/actions/tooltip/tooltip.tsx
type Position (line 5) | type Position = 'top' | 'bottom'
type CoreTooltipProps (line 30) | type CoreTooltipProps = ComponentProps<typeof CoreTooltip>
function getPointing (line 32) | function getPointing(position: Position): CoreTooltipProps['pointing'] {
function Tooltip (line 47) | function Tooltip({
function useLocalStorageTooltip (line 83) | function useLocalStorageTooltip(key: string) {
FILE: packages/tds-widget/src/poi-detail/area-names.tsx
type Area (line 13) | interface Area {
function AreaNames (line 18) | function AreaNames({
FILE: packages/tds-widget/src/poi-detail/constants.ts
constant HASH_COPY_ACTION_SHEET (line 1) | const HASH_COPY_ACTION_SHEET =
FILE: packages/tds-widget/src/poi-detail/copy-action-sheet-item.tsx
function CopyActionSheetItem (line 5) | function CopyActionSheetItem({
FILE: packages/tds-widget/src/poi-detail/copy-action-sheet.tsx
function CopyActionSheet (line 6) | function CopyActionSheet({
FILE: packages/tds-widget/src/poi-detail/detail-header-v2/index.tsx
type Area (line 41) | interface Area {
function PoiDetailHeaderV2 (line 46) | function PoiDetailHeaderV2({
FILE: packages/tds-widget/src/poi-detail/detail-header/business-hours-icons.tsx
function TimeIcon (line 1) | function TimeIcon() {
function RightArrowIcon (line 29) | function RightArrowIcon() {
FILE: packages/tds-widget/src/poi-detail/detail-header/business-hours-note.tsx
function BusinessHoursNote (line 15) | function BusinessHoursNote({
FILE: packages/tds-widget/src/poi-detail/detail-header/index.tsx
type Area (line 27) | interface Area {
function PoiDetailHeader (line 32) | function PoiDetailHeader({
FILE: packages/tds-widget/src/poi-detail/image-carousel/carousel-section.tsx
type PoiType (line 8) | type PoiType = 'attraction' | 'hotel' | 'restaurant'
type CarouselSectionProps (line 10) | interface CarouselSectionProps extends CarouselProps {
function CarouselSection (line 28) | function CarouselSection({
FILE: packages/tds-widget/src/poi-detail/image-carousel/carousel.tsx
constant SHOW_CTA_FROM_INDEX (line 16) | const SHOW_CTA_FROM_INDEX = 5
function FixedRatio (line 27) | function FixedRatio({ ratio, children }: PropsWithChildren<{ ratio: numb...
type CarouselProps (line 35) | interface CarouselProps {
function Carousel (line 47) | function Carousel({
FILE: packages/tds-widget/src/poi-detail/image-carousel/cta-overlay.tsx
function CtaOverlay (line 21) | function CtaOverlay() {
FILE: packages/tds-widget/src/poi-detail/image-carousel/index.tsx
type ImageCarouselProps (line 5) | type ImageCarouselProps = Pick<
function PoiDetailImageCarousel (line 21) | function PoiDetailImageCarousel(props: ImageCarouselProps) {
FILE: packages/tds-widget/src/poi-detail/image-carousel/note.tsx
type PermanetlyCloseNoteProps (line 31) | interface PermanetlyCloseNoteProps {
function PermanentlyClosedNote (line 35) | function PermanentlyClosedNote({
type BusinessHourNoteProps (line 49) | interface BusinessHourNoteProps {
function BusinessHoursNote (line 62) | function BusinessHoursNote({
FILE: packages/tds-widget/src/poi-detail/image-carousel/placeholder.tsx
constant DEFAULT_ICON_URLS (line 8) | const DEFAULT_ICON_URLS: Record<PoiType, string> = {
type ImagePlaceholderProps (line 47) | interface ImagePlaceholderProps {
function ImagePlaceholder (line 55) | function ImagePlaceholder({
function ResponsiveImagePlaceholder (line 89) | function ResponsiveImagePlaceholder({
FILE: packages/tds-widget/src/poi-detail/images-provider.tsx
type PoiDetailImagesContext (line 22) | interface PoiDetailImagesContext {
type PoiDetailImagesProviderProps (line 33) | interface PoiDetailImagesProviderProps {
function PoiDetailImagesProvider (line 54) | function PoiDetailImagesProvider({
function usePoiDetailImages (line 222) | function usePoiDetailImages() {
function filterDefaultImages (line 226) | function filterDefaultImages(
FILE: packages/tds-widget/src/poi-detail/images-reducer.ts
type ImagesState (line 3) | interface ImagesState {
constant REINITIALIZE_IMAGES (line 10) | const REINITIALIZE_IMAGES = 'INITIALIZE_IMAGES'
constant LOAD_IMAGES_REQUEST (line 11) | const LOAD_IMAGES_REQUEST = 'LOAD_IMAGES_REQUEST'
constant LOAD_IMAGES_SUCCESS (line 12) | const LOAD_IMAGES_SUCCESS = 'LOAD_IMAGES_SUCCESS'
constant LOAD_IMAGES_FAIL (line 13) | const LOAD_IMAGES_FAIL = 'LOAD_IMAGES_FAIL'
function loadImagesRequest (line 15) | function loadImagesRequest() {
function loadImagesSuccess (line 21) | function loadImagesSuccess(payload: {
function loadImagesFail (line 32) | function loadImagesFail(error: unknown) {
function reinitializeImages (line 40) | function reinitializeImages(payload: {
function reducer (line 51) | function reducer(
FILE: packages/tds-widget/src/poi-detail/recommended-articles.stories.tsx
type Story (line 18) | type Story = StoryObj<typeof PoiDetailRecommendedArticles>
FILE: packages/tds-widget/src/poi-detail/recommended-articles/api-client.ts
function fetchRecommendedArticles (line 6) | async function fetchRecommendedArticles({
function shuffle (line 33) | function shuffle<T>(array: T[]): T[] {
FILE: packages/tds-widget/src/poi-detail/recommended-articles/article-entry.tsx
function ArticleEntry (line 7) | function ArticleEntry({
FILE: packages/tds-widget/src/poi-detail/recommended-articles/recommended-articles.tsx
function PoiDetailRecommendedArticles (line 30) | function PoiDetailRecommendedArticles({
FILE: packages/tds-widget/src/poi-detail/recommended-articles/types.ts
type ArticleListingData (line 3) | interface ArticleListingData {
FILE: packages/tds-widget/src/poi-detail/types.ts
type ImageCategoryOrder (line 1) | type ImageCategoryOrder =
FILE: packages/tds-widget/src/poi-detail/use-fetch-images.tsx
function useFetchImages (line 12) | function useFetchImages() {
function sendFetchImages (line 77) | async function sendFetchImages(
function fetchContentImages (line 103) | async function fetchContentImages(
function fetchPoiReviewImages (line 117) | async function fetchPoiReviewImages(
FILE: packages/tds-widget/src/poi-list-elements/carousel-element.tsx
function PoiCarouselElement (line 22) | function PoiCarouselElement<T extends PoiListElementType>({
FILE: packages/tds-widget/src/poi-list-elements/compact-poi-list-element.tsx
type CompactPoiListElementBaseProps (line 21) | interface CompactPoiListElementBaseProps<T extends PoiListElementType>
type CompactPoiListElementProps (line 27) | type CompactPoiListElementProps<T extends PoiListElementType> =
constant POI_IMAGE_PLACEHOLDERS_SMALL (line 32) | const POI_IMAGE_PLACEHOLDERS_SMALL: {
function CompactPoiListElement (line 40) | function CompactPoiListElement<T extends PoiListElementType>({
FILE: packages/tds-widget/src/poi-list-elements/constants.ts
constant POI_IMAGE_PLACEHOLDERS (line 3) | const POI_IMAGE_PLACEHOLDERS: {
FILE: packages/tds-widget/src/poi-list-elements/extended-poi-list-element.tsx
type ExtendedPoiListElementBaseProps (line 10) | interface ExtendedPoiListElementBaseProps<T extends PoiListElementType>
type ExtendedPoiListElementProps (line 19) | type ExtendedPoiListElementProps<T extends PoiListElementType> =
function ExtendedPoiListElement (line 24) | function ExtendedPoiListElement<T extends PoiListElementType>({
FILE: packages/tds-widget/src/poi-list-elements/get-type-names.ts
function getTypeNames (line 3) | function getTypeNames(type: PoiListElementType['type']) {
FILE: packages/tds-widget/src/poi-list-elements/poi-card-element/direction-button.tsx
constant DIRECTION_BUTTON_WIDTH (line 3) | const DIRECTION_BUTTON_WIDTH = 40
function DirectionButton (line 11) | function DirectionButton({ onClick }: { onClick: () => void }) {
FILE: packages/tds-widget/src/poi-list-elements/poi-card-element/poi-card-element.tsx
constant IMAGE_WIDTH (line 18) | const IMAGE_WIDTH = 58
constant IMAGE_PLACEHOLDERS (line 20) | const IMAGE_PLACEHOLDERS = {
function PoiCardElement (line 53) | function PoiCardElement({
FILE: packages/tds-widget/src/poi-list-elements/poi-list-element.tsx
type PoiListElementProps (line 11) | type PoiListElementProps<T extends PoiListElementType> =
function PoiListElement (line 15) | function PoiListElement<T extends PoiListElementType>({
FILE: packages/tds-widget/src/poi-list-elements/types.ts
type ActionButtonElement (line 8) | type ActionButtonElement = ReactNode
type PoiListElementBaseProps (line 10) | interface PoiListElementBaseProps<T extends PoiListElementType> {
type PoiType (line 15) | type PoiType = 'attraction' | 'restaurant' | 'hotel'
type PoiListElementType (line 17) | interface PoiListElementType {
FILE: packages/tds-widget/src/pricing/fixed-pricing-v2/index.tsx
type FixedPricingV2Props (line 20) | interface FixedPricingV2Props {
function LoadingSkeleton (line 62) | function LoadingSkeleton() {
function FixedPricingV2 (line 109) | function FixedPricingV2({
FILE: packages/tds-widget/src/pricing/fixed-pricing-v2/purchase-button-loading-indicator.tsx
type IndicatorProps (line 4) | interface IndicatorProps {
function PurchaseButtonLoadingIndicator (line 53) | function PurchaseButtonLoadingIndicator({
FILE: packages/tds-widget/src/pricing/fixed-pricing-v2/purchase-button.tsx
function PurchaseButton (line 5) | function PurchaseButton({
FILE: packages/tds-widget/src/pricing/fixed-pricing.tsx
type FixedPricingProps (line 15) | interface FixedPricingProps {
function FixedPricing (line 65) | function FixedPricing({
FILE: packages/tds-widget/src/pricing/pricing.tsx
type BasePrice (line 10) | type BasePrice = number | null
type RegularPricingProps (line 12) | interface RegularPricingProps {
type RichPricingProps (line 19) | interface RichPricingProps {
type PricingProps (line 31) | type PricingProps =
constant FONT_SIZE (line 39) | const FONT_SIZE: Partial<Record<GlobalSizes, string>> = {
type PricingColors (line 47) | type PricingColors = GlobalColors | 'pink' | 'default'
constant COLORS (line 49) | const COLORS: Partial<Record<PricingColors, string>> = {
function DiscountRate (line 90) | function DiscountRate({
function RichPricing (line 106) | function RichPricing({
function Pricing (line 214) | function Pricing(props: PricingProps) {
FILE: packages/tds-widget/src/public-header/categories.ts
function getCategoryHref (line 3) | function getCategoryHref(category?: Category) {
function getCategoryTitle (line 16) | function getCategoryTitle(category?: Category) {
function getCategoryImageProps (line 29) | function getCategoryImageProps(category: Category) {
FILE: packages/tds-widget/src/public-header/constants.ts
constant MIN_DESKTOP_WIDTH (line 3) | const MIN_DESKTOP_WIDTH = 1142
constant TRANSITION_TIME (line 4) | const TRANSITION_TIME = 250
constant HEADER_MOBILE_HEIGHT (line 5) | const HEADER_MOBILE_HEIGHT = 50
constant HEADER_DESKTOP_HEIGHT (line 6) | const HEADER_DESKTOP_HEIGHT = 80
constant HEADER_SIDE_MENU_HASH (line 7) | const HEADER_SIDE_MENU_HASH = 'open.side-menu'
constant HEADER_ACTION_ITEMS (line 9) | const HEADER_ACTION_ITEMS = {
constant HEADER_SIDE_MENU_ITEMS (line 22) | const HEADER_SIDE_MENU_ITEMS: MenuItem[] = [
FILE: packages/tds-widget/src/public-header/public-header-deeplink.tsx
type Props (line 8) | interface Props {
function PublicHeaderDeeplink (line 13) | function PublicHeaderDeeplink({
FILE: packages/tds-widget/src/public-header/public-header.tsx
type PublicHeaderProps (line 94) | interface PublicHeaderProps {
function PublicHeader (line 113) | function PublicHeader({
FILE: packages/tds-widget/src/public-header/side-menu/auth-button.tsx
function AuthButton (line 4) | function AuthButton() {
FILE: packages/tds-widget/src/public-header/side-menu/index.tsx
function SideMenu (line 10) | function SideMenu({
FILE: packages/tds-widget/src/public-header/side-menu/menu-list.tsx
type MenuListProps (line 92) | interface MenuListProps {
function MenuList (line 96) | function MenuList({ menus }: MenuListProps) {
function LinkMenuItem (line 114) | function LinkMenuItem({
function AccordionMenuItem (line 133) | function AccordionMenuItem({
FILE: packages/tds-widget/src/public-header/side-menu/overlay.tsx
constant TRANSITION_DURATION (line 15) | const TRANSITION_DURATION = 300
constant SIDE_BAR_WIDTH (line 16) | const SIDE_BAR_WIDTH = 325
type SideMenuOverlayProps (line 50) | interface SideMenuOverlayProps extends PropsWithChildren {
function SideMenuOverlay (line 59) | function SideMenuOverlay({
FILE: packages/tds-widget/src/public-header/side-menu/profile.tsx
constant PROVIDER_INFO (line 48) | const PROVIDER_INFO = {
constant PROFILE_EVENT_METADATA_LABEL (line 75) | const PROFILE_EVENT_METADATA_LABEL = {
constant NOL_CONNECTED_LABEL (line 80) | const NOL_CONNECTED_LABEL = 'NOL 회원'
function Profile (line 82) | function Profile() {
FILE: packages/tds-widget/src/public-header/side-menu/type.ts
type MenuItemBase (line 1) | interface MenuItemBase {
type LinkMenuItem (line 8) | type LinkMenuItem = MenuItemBase & {
type AccordionMenuItem (line 13) | type AccordionMenuItem = MenuItemBase & {
type MenuItem (line 19) | type MenuItem = LinkMenuItem | AccordionMenuItem
FILE: packages/tds-widget/src/public-header/types.ts
type Category (line 3) | type Category = 'air' | 'hotels' | 'tna'
type DeeplinkComponent (line 4) | type DeeplinkComponent = ({
FILE: packages/tds-widget/src/public-header/use-auto-hide.ts
function useAutoHide (line 10) | function useAutoHide(disabled = false) {
function getScrollTop (line 74) | function getScrollTop(heightCompensation = 0) {
type DirectionLog (line 87) | interface DirectionLog {
type Direction (line 91) | type Direction = 'NEUTRAL' | 'UP' | 'DOWN'
function createScrollDirectionDetector (line 93) | function createScrollDirectionDetector(initialLog: DirectionLog) {
FILE: packages/tds-widget/src/public-header/use-deeplink-href.ts
function useDeeplinkHref (line 9) | function useDeeplinkHref(path: string) {
FILE: packages/tds-widget/src/recommended-contents/recommended-contents.tsx
type ContentElementProps (line 91) | interface ContentElementProps {
function RecommendedContents (line 96) | function RecommendedContents<T extends ContentElementProps>({
FILE: packages/tds-widget/src/replies/auto-resizing-textarea.tsx
constant TEXTAREA_LINE_HEIGHT (line 25) | const TEXTAREA_LINE_HEIGHT = 19
type TextareaProps (line 27) | interface TextareaProps {
type TextAreaHandle (line 36) | interface TextAreaHandle {
FILE: packages/tds-widget/src/replies/context.tsx
type EditingMessage (line 9) | interface EditingMessage {
type ReplyBaseActions (line 19) | interface ReplyBaseActions {
function RepliesProvider (line 33) | function RepliesProvider({ children }: PropsWithChildren<unknown>) {
function useRepliesContext (line 100) | function useRepliesContext() {
FILE: packages/tds-widget/src/replies/guide-text.tsx
constant HASH_EDIT_CLOSE_MODAL (line 6) | const HASH_EDIT_CLOSE_MODAL = 'reply.edit-close-modal'
function GuideText (line 8) | function GuideText() {
FILE: packages/tds-widget/src/replies/hook.tsx
function useHttpResponseError (line 5) | function useHttpResponseError() {
FILE: packages/tds-widget/src/replies/list/index.tsx
constant HASH_EDIT_CLOSE_MODAL (line 15) | const HASH_EDIT_CLOSE_MODAL = 'reply.edit-close-modal'
function ReplyList (line 17) | function ReplyList({
function ConfirmEditModal (line 129) | function ConfirmEditModal({ onConfirm }: { onConfirm: () => void }) {
function ConfirmDeleteModal (line 145) | function ConfirmDeleteModal({
FILE: packages/tds-widget/src/replies/list/not-exist-replies.tsx
function NotExistReplies (line 4) | function NotExistReplies() {
FILE: packages/tds-widget/src/replies/list/reply.tsx
constant HASH_MORE_ACTION_SHEET (line 67) | const HASH_MORE_ACTION_SHEET = 'reply.more-action-sheet'
constant HASH_DELETE_CLOSE_MODAL (line 68) | const HASH_DELETE_CLOSE_MODAL = 'reply.delete-close-modal'
function Reply (line 70) | function Reply({
function Content (line 433) | function Content({
function FeatureActionSheet (line 504) | function FeatureActionSheet({
FILE: packages/tds-widget/src/replies/replies-api-client.test.ts
constant MOCKED_REPLY (line 13) | const MOCKED_REPLY = {
type CustomJestFn (line 49) | type CustomJestFn = jest.MockedFunction<
FILE: packages/tds-widget/src/replies/replies-api-client.ts
function fetchReplies (line 11) | async function fetchReplies({
function fetchChildReplies (line 40) | async function fetchChildReplies({
function authorMessage (line 65) | async function authorMessage({
function deriveAuthoringRequestType (line 118) | function deriveAuthoringRequestType({
function writeReply (line 136) | async function writeReply({
function writeChildReply (line 168) | async function writeChildReply({
function editReply (line 197) | async function editReply({
function deleteReply (line 225) | async function deleteReply({
class SessionError (line 245) | class SessionError extends Error {
method constructor (line 246) | public constructor() {
function likeReply (line 251) | async function likeReply({ messageId }: { messageId: string }) {
function unlikeReply (line 264) | async function unlikeReply({ messageId }: { messageId: string }) {
function parseRepliesListResponse (line 277) | function parseRepliesListResponse(
function parseReplyResponse (line 290) | function parseReplyResponse(
function confirmAuthorization (line 300) | function confirmAuthorization<T>(
function sortChildren (line 312) | function sortChildren(reply: Reply): Reply {
function throwResponseError (line 325) | function throwResponseError<S, F>(response: 'NEED_LOGIN' | HttpResponse<...
FILE: packages/tds-widget/src/replies/replies.tsx
function Replies (line 39) | function Replies({
FILE: packages/tds-widget/src/replies/reply-tree-manipulators.test.tsx
constant MOCK_BASE_REPLY (line 9) | const MOCK_BASE_REPLY = {
function generateMockReply (line 396) | function generateMockReply(updatedAttributes?: Partial<Reply>): Reply {
FILE: packages/tds-widget/src/replies/reply-tree-manipulators.ts
function addReply (line 4) | function addReply(reply: Reply, tree: Reply): Reply {
function deleteReply (line 20) | function deleteReply(reply: Reply, tree: Reply): Reply | undefined {
function editReply (line 39) | function editReply(
function appendReplyChildren (line 59) | function appendReplyChildren(
FILE: packages/tds-widget/src/replies/reply.test.tsx
constant MOCKED_REPLY (line 34) | const MOCKED_REPLY = {
function generateMockReply (line 188) | function generateMockReply(reactions: Pick<ReplyType, 'reactions'>) {
FILE: packages/tds-widget/src/replies/types.ts
type ResourceType (line 1) | type ResourceType = 'review' | 'itinerary' | 'article'
type Writer (line 3) | interface Writer {
type Reply (line 14) | interface Reply {
type Placeholders (line 52) | interface Placeholders {
FILE: packages/tds-widget/src/replies/utils.ts
function checkUniqueReply (line 3) | function checkUniqueReply(reply: Reply[]): Reply[] {
FILE: packages/tds-widget/src/resource-list-elements/extended-resource-list-element.tsx
type ResourceMeta (line 20) | interface ResourceMeta {
type ResourceListElementProps (line 26) | type ResourceListElementProps<R extends ResourceMeta> = {
function ExtendedResourceListElement (line 93) | function ExtendedResourceListElement<R extends ResourceMeta>({
FILE: packages/tds-widget/src/resource-list-elements/resource-list-element-stats.tsx
function ResourceListElementStats (line 3) | function ResourceListElementStats({
FILE: packages/tds-widget/src/resource-list-elements/review-scrap-stat.tsx
function ReviewScrapStat (line 7) | function ReviewScrapStat({
FILE: packages/tds-widget/src/review/components/filter-context.tsx
type FilterValues (line 12) | interface FilterValues {
constant EVENT_TYPE (line 21) | const EVENT_TYPE = 'reviews-web/filter-change'
function FilterProvider (line 23) | function FilterProvider({
function useReviewFilters (line 129) | function useReviewFilters() {
FILE: packages/tds-widget/src/review/components/filter.tsx
function Filters (line 64) | function Filters() {
function Filter (line 95) | function Filter({
function ToolTip (line 120) | function ToolTip() {
FILE: packages/tds-widget/src/review/components/full-list-button.tsx
type Props (line 16) | interface Props {
constant OPTION_LABELS (line 27) | const OPTION_LABELS = {
FILE: packages/tds-widget/src/review/components/infinite-list/infinite-list.tsx
type Props (line 14) | interface Props {
function InfiniteList (line 30) | function InfiniteList({
FILE: packages/tds-widget/src/review/components/infinite-list/latest-reviews-infinite.tsx
function LatestReviewsInfinite (line 7) | function LatestReviewsInfinite({
FILE: packages/tds-widget/src/review/components/infinite-list/popular-reviews-infinite.tsx
function PopularReviewsInfinite (line 7) | function PopularReviewsInfinite({
FILE: packages/tds-widget/src/review/components/infinite-list/rating-infinite-list.tsx
function RatingReviewsInfinite (line 7) | function RatingReviewsInfinite({
FILE: packages/tds-widget/src/review/components/infinite-list/services.ts
function useInfinitePopularReviews (line 19) | function useInfinitePopularReviews(
function useInfiniteLatestReviews (line 51) | function useInfiniteLatestReviews(
function useInfiniteRatingReviews (line 83) | function useInfiniteRatingReviews(
FILE: packages/tds-widget/src/review/components/infinite-list/types.ts
type InfiniteReviewProps (line 1) | interface InfiniteReviewProps {
type ExtendInfiniteReviewProps (line 11) | type ExtendInfiniteReviewProps = InfiniteReviewProps & {
type InfinityReviewValue (line 15) | type InfinityReviewValue =
FILE: packages/tds-widget/src/review/components/mileage-button.tsx
type Props (line 41) | interface Props {
function MileageButton (line 45) | function MileageButton({ resourceId }: Props) {
FILE: packages/tds-widget/src/review/components/my-review-action-sheet.tsx
constant HASH_MY_REVIEW_ACTION_SHEET (line 7) | const HASH_MY_REVIEW_ACTION_SHEET =
constant HASH_DELETION_MODAL (line 10) | const HASH_DELETION_MODAL = 'common.reviews-list.deletion-modal'
type MyReviewActionSheetProps (line 12) | interface MyReviewActionSheetProps {
function MyReviewActionSheet (line 20) | function MyReviewActionSheet({
FILE: packages/tds-widget/src/review/components/others-review-action-sheet.tsx
constant HASH_REVIEW_ACTION_SHEET (line 6) | const HASH_REVIEW_ACTION_SHEET =
type OthersReviewActionSheetProps (line 9) | interface OthersReviewActionSheetProps {
function OthersReviewActionSheet (line 13) | function OthersReviewActionSheet({
FILE: packages/tds-widget/src/review/components/review-element/badges.tsx
function ReviewBadges (line 4) | function ReviewBadges({
function RecentTripBadge (line 19) | function RecentTripBadge() {
function VerifiedPurchaseBadge (line 45) | function VerifiedPurchaseBadge() {
FILE: packages/tds-widget/src/review/components/review-element/comment.tsx
function Comment (line 4) | function Comment({ children }: PropsWithChildren<unknown>) {
FILE: packages/tds-widget/src/review/components/review-element/foldable-comment.tsx
constant MAX_COMMENT_WITH_IMAGE_LINES (line 8) | const MAX_COMMENT_WITH_IMAGE_LINES = 3
constant MAX_COMMENT_LINES (line 9) | const MAX_COMMENT_LINES = 6
function FoldableComment (line 17) | function FoldableComment({
function FoldedComment (line 41) | function FoldedComment({
FILE: packages/tds-widget/src/review/components/review-element/index.tsx
type ReviewElementProps (line 102) | interface ReviewElementProps {
function ReviewElement (line 112) | function ReviewElement({
function Score (line 436) | function Score({ score }: { score?: number }) {
function Content (line 444) | function Content({
function Meta (line 458) | function Meta({ children }: PropsWithChildren<unknown>) {
function RateDescription (line 468) | function RateDescription({
function ReviewDayInfo (line 480) | function ReviewDayInfo({ visitDate }: { visitDate: Date }) {
FILE: packages/tds-widget/src/review/components/review-element/media/compare-media.ts
function compareMedia (line 3) | function compareMedia(a: ImageMeta, b: ImageMeta) {
FILE: packages/tds-widget/src/review/components/review-element/media/image.tsx
type Props (line 5) | interface Props {
function Image (line 27) | function Image({ medium }: Props) {
FILE: packages/tds-widget/src/review/components/review-element/media/index.tsx
type Props (line 19) | interface Props {
constant HASH_IMAGE_VIEWER_POPUP (line 24) | const HASH_IMAGE_VIEWER_POPUP = 'popup.review-image-viewer'
function Media (line 26) | function Media({ media, reviewId }: Props) {
FILE: packages/tds-widget/src/review/components/review-element/media/media-wrapper.tsx
type Props (line 6) | interface Props {
function MediaWrapper (line 142) | function MediaWrapper({ length, children }: Props) {
FILE: packages/tds-widget/src/review/components/review-element/media/medium.tsx
type Props (line 6) | interface Props {
function Medium (line 10) | function Medium({ medium }: Props) {
FILE: packages/tds-widget/src/review/components/review-element/media/video.tsx
type Props (line 8) | interface Props {
constant PLAY_BUTTON_IMAGE_URL (line 37) | const PLAY_BUTTON_IMAGE_URL =
function Video (line 59) | function Video({ medium }: Props) {
FILE: packages/tds-widget/src/review/components/review-element/pinned-message.tsx
type PinnedMessageProps (line 8) | interface PinnedMessageProps {
function PinnedMessage (line 13) | function PinnedMessage({
FILE: packages/tds-widget/src/review/components/review-element/purchaseInfo.tsx
function PurchaseInfo (line 26) | function PurchaseInfo({
FILE: packages/tds-widget/src/review/components/review-element/user.tsx
constant DEFAULT_USER_PROFILE_IMAGE (line 26) | const DEFAULT_USER_PROFILE_IMAGE =
function User (line 29) | function User({
function Name (line 70) | function Name({
FILE: packages/tds-widget/src/review/components/review-placeholder-with-rating.tsx
type ReviewsPlaceholderProps (line 42) | interface ReviewsPlaceholderProps {
constant OPTION_LABELS (line 55) | const OPTION_LABELS = {
function ReviewsPlaceholder (line 62) | function ReviewsPlaceholder({
function DefaultPlaceholder (line 173) | function DefaultPlaceholder({
function FilterPlaceholder (line 193) | function FilterPlaceholder({
FILE: packages/tds-widget/src/review/components/reviews-shorten.tsx
constant REVIEWS_SECTION_ID (line 21) | const REVIEWS_SECTION_ID = 'reviews'
type ResourceType (line 23) | type ResourceType = 'article' | 'attraction' | 'restaurant' | 'hotel' | ...
type ReviewsShortenProps (line 24) | interface ReviewsShortenProps {
function ReviewsShorten (line 51) | function ReviewsShorten({
constant REVIEW_SHORTEN_LIST_TYPES (line 89) | const REVIEW_SHORTEN_LIST_TYPES = {
function ReviewsShortenComponent (line 96) | function ReviewsShortenComponent({
FILE: packages/tds-widget/src/review/components/reviews.tsx
constant REVIEWS_SECTION_ID (line 24) | const REVIEWS_SECTION_ID = 'reviews'
type ReviewsProps (line 39) | interface ReviewsProps {
function Reviews (line 52) | function Reviews({
constant REVIEW_INFINITY_LIST_TYPES (line 89) | const REVIEW_INFINITY_LIST_TYPES = {
function ReviewsComponent (line 96) | function ReviewsComponent({
FILE: packages/tds-widget/src/review/components/shorten-list/latest-reviews.tsx
function LatestReviews (line 7) | function LatestReviews({
FILE: packages/tds-widget/src/review/components/shorten-list/popular-reviews.tsx
function PopularReviews (line 7) | function PopularReviews({
FILE: packages/tds-widget/src/review/components/shorten-list/rating-reviews.tsx
function RatingReviews (line 7) | function RatingReviews({
FILE: packages/tds-widget/src/review/components/shorten-list/reviews-list.tsx
type Props (line 15) | interface Props {
function ReviewsList (line 29) | function ReviewsList({
FILE: packages/tds-widget/src/review/components/shorten-list/services.ts
function usePopularReviews (line 15) | function usePopularReviews(
function useLatestReviews (line 34) | function useLatestReviews(
function useRatingReviews (line 53) | function useRatingReviews(
FILE: packages/tds-widget/src/review/components/shorten-list/types.ts
type ShortenReview (line 1) | interface ShortenReview {
type ExtendShortenReview (line 11) | type ExtendShortenReview = ShortenReview & {
type ShortenReviewValue (line 15) | type ShortenReviewValue = ShortenReview | ExtendShortenReview
FILE: packages/tds-widget/src/review/components/sorting-context.tsx
type SortingOption (line 18) | type SortingOption =
type SortingType (line 24) | type SortingType = 'default' | 'poi'
constant EVENT_TYPE (line 26) | const EVENT_TYPE = 'reviews-web/sorting-option-change'
type SortingOptionsProps (line 28) | interface SortingOptionsProps {
type SortingOptionsValues (line 35) | interface SortingOptionsValues {
constant OPTION_LABELS (line 45) | const OPTION_LABELS = {
function SortingOptionsProvider (line 52) | function SortingOptionsProvider({
function useReviewSortingOptions (line 154) | function useReviewSortingOptions() {
FILE: packages/tds-widget/src/review/components/sorting-options-action-sheet.tsx
constant HASH_SORTING_OPTIONS_ACTION_SHEET (line 7) | const HASH_SORTING_OPTIONS_ACTION_SHEET =
function SortingOptionsActionSheet (line 10) | function SortingOptionsActionSheet() {
FILE: packages/tds-widget/src/review/components/sorting-options.tsx
function SortingOptions (line 25) | function SortingOptions() {
FILE: packages/tds-widget/src/review/components/types.tsx
type AppNativeActionProps (line 1) | interface AppNativeActionProps {
FILE: packages/tds-widget/src/review/components/write-button.tsx
type Props (line 17) | interface Props {
FILE: packages/tds-widget/src/review/constants.ts
constant DEFAULT_REVIEWS_COUNT_PER_PAGE (line 1) | const DEFAULT_REVIEWS_COUNT_PER_PAGE = 20
constant SHORTENED_REVIEWS_COUNT_PER_PAGE (line 2) | const SHORTENED_REVIEWS_COUNT_PER_PAGE = 4
FILE: packages/tds-widget/src/review/data/graphql/client.ts
function reviewClient (line 18) | async function reviewClient<T>(query: () => Promise<T>) {
FILE: packages/tds-widget/src/review/data/graphql/generated.ts
type Maybe (line 2) | type Maybe<T> = T | null;
type InputMaybe (line 3) | type InputMaybe<T> = Maybe<T>;
type Exact (line 4) | type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K...
type MakeOptional (line 5) | type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?:...
type MakeMaybe (line 6) | type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: May...
type MakeEmpty (line 7) | type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> ...
type Incremental (line 8) | type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' ...
type Scalars (line 10) | type Scalars = {
type Article (line 20) | type Article = {
type ArticleMetadata (line 37) | type ArticleMetadata = {
type ArticleSeoMetadata (line 59) | type ArticleSeoMetadata = {
type ArticleServiceMetadata (line 65) | type ArticleServiceMetadata = {
type ArticleSource (line 72) | type ArticleSource = {
type City (line 79) | type City = {
type Content (line 89) | type Content = {
type CoordinatesArg (line 101) | type CoordinatesArg = {
type Country (line 106) | type Country = {
type CustomPoi (line 112) | type CustomPoi = {
type CustomPoiAddress (line 121) | type CustomPoiAddress = {
type CustomPoiGeoLocation (line 128) | type CustomPoiGeoLocation = {
type CustomPoiNames (line 134) | type CustomPoiNames = {
type CustomPoiSource (line 141) | type CustomPoiSource = {
type Destination (line 149) | type Destination = Region | Zone;
type FeaturedDestinationsList (line 151) | type FeaturedDestinationsList = {
type FeaturedDestinationsListSource (line 159) | type FeaturedDestinationsListSource = {
type Festa (line 164) | type Festa = {
type FestaAddress (line 192) | type FestaAddress = {
type FestaContent (line 201) | type FestaContent = {
type FestaDuration (line 208) | type FestaDuration = {
type FestaGeoPoint (line 215) | type FestaGeoPoint = {
type FestaGeotag (line 221) | type FestaGeotag = {
type FestaImage (line 228) | type FestaImage = {
type FestaLink (line 246) | type FestaLink = {
type FestaList (line 257) | type FestaList = {
type FestaPagination (line 263) | type FestaPagination = {
type FestaPricing (line 269) | type FestaPricing = {
type FestaScheduleItem (line 275) | type FestaScheduleItem = {
type FestaSize (line 283) | type FestaSize = {
type FestaSizes (line 288) | type FestaSizes = {
type FestaTranslatedNames (line 295) | type FestaTranslatedNames = {
type ForeignEntity (line 303) | type ForeignEntity = {
type GeoMetadata (line 310) | type GeoMetadata = {
type Geotag (line 318) | type Geotag = {
type GeotagInput (line 326) | type GeotagInput = {
type GeotagSource (line 331) | type GeotagSource = {
type GetFestaArgs (line 354) | type GetFestaArgs = {
type GetFestasArgs (line 359) | type GetFestasArgs = {
type GetFestasByScheduleArgs (line 379) | type GetFestasByScheduleArgs = {
type Message (line 384) | type Message = {
type MessageInput (line 396) | type MessageInput = {
type MessageOrderType (line 402) | enum MessageOrderType {
type MessagePayload (line 407) | type MessagePayload = {
type MessagePayloadInput (line 414) | type MessagePayloadInput = {
type MessagePayloadType (line 420) | enum MessagePayloadType {
type Metadata (line 425) | type Metadata = {
type Mutation (line 435) | type Mutation = {
type MutationCreatePurchaseTokenArgs (line 451) | type MutationCreatePurchaseTokenArgs = {
type MutationCreateReviewArgs (line 456) | type MutationCreateReviewArgs = {
type MutationDeleteMessageArgs (line 461) | type MutationDeleteMessageArgs = {
type MutationDeleteRecommendationImageArgs (line 466) | type MutationDeleteRecommendationImageArgs = {
type MutationDeleteReviewArgs (line 472) | type MutationDeleteReviewArgs = {
type MutationEditReviewArgs (line 477) | type MutationEditReviewArgs = {
type MutationLikeReviewArgs (line 483) | type MutationLikeReviewArgs = {
type MutationReportReviewArgs (line 488) | type MutationReportReviewArgs = {
type MutationSendMessageArgs (line 494) | type MutationSendMessageArgs = {
type MutationUnlikeReviewArgs (line 499) | type MutationUnlikeReviewArgs = {
type MutationUploadRecommendationImageArgs (line 504) | type MutationUploadRecommendationImageArgs = {
type Names (line 510) | type Names = {
type Poi (line 518) | type Poi = {
type PoiSeoMetadata (line 544) | type PoiSeoMetadata = {
type PoiServiceMetadata (line 550) | type PoiServiceMetadata = {
type PoiSource (line 557) | type PoiSource = {
type PricingType (line 606) | enum PricingType {
type PurchaseTokenInput (line 612) | type PurchaseTokenInput = {
type Query (line 621) | type Query = {
type QueryGetAnnouncementsArgs (line 693) | type QueryGetAnnouncementsArgs = {
type QueryGetArticleArgs (line 700) | type QueryGetArticleArgs = {
type QueryGetCountryArgs (line 705) | type QueryGetCountryArgs = {
type QueryGetFeaturedDestinationsListArgs (line 710) | type QueryGetFeaturedDestinationsListArgs = {
type QueryGetFestaArgs (line 715) | type QueryGetFestaArgs = {
type QueryGetFestasArgs (line 720) | type QueryGetFestasArgs = {
type QueryGetFestasByScheduleArgs (line 725) | type QueryGetFestasByScheduleArgs = {
type QueryGetGeotagArgs (line 730) | type QueryGetGeotagArgs = {
type QueryGetGeotagsArgs (line 735) | type QueryGetGeotagsArgs = {
type QueryGetGuidesArgs (line 742) | type QueryGetGuidesArgs = {
type QueryGetLatestReviewsArgs (line 750) | type QueryGetLatestReviewsArgs = {
type QueryGetMessageArgs (line 760) | type QueryGetMessageArgs = {
type QueryGetMessagesArgs (line 765) | type QueryGetMessagesArgs = {
type QueryGetMyReviewArgs (line 775) | type QueryGetMyReviewArgs = {
type QueryGetMyReviewsByResourceIdArgs (line 781) | type QueryGetMyReviewsByResourceIdArgs = {
type QueryGetMyReviewsListArgs (line 788) | type QueryGetMyReviewsListArgs = {
type QueryGetNewslettersArgs (line 794) | type QueryGetNewslettersArgs = {
type QueryGetNextNewsletterArgs (line 800) | type QueryGetNextNewsletterArgs = {
type QueryGetPoiArgs (line 805) | type QueryGetPoiArgs = {
type QueryGetPoisArgs (line 810) | type QueryGetPoisArgs = {
type QueryGetPopularReviewsArgs (line 822) | type QueryGetPopularReviewsArgs = {
type QueryGetPostsArgs (line 832) | type QueryGetPostsArgs = {
type QueryGetPrevNewsletterArgs (line 840) | type QueryGetPrevNewsletterArgs = {
type QueryGetRegionArgs (line 845) | type QueryGetRegionArgs = {
type QueryGetRegionCategoryArgs (line 850) | type QueryGetRegionCategoryArgs = {
type QueryGetRegionsByIdsArgs (line 855) | type QueryGetRegionsByIdsArgs = {
type QueryGetReviewResourceBoardArgs (line 860) | type QueryGetReviewResourceBoardArgs = {
type QueryGetReviewResourceBoardsByResourceIdsArgs (line 865) | type QueryGetReviewResourceBoardsByResourceIdsArgs = {
type QueryGetReviewSpecificationArgs (line 870) | type QueryGetReviewSpecificationArgs = {
type QueryGetReviewsByRatingArgs (line 876) | type QueryGetReviewsByRatingArgs = {
type QueryGetReviewsByResourceIdsArgs (line 887) | type QueryGetReviewsByResourceIdsArgs = {
type QueryGetReviewsCountArgs (line 896) | type QueryGetReviewsCountArgs = {
type QueryGetRoomArgs (line 904) | type QueryGetRoomArgs = {
type QueryGetScrapsArgs (line 909) | type QueryGetScrapsArgs = {
type QueryGetTripByTripCodeArgs (line 919) | type QueryGetTripByTripCodeArgs = {
type QueryGetTripPlansArgs (line 924) | type QueryGetTripPlansArgs = {
type QueryGetTripPlansByTripCodeArgs (line 929) | type QueryGetTripPlansByTripCodeArgs = {
type QueryGetZoneArgs (line 934) | type QueryGetZoneArgs = {
type QueryIsJoinedTripArgs (line 939) | type QueryIsJoinedTripArgs = {
type QueryMgetArticleSeoMetadataArgs (line 944) | type QueryMgetArticleSeoMetadataArgs = {
type QueryMgetArticleServiceMetadataArgs (line 949) | type QueryMgetArticleServiceMetadataArgs = {
type QueryMgetArticlesArgs (line 954) | type QueryMgetArticlesArgs = {
type QueryMgetCountriesArgs (line 960) | type QueryMgetCountriesArgs = {
type QueryMgetGeotagsArgs (line 965) | type QueryMgetGeotagsArgs = {
type QueryMgetMessagesArgs (line 970) | type QueryMgetMessagesArgs = {
type QueryMgetPoiServiceMetadataArgs (line 975) | type QueryMgetPoiServiceMetadataArgs = {
type QueryMgetPoisArgs (line 980) | type QueryMgetPoisArgs = {
type QueryMgetRegionCategoriesArgs (line 985) | type QueryMgetRegionCategoriesArgs = {
type QueryMgetRegionsArgs (line 990) | type QueryMgetRegionsArgs = {
type QueryMgetReplyBoardsArgs (line 995) | type QueryMgetReplyBoardsArgs = {
type QueryMgetReviewArticleServiceMetadataArgs (line 1000) | type QueryMgetReviewArticleServiceMetadataArgs = {
type QueryMgetReviewPoiServiceMetadataArgs (line 1005) | type QueryMgetReviewPoiServiceMetadataArgs = {
type QueryMgetReviewedArticlesArgs (line 1010) | type QueryMgetReviewedArticlesArgs = {
type QueryMgetReviewedPoisArgs (line 1015) | type QueryMgetReviewedPoisArgs = {
type QueryMgetReviewsArgs (line 1020) | type QueryMgetReviewsArgs = {
type QueryMgetRoomsArgs (line 1025) | type QueryMgetRoomsArgs = {
type QueryMgetScrapArticleServiceMetadataArgs (line 1030) | type QueryMgetScrapArticleServiceMetadataArgs = {
type QueryMgetScrapPoiServiceMetadataArgs (line 1035) | type QueryMgetScrapPoiServiceMetadataArgs = {
type QueryMgetScrapedArticlesArgs (line 1040) | type QueryMgetScrapedArticlesArgs = {
type QueryMgetScrapedFestasArgs (line 1045) | type QueryMgetScrapedFestasArgs = {
type QueryMgetScrapedPoisArgs (line 1050) | type QueryMgetScrapedPoisArgs = {
type QueryMgetScrapedTnaArgs (line 1055) | type QueryMgetScrapedTnaArgs = {
type QueryMgetUsersByFbIdsArgs (line 1060) | type QueryMgetUsersByFbIdsArgs = {
type QueryMgetZonesArgs (line 1065) | type QueryMgetZonesArgs = {
type QuerySearchCitiesArgs (line 1070) | type QuerySearchCitiesArgs = {
type Region (line 1076) | type Region = {
type RegionCategory (line 1091) | type RegionCategory = {
type RegionCategoryRegionsArgs (line 1102) | type RegionCategoryRegionsArgs = {
type RegionSource (line 1107) | type RegionSource = {
type RelatedGeotag (line 1141) | type RelatedGeotag = {
type ReplyBoard (line 1148) | type ReplyBoard = {
type ReplyMessage (line 1159) | type ReplyMessage = {
type ReplyMessageContent (line 1170) | type ReplyMessageContent = {
type ReplyUser (line 1177) | type ReplyUser = {
type ReportReviewInput (line 1184) | type ReportReviewInput = {
type Review (line 1190) | type Review = {
type ReviewByResourceIdsSortByInput (line 1215) | type ReviewByResourceIdsSortByInput = {
type ReviewCommentSpecification (line 1220) | type ReviewCommentSpecification = {
type ReviewCreateInput (line 1227) | type ReviewCreateInput = {
type ReviewMediaSpecification (line 1239) | type ReviewMediaSpecification = {
type ReviewMetadata (line 1245) | type ReviewMetadata = {
type ReviewMetadataDetail (line 1252) | type ReviewMetadataDetail = {
type ReviewPurchaseInfo (line 1259) | type ReviewPurchaseInfo = {
type ReviewPurchaseToken (line 1267) | type ReviewPurchaseToken = {
type ReviewRatingSpecification (line 1279) | type ReviewRatingSpecification = {
type ReviewReaction (line 1285) | type ReviewReaction = {
type ReviewReportType (line 1295) | enum ReviewReportType {
type ReviewResourceBoard (line 1308) | type ReviewResourceBoard = {
type ReviewResourceType (line 1318) | enum ReviewResourceType {
type ReviewSpecification (line 1328) | type ReviewSpecification = {
type ReviewUpdateInput (line 1335) | type ReviewUpdateInput = {
type ReviewUserBoard (line 1342) | type ReviewUserBoard = {
type Room (line 1349) | type Room = {
type RoomGeotag (line 1358) | type RoomGeotag = {
type Scrap (line 1365) | type Scrap = {
type ScrapContentType (line 1374) | enum ScrapContentType {
type ScrapMetadata (line 1382) | type ScrapMetadata = {
type ScrapMetadataDetail (line 1389) | type ScrapMetadataDetail = {
type ServiceOrigin (line 1394) | enum ServiceOrigin {
type SortByRatingsInput (line 1400) | type SortByRatingsInput = {
type SortDirection (line 1404) | enum SortDirection {
type Span (line 1409) | type Span = {
type StructuredAddress (line 1415) | type StructuredAddress = {
type TnaProduct (line 1424) | type TnaProduct = {
type TranslatedComment (line 1430) | type TranslatedComment = {
type TravelingUsers (line 1438) | type TravelingUsers = {
type Trip (line 1444) | type Trip = {
type TripCompanion (line 1461) | type TripCompanion = {
type TripFlightInformation (line 1467) | type TripFlightInformation = {
type TripFlightSchedule (line 1476) | type TripFlightSchedule = {
type TripFlightScheduleAirline (line 1493) | type TripFlightScheduleAirline = {
type TripFlightScheduleAirport (line 1501) | type TripFlightScheduleAirport = {
type TripFlightScheduleAttachment (line 1513) | type TripFlightScheduleAttachment = {
type TripGeotag (line 1526) | type TripGeotag = {
type TripGeotagMedia (line 1532) | type TripGeotagMedia = {
type TripGeotagStyle (line 1540) | type TripGeotagStyle = {
type TripGeotagStyleName (line 1548) | type TripGeotagStyleName = {
type TripLodgingBookingInfo (line 1555) | type TripLodgingBookingInfo = {
type TripMediaImgUrl (line 1562) | type TripMediaImgUrl = {
type TripMediaSize (line 1567) | type TripMediaSize = {
type TripMediaSource (line 1574) | type TripMediaSource = {
type TripPlan (line 1587) | type TripPlan = {
type TripPlanImage (line 1603) | type TripPlanImage = {
type TripShare (line 1616) | type TripShare = {
type TripTnaArea (line 1625) | type TripTnaArea = {
type TripTnaCategory (line 1632) | type TripTnaCategory = {
type TripTnaGeotag (line 1638) | type TripTnaGeotag = {
type TripTnaLocation (line 1645) | type TripTnaLocation = {
type TripTnaProduct (line 1655) | type TripTnaProduct = {
type TripTnaPromotion (line 1677) | type TripTnaPromotion = {
type User (line 1685) | type User = {
type UserBoard (line 1697) | type UserBoard = {
type UserMileage (line 1707) | type UserMileage = {
type UserMileageBadge (line 1714) | type UserMileageBadge = {
type UserMileageIcon (line 1720) | type UserMileageIcon = {
type Zone (line 1725) | type Zone = {
type ZoneSource (line 1735) | type ZoneSource = {
type LikeReviewMutationVariables (line 1763) | type LikeReviewMutationVariables = Exact<{
type LikeReviewMutation (line 1768) | type LikeReviewMutation = { __typename?: 'Mutation', likeReview: { __typ...
type UnlikeReviewMutationVariables (line 1770) | type UnlikeReviewMutationVariables = Exact<{
type UnlikeReviewMutation (line 1775) | type UnlikeReviewMutation = { __typename?: 'Mutation', unlikeReview: boo...
type DeleteReviewMutationVariables (line 1777) | type DeleteReviewMutationVariables = Exact<{
type DeleteReviewMutation (line 1782) | type DeleteReviewMutation = { __typename?: 'Mutation', deleteReview: boo...
type BaseReviewFragment (line 1784) | type BaseReviewFragment = { __typename?: 'Review', id: string, resourceI...
type BaseUserFragment (line 1786) | type BaseUserFragment = { __typename?: 'User', unregister?: boolean | nu...
type BasePinnedMessageFragment (line 1788) | type BasePinnedMessageFragment = { __typename?: 'ReplyMessage', createdA...
type BaseReviewSpecificationFragment (line 1790) | type BaseReviewSpecificationFragment = { __typename?: 'ReviewSpecificati...
type GetPopularReviewsQueryVariables (line 1792) | type GetPopularReviewsQueryVariables = Exact<{
type GetPopularReviewsQuery (line 1802) | type GetPopularReviewsQuery = { __typename?: 'Query', popularReviews: Ar...
type GetLatestReviewsQueryVariables (line 1804) | type GetLatestReviewsQueryVariables = Exact<{
type GetLatestReviewsQuery (line 1814) | type GetLatestReviewsQuery = { __typename?: 'Query', latestReviews: Arra...
type GetReviewsByRatingQueryVariables (line 1816) | type GetReviewsByRatingQueryVariables = Exact<{
type GetReviewsByRatingQuery (line 1827) | type GetReviewsByRatingQuery = { __typename?: 'Query', ratingReviews: Ar...
type GetMyReviewQueryVariables (line 1829) | type GetMyReviewQueryVariables = Exact<{
type GetMyReviewQuery (line 1835) | type GetMyReviewQuery = { __typename?: 'Query', myReview?: { __typename?...
type GetReviewSpecificationQueryVariables (line 1837) | type GetReviewSpecificationQueryVariables = Exact<{
type GetReviewSpecificationQuery (line 1843) | type GetReviewSpecificationQuery = { __typename?: 'Query', reviewsSpecif...
type GetReviewsCountQueryVariables (line 1845) | type GetReviewsCountQueryVariables = Exact<{
type GetReviewsCountQuery (line 1853) | type GetReviewsCountQuery = { __typename?: 'Query', reviewsCount: number };
type Requester (line 1868) | type Requester<C = {}, E = unknown> = <R, V>(doc: DocumentNode, vars?: V...
function getSdk (line 1869) | function getSdk<C, E>(requester: Requester<C, E>) {
type Sdk (line 1900) | type Sdk = ReturnType<typeof getSdk>;
FILE: packages/tds-widget/src/review/services/use-client-actions.tsx
function useClientActions (line 10) | function useClientActions() {
FILE: packages/tds-widget/src/review/services/use-reviews.ts
function useReviewCount (line 32) | function useReviewCount(
function useDescriptions (line 49) | function useDescriptions(
function useMyReview (line 59) | function useMyReview(
function useLikeReviewMutation (line 69) | function useLikeReviewMutation(): UseMutationResult<
function useUnlikeReviewMutation (line 176) | function useUnlikeReviewMutation(): UseMutationResult<
function useDeleteReviewMutation (line 282) | function useDeleteReviewMutation() {
FILE: packages/tds-widget/src/review/utils.ts
function writeReview (line 3) | function writeReview({
FILE: packages/tds-widget/src/scrap-button/hooks.ts
function useScrapButton (line 5) | function useScrapButton({
FILE: packages/tds-widget/src/scrap-button/outline-scrap-button.tsx
constant OUTLINE_HEART_ON (line 9) | const OUTLINE_HEART_ON =
constant OUTLINE_HEART_OFF (line 11) | const OUTLINE_HEART_OFF =
function OutlineScrapButton (line 24) | function OutlineScrapButton({
function OutlineHeart (line 44) | function OutlineHeart({ pressed, size }: ScrapIconProps) {
function composedHocs (line 55) | function composedHocs<P>(Component: ComponentType<P & Attributes>) {
FILE: packages/tds-widget/src/scrap-button/overlay-scrap-button.tsx
constant OVERLAY_HEART_ON (line 9) | const OVERLAY_HEART_ON =
constant OVERLAY_HEART_OFF (line 11) | const OVERLAY_HEART_OFF =
function OverlayScrapButton (line 24) | function OverlayScrapButton({
function OverlayHeart (line 44) | function OverlayHeart({ pressed, size }: ScrapIconProps) {
function composedHocs (line 55) | function composedHocs<P>(Component: ComponentType<P & Attributes>) {
FILE: packages/tds-widget/src/scrap-button/scrap-button-mask.tsx
function ScrapButtonMask (line 11) | function ScrapButtonMask({
function withMask (line 18) | function withMask<P extends Attributes>(Component: ComponentType<P>) {
FILE: packages/tds-widget/src/scrap-button/types.ts
type ScrapableResource (line 3) | interface ScrapableResource {
type ScrapIconProps (line 9) | interface ScrapIconProps {
type ScrapButtonProps (line 14) | interface ScrapButtonProps {
FILE: packages/tds-widget/src/scrap-button/utils.ts
function createIsolatedClickHandler (line 8) | function createIsolatedClickHandler(
FILE: packages/tds-widget/src/scrap/constants.ts
constant START_SCRAPE (line 1) | const START_SCRAPE = 'START_SCRAPE'
constant SCRAPE (line 2) | const SCRAPE = 'SCRAPE'
constant SCRAPE_FAILED (line 3) | const SCRAPE_FAILED = 'SCRAPE_FAILED'
constant START_UNSCRAPE (line 4) | const START_UNSCRAPE = 'START_UNSCRAPE'
constant UNSCRAPE (line 5) | const UNSCRAPE = 'UNSCRAPE'
constant UNSCRAPE_FAILED (line 6) | const UNSCRAPE_FAILED = 'UNSCRAPE_FAILED'
FILE: packages/tds-widget/src/scrap/provider.tsx
type ScrapsProviderProps (line 12) | interface ScrapsProviderProps {
function ScrapsProvider (line 22) | function ScrapsProvider({
FILE: packages/tds-widget/src/scrap/reducer.ts
type ActionType (line 11) | type ActionType =
FILE: packages/tds-widget/src/scrap/services.ts
function mapTypes (line 5) | function mapTypes(type: unknown) {
type ScrapSuccessResponse (line 16) | interface ScrapSuccessResponse {
type ScrapFailResponse (line 20) | interface ScrapFailResponse {
function fetchScrape (line 24) | function fetchScrape({ id, type }: Target) {
function fetchUnscrape (line 30) | function fetchUnscrape({ id, type }: Target) {
FILE: packages/tds-widget/src/scrap/types.ts
type Scraps (line 3) | interface Scraps {
type Target (line 7) | interface Target {
FILE: packages/tds-widget/src/scrap/use-scrap.ts
function useScrap (line 24) | function useScrap(param?: { scrapableInApp?: boolean }) {
FILE: packages/tds-widget/src/search/search.tsx
constant KEY_CODE_ENTER (line 34) | const KEY_CODE_ENTER = 13
function FullScreenSearchView (line 39) | function FullScreenSearchView({
FILE: packages/tds-widget/src/social-reviews/external-links.tsx
type ExternalLink (line 19) | interface ExternalLink<Data> {
type ExternalLinksProps (line 27) | type ExternalLinksProps<Data> = {
function ExternalLinkItem (line 33) | function ExternalLinkItem<Data>({
function ExternalLinks (line 96) | function ExternalLinks<Data>({
FILE: packages/tds-widget/src/social-reviews/social-review.tsx
type SocialReview (line 7) | interface SocialReview {
type SocialReviewsProps (line 14) | type SocialReviewsProps = {
function SocialReviews (line 19) | function SocialReviews({
FILE: packages/tds-widget/src/static-map/static-map.tsx
type PoiType (line 13) | type PoiType = 'attraction' | 'restaurant' | 'hotel'
type ResponsiveVariant (line 14) | interface ResponsiveVariant {
constant MARKER_SOURCES (line 76) | const MARKER_SOURCES: { [key: string]: string } = {
function StaticMap (line 83) | function StaticMap({
FILE: packages/tds-widget/src/user-verification/confirmation-services.ts
function confirmVerification (line 3) | function confirmVerification(type: string): Promise<{
function confirmSmsVerification (line 20) | async function confirmSmsVerification() {
function confirmPersonalIdVerificationWithResidence (line 37) | async function confirmPersonalIdVerificationWithResidence() {
function confirmPersonalIdVerification (line 54) | async function confirmPersonalIdVerification() {
function confirmExternalPromotionEligibility (line 71) | async function confirmExternalPromotionEligibility(type: string) {
FILE: packages/tds-widget/src/user-verification/types.ts
type VerificationType (line 4) | type VerificationType = string
FILE: packages/tds-widget/src/user-verification/use-user-verification.test.ts
function prepareTest (line 20) | async function prepareTest({
function mockExternalRouterHook (line 104) | function mockExternalRouterHook() {
FILE: packages/tds-widget/src/user-verification/use-user-verification.ts
type VerificationState (line 8) | interface VerificationState {
function useUserVerification (line 24) | function useUserVerification({
constant PREDEFINED_TARGET_PAGE_PATHS (line 105) | const PREDEFINED_TARGET_PAGE_PATHS: Record<string, string> = {
function getVerificationPagePath (line 111) | function getVerificationPagePath({
FILE: packages/tds-widget/src/user-verification/verification-request.tsx
function VerificationRequest (line 11) | function VerificationRequest({
function Icon (line 71) | function Icon() {
FILE: packages/tds-widget/src/user-verification/verified-message.spec.tsx
method get (line 54) | get() {
FILE: packages/tds-widget/src/user-verification/verified-message.ts
type VerifiedMessage (line 8) | interface VerifiedMessage {
function useSendVerifiedMessage (line 13) | function useSendVerifiedMessage() {
function useVerifiedMessageListener (line 40) | function useVerifiedMessageListener(
FILE: packages/triple-document/src/elements/anchor.tsx
function Anchor (line 7) | function Anchor({
FILE: packages/triple-document/src/elements/animation.tsx
function Animation (line 3) | function Animation({ value }: { value: TripleHeaderProps }) {
FILE: packages/triple-document/src/elements/coupon/coupon-download-buttons.tsx
type CouponErrorCode (line 21) | type CouponErrorCode =
constant MAX_COUPONS_PER_USER_ERROR_CODE (line 34) | const MAX_COUPONS_PER_USER_ERROR_CODE = 'MAX_COUPONS_PER_USER'
constant DEFAULT_BUTTON_COLOR (line 36) | const DEFAULT_BUTTON_COLOR = {
function useDownloadTimePassed (line 41) | function useDownloadTimePassed(time: string | undefined) {
function downloadCoupon (line 55) | async function downloadCoupon(slugId: string) {
function CouponDownloadButton (line 93) | function CouponDownloadButton({
function downloadCoupons (line 203) | async function downloadCoupons(coupons: CouponData[]) {
function CouponGroupDownloadButton (line 258) | function CouponGroupDownloadButton({
FILE: packages/triple-document/src/elements/coupon/index.tsx
constant DEFAULT_COLOR (line 16) | const DEFAULT_COLOR = {
function Coupon (line 22) | function Coupon({
FILE: packages/triple-document/src/elements/coupon/modals.tsx
type HashKeyValue (line 6) | interface HashKeyValue {
constant HASH_COMPLETE_DOWNLOAD_COUPON (line 10) | const HASH_COMPLETE_DOWNLOAD_COUPON = 'coupon.download-complete.modal'
constant HASH_COMPLETE_DOWNLOAD_COUPON_GROUP (line 11) | const HASH_COMPLETE_DOWNLOAD_COUPON_GROUP =
constant HASH_COMPLETE_DOWNLOAD_PART_OF_COUPON_GROUP (line 13) | const HASH_COMPLETE_DOWNLOAD_PART_OF_COUPON_GROUP =
constant HASH_ALREADY_DOWNLOAD_COUPON (line 15) | const HASH_ALREADY_DOWNLOAD_COUPON = 'coupon.download-already.modal'
constant HASH_ERROR_COUPON (line 16) | const HASH_ERROR_COUPON = 'coupon.error.modal'
constant MODAL_HASHES (line 18) | const MODAL_HASHES = [
constant ICON_TYPES (line 25) | const ICON_TYPES: HashKeyValue = {
function CouponModal (line 41) | function CouponModal({ identifier }: { identifier: string }) {
function CouponAlertModal (line 137) | function CouponAlertModal({
FILE: packages/triple-document/src/elements/coupon/utils.ts
function safeParseHexColor (line 4) | function safeParseHexColor(color?: string) {
FILE: packages/triple-document/src/elements/embedded.tsx
function Compact (line 17) | function Compact<P extends { compact?: boolean }>(Component: ComponentTy...
function EmbeddedImage (line 23) | function EmbeddedImage({
constant EMBEDDED_ELEMENTS (line 61) | const EMBEDDED_ELEMENTS: ElementSet = {
function Embedded (line 69) | function Embedded({
FILE: packages/triple-document/src/elements/external-video.tsx
function ExternalVideo (line 20) | function ExternalVideo({
FILE: packages/triple-document/src/elements/images.tsx
function Images (line 18) | function Images({
FILE: packages/triple-document/src/elements/index.ts
constant ELEMENTS (line 22) | const ELEMENTS: ElementSet = {
FILE: packages/triple-document/src/elements/itinerary.tsx
type Props (line 39) | interface Props {
function ItineraryElement (line 80) | function ItineraryElement({ value }: Props) {
function PoiCircleBadge (line 245) | function PoiCircleBadge(type: ItineraryElementType) {
function TransportationIcon (line 260) | function TransportationIcon(type?: TransportationType) {
FILE: packages/triple-document/src/elements/itinerary/icons.tsx
type IconDefaultProps (line 3) | interface IconDefaultProps {
type ImageIconProps (line 10) | interface ImageIconProps extends IconDefaultProps {
function ImageIcon (line 20) | function ImageIcon({
function Bus (line 30) | function Bus(props: IconDefaultProps) {
function Car (line 41) | function Car(props: IconDefaultProps) {
function Walk (line 52) | function Walk(props: IconDefaultProps) {
function Plane (line 63) | function Plane(props: IconDefaultProps) {
function Tram (line 74) | function Tram(props: IconDefaultProps) {
function Cable (line 85) | function Cable(props: IconDefaultProps) {
function Train (line 96) | function Train(props: IconDefaultProps) {
function Ship (line 107) | function Ship(props: IconDefaultProps) {
function Bike (line 118) | function Bike(props: IconDefaultProps) {
function Download (line 129) | function Download({
FILE: packages/triple-document/src/elements/itinerary/itinerary-map.tsx
type Props (line 19) | interface Props {
function ItineraryMap (line 28) | function ItineraryMap({ onClickMarker, items }: Props) {
function ItineraryTypeCircleMarker (line 83) | function ItineraryTypeCircleMarker(item: ItineraryItemType) {
FILE: packages/triple-document/src/elements/itinerary/poi-card.tsx
constant POI_IMAGE_PLACEHOLDERS_SMALL (line 35) | const POI_IMAGE_PLACEHOLDERS_SMALL: {
function PoiCard (line 43) | function PoiCard({
FILE: packages/triple-document/src/elements/itinerary/save-to-itinerary.tsx
type Geotag (line 10) | interface Geotag {
function SaveToItinerary (line 21) | function SaveToItinerary({
FILE: packages/triple-document/src/elements/itinerary/types.ts
type ItineraryElementType (line 3) | type ItineraryElementType = PoiItineraryItemType['poi']['type'] | 'festa'
FILE: packages/triple-document/src/elements/itinerary/use-computed-itineraries.ts
type Props (line 15) | interface Props {
type Course (line 20) | interface Course {
constant DEFAULT_TRANSPORTATION (line 48) | const DEFAULT_TRANSPORTATION = {
function useItinerary (line 56) | function useItinerary({ itinerary, guestMode }: Props) {
function extractRegionId (line 151) | function extractRegionId(items: ItineraryItemType[]) {
FILE: packages/triple-document/src/elements/itinerary/use-computed-map.ts
type MapItem (line 5) | interface MapItem {
type ItineraryMapData (line 10) | interface ItineraryMapData {
function getItemLatLng (line 16) | function getItemLatLng(item: ItineraryItemType): LatLngLiteral {
function extractItemCoordinates (line 30) | function extractItemCoordinates(items: ItineraryItemType[]) {
function useMapData (line 40) | function useMapData(
FILE: packages/triple-document/src/elements/itinerary/use-handle-add-pois-to-trip.ts
type Geotag (line 15) | interface Geotag {
function useHandleAddPoiToTrip (line 20) | function useHandleAddPoiToTrip({ geotag }: { geotag: Geotag }) {
function generateAddTripPlanQuery (line 45) | function generateAddTripPlanQuery({
FILE: packages/triple-document/src/elements/itinerary/use-safety-poi.ts
type SafetyPoi (line 5) | type SafetyPoi<T> = T & {
type UnSafetyTranslations (line 17) | type UnSafetyTranslations = Translations & { primary?: string }
function deriveNameFromTranslations (line 19) | function deriveNameFromTranslations({
type ImageSizeType (line 29) | type ImageSizeType = keyof ImageMeta['sizes']
function getImage (line 31) | function getImage(
function useSafetyPoi (line 65) | function useSafetyPoi<
FILE: packages/triple-document/src/elements/itinerary/with-type-circle-badge.tsx
type HocProps (line 20) | type HocProps = Omit<Parameters<typeof CircleBadge>[0], 'color'>
function withTypeCircleBadge (line 22) | function withTypeCircleBadge(type: ItineraryElementType) {
FILE: packages/triple-document/src/elements/links.tsx
function ButtonLink (line 58) | function ButtonLink({ children, ...props }: PropsWithChildren<ButtonProp...
function BlockLink (line 66) | function BlockLink({
constant IMAGE_PLACEHOLDER (line 91) | const IMAGE_PLACEHOLDER =
function ImageLink (line 94) | function ImageLink({
function getDefaultImageUrl (line 127) | function getDefaultImageUrl(image: ImageMeta | undefined) {
constant LINK_CONTAINERS (line 146) | const LINK_CONTAINERS = {
constant LINK_ELEMENTS (line 157) | const LINK_ELEMENTS = {
function Links (line 168) | function Links({
FILE: packages/triple-document/src/elements/list.tsx
constant BULLET_ICON_URLS (line 9) | const BULLET_ICON_URLS: { [key: string]: string } = {
type TextElementData (line 43) | type TextElementData = TripleElementData<
type LinksElementData (line 47) | type LinksElementData = TripleElementData<'links', { links: Link[] }>
function List (line 49) | function List({
FILE: packages/triple-document/src/elements/note.tsx
function Note (line 20) | function Note({
FILE: packages/triple-document/src/elements/pois.tsx
type ExtendedPoiListElementData (line 29) | type ExtendedPoiListElementData = PoiListElementType & {
type PoisDisplay (line 37) | type PoisDisplay = 'list' | string
function Pois (line 39) | function Pois<T extends ExtendedPoiListElementData>({
FILE: packages/triple-document/src/elements/regions.tsx
function Regions (line 11) | function Regions({
function RegionListElement (line 61) | function RegionListElement({
FILE: packages/triple-document/src/elements/shared/display-containers.tsx
function BlockContainer (line 11) | function BlockContainer({
function DocumentCarouselContainer (line 32) | function DocumentCarouselContainer({
constant IMAGES_CONTAINER_MAP (line 48) | const IMAGES_CONTAINER_MAP = {
constant ELEMENT_CONTAINER_MAP (line 56) | const ELEMENT_CONTAINER_MAP = {
FILE: packages/triple-document/src/elements/shared/document-carousel.tsx
function DocumentCarousel (line 4) | function DocumentCarousel({
FILE: packages/triple-document/src/elements/shared/generate-click-handler.ts
function generateClickHandler (line 3) | function generateClickHandler(
FILE: packages/triple-document/src/elements/shared/resource-list.tsx
function ResourceList (line 4) | function ResourceList({ children }: PropsWithChildren<unknown>) {
FILE: packages/triple-document/src/elements/sticky-tabs.tsx
function StickyTabs (line 17) | function StickyTabs({
FILE: packages/triple-document/src/elements/table.tsx
function Table (line 8) | function Table({
FILE: packages/triple-document/src/elements/text/headings.tsx
type HeadingProps (line 4) | interface HeadingProps {
constant MH1 (line 11) | const MH1 = tripleDocumentHeading(
constant MH2 (line 24) | const MH2 = tripleDocumentHeading(
constant MH3 (line 32) | const MH3 = tripleDocumentHeading(
constant MH4 (line 43) | const MH4 = tripleDocumentHeading(
function tripleDocumentHeading (line 51) | function tripleDocumentHeading<P extends object>(
FILE: packages/triple-document/src/elements/text/plain.tsx
function TextElement (line 34) | function TextElement({
FILE: packages/triple-document/src/elements/tna/index.tsx
function useProducts (line 8) | function useProducts({ slotId }: { slotId?: number }): TnaProductsRespon...
type TnaProductsListProps (line 38) | interface TnaProductsListProps {
function TnaProducts (line 44) | function TnaProducts({ value: { slotId } }: TnaProductsListProps) {
FILE: packages/triple-document/src/elements/tna/price-policy-coupon-info.tsx
function PricePolicyCouponInfo (line 9) | function PricePolicyCouponInfo({
FILE: packages/triple-document/src/elements/tna/product.tsx
constant PLACEHOLDER_IMAGE_URL (line 12) | const PLACEHOLDER_IMAGE_URL =
function Pricing (line 15) | function Pricing({
function TnaProductWithPrice (line 80) | function TnaProductWithPrice({
FILE: packages/triple-document/src/elements/tna/slot.tsx
function Slot (line 10) | function Slot({
FILE: packages/triple-document/src/elements/tna/types.ts
type Price (line 4) | type Price = string | number
type TnaProductsFetcher (line 6) | type TnaProductsFetcher = (slotId: number) => Promise<Response>
type TnaProductsClickHandler (line 8) | type TnaProductsClickHandler = (
type TnaProductsResponse (line 15) | interface TnaProductsResponse {
type DomesticArea (line 21) | interface DomesticArea {
type DiscountPolicy (line 28) | interface DiscountPolicy {
type TnaCoupon (line 34) | interface TnaCoupon {
type TnaProductData (line 45) | interface TnaProductData {
FILE: packages/triple-document/src/elements/tna/use-generate-coupon.ts
function useGenerateCoupon (line 6) | function useGenerateCoupon({
FILE: packages/triple-document/src/heading.stories.tsx
function Heading2Example (line 52) | function Heading2Example() {
function Heading3Example (line 57) | function Heading3Example() {
function Heading4Example (line 62) | function Heading4Example() {
FILE: packages/triple-document/src/hr.stories.tsx
function Hr1Example (line 9) | function Hr1Example() {
function Hr2Example (line 14) | function Hr2Example() {
function Hr3Example (line 19) | function Hr3Example() {
function Hr4Example (line 24) | function Hr4Example() {
function Hr5Example (line 29) | function Hr5Example() {
function Hr6Example (line 34) | function Hr6Example() {
FILE: packages/triple-document/src/links.stories.tsx
constant MOCK_IMAGE_LINKS_VALUE (line 5) | const MOCK_IMAGE_LINKS_VALUE = {
function Normal (line 49) | function Normal() {
function Emphasized (line 67) | function Emphasized() {
function EmphasizedTwo (line 83) | function EmphasizedTwo() {
function Extended (line 102) | function Extended() {
function ExtendedWithLevel (line 118) | function ExtendedWithLevel() {
function Image (line 139) | function Image() {
FILE: packages/triple-document/src/list.stories.tsx
constant DOT_LIST_MOCK_VALUE (line 5) | const DOT_LIST_MOCK_VALUE = {
constant CHECK_LIST_MOCK_VALUE (line 63) | const CHECK_LIST_MOCK_VALUE = {
function Dot (line 118) | function Dot() {
function Check (line 123) | function Check() {
FILE: packages/triple-document/src/pois.stories.tsx
function Normal (line 25) | function Normal() {
function NormalWithImagePlaceholder (line 38) | function NormalWithImagePlaceholder() {
function List (line 55) | function List() {
function ListWithImagePlaceholder (line 68) | function ListWithImagePlaceholder() {
function HotelListWithPrice (line 85) | function HotelListWithPrice() {
FILE: packages/triple-document/src/prop-context/deep-link.ts
function useDeepLink (line 7) | function useDeepLink() {
FILE: packages/triple-document/src/prop-context/guest-mode.ts
function useGuestMode (line 8) | function useGuestMode() {
FILE: packages/triple-document/src/prop-context/image-click-handler.ts
function useImageClickHandler (line 11) | function useImageClickHandler() {
FILE: packages/triple-document/src/prop-context/image-source.ts
function useImageSource (line 10) | function useImageSource() {
FILE: packages/triple-document/src/prop-context/link-click-handler.ts
function useLinkClickHandler (line 11) | function useLinkClickHandler() {
FILE: packages/triple-document/src/prop-context/media-config.tsx
type MediaConfig (line 3) | interface MediaConfig {
function MediaConfigProvider (line 11) | function MediaConfigProvider({
function useMediaConfig (line 22) | function useMediaConfig() {
FILE: packages/triple-document/src/prop-context/resource-click-handler.ts
type ResourceClickHandler (line 3) | type ResourceClickHandler = (
function useResourceClickHandler (line 17) | function useResourceClickHandler() {
FILE: packages/triple-document/src/tna-slot.stories.tsx
function InTripleDocument (line 25) | function InTripleDocument() {
FILE: packages/triple-document/src/triple-document.tsx
function TripleDocument (line 24) | function TripleDocument({
function composeResourceUrl (line 129) | function composeResourceUrl(resource: Parameters<ResourceClickHandler>[1...
FILE: packages/triple-document/src/types.ts
type RegionData (line 16) | interface RegionData {
type TripleElementData (line 29) | interface TripleElementData<T = string, Value = unknown> {
type ImageEventHandler (line 34) | type ImageEventHandler = (e: SyntheticEvent, image: ImageMeta) => void
type Link (line 36) | interface Link {
type LinkEventHandler (line 43) | type LinkEventHandler = (e: SyntheticEvent, link: Link) => void
type TripleDocumentContext (line 45) | type TripleDocumentContext = {
type ElementSet (line 56) | interface ElementSet {
type CouponData (line 61) | interface CouponData {
FILE: packages/triple-document/src/use-resource-event-tracker.ts
type Resource (line 4) | enum Resource {
function getObjectNamesProperty (line 11) | function getObjectNamesProperty(source: unknown) {
function useResourceEventTracker (line 27) | function useResourceEventTracker() {
FILE: packages/triple-email-document/src/common/box.ts
function addUnit (line 12) | function addUnit(value: string | number | undefined) {
FILE: packages/triple-email-document/src/common/fluid-table.tsx
function FluidTable (line 11) | function FluidTable({
FILE: packages/triple-email-document/src/common/handlebars-anchor.tsx
function HandlebarsAnchor (line 3) | function HandlebarsAnchor({
FILE: packages/triple-email-document/src/components/preview.tsx
type PreviewDocument (line 5) | interface PreviewDocument {
function EmailPreview (line 21) | function EmailPreview({
FILE: packages/triple-email-document/src/elements/dividers.tsx
type Divider1Document (line 5) | interface Divider1Document {
type Divider2Document (line 10) | interface Divider2Document {
type Divider3Document (line 15) | interface Divider3Document {
type Divider4Document (line 20) | interface Divider4Document {
type Divider5Document (line 25) | interface Divider5Document {
type Divider6Document (line 30) | interface Divider6Document {
function Divider1View (line 56) | function Divider1View() {
function Divider2View (line 70) | function Divider2View() {
function Divider3View (line 84) | function Divider3View() {
function Divider4View (line 98) | function Divider4View() {
function Divider5View (line 117) | function Divider5View() {
function Divider6View (line 136) | function Divider6View() {
FILE: packages/triple-email-document/src/elements/embedded.test.tsx
constant IMAGE (line 7) | const IMAGE = {
constant ENTRIES (line 25) | const ENTRIES = [
FILE: packages/triple-email-document/src/elements/embedded.tsx
type ElementSet (line 10) | interface ElementSet {
type EntriesElement (line 15) | type EntriesElement =
type EmbeddedHeadingDocument (line 21) | interface EmbeddedHeadingDocument {
type EmbeddedDocument (line 28) | interface EmbeddedDocument {
constant EMBEDDED_ELEMENTS (line 35) | const EMBEDDED_ELEMENTS: ElementSet = {
function EmbeddedView (line 42) | function EmbeddedView({
function EmbeddedHeading (line 60) | function EmbeddedHeading({
FILE: packages/triple-email-document/src/elements/heading.tsx
type Heading1Document (line 5) | interface Heading1Document {
type Heading2Document (line 13) | interface Heading2Document {
type Heading3Document (line 20) | interface Heading3Document {
type Heading4Document (line 27) | interface Heading4Document {
function Heading1View (line 72) | function Heading1View({
function Heading2View (line 93) | function Heading2View({
function Heading3View (line 113) | function Heading3View({
function Heading4View (line 133) | function Heading4View({
FILE: packages/triple-email-document/src/elements/images.test.tsx
constant SAMPLE_IMAGE (line 8) | const SAMPLE_IMAGE =
constant SIZES (line 11) | const SIZES = {
function generateSampleImages (line 195) | function generateSampleImages(
FILE: packages/triple-email-document/src/elements/images.tsx
type ImageFrameRatio (line 7) | type ImageFrameRatio = Extract<
type ExtendedImageMeta (line 12) | type ExtendedImageMeta = ImageMeta & {
type ImageDocument (line 19) | interface ImageDocument {
constant MEDIA_FRAME_OPTIONS (line 27) | const MEDIA_FRAME_OPTIONS: {
function Images (line 99) | function Images({
function ImagesRow (line 163) | function ImagesRow({ children }: PropsWithChildren<unknown>) {
function Image (line 169) | function Image({
function Img (line 213) | function Img({
FILE: packages/triple-email-document/src/el
Condensed preview — 1423 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,298K chars).
[
{
"path": ".browserslistrc",
"chars": 110,
"preview": "[production]\niOS >= 13.4, last 3 Safari versions, > 0.5% in KR, not dead\n\n[development]\nlast 1 chrome version\n"
},
{
"path": ".editorconfig",
"chars": 356,
"preview": "# http://editorconfig.org\nroot = true\n\n[*.{js,ts,tsx}]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size"
},
{
"path": ".eslintrc.js",
"chars": 506,
"preview": "/** @type import('eslint').Linter.Config */\nmodule.exports = {\n root: true,\n extends: [\n '@titicaca/eslint-config-t"
},
{
"path": ".github/CODEOWNERS",
"chars": 24,
"preview": "* @titicacadev/frontend\n"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 656,
"preview": "<!-- 이 PR을 요약한 내용으로 위 제목 폼을 채워 주세요. -->\n\n## PR 설명\n\n<!-- PR의 목적, PR이 구현하는 기획이나 디자인(figma, slack or jira) 등 리뷰어가 참고할 내용을 적"
},
{
"path": ".github/workflows/add-label.yaml",
"chars": 1713,
"preview": "name: Label a PR with its updated packages\n\non:\n pull_request:\n types: [opened, synchronize, ready_for_review]\n\njobs"
},
{
"path": ".github/workflows/cd.yaml",
"chars": 7015,
"preview": "name: CD\n\non:\n push:\n branches-ignore:\n - '**'\n tags:\n - 'release-prod-*'\n - 'release-pr-*'\n\nenv:\n"
},
{
"path": ".github/workflows/ci.yaml",
"chars": 3894,
"preview": "name: CI\non:\n push:\n branches:\n - '**'\n tags-ignore:\n - '**'\n\nenv:\n # Node.js\n NODE_VERSION: 'lts/*'\n"
},
{
"path": ".github/workflows/pr-closed.yaml",
"chars": 1057,
"preview": "name: PR Closed\n\non:\n pull_request:\n types:\n - closed\n\nenv:\n GITHUB_API_URL_BASE: https://api.github.com/repos"
},
{
"path": ".github/workflows/tag-with-comment.yaml",
"chars": 4420,
"preview": "name: tag-with-comment\n\non:\n issue_comment:\n types:\n - 'created'\n\nenv:\n GITHUB_API_URL_BASE: https://api.githu"
},
{
"path": ".github/workflows/update-changelog.yaml",
"chars": 1716,
"preview": "name: Update CHANGELOG\n\non:\n pull_request:\n types:\n - labeled\n\nenv:\n COMMIT_USER_EMAIL: triple-bot@interpark.c"
},
{
"path": ".gitignore",
"chars": 1539,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Diagnostic reports (https://nodejs."
},
{
"path": ".husky/pre-commit",
"chars": 22,
"preview": "pnpm exec lint-staged\n"
},
{
"path": ".npmrc",
"chars": 19,
"preview": "engine-strict=true\n"
},
{
"path": ".prettierignore",
"chars": 15,
"preview": "pnpm-lock.yaml\n"
},
{
"path": ".prettierrc",
"chars": 35,
"preview": "\"@titicaca/prettier-config-triple\"\n"
},
{
"path": ".storybook/decorators.tsx",
"chars": 1380,
"preview": "import React from 'react'\nimport { GlobalStyle, defaultTheme } from '../packages/tds-theme/src'\nimport { TripleWeb } fro"
},
{
"path": ".storybook/main.ts",
"chars": 1958,
"preview": "import fs from 'fs'\n\nimport type { Options } from '@swc/core'\nimport type { StorybookConfig } from '@storybook/nextjs'\n\n"
},
{
"path": ".storybook/preview.ts",
"chars": 929,
"preview": "import type { Preview } from '@storybook/react'\nimport { initialize, mswLoader } from 'msw-storybook-addon'\nimport { moc"
},
{
"path": ".storybook/public/mockServiceWorker.js",
"chars": 8409,
"preview": "/* eslint-disable */\n/* tslint:disable */\n\n/**\n * Mock Service Worker (1.2.1).\n * @see https://github.com/mswjs/msw\n * -"
},
{
"path": ".stylelintrc.json",
"chars": 55,
"preview": "{\n \"extends\": [\"@titicaca/stylelint-config-triple\"]\n}\n"
},
{
"path": ".swcrc",
"chars": 350,
"preview": "{\n \"$schema\": \"https://json.schemastore.org/swcrc\",\n \"module\": {\n \"type\": \"commonjs\"\n },\n \"jsc\": {\n \"parser\": "
},
{
"path": ".vscode/settings.json",
"chars": 56,
"preview": "{\n \"eslint.workingDirectories\": [{ \"mode\": \"auto\" }]\n}\n"
},
{
"path": "CHANGELOG-archive-201911.md",
"chars": 9889,
"preview": "## 0.12.0 (2019-08-30)\n\n- `Checkbox` 에서도 error style 을 이용 할 수 있도록 변경\n\n _Olaf_\n\n## 0.11.3 (2019-08-29)\n\n- `withField` 모든"
},
{
"path": "CHANGELOG.md",
"chars": 175026,
"preview": "# CHANGELOG\n\n## v14.2.3\n\n### router\n\n- feat: Add peer dependency of triple-web-to-native-interfaces [#3783](https://gith"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5491,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "CONTRIBUTING.md",
"chars": 3219,
"preview": "# 기여하기\n\n프로젝트 기여자들이 작업하는데 필요한 준비 및 작업 과정을 설명합니다.\n\n## 사전 준비\n\n- Node.js LTS\n- pnpm\n\n## 설치\n\n프로젝트를 클론합니다:\n\n```sh\ngit clone gi"
},
{
"path": "LICENSE",
"chars": 1078,
"preview": "MIT License\n\nCopyright (c) 2024 InterparkTriple Corp.\n\nPermission is hereby granted, free of charge, to any person obtai"
},
{
"path": "MIGRATION.md",
"chars": 8121,
"preview": "# 마이그레이션 가이드\n\n## v13 to v14\n\n- [v14 업그레이드 가이드](https://inpk.atlassian.net/wiki/x/OIOzGw)\n\n## v13.41.0 to v13.42.0\n\n- [13"
},
{
"path": "README.md",
"chars": 479,
"preview": "# Triple Frontend\n\n[ {\n return null\n}\n"
},
{
"path": "examples/nextjs-app/app/template.tsx",
"chars": 819,
"preview": "import { buildTripleWebProps, TripleWeb } from '@titicaca/triple-web-nextjs'\nimport { PropsWithChildren } from 'react'\n\n"
},
{
"path": "examples/nextjs-app/lib/registry.tsx",
"chars": 1333,
"preview": "'use client'\n\nimport { useState, ReactNode } from 'react'\nimport { useServerInsertedHTML } from 'next/navigation'\nimport"
},
{
"path": "examples/nextjs-app/lib/theme.tsx",
"chars": 397,
"preview": "'use client'\n\nimport { ThemeProvider as StyledThemeProvider } from 'styled-components'\nimport { defaultTheme, GlobalStyl"
},
{
"path": "examples/nextjs-app/next.config.mjs",
"chars": 138,
"preview": "/** @type {import('next').NextConfig} */\nconst nextConfig = {\n compiler: {\n styledComponents: true,\n },\n}\n\nexport d"
},
{
"path": "examples/nextjs-app/package.json",
"chars": 684,
"preview": "{\n \"name\": \"nextjs-app\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev\",\n \"build\": \"next build\",\n \"start"
},
{
"path": "examples/nextjs-app/tsconfig.json",
"chars": 531,
"preview": "{\n \"compilerOptions\": {\n \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n \"allowJs\": true,\n \"skipLibCheck\": true,\n "
},
{
"path": "examples/nextjs-pages/.gitignore",
"chars": 391,
"preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pn"
},
{
"path": "examples/nextjs-pages/README.md",
"chars": 175,
"preview": "# Next.js Pages Example\n\n`triple-frontend` 모노레포 패키지를 로컬 개발 환경에서 테스트하고 통합하기 위한 실험용 프로젝트입니다. `triple-frontend` 패키지가 Next.j"
},
{
"path": "examples/nextjs-pages/next.config.mjs",
"chars": 311,
"preview": "/** @type {import('next').NextConfig} */\nconst nextConfig = {\n reactStrictMode: true,\n compiler: {\n styledComponent"
},
{
"path": "examples/nextjs-pages/package.json",
"chars": 728,
"preview": "{\n \"name\": \"nextjs-pages\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev\",\n \"build\": \"next build\",\n \"sta"
},
{
"path": "examples/nextjs-pages/pages/_app.tsx",
"chars": 1965,
"preview": "import App from 'next/app'\nimport type { AppContext, AppInitialProps, AppProps } from 'next/app'\nimport { StyleSheetMana"
},
{
"path": "examples/nextjs-pages/pages/_document.tsx",
"chars": 231,
"preview": "import { Html, Head, Main, NextScript } from 'next/document'\n\nexport default function Document() {\n return (\n <Html "
},
{
"path": "examples/nextjs-pages/pages/index.tsx",
"chars": 49,
"preview": "export default function Home() {\n return null\n}\n"
},
{
"path": "examples/nextjs-pages/tsconfig.json",
"chars": 445,
"preview": "{\n \"compilerOptions\": {\n \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n \"allowJs\": true,\n \"skipLibCheck\": true,\n "
},
{
"path": "global.d.ts",
"chars": 67,
"preview": "import '@testing-library/jest-dom'\nimport 'jest-styled-components'\n"
},
{
"path": "jest-setup.js",
"chars": 301,
"preview": "import '@testing-library/jest-dom'\nimport 'jest-styled-components'\n\nimport { TextDecoder, TextEncoder } from 'util'\n\nglo"
},
{
"path": "jest.config.js",
"chars": 795,
"preview": "const { pathsToModuleNameMapper } = require('ts-jest')\n\nconst { compilerOptions } = require('./tsconfig.test.json')\n\n/**"
},
{
"path": "lerna.json",
"chars": 110,
"preview": "{\n \"$schema\": \"node_modules/lerna/schemas/lerna-schema.json\",\n \"npmClient\": \"pnpm\",\n \"version\": \"14.2.3\"\n}\n"
},
{
"path": "package.json",
"chars": 3511,
"preview": "{\n \"name\": \"root\",\n \"private\": true,\n \"engines\": {\n \"node\": \">= 20\",\n \"pnpm\": \"9.x\"\n },\n \"scripts\": {\n \"de"
},
{
"path": "packages/ab-experiments/README.md",
"chars": 236,
"preview": "# ab-experiments\n\nA/B 테스트를 지원하는 패키지입니다.\n\n## 인터페이스 종류\n\n### 1. triple-ab-experiment-context\n\n**트리플의 사용자 ID(내부 API를 이용)**를 "
},
{
"path": "packages/ab-experiments/package.json",
"chars": 1272,
"preview": "{\n \"name\": \"@titicaca/ab-experiments\",\n \"version\": \"14.2.3\",\n \"description\": \"a/b experiments package\",\n \"license\": "
},
{
"path": "packages/ab-experiments/src/google-optimize-context/README.md",
"chars": 1946,
"preview": "# google-optimize-context\n\n**Google Optimize**를 이용하여 세션을 통해 A/B 테스트를 도와주는 context입니다.\n\n## 인터페이스\n\n### `GoogleOptimizeExpe"
},
{
"path": "packages/ab-experiments/src/google-optimize-context/context.tsx",
"chars": 1716,
"preview": "import {\n useState,\n useEffect,\n PropsWithChildren,\n createContext,\n useContext,\n} from 'react'\nimport Head from 'n"
},
{
"path": "packages/ab-experiments/src/google-optimize-context/index.ts",
"chars": 26,
"preview": "export * from './context'\n"
},
{
"path": "packages/ab-experiments/src/index.ts",
"chars": 89,
"preview": "export * from './google-optimize-context'\nexport * from './triple-ab-experiment-context'\n"
},
{
"path": "packages/ab-experiments/src/triple-ab-experiment-context/README.md",
"chars": 4055,
"preview": "# triple-ab-experiment-context\n\n**트리플의 사용자 ID(내부 API를 이용)**를 이용하여 A/B 테스트를 도와주는 context입니다.\n\n## 인터페이스\n\n### `getTripleABE"
},
{
"path": "packages/ab-experiments/src/triple-ab-experiment-context/context.tsx",
"chars": 5576,
"preview": "import {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState"
},
{
"path": "packages/ab-experiments/src/triple-ab-experiment-context/index.ts",
"chars": 52,
"preview": "export * from './context'\nexport * from './service'\n"
},
{
"path": "packages/ab-experiments/src/triple-ab-experiment-context/service.ts",
"chars": 348,
"preview": "import { authGuardedFetchers, RequestOptions } from '@titicaca/fetcher'\n\nexport interface TripleABExperimentMeta {\n tes"
},
{
"path": "packages/ab-experiments/tsconfig.build.json",
"chars": 323,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"emitDeclarationOnly\": true,\n "
},
{
"path": "packages/ab-experiments/tsconfig.json",
"chars": 77,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"lib\"]\n}\n"
},
{
"path": "packages/ab-experiments/vite.config.mts",
"chars": 48,
"preview": "export { default } from '../../vite.config.mjs'\n"
},
{
"path": "packages/constants/README.md",
"chars": 77,
"preview": "# `@titicaca/constants`\n\n트리플 프론트엔드의 공통 상수를 모아놓는 패키지입니다.\n\n- 공통 상수\n- 공통 정규 표현식\n"
},
{
"path": "packages/constants/package.json",
"chars": 1049,
"preview": "{\n \"name\": \"@titicaca/constants\",\n \"version\": \"14.2.3\",\n \"description\": \"triple frontend constants definitions\",\n \"k"
},
{
"path": "packages/constants/src/index.ts",
"chars": 228,
"preview": "export * from './regex'\n\n/** API 호출 시 필요한 사용자 세션 HTTP 헤더 키 */\nexport const SESSION_KEY = 'x-soto-session'\nexport const "
},
{
"path": "packages/constants/src/regex.test.ts",
"chars": 1858,
"preview": "import { EMAIL_REGEX } from './regex'\n\nconst testIsInvalidEmail = (email: string) => !EMAIL_REGEX.test(email)\nconst test"
},
{
"path": "packages/constants/src/regex.ts",
"chars": 1599,
"preview": "/**\n * 삼성 스마트폰 천지인 middle dot 입력 이슈\n * https://github.com/titicacadev/triple-hotels-web/issues/1923\n */\nconst KOREAN_MID"
},
{
"path": "packages/constants/tsconfig.build.json",
"chars": 323,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"emitDeclarationOnly\": true,\n "
},
{
"path": "packages/constants/tsconfig.json",
"chars": 77,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"lib\"]\n}\n"
},
{
"path": "packages/constants/vite.config.mts",
"chars": 48,
"preview": "export { default } from '../../vite.config.mjs'\n"
},
{
"path": "packages/fetcher/README.md",
"chars": 3054,
"preview": "# fetcher\n\n[fetch API](https://developer.mozilla.org/ko/docs/Web/API/Fetch_API)를 사용할 때\n공통으로 필요한 기능을 제공하는 패키지입니다.\n\nfetch "
},
{
"path": "packages/fetcher/package.json",
"chars": 1434,
"preview": "{\n \"name\": \"@titicaca/fetcher\",\n \"version\": \"14.2.3\",\n \"description\": \"Utilities for Triple view libraries and applic"
},
{
"path": "packages/fetcher/src/add-fetchers-to-gssp.test.ts",
"chars": 6682,
"preview": "import 'isomorphic-fetch'\nimport { GetServerSidePropsContext, GetServerSidePropsResult } from 'next'\n\nimport { addFetche"
},
{
"path": "packages/fetcher/src/add-fetchers-to-gssp.ts",
"chars": 3292,
"preview": "import { GetServerSidePropsContext, GetServerSidePropsResult } from 'next'\n\nimport {\n authFetcherize,\n BaseFetcher,\n "
},
{
"path": "packages/fetcher/src/auth-guarded-methods.ts",
"chars": 631,
"preview": "import { authFetcherize } from './factories'\nimport { fetcher } from './fetcher'\nimport { del, get, post, put } from './"
},
{
"path": "packages/fetcher/src/factories.test.ts",
"chars": 3262,
"preview": "import { IncomingMessage } from 'http'\n\nimport { ssrFetcherize } from './factories'\n\nfunction makeTestSuite(testingFunct"
},
{
"path": "packages/fetcher/src/factories.ts",
"chars": 5401,
"preview": "import { GetServerSidePropsContext } from 'next'\nimport { generateUrl, parseUrl } from '@titicaca/view-utilities'\n\nimpor"
},
{
"path": "packages/fetcher/src/fetcher.ts",
"chars": 2281,
"preview": "import { makeRequestParams } from './make-request-params'\nimport safeParseJson from './safe-parse-json'\nimport { HttpMet"
},
{
"path": "packages/fetcher/src/index.ts",
"chars": 684,
"preview": "export * from './types'\nexport { authFetcherize, ssrFetcherize } from './factories'\nexport { NEED_LOGIN_IDENTIFIER } fro"
},
{
"path": "packages/fetcher/src/make-request-params.test.ts",
"chars": 2236,
"preview": "import { IncomingMessage } from 'http'\n\nimport { makeRequestParams } from './make-request-params'\n\ndescribe('makeRequest"
},
{
"path": "packages/fetcher/src/make-request-params.ts",
"chars": 1184,
"preview": "import Cookies from 'universal-cookie'\n\nimport { RequestOptions } from './types'\n\nexport function makeRequestParams(\n h"
},
{
"path": "packages/fetcher/src/methods.ts",
"chars": 698,
"preview": "import { fetcher } from './fetcher'\nimport { HttpMethods, HttpResponse, RequestOptions } from './types'\n\nexport const ge"
},
{
"path": "packages/fetcher/src/response-handler.ts",
"chars": 1579,
"preview": "import { withScope, captureException } from '@sentry/nextjs'\n\nimport { HttpResponse } from './types'\nimport { NEED_LOGIN"
},
{
"path": "packages/fetcher/src/safe-parse-json.test.ts",
"chars": 387,
"preview": "import { Response } from 'node-fetch'\n\nimport safeParseJson from './safe-parse-json'\n\nit('JSON 파싱 에러를 조용히 넘깁니다.', async "
},
{
"path": "packages/fetcher/src/safe-parse-json.ts",
"chars": 191,
"preview": "export default async function safeParseJson(\n response: Response,\n): Promise<unknown> {\n try {\n const json = await "
},
{
"path": "packages/fetcher/src/server-fetch.ts",
"chars": 1837,
"preview": "import {\n parseCookie,\n stringifyCookie,\n} from 'next/dist/compiled/@edge-runtime/cookies'\nimport Cookies from 'univer"
},
{
"path": "packages/fetcher/src/session-refresh.ts",
"chars": 1148,
"preview": "import { ssrFetcherize } from './factories'\nimport { post } from './methods'\nimport { RequestOptions } from './types'\n\ne"
},
{
"path": "packages/fetcher/src/types.ts",
"chars": 1178,
"preview": "import { IncomingMessage } from 'http'\n\nexport type RequestOptions = Omit<RequestInit, 'body'> & {\n /**\n * @deprecate"
},
{
"path": "packages/fetcher/tsconfig.build.json",
"chars": 323,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"emitDeclarationOnly\": true,\n "
},
{
"path": "packages/fetcher/tsconfig.json",
"chars": 77,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"lib\"]\n}\n"
},
{
"path": "packages/fetcher/vite.config.mts",
"chars": 48,
"preview": "export { default } from '../../vite.config.mjs'\n"
},
{
"path": "packages/i18n/package.json",
"chars": 965,
"preview": "{\n \"name\": \"@titicaca/i18n\",\n \"version\": \"14.2.3\",\n \"description\": \"Triple-frontend Internalization\",\n \"license\": \"M"
},
{
"path": "packages/i18n/src/index.ts",
"chars": 104,
"preview": "export { locales } from './locales'\nexport { interpolate } from './interpolate'\nexport * from './types'\n"
},
{
"path": "packages/i18n/src/interpolate.ts",
"chars": 211,
"preview": "export const interpolate = (\n text: string,\n values: Record<string, string> = {},\n) => {\n return text.replace(/{{(\\w+"
},
{
"path": "packages/i18n/src/locales/en.ts",
"chars": 7840,
"preview": "export default {\n '앱에서 보기': 'View in app',\n 닫기: 'Close',\n 트리플: 'Triple',\n '트리플 앱 설치하기': 'Install Tripl app',\n '가이드북"
},
{
"path": "packages/i18n/src/locales/index.ts",
"chars": 138,
"preview": "import en from './en'\nimport ja from './ja'\nimport ko from './ko'\nimport zhTw from './zh-TW'\n\nexport const locales = { e"
},
{
"path": "packages/i18n/src/locales/ja.ts",
"chars": 5922,
"preview": "export default {\n '앱에서 보기': 'アプリで見る',\n 닫기: '閉じる',\n 트리플: 'TRIPLE',\n '트리플 앱 설치하기': 'TRIPLEアプリをインストールする',\n '가이드북, 일정짜기"
},
{
"path": "packages/i18n/src/locales/ko.ts",
"chars": 5842,
"preview": "export default {\n '앱에서 보기': '앱에서 보기',\n 닫기: '닫기',\n 트리플: '트리플',\n '트리플 앱 설치하기': '트리플 앱 설치하기',\n '가이드북, 일정짜기, 길찾기, 맛집': "
},
{
"path": "packages/i18n/src/locales/zh-TW.ts",
"chars": 5348,
"preview": "export default {\n '앱에서 보기': '在App裡查看',\n 닫기: '關閉',\n 트리플: 'Triple',\n '트리플 앱 설치하기': '立即下載 Triple App',\n '가이드북, 일정짜기, 길"
},
{
"path": "packages/i18n/src/types.ts",
"chars": 64,
"preview": "import ko from './locales/ko'\n\nexport type I18nKeys = typeof ko\n"
},
{
"path": "packages/i18n/tsconfig.build.json",
"chars": 323,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"emitDeclarationOnly\": true,\n "
},
{
"path": "packages/i18n/tsconfig.json",
"chars": 77,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"lib\"]\n}\n"
},
{
"path": "packages/i18n/vite.config.mts",
"chars": 48,
"preview": "export { default } from '../../vite.config.mjs'\n"
},
{
"path": "packages/intersection-observer/README.md",
"chars": 481,
"preview": "# intersection-observer\n\nintersection 관련 컴포넌트 및 Hook을 제공합니다.\n\n## Usage\n\n### use-intersection\n\n기본 사용법은 아래와 같이 useIntersec"
},
{
"path": "packages/intersection-observer/package.json",
"chars": 1395,
"preview": "{\n \"name\": \"@titicaca/intersection-observer\",\n \"version\": \"14.2.3\",\n \"description\": \"Shared IntersecionObserver compo"
},
{
"path": "packages/intersection-observer/src/index.ts",
"chars": 259,
"preview": "import IntersectionObserver from './lazy-loaded-intersection-observer'\n\nexport { default as StaticIntersectionObserver }"
},
{
"path": "packages/intersection-observer/src/lazy-loaded-intersection-observer.tsx",
"chars": 1258,
"preview": "import { FC } from 'react'\nimport dynamic from 'next/dynamic'\nimport { ReactIntersectionObserverProps } from '@titicaca/"
},
{
"path": "packages/intersection-observer/src/static-intersection-observer.tsx",
"chars": 151,
"preview": "import 'intersection-observer'\nimport ReactIntersectionObserver from '@titicaca/react-intersection-observer'\n\nexport def"
},
{
"path": "packages/intersection-observer/src/use-intersection.ts",
"chars": 669,
"preview": "import 'intersection-observer'\nimport { useState, useEffect, useRef } from 'react'\n\nexport default function useIntersect"
},
{
"path": "packages/intersection-observer/tsconfig.build.json",
"chars": 323,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"emitDeclarationOnly\": true,\n "
},
{
"path": "packages/intersection-observer/tsconfig.json",
"chars": 77,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"lib\"]\n}\n"
},
{
"path": "packages/intersection-observer/vite.config.mts",
"chars": 48,
"preview": "export { default } from '../../vite.config.mjs'\n"
},
{
"path": "packages/meta-tags/README.md",
"chars": 6942,
"preview": "# `@titicaca/meta-tags`\n\n현재 사용중인 메타태그들을 묶어둔 패키지입니다.\n\n## 기본 태그 (EssentialMeta)\n\n### Usage\n\n```tsx\nimport { EssentialMeta "
},
{
"path": "packages/meta-tags/package.json",
"chars": 1332,
"preview": "{\n \"name\": \"@titicaca/meta-tags\",\n \"version\": \"14.2.3\",\n \"description\": \"Triple Web Application Meta tag modules\",\n "
},
{
"path": "packages/meta-tags/src/app-router/generate-apple-smart-banner-meta.ts",
"chars": 402,
"preview": "import { Metadata } from 'next'\n\nimport { DEFAULT_APP_ID } from '../constants'\n\nexport function generateAppleSmartBanner"
},
{
"path": "packages/meta-tags/src/app-router/generate-common-meta.ts",
"chars": 214,
"preview": "import { Metadata } from 'next'\n\nexport function generateCommonMeta(): Metadata {\n return {\n icons: {\n apple: '"
},
{
"path": "packages/meta-tags/src/app-router/generate-essential-content-meta.ts",
"chars": 446,
"preview": "import { Metadata } from 'next'\n\nexport function generateEssentialContentMeta({\n title,\n description,\n canonicalUrl,\n"
},
{
"path": "packages/meta-tags/src/app-router/generate-facebook-app-link-meta.ts",
"chars": 763,
"preview": "import { Metadata } from 'next'\n\nimport { DEFAULT_APP_ID, DEFAULT_APP_PACKAGE_NAME } from '../constants'\n\nexport functio"
},
{
"path": "packages/meta-tags/src/app-router/generate-facebook-open-graph-meta.ts",
"chars": 1004,
"preview": "import { Metadata } from 'next'\nimport { OpenGraphType } from 'next/dist/lib/metadata/types/opengraph-types'\n\nimport { D"
},
{
"path": "packages/meta-tags/src/app-router/generate-triple-default-meta.ts",
"chars": 679,
"preview": "import { Metadata } from 'next'\n\nimport { generateCommonMeta } from './generate-common-meta'\nimport { generateEssentialC"
},
{
"path": "packages/meta-tags/src/app-router/index.ts",
"chars": 289,
"preview": "export * from './generate-common-meta'\nexport * from './generate-apple-smart-banner-meta'\nexport * from './generate-esse"
},
{
"path": "packages/meta-tags/src/constants.ts",
"chars": 291,
"preview": "export const DEFAULT_APP_ID = '1225499481'\nexport const DEFAULT_APP_PACKAGE_NAME = 'com.titicacacorp.triple'\nexport cons"
},
{
"path": "packages/meta-tags/src/index.ts",
"chars": 118,
"preview": "export * from './types'\nexport * from './app-router'\nexport * from './pages-router'\nexport * from './structured-data'\n"
},
{
"path": "packages/meta-tags/src/pages-router/apple-smart-banner-meta.tsx",
"chars": 460,
"preview": "import Head from 'next/head'\nimport { useEnv } from '@titicaca/triple-web'\n\nimport { DEFAULT_APP_ID } from '../constants"
},
{
"path": "packages/meta-tags/src/pages-router/common-meta.tsx",
"chars": 732,
"preview": "import Head from 'next/head'\n\nexport function CommonMeta() {\n return (\n <Head>\n <meta charSet=\"utf-8\" />\n "
},
{
"path": "packages/meta-tags/src/pages-router/essential-content-meta.test.tsx",
"chars": 1797,
"preview": "/* eslint-disable testing-library/no-node-access */\nimport { render } from '@testing-library/react'\nimport { useEnv } fr"
},
{
"path": "packages/meta-tags/src/pages-router/essential-content-meta.tsx",
"chars": 704,
"preview": "import Head from 'next/head'\nimport { useEnv } from '@titicaca/triple-web'\n\nexport function EssentialContentMeta({\n tit"
},
{
"path": "packages/meta-tags/src/pages-router/facebook-app-link-meta.tsx",
"chars": 1257,
"preview": "import Head from 'next/head'\nimport { useEnv, useTranslation } from '@titicaca/triple-web'\n\nimport { DEFAULT_APP_ID, DEF"
},
{
"path": "packages/meta-tags/src/pages-router/facebook-open-graph-meta.tsx",
"chars": 1619,
"preview": "import Head from 'next/head'\nimport { useEnv } from '@titicaca/triple-web'\n\nimport { DEFAULT_OG_IMAGE } from '../constan"
},
{
"path": "packages/meta-tags/src/pages-router/index.ts",
"chars": 354,
"preview": "export { EssentialContentMeta } from './essential-content-meta'\nexport { CommonMeta } from './common-meta'\nexport { Appl"
},
{
"path": "packages/meta-tags/src/pages-router/theme-color-meta.tsx",
"chars": 462,
"preview": "import Head from 'next/head'\n\nimport { ThemeColor } from '../types'\nimport { DEFAULT_THEME_COLOR } from '../constants'\n\n"
},
{
"path": "packages/meta-tags/src/structured-data/article-script.tsx",
"chars": 432,
"preview": "import Script from 'next/script'\n\nimport { createScript } from '../utils'\nimport { ArticleScriptProps } from '../types'\n"
},
{
"path": "packages/meta-tags/src/structured-data/breadcrumb-list-script.tsx",
"chars": 474,
"preview": "import Script from 'next/script'\n\nimport { createScript } from '../utils'\nimport { BreadcrumbListScriptProps } from '../"
},
{
"path": "packages/meta-tags/src/structured-data/discussion-forum-posting-script.tsx",
"chars": 532,
"preview": "import Script from 'next/script'\n\nimport { createScript } from '../utils'\nimport { DiscussionForumPostingScriptProps } f"
},
{
"path": "packages/meta-tags/src/structured-data/index.ts",
"chars": 400,
"preview": "export { ArticleScript } from './article-script'\nexport { BreadcrumbListScript } from './breadcrumb-list-script'\nexport "
},
{
"path": "packages/meta-tags/src/structured-data/local-business-script.tsx",
"chars": 529,
"preview": "import Script from 'next/script'\n\nimport { SCHEMA_SCRIPT_TYPE_MAP, createScript } from '../utils'\nimport { LocalBusiness"
},
{
"path": "packages/meta-tags/src/structured-data/product-script.tsx",
"chars": 432,
"preview": "import Script from 'next/script'\n\nimport { createScript } from '../utils'\nimport { ProductScriptProps } from '../types'\n"
},
{
"path": "packages/meta-tags/src/structured-data/qa-page-script.tsx",
"chars": 426,
"preview": "import Script from 'next/script'\n\nimport { createScript } from '../utils'\nimport { QaPageScriptProps } from '../types'\n\n"
},
{
"path": "packages/meta-tags/src/structured-data/review-script.tsx",
"chars": 457,
"preview": "import Script from 'next/script'\n\nimport { createScript } from '../utils'\nimport { ReviewScriptProps } from '../types'\n\n"
},
{
"path": "packages/meta-tags/src/types/index.ts",
"chars": 72,
"preview": "export * from './schema'\nexport * from './structured-data-script-props'\n"
},
{
"path": "packages/meta-tags/src/types/schema.ts",
"chars": 2469,
"preview": "import { SCHEMA_SCRIPT_TYPE_MAP } from '../utils'\n\nexport interface Author {\n type?: 'Person' | 'Organization'\n name: "
},
{
"path": "packages/meta-tags/src/types/structured-data-script-props.ts",
"chars": 1782,
"preview": "import { SCHEMA_SCRIPT_TYPE_MAP } from '../utils'\n\nimport {\n AddressSchema,\n AggregateOfferSchema,\n AggregateRatingSc"
},
{
"path": "packages/meta-tags/src/utils.ts",
"chars": 4063,
"preview": "export const SCHEMA_SCRIPT_TYPE_MAP = {\n restaurant: 'FoodEstablishment',\n attraction: 'LocalBusiness',\n hotel: 'Hote"
},
{
"path": "packages/meta-tags/tsconfig.build.json",
"chars": 323,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"emitDeclarationOnly\": true,\n "
},
{
"path": "packages/meta-tags/tsconfig.json",
"chars": 77,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"lib\"]\n}\n"
},
{
"path": "packages/meta-tags/vite.config.mts",
"chars": 48,
"preview": "export { default } from '../../vite.config.mjs'\n"
},
{
"path": "packages/middlewares/README.md",
"chars": 1527,
"preview": "# `@titicaca/middlewares`\n\n트리플 서비스에서 공통으로 사용할 미들웨어 함수들을 제공합니다. \n새로운 미들웨어를 추가하거나 확장할 수 있습니다.\n\n## Description\n\n현재 `@titic"
},
{
"path": "packages/middlewares/package.json",
"chars": 1746,
"preview": "{\n \"name\": \"@titicaca/middlewares\",\n \"version\": \"14.2.3\",\n \"description\": \"Triple Web Application Middleware modules\""
},
{
"path": "packages/middlewares/src/chain.ts",
"chars": 377,
"preview": "import { NextMiddleware, NextResponse } from 'next/server'\n\nimport { MiddlewareFactory } from './types'\n\nexport function"
},
{
"path": "packages/middlewares/src/index.ts",
"chars": 741,
"preview": "import { chain } from './chain'\nimport type { MiddlewareFactory } from './types'\nimport {\n refreshSessionMiddleware,\n "
},
{
"path": "packages/middlewares/src/refresh-session/index.ts",
"chars": 140,
"preview": "export { refreshSessionMiddleware } from './next-14'\nexport { refreshSessionMiddleware as refreshSessionMiddlewareNext13"
},
{
"path": "packages/middlewares/src/refresh-session/next-13.ts",
"chars": 2973,
"preview": "import { type ResponseCookie } from 'next/dist/compiled/@edge-runtime/cookies'\nimport {\n NextFetchEvent,\n NextMiddlewa"
},
{
"path": "packages/middlewares/src/refresh-session/next-14.ts",
"chars": 3669,
"preview": "import { type ResponseCookie } from 'next/dist/compiled/@edge-runtime/cookies'\nimport {\n NextFetchEvent,\n NextMiddlewa"
},
{
"path": "packages/middlewares/src/set-web-device-id.ts",
"chars": 1137,
"preview": "import {\n NextFetchEvent,\n NextMiddleware,\n NextRequest,\n NextResponse,\n} from 'next/server'\nimport { v4 as uuidV4 }"
},
{
"path": "packages/middlewares/src/types.ts",
"chars": 125,
"preview": "import { NextMiddleware } from 'next/server'\n\nexport type MiddlewareFactory = (middleware: NextMiddleware) => NextMiddle"
},
{
"path": "packages/middlewares/src/utils/apply-set-cookie.ts",
"chars": 942,
"preview": "import {\n RequestCookies,\n ResponseCookies,\n} from 'next/dist/compiled/@edge-runtime/cookies'\nimport { NextRequest, Ne"
},
{
"path": "packages/middlewares/src/utils/get-domain.ts",
"chars": 385,
"preview": "import { parseUrl } from '@titicaca/view-utilities'\nimport { NextRequest } from 'next/server'\n\nexport function getDomain"
},
{
"path": "packages/middlewares/src/utils/get-triple-app.ts",
"chars": 322,
"preview": "import { NextRequest } from 'next/server'\nimport { clientAppRegex } from '@titicaca/triple-web-utils'\n\nexport function g"
},
{
"path": "packages/middlewares/tsconfig.build.json",
"chars": 323,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"emitDeclarationOnly\": true,\n "
},
{
"path": "packages/middlewares/tsconfig.json",
"chars": 77,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"lib\"]\n}\n"
},
{
"path": "packages/middlewares/vite.config.mts",
"chars": 48,
"preview": "export { default } from '../../vite.config.mjs'\n"
},
{
"path": "packages/react-hooks/README.md",
"chars": 2919,
"preview": "# React-hooks\n\nReact Custom Hook 들을 제공합니다.\n\n## Usage\n\n### use-fetch\n\n```\nimport { useFetch } from '@titicaca/react-hooks"
},
{
"path": "packages/react-hooks/package.json",
"chars": 1283,
"preview": "{\n \"name\": \"@titicaca/react-hooks\",\n \"version\": \"14.2.3\",\n \"description\": \"triple frontend custom hooks\",\n \"license\""
},
{
"path": "packages/react-hooks/src/hooks.stories.tsx",
"chars": 2295,
"preview": "import type { Meta, StoryObj } from '@storybook/react'\nimport isChromatic from 'chromatic/isChromatic'\nimport { useEffec"
},
{
"path": "packages/react-hooks/src/index.ts",
"chars": 387,
"preview": "export * from './use-body-scroll-lock'\nexport * from './use-debounce'\nexport * from './use-error-handler'\nexport * from "
},
{
"path": "packages/react-hooks/src/mocks/lottie.sample.json",
"chars": 29423,
"preview": "{\n \"v\": \"5.7.3\",\n \"fr\": 30,\n \"ip\": 0,\n \"op\": 200,\n \"w\": 57,\n \"h\": 57,\n \"nm\": \"flight_loading_blue\",\n \"ddd\": 0,\n "
},
{
"path": "packages/react-hooks/src/use-body-scroll-lock.ts",
"chars": 1260,
"preview": "import { useEffect } from 'react'\n\nexport interface BodyScrollLockState {\n scrollTop: number\n style?: Partial<{\n to"
},
{
"path": "packages/react-hooks/src/use-debounce.test.ts",
"chars": 1371,
"preview": "import { renderHook, act } from '@testing-library/react'\n\nimport { useDebouncedState } from './use-debounce'\n\ndescribe('"
},
{
"path": "packages/react-hooks/src/use-debounce.ts",
"chars": 784,
"preview": "import { useState, useEffect, useRef, useCallback } from 'react'\n\nexport function useDebouncedState<T>(\n value: T,\n ti"
},
{
"path": "packages/react-hooks/src/use-error-handler.ts",
"chars": 243,
"preview": "import { useState } from 'react'\n\n/**\n * 콜백 함수에서 발생한 에러를 React ErrorBoundary가 잡을 수 있도록 해주는 함수\n */\nexport function useErr"
},
{
"path": "packages/react-hooks/src/use-fetch.ts",
"chars": 1653,
"preview": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useState } from 'react'\nimport isEqual from "
},
{
"path": "packages/react-hooks/src/use-interval.test.ts",
"chars": 2787,
"preview": "import { renderHook } from '@testing-library/react'\n\nimport { useInterval } from './use-interval'\n\ndescribe('useInterval"
},
{
"path": "packages/react-hooks/src/use-interval.ts",
"chars": 573,
"preview": "import { useEffect, useRef } from 'react'\n\n/**\n * @param {number|null} delay null인 경우 setInterval을 일시 중지한다.\n */\n\nexport "
},
{
"path": "packages/react-hooks/src/use-local-storage.test.ts",
"chars": 1717,
"preview": "import { act, renderHook } from '@testing-library/react'\n\nimport { useLocalStorage } from './use-local-storage'\n\nafterEa"
},
{
"path": "packages/react-hooks/src/use-local-storage.ts",
"chars": 2172,
"preview": "import { useCallback, useEffect, useSyncExternalStore } from 'react'\n\nconst inMemoryStorage = new Map<string, string | n"
},
{
"path": "packages/react-hooks/src/use-lottie.tsx",
"chars": 990,
"preview": "import Lottie, { SVGRendererConfig, AnimationItem } from 'lottie-web'\nimport { useRef, useEffect, useState } from 'react"
},
{
"path": "packages/react-hooks/src/use-scroll-to-anchor.ts",
"chars": 844,
"preview": "import { useEffect } from 'react'\nimport scrollToElement from 'scroll-to-element'\n\nexport function useScrollToAnchor(opt"
},
{
"path": "packages/react-hooks/src/use-scroll-to-element.ts",
"chars": 1004,
"preview": "import { useMemo, useRef } from 'react'\nimport scrollToElement from 'scroll-to-element'\n\n/**\n * 주어진 DOM 엘리먼트로 스크롤하는 함수를 "
},
{
"path": "packages/react-hooks/src/use-session-storage.test.ts",
"chars": 1753,
"preview": "import { act, renderHook } from '@testing-library/react'\n\nimport { useSessionStorage } from './use-session-storage'\n\naft"
},
{
"path": "packages/react-hooks/src/use-session-storage.ts",
"chars": 2188,
"preview": "import { useCallback, useEffect, useSyncExternalStore } from 'react'\n\nconst inMemoryStorage = new Map<string, string | n"
},
{
"path": "packages/react-hooks/src/use-visibility-change.ts",
"chars": 453,
"preview": "import { useEffect } from 'react'\n\nexport function useVisibilityChange(\n onChange: (visible: boolean) => void,\n deps: "
},
{
"path": "packages/react-hooks/tsconfig.build.json",
"chars": 323,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"emitDeclarationOnly\": true,\n "
},
{
"path": "packages/react-hooks/tsconfig.json",
"chars": 77,
"preview": "{\n \"extends\": \"../../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"lib\"]\n}\n"
},
{
"path": "packages/react-hooks/vite.config.mts",
"chars": 48,
"preview": "export { default } from '../../vite.config.mjs'\n"
},
{
"path": "packages/router/README.md",
"chars": 1754,
"preview": "# `@titicaca/router`\n\n페이지 라우팅 관련 컴포넌트와 훅을 모으는 패키지입니다.\n\n## link\n\n`LocalLink`, `ExternalLink`, `useHrefToProps`를 제공합니다.\n`L"
},
{
"path": "packages/router/package.json",
"chars": 1626,
"preview": "{\n \"name\": \"@titicaca/router\",\n \"version\": \"14.2.3\",\n \"description\": \"Triple Universal Router Component and Functions"
},
{
"path": "packages/router/src/common/add-web-url-base.test.tsx",
"chars": 1039,
"preview": "import { renderHook } from '@testing-library/react'\nimport { createTestWrapper } from '@titicaca/triple-web-test-utils'\n"
},
{
"path": "packages/router/src/common/add-web-url-base.ts",
"chars": 425,
"preview": "import { useEnv } from '@titicaca/triple-web'\nimport { generateUrl, parseUrl } from '@titicaca/view-utilities'\n\nexport f"
},
{
"path": "packages/router/src/common/default-router.ts",
"chars": 407,
"preview": "import { ANCHOR_TARGET_MAP, TargetProps } from './target'\nimport { HrefProps } from './types'\n\nexport default function u"
},
{
"path": "packages/router/src/common/disabled-link-notifier.test.tsx",
"chars": 4700,
"preview": "/* eslint-disable jest/no-conditional-expect */\n/* TODO: jest/no-conditional-expect 해결하기 */\nimport { act, renderHook, sc"
},
{
"path": "packages/router/src/common/disabled-link-notifier.ts",
"chars": 1369,
"preview": "import {\n useClientApp,\n useLoginCtaModal,\n useSessionAvailability,\n useAppInstallCtaModal,\n useTranslation,\n} from"
},
{
"path": "packages/router/src/common/router-guarded-link.test.tsx",
"chars": 2700,
"preview": "import { fireEvent, render, screen } from '@testing-library/react'\n\nimport { useDisabledLinkNotifierCreator } from './di"
},
{
"path": "packages/router/src/common/router-guarded-link.tsx",
"chars": 970,
"preview": "import { AnchorHTMLAttributes, PropsWithChildren } from 'react'\n\nimport {\n AllowSourceProps,\n useDisabledLinkNotifierC"
},
{
"path": "packages/router/src/common/target.ts",
"chars": 379,
"preview": "export type TargetType = 'current' | 'new' | 'browser'\n\nexport interface TargetProps {\n /**\n * 페이지를 이동할 목표를 설정합니다.\n "
}
]
// ... and 1223 more files (download for full content)
About this extraction
This page contains the full source code of the titicacadev/triple-frontend GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1423 files (2.7 MB), approximately 802.2k tokens, and a symbol index with 2403 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.