@x-plat/design-system 0.7.1 → 0.8.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 (42) hide show
  1. package/dist/components/AutoResizeTextArea/index.css +3 -1
  2. package/dist/components/Button/index.css +2 -1
  3. package/dist/components/Button/index.d.cts +6 -0
  4. package/dist/components/Button/index.d.ts +6 -0
  5. package/dist/components/Chart/index.cjs +8 -1
  6. package/dist/components/Chart/index.js +8 -1
  7. package/dist/components/ChatInput/index.css +6 -2
  8. package/dist/components/DatePicker/index.css +5 -2
  9. package/dist/components/Input/index.css +3 -1
  10. package/dist/components/Link/index.cjs +64 -0
  11. package/dist/components/Link/index.css +25 -0
  12. package/dist/components/Link/index.d.cts +27 -0
  13. package/dist/components/Link/index.d.ts +27 -0
  14. package/dist/components/Link/index.js +37 -0
  15. package/dist/components/LinkButton/index.cjs +64 -0
  16. package/dist/components/LinkButton/index.css +106 -0
  17. package/dist/components/LinkButton/index.d.cts +28 -0
  18. package/dist/components/LinkButton/index.d.ts +28 -0
  19. package/dist/components/LinkButton/index.js +37 -0
  20. package/dist/components/Select/index.css +4 -2
  21. package/dist/components/TextArea/index.css +3 -1
  22. package/dist/components/Tooltip/index.cjs +77 -32
  23. package/dist/components/Tooltip/index.d.cts +10 -2
  24. package/dist/components/Tooltip/index.d.ts +10 -2
  25. package/dist/components/Tooltip/index.js +77 -32
  26. package/dist/components/index.cjs +247 -153
  27. package/dist/components/index.css +44 -7
  28. package/dist/components/index.d.cts +2 -0
  29. package/dist/components/index.d.ts +2 -0
  30. package/dist/components/index.js +222 -130
  31. package/dist/index.cjs +266 -172
  32. package/dist/index.css +44 -7
  33. package/dist/index.d.cts +2 -0
  34. package/dist/index.d.ts +2 -0
  35. package/dist/index.js +239 -147
  36. package/guidelines/AGENT_PROMPT.md +2 -2
  37. package/guidelines/Guidelines.md +2 -1
  38. package/guidelines/components/button.md +54 -0
  39. package/guidelines/components/card.md +15 -19
  40. package/guidelines/components/link.md +35 -0
  41. package/guidelines/components/overlay.md +30 -1
  42. package/package.json +1 -1
@@ -2207,9 +2207,16 @@ var useChartTooltip = (enabled) => {
2207
2207
  }, []);
2208
2208
  return { tooltip, show, hide, move, containerRef };
2209
2209
  };
2210
+ var formatTick = (value, maxVal) => {
2211
+ const step = maxVal / 4;
2212
+ if (!Number.isFinite(step) || step <= 0) return "0";
2213
+ const decimals = step >= 1 ? 0 : Math.min(4, Math.ceil(-Math.log10(step)));
2214
+ const fixed = value.toFixed(decimals);
2215
+ return decimals === 0 ? Number(fixed).toLocaleString("en-US") : fixed;
2216
+ };
2210
2217
  var GridLines = React6.memo(({ width, height, chartH, maxVal }) => /* @__PURE__ */ jsx305(Fragment2, { children: [0, 0.25, 0.5, 0.75, 1].map((ratio) => {
2211
2218
  const y = PADDING.top + (1 - ratio) * chartH;
2212
- const val = Math.round(maxVal * ratio);
2219
+ const val = formatTick(maxVal * ratio, maxVal);
2213
2220
  return /* @__PURE__ */ jsxs195("g", { children: [
2214
2221
  /* @__PURE__ */ jsx305("line", { x1: PADDING.left, y1: y, x2: width - PADDING.right, y2: y, className: "chart-grid" }),
2215
2222
  /* @__PURE__ */ jsx305("text", { x: PADDING.left - 8, y: y + 4, className: "chart-axis-label", textAnchor: "end", children: val })
@@ -4807,8 +4814,46 @@ var ImageSelector = (props) => {
4807
4814
  ImageSelector.displayName = "ImageSelector";
4808
4815
  var ImageSelector_default = ImageSelector;
4809
4816
 
4817
+ // src/components/Link/Link.tsx
4818
+ import { jsx as jsx329 } from "react/jsx-runtime";
4819
+ var Link = (props) => {
4820
+ const { children, href, underline = "always", target, rel, ...rest } = props;
4821
+ return /* @__PURE__ */ jsx329(
4822
+ "a",
4823
+ {
4824
+ className: clsx_default("lib-xplat-link", `underline-${underline}`),
4825
+ href,
4826
+ target,
4827
+ rel: target === "_blank" ? rel ?? "noopener noreferrer" : rel,
4828
+ ...rest,
4829
+ children
4830
+ }
4831
+ );
4832
+ };
4833
+ Link.displayName = "Link";
4834
+ var Link_default = Link;
4835
+
4836
+ // src/components/LinkButton/LinkButton.tsx
4837
+ import { jsx as jsx330 } from "react/jsx-runtime";
4838
+ var LinkButton = (props) => {
4839
+ const { children, href, type = "primary", size = "md", target, rel, ...rest } = props;
4840
+ return /* @__PURE__ */ jsx330(
4841
+ "a",
4842
+ {
4843
+ className: clsx_default("lib-xplat-button", type, size),
4844
+ href,
4845
+ target,
4846
+ rel: target === "_blank" ? rel ?? "noopener noreferrer" : rel,
4847
+ ...rest,
4848
+ children
4849
+ }
4850
+ );
4851
+ };
4852
+ LinkButton.displayName = "LinkButton";
4853
+ var LinkButton_default = LinkButton;
4854
+
4810
4855
  // src/components/NotificationBadge/NotificationBadge.tsx
4811
- import { jsx as jsx329, jsxs as jsxs211 } from "react/jsx-runtime";
4856
+ import { jsx as jsx331, jsxs as jsxs211 } from "react/jsx-runtime";
4812
4857
  var NotificationBadge = (props) => {
4813
4858
  const {
4814
4859
  children,
@@ -4822,14 +4867,14 @@ var NotificationBadge = (props) => {
4822
4867
  const displayCount = count !== void 0 && count > maxCount ? `${maxCount}+` : count;
4823
4868
  return /* @__PURE__ */ jsxs211("div", { className: clsx_default("lib-xplat-notification-badge", size), children: [
4824
4869
  children,
4825
- showBadge && /* @__PURE__ */ jsx329("span", { className: clsx_default("badge-indicator", type, { dot }), children: !dot && displayCount })
4870
+ showBadge && /* @__PURE__ */ jsx331("span", { className: clsx_default("badge-indicator", type, { dot }), children: !dot && displayCount })
4826
4871
  ] });
4827
4872
  };
4828
4873
  NotificationBadge.displayName = "NotificationBadge";
4829
4874
  var NotificationBadge_default = NotificationBadge;
4830
4875
 
4831
4876
  // src/components/Pagination/Pagination.tsx
4832
- import { jsx as jsx330, jsxs as jsxs212 } from "react/jsx-runtime";
4877
+ import { jsx as jsx332, jsxs as jsxs212 } from "react/jsx-runtime";
4833
4878
  var getPageRange = (current, totalPages, siblingCount) => {
4834
4879
  const totalNumbers = siblingCount * 2 + 5;
4835
4880
  if (totalPages <= totalNumbers) {
@@ -4873,18 +4918,18 @@ var Pagination = (props) => {
4873
4918
  }
4874
4919
  };
4875
4920
  return /* @__PURE__ */ jsxs212("nav", { className: clsx_default("lib-xplat-pagination", size, type), "aria-label": "\uD398\uC774\uC9C0 \uB124\uBE44\uAC8C\uC774\uC158", children: [
4876
- /* @__PURE__ */ jsx330(
4921
+ /* @__PURE__ */ jsx332(
4877
4922
  "button",
4878
4923
  {
4879
4924
  className: "page-btn prev",
4880
4925
  disabled: current <= 1,
4881
4926
  onClick: () => handleClick(current - 1),
4882
4927
  "aria-label": "\uC774\uC804 \uD398\uC774\uC9C0",
4883
- children: /* @__PURE__ */ jsx330(ChevronLeftIcon_default, {})
4928
+ children: /* @__PURE__ */ jsx332(ChevronLeftIcon_default, {})
4884
4929
  }
4885
4930
  ),
4886
4931
  pages.map(
4887
- (page, i) => page === "..." ? /* @__PURE__ */ jsx330("span", { className: "dots", children: "..." }, `dots-${i}`) : /* @__PURE__ */ jsx330(
4932
+ (page, i) => page === "..." ? /* @__PURE__ */ jsx332("span", { className: "dots", children: "..." }, `dots-${i}`) : /* @__PURE__ */ jsx332(
4888
4933
  "button",
4889
4934
  {
4890
4935
  className: clsx_default("page-btn", { active: page === current }),
@@ -4895,14 +4940,14 @@ var Pagination = (props) => {
4895
4940
  page
4896
4941
  )
4897
4942
  ),
4898
- /* @__PURE__ */ jsx330(
4943
+ /* @__PURE__ */ jsx332(
4899
4944
  "button",
4900
4945
  {
4901
4946
  className: "page-btn next",
4902
4947
  disabled: current >= totalPages,
4903
4948
  onClick: () => handleClick(current + 1),
4904
4949
  "aria-label": "\uB2E4\uC74C \uD398\uC774\uC9C0",
4905
- children: /* @__PURE__ */ jsx330(ChevronRightIcon_default, {})
4950
+ children: /* @__PURE__ */ jsx332(ChevronRightIcon_default, {})
4906
4951
  }
4907
4952
  )
4908
4953
  ] });
@@ -4912,7 +4957,7 @@ var Pagination_default = Pagination;
4912
4957
 
4913
4958
  // src/components/PopOver/PopOver.tsx
4914
4959
  import React27 from "react";
4915
- import { jsx as jsx331, jsxs as jsxs213 } from "react/jsx-runtime";
4960
+ import { jsx as jsx333, jsxs as jsxs213 } from "react/jsx-runtime";
4916
4961
  var PopOver = (props) => {
4917
4962
  const { children, isOpen, onClose, PopOverEl } = props;
4918
4963
  const popRef = React27.useRef(null);
@@ -4944,7 +4989,7 @@ var PopOver = (props) => {
4944
4989
  },
4945
4990
  children: [
4946
4991
  children,
4947
- localOpen && /* @__PURE__ */ jsx331(Portal_default, { children: /* @__PURE__ */ jsx331(
4992
+ localOpen && /* @__PURE__ */ jsx333(Portal_default, { children: /* @__PURE__ */ jsx333(
4948
4993
  "div",
4949
4994
  {
4950
4995
  className: clsx_default(
@@ -4967,7 +5012,7 @@ PopOver.displayName = "PopOver";
4967
5012
  var PopOver_default = PopOver;
4968
5013
 
4969
5014
  // src/components/Progress/Progress.tsx
4970
- import { jsx as jsx332, jsxs as jsxs214 } from "react/jsx-runtime";
5015
+ import { jsx as jsx334, jsxs as jsxs214 } from "react/jsx-runtime";
4971
5016
  var Progress = (props) => {
4972
5017
  const {
4973
5018
  value,
@@ -4978,7 +5023,7 @@ var Progress = (props) => {
4978
5023
  } = props;
4979
5024
  const percentage = Math.min(100, Math.max(0, value / max * 100));
4980
5025
  return /* @__PURE__ */ jsxs214("div", { className: clsx_default("lib-xplat-progress", size, type), children: [
4981
- /* @__PURE__ */ jsx332(
5026
+ /* @__PURE__ */ jsx334(
4982
5027
  "div",
4983
5028
  {
4984
5029
  className: "track",
@@ -4986,7 +5031,7 @@ var Progress = (props) => {
4986
5031
  "aria-valuenow": value,
4987
5032
  "aria-valuemin": 0,
4988
5033
  "aria-valuemax": max,
4989
- children: /* @__PURE__ */ jsx332(
5034
+ children: /* @__PURE__ */ jsx334(
4990
5035
  "div",
4991
5036
  {
4992
5037
  className: "bar",
@@ -5015,7 +5060,7 @@ var useRadioGroupContext = () => {
5015
5060
  var RadioGroupContext_default = RadioGroupContext;
5016
5061
 
5017
5062
  // src/components/Radio/Radio.tsx
5018
- import { jsx as jsx333, jsxs as jsxs215 } from "react/jsx-runtime";
5063
+ import { jsx as jsx335, jsxs as jsxs215 } from "react/jsx-runtime";
5019
5064
  var Radio = (props) => {
5020
5065
  const {
5021
5066
  label,
@@ -5045,18 +5090,18 @@ var Radio = (props) => {
5045
5090
  className
5046
5091
  ),
5047
5092
  children: [
5048
- /* @__PURE__ */ jsx333("input", { ...rest, ...inputProps, checked: localChecked, type: "radio" }),
5049
- /* @__PURE__ */ jsx333(
5093
+ /* @__PURE__ */ jsx335("input", { ...rest, ...inputProps, checked: localChecked, type: "radio" }),
5094
+ /* @__PURE__ */ jsx335(
5050
5095
  "div",
5051
5096
  {
5052
5097
  className: clsx_default(
5053
5098
  "circle",
5054
5099
  localChecked ? "checked" : void 0
5055
5100
  ),
5056
- children: localChecked && /* @__PURE__ */ jsx333("div", { className: "inner-circle" })
5101
+ children: localChecked && /* @__PURE__ */ jsx335("div", { className: "inner-circle" })
5057
5102
  }
5058
5103
  ),
5059
- label && /* @__PURE__ */ jsx333("span", { children: label })
5104
+ label && /* @__PURE__ */ jsx335("span", { children: label })
5060
5105
  ]
5061
5106
  }
5062
5107
  );
@@ -5065,10 +5110,10 @@ Radio.displayName = "Radio";
5065
5110
  var Radio_default = Radio;
5066
5111
 
5067
5112
  // src/components/Radio/RadioGroup.tsx
5068
- import { Fragment as Fragment4, jsx as jsx334 } from "react/jsx-runtime";
5113
+ import { Fragment as Fragment4, jsx as jsx336 } from "react/jsx-runtime";
5069
5114
  var RadioGroup = (props) => {
5070
5115
  const { children, ...rest } = props;
5071
- return /* @__PURE__ */ jsx334(Fragment4, { children: /* @__PURE__ */ jsx334(RadioGroupContext_default.Provider, { value: rest, children }) });
5116
+ return /* @__PURE__ */ jsx336(Fragment4, { children: /* @__PURE__ */ jsx336(RadioGroupContext_default.Provider, { value: rest, children }) });
5072
5117
  };
5073
5118
  RadioGroup.displayName = "RadioGroup";
5074
5119
  var RadioGroup_default = RadioGroup;
@@ -5083,7 +5128,7 @@ var context_default = SelectContext;
5083
5128
 
5084
5129
  // src/components/Select/SelectItem.tsx
5085
5130
  import React30 from "react";
5086
- import { jsx as jsx335 } from "react/jsx-runtime";
5131
+ import { jsx as jsx337 } from "react/jsx-runtime";
5087
5132
  var SelectItem = (props) => {
5088
5133
  const { children, value, onClick, disabled = false } = props;
5089
5134
  const ctx = React30.useContext(context_default);
@@ -5096,7 +5141,7 @@ var SelectItem = (props) => {
5096
5141
  onClick?.();
5097
5142
  };
5098
5143
  const isSelected = value !== void 0 ? ctx?.selectedValue === value : ctx?.selectedLabel === children;
5099
- return /* @__PURE__ */ jsx335(
5144
+ return /* @__PURE__ */ jsx337(
5100
5145
  "div",
5101
5146
  {
5102
5147
  className: clsx_default("select-item", disabled && "disabled", isSelected && "is-selected"),
@@ -5117,7 +5162,7 @@ SelectItem.displayName = "Select.Item";
5117
5162
  var SelectItem_default = SelectItem;
5118
5163
 
5119
5164
  // src/components/Select/Select.tsx
5120
- import { jsx as jsx336, jsxs as jsxs216 } from "react/jsx-runtime";
5165
+ import { jsx as jsx338, jsxs as jsxs216 } from "react/jsx-runtime";
5121
5166
  var ANIMATION_DURATION_MS3 = 200;
5122
5167
  var SelectRoot = (props) => {
5123
5168
  const {
@@ -5197,7 +5242,7 @@ var SelectRoot = (props) => {
5197
5242
  if (disabled) return;
5198
5243
  toggle();
5199
5244
  };
5200
- return /* @__PURE__ */ jsx336(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs216(
5245
+ return /* @__PURE__ */ jsx338(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs216(
5201
5246
  "div",
5202
5247
  {
5203
5248
  className: clsx_default(
@@ -5232,7 +5277,7 @@ var SelectRoot = (props) => {
5232
5277
  }
5233
5278
  },
5234
5279
  children: [
5235
- /* @__PURE__ */ jsx336(
5280
+ /* @__PURE__ */ jsx338(
5236
5281
  "span",
5237
5282
  {
5238
5283
  className: clsx_default(
@@ -5242,25 +5287,25 @@ var SelectRoot = (props) => {
5242
5287
  children: selectedLabel ?? placeholder
5243
5288
  }
5244
5289
  ),
5245
- /* @__PURE__ */ jsx336(
5290
+ /* @__PURE__ */ jsx338(
5246
5291
  "span",
5247
5292
  {
5248
5293
  className: clsx_default("select-trigger-icon", isOpen && "open"),
5249
5294
  "aria-hidden": true,
5250
- children: /* @__PURE__ */ jsx336(ChevronDownIcon_default, {})
5295
+ children: /* @__PURE__ */ jsx338(ChevronDownIcon_default, {})
5251
5296
  }
5252
5297
  )
5253
5298
  ]
5254
5299
  }
5255
5300
  ),
5256
- mounted && /* @__PURE__ */ jsx336(Portal_default, { children: /* @__PURE__ */ jsx336(
5301
+ mounted && /* @__PURE__ */ jsx338(Portal_default, { children: /* @__PURE__ */ jsx338(
5257
5302
  "div",
5258
5303
  {
5259
5304
  className: clsx_default("lib-xplat-select-content", size, position.direction, stateClass),
5260
5305
  ref: contentRef,
5261
5306
  style: { ...position.position, width: triggerRef.current?.offsetWidth },
5262
5307
  role: "listbox",
5263
- children: /* @__PURE__ */ jsx336(context_default.Provider, { value: ctxValue, children: itemChildren })
5308
+ children: /* @__PURE__ */ jsx338(context_default.Provider, { value: ctxValue, children: itemChildren })
5264
5309
  }
5265
5310
  ) })
5266
5311
  ]
@@ -5274,7 +5319,7 @@ var Select = Object.assign(SelectRoot, {
5274
5319
  var Select_default = Select;
5275
5320
 
5276
5321
  // src/components/Skeleton/Skeleton.tsx
5277
- import { jsx as jsx337 } from "react/jsx-runtime";
5322
+ import { jsx as jsx339 } from "react/jsx-runtime";
5278
5323
  var SIZE_MAP = {
5279
5324
  xs: "var(--spacing-space-1)",
5280
5325
  sm: "var(--spacing-space-2)",
@@ -5290,7 +5335,7 @@ var Skeleton = (props) => {
5290
5335
  ...width != null && { width: SIZE_MAP[width] },
5291
5336
  ...height != null && { height: SIZE_MAP[height] }
5292
5337
  };
5293
- return /* @__PURE__ */ jsx337(
5338
+ return /* @__PURE__ */ jsx339(
5294
5339
  "div",
5295
5340
  {
5296
5341
  className: clsx_default("lib-xplat-skeleton", variant),
@@ -5303,20 +5348,20 @@ Skeleton.displayName = "Skeleton";
5303
5348
  var Skeleton_default = Skeleton;
5304
5349
 
5305
5350
  // src/components/Spinner/Spinner.tsx
5306
- import { jsx as jsx338, jsxs as jsxs217 } from "react/jsx-runtime";
5351
+ import { jsx as jsx340, jsxs as jsxs217 } from "react/jsx-runtime";
5307
5352
  var Spinner = (props) => {
5308
5353
  const {
5309
5354
  size = "md",
5310
5355
  type = "brand"
5311
5356
  } = props;
5312
- return /* @__PURE__ */ jsx338(
5357
+ return /* @__PURE__ */ jsx340(
5313
5358
  "div",
5314
5359
  {
5315
5360
  className: clsx_default("lib-xplat-spinner", size, type),
5316
5361
  role: "status",
5317
5362
  "aria-label": "\uB85C\uB529 \uC911",
5318
5363
  children: /* @__PURE__ */ jsxs217("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
5319
- /* @__PURE__ */ jsx338(
5364
+ /* @__PURE__ */ jsx340(
5320
5365
  "circle",
5321
5366
  {
5322
5367
  className: "track",
@@ -5326,7 +5371,7 @@ var Spinner = (props) => {
5326
5371
  strokeWidth: "3"
5327
5372
  }
5328
5373
  ),
5329
- /* @__PURE__ */ jsx338(
5374
+ /* @__PURE__ */ jsx340(
5330
5375
  "circle",
5331
5376
  {
5332
5377
  className: "indicator",
@@ -5345,20 +5390,20 @@ Spinner.displayName = "Spinner";
5345
5390
  var Spinner_default = Spinner;
5346
5391
 
5347
5392
  // src/components/Steps/Steps.tsx
5348
- import { jsx as jsx339, jsxs as jsxs218 } from "react/jsx-runtime";
5393
+ import { jsx as jsx341, jsxs as jsxs218 } from "react/jsx-runtime";
5349
5394
  var Steps = (props) => {
5350
5395
  const {
5351
5396
  items,
5352
5397
  current,
5353
5398
  type = "brand"
5354
5399
  } = props;
5355
- return /* @__PURE__ */ jsx339("div", { className: clsx_default("lib-xplat-steps", type), children: items.map((item, index) => {
5400
+ return /* @__PURE__ */ jsx341("div", { className: clsx_default("lib-xplat-steps", type), children: items.map((item, index) => {
5356
5401
  const status = index < current ? "completed" : index === current ? "active" : "pending";
5357
5402
  return /* @__PURE__ */ jsxs218("div", { className: clsx_default("step-item", status), children: [
5358
- /* @__PURE__ */ jsx339("div", { className: "step-circle", children: status === "completed" ? /* @__PURE__ */ jsx339(CheckIcon_default, {}) : /* @__PURE__ */ jsx339("span", { children: index + 1 }) }),
5403
+ /* @__PURE__ */ jsx341("div", { className: "step-circle", children: status === "completed" ? /* @__PURE__ */ jsx341(CheckIcon_default, {}) : /* @__PURE__ */ jsx341("span", { children: index + 1 }) }),
5359
5404
  /* @__PURE__ */ jsxs218("div", { className: "step-content", children: [
5360
- /* @__PURE__ */ jsx339("span", { className: "step-title", children: item.title }),
5361
- item.description && /* @__PURE__ */ jsx339("span", { className: "step-description", children: item.description })
5405
+ /* @__PURE__ */ jsx341("span", { className: "step-title", children: item.title }),
5406
+ item.description && /* @__PURE__ */ jsx341("span", { className: "step-description", children: item.description })
5362
5407
  ] })
5363
5408
  ] }, index);
5364
5409
  }) });
@@ -5368,7 +5413,7 @@ var Steps_default = Steps;
5368
5413
 
5369
5414
  // src/components/Swiper/Swiper.tsx
5370
5415
  import React32 from "react";
5371
- import { jsx as jsx340, jsxs as jsxs219 } from "react/jsx-runtime";
5416
+ import { jsx as jsx342, jsxs as jsxs219 } from "react/jsx-runtime";
5372
5417
  var Swiper = (props) => {
5373
5418
  const {
5374
5419
  auto = false,
@@ -5597,7 +5642,7 @@ var Swiper = (props) => {
5597
5642
  const slideWidthPercent = 100 / viewItemCount;
5598
5643
  const gapAdjust = spaceBetween * (viewItemCount - 1) / viewItemCount;
5599
5644
  const slideElements = React32.useMemo(
5600
- () => extendedItems.map((item, idx) => /* @__PURE__ */ jsx340(
5645
+ () => extendedItems.map((item, idx) => /* @__PURE__ */ jsx342(
5601
5646
  "div",
5602
5647
  {
5603
5648
  className: "lib-xplat-swiper__slide",
@@ -5617,14 +5662,14 @@ var Swiper = (props) => {
5617
5662
  totalSteps - 1
5618
5663
  );
5619
5664
  return /* @__PURE__ */ jsxs219("div", { className: "lib-xplat-swiper", ref: containerRef, children: [
5620
- /* @__PURE__ */ jsx340(
5665
+ /* @__PURE__ */ jsx342(
5621
5666
  "div",
5622
5667
  {
5623
5668
  className: "lib-xplat-swiper__viewport",
5624
5669
  onMouseDown: handleDragStart,
5625
5670
  onTouchStart: handleDragStart,
5626
5671
  onDragStart: (e) => e.preventDefault(),
5627
- children: /* @__PURE__ */ jsx340(
5672
+ children: /* @__PURE__ */ jsx342(
5628
5673
  "div",
5629
5674
  {
5630
5675
  className: clsx_default(
@@ -5642,7 +5687,7 @@ var Swiper = (props) => {
5642
5687
  )
5643
5688
  }
5644
5689
  ),
5645
- showProgress && canSlide && /* @__PURE__ */ jsx340("div", { className: "lib-xplat-swiper__progress", children: /* @__PURE__ */ jsx340("div", { className: "lib-xplat-swiper__progress-track", children: /* @__PURE__ */ jsx340(
5690
+ showProgress && canSlide && /* @__PURE__ */ jsx342("div", { className: "lib-xplat-swiper__progress", children: /* @__PURE__ */ jsx342("div", { className: "lib-xplat-swiper__progress-track", children: /* @__PURE__ */ jsx342(
5646
5691
  "span",
5647
5692
  {
5648
5693
  className: "lib-xplat-swiper__progress-fill",
@@ -5652,7 +5697,7 @@ var Swiper = (props) => {
5652
5697
  }
5653
5698
  }
5654
5699
  ) }) }),
5655
- canSlide && /* @__PURE__ */ jsx340("div", { className: "lib-xplat-swiper__dots", children: Array.from({ length: totalSteps }, (_, i) => /* @__PURE__ */ jsx340(
5700
+ canSlide && /* @__PURE__ */ jsx342("div", { className: "lib-xplat-swiper__dots", children: Array.from({ length: totalSteps }, (_, i) => /* @__PURE__ */ jsx342(
5656
5701
  "button",
5657
5702
  {
5658
5703
  className: clsx_default(
@@ -5671,7 +5716,7 @@ var Swiper_default = Swiper;
5671
5716
 
5672
5717
  // src/components/Switch/Switch.tsx
5673
5718
  import React33 from "react";
5674
- import { jsx as jsx341 } from "react/jsx-runtime";
5719
+ import { jsx as jsx343 } from "react/jsx-runtime";
5675
5720
  var KNOB_TRANSITION_MS = 250;
5676
5721
  var Switch = (props) => {
5677
5722
  const {
@@ -5698,7 +5743,7 @@ var Switch = (props) => {
5698
5743
  timeoutRef.current = null;
5699
5744
  }, KNOB_TRANSITION_MS);
5700
5745
  };
5701
- return /* @__PURE__ */ jsx341(
5746
+ return /* @__PURE__ */ jsx343(
5702
5747
  "div",
5703
5748
  {
5704
5749
  className: clsx_default(
@@ -5711,7 +5756,7 @@ var Switch = (props) => {
5711
5756
  ),
5712
5757
  onClick: handleClick,
5713
5758
  "aria-disabled": disabled || isAnimating,
5714
- children: /* @__PURE__ */ jsx341("div", { className: clsx_default("knob", value ? "checked" : void 0) })
5759
+ children: /* @__PURE__ */ jsx343("div", { className: clsx_default("knob", value ? "checked" : void 0) })
5715
5760
  }
5716
5761
  );
5717
5762
  };
@@ -5729,7 +5774,7 @@ var useTableContext = () => {
5729
5774
  var TableContext_default = TableContext;
5730
5775
 
5731
5776
  // src/components/Table/Table.tsx
5732
- import { jsx as jsx342 } from "react/jsx-runtime";
5777
+ import { jsx as jsx344 } from "react/jsx-runtime";
5733
5778
  var Table = (props) => {
5734
5779
  const {
5735
5780
  children,
@@ -5739,7 +5784,7 @@ var Table = (props) => {
5739
5784
  headerSticky = false,
5740
5785
  stickyShadow = true
5741
5786
  } = props;
5742
- return /* @__PURE__ */ jsx342("div", { className: `lib-xplat-table-wrapper ${size}`, children: /* @__PURE__ */ jsx342(
5787
+ return /* @__PURE__ */ jsx344("div", { className: `lib-xplat-table-wrapper ${size}`, children: /* @__PURE__ */ jsx344(
5743
5788
  TableContext_default.Provider,
5744
5789
  {
5745
5790
  value: {
@@ -5748,7 +5793,7 @@ var Table = (props) => {
5748
5793
  headerSticky,
5749
5794
  stickyShadow
5750
5795
  },
5751
- children: /* @__PURE__ */ jsx342("table", { className: "lib-xplat-table", children })
5796
+ children: /* @__PURE__ */ jsx344("table", { className: "lib-xplat-table", children })
5752
5797
  }
5753
5798
  ) });
5754
5799
  };
@@ -5756,10 +5801,10 @@ Table.displayName = "Table";
5756
5801
  var Table_default = Table;
5757
5802
 
5758
5803
  // src/components/Table/TableBody.tsx
5759
- import { jsx as jsx343 } from "react/jsx-runtime";
5804
+ import { jsx as jsx345 } from "react/jsx-runtime";
5760
5805
  var TableBody = (props) => {
5761
5806
  const { children } = props;
5762
- return /* @__PURE__ */ jsx343("tbody", { children });
5807
+ return /* @__PURE__ */ jsx345("tbody", { children });
5763
5808
  };
5764
5809
  TableBody.displayName = "TableBody";
5765
5810
  var TableBody_default = TableBody;
@@ -5789,7 +5834,7 @@ var useTableRowContext = () => {
5789
5834
  var TableRowContext_default = TableRowContext;
5790
5835
 
5791
5836
  // src/components/Table/TableCell.tsx
5792
- import { jsx as jsx344 } from "react/jsx-runtime";
5837
+ import { jsx as jsx346 } from "react/jsx-runtime";
5793
5838
  var TableCell = React37.memo((props) => {
5794
5839
  const {
5795
5840
  children,
@@ -5834,7 +5879,7 @@ var TableCell = React37.memo((props) => {
5834
5879
  const CellTag = isHeaderCell ? "th" : "td";
5835
5880
  const isLastSticky = isSticky && stickyCells[stickyCells.length - 1] === cellRef;
5836
5881
  const enableHover = headContext && headContext.cellHover;
5837
- return /* @__PURE__ */ jsx344(
5882
+ return /* @__PURE__ */ jsx346(
5838
5883
  CellTag,
5839
5884
  {
5840
5885
  ref: cellRef,
@@ -5861,20 +5906,20 @@ TableCell.displayName = "TableCell";
5861
5906
  var TableCell_default = TableCell;
5862
5907
 
5863
5908
  // src/components/Table/TableHead.tsx
5864
- import { jsx as jsx345 } from "react/jsx-runtime";
5909
+ import { jsx as jsx347 } from "react/jsx-runtime";
5865
5910
  var TableHead = ({
5866
5911
  children,
5867
5912
  cellHover = false
5868
5913
  }) => {
5869
5914
  const { headerSticky } = useTableContext();
5870
- return /* @__PURE__ */ jsx345(TableHeadContext_default.Provider, { value: { cellHover }, children: /* @__PURE__ */ jsx345("thead", { className: clsx_default(headerSticky ? "table-sticky" : null), children }) });
5915
+ return /* @__PURE__ */ jsx347(TableHeadContext_default.Provider, { value: { cellHover }, children: /* @__PURE__ */ jsx347("thead", { className: clsx_default(headerSticky ? "table-sticky" : null), children }) });
5871
5916
  };
5872
5917
  TableHead.displayName = "TableHead";
5873
5918
  var TableHead_default = TableHead;
5874
5919
 
5875
5920
  // src/components/Table/TableRow.tsx
5876
5921
  import React38 from "react";
5877
- import { jsx as jsx346 } from "react/jsx-runtime";
5922
+ import { jsx as jsx348 } from "react/jsx-runtime";
5878
5923
  var TableRow = React38.memo((props) => {
5879
5924
  const {
5880
5925
  children,
@@ -5891,7 +5936,7 @@ var TableRow = React38.memo((props) => {
5891
5936
  return [...prev, ref];
5892
5937
  });
5893
5938
  };
5894
- return /* @__PURE__ */ jsx346(TableRowContext_default.Provider, { value: { stickyCells, registerStickyCell }, children: /* @__PURE__ */ jsx346(
5939
+ return /* @__PURE__ */ jsx348(TableRowContext_default.Provider, { value: { stickyCells, registerStickyCell }, children: /* @__PURE__ */ jsx348(
5895
5940
  "tr",
5896
5941
  {
5897
5942
  className: clsx_default(
@@ -5915,7 +5960,7 @@ TableRow.displayName = "TableRow";
5915
5960
  var TableRow_default = TableRow;
5916
5961
 
5917
5962
  // src/components/Tag/Tag.tsx
5918
- import { jsx as jsx347, jsxs as jsxs220 } from "react/jsx-runtime";
5963
+ import { jsx as jsx349, jsxs as jsxs220 } from "react/jsx-runtime";
5919
5964
  var Tag = (props) => {
5920
5965
  const {
5921
5966
  children,
@@ -5936,8 +5981,8 @@ var Tag = (props) => {
5936
5981
  disabled && "disabled"
5937
5982
  ),
5938
5983
  children: [
5939
- /* @__PURE__ */ jsx347("span", { className: "tag-label", children }),
5940
- onClose && /* @__PURE__ */ jsx347("button", { className: "tag-close", onClick: onClose, "aria-label": "\uC0AD\uC81C", disabled, children: /* @__PURE__ */ jsx347(XIcon_default, {}) })
5984
+ /* @__PURE__ */ jsx349("span", { className: "tag-label", children }),
5985
+ onClose && /* @__PURE__ */ jsx349("button", { className: "tag-close", onClick: onClose, "aria-label": "\uC0AD\uC81C", disabled, children: /* @__PURE__ */ jsx349(XIcon_default, {}) })
5941
5986
  ]
5942
5987
  }
5943
5988
  );
@@ -5947,7 +5992,7 @@ var Tag_default = Tag;
5947
5992
 
5948
5993
  // src/components/TextArea/TextArea.tsx
5949
5994
  import React39 from "react";
5950
- import { jsx as jsx348 } from "react/jsx-runtime";
5995
+ import { jsx as jsx350 } from "react/jsx-runtime";
5951
5996
  var TextArea = React39.forwardRef(
5952
5997
  (props, ref) => {
5953
5998
  const {
@@ -5958,7 +6003,7 @@ var TextArea = React39.forwardRef(
5958
6003
  disabled,
5959
6004
  ...textareaProps
5960
6005
  } = props;
5961
- return /* @__PURE__ */ jsx348("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ jsx348(
6006
+ return /* @__PURE__ */ jsx350("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ jsx350(
5962
6007
  "textarea",
5963
6008
  {
5964
6009
  ...textareaProps,
@@ -5977,7 +6022,7 @@ var TextArea_default = TextArea;
5977
6022
  // src/components/Toast/Toast.tsx
5978
6023
  import React40 from "react";
5979
6024
  import { createPortal as createPortal3 } from "react-dom";
5980
- import { jsx as jsx349, jsxs as jsxs221 } from "react/jsx-runtime";
6025
+ import { jsx as jsx351, jsxs as jsxs221 } from "react/jsx-runtime";
5981
6026
  var ToastContext = React40.createContext(null);
5982
6027
  var useToast = () => {
5983
6028
  const ctx = React40.useContext(ToastContext);
@@ -5993,7 +6038,7 @@ var ToastItemComponent = ({ item, isExiting, onClose }) => {
5993
6038
  setHeight(ref.current.offsetHeight);
5994
6039
  }
5995
6040
  }, [isExiting]);
5996
- return /* @__PURE__ */ jsx349(
6041
+ return /* @__PURE__ */ jsx351(
5997
6042
  "div",
5998
6043
  {
5999
6044
  className: clsx_default("lib-xplat-toast-wrapper", { exit: isExiting }),
@@ -6008,8 +6053,8 @@ var ToastItemComponent = ({ item, isExiting, onClose }) => {
6008
6053
  className: clsx_default("lib-xplat-toast", item.type, { exit: isExiting }),
6009
6054
  role: "alert",
6010
6055
  children: [
6011
- /* @__PURE__ */ jsx349("span", { className: "message", children: item.message }),
6012
- /* @__PURE__ */ jsx349("button", { className: "close-btn", onClick: onClose, "aria-label": "\uB2EB\uAE30", children: "\xD7" })
6056
+ /* @__PURE__ */ jsx351("span", { className: "message", children: item.message }),
6057
+ /* @__PURE__ */ jsx351("button", { className: "close-btn", onClick: onClose, "aria-label": "\uB2EB\uAE30", children: "\xD7" })
6013
6058
  ]
6014
6059
  }
6015
6060
  )
@@ -6050,7 +6095,7 @@ var ToastProvider = ({
6050
6095
  return /* @__PURE__ */ jsxs221(ToastContext.Provider, { value: { toast }, children: [
6051
6096
  children,
6052
6097
  mounted && createPortal3(
6053
- /* @__PURE__ */ jsx349("div", { className: clsx_default("lib-xplat-toast-container", position), children: toasts.map((t) => /* @__PURE__ */ jsx349(
6098
+ /* @__PURE__ */ jsx351("div", { className: clsx_default("lib-xplat-toast-container", position), children: toasts.map((t) => /* @__PURE__ */ jsx351(
6054
6099
  ToastItemComponent,
6055
6100
  {
6056
6101
  item: t,
@@ -6067,15 +6112,17 @@ ToastProvider.displayName = "ToastProvider";
6067
6112
 
6068
6113
  // src/components/Tooltip/Tooltip.tsx
6069
6114
  import React41 from "react";
6070
- import { Fragment as Fragment5, jsx as jsx350, jsxs as jsxs222 } from "react/jsx-runtime";
6115
+ import { Fragment as Fragment5, jsx as jsx352, jsxs as jsxs222 } from "react/jsx-runtime";
6071
6116
  var OFFSET = 12;
6117
+ var GAP = 8;
6072
6118
  var SHOW_DELAY = 300;
6073
6119
  var Tooltip = (props) => {
6074
6120
  const {
6075
- type = "dark",
6121
+ children,
6076
6122
  title,
6077
6123
  description,
6078
- children,
6124
+ type = "dark",
6125
+ follow = false,
6079
6126
  disabled = false
6080
6127
  } = props;
6081
6128
  const triggerRef = React41.useRef(null);
@@ -6083,50 +6130,92 @@ var Tooltip = (props) => {
6083
6130
  const [visible, setVisible] = React41.useState(false);
6084
6131
  const [pos, setPos] = React41.useState({ left: 0, top: 0 });
6085
6132
  const delayTimer = React41.useRef(0);
6086
- const calculatePos = React41.useCallback((clientX, clientY) => {
6133
+ const rafRef = React41.useRef(0);
6134
+ const cursor = React41.useRef(null);
6135
+ const clamp = React41.useCallback((left, top, w, h) => {
6136
+ const vw = window.innerWidth;
6137
+ const vh = window.innerHeight;
6138
+ return {
6139
+ left: Math.min(Math.max(GAP, left), Math.max(GAP, vw - w - GAP)),
6140
+ top: Math.min(Math.max(GAP, top), Math.max(GAP, vh - h - GAP))
6141
+ };
6142
+ }, []);
6143
+ const placeAtCursor = React41.useCallback((x, y) => {
6087
6144
  const el = tooltipRef.current;
6088
6145
  if (!el) return;
6089
6146
  const w = el.offsetWidth;
6090
6147
  const h = el.offsetHeight;
6091
- const vw = window.innerWidth;
6092
- let left = clientX + OFFSET;
6093
- let top = clientY - h - OFFSET;
6094
- if (left + w > vw - 8) left = clientX - w - OFFSET;
6095
- if (top < 8) top = clientY + OFFSET;
6096
- if (left < 8) left = 8;
6097
- setPos({ left, top });
6098
- }, []);
6099
- const handleMouseEnter = React41.useCallback(() => {
6148
+ let left = x + OFFSET;
6149
+ let top = y - h - OFFSET;
6150
+ if (left + w > window.innerWidth - GAP) left = x - w - OFFSET;
6151
+ if (top < GAP) top = y + OFFSET;
6152
+ setPos(clamp(left, top, w, h));
6153
+ }, [clamp]);
6154
+ const placeAtTrigger = React41.useCallback(() => {
6155
+ const el = tooltipRef.current;
6156
+ const trigger = triggerRef.current;
6157
+ if (!el || !trigger) return;
6158
+ const w = el.offsetWidth;
6159
+ const h = el.offsetHeight;
6160
+ const rect = trigger.getBoundingClientRect();
6161
+ let top = rect.top - h - GAP;
6162
+ if (top < GAP) top = rect.bottom + GAP;
6163
+ const left = rect.left + rect.width / 2 - w / 2;
6164
+ setPos(clamp(left, top, w, h));
6165
+ }, [clamp]);
6166
+ const reposition = React41.useCallback(() => {
6167
+ if (follow && cursor.current) {
6168
+ placeAtCursor(cursor.current.x, cursor.current.y);
6169
+ } else {
6170
+ placeAtTrigger();
6171
+ }
6172
+ }, [follow, placeAtCursor, placeAtTrigger]);
6173
+ const handleMouseEnter = React41.useCallback((e) => {
6100
6174
  if (disabled) return;
6101
- delayTimer.current = window.setTimeout(() => {
6102
- setVisible(true);
6103
- }, SHOW_DELAY);
6175
+ cursor.current = { x: e.clientX, y: e.clientY };
6176
+ delayTimer.current = window.setTimeout(() => setVisible(true), SHOW_DELAY);
6104
6177
  }, [disabled]);
6105
6178
  const handleMouseMove = React41.useCallback((e) => {
6106
- if (!visible) return;
6107
- calculatePos(e.clientX, e.clientY);
6108
- }, [visible, calculatePos]);
6109
- const handleMouseLeave = React41.useCallback(() => {
6110
- window.clearTimeout(delayTimer.current);
6111
- setVisible(false);
6112
- }, []);
6113
- const handleClick = React41.useCallback(() => {
6179
+ cursor.current = { x: e.clientX, y: e.clientY };
6180
+ if (!visible || !follow) return;
6181
+ cancelAnimationFrame(rafRef.current);
6182
+ rafRef.current = requestAnimationFrame(() => {
6183
+ if (cursor.current) placeAtCursor(cursor.current.x, cursor.current.y);
6184
+ });
6185
+ }, [visible, follow, placeAtCursor]);
6186
+ const close = React41.useCallback(() => {
6114
6187
  window.clearTimeout(delayTimer.current);
6188
+ cancelAnimationFrame(rafRef.current);
6115
6189
  setVisible(false);
6116
6190
  }, []);
6191
+ const handleMouseLeave = React41.useCallback(() => {
6192
+ cursor.current = null;
6193
+ close();
6194
+ }, [close]);
6117
6195
  const handleFocus = React41.useCallback(() => {
6118
6196
  if (disabled) return;
6197
+ cursor.current = null;
6119
6198
  setVisible(true);
6120
6199
  }, [disabled]);
6121
- const handleBlur = React41.useCallback(() => {
6122
- setVisible(false);
6123
- }, []);
6124
6200
  React41.useLayoutEffect(() => {
6125
- if (!visible || !triggerRef.current) return;
6126
- const rect = triggerRef.current.getBoundingClientRect();
6127
- calculatePos(rect.right, rect.top);
6128
- }, [visible, calculatePos]);
6129
- if (!title && !description) return /* @__PURE__ */ jsx350(Fragment5, { children });
6201
+ if (!visible) return;
6202
+ reposition();
6203
+ }, [visible, reposition]);
6204
+ React41.useEffect(() => {
6205
+ if (!visible || follow) return;
6206
+ const onChange = () => placeAtTrigger();
6207
+ window.addEventListener("scroll", onChange, true);
6208
+ window.addEventListener("resize", onChange);
6209
+ return () => {
6210
+ window.removeEventListener("scroll", onChange, true);
6211
+ window.removeEventListener("resize", onChange);
6212
+ };
6213
+ }, [visible, follow, placeAtTrigger]);
6214
+ React41.useEffect(() => () => {
6215
+ window.clearTimeout(delayTimer.current);
6216
+ cancelAnimationFrame(rafRef.current);
6217
+ }, []);
6218
+ if (!title && !description) return /* @__PURE__ */ jsx352(Fragment5, { children });
6130
6219
  return /* @__PURE__ */ jsxs222(
6131
6220
  "div",
6132
6221
  {
@@ -6135,20 +6224,21 @@ var Tooltip = (props) => {
6135
6224
  onMouseEnter: handleMouseEnter,
6136
6225
  onMouseMove: handleMouseMove,
6137
6226
  onMouseLeave: handleMouseLeave,
6138
- onClick: handleClick,
6227
+ onClick: close,
6139
6228
  onFocus: handleFocus,
6140
- onBlur: handleBlur,
6229
+ onBlur: close,
6141
6230
  children: [
6142
6231
  children,
6143
- visible && /* @__PURE__ */ jsx350(Portal_default, { children: /* @__PURE__ */ jsxs222(
6232
+ visible && /* @__PURE__ */ jsx352(Portal_default, { children: /* @__PURE__ */ jsxs222(
6144
6233
  "div",
6145
6234
  {
6146
6235
  ref: tooltipRef,
6236
+ role: "tooltip",
6147
6237
  className: clsx_default("lib-xplat-tooltip", type),
6148
6238
  style: { position: "fixed", left: pos.left, top: pos.top },
6149
6239
  children: [
6150
- title && /* @__PURE__ */ jsx350("div", { className: "tooltip-title", children: title }),
6151
- description && /* @__PURE__ */ jsx350("div", { className: "tooltip-desc", children: description })
6240
+ title && /* @__PURE__ */ jsx352("div", { className: "tooltip-title", children: title }),
6241
+ description && /* @__PURE__ */ jsx352("div", { className: "tooltip-desc", children: description })
6152
6242
  ]
6153
6243
  }
6154
6244
  ) })
@@ -6161,10 +6251,10 @@ var Tooltip_default = Tooltip;
6161
6251
 
6162
6252
  // src/components/Video/Video.tsx
6163
6253
  import React42 from "react";
6164
- import { jsx as jsx351, jsxs as jsxs223 } from "react/jsx-runtime";
6254
+ import { jsx as jsx353, jsxs as jsxs223 } from "react/jsx-runtime";
6165
6255
  var PipIcon = () => /* @__PURE__ */ jsxs223("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
6166
- /* @__PURE__ */ jsx351("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2" }),
6167
- /* @__PURE__ */ jsx351("rect", { x: "12", y: "11", width: "7", height: "6", rx: "1", fill: "currentColor" })
6256
+ /* @__PURE__ */ jsx353("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2" }),
6257
+ /* @__PURE__ */ jsx353("rect", { x: "12", y: "11", width: "7", height: "6", rx: "1", fill: "currentColor" })
6168
6258
  ] });
6169
6259
  var formatTime = (sec) => {
6170
6260
  if (!Number.isFinite(sec) || sec < 0) return "0:00";
@@ -6345,7 +6435,7 @@ var Video = React42.forwardRef((props, ref) => {
6345
6435
  ref: containerRef,
6346
6436
  className: clsx_default("lib-xplat-video", showControls && "has-controls"),
6347
6437
  children: [
6348
- /* @__PURE__ */ jsx351(
6438
+ /* @__PURE__ */ jsx353(
6349
6439
  "video",
6350
6440
  {
6351
6441
  ref: setRefs,
@@ -6366,7 +6456,7 @@ var Video = React42.forwardRef((props, ref) => {
6366
6456
  children
6367
6457
  }
6368
6458
  ),
6369
- showCenterPlay && /* @__PURE__ */ jsx351(
6459
+ showCenterPlay && /* @__PURE__ */ jsx353(
6370
6460
  "button",
6371
6461
  {
6372
6462
  type: "button",
@@ -6378,11 +6468,11 @@ var Video = React42.forwardRef((props, ref) => {
6378
6468
  onClick: togglePlay,
6379
6469
  "aria-label": isPlaying ? "\uC77C\uC2DC\uC815\uC9C0" : "\uC7AC\uC0DD",
6380
6470
  tabIndex: -1,
6381
- children: /* @__PURE__ */ jsx351("span", { className: "center-play-icon", children: /* @__PURE__ */ jsx351(PlayCircleIcon_default, {}) })
6471
+ children: /* @__PURE__ */ jsx353("span", { className: "center-play-icon", children: /* @__PURE__ */ jsx353(PlayCircleIcon_default, {}) })
6382
6472
  }
6383
6473
  ),
6384
6474
  showControls && /* @__PURE__ */ jsxs223("div", { className: "controls", onClick: (e) => e.stopPropagation(), children: [
6385
- /* @__PURE__ */ jsx351(
6475
+ /* @__PURE__ */ jsx353(
6386
6476
  "input",
6387
6477
  {
6388
6478
  type: "range",
@@ -6400,28 +6490,28 @@ var Video = React42.forwardRef((props, ref) => {
6400
6490
  }
6401
6491
  ),
6402
6492
  /* @__PURE__ */ jsxs223("div", { className: "controls-row", children: [
6403
- /* @__PURE__ */ jsx351(
6493
+ /* @__PURE__ */ jsx353(
6404
6494
  "button",
6405
6495
  {
6406
6496
  type: "button",
6407
6497
  className: "control-btn",
6408
6498
  onClick: togglePlay,
6409
6499
  "aria-label": isPlaying ? "\uC77C\uC2DC\uC815\uC9C0" : "\uC7AC\uC0DD",
6410
- children: isPlaying ? /* @__PURE__ */ jsx351(PauseIcon_default, {}) : /* @__PURE__ */ jsx351(PlayIcon_default, {})
6500
+ children: isPlaying ? /* @__PURE__ */ jsx353(PauseIcon_default, {}) : /* @__PURE__ */ jsx353(PlayIcon_default, {})
6411
6501
  }
6412
6502
  ),
6413
6503
  /* @__PURE__ */ jsxs223("div", { className: "volume-group", children: [
6414
- /* @__PURE__ */ jsx351(
6504
+ /* @__PURE__ */ jsx353(
6415
6505
  "button",
6416
6506
  {
6417
6507
  type: "button",
6418
6508
  className: "control-btn",
6419
6509
  onClick: toggleMute,
6420
6510
  "aria-label": isMuted ? "\uC74C\uC18C\uAC70 \uD574\uC81C" : "\uC74C\uC18C\uAC70",
6421
- children: /* @__PURE__ */ jsx351(VolumeGlyph, {})
6511
+ children: /* @__PURE__ */ jsx353(VolumeGlyph, {})
6422
6512
  }
6423
6513
  ),
6424
- /* @__PURE__ */ jsx351(
6514
+ /* @__PURE__ */ jsx353(
6425
6515
  "input",
6426
6516
  {
6427
6517
  type: "range",
@@ -6441,7 +6531,7 @@ var Video = React42.forwardRef((props, ref) => {
6441
6531
  " / ",
6442
6532
  formatTime(duration)
6443
6533
  ] }),
6444
- /* @__PURE__ */ jsx351("div", { className: "controls-spacer" }),
6534
+ /* @__PURE__ */ jsx353("div", { className: "controls-spacer" }),
6445
6535
  playbackRates && playbackRates.length > 0 && /* @__PURE__ */ jsxs223("div", { className: clsx_default("rate-group", rateMenuOpen && "is-open"), children: [
6446
6536
  /* @__PURE__ */ jsxs223(
6447
6537
  "button",
@@ -6457,7 +6547,7 @@ var Video = React42.forwardRef((props, ref) => {
6457
6547
  ]
6458
6548
  }
6459
6549
  ),
6460
- rateMenuOpen && /* @__PURE__ */ jsx351("ul", { className: "rate-menu", role: "menu", children: playbackRates.map((r2) => /* @__PURE__ */ jsx351("li", { children: /* @__PURE__ */ jsxs223(
6550
+ rateMenuOpen && /* @__PURE__ */ jsx353("ul", { className: "rate-menu", role: "menu", children: playbackRates.map((r2) => /* @__PURE__ */ jsx353("li", { children: /* @__PURE__ */ jsxs223(
6461
6551
  "button",
6462
6552
  {
6463
6553
  type: "button",
@@ -6471,7 +6561,7 @@ var Video = React42.forwardRef((props, ref) => {
6471
6561
  }
6472
6562
  ) }, r2)) })
6473
6563
  ] }),
6474
- showCaptions && /* @__PURE__ */ jsx351(
6564
+ showCaptions && /* @__PURE__ */ jsx353(
6475
6565
  "button",
6476
6566
  {
6477
6567
  type: "button",
@@ -6479,37 +6569,37 @@ var Video = React42.forwardRef((props, ref) => {
6479
6569
  onClick: toggleCaptions,
6480
6570
  "aria-label": captionsOn ? "\uC790\uB9C9 \uB044\uAE30" : "\uC790\uB9C9 \uCF1C\uAE30",
6481
6571
  "aria-pressed": captionsOn,
6482
- children: /* @__PURE__ */ jsx351(TypeIcon_default, {})
6572
+ children: /* @__PURE__ */ jsx353(TypeIcon_default, {})
6483
6573
  }
6484
6574
  ),
6485
- showPip && pipSupported && /* @__PURE__ */ jsx351(
6575
+ showPip && pipSupported && /* @__PURE__ */ jsx353(
6486
6576
  "button",
6487
6577
  {
6488
6578
  type: "button",
6489
6579
  className: clsx_default("control-btn", isPip && "is-active"),
6490
6580
  onClick: togglePip,
6491
6581
  "aria-label": isPip ? "PIP \uC885\uB8CC" : "PIP",
6492
- children: /* @__PURE__ */ jsx351(PipIcon, {})
6582
+ children: /* @__PURE__ */ jsx353(PipIcon, {})
6493
6583
  }
6494
6584
  ),
6495
- showDownload && /* @__PURE__ */ jsx351(
6585
+ showDownload && /* @__PURE__ */ jsx353(
6496
6586
  "a",
6497
6587
  {
6498
6588
  className: "control-btn",
6499
6589
  href: src,
6500
6590
  download: downloadFileName ?? true,
6501
6591
  "aria-label": "\uB2E4\uC6B4\uB85C\uB4DC",
6502
- children: /* @__PURE__ */ jsx351(DownloadIcon_default, {})
6592
+ children: /* @__PURE__ */ jsx353(DownloadIcon_default, {})
6503
6593
  }
6504
6594
  ),
6505
- /* @__PURE__ */ jsx351(
6595
+ /* @__PURE__ */ jsx353(
6506
6596
  "button",
6507
6597
  {
6508
6598
  type: "button",
6509
6599
  className: "control-btn",
6510
6600
  onClick: toggleFullscreen,
6511
6601
  "aria-label": isFullscreen ? "\uC804\uCCB4\uD654\uBA74 \uC885\uB8CC" : "\uC804\uCCB4\uD654\uBA74",
6512
- children: isFullscreen ? /* @__PURE__ */ jsx351(MinimizeIcon_default, {}) : /* @__PURE__ */ jsx351(MaximizeIcon_default, {})
6602
+ children: isFullscreen ? /* @__PURE__ */ jsx353(MinimizeIcon_default, {}) : /* @__PURE__ */ jsx353(MaximizeIcon_default, {})
6513
6603
  }
6514
6604
  )
6515
6605
  ] })
@@ -6547,6 +6637,8 @@ export {
6547
6637
  ImageSelector_default as ImageSelector,
6548
6638
  Input_default as Input,
6549
6639
  InputDatePicker_default as InputDatePicker,
6640
+ Link_default as Link,
6641
+ LinkButton_default as LinkButton,
6550
6642
  Modal_default as Modal,
6551
6643
  NotificationBadge_default as NotificationBadge,
6552
6644
  Pagination_default as Pagination,