@petnow/ui 5.1.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +10 -8
  3. package/dist/{Popup-B2Q-le-6.js → Popup-DRf-ERpL.js} +3 -3
  4. package/dist/Popup-DRf-ERpL.js.map +1 -0
  5. package/dist/badge.js +338 -0
  6. package/dist/badge.js.map +1 -0
  7. package/dist/checkbox.js +38 -0
  8. package/dist/checkbox.js.map +1 -0
  9. package/dist/chip.js +53 -0
  10. package/dist/chip.js.map +1 -0
  11. package/dist/combobox.js +201 -0
  12. package/dist/combobox.js.map +1 -0
  13. package/dist/cta-button.js +62 -0
  14. package/dist/cta-button.js.map +1 -0
  15. package/dist/fieldStyles-DyZu__hI.js +42 -0
  16. package/dist/fieldStyles-DyZu__hI.js.map +1 -0
  17. package/dist/icons/action/cancel-filled.js +22 -0
  18. package/dist/icons/action/cancel-filled.js.map +1 -0
  19. package/dist/icons/action/cancel.js +19 -0
  20. package/dist/icons/action/cancel.js.map +1 -0
  21. package/dist/icons/action/chevron-down.js +19 -0
  22. package/dist/icons/action/chevron-down.js.map +1 -0
  23. package/dist/icons/action/chevron-left.js +19 -0
  24. package/dist/icons/action/chevron-left.js.map +1 -0
  25. package/dist/icons/action/chevron-right.js +19 -0
  26. package/dist/icons/action/chevron-right.js.map +1 -0
  27. package/dist/icons/action/chevron-up.js +19 -0
  28. package/dist/icons/action/chevron-up.js.map +1 -0
  29. package/dist/icons/action/filter.js +19 -0
  30. package/dist/icons/action/filter.js.map +1 -0
  31. package/dist/icons/action/retry.js +19 -0
  32. package/dist/icons/action/retry.js.map +1 -0
  33. package/dist/icons/action/sorting.js +19 -0
  34. package/dist/icons/action/sorting.js.map +1 -0
  35. package/dist/icons/static/close.js +19 -0
  36. package/dist/icons/static/close.js.map +1 -0
  37. package/dist/icons/static/delete.js +30 -0
  38. package/dist/icons/static/delete.js.map +1 -0
  39. package/dist/icons/static/recent.js +32 -0
  40. package/dist/icons/static/recent.js.map +1 -0
  41. package/dist/icons/static/report.js +28 -0
  42. package/dist/icons/static/report.js.map +1 -0
  43. package/dist/icons/static/shield-done.js +21 -0
  44. package/dist/icons/static/shield-done.js.map +1 -0
  45. package/dist/index.d.ts +25 -23
  46. package/dist/index.es.js +26 -24
  47. package/dist/mergeRefs-BHwdBwNQ.js +27 -0
  48. package/dist/mergeRefs-BHwdBwNQ.js.map +1 -0
  49. package/dist/popup.js +4 -0
  50. package/dist/radio.js +17 -0
  51. package/dist/radio.js.map +1 -0
  52. package/dist/select.js +82 -0
  53. package/dist/select.js.map +1 -0
  54. package/dist/src/components/checkbox/Checkbox.d.ts +11 -0
  55. package/dist/src/components/combobox/Combobox.d.ts +35 -0
  56. package/dist/src/components/select/Select.d.ts +24 -0
  57. package/dist/src/components/ui/field.d.ts +15 -0
  58. package/dist/src/components/ui/fieldStyles.d.ts +14 -0
  59. package/dist/src/utils/mergeRefs.d.ts +2 -0
  60. package/dist/tabs.js +73 -0
  61. package/dist/tabs.js.map +1 -0
  62. package/dist/text-field.js +252 -0
  63. package/dist/text-field.js.map +1 -0
  64. package/dist/toggle.js +21 -0
  65. package/dist/toggle.js.map +1 -0
  66. package/dist/v0/checkbox.js +1 -38
  67. package/dist/v0/radio.js +1 -17
  68. package/dist/v0/tabs.js +1 -73
  69. package/dist/v0/toggle.js +1 -21
  70. package/dist/v1/badge.js +1 -338
  71. package/dist/v1/chip.js +1 -53
  72. package/dist/v1/cta-button.js +1 -62
  73. package/dist/v1/icons/action/cancel-filled.js +1 -22
  74. package/dist/v1/icons/action/cancel.js +1 -19
  75. package/dist/v1/icons/action/chevron-down.js +1 -19
  76. package/dist/v1/icons/action/chevron-left.js +1 -19
  77. package/dist/v1/icons/action/chevron-right.js +1 -19
  78. package/dist/v1/icons/action/chevron-up.js +1 -19
  79. package/dist/v1/icons/action/filter.js +1 -19
  80. package/dist/v1/icons/action/retry.js +1 -19
  81. package/dist/v1/icons/action/sorting.js +1 -19
  82. package/dist/v1/icons/static/close.js +1 -19
  83. package/dist/v1/icons/static/delete.js +1 -30
  84. package/dist/v1/icons/static/recent.js +1 -32
  85. package/dist/v1/icons/static/report.js +1 -28
  86. package/dist/v1/icons/static/shield-done.js +1 -21
  87. package/dist/v1/popup.js +1 -4
  88. package/dist/v1/text-field.js +1 -286
  89. package/package.json +149 -48
  90. package/dist/Popup-B2Q-le-6.js.map +0 -1
  91. package/dist/src/components/v0/checkbox/Checkbox.d.ts +0 -10
  92. package/dist/v0/checkbox.js.map +0 -1
  93. package/dist/v0/radio.js.map +0 -1
  94. package/dist/v0/tabs.js.map +0 -1
  95. package/dist/v0/toggle.js.map +0 -1
  96. package/dist/v1/badge.js.map +0 -1
  97. package/dist/v1/chip.js.map +0 -1
  98. package/dist/v1/cta-button.js.map +0 -1
  99. package/dist/v1/icons/action/cancel-filled.js.map +0 -1
  100. package/dist/v1/icons/action/cancel.js.map +0 -1
  101. package/dist/v1/icons/action/chevron-down.js.map +0 -1
  102. package/dist/v1/icons/action/chevron-left.js.map +0 -1
  103. package/dist/v1/icons/action/chevron-right.js.map +0 -1
  104. package/dist/v1/icons/action/chevron-up.js.map +0 -1
  105. package/dist/v1/icons/action/filter.js.map +0 -1
  106. package/dist/v1/icons/action/retry.js.map +0 -1
  107. package/dist/v1/icons/action/sorting.js.map +0 -1
  108. package/dist/v1/icons/static/close.js.map +0 -1
  109. package/dist/v1/icons/static/delete.js.map +0 -1
  110. package/dist/v1/icons/static/recent.js.map +0 -1
  111. package/dist/v1/icons/static/report.js.map +0 -1
  112. package/dist/v1/icons/static/shield-done.js.map +0 -1
  113. package/dist/v1/text-field.js.map +0 -1
  114. /package/dist/src/components/{v1/badge → badge}/Badge.d.ts +0 -0
  115. /package/dist/src/components/{v1/chip → chip}/Chip.d.ts +0 -0
  116. /package/dist/src/components/{v1/cta-button → cta-button}/CTAButton.d.ts +0 -0
  117. /package/dist/src/components/{v1/icons → icons}/action/CancelFilledIcon.d.ts +0 -0
  118. /package/dist/src/components/{v1/icons → icons}/action/CancelIcon.d.ts +0 -0
  119. /package/dist/src/components/{v1/icons → icons}/action/ChevronDownIcon.d.ts +0 -0
  120. /package/dist/src/components/{v1/icons → icons}/action/ChevronLeftIcon.d.ts +0 -0
  121. /package/dist/src/components/{v1/icons → icons}/action/ChevronRightIcon.d.ts +0 -0
  122. /package/dist/src/components/{v1/icons → icons}/action/ChevronUpIcon.d.ts +0 -0
  123. /package/dist/src/components/{v1/icons → icons}/action/FilterIcon.d.ts +0 -0
  124. /package/dist/src/components/{v1/icons → icons}/action/RetryIcon.d.ts +0 -0
  125. /package/dist/src/components/{v1/icons → icons}/action/SortingIcon.d.ts +0 -0
  126. /package/dist/src/components/{v1/icons → icons}/static/CloseIcon.d.ts +0 -0
  127. /package/dist/src/components/{v1/icons → icons}/static/DeleteIcon.d.ts +0 -0
  128. /package/dist/src/components/{v1/icons → icons}/static/RecentIcon.d.ts +0 -0
  129. /package/dist/src/components/{v1/icons → icons}/static/ReportIcon.d.ts +0 -0
  130. /package/dist/src/components/{v1/icons → icons}/static/ShieldDoneIcon.d.ts +0 -0
  131. /package/dist/src/components/{v1/popup → popup}/Popup.d.ts +0 -0
  132. /package/dist/src/components/{v0/radio → radio}/Radio.d.ts +0 -0
  133. /package/dist/src/components/{v0/tabs → tabs}/Tabs.d.ts +0 -0
  134. /package/dist/src/components/{v1/text-field → text-field}/TextField.d.ts +0 -0
  135. /package/dist/src/components/{v0/toggle → toggle}/Toggle.d.ts +0 -0
package/dist/tabs.js ADDED
@@ -0,0 +1,73 @@
1
+ "use client";
2
+ import { t as e } from "./TailwindUtil-DiNvXuNl.js";
3
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
+ import { useKeenSlider as r } from "keen-slider/react.js";
5
+ import { useEffect as i, useRef as a, useState as o } from "react";
6
+ //#region src/components/tabs/Tabs.tsx
7
+ var s = ({ className: s, tabList: c, isCuratedcontent: l, unswipeableContent: u, defaultIndex: d = 0, onTabChange: f, disabled: p, allowScrollToSection: m = !0 }) => {
8
+ let [h, g] = o(d), _ = a(null), v = a(h), y = a(f);
9
+ i(() => {
10
+ v.current = h, y.current = f;
11
+ });
12
+ let [b, x] = r({
13
+ initial: d,
14
+ drag: !p,
15
+ dragEnded: (e) => {
16
+ let t = e.track.absToRel(e.animator.targetIdx ?? e.track.details.abs);
17
+ t !== v.current && (g(t), y.current?.(t));
18
+ }
19
+ }), S = (e) => {
20
+ e.current && window.scrollTo({
21
+ top: e.current.offsetTop - 50,
22
+ behavior: "smooth"
23
+ });
24
+ }, C = (e) => {
25
+ g(e), v.current = e, m && S(_), x.current?.moveToIdx(e), f?.(e);
26
+ };
27
+ return /* @__PURE__ */ n("div", {
28
+ ref: _,
29
+ className: "w-full",
30
+ children: [
31
+ /* @__PURE__ */ n("div", {
32
+ className: e(s?.tab, `z-50 mb-[20px] flex w-full flex-col bg-white ${l && "sticky top-[50px]"}`),
33
+ children: [/* @__PURE__ */ t("div", {
34
+ className: "flex",
35
+ children: c.map((n, r) => /* @__PURE__ */ t("div", {
36
+ className: "flex flex-1 flex-col",
37
+ children: /* @__PURE__ */ t("button", {
38
+ className: e(s?.tabTitle, `cursor-pointer ${h === r ? "text-petnow-grey-30 text-label-large" : "text-petnow-grey-70 text-body-large disabled:opacity-40"}`),
39
+ onClick: () => C(r),
40
+ disabled: p,
41
+ children: n.displayName
42
+ })
43
+ }, n.key))
44
+ }), /* @__PURE__ */ t("div", {
45
+ className: e(s?.underline, `relative h-[2px] w-full ${p ? "bg-petnow-grey-70/40" : "bg-petnow-grey-70"}`),
46
+ children: /* @__PURE__ */ t("div", {
47
+ className: e(s?.selectedUnderline, "bg-petnow-grey-30 absolute h-[2px] transition-all duration-200"),
48
+ style: (() => {
49
+ let e = 100 / c.length;
50
+ return {
51
+ width: `${e}%`,
52
+ left: `${h * e}%`
53
+ };
54
+ })()
55
+ })
56
+ })]
57
+ }),
58
+ u,
59
+ /* @__PURE__ */ t("div", {
60
+ ref: b,
61
+ className: "keen-slider relative flex w-full touch-pan-y content-start overflow-hidden select-none [-webkit-tap-highlight-color:transparent] [-webkit-touch-callout:none]",
62
+ children: c.map((e) => /* @__PURE__ */ t("div", {
63
+ className: "keen-slider__slide relative min-h-full w-full overflow-hidden",
64
+ children: e.content
65
+ }, e.key))
66
+ })
67
+ ]
68
+ });
69
+ };
70
+ //#endregion
71
+ export { s as default };
72
+
73
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","names":[],"sources":["../src/components/tabs/Tabs.tsx"],"sourcesContent":["\"use client\";\n\n// keen-slider has no `exports` map, so Node ESM needs the full file name. The CommonJS build loads\n// in Node ESM, Jest and bundlers alike; `react.es.js` breaks CommonJS test runners.\nimport { useKeenSlider } from \"keen-slider/react.js\";\nimport { ReactNode, useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"../../utils/TailwindUtil\";\n\ninterface TabItem {\n readonly displayName: string;\n readonly key: string;\n readonly content: ReactNode;\n}\n\ninterface Props<T extends TabItem> {\n tabList: Readonly<T[]>;\n isCuratedcontent?: true;\n unswipeableContent?: ReactNode;\n defaultIndex?: number;\n onTabChange?: (index: number) => void;\n disabled?: boolean;\n className?: {\n tab?: string;\n tabTitle?: string;\n selectedUnderline?: string;\n underline?: string;\n };\n allowScrollToSection?: boolean;\n}\n\nconst Tabs = <T extends TabItem>({\n className,\n tabList,\n isCuratedcontent,\n unswipeableContent,\n defaultIndex = 0,\n onTabChange,\n disabled,\n allowScrollToSection = true,\n}: Props<T>) => {\n const [currentTabIndex, setCurrentTabIndex] = useState<number>(defaultIndex);\n const TabRef = useRef<HTMLDivElement>(null);\n // keen-slider keeps the callbacks it was created with, so they read the latest values from refs.\n const currentTabIndexRef = useRef(currentTabIndex);\n const onTabChangeRef = useRef(onTabChange);\n\n useEffect(() => {\n currentTabIndexRef.current = currentTabIndex;\n onTabChangeRef.current = onTabChange;\n });\n\n // When a swipe is released, keen-slider has already started snapping and `animator.targetIdx`\n // holds the tab it lands on, so the tab changes once per swipe, as with react-swipeable-views.\n const [sliderRef, slider] = useKeenSlider<HTMLDivElement>({\n initial: defaultIndex,\n drag: !disabled,\n dragEnded: (instance) => {\n const index = instance.track.absToRel(instance.animator.targetIdx ?? instance.track.details.abs);\n if (index === currentTabIndexRef.current) return;\n setCurrentTabIndex(index);\n onTabChangeRef.current?.(index);\n },\n });\n\n const scrollToSection = (elementRef: React.RefObject<HTMLDivElement | null>) => {\n if (elementRef.current) {\n window.scrollTo({\n top: elementRef.current.offsetTop - 50,\n behavior: \"smooth\",\n });\n }\n };\n\n const handleTabClick = (index: number) => {\n setCurrentTabIndex(index);\n currentTabIndexRef.current = index;\n if (allowScrollToSection) scrollToSection(TabRef);\n slider.current?.moveToIdx(index);\n onTabChange?.(index);\n };\n\n const underlineStyle = () => {\n const listLength = tabList.length;\n const widthPercent = 100 / listLength;\n return {\n width: `${widthPercent}%`,\n left: `${currentTabIndex * widthPercent}%`,\n };\n };\n\n return (\n <div ref={TabRef} className=\"w-full\">\n <div\n className={cn(\n className?.tab,\n `z-50 mb-[20px] flex w-full flex-col bg-white ${isCuratedcontent && \"sticky top-[50px]\"}`,\n )}\n >\n <div className=\"flex\">\n {tabList.map((tab, index) => (\n <div key={tab.key} className=\"flex flex-1 flex-col\">\n <button\n className={cn(\n className?.tabTitle,\n `cursor-pointer ${\n currentTabIndex === index\n ? \"text-petnow-grey-30 text-label-large\"\n : \"text-petnow-grey-70 text-body-large disabled:opacity-40\"\n }`,\n )}\n onClick={() => handleTabClick(index)}\n disabled={disabled}\n >\n {tab.displayName}\n </button>\n </div>\n ))}\n </div>\n <div\n className={cn(\n className?.underline,\n `relative h-[2px] w-full ${disabled ? \"bg-petnow-grey-70/40\" : \"bg-petnow-grey-70\"}`,\n )}\n >\n <div\n className={cn(\n className?.selectedUnderline,\n \"bg-petnow-grey-30 absolute h-[2px] transition-all duration-200\",\n )}\n style={underlineStyle()}\n />\n </div>\n </div>\n\n {unswipeableContent}\n\n {/*\n keen-slider.min.css as utilities, so the consumer's Tailwind build emits them and Node never\n imports CSS. Tabs never sets the reverse or vertical options, so their rules are left out.\n */}\n <div\n ref={sliderRef}\n className=\"keen-slider relative flex w-full touch-pan-y content-start overflow-hidden select-none [-webkit-tap-highlight-color:transparent] [-webkit-touch-callout:none]\"\n >\n {tabList.map((tab) => (\n <div key={tab.key} className=\"keen-slider__slide relative min-h-full w-full overflow-hidden\">\n {tab.content}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default Tabs;\n"],"mappings":";;;;;;AA+BA,IAAM,KAA2B,EAC/B,cACA,YACA,qBACA,uBACA,kBAAe,GACf,gBACA,aACA,0BAAuB,SACT;CACd,IAAM,CAAC,GAAiB,KAAsB,EAAiB,CAAY,GACrE,IAAS,EAAuB,IAAI,GAEpC,IAAqB,EAAO,CAAe,GAC3C,IAAiB,EAAO,CAAW;CAEzC,QAAgB;EAEd,AADA,EAAmB,UAAU,GAC7B,EAAe,UAAU;CAC3B,CAAC;CAID,IAAM,CAAC,GAAW,KAAU,EAA8B;EACxD,SAAS;EACT,MAAM,CAAC;EACP,YAAY,MAAa;GACvB,IAAM,IAAQ,EAAS,MAAM,SAAS,EAAS,SAAS,aAAa,EAAS,MAAM,QAAQ,GAAG;GAC3F,MAAU,EAAmB,YACjC,EAAmB,CAAK,GACxB,EAAe,UAAU,CAAK;EAChC;CACF,CAAC,GAEK,KAAmB,MAAuD;EAC9E,AAAI,EAAW,WACb,OAAO,SAAS;GACd,KAAK,EAAW,QAAQ,YAAY;GACpC,UAAU;EACZ,CAAC;CAEL,GAEM,KAAkB,MAAkB;EAKxC,AAJA,EAAmB,CAAK,GACxB,EAAmB,UAAU,GACzB,KAAsB,EAAgB,CAAM,GAChD,EAAO,SAAS,UAAU,CAAK,GAC/B,IAAc,CAAK;CACrB;CAWA,OACE,kBAAC,OAAD;EAAK,KAAK;EAAQ,WAAU;YAA5B;GACE,kBAAC,OAAD;IACE,WAAW,EACT,GAAW,KACX,gDAAgD,KAAoB,qBACtE;cAJF,CAME,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAQ,KAAK,GAAK,MACjB,kBAAC,OAAD;MAAmB,WAAU;gBAC3B,kBAAC,UAAD;OACE,WAAW,EACT,GAAW,UACX,kBACE,MAAoB,IAChB,yCACA,2DAER;OACA,eAAe,EAAe,CAAK;OACzB;iBAET,EAAI;MACC,CAAA;KACL,GAfK,EAAI,GAeT,CACN;IACE,CAAA,GACL,kBAAC,OAAD;KACE,WAAW,EACT,GAAW,WACX,2BAA2B,IAAW,yBAAyB,qBACjE;eAEA,kBAAC,OAAD;MACE,WAAW,EACT,GAAW,mBACX,gEACF;MACA,cAhDmB;OAE3B,IAAM,IAAe,MADF,EAAQ;OAE3B,OAAO;QACL,OAAO,GAAG,EAAa;QACvB,MAAM,GAAG,IAAkB,EAAa;OAC1C;MACF,EAyCiB,CAAe;KACvB,CAAA;IACE,CAAA,CACF;;GAEJ;GAMD,kBAAC,OAAD;IACE,KAAK;IACL,WAAU;cAET,EAAQ,KAAK,MACZ,kBAAC,OAAD;KAAmB,WAAU;eAC1B,EAAI;IACF,GAFK,EAAI,GAET,CACN;GACE,CAAA;EACF;;AAET"}
@@ -0,0 +1,252 @@
1
+ "use client";
2
+ import { t as e } from "./TailwindUtil-DiNvXuNl.js";
3
+ import { CTAButton as t } from "./cta-button.js";
4
+ import { CancelFilledIcon as n } from "./icons/action/cancel-filled.js";
5
+ import { ChevronLeftIcon as r } from "./icons/action/chevron-left.js";
6
+ import { i, n as a } from "./fieldStyles-DyZu__hI.js";
7
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
8
+ import * as c from "react";
9
+ import { cva as l } from "class-variance-authority";
10
+ //#region src/components/text-field/TextField.tsx
11
+ var u = c.forwardRef(({ onChange: t, subtitle: r, isRequired: l = !1, assistiveText: u, errorText: d, disabled: f = !1, multiLine: p = !1, className: m, rightElement: h, showCounter: g = !1, value: _, maxLength: v, size: y = "large", ...b }, x) => {
12
+ let S = !!d, C = c.useRef(null);
13
+ c.useImperativeHandle(x, () => C.current);
14
+ let w = c.useCallback(() => {
15
+ C.current?.focus();
16
+ }, []), T = (typeof _ == "string" ? _ : "").length, E = b, D = b, O = y === "large" ? "text-title-20-regular" : "text-body-16-regular", k = y === "large" ? "text-title-18-bold" : "text-title-14-bold", A = y === "large" ? "text-body-16-regular" : "text-caption-12-medium";
17
+ return /* @__PURE__ */ s("div", {
18
+ className: e("flex flex-col gap-2", m),
19
+ children: [
20
+ r && /* @__PURE__ */ s("span", {
21
+ className: e(k, "text-text-base-neutral-5"),
22
+ children: [r, l && /* @__PURE__ */ o("span", {
23
+ className: "text-text-prominent-accent-1",
24
+ children: "*"
25
+ })]
26
+ }),
27
+ /* @__PURE__ */ s("div", {
28
+ onClick: f ? void 0 : w,
29
+ className: e("group overflow-hidden", a({
30
+ size: y,
31
+ disabled: f,
32
+ hasError: S
33
+ }), !f && !S && "focus-within:border-border-base-neutral-4", p && "h-[120px] items-start"),
34
+ children: [
35
+ p ? /* @__PURE__ */ o("textarea", {
36
+ ...D,
37
+ onChange: t,
38
+ ref: C,
39
+ value: _,
40
+ maxLength: v,
41
+ disabled: f,
42
+ className: e("text-text-base-neutral-5 placeholder:text-text-base-neutral-2 h-full min-h-[24px] min-w-0 flex-1 border-none bg-transparent py-0 outline-none", O, "resize-none overflow-y-auto")
43
+ }) : /* @__PURE__ */ o("input", {
44
+ ...E,
45
+ onChange: t,
46
+ ref: C,
47
+ value: _,
48
+ maxLength: v,
49
+ disabled: f,
50
+ className: e("text-text-base-neutral-5 placeholder:text-text-base-neutral-2 min-h-[24px] min-w-0 flex-1 border-none bg-transparent py-0 outline-none", O, "overflow-hidden text-ellipsis whitespace-nowrap")
51
+ }),
52
+ h && /* @__PURE__ */ o("div", {
53
+ className: "shrink-0",
54
+ children: h
55
+ }),
56
+ /* @__PURE__ */ o("button", {
57
+ type: "button",
58
+ onClick: () => t && t({ target: { value: "" } }),
59
+ tabIndex: -1,
60
+ disabled: f,
61
+ className: e("hidden shrink-0", {
62
+ flex: S,
63
+ "group-focus-within:flex": !f && T > 0
64
+ }),
65
+ children: /* @__PURE__ */ o(n, { className: "text-icon-base-neutral-3 h-6 w-6 shrink-0 cursor-pointer" })
66
+ })
67
+ ]
68
+ }),
69
+ (u || d || v && g) && /* @__PURE__ */ s("div", {
70
+ className: "flex items-center justify-between gap-2",
71
+ children: [(u || d) && /* @__PURE__ */ o("span", {
72
+ className: e(A, i({
73
+ size: y,
74
+ hasError: S
75
+ })),
76
+ children: d || u
77
+ }), v && g && /* @__PURE__ */ s("span", {
78
+ className: e("ml-auto", A, i({
79
+ size: y,
80
+ hasError: S
81
+ })),
82
+ children: [
83
+ T,
84
+ "/",
85
+ v
86
+ ]
87
+ })]
88
+ })
89
+ ]
90
+ });
91
+ });
92
+ u.displayName = "TextFieldNormal";
93
+ var d = l("flex items-center justify-between rounded-[4px] bg-surface-base-neutral-2 border transition-colors duration-200", {
94
+ variants: {
95
+ size: {
96
+ large: "gap-2 p-[15px] min-h-[56px]",
97
+ small: "gap-3 p-[11px] min-h-[48px]"
98
+ },
99
+ hasError: {
100
+ true: "border-border-prominent-error",
101
+ false: "border-transparent"
102
+ },
103
+ disabled: {
104
+ true: "opacity-50",
105
+ false: ""
106
+ }
107
+ },
108
+ defaultVariants: { size: "large" }
109
+ }), f = ({ label: t, placeholder: n, value: a, isRequired: c = !1, disabled: l = !1, assistiveText: u, errorText: f, onPress: p, className: m, size: h = "large" }) => {
110
+ let g = !!f, _ = h === "large" ? "text-title-18-bold" : "text-title-14-bold", v = h === "large" ? "text-title-20-regular" : "text-body-16-regular";
111
+ return /* @__PURE__ */ s("div", {
112
+ className: e("flex w-full flex-col gap-2", m),
113
+ children: [
114
+ t && /* @__PURE__ */ s("div", {
115
+ className: "flex items-start",
116
+ children: [/* @__PURE__ */ o("span", {
117
+ className: e(_, "text-text-base-neutral-5"),
118
+ children: t
119
+ }), c && /* @__PURE__ */ o("span", {
120
+ className: e(_, "text-text-prominent-accent-1"),
121
+ children: "*"
122
+ })]
123
+ }),
124
+ /* @__PURE__ */ s("button", {
125
+ type: "button",
126
+ className: d({
127
+ size: h,
128
+ hasError: g,
129
+ disabled: l
130
+ }),
131
+ onClick: p,
132
+ disabled: l,
133
+ children: [/* @__PURE__ */ o("span", {
134
+ className: e(v, "flex-1", a ? "text-text-base-neutral-5" : "text-text-base-neutral-2"),
135
+ style: {
136
+ textAlign: "left",
137
+ overflow: "hidden",
138
+ textOverflow: "ellipsis"
139
+ },
140
+ children: a || n
141
+ }), /* @__PURE__ */ o(r, { className: "text-icon-base-neutral-3 rotate-270" })]
142
+ }),
143
+ (u || f) && /* @__PURE__ */ o("div", {
144
+ className: "flex items-start gap-2",
145
+ children: /* @__PURE__ */ o("span", {
146
+ className: i({
147
+ size: h,
148
+ hasError: g
149
+ }),
150
+ children: f || u
151
+ })
152
+ })
153
+ ]
154
+ });
155
+ }, p = c.forwardRef(({ onChange: r, subtitle: l, isRequired: u = !1, assistiveText: d, errorText: f, disabled: p = !1, multiLine: m = !1, className: h, showCounter: g = !1, value: _, maxLength: v, size: y = "large", fieldRightElement: b, buttonText: x, onButtonClick: S, buttonDisabled: C = !1, ...w }, T) => {
156
+ let E = !!f, D = c.useRef(null);
157
+ c.useImperativeHandle(T, () => D.current);
158
+ let O = c.useCallback(() => {
159
+ D.current?.focus();
160
+ }, []), k = (typeof _ == "string" ? _ : "").length, A = w, j = w, M = y === "large" ? "text-title-20-regular" : "text-body-16-regular", N = y === "large" ? "text-title-18-bold" : "text-title-14-bold", P = y === "large" ? "text-body-16-regular" : "text-caption-12-medium";
161
+ return /* @__PURE__ */ s("div", {
162
+ className: e("flex flex-col gap-2", h),
163
+ children: [
164
+ l && /* @__PURE__ */ s("span", {
165
+ className: e(N, "text-text-base-neutral-5"),
166
+ children: [l, u && /* @__PURE__ */ o("span", {
167
+ className: "text-text-prominent-accent-1",
168
+ children: "*"
169
+ })]
170
+ }),
171
+ /* @__PURE__ */ s("div", {
172
+ className: "flex items-center gap-2",
173
+ children: [/* @__PURE__ */ s("div", {
174
+ onClick: p ? void 0 : O,
175
+ className: e("group flex-1 overflow-hidden", a({
176
+ size: y,
177
+ disabled: p,
178
+ hasError: E
179
+ }), !p && !E && "focus-within:border-border-base-neutral-4", m && "h-[120px] items-start"),
180
+ children: [
181
+ m ? /* @__PURE__ */ o("textarea", {
182
+ ...j,
183
+ onChange: r,
184
+ ref: D,
185
+ value: _,
186
+ maxLength: v,
187
+ disabled: p,
188
+ className: e("text-text-base-neutral-5 placeholder:text-text-base-neutral-2 min-h-[24px] min-w-0 flex-1 border-none bg-transparent py-0 outline-none", M, "resize-none overflow-y-auto")
189
+ }) : /* @__PURE__ */ o("input", {
190
+ ...A,
191
+ onChange: r,
192
+ ref: D,
193
+ value: _,
194
+ maxLength: v,
195
+ disabled: p,
196
+ className: e("text-text-base-neutral-5 placeholder:text-text-base-neutral-2 min-h-[24px] min-w-0 flex-1 border-none bg-transparent py-0 outline-none", M, "overflow-hidden text-ellipsis whitespace-nowrap")
197
+ }),
198
+ b && /* @__PURE__ */ o("div", {
199
+ className: "shrink-0",
200
+ children: b
201
+ }),
202
+ /* @__PURE__ */ o("button", {
203
+ type: "button",
204
+ onClick: () => r && r({ target: { value: "" } }),
205
+ tabIndex: -1,
206
+ disabled: p,
207
+ className: e("hidden shrink-0", {
208
+ flex: E,
209
+ "group-focus-within:flex": !p && k > 0
210
+ }),
211
+ children: /* @__PURE__ */ o(n, { className: "text-icon-base-neutral-3 h-6 w-6 shrink-0 cursor-pointer" })
212
+ })
213
+ ]
214
+ }), /* @__PURE__ */ o("div", {
215
+ className: "shrink-0",
216
+ children: /* @__PURE__ */ o(t, {
217
+ label: x,
218
+ onClick: S,
219
+ size: "medium",
220
+ hierarchy: "tertiary",
221
+ disabled: C || p
222
+ })
223
+ })]
224
+ }),
225
+ (d || f || v && g) && /* @__PURE__ */ s("div", {
226
+ className: "flex items-center justify-between gap-2",
227
+ children: [(d || f) && /* @__PURE__ */ o("span", {
228
+ className: e(P, i({
229
+ size: y,
230
+ hasError: E
231
+ })),
232
+ children: f || d
233
+ }), v && g && /* @__PURE__ */ s("span", {
234
+ className: e("ml-auto", P, i({
235
+ size: y,
236
+ hasError: E
237
+ })),
238
+ children: [
239
+ k,
240
+ "/",
241
+ v
242
+ ]
243
+ })]
244
+ })
245
+ ]
246
+ });
247
+ });
248
+ p.displayName = "TextFieldWithButton";
249
+ //#endregion
250
+ export { u as TextFieldNormal, f as TextFieldSelect, p as TextFieldWithButton };
251
+
252
+ //# sourceMappingURL=text-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-field.js","names":[],"sources":["../src/components/text-field/TextField.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva, VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { CTAButton } from \"../cta-button/CTAButton\";\nimport { CancelFilledIcon } from \"../icons/action/CancelFilledIcon\";\nimport { ChevronLeftIcon } from \"../icons/action/ChevronLeftIcon\";\n\nimport {\n fieldContainerVariants as textFieldNormalContainerVariants,\n fieldMessageVariants as textFieldAssistiveAreaVariants,\n} from \"@/components/ui/fieldStyles\";\nimport { cn } from \"@/utils/TailwindUtil\";\n\ninterface TextFieldNormalProps extends Omit<React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>, \"size\"> {\n subtitle?: string;\n isRequired?: boolean;\n assistiveText?: string | React.ReactNode;\n errorText?: string;\n disabled?: boolean;\n multiLine?: boolean;\n className?: string;\n rightElement?: React.ReactNode;\n showCounter?: boolean;\n size?: \"large\" | \"small\";\n}\n\nconst TextFieldNormal = React.forwardRef<HTMLInputElement | HTMLTextAreaElement, TextFieldNormalProps>(\n (\n {\n onChange,\n subtitle,\n isRequired = false,\n assistiveText,\n errorText,\n disabled = false,\n multiLine = false,\n className,\n rightElement,\n showCounter = false,\n value,\n maxLength,\n size = \"large\",\n ...inputProps\n },\n ref,\n ) => {\n const hasError = !!errorText;\n const inputRef = React.useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n\n React.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement | HTMLTextAreaElement);\n\n const handleContainerClick = React.useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n const stringValue = typeof value === \"string\" ? value : \"\";\n const currentLength = stringValue.length;\n\n const inputPropsForInput = inputProps as React.ComponentPropsWithoutRef<\"input\">;\n const inputPropsForTextarea = inputProps as React.ComponentPropsWithoutRef<\"textarea\">;\n\n // 사이즈별 폰트 크기\n const inputFontSize = size === \"large\" ? \"text-title-20-regular\" : \"text-body-16-regular\";\n const subtitleFontSize = size === \"large\" ? \"text-title-18-bold\" : \"text-title-14-bold\";\n const assistiveFontSize = size === \"large\" ? \"text-body-16-regular\" : \"text-caption-12-medium\";\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n {subtitle && (\n <span className={cn(subtitleFontSize, \"text-text-base-neutral-5\")}>\n {subtitle}\n {isRequired && <span className=\"text-text-prominent-accent-1\">*</span>}\n </span>\n )}\n\n <div\n onClick={disabled ? undefined : handleContainerClick}\n className={cn(\n \"group overflow-hidden\",\n textFieldNormalContainerVariants({ size, disabled, hasError }),\n !disabled && !hasError && \"focus-within:border-border-base-neutral-4\",\n multiLine && \"h-[120px] items-start\",\n )}\n >\n {multiLine ? (\n <textarea\n {...inputPropsForTextarea}\n onChange={onChange}\n ref={inputRef as React.Ref<HTMLTextAreaElement>}\n value={value}\n maxLength={maxLength}\n disabled={disabled}\n className={cn(\n \"text-text-base-neutral-5 placeholder:text-text-base-neutral-2 h-full min-h-[24px] min-w-0 flex-1 border-none bg-transparent py-0 outline-none\",\n inputFontSize,\n \"resize-none overflow-y-auto\",\n )}\n />\n ) : (\n <input\n {...inputPropsForInput}\n onChange={onChange}\n ref={inputRef as React.Ref<HTMLInputElement>}\n value={value}\n maxLength={maxLength}\n disabled={disabled}\n className={cn(\n \"text-text-base-neutral-5 placeholder:text-text-base-neutral-2 min-h-[24px] min-w-0 flex-1 border-none bg-transparent py-0 outline-none\",\n inputFontSize,\n \"overflow-hidden text-ellipsis whitespace-nowrap\",\n )}\n />\n )}\n\n {rightElement && <div className=\"shrink-0\">{rightElement}</div>}\n\n <button\n type=\"button\"\n onClick={() =>\n onChange &&\n onChange({ target: { value: \"\" } } as React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>)\n }\n tabIndex={-1}\n disabled={disabled}\n className={cn(\"hidden shrink-0\", {\n flex: hasError,\n \"group-focus-within:flex\": !disabled && currentLength > 0,\n })}\n >\n <CancelFilledIcon className=\"text-icon-base-neutral-3 h-6 w-6 shrink-0 cursor-pointer\" />\n </button>\n </div>\n\n {(assistiveText || errorText || (maxLength && showCounter)) && (\n <div className=\"flex items-center justify-between gap-2\">\n {(assistiveText || errorText) && (\n <span className={cn(assistiveFontSize, textFieldAssistiveAreaVariants({ size, hasError }))}>\n {errorText || assistiveText}\n </span>\n )}\n {maxLength && showCounter && (\n <span className={cn(\"ml-auto\", assistiveFontSize, textFieldAssistiveAreaVariants({ size, hasError }))}>\n {currentLength}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n );\n },\n);\nTextFieldNormal.displayName = \"TextFieldNormal\";\n\n// TextField Select 컴포넌트\nconst textFieldSelectVariants = cva(\n \"flex items-center justify-between rounded-[4px] bg-surface-base-neutral-2 border transition-colors duration-200\",\n {\n variants: {\n size: {\n large: \"gap-2 p-[15px] min-h-[56px]\",\n small: \"gap-3 p-[11px] min-h-[48px]\",\n },\n hasError: {\n true: \"border-border-prominent-error\",\n false: \"border-transparent\",\n },\n disabled: {\n true: \"opacity-50\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"large\",\n },\n },\n);\n\ninterface TextFieldSelectProps extends VariantProps<typeof textFieldSelectVariants> {\n label?: string;\n placeholder: string;\n value?: string;\n isRequired?: boolean;\n disabled?: boolean;\n assistiveText?: string | React.ReactNode;\n errorText?: string;\n onPress?: () => void;\n className?: string;\n size?: \"large\" | \"small\";\n}\n\nconst TextFieldSelect = ({\n label,\n placeholder,\n value,\n isRequired = false,\n disabled = false,\n assistiveText,\n errorText,\n onPress,\n className,\n size = \"large\",\n}: TextFieldSelectProps) => {\n const hasError = !!errorText;\n\n // 사이즈별 폰트 크기\n const labelFontSize = size === \"large\" ? \"text-title-18-bold\" : \"text-title-14-bold\";\n const valueFontSize = size === \"large\" ? \"text-title-20-regular\" : \"text-body-16-regular\";\n\n return (\n <div className={cn(\"flex w-full flex-col gap-2\", className)}>\n {/* Label with optional asterisk */}\n {label && (\n <div className=\"flex items-start\">\n <span className={cn(labelFontSize, \"text-text-base-neutral-5\")}>{label}</span>\n {isRequired && <span className={cn(labelFontSize, \"text-text-prominent-accent-1\")}>*</span>}\n </div>\n )}\n {/* Select Field */}\n <button\n type=\"button\"\n className={textFieldSelectVariants({ size, hasError, disabled })}\n onClick={onPress}\n disabled={disabled}\n >\n <span\n className={cn(valueFontSize, \"flex-1\", value ? \"text-text-base-neutral-5\" : \"text-text-base-neutral-2\")}\n style={{ textAlign: \"left\", overflow: \"hidden\", textOverflow: \"ellipsis\" }}\n >\n {value || placeholder}\n </span>\n <ChevronLeftIcon className=\"text-icon-base-neutral-3 rotate-270\" />\n </button>\n {/* Assistive/Error Text */}\n {(assistiveText || errorText) && (\n <div className=\"flex items-start gap-2\">\n <span className={textFieldAssistiveAreaVariants({ size, hasError })}>{errorText || assistiveText}</span>\n </div>\n )}\n </div>\n );\n};\n\n// TextField With Button 컴포넌트\ninterface TextFieldWithButtonProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>, \"size\"> {\n subtitle?: string;\n isRequired?: boolean;\n assistiveText?: string | React.ReactNode;\n errorText?: string;\n disabled?: boolean;\n multiLine?: boolean;\n className?: string;\n showCounter?: boolean;\n size?: \"large\" | \"small\";\n fieldRightElement?: React.ReactNode;\n buttonText: string;\n onButtonClick: () => void;\n buttonDisabled?: boolean;\n}\n\nconst TextFieldWithButton = React.forwardRef<HTMLInputElement | HTMLTextAreaElement, TextFieldWithButtonProps>(\n (\n {\n onChange,\n subtitle,\n isRequired = false,\n assistiveText,\n errorText,\n disabled = false,\n multiLine = false,\n className,\n showCounter = false,\n value,\n maxLength,\n size = \"large\",\n fieldRightElement,\n buttonText,\n onButtonClick,\n buttonDisabled = false,\n ...inputProps\n },\n ref,\n ) => {\n const hasError = !!errorText;\n const inputRef = React.useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n\n React.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement | HTMLTextAreaElement);\n\n const handleContainerClick = React.useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n const stringValue = typeof value === \"string\" ? value : \"\";\n const currentLength = stringValue.length;\n\n const inputPropsForInput = inputProps as React.ComponentPropsWithoutRef<\"input\">;\n const inputPropsForTextarea = inputProps as React.ComponentPropsWithoutRef<\"textarea\">;\n\n // 사이즈별 폰트 크기\n const inputFontSize = size === \"large\" ? \"text-title-20-regular\" : \"text-body-16-regular\";\n const subtitleFontSize = size === \"large\" ? \"text-title-18-bold\" : \"text-title-14-bold\";\n const assistiveFontSize = size === \"large\" ? \"text-body-16-regular\" : \"text-caption-12-medium\";\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n {subtitle && (\n <span className={cn(subtitleFontSize, \"text-text-base-neutral-5\")}>\n {subtitle}\n {isRequired && <span className=\"text-text-prominent-accent-1\">*</span>}\n </span>\n )}\n\n <div className=\"flex items-center gap-2\">\n <div\n onClick={disabled ? undefined : handleContainerClick}\n className={cn(\n \"group flex-1 overflow-hidden\",\n textFieldNormalContainerVariants({ size, disabled, hasError }),\n !disabled && !hasError && \"focus-within:border-border-base-neutral-4\",\n multiLine && \"h-[120px] items-start\",\n )}\n >\n {multiLine ? (\n <textarea\n {...inputPropsForTextarea}\n onChange={onChange}\n ref={inputRef as React.Ref<HTMLTextAreaElement>}\n value={value}\n maxLength={maxLength}\n disabled={disabled}\n className={cn(\n \"text-text-base-neutral-5 placeholder:text-text-base-neutral-2 min-h-[24px] min-w-0 flex-1 border-none bg-transparent py-0 outline-none\",\n inputFontSize,\n \"resize-none overflow-y-auto\",\n )}\n />\n ) : (\n <input\n {...inputPropsForInput}\n onChange={onChange}\n ref={inputRef as React.Ref<HTMLInputElement>}\n value={value}\n maxLength={maxLength}\n disabled={disabled}\n className={cn(\n \"text-text-base-neutral-5 placeholder:text-text-base-neutral-2 min-h-[24px] min-w-0 flex-1 border-none bg-transparent py-0 outline-none\",\n inputFontSize,\n \"overflow-hidden text-ellipsis whitespace-nowrap\",\n )}\n />\n )}\n\n {fieldRightElement && <div className=\"shrink-0\">{fieldRightElement}</div>}\n\n <button\n type=\"button\"\n onClick={() =>\n onChange &&\n onChange({ target: { value: \"\" } } as React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>)\n }\n tabIndex={-1}\n disabled={disabled}\n className={cn(\"hidden shrink-0\", {\n flex: hasError,\n \"group-focus-within:flex\": !disabled && currentLength > 0,\n })}\n >\n <CancelFilledIcon className=\"text-icon-base-neutral-3 h-6 w-6 shrink-0 cursor-pointer\" />\n </button>\n </div>\n\n <div className=\"shrink-0\">\n <CTAButton\n label={buttonText}\n onClick={onButtonClick}\n size=\"medium\"\n hierarchy=\"tertiary\"\n disabled={buttonDisabled || disabled}\n />\n </div>\n </div>\n\n {(assistiveText || errorText || (maxLength && showCounter)) && (\n <div className=\"flex items-center justify-between gap-2\">\n {(assistiveText || errorText) && (\n <span className={cn(assistiveFontSize, textFieldAssistiveAreaVariants({ size, hasError }))}>\n {errorText || assistiveText}\n </span>\n )}\n {maxLength && showCounter && (\n <span className={cn(\"ml-auto\", assistiveFontSize, textFieldAssistiveAreaVariants({ size, hasError }))}>\n {currentLength}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n );\n },\n);\nTextFieldWithButton.displayName = \"TextFieldWithButton\";\n\nexport { TextFieldNormal, TextFieldSelect, TextFieldWithButton };\n"],"mappings":"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"}
package/dist/toggle.js ADDED
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { t as e } from "./TailwindUtil-DiNvXuNl.js";
3
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
+ //#region src/components/toggle/Toggle.tsx
5
+ var r = ({ className: r, id: i, name: a, onChange: o, disabled: s, isChecked: c }) => /* @__PURE__ */ n("label", {
6
+ htmlFor: i,
7
+ className: "relative inline-flex cursor-pointer items-center",
8
+ children: [/* @__PURE__ */ t("input", {
9
+ type: "checkbox",
10
+ disabled: s,
11
+ checked: c,
12
+ id: i,
13
+ name: a,
14
+ className: "peer sr-only",
15
+ onChange: o
16
+ }), /* @__PURE__ */ t("div", { className: e(r, "bg-surface-base-neutral-4 peer-checked:bg-surface-primary-accent h-[32px] w-[52px] rounded-full duration-[250ms] peer-focus:outline-none after:absolute after:start-[2px] after:top-[3px] after:size-[26px] after:rounded-full after:bg-white after:shadow-[0_3px_8px_0_rgba(0,0,0,0.15)] after:transition-all after:duration-[250ms] after:content-[''] peer-checked:after:translate-x-[calc(100%-4px)] peer-checked:after:border-white", s && "cursor-not-allowed opacity-50") })]
17
+ });
18
+ //#endregion
19
+ export { r as default };
20
+
21
+ //# sourceMappingURL=toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.js","names":[],"sources":["../src/components/toggle/Toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../../utils/TailwindUtil\";\n\ninterface Props {\n className?: string;\n id?: string;\n name?: string;\n onChange: () => void;\n disabled?: boolean;\n isChecked?: boolean;\n}\n\nconst Toggle = ({ className, id, name, onChange, disabled, isChecked }: Props) => {\n return (\n <label htmlFor={id} className=\"relative inline-flex cursor-pointer items-center\">\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isChecked}\n id={id}\n name={name}\n className=\"peer sr-only\"\n onChange={onChange}\n />\n <div\n className={cn(\n className,\n // TODO(PROD-662): 그림자(shadow) 토큰이 없어 기존 값을 유지한다. 토큰 추가 후 교체.\n // eslint-disable-next-line design-tokens/no-hardcoded-color\n \"bg-surface-base-neutral-4 peer-checked:bg-surface-primary-accent h-[32px] w-[52px] rounded-full duration-[250ms] peer-focus:outline-none after:absolute after:start-[2px] after:top-[3px] after:size-[26px] after:rounded-full after:bg-white after:shadow-[0_3px_8px_0_rgba(0,0,0,0.15)] after:transition-all after:duration-[250ms] after:content-[''] peer-checked:after:translate-x-[calc(100%-4px)] peer-checked:after:border-white\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n />\n </label>\n );\n};\n\nexport default Toggle;\n"],"mappings":";;;;AAaA,IAAM,KAAU,EAAE,cAAW,OAAI,SAAM,aAAU,aAAU,mBAEvD,kBAAC,SAAD;CAAO,SAAS;CAAI,WAAU;WAA9B,CACE,kBAAC,SAAD;EACE,MAAK;EACK;EACV,SAAS;EACL;EACE;EACN,WAAU;EACA;CACX,CAAA,GACD,kBAAC,OAAD,EACE,WAAW,EACT,GAGA,4aACA,KAAY,+BACd,EACD,CAAA,CACI"}
@@ -1,38 +1 @@
1
- "use client";
2
- import { t as e } from "../TailwindUtil-DiNvXuNl.js";
3
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
- //#region src/components/v0/checkbox/Checkbox.tsx
5
- var r = ({ className: r, id: i, onChange: a, disabled: o, isChecked: s, ...c }) => /* @__PURE__ */ n("label", {
6
- className: "relative flex h-min w-min cursor-pointer items-center rounded-full",
7
- htmlFor: i,
8
- children: [/* @__PURE__ */ t("input", {
9
- ...c,
10
- type: "checkbox",
11
- disabled: o,
12
- className: e("peer bg-petnow-grey-primary checked:bg-surface-primary-accent focus-visible:outline-border-prominent-accent relative size-6 cursor-pointer appearance-none rounded-xl border border-transparent transition-all focus-visible:outline-2 focus-visible:outline-offset-2", r),
13
- id: i,
14
- checked: s,
15
- onChange: (e) => {
16
- a?.(e.target.checked);
17
- }
18
- }), /* @__PURE__ */ t("span", {
19
- className: "text-petnow-grey-secondary peer-checked:text-icon-prominent-neutral pointer-events-none absolute top-2/4 left-2/4 -translate-x-2/4 -translate-y-2/4 transition",
20
- children: /* @__PURE__ */ t("svg", {
21
- xmlns: "http://www.w3.org/2000/svg",
22
- className: "h-4 w-4",
23
- viewBox: "0 0 20 20",
24
- fill: "currentColor",
25
- stroke: "currentColor",
26
- strokeWidth: "1",
27
- children: /* @__PURE__ */ t("path", {
28
- fillRule: "evenodd",
29
- d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
30
- clipRule: "evenodd"
31
- })
32
- })
33
- })]
34
- });
35
- //#endregion
36
- export { r as default };
37
-
38
- //# sourceMappingURL=checkbox.js.map
1
+ export { default } from "../checkbox.js";
package/dist/v0/radio.js CHANGED
@@ -1,17 +1 @@
1
- "use client";
2
- import { t as e } from "../TailwindUtil-DiNvXuNl.js";
3
- import { jsx as t } from "react/jsx-runtime";
4
- //#region src/components/v0/radio/Radio.tsx
5
- var n = ({ className: n, id: r, name: i, onChange: a, disabled: o, isChecked: s }) => /* @__PURE__ */ t("input", {
6
- type: "radio",
7
- disabled: o,
8
- checked: s,
9
- id: r,
10
- name: i,
11
- className: e("petnowRadio", n),
12
- onChange: a
13
- });
14
- //#endregion
15
- export { n as default };
16
-
17
- //# sourceMappingURL=radio.js.map
1
+ export { default } from "../radio.js";
package/dist/v0/tabs.js CHANGED
@@ -1,73 +1 @@
1
- "use client";
2
- import { t as e } from "../TailwindUtil-DiNvXuNl.js";
3
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
- import { useKeenSlider as r } from "keen-slider/react.js";
5
- import { useEffect as i, useRef as a, useState as o } from "react";
6
- //#region src/components/v0/tabs/Tabs.tsx
7
- var s = ({ className: s, tabList: c, isCuratedcontent: l, unswipeableContent: u, defaultIndex: d = 0, onTabChange: f, disabled: p, allowScrollToSection: m = !0 }) => {
8
- let [h, g] = o(d), _ = a(null), v = a(h), y = a(f);
9
- i(() => {
10
- v.current = h, y.current = f;
11
- });
12
- let [b, x] = r({
13
- initial: d,
14
- drag: !p,
15
- dragEnded: (e) => {
16
- let t = e.track.absToRel(e.animator.targetIdx ?? e.track.details.abs);
17
- t !== v.current && (g(t), y.current?.(t));
18
- }
19
- }), S = (e) => {
20
- e.current && window.scrollTo({
21
- top: e.current.offsetTop - 50,
22
- behavior: "smooth"
23
- });
24
- }, C = (e) => {
25
- g(e), v.current = e, m && S(_), x.current?.moveToIdx(e), f?.(e);
26
- };
27
- return /* @__PURE__ */ n("div", {
28
- ref: _,
29
- className: "w-full",
30
- children: [
31
- /* @__PURE__ */ n("div", {
32
- className: e(s?.tab, `z-50 mb-[20px] flex w-full flex-col bg-white ${l && "sticky top-[50px]"}`),
33
- children: [/* @__PURE__ */ t("div", {
34
- className: "flex",
35
- children: c.map((n, r) => /* @__PURE__ */ t("div", {
36
- className: "flex flex-1 flex-col",
37
- children: /* @__PURE__ */ t("button", {
38
- className: e(s?.tabTitle, `cursor-pointer ${h === r ? "text-petnow-grey-30 text-label-large" : "text-petnow-grey-70 text-body-large disabled:opacity-40"}`),
39
- onClick: () => C(r),
40
- disabled: p,
41
- children: n.displayName
42
- })
43
- }, n.key))
44
- }), /* @__PURE__ */ t("div", {
45
- className: e(s?.underline, `relative h-[2px] w-full ${p ? "bg-petnow-grey-70/40" : "bg-petnow-grey-70"}`),
46
- children: /* @__PURE__ */ t("div", {
47
- className: e(s?.selectedUnderline, "bg-petnow-grey-30 absolute h-[2px] transition-all duration-200"),
48
- style: (() => {
49
- let e = 100 / c.length;
50
- return {
51
- width: `${e}%`,
52
- left: `${h * e}%`
53
- };
54
- })()
55
- })
56
- })]
57
- }),
58
- u,
59
- /* @__PURE__ */ t("div", {
60
- ref: b,
61
- className: "keen-slider relative flex w-full touch-pan-y content-start overflow-hidden select-none [-webkit-tap-highlight-color:transparent] [-webkit-touch-callout:none]",
62
- children: c.map((e) => /* @__PURE__ */ t("div", {
63
- className: "keen-slider__slide relative min-h-full w-full overflow-hidden",
64
- children: e.content
65
- }, e.key))
66
- })
67
- ]
68
- });
69
- };
70
- //#endregion
71
- export { s as default };
72
-
73
- //# sourceMappingURL=tabs.js.map
1
+ export { default } from "../tabs.js";
package/dist/v0/toggle.js CHANGED
@@ -1,21 +1 @@
1
- "use client";
2
- import { t as e } from "../TailwindUtil-DiNvXuNl.js";
3
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
- //#region src/components/v0/toggle/Toggle.tsx
5
- var r = ({ className: r, id: i, name: a, onChange: o, disabled: s, isChecked: c }) => /* @__PURE__ */ n("label", {
6
- htmlFor: i,
7
- className: "relative inline-flex cursor-pointer items-center",
8
- children: [/* @__PURE__ */ t("input", {
9
- type: "checkbox",
10
- disabled: s,
11
- checked: c,
12
- id: i,
13
- name: a,
14
- className: "peer sr-only",
15
- onChange: o
16
- }), /* @__PURE__ */ t("div", { className: e(r, "bg-surface-base-neutral-4 peer-checked:bg-surface-primary-accent h-[32px] w-[52px] rounded-full duration-[250ms] peer-focus:outline-none after:absolute after:start-[2px] after:top-[3px] after:size-[26px] after:rounded-full after:bg-white after:shadow-[0_3px_8px_0_rgba(0,0,0,0.15)] after:transition-all after:duration-[250ms] after:content-[''] peer-checked:after:translate-x-[calc(100%-4px)] peer-checked:after:border-white", s && "cursor-not-allowed opacity-50") })]
17
- });
18
- //#endregion
19
- export { r as default };
20
-
21
- //# sourceMappingURL=toggle.js.map
1
+ export { default } from "../toggle.js";