@petnow/ui 5.0.1 → 5.2.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.
- package/CHANGELOG.md +45 -0
- package/README.md +10 -8
- package/dist/{Popup-B2Q-le-6.js → Popup-DRf-ERpL.js} +3 -3
- package/dist/Popup-DRf-ERpL.js.map +1 -0
- package/dist/badge.js +338 -0
- package/dist/badge.js.map +1 -0
- package/dist/checkbox.js +38 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chip.js +53 -0
- package/dist/chip.js.map +1 -0
- package/dist/cta-button.js +62 -0
- package/dist/cta-button.js.map +1 -0
- package/dist/icons/action/cancel-filled.js +22 -0
- package/dist/icons/action/cancel-filled.js.map +1 -0
- package/dist/icons/action/cancel.js +19 -0
- package/dist/icons/action/cancel.js.map +1 -0
- package/dist/icons/action/chevron-down.js +19 -0
- package/dist/icons/action/chevron-down.js.map +1 -0
- package/dist/icons/action/chevron-left.js +19 -0
- package/dist/icons/action/chevron-left.js.map +1 -0
- package/dist/icons/action/chevron-right.js +19 -0
- package/dist/icons/action/chevron-right.js.map +1 -0
- package/dist/icons/action/chevron-up.js +19 -0
- package/dist/icons/action/chevron-up.js.map +1 -0
- package/dist/icons/action/filter.js +19 -0
- package/dist/icons/action/filter.js.map +1 -0
- package/dist/icons/action/retry.js +19 -0
- package/dist/icons/action/retry.js.map +1 -0
- package/dist/icons/action/sorting.js +19 -0
- package/dist/icons/action/sorting.js.map +1 -0
- package/dist/icons/static/close.js +19 -0
- package/dist/icons/static/close.js.map +1 -0
- package/dist/icons/static/delete.js +30 -0
- package/dist/icons/static/delete.js.map +1 -0
- package/dist/icons/static/recent.js +32 -0
- package/dist/icons/static/recent.js.map +1 -0
- package/dist/icons/static/report.js +28 -0
- package/dist/icons/static/report.js.map +1 -0
- package/dist/icons/static/shield-done.js +21 -0
- package/dist/icons/static/shield-done.js.map +1 -0
- package/dist/index.d.ts +23 -23
- package/dist/index.es.js +23 -23
- package/dist/popup.js +4 -0
- package/dist/radio.js +17 -0
- package/dist/radio.js.map +1 -0
- package/dist/src/components/{v0/checkbox → checkbox}/Checkbox.d.ts +3 -2
- package/dist/tabs.js +73 -0
- package/dist/tabs.js.map +1 -0
- package/dist/text-field.js +286 -0
- package/dist/text-field.js.map +1 -0
- package/dist/toggle.js +21 -0
- package/dist/toggle.js.map +1 -0
- package/dist/v0/checkbox.js +1 -37
- package/dist/v0/radio.js +1 -17
- package/dist/v0/tabs.js +1 -73
- package/dist/v0/toggle.js +1 -21
- package/dist/v1/badge.js +1 -338
- package/dist/v1/chip.js +1 -53
- package/dist/v1/cta-button.js +1 -62
- package/dist/v1/icons/action/cancel-filled.js +1 -22
- package/dist/v1/icons/action/cancel.js +1 -19
- package/dist/v1/icons/action/chevron-down.js +1 -19
- package/dist/v1/icons/action/chevron-left.js +1 -19
- package/dist/v1/icons/action/chevron-right.js +1 -19
- package/dist/v1/icons/action/chevron-up.js +1 -19
- package/dist/v1/icons/action/filter.js +1 -19
- package/dist/v1/icons/action/retry.js +1 -19
- package/dist/v1/icons/action/sorting.js +1 -19
- package/dist/v1/icons/static/close.js +1 -19
- package/dist/v1/icons/static/delete.js +1 -30
- package/dist/v1/icons/static/recent.js +1 -32
- package/dist/v1/icons/static/report.js +1 -28
- package/dist/v1/icons/static/shield-done.js +1 -21
- package/dist/v1/popup.js +1 -4
- package/dist/v1/text-field.js +1 -286
- package/package.json +148 -52
- package/dist/Popup-B2Q-le-6.js.map +0 -1
- package/dist/v0/checkbox.js.map +0 -1
- package/dist/v0/radio.js.map +0 -1
- package/dist/v0/tabs.js.map +0 -1
- package/dist/v0/toggle.js.map +0 -1
- package/dist/v1/badge.js.map +0 -1
- package/dist/v1/chip.js.map +0 -1
- package/dist/v1/cta-button.js.map +0 -1
- package/dist/v1/icons/action/cancel-filled.js.map +0 -1
- package/dist/v1/icons/action/cancel.js.map +0 -1
- package/dist/v1/icons/action/chevron-down.js.map +0 -1
- package/dist/v1/icons/action/chevron-left.js.map +0 -1
- package/dist/v1/icons/action/chevron-right.js.map +0 -1
- package/dist/v1/icons/action/chevron-up.js.map +0 -1
- package/dist/v1/icons/action/filter.js.map +0 -1
- package/dist/v1/icons/action/retry.js.map +0 -1
- package/dist/v1/icons/action/sorting.js.map +0 -1
- package/dist/v1/icons/static/close.js.map +0 -1
- package/dist/v1/icons/static/delete.js.map +0 -1
- package/dist/v1/icons/static/recent.js.map +0 -1
- package/dist/v1/icons/static/report.js.map +0 -1
- package/dist/v1/icons/static/shield-done.js.map +0 -1
- package/dist/v1/text-field.js.map +0 -1
- /package/dist/src/components/{v1/badge → badge}/Badge.d.ts +0 -0
- /package/dist/src/components/{v1/chip → chip}/Chip.d.ts +0 -0
- /package/dist/src/components/{v1/cta-button → cta-button}/CTAButton.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/CancelFilledIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/CancelIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/ChevronDownIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/ChevronLeftIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/ChevronRightIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/ChevronUpIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/FilterIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/RetryIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/action/SortingIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/static/CloseIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/static/DeleteIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/static/RecentIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/static/ReportIcon.d.ts +0 -0
- /package/dist/src/components/{v1/icons → icons}/static/ShieldDoneIcon.d.ts +0 -0
- /package/dist/src/components/{v1/popup → popup}/Popup.d.ts +0 -0
- /package/dist/src/components/{v0/radio → radio}/Radio.d.ts +0 -0
- /package/dist/src/components/{v0/tabs → tabs}/Tabs.d.ts +0 -0
- /package/dist/src/components/{v1/text-field → text-field}/TextField.d.ts +0 -0
- /package/dist/src/components/{v0/toggle → toggle}/Toggle.d.ts +0 -0
package/dist/radio.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
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/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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio.js","names":[],"sources":["../src/components/radio/Radio.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 Radio = ({ className, id, name, onChange, disabled, isChecked }: Props) => {\n return (\n <input\n type=\"radio\"\n disabled={disabled}\n checked={isChecked}\n id={id}\n name={name}\n className={cn(\"petnowRadio\", className)}\n onChange={onChange}\n />\n );\n};\n\nexport default Radio;\n"],"mappings":";;;;AAaA,IAAM,KAAS,EAAE,cAAW,OAAI,SAAM,aAAU,aAAU,mBAEtD,kBAAC,SAAD;CACE,MAAK;CACK;CACV,SAAS;CACL;CACE;CACN,WAAW,EAAG,eAAe,CAAS;CAC5B;AACX,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import { ComponentPropsWithoutRef } from 'react';
|
|
2
|
+
interface Props extends Omit<ComponentPropsWithoutRef<"input">, "type" | "checked" | "onChange"> {
|
|
2
3
|
className?: string;
|
|
3
4
|
id?: string;
|
|
4
5
|
onChange?: (newValue: boolean) => void;
|
|
5
6
|
disabled?: boolean;
|
|
6
7
|
isChecked?: boolean;
|
|
7
8
|
}
|
|
8
|
-
declare const Checkbox: ({ className, id, onChange, disabled, isChecked }: Props) => import("react").JSX.Element;
|
|
9
|
+
declare const Checkbox: ({ className, id, onChange, disabled, isChecked, ...inputProps }: Props) => import("react").JSX.Element;
|
|
9
10
|
export default Checkbox;
|
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
|
package/dist/tabs.js.map
ADDED
|
@@ -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,286 @@
|
|
|
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 { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
7
|
+
import * as o from "react";
|
|
8
|
+
import { cva as s } from "class-variance-authority";
|
|
9
|
+
//#region src/components/text-field/TextField.tsx
|
|
10
|
+
var c = s("flex items-center rounded-[4px] bg-surface-base-neutral-2 border transition-colors duration-200", {
|
|
11
|
+
variants: {
|
|
12
|
+
size: {
|
|
13
|
+
large: "gap-2 p-[15px] min-h-[56px]",
|
|
14
|
+
small: "gap-3 p-[11px] min-h-[48px]"
|
|
15
|
+
},
|
|
16
|
+
hasError: {
|
|
17
|
+
true: "border-border-prominent-error",
|
|
18
|
+
false: "border-transparent"
|
|
19
|
+
},
|
|
20
|
+
disabled: {
|
|
21
|
+
true: "opacity-50",
|
|
22
|
+
false: ""
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
size: "large",
|
|
27
|
+
disabled: !1,
|
|
28
|
+
hasError: !1
|
|
29
|
+
}
|
|
30
|
+
}), l = s("", {
|
|
31
|
+
variants: {
|
|
32
|
+
size: {
|
|
33
|
+
large: "text-body-16-regular",
|
|
34
|
+
small: "text-caption-12-medium"
|
|
35
|
+
},
|
|
36
|
+
hasError: {
|
|
37
|
+
true: "text-text-prominent-error",
|
|
38
|
+
false: "text-text-base-neutral-2"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
defaultVariants: {
|
|
42
|
+
size: "large",
|
|
43
|
+
hasError: !1
|
|
44
|
+
}
|
|
45
|
+
}), u = o.forwardRef(({ onChange: t, subtitle: r, isRequired: s = !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) => {
|
|
46
|
+
let S = !!d, C = o.useRef(null);
|
|
47
|
+
o.useImperativeHandle(x, () => C.current);
|
|
48
|
+
let w = o.useCallback(() => {
|
|
49
|
+
C.current?.focus();
|
|
50
|
+
}, []), 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";
|
|
51
|
+
return /* @__PURE__ */ a("div", {
|
|
52
|
+
className: e("flex flex-col gap-2", m),
|
|
53
|
+
children: [
|
|
54
|
+
r && /* @__PURE__ */ a("span", {
|
|
55
|
+
className: e(k, "text-text-base-neutral-5"),
|
|
56
|
+
children: [r, s && /* @__PURE__ */ i("span", {
|
|
57
|
+
className: "text-text-prominent-accent-1",
|
|
58
|
+
children: "*"
|
|
59
|
+
})]
|
|
60
|
+
}),
|
|
61
|
+
/* @__PURE__ */ a("div", {
|
|
62
|
+
onClick: f ? void 0 : w,
|
|
63
|
+
className: e("group overflow-hidden", c({
|
|
64
|
+
size: y,
|
|
65
|
+
disabled: f,
|
|
66
|
+
hasError: S
|
|
67
|
+
}), !f && !S && "focus-within:border-border-base-neutral-4", p && "h-[120px] items-start"),
|
|
68
|
+
children: [
|
|
69
|
+
p ? /* @__PURE__ */ i("textarea", {
|
|
70
|
+
...D,
|
|
71
|
+
onChange: t,
|
|
72
|
+
ref: C,
|
|
73
|
+
value: _,
|
|
74
|
+
maxLength: v,
|
|
75
|
+
disabled: f,
|
|
76
|
+
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")
|
|
77
|
+
}) : /* @__PURE__ */ i("input", {
|
|
78
|
+
...E,
|
|
79
|
+
onChange: t,
|
|
80
|
+
ref: C,
|
|
81
|
+
value: _,
|
|
82
|
+
maxLength: v,
|
|
83
|
+
disabled: f,
|
|
84
|
+
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")
|
|
85
|
+
}),
|
|
86
|
+
h && /* @__PURE__ */ i("div", {
|
|
87
|
+
className: "shrink-0",
|
|
88
|
+
children: h
|
|
89
|
+
}),
|
|
90
|
+
/* @__PURE__ */ i("button", {
|
|
91
|
+
type: "button",
|
|
92
|
+
onClick: () => t && t({ target: { value: "" } }),
|
|
93
|
+
tabIndex: -1,
|
|
94
|
+
disabled: f,
|
|
95
|
+
className: e("hidden shrink-0", {
|
|
96
|
+
flex: S,
|
|
97
|
+
"group-focus-within:flex": !f && T > 0
|
|
98
|
+
}),
|
|
99
|
+
children: /* @__PURE__ */ i(n, { className: "text-icon-base-neutral-3 h-6 w-6 shrink-0 cursor-pointer" })
|
|
100
|
+
})
|
|
101
|
+
]
|
|
102
|
+
}),
|
|
103
|
+
(u || d || v && g) && /* @__PURE__ */ a("div", {
|
|
104
|
+
className: "flex items-center justify-between gap-2",
|
|
105
|
+
children: [(u || d) && /* @__PURE__ */ i("span", {
|
|
106
|
+
className: e(A, l({
|
|
107
|
+
size: y,
|
|
108
|
+
hasError: S
|
|
109
|
+
})),
|
|
110
|
+
children: d || u
|
|
111
|
+
}), v && g && /* @__PURE__ */ a("span", {
|
|
112
|
+
className: e("ml-auto", A, l({
|
|
113
|
+
size: y,
|
|
114
|
+
hasError: S
|
|
115
|
+
})),
|
|
116
|
+
children: [
|
|
117
|
+
T,
|
|
118
|
+
"/",
|
|
119
|
+
v
|
|
120
|
+
]
|
|
121
|
+
})]
|
|
122
|
+
})
|
|
123
|
+
]
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
u.displayName = "TextFieldNormal";
|
|
127
|
+
var d = s("flex items-center justify-between rounded-[4px] bg-surface-base-neutral-2 border transition-colors duration-200", {
|
|
128
|
+
variants: {
|
|
129
|
+
size: {
|
|
130
|
+
large: "gap-2 p-[15px] min-h-[56px]",
|
|
131
|
+
small: "gap-3 p-[11px] min-h-[48px]"
|
|
132
|
+
},
|
|
133
|
+
hasError: {
|
|
134
|
+
true: "border-border-prominent-error",
|
|
135
|
+
false: "border-transparent"
|
|
136
|
+
},
|
|
137
|
+
disabled: {
|
|
138
|
+
true: "opacity-50",
|
|
139
|
+
false: ""
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
defaultVariants: { size: "large" }
|
|
143
|
+
}), f = ({ label: t, placeholder: n, value: o, isRequired: s = !1, disabled: c = !1, assistiveText: u, errorText: f, onPress: p, className: m, size: h = "large" }) => {
|
|
144
|
+
let g = !!f, _ = h === "large" ? "text-title-18-bold" : "text-title-14-bold", v = h === "large" ? "text-title-20-regular" : "text-body-16-regular";
|
|
145
|
+
return /* @__PURE__ */ a("div", {
|
|
146
|
+
className: e("flex w-full flex-col gap-2", m),
|
|
147
|
+
children: [
|
|
148
|
+
t && /* @__PURE__ */ a("div", {
|
|
149
|
+
className: "flex items-start",
|
|
150
|
+
children: [/* @__PURE__ */ i("span", {
|
|
151
|
+
className: e(_, "text-text-base-neutral-5"),
|
|
152
|
+
children: t
|
|
153
|
+
}), s && /* @__PURE__ */ i("span", {
|
|
154
|
+
className: e(_, "text-text-prominent-accent-1"),
|
|
155
|
+
children: "*"
|
|
156
|
+
})]
|
|
157
|
+
}),
|
|
158
|
+
/* @__PURE__ */ a("button", {
|
|
159
|
+
type: "button",
|
|
160
|
+
className: d({
|
|
161
|
+
size: h,
|
|
162
|
+
hasError: g,
|
|
163
|
+
disabled: c
|
|
164
|
+
}),
|
|
165
|
+
onClick: p,
|
|
166
|
+
disabled: c,
|
|
167
|
+
children: [/* @__PURE__ */ i("span", {
|
|
168
|
+
className: e(v, "flex-1", o ? "text-text-base-neutral-5" : "text-text-base-neutral-2"),
|
|
169
|
+
style: {
|
|
170
|
+
textAlign: "left",
|
|
171
|
+
overflow: "hidden",
|
|
172
|
+
textOverflow: "ellipsis"
|
|
173
|
+
},
|
|
174
|
+
children: o || n
|
|
175
|
+
}), /* @__PURE__ */ i(r, { className: "text-icon-base-neutral-3 rotate-270" })]
|
|
176
|
+
}),
|
|
177
|
+
(u || f) && /* @__PURE__ */ i("div", {
|
|
178
|
+
className: "flex items-start gap-2",
|
|
179
|
+
children: /* @__PURE__ */ i("span", {
|
|
180
|
+
className: l({
|
|
181
|
+
size: h,
|
|
182
|
+
hasError: g
|
|
183
|
+
}),
|
|
184
|
+
children: f || u
|
|
185
|
+
})
|
|
186
|
+
})
|
|
187
|
+
]
|
|
188
|
+
});
|
|
189
|
+
}, p = o.forwardRef(({ onChange: r, subtitle: s, 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) => {
|
|
190
|
+
let E = !!f, D = o.useRef(null);
|
|
191
|
+
o.useImperativeHandle(T, () => D.current);
|
|
192
|
+
let O = o.useCallback(() => {
|
|
193
|
+
D.current?.focus();
|
|
194
|
+
}, []), 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";
|
|
195
|
+
return /* @__PURE__ */ a("div", {
|
|
196
|
+
className: e("flex flex-col gap-2", h),
|
|
197
|
+
children: [
|
|
198
|
+
s && /* @__PURE__ */ a("span", {
|
|
199
|
+
className: e(N, "text-text-base-neutral-5"),
|
|
200
|
+
children: [s, u && /* @__PURE__ */ i("span", {
|
|
201
|
+
className: "text-text-prominent-accent-1",
|
|
202
|
+
children: "*"
|
|
203
|
+
})]
|
|
204
|
+
}),
|
|
205
|
+
/* @__PURE__ */ a("div", {
|
|
206
|
+
className: "flex items-center gap-2",
|
|
207
|
+
children: [/* @__PURE__ */ a("div", {
|
|
208
|
+
onClick: p ? void 0 : O,
|
|
209
|
+
className: e("group flex-1 overflow-hidden", c({
|
|
210
|
+
size: y,
|
|
211
|
+
disabled: p,
|
|
212
|
+
hasError: E
|
|
213
|
+
}), !p && !E && "focus-within:border-border-base-neutral-4", m && "h-[120px] items-start"),
|
|
214
|
+
children: [
|
|
215
|
+
m ? /* @__PURE__ */ i("textarea", {
|
|
216
|
+
...j,
|
|
217
|
+
onChange: r,
|
|
218
|
+
ref: D,
|
|
219
|
+
value: _,
|
|
220
|
+
maxLength: v,
|
|
221
|
+
disabled: p,
|
|
222
|
+
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")
|
|
223
|
+
}) : /* @__PURE__ */ i("input", {
|
|
224
|
+
...A,
|
|
225
|
+
onChange: r,
|
|
226
|
+
ref: D,
|
|
227
|
+
value: _,
|
|
228
|
+
maxLength: v,
|
|
229
|
+
disabled: p,
|
|
230
|
+
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")
|
|
231
|
+
}),
|
|
232
|
+
b && /* @__PURE__ */ i("div", {
|
|
233
|
+
className: "shrink-0",
|
|
234
|
+
children: b
|
|
235
|
+
}),
|
|
236
|
+
/* @__PURE__ */ i("button", {
|
|
237
|
+
type: "button",
|
|
238
|
+
onClick: () => r && r({ target: { value: "" } }),
|
|
239
|
+
tabIndex: -1,
|
|
240
|
+
disabled: p,
|
|
241
|
+
className: e("hidden shrink-0", {
|
|
242
|
+
flex: E,
|
|
243
|
+
"group-focus-within:flex": !p && k > 0
|
|
244
|
+
}),
|
|
245
|
+
children: /* @__PURE__ */ i(n, { className: "text-icon-base-neutral-3 h-6 w-6 shrink-0 cursor-pointer" })
|
|
246
|
+
})
|
|
247
|
+
]
|
|
248
|
+
}), /* @__PURE__ */ i("div", {
|
|
249
|
+
className: "shrink-0",
|
|
250
|
+
children: /* @__PURE__ */ i(t, {
|
|
251
|
+
label: x,
|
|
252
|
+
onClick: S,
|
|
253
|
+
size: "medium",
|
|
254
|
+
hierarchy: "tertiary",
|
|
255
|
+
disabled: C || p
|
|
256
|
+
})
|
|
257
|
+
})]
|
|
258
|
+
}),
|
|
259
|
+
(d || f || v && g) && /* @__PURE__ */ a("div", {
|
|
260
|
+
className: "flex items-center justify-between gap-2",
|
|
261
|
+
children: [(d || f) && /* @__PURE__ */ i("span", {
|
|
262
|
+
className: e(P, l({
|
|
263
|
+
size: y,
|
|
264
|
+
hasError: E
|
|
265
|
+
})),
|
|
266
|
+
children: f || d
|
|
267
|
+
}), v && g && /* @__PURE__ */ a("span", {
|
|
268
|
+
className: e("ml-auto", P, l({
|
|
269
|
+
size: y,
|
|
270
|
+
hasError: E
|
|
271
|
+
})),
|
|
272
|
+
children: [
|
|
273
|
+
k,
|
|
274
|
+
"/",
|
|
275
|
+
v
|
|
276
|
+
]
|
|
277
|
+
})]
|
|
278
|
+
})
|
|
279
|
+
]
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
p.displayName = "TextFieldWithButton";
|
|
283
|
+
//#endregion
|
|
284
|
+
export { u as TextFieldNormal, f as TextFieldSelect, p as TextFieldWithButton };
|
|
285
|
+
|
|
286
|
+
//# 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 { cn } from \"@/utils/TailwindUtil\";\n\n// TextField Normal 컴포넌트 스타일 정의\nconst textFieldNormalContainerVariants = cva(\n \"flex items-center 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 disabled: false,\n hasError: false,\n },\n },\n);\n\nconst textFieldAssistiveAreaVariants = cva(\"\", {\n variants: {\n size: {\n large: \"text-body-16-regular\",\n small: \"text-caption-12-medium\",\n },\n hasError: {\n true: \"text-text-prominent-error\",\n false: \"text-text-base-neutral-2\",\n },\n },\n defaultVariants: {\n size: \"large\",\n hasError: false,\n },\n});\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"}
|
package/dist/v0/checkbox.js
CHANGED
|
@@ -1,37 +1 @@
|
|
|
1
|
-
|
|
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 }) => /* @__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
|
-
type: "checkbox",
|
|
10
|
-
disabled: o,
|
|
11
|
-
className: e(r, "before:content[''] peer bg-petnow-grey-primary checked:border-petnow-orange-primary checked:bg-petnow-orange-primary checked:before:bg-petnow-orange-primary border-petnow-grey-primary relative size-6 cursor-pointer appearance-none rounded-xl border transition-all before:absolute before:top-2/4 before:left-2/4 before:block before:h-6 before:w-6 before:-translate-x-2/4 before:-translate-y-2/4 before:rounded-full before:opacity-0 before:transition-opacity"),
|
|
12
|
-
id: i,
|
|
13
|
-
checked: s,
|
|
14
|
-
onChange: (e) => {
|
|
15
|
-
a?.(e.target.checked);
|
|
16
|
-
}
|
|
17
|
-
}), /* @__PURE__ */ t("span", {
|
|
18
|
-
className: "text-petnow-grey-secondary pointer-events-none absolute top-2/4 left-2/4 -translate-x-2/4 -translate-y-2/4 transition peer-checked:text-white",
|
|
19
|
-
children: /* @__PURE__ */ t("svg", {
|
|
20
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
21
|
-
className: "h-4 w-4",
|
|
22
|
-
viewBox: "0 0 20 20",
|
|
23
|
-
fill: "currentColor",
|
|
24
|
-
stroke: "currentColor",
|
|
25
|
-
strokeWidth: "1",
|
|
26
|
-
children: /* @__PURE__ */ t("path", {
|
|
27
|
-
fillRule: "evenodd",
|
|
28
|
-
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",
|
|
29
|
-
clipRule: "evenodd"
|
|
30
|
-
})
|
|
31
|
-
})
|
|
32
|
-
})]
|
|
33
|
-
});
|
|
34
|
-
//#endregion
|
|
35
|
-
export { r as default };
|
|
36
|
-
|
|
37
|
-
//# sourceMappingURL=checkbox.js.map
|
|
1
|
+
export { default } from "../checkbox.js";
|
package/dist/v0/radio.js
CHANGED
|
@@ -1,17 +1 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
2
|
-
import { t as e } from "../TailwindUtil-DiNvXuNl.js";
|
|
3
|
-
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
4
|
-
import { useEffect as r, useRef as i, useState as a } from "react";
|
|
5
|
-
import { useKeenSlider as o } from "keen-slider/react.js";
|
|
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] = a(d), _ = i(null), v = i(h), y = i(f);
|
|
9
|
-
r(() => {
|
|
10
|
-
v.current = h, y.current = f;
|
|
11
|
-
});
|
|
12
|
-
let [b, x] = o({
|
|
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
|
-
|
|
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";
|