diff --git a/apps/web/src/routes/(authentication)/sign-in/index.tsx b/apps/web/src/routes/(authentication)/sign-in/index.tsx index 5e57e5d..e966c12 100644 --- a/apps/web/src/routes/(authentication)/sign-in/index.tsx +++ b/apps/web/src/routes/(authentication)/sign-in/index.tsx @@ -32,4 +32,4 @@ export default component$(() => { ); }); -export const head: DocumentHead = generateSeoConfig({ title: 'Sign up' }); +export const head: DocumentHead = generateSeoConfig({ title: 'Sign in' }); diff --git a/apps/web/src/routes/(authentication)/sign-up/index.tsx b/apps/web/src/routes/(authentication)/sign-up/index.tsx index d82c6e7..38c1fc9 100644 --- a/apps/web/src/routes/(authentication)/sign-up/index.tsx +++ b/apps/web/src/routes/(authentication)/sign-up/index.tsx @@ -32,4 +32,4 @@ export default component$(() => { ); }); -export const head: DocumentHead = generateSeoConfig({ title: 'Sign in' }); +export const head: DocumentHead = generateSeoConfig({ title: 'Sign up' }); diff --git a/apps/web/src/routes/(landing)/(contents)/privacy/index.tsx b/apps/web/src/routes/(landing)/(contents)/privacy/index.tsx new file mode 100644 index 0000000..3156629 --- /dev/null +++ b/apps/web/src/routes/(landing)/(contents)/privacy/index.tsx @@ -0,0 +1,68 @@ +import { component$ } from '@builder.io/qwik'; +import { DocumentHead } from '@builder.io/qwik-city'; +import { Box, Text } from '@producktivity/ui'; +import { generateSeoConfig } from '../../../../configs/seo'; + +export default component$(() => { + return ( + + + + Privacy Policy + + + นโยบายคุ้มครองข้อมูลส่วนบุคคล + + + +     เรารวบรวมข้อมูลเกี่ยวกับกิจกรรมของคุณในบริการของเราเพื่อติดต่อสอบถามข้อมูล การบริการ / ตรวจสอบรายละเอียดการสั่งซื้อสินค้า/จัดทำรายการสั่งซื้อ +     ทางเราได้จัดทำประกาศนโยบายความเป็นส่วนตัวนี้เพื่อแจ้งให้ทราบถึงนโยบายความเป็นส่วนตัว รายละเอียดการรวบรวมข้อมูล เพื่อการเปิดเผย วิเคราะห์ผลทางธุรกิจ และอื่น ๆ ตามพระราชบัญญัติ คุมครองข้อมูลส่วนบุคคล พ.ศ. 2562 หรือก็คือ PDPA เพราะทางเราตระหนักถึงความสำคัญ + + + ข้อมูลส่วนบุคคลที่เก็บรวบรวม + + +
  • ช่องทางการติดต่อ
  • +
  • อีเมล หมายเลขโทรศัพท์
  • +
  • รายละเอียดการชำระเงิน
  • +
  • ข้อความที่คุณค้นหา
  • +
  • บุคคลที่ผู้ใช้งานแชร์เนื้อหาด้วย
  • +
  • รูปภาพ
  • +
  • IP address
  • +
  • cookie
  • +
    + + + การปกป้องข้อมูลส่วนบุคคล + +     มาตรการรักษาความปลอดภัยทางอิเล็กทรอนิกส์บนมาตรฐาน SSL ซึ่งช่วยลดความเสี่ยงในการถูกเข้าถึงข้อมูลของท่านโดยบุคคลที่ไม่ได้รับอนุญาต + + + การเปิดเภยข้อมูลต่อบุคคลภายนอก + +     ข้อมูลที่มีผลต่อการดำเนินธุรกิจ เรามีความจำเป็นต้องเปิดเผยข้อมูลส่วนบุคคลให้บุคคลที่สาม ตัวอย่างข้อมูลเช่น เพื่อการคิดโปรโมชั่น ทั้งนี้ทางเราขอรับรองว่า จะไม่นำข้อมูลส่วนบุคคลที่ทางเราได้เก็บรวบรวมไปเผยแพร่ในที่สาธารณะ หรือทำการขายข้อมูลให้กับบุคลที่ไม่เกี่ยวข้องโดยเด็ดขาด ยกเว้นกรณีที่มีผลทางกฏหมาย + + + ระยะเวลาการเก็บรักษาข้อมูลส่วนบุคคล + +     ทางเราจะเก็บรักษาข้อมูลส่วนบุคคลของผู้ใช้งานไว้ตามเท่าที่กำหนดสำหรับวัตถุประสงค์ของการเก็บข้อมูล และทางเราจะลบข้อมูลส่วนบุคคลเมื่อเห็นว่าข้อมูลนั้นไม่ตรงตามวัตถุประสงค์ และจะลบข้อมูลที่ไม่จำเป็นต่อการให้บริการโดยทันทีหลังจากที่ไม่ได้ใช้งาน + + + การใช้คุกกี้ + +     ทางเราจะใช้นโยบายที่สอดคล้องกับการเปลี่ยนแปลงของบริการ ดำเนินงานภายใต้กฏหมาย โดยทางเราจะเปิดเผยนโยบายการให้ผู้ใช้งานทราบผ่านเว็บไซต์ อย่างชัดเจนเมื่อมีการเยี่ยมชมเว็บไซต์ โปรดอ่านนโยบายการคุ้มครองข้อมูลส่วนบุคคลทุกครั้งเพื่อผลประโยชน์ของผู้ใช้งาน โดยที่ผู้ใช้งานสามารถตั้งค่าการเข้าถึงข้อมูลได้ + + + วิธีการติดต่อ + +     หากมีคำถาม ข้อเสนอแนะ หรือต้องการรายละเอียดเพิ่มเติมเกี่ยวกับ ประกาศ นโยบายความเป็นส่วนตัว หรือต้องการติดต่อเรื่องการใช้สิทธิ์ของคุณ โปรดติดต่อ xxxx + + การยกเลิกความยินยอม + +     ผู้ใช้งานสามารถเลือกยกเลิกความยินยอมในการใช้ข้อมูลส่วนบุคคลของท่านได้ตลอดเวลา โดยติดต่อเราทางอีเมลหรือตามช่องทางการติดต่อที่ระบุไว้ในเว็บไซต์ของเรา +
    +
    + ); +}); + +export const head: DocumentHead = generateSeoConfig({ title: 'Privacy Policy' }); diff --git a/apps/web/src/routes/(landing)/(contents)/terms/index.tsx b/apps/web/src/routes/(landing)/(contents)/terms/index.tsx new file mode 100644 index 0000000..e35f734 --- /dev/null +++ b/apps/web/src/routes/(landing)/(contents)/terms/index.tsx @@ -0,0 +1,33 @@ +import { component$ } from '@builder.io/qwik'; +import { DocumentHead } from '@builder.io/qwik-city'; +import { Box, Text } from '@producktivity/ui'; +import { generateSeoConfig } from '../../../../configs/seo'; + +export default component$(() => { + return ( + + + + Terms of Service + + + ข้อกำหนดและเงื่อนไขในการใช้บริการ + + + + + คุณสมบัติของผู้ใช้งาน + +     ไม่สมัครสมาชิกโดยใช้ในนามของผู้อื่นในการยืนยันตัวตน + + + การสมัครสมาชิก + +
  •   การสมัครสมาชิกเพื่อเพิ่มระกับการใช้งานรายเดือน ทางเราจะตัดยอดเงินทุก ๆ วันที่ 2 ของแต่ละเดือน เป็นการต่ออายุอัตโนมัติ หากผู้ใช้งานไม่มีการเตรียมเงินในช่องทางที่เลือกไว้เพียงพอ เครดิตการใช้งานที่คงเหลือยังสามารถใช้ได้จนหมดเครดิตการใช้งาน เป็นเครดิตสะสม
  • +
  •   หากต้องการยกเลิกการสมัครสมาชิก ต้องกดยกเลิกการสมัครก่อนการตัดยอดของเดือนนั้น ๆ อย่างน้อย 3 วัน และเมื่อกดยกเลิกยังสามารถใช้ยอดเครดิตได้จนถึงวันที่ 1 ของเดือนถัดไป
  • +
    +
    + ); +}); + +export const head: DocumentHead = generateSeoConfig({ title: 'Terms of Service' }); diff --git a/libs/web/shared/ui/src/lib/box/box.props.ts b/libs/web/shared/ui/src/lib/box/box.props.ts index be03c76..baf23f2 100644 --- a/libs/web/shared/ui/src/lib/box/box.props.ts +++ b/libs/web/shared/ui/src/lib/box/box.props.ts @@ -19,4 +19,5 @@ export interface BoxProps extends NativeDiv, PaddingProps, MarginProps, SizeProp variant?: BoxVariant; align?: BoxAlignment; direction?: BoxDirection; + prose?: boolean; } diff --git a/libs/web/shared/ui/src/styles.css b/libs/web/shared/ui/src/styles.css index b706115..f786eca 100644 --- a/libs/web/shared/ui/src/styles.css +++ b/libs/web/shared/ui/src/styles.css @@ -16,4 +16,4 @@ body, body { @apply min-h-dvh; -} +} \ No newline at end of file diff --git a/libs/web/shared/ui/tailwind.config.ts b/libs/web/shared/ui/tailwind.config.ts index 61bb9ea..46fdbad 100644 --- a/libs/web/shared/ui/tailwind.config.ts +++ b/libs/web/shared/ui/tailwind.config.ts @@ -1,6 +1,7 @@ import type { Config } from 'tailwindcss'; import { join } from 'path'; +import typography from '@tailwindcss/typography'; import { fontFamily } from 'tailwindcss/defaultTheme'; export default { @@ -78,7 +79,78 @@ export default { }, }, }, + typography: { + DEFAULT: { + css: [ + { + color: 'rgb(var(--on-surface))', + maxWidth: '48rem', + '[class~="lead"]': { + color: 'rgb(var(--on-surface-variant))', + }, + a: { + color: 'rgb(var(--primary))', + }, + 'ol > li::marker': { + color: 'rgb(var(--on-surface))', + }, + 'ul > li::marker': { + color: 'rgb(var(--on-surface))', + }, + dt: { + color: 'rgb(var(--on-surface))', + }, + hr: { + borderColor: 'rgb(var(--on-surface))', + }, + blockquote: { + color: 'rgb(var(--primary))', + borderInlineStartColor: 'rgb(var(--primary))', + }, + h1: { + color: 'rgb(var(--primary))', + }, + h2: { + color: 'rgb(var(--secondary))', + }, + h3: { + color: 'rgb(var(--tertiary))', + }, + h4: { + color: 'rgb(var(--on-surface))', + }, + kbd: { + color: 'rgb(var(--on-surface))', + boxShadow: '0 0 0 1px rgb(var(--on-surface) / 10%), 0 3px 0 rgb(var(--on-surface) / 10%)', + }, + code: { + color: 'rgb(var(--on-surface))', + }, + pre: { + color: 'rgb(var(--on-surface-variant))', + backgroundColor: 'rgb(var(--surface-variant))', + }, + thead: { + borderBottomColor: 'rgb(var(--outline))', + }, + 'thead th': { + color: 'rgb(var(--primary))', + }, + 'tbody tr': { + borderBottomColor: 'rgb(var(--outline))', + }, + tfoot: { + borderTopColor: 'rgb(var(--outline))', + }, + figcaption: { + color: 'rgb(var(--on-surface))', + }, + }, + ], + }, + + }, }, }, - plugins: [], + plugins: [typography], } satisfies Config; diff --git a/package.json b/package.json index 0a7e467..e1211df 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@storybook/addon-links": "^7.6.7", "@storybook/addon-themes": "^7.6.7", "@storybook/core-server": "^7.6.7", + "@tailwindcss/typography": "^0.5.12", "@tanstack/qwik-table": "^8.15.0", "@types/jest": "^29.4.0", "@types/node": "^20.11.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 306cbb0..3ed3148 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,6 +68,9 @@ importers: '@storybook/core-server': specifier: ^7.6.7 version: 7.6.10 + '@tailwindcss/typography': + specifier: ^0.5.12 + version: 0.5.12(tailwindcss@3.4.1) '@tanstack/qwik-table': specifier: ^8.15.0 version: 8.15.0(@builder.io/qwik@1.4.2) @@ -4863,6 +4866,18 @@ packages: tslib: 2.6.2 dev: true + /@tailwindcss/typography@0.5.12(tailwindcss@3.4.1): + resolution: {integrity: sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.1 + dev: true + /@tanstack/qwik-table@8.15.0(@builder.io/qwik@1.4.2): resolution: {integrity: sha512-gkZGjzwfb38CwJKJkyZy+kF6Iihwgul574/J3rZUcoHsphd/AyZRjjsPiA4E9NDi2XU9UtOyC9YDIPE/O0agxQ==} engines: {node: '>=12'} @@ -9387,6 +9402,10 @@ packages: p-locate: 5.0.0 dev: true + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: true + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true @@ -9399,6 +9418,10 @@ packages: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} dev: true + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true @@ -10735,6 +10758,14 @@ packages: postcss-selector-parser: 6.0.15 dev: true + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + /postcss-selector-parser@6.0.15: resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} engines: {node: '>=4'}