@kjaniec-dev/ui 0.9.1 → 0.9.2

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/dist/index.cjs CHANGED
@@ -1178,7 +1178,7 @@ var BottomNavigation = React52__namespace.forwardRef(
1178
1178
  );
1179
1179
  BottomNavigation.displayName = "BottomNavigation";
1180
1180
  var TableWrap = React52__namespace.forwardRef(
1181
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("border border-border rounded-kj-lg overflow-x-auto w-full", className), ...props })
1181
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("w-full max-w-full overflow-x-auto border border-border rounded-kj-lg", className), ...props })
1182
1182
  );
1183
1183
  TableWrap.displayName = "TableWrap";
1184
1184
  var Table = React52__namespace.forwardRef(
@@ -1333,7 +1333,7 @@ function Modal({ open, onClose, children, width = 440, className, showClose = tr
1333
1333
  tabIndex: -1,
1334
1334
  style: { maxWidth: width },
1335
1335
  className: cn(
1336
- "relative w-full p-7 rounded-kj-2xl bg-surface border border-border shadow-kj-lg transition-transform duration-200 outline-none",
1336
+ "relative w-full p-7 rounded-kj-2xl bg-surface text-foreground border border-border shadow-kj-lg transition-transform duration-200 outline-none",
1337
1337
  open ? "scale-100 translate-y-0" : "scale-95 translate-y-2",
1338
1338
  className
1339
1339
  ),
@@ -1357,7 +1357,7 @@ function Modal({ open, onClose, children, width = 440, className, showClose = tr
1357
1357
  }
1358
1358
  function ModalTitle({ className, id, children, ...props }) {
1359
1359
  const ctx = React52__namespace.useContext(ModalContext);
1360
- return /* @__PURE__ */ jsxRuntime.jsx("h3", { id: id ?? ctx?.titleId, className: cn("m-0 mb-2 text-[1.15rem] font-bold tracking-[-0.01em]", className), ...props, children });
1360
+ return /* @__PURE__ */ jsxRuntime.jsx("h3", { id: id ?? ctx?.titleId, className: cn("m-0 mb-2 text-[1.15rem] font-bold tracking-[-0.01em] text-foreground", className), ...props, children });
1361
1361
  }
1362
1362
  function ModalDescription({ className, id, ...props }) {
1363
1363
  const ctx = React52__namespace.useContext(ModalContext);
@@ -1648,7 +1648,7 @@ function DataTable({
1648
1648
  };
1649
1649
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-4 w-full", className), children: [
1650
1650
  toolbar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col sm:flex-row items-stretch sm:items-center justify-between gap-3", children: toolbar }),
1651
- /* @__PURE__ */ jsxRuntime.jsxs(TableWrap, { className: "relative overflow-hidden", ...props, children: [
1651
+ /* @__PURE__ */ jsxRuntime.jsxs(TableWrap, { className: "relative overflow-x-auto overflow-y-hidden [scroll-behavior:smooth] [-webkit-overflow-scrolling:touch]", ...props, children: [
1652
1652
  /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
1653
1653
  /* @__PURE__ */ jsxRuntime.jsx(TableHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(TableRow, { children: [
1654
1654
  isSelectionActive && /* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "w-12 px-4 text-center", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "inline-flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -3496,7 +3496,7 @@ function isBetweenExclusive(d, lo, hi) {
3496
3496
  return t > startOfDay(lo).getTime() && t < startOfDay(hi).getTime();
3497
3497
  }
3498
3498
  var RangeCalendar = React52__namespace.forwardRef(
3499
- function RangeCalendar2({ value, defaultValue, onChange, month, defaultMonth, onMonthChange, min, max, disabledDates, className }, ref) {
3499
+ function RangeCalendar2({ value, defaultValue, onChange, month, defaultMonth, onMonthChange, min, max, disabledDates, singleMonth, className }, ref) {
3500
3500
  const controlled = value !== void 0;
3501
3501
  const [internalValue, setInternalValue] = React52__namespace.useState(defaultValue ?? {});
3502
3502
  const range2 = controlled ? value : internalValue;
@@ -3584,12 +3584,13 @@ var RangeCalendar = React52__namespace.forwardRef(
3584
3584
  children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", className: "h-4 w-4", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: direction === "prev" ? /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m15 18-6-6 6-6" }) : /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m9 18 6-6-6-6" }) })
3585
3585
  }
3586
3586
  );
3587
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: cn("flex gap-6 select-none", className), children: [
3588
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-[280px]", children: [
3587
+ const showSingleMonth = singleMonth;
3588
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: cn("flex flex-col sm:flex-row gap-4 sm:gap-6 select-none max-w-full overflow-hidden", className), children: [
3589
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full sm:w-[280px]", children: [
3589
3590
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
3590
3591
  navButton("prev"),
3591
3592
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-foreground", children: monthLabelFormat.format(leftMonth) }),
3592
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-[26px]", "aria-hidden": "true" })
3593
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: showSingleMonth ? "" : "sm:hidden", children: navButton("next") })
3593
3594
  ] }),
3594
3595
  /* @__PURE__ */ jsxRuntime.jsx(
3595
3596
  CalendarGrid,
@@ -3603,7 +3604,7 @@ var RangeCalendar = React52__namespace.forwardRef(
3603
3604
  }
3604
3605
  )
3605
3606
  ] }),
3606
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-[280px]", children: [
3607
+ !showSingleMonth && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "hidden sm:block w-[280px]", children: [
3607
3608
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-2", children: [
3608
3609
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-[26px]", "aria-hidden": "true" }),
3609
3610
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-foreground", children: monthLabelFormat.format(rightMonth) }),
@@ -3750,7 +3751,7 @@ var DateRangePicker = React52__namespace.forwardRef(
3750
3751
  "div",
3751
3752
  {
3752
3753
  onKeyDown: onPanelKeyDown,
3753
- className: "absolute z-40 top-[calc(100%+6px)] left-0 bg-surface border border-border rounded-kj-md shadow-kj-lg p-3 animate-[kjpop_.12s_ease]",
3754
+ className: "absolute z-40 top-[calc(100%+6px)] left-0 sm:left-auto right-0 sm:right-auto max-w-[calc(100vw-2rem)] bg-surface border border-border rounded-kj-md shadow-kj-lg p-3 animate-[kjpop_.12s_ease]",
3754
3755
  children: /* @__PURE__ */ jsxRuntime.jsx(RangeCalendar, { value: selected, onChange: handleRangeChange, min, max, disabledDates })
3755
3756
  }
3756
3757
  )
@@ -4233,7 +4234,7 @@ function useStepper({ initialStep = 0, stepsCount }) {
4233
4234
  var StepperContext = React52__namespace.createContext(null);
4234
4235
  var StepperItemContext = React52__namespace.createContext(null);
4235
4236
  var Stepper = React52__namespace.forwardRef(
4236
- ({ value, defaultValue, onValueChange, orientation = "horizontal", linear = true, children, className, ...props }, ref) => {
4237
+ ({ value, defaultValue, onValueChange, orientation = "horizontal", responsive = true, linear = true, children, className, ...props }, ref) => {
4237
4238
  const [localValue, setLocalValue] = React52__namespace.useState(defaultValue ?? 0);
4238
4239
  const isControlled = value !== void 0;
4239
4240
  const activeStep = isControlled ? value : localValue;
@@ -4265,6 +4266,7 @@ var Stepper = React52__namespace.forwardRef(
4265
4266
  () => ({
4266
4267
  activeStep,
4267
4268
  orientation,
4269
+ responsive,
4268
4270
  linear,
4269
4271
  setStep,
4270
4272
  completedSteps,
@@ -4272,7 +4274,7 @@ var Stepper = React52__namespace.forwardRef(
4272
4274
  unregisterStep,
4273
4275
  steps
4274
4276
  }),
4275
- [activeStep, orientation, linear, setStep, completedSteps, registerStep, unregisterStep, steps]
4277
+ [activeStep, orientation, responsive, linear, setStep, completedSteps, registerStep, unregisterStep, steps]
4276
4278
  );
4277
4279
  return /* @__PURE__ */ jsxRuntime.jsx(StepperContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(
4278
4280
  "div",
@@ -4314,16 +4316,15 @@ var StepperList = React52__namespace.forwardRef(
4314
4316
  ({ className, children, ...props }, ref) => {
4315
4317
  const ctx = React52__namespace.useContext(StepperContext);
4316
4318
  if (!ctx) throw new Error("StepperList must be used within a Stepper");
4319
+ const isResponsiveHorizontal = ctx.orientation === "horizontal" && (ctx.responsive ?? true);
4320
+ const orientationClass = isResponsiveHorizontal ? "flex flex-col sm:flex-row items-start sm:items-center justify-between w-full relative gap-4" : ctx.orientation === "horizontal" ? "flex items-center justify-between w-full relative gap-4" : "flex flex-col items-start gap-6 relative w-full";
4317
4321
  return /* @__PURE__ */ jsxRuntime.jsx(
4318
4322
  "div",
4319
4323
  {
4320
4324
  ref,
4321
4325
  role: "tablist",
4322
4326
  "aria-orientation": ctx.orientation,
4323
- className: cn(
4324
- ctx.orientation === "horizontal" ? "flex items-center justify-between w-full relative gap-4" : "flex flex-col items-start gap-6 relative w-full",
4325
- className
4326
- ),
4327
+ className: cn(orientationClass, className),
4327
4328
  ...props,
4328
4329
  children
4329
4330
  }
@@ -4341,13 +4342,14 @@ var StepperItem = React52__namespace.forwardRef(
4341
4342
  return () => unregisterStep(value);
4342
4343
  }, [value, registerStep, unregisterStep]);
4343
4344
  const isLast = ctx.steps[ctx.steps.length - 1] === value;
4345
+ const isResponsiveHorizontal = ctx.orientation === "horizontal" && (ctx.responsive ?? true);
4344
4346
  return /* @__PURE__ */ jsxRuntime.jsx(StepperItemContext.Provider, { value: { value, disabled, isLast }, children: /* @__PURE__ */ jsxRuntime.jsx(
4345
4347
  "div",
4346
4348
  {
4347
4349
  ref,
4348
4350
  className: cn(
4349
4351
  "group relative flex items-center gap-3 z-10",
4350
- ctx.orientation === "vertical" ? "flex items-start w-full" : "",
4352
+ ctx.orientation === "vertical" ? "flex items-start w-full" : isResponsiveHorizontal ? "w-full sm:w-auto items-start sm:items-center" : "",
4351
4353
  className
4352
4354
  ),
4353
4355
  ...props,
@@ -4361,12 +4363,13 @@ var StepperSeparator = React52__namespace.forwardRef(
4361
4363
  ({ className, ...props }, ref) => {
4362
4364
  const ctx = React52__namespace.useContext(StepperContext);
4363
4365
  if (!ctx) throw new Error("StepperSeparator must be used within a Stepper");
4366
+ const isResponsiveHorizontal = ctx.orientation === "horizontal" && (ctx.responsive ?? true);
4364
4367
  return /* @__PURE__ */ jsxRuntime.jsx(
4365
4368
  "div",
4366
4369
  {
4367
4370
  ref,
4368
4371
  className: cn(
4369
- ctx.orientation === "horizontal" ? "flex-1 h-[2px] bg-border transition-all duration-300" : "w-[2px] bg-border absolute left-[17px] top-8 bottom-0 -ml-px z-0",
4372
+ isResponsiveHorizontal ? "hidden sm:block flex-1 h-[2px] bg-border transition-all duration-300" : ctx.orientation === "horizontal" ? "flex-1 h-[2px] bg-border transition-all duration-300" : "w-[2px] bg-border absolute left-[17px] top-8 bottom-0 -ml-px z-0",
4370
4373
  className
4371
4374
  ),
4372
4375
  ...props
@@ -4549,6 +4552,16 @@ var AppShellHeader = React52__namespace.forwardRef(
4549
4552
  window.addEventListener("keydown", handleKeyDown);
4550
4553
  return () => window.removeEventListener("keydown", handleKeyDown);
4551
4554
  }, [mobileOpen]);
4555
+ React52__namespace.useEffect(() => {
4556
+ if (mobileOpen) {
4557
+ document.body.style.overflow = "hidden";
4558
+ } else {
4559
+ document.body.style.overflow = "";
4560
+ }
4561
+ return () => {
4562
+ document.body.style.overflow = "";
4563
+ };
4564
+ }, [mobileOpen]);
4552
4565
  const positionClass = {
4553
4566
  sticky: "sticky top-0 z-40",
4554
4567
  fixed: "fixed top-0 left-0 right-0 z-40",
@@ -4642,7 +4655,7 @@ var AppShellMain = React52__namespace.forwardRef(
4642
4655
  "main",
4643
4656
  {
4644
4657
  ref,
4645
- className: cn("flex-1", padded && "px-4 sm:px-6 lg:px-8 py-8 md:py-12", widthClass, className),
4658
+ className: cn("flex-1", padded && "px-4 sm:px-6 lg:px-8 py-4 sm:py-6 md:py-12", widthClass, className),
4646
4659
  ...props,
4647
4660
  children
4648
4661
  }
@@ -4680,6 +4693,7 @@ var AppShell = React52__namespace.forwardRef(
4680
4693
  headerVariant = "glass",
4681
4694
  paddedContent = true,
4682
4695
  mobileNav,
4696
+ bottomNav,
4683
4697
  ...props
4684
4698
  }, ref) => {
4685
4699
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -4692,7 +4706,8 @@ var AppShell = React52__namespace.forwardRef(
4692
4706
  banner && /* @__PURE__ */ jsxRuntime.jsx(AppShellBanner, { children: banner }),
4693
4707
  header && /* @__PURE__ */ jsxRuntime.jsx(AppShellHeader, { variant: headerVariant, position: headerPosition, mobileNav, children: header }),
4694
4708
  /* @__PURE__ */ jsxRuntime.jsx(AppShellMain, { width: contentWidth, padded: paddedContent, children }),
4695
- footer && /* @__PURE__ */ jsxRuntime.jsx(AppShellFooter, { children: footer })
4709
+ footer && /* @__PURE__ */ jsxRuntime.jsx(AppShellFooter, { children: footer }),
4710
+ bottomNav && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "md:hidden sticky bottom-0 z-30 w-full bg-surface border-t border-border", children: bottomNav })
4696
4711
  ]
4697
4712
  }
4698
4713
  );
@@ -5535,6 +5550,7 @@ function InboxContent({
5535
5550
  viewAllHref,
5536
5551
  viewAllLabel = "View all notifications",
5537
5552
  emptyState,
5553
+ align = "auto",
5538
5554
  width = 360,
5539
5555
  maxHeight = 320,
5540
5556
  className
@@ -5554,6 +5570,11 @@ function InboxContent({
5554
5570
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-foreground", children: "All caught up" }),
5555
5571
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-0.5", children: "No new notifications" })
5556
5572
  ] });
5573
+ const alignClass = {
5574
+ start: "left-0 top-[calc(100%+6px)]",
5575
+ end: "right-0 top-[calc(100%+6px)]",
5576
+ auto: "right-0 sm:right-0 left-auto top-[calc(100%+6px)] max-sm:left-1/2 max-sm:-translate-x-1/2"
5577
+ }[align ?? "auto"];
5557
5578
  return /* @__PURE__ */ jsxRuntime.jsxs(
5558
5579
  "div",
5559
5580
  {
@@ -5561,11 +5582,12 @@ function InboxContent({
5561
5582
  role: "dialog",
5562
5583
  "aria-label": "Notifications",
5563
5584
  tabIndex: -1,
5564
- style: { width },
5585
+ style: { width: typeof width === "number" ? `${width}px` : width },
5565
5586
  className: cn(
5566
- "absolute right-0 top-[calc(100%+6px)] z-40",
5587
+ "absolute z-40 max-w-[calc(100vw-1.5rem)]",
5567
5588
  "bg-surface border border-border rounded-kj-md shadow-kj-lg outline-none",
5568
5589
  "animate-[kjpop_.12s_ease]",
5590
+ alignClass,
5569
5591
  className
5570
5592
  ),
5571
5593
  children: [
@@ -6081,6 +6103,385 @@ function ImageGallery({
6081
6103
  )
6082
6104
  ] });
6083
6105
  }
6106
+ var OFFICIAL_SCRIPT_URL = "https://geowidget.easypack24.net/js/sdk-for-javascript.js";
6107
+ var OFFICIAL_CSS_URL = "https://geowidget.easypack24.net/css/easypack.css";
6108
+ var scriptPromise = null;
6109
+ function useInPostScript(options = {}) {
6110
+ const [isLoaded, setIsLoaded] = React52.useState(() => {
6111
+ if (typeof window === "undefined") return false;
6112
+ return !!(window.customElements?.get("inpost-geowidget") || window.easyPack);
6113
+ });
6114
+ const [error, setError] = React52.useState(null);
6115
+ const scriptUrl = options.customScriptUrl || OFFICIAL_SCRIPT_URL;
6116
+ const cssUrl = options.customCssUrl || OFFICIAL_CSS_URL;
6117
+ React52.useEffect(() => {
6118
+ if (typeof window === "undefined") return;
6119
+ if (window.customElements?.get("inpost-geowidget") || window.easyPack) {
6120
+ return;
6121
+ }
6122
+ let linkTag = document.querySelector(`link[href="${cssUrl}"]`);
6123
+ if (!linkTag) {
6124
+ linkTag = document.createElement("link");
6125
+ linkTag.rel = "stylesheet";
6126
+ linkTag.href = cssUrl;
6127
+ linkTag.type = "text/css";
6128
+ document.head.appendChild(linkTag);
6129
+ }
6130
+ if (!scriptPromise) {
6131
+ scriptPromise = new Promise((resolve, reject) => {
6132
+ let scriptTag = document.querySelector(`script[src="${scriptUrl}"]`);
6133
+ if (!scriptTag) {
6134
+ scriptTag = document.createElement("script");
6135
+ scriptTag.src = scriptUrl;
6136
+ scriptTag.async = true;
6137
+ document.head.appendChild(scriptTag);
6138
+ }
6139
+ scriptTag.addEventListener("load", () => resolve());
6140
+ scriptTag.addEventListener(
6141
+ "error",
6142
+ (err) => reject(err instanceof Error ? err : new Error("Failed to load InPost GeoWidget SDK script"))
6143
+ );
6144
+ });
6145
+ }
6146
+ scriptPromise.then(async () => {
6147
+ if (typeof window !== "undefined" && window.customElements?.whenDefined) {
6148
+ try {
6149
+ await Promise.race([
6150
+ window.customElements.whenDefined("inpost-geowidget"),
6151
+ new Promise((r) => setTimeout(r, 100))
6152
+ ]);
6153
+ } catch {
6154
+ }
6155
+ }
6156
+ setIsLoaded(true);
6157
+ }).catch((err) => {
6158
+ setError(err instanceof Error ? err : new Error(String(err)));
6159
+ });
6160
+ }, [scriptUrl, cssUrl]);
6161
+ return { isLoaded, error };
6162
+ }
6163
+ var MOCK_POINTS = [
6164
+ {
6165
+ name: "WAW01M",
6166
+ address: { line1: "ul. Towarowa 5", line2: "00-838 Warszawa" },
6167
+ address_details: { city: "Warszawa", street: "Towarowa", building_number: "5", post_code: "00-838" },
6168
+ location: { latitude: 52.2297, longitude: 21.0122 },
6169
+ type: ["parcel_locker"],
6170
+ status: "Operating",
6171
+ location_description: "Przy stacji benzynowej BP"
6172
+ },
6173
+ {
6174
+ name: "KRA02N",
6175
+ address: { line1: "ul. Floria\u0144ska 12", line2: "31-021 Krak\xF3w" },
6176
+ address_details: { city: "Krak\xF3w", street: "Floria\u0144ska", building_number: "12", post_code: "31-021" },
6177
+ location: { latitude: 50.0647, longitude: 19.945 },
6178
+ type: ["parcel_locker"],
6179
+ status: "Operating",
6180
+ location_description: "Obok wej\u015Bcia do sklepu"
6181
+ },
6182
+ {
6183
+ name: "GDA03P",
6184
+ address: { line1: "ul. D\u0142uga 8", line2: "80-827 Gda\u0144sk" },
6185
+ address_details: { city: "Gda\u0144sk", street: "D\u0142uga", building_number: "8", post_code: "80-827" },
6186
+ location: { latitude: 54.352, longitude: 18.6466 },
6187
+ type: ["parcel_locker"],
6188
+ status: "Operating",
6189
+ location_description: "R\xF3g ulicy D\u0142ugiej i Tkackiej"
6190
+ },
6191
+ {
6192
+ name: "POZ04S",
6193
+ address: { line1: "ul. P\xF3\u0142wiejska 42", line2: "61-888 Pozna\u0144" },
6194
+ address_details: { city: "Pozna\u0144", street: "P\xF3\u0142wiejska", building_number: "42", post_code: "61-888" },
6195
+ location: { latitude: 52.4064, longitude: 16.9252 },
6196
+ type: ["parcel_locker"],
6197
+ status: "Operating",
6198
+ location_description: "Przy centrum handlowym Stary Browar"
6199
+ }
6200
+ ];
6201
+ var InPostGeowidget = ({
6202
+ token,
6203
+ language = "pl",
6204
+ config = "parcelCollect",
6205
+ sandbox = false,
6206
+ onPointSelect,
6207
+ onReady,
6208
+ onError,
6209
+ className,
6210
+ style,
6211
+ customScriptUrl,
6212
+ customCssUrl
6213
+ }) => {
6214
+ const { isLoaded, error } = useInPostScript({
6215
+ customScriptUrl,
6216
+ customCssUrl
6217
+ });
6218
+ const [searchQuery, setSearchQuery] = React52.useState("");
6219
+ const [selectedMock, setSelectedMock] = React52.useState(null);
6220
+ const widgetRef = React52.useRef(null);
6221
+ const callbackNameRef = React52.useRef(`inpost_cb_${Math.random().toString(36).substring(2, 9)}`);
6222
+ React52.useEffect(() => {
6223
+ if (error && onError) {
6224
+ onError(error);
6225
+ }
6226
+ }, [error, onError]);
6227
+ React52.useEffect(() => {
6228
+ if (isLoaded && onReady) {
6229
+ onReady();
6230
+ }
6231
+ }, [isLoaded, onReady]);
6232
+ React52.useEffect(() => {
6233
+ if (!token) return;
6234
+ const cbName = callbackNameRef.current;
6235
+ window[cbName] = (point) => {
6236
+ if (onPointSelect) {
6237
+ onPointSelect(point);
6238
+ }
6239
+ };
6240
+ const el = widgetRef.current;
6241
+ const handlePointSelect = (event) => {
6242
+ const customEv = event;
6243
+ const point = customEv.detail || customEv.point;
6244
+ if (point && onPointSelect) {
6245
+ onPointSelect(point);
6246
+ }
6247
+ };
6248
+ if (el) {
6249
+ el.addEventListener("inpostgeowidget", handlePointSelect);
6250
+ el.addEventListener("onpointselect", handlePointSelect);
6251
+ }
6252
+ document.addEventListener("onpointselect", handlePointSelect);
6253
+ return () => {
6254
+ delete window[cbName];
6255
+ if (el) {
6256
+ el.removeEventListener("inpostgeowidget", handlePointSelect);
6257
+ el.removeEventListener("onpointselect", handlePointSelect);
6258
+ }
6259
+ document.removeEventListener("onpointselect", handlePointSelect);
6260
+ };
6261
+ }, [onPointSelect, isLoaded, token]);
6262
+ if (error) {
6263
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6264
+ "div",
6265
+ {
6266
+ className: `flex flex-col items-center justify-center min-h-[450px] bg-danger/10 border-2 border-danger rounded-xl p-6 text-center ${className || ""}`,
6267
+ style,
6268
+ children: [
6269
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-extrabold text-danger mb-1", children: "B\u0142\u0105d \u0142adowania Geowidget InPost" }),
6270
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-semibold max-w-sm", children: "Nie uda\u0142o si\u0119 pobra\u0107 skryptu mapy z serwera InPost. Sprawd\u017A po\u0142\u0105czenie z sieci\u0105." })
6271
+ ]
6272
+ }
6273
+ );
6274
+ }
6275
+ if (!token) {
6276
+ const filteredPoints = MOCK_POINTS.filter(
6277
+ (p) => p.name.toLowerCase().includes(searchQuery.toLowerCase()) || p.address.line1.toLowerCase().includes(searchQuery.toLowerCase()) || p.address_details.city.toLowerCase().includes(searchQuery.toLowerCase())
6278
+ );
6279
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6280
+ "div",
6281
+ {
6282
+ className: `flex flex-col h-full min-h-[500px] bg-surface border-2 border-border rounded-xl p-4 font-sans text-foreground ${className || ""}`,
6283
+ style,
6284
+ children: [
6285
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-gradient-to-r from-amber-400 via-amber-500 to-yellow-500 text-slate-950 rounded-xl p-4 mb-3.5 shadow-sm flex flex-col gap-1 border border-amber-600/30", children: [
6286
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
6287
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
6288
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-2.5 h-2.5 rounded-full bg-slate-950 animate-pulse" }),
6289
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-black text-sm tracking-tight uppercase", children: "InPost Paczkomat\xAE" })
6290
+ ] }),
6291
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.7rem] font-black bg-slate-950 text-amber-400 px-2.5 py-0.5 rounded-md uppercase tracking-wider shadow-sm", children: "Tryb Pokazowy" })
6292
+ ] }),
6293
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-slate-950 font-bold leading-relaxed opacity-95", children: [
6294
+ "Wybierz punkt z listy poni\u017Cej. Do za\u0142adowania produkcyjnej mapy przeka\u017C prop ",
6295
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "bg-slate-950 text-amber-400 px-1.5 py-0.5 rounded font-mono text-[0.72rem] font-black", children: 'token="TWOJ_TOKEN"' }),
6296
+ "."
6297
+ ] })
6298
+ ] }),
6299
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3.5 relative", children: /* @__PURE__ */ jsxRuntime.jsx(
6300
+ "input",
6301
+ {
6302
+ type: "text",
6303
+ placeholder: "Szukaj Paczkomatu (np. Warszawa, WAW01M, Towarowa)...",
6304
+ value: searchQuery,
6305
+ onChange: (e) => setSearchQuery(e.target.value),
6306
+ className: "w-full px-4 py-2.5 text-sm bg-surface border-2 border-border rounded-xl outline-none text-foreground placeholder:text-muted-foreground font-bold focus:border-primary focus:ring-2 focus:ring-primary/20 shadow-sm transition-all"
6307
+ }
6308
+ ) }),
6309
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-y-auto space-y-3 pr-1 max-h-[420px]", children: filteredPoints.map((p) => {
6310
+ const isSelected = selectedMock?.name === p.name;
6311
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6312
+ "div",
6313
+ {
6314
+ onClick: () => {
6315
+ setSelectedMock(p);
6316
+ if (onPointSelect) {
6317
+ onPointSelect(p);
6318
+ }
6319
+ },
6320
+ className: `p-4 rounded-xl border-2 transition-all cursor-pointer flex items-center justify-between gap-3 ${isSelected ? "bg-primary text-primary-foreground border-primary shadow-md" : "bg-surface border-border hover:border-primary hover:shadow-md text-foreground"}`,
6321
+ children: [
6322
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1 min-w-0", children: [
6323
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "font-black text-base flex items-center gap-2", children: [
6324
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: isSelected ? "text-primary-foreground font-black" : "text-foreground font-black", children: [
6325
+ "Paczkomat\xAE ",
6326
+ p.name
6327
+ ] }),
6328
+ p.location_description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: `text-[0.72rem] px-2.5 py-0.5 rounded-full font-bold ${isSelected ? "bg-primary-hover text-primary-foreground" : "bg-muted text-primary"}`, children: p.location_description })
6329
+ ] }),
6330
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `text-xs font-bold ${isSelected ? "text-primary-foreground/90" : "text-muted-foreground"}`, children: [
6331
+ p.address.line1,
6332
+ ", ",
6333
+ p.address.line2
6334
+ ] })
6335
+ ] }),
6336
+ /* @__PURE__ */ jsxRuntime.jsx(
6337
+ "button",
6338
+ {
6339
+ type: "button",
6340
+ className: `px-4 py-2 rounded-lg text-xs font-black shrink-0 transition-all shadow-sm ${isSelected ? "bg-amber-400 text-slate-950 border border-amber-500" : "bg-primary hover:bg-primary-hover text-primary-foreground"}`,
6341
+ children: isSelected ? "Wybrano \u2713" : "Wybierz"
6342
+ }
6343
+ )
6344
+ ]
6345
+ },
6346
+ p.name
6347
+ );
6348
+ }) })
6349
+ ]
6350
+ }
6351
+ );
6352
+ }
6353
+ if (!isLoaded) {
6354
+ return /* @__PURE__ */ jsxRuntime.jsx(
6355
+ "div",
6356
+ {
6357
+ className: `flex items-center justify-center min-h-[450px] bg-surface border-2 border-border rounded-xl p-6 ${className || ""}`,
6358
+ style,
6359
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-3 text-muted-foreground", children: [
6360
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-9 h-9 border-4 border-primary border-t-transparent rounded-full animate-spin" }),
6361
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-extrabold text-foreground", children: "\u0141adowanie mapy InPost GeoWidget..." })
6362
+ ] })
6363
+ }
6364
+ );
6365
+ }
6366
+ const widgetProps = {
6367
+ language,
6368
+ config: String(config).toLowerCase(),
6369
+ // eslint-disable-next-line react-hooks/refs
6370
+ onpointselect: callbackNameRef.current
6371
+ };
6372
+ if (token) {
6373
+ widgetProps.token = token;
6374
+ }
6375
+ if (sandbox) {
6376
+ widgetProps.sandbox = "true";
6377
+ }
6378
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-full h-full min-h-[450px] relative ${className || ""}`, style, children: React52__namespace.default.createElement("inpost-geowidget", {
6379
+ ref: widgetRef,
6380
+ ...widgetProps,
6381
+ style: { width: "100%", height: "100%", display: "block", minHeight: "450px" }
6382
+ }) });
6383
+ };
6384
+ var InPostGeowidgetModal = ({
6385
+ value,
6386
+ onSelect,
6387
+ triggerText = "Wybierz Paczkomat\xAE",
6388
+ modalTitle = "Wybierz punkt odbioru InPost",
6389
+ disabled = false,
6390
+ open: controlledOpen,
6391
+ onOpenChange,
6392
+ showSelectedBadge = true,
6393
+ className = "",
6394
+ buttonVariant = "outline",
6395
+ buttonSize = "md",
6396
+ token,
6397
+ language,
6398
+ config,
6399
+ sandbox,
6400
+ customScriptUrl,
6401
+ customCssUrl
6402
+ }) => {
6403
+ const [internalOpen, setInternalOpen] = React52.useState(false);
6404
+ const [selectedPoint, setSelectedPoint] = React52.useState(
6405
+ typeof value === "object" && value ? value : null
6406
+ );
6407
+ const isControlled = controlledOpen !== void 0;
6408
+ const isOpen = isControlled ? controlledOpen : internalOpen;
6409
+ const handleOpenToggle = (newOpen) => {
6410
+ if (!isControlled) {
6411
+ setInternalOpen(newOpen);
6412
+ }
6413
+ if (onOpenChange) {
6414
+ onOpenChange(newOpen);
6415
+ }
6416
+ };
6417
+ const handlePointSelect = (point) => {
6418
+ setSelectedPoint(point);
6419
+ if (onSelect) {
6420
+ onSelect(point);
6421
+ }
6422
+ handleOpenToggle(false);
6423
+ };
6424
+ const selectedCode = selectedPoint?.name || (typeof value === "string" ? value : null);
6425
+ const selectedAddress = selectedPoint ? `${selectedPoint.address?.line1 || ""}, ${selectedPoint.address?.line2 || ""}` : null;
6426
+ const isOutline = buttonVariant === "outline";
6427
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `inline-flex flex-col gap-3 min-w-[280px] ${className}`, children: [
6428
+ /* @__PURE__ */ jsxRuntime.jsxs(
6429
+ Button,
6430
+ {
6431
+ type: "button",
6432
+ variant: buttonVariant,
6433
+ size: buttonSize,
6434
+ disabled,
6435
+ onClick: () => handleOpenToggle(true),
6436
+ className: `group w-full justify-between gap-4 text-left font-bold shadow-sm hover:shadow-md transition-all py-2.5 px-3.5 rounded-xl ${isOutline ? "bg-surface hover:bg-muted text-foreground border-2 border-border hover:border-primary" : "border-2 border-transparent"}`,
6437
+ children: [
6438
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2.5 min-w-0", children: [
6439
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-black text-[0.7rem] bg-amber-400 text-slate-950 px-2.5 py-1 rounded-md shadow-sm tracking-tight uppercase border border-amber-500/40 shrink-0 group-hover:scale-105 transition-transform", children: "InPost" }),
6440
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `truncate font-bold text-sm ${isOutline ? "text-foreground group-hover:text-primary" : ""}`, children: selectedCode ? `Paczkomat\xAE ${selectedCode}` : triggerText })
6441
+ ] }),
6442
+ /* @__PURE__ */ jsxRuntime.jsx(
6443
+ "span",
6444
+ {
6445
+ className: `text-xs font-black px-2.5 py-1 rounded-md shrink-0 shadow-sm uppercase tracking-wide transition-all ${isOutline ? "bg-primary text-primary-foreground group-hover:bg-primary-hover" : "bg-amber-400 text-slate-950"}`,
6446
+ children: selectedCode ? "Zmie\u0144" : "Wybierz"
6447
+ }
6448
+ )
6449
+ ]
6450
+ }
6451
+ ),
6452
+ showSelectedBadge && selectedCode && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-xs bg-surface text-foreground border-2 border-border p-3.5 rounded-xl flex flex-col gap-1.5 shadow-md", children: [
6453
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "font-bold flex items-center justify-between gap-2", children: [
6454
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2 text-foreground", children: [
6455
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-2.5 h-2.5 rounded-full bg-primary shadow-sm animate-pulse" }),
6456
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-black text-sm text-primary", children: [
6457
+ "Paczkomat\xAE ",
6458
+ selectedCode
6459
+ ] })
6460
+ ] }),
6461
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.65rem] bg-amber-400 text-slate-950 font-black px-2 py-0.5 rounded uppercase tracking-wider", children: "Wybrany" })
6462
+ ] }),
6463
+ selectedAddress && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground text-[0.78rem] font-medium pl-4 border-l-2 border-border", children: selectedAddress })
6464
+ ] }),
6465
+ /* @__PURE__ */ jsxRuntime.jsxs(Modal, { open: isOpen, onClose: () => handleOpenToggle(false), width: 850, children: [
6466
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 pb-3.5 border-b border-border", children: [
6467
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-black text-xs bg-amber-400 text-slate-950 px-2.5 py-1 rounded-md shadow-sm tracking-tight uppercase border border-amber-500/40 shrink-0", children: "InPost" }),
6468
+ /* @__PURE__ */ jsxRuntime.jsx(ModalTitle, { className: "m-0 text-xl font-black text-primary tracking-tight", children: modalTitle })
6469
+ ] }),
6470
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-[600px] min-h-[500px] mt-3.5 rounded-xl overflow-hidden", children: isOpen && /* @__PURE__ */ jsxRuntime.jsx(
6471
+ InPostGeowidget,
6472
+ {
6473
+ token,
6474
+ language,
6475
+ config,
6476
+ sandbox,
6477
+ customScriptUrl,
6478
+ customCssUrl,
6479
+ onPointSelect: handlePointSelect
6480
+ }
6481
+ ) })
6482
+ ] })
6483
+ ] });
6484
+ };
6084
6485
 
6085
6486
  exports.Accordion = Accordion;
6086
6487
  exports.AccordionContent = AccordionContent;
@@ -6148,6 +6549,8 @@ exports.FileUploadField = FileUploadField;
6148
6549
  exports.FormField = FormField;
6149
6550
  exports.Hint = Hint;
6150
6551
  exports.ImageGallery = ImageGallery;
6552
+ exports.InPostGeowidget = InPostGeowidget;
6553
+ exports.InPostGeowidgetModal = InPostGeowidgetModal;
6151
6554
  exports.InboxContent = InboxContent;
6152
6555
  exports.InboxPopover = InboxPopover;
6153
6556
  exports.InboxTrigger = InboxTrigger;
@@ -6230,6 +6633,7 @@ exports.hslToHex = hslToHex;
6230
6633
  exports.isValidHex = isValidHex;
6231
6634
  exports.normalizeHex = normalizeHex;
6232
6635
  exports.sliderThumbCSS = sliderThumbCSS;
6636
+ exports.useInPostScript = useInPostScript;
6233
6637
  exports.useInboxState = useInboxState;
6234
6638
  exports.useStepper = useStepper;
6235
6639
  exports.useToast = useToast;