@geomak/ui 7.5.0 → 7.5.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.d.cts CHANGED
@@ -370,29 +370,32 @@ declare function Typography({ variant, as, color, weight, align, truncate, muted
370
370
 
371
371
  type IconButtonVariant = 'primary' | 'bordered' | 'ghost';
372
372
  interface IconButtonProps {
373
- icon?: React.ReactNode;
374
- onClick?: React.MouseEventHandler<HTMLButtonElement>;
373
+ icon?: react__default.ReactNode;
374
+ onClick?: react__default.MouseEventHandler<HTMLButtonElement>;
375
375
  /** Visual style. Defaults to `'primary'`. */
376
376
  type?: IconButtonVariant;
377
377
  buttonType?: 'button' | 'submit' | 'reset';
378
378
  disabled?: boolean;
379
379
  size?: 'sm' | 'md' | 'lg';
380
380
  loading?: boolean;
381
- loadingIcon?: React.ReactNode;
381
+ loadingIcon?: react__default.ReactNode;
382
382
  title?: string;
383
383
  /** Extra classes appended to the button. */
384
384
  className?: string;
385
385
  /** Inline style on the button. */
386
- style?: React.CSSProperties;
386
+ style?: react__default.CSSProperties;
387
387
  }
388
388
  /**
389
389
  * Square icon-only button.
390
390
  *
391
+ * Uses `React.forwardRef` so it works as a Radix `asChild` trigger (Popover,
392
+ * PopConfirm, Tooltip, etc.) — those need a DOM ref to anchor floating content.
393
+ *
391
394
  * @example
392
395
  * <IconButton icon={<Icon.Search />} onClick={doSearch} />
393
396
  * <IconButton type="bordered" icon={<Icon.Edit />} />
394
397
  */
395
- declare function IconButton({ icon, onClick, type, buttonType, disabled, size, loading, loadingIcon, title, className, style, }: IconButtonProps): react_jsx_runtime.JSX.Element;
398
+ declare const IconButton: react__default.ForwardRefExoticComponent<IconButtonProps & react__default.RefAttributes<HTMLButtonElement>>;
396
399
 
397
400
  interface ButtonProps extends Omit<react__default.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'content'> {
398
401
  /** Button content (text or nodes). */
@@ -4746,7 +4749,10 @@ declare class FormStore {
4746
4749
  errors: ErrorMap;
4747
4750
  touched: Record<string, boolean>;
4748
4751
  submitted: boolean;
4752
+ /** True while async field validation runs. */
4749
4753
  validating: boolean;
4754
+ /** True while the submit handler (`onFinish` / `action`) is executing. */
4755
+ submitting: boolean;
4750
4756
  readonly initialValues: FormValues;
4751
4757
  private rules;
4752
4758
  readonly validateOn: ValidateTrigger[];
@@ -4778,6 +4784,7 @@ declare class FormStore {
4778
4784
  validate?: boolean;
4779
4785
  }) => void;
4780
4786
  setSubmitted: (v: boolean) => void;
4787
+ setSubmitting: (v: boolean) => void;
4781
4788
  validateField(name: string): Promise<string | undefined>;
4782
4789
  validateAll(): Promise<ErrorMap>;
4783
4790
  reset: (values?: FormValues) => void;
package/dist/index.d.ts CHANGED
@@ -370,29 +370,32 @@ declare function Typography({ variant, as, color, weight, align, truncate, muted
370
370
 
371
371
  type IconButtonVariant = 'primary' | 'bordered' | 'ghost';
372
372
  interface IconButtonProps {
373
- icon?: React.ReactNode;
374
- onClick?: React.MouseEventHandler<HTMLButtonElement>;
373
+ icon?: react__default.ReactNode;
374
+ onClick?: react__default.MouseEventHandler<HTMLButtonElement>;
375
375
  /** Visual style. Defaults to `'primary'`. */
376
376
  type?: IconButtonVariant;
377
377
  buttonType?: 'button' | 'submit' | 'reset';
378
378
  disabled?: boolean;
379
379
  size?: 'sm' | 'md' | 'lg';
380
380
  loading?: boolean;
381
- loadingIcon?: React.ReactNode;
381
+ loadingIcon?: react__default.ReactNode;
382
382
  title?: string;
383
383
  /** Extra classes appended to the button. */
384
384
  className?: string;
385
385
  /** Inline style on the button. */
386
- style?: React.CSSProperties;
386
+ style?: react__default.CSSProperties;
387
387
  }
388
388
  /**
389
389
  * Square icon-only button.
390
390
  *
391
+ * Uses `React.forwardRef` so it works as a Radix `asChild` trigger (Popover,
392
+ * PopConfirm, Tooltip, etc.) — those need a DOM ref to anchor floating content.
393
+ *
391
394
  * @example
392
395
  * <IconButton icon={<Icon.Search />} onClick={doSearch} />
393
396
  * <IconButton type="bordered" icon={<Icon.Edit />} />
394
397
  */
395
- declare function IconButton({ icon, onClick, type, buttonType, disabled, size, loading, loadingIcon, title, className, style, }: IconButtonProps): react_jsx_runtime.JSX.Element;
398
+ declare const IconButton: react__default.ForwardRefExoticComponent<IconButtonProps & react__default.RefAttributes<HTMLButtonElement>>;
396
399
 
397
400
  interface ButtonProps extends Omit<react__default.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'content'> {
398
401
  /** Button content (text or nodes). */
@@ -4746,7 +4749,10 @@ declare class FormStore {
4746
4749
  errors: ErrorMap;
4747
4750
  touched: Record<string, boolean>;
4748
4751
  submitted: boolean;
4752
+ /** True while async field validation runs. */
4749
4753
  validating: boolean;
4754
+ /** True while the submit handler (`onFinish` / `action`) is executing. */
4755
+ submitting: boolean;
4750
4756
  readonly initialValues: FormValues;
4751
4757
  private rules;
4752
4758
  readonly validateOn: ValidateTrigger[];
@@ -4778,6 +4784,7 @@ declare class FormStore {
4778
4784
  validate?: boolean;
4779
4785
  }) => void;
4780
4786
  setSubmitted: (v: boolean) => void;
4787
+ setSubmitting: (v: boolean) => void;
4781
4788
  validateField(name: string): Promise<string | undefined>;
4782
4789
  validateAll(): Promise<ErrorMap>;
4783
4790
  reset: (values?: FormValues) => void;
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  export { icons_default as Icon, createIcon } from './chunk-KAFJJO5O.js';
2
2
  import { colors_default } from './chunk-DXOWXLKK.js';
3
3
  export { colors_default as COLORS, PALETTE as palette, semanticTokens, vars } from './chunk-DXOWXLKK.js';
4
- import React30, { createContext, useState, useEffect, useMemo, useId, useCallback, useRef, useContext, useSyncExternalStore, useLayoutEffect } from 'react';
4
+ import React31, { useMemo, createContext, useState, useEffect, useId, useCallback, useRef, useContext, useSyncExternalStore, useLayoutEffect } from 'react';
5
5
  import { createPortal } from 'react-dom';
6
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
7
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
8
8
  import * as DropdownMenu2 from '@radix-ui/react-dropdown-menu';
9
9
  import * as Dialog from '@radix-ui/react-dialog';
@@ -452,7 +452,7 @@ function Typography({
452
452
  }
453
453
  );
454
454
  }
455
- function IconButton({
455
+ var IconButton = React31.forwardRef(function IconButton2({
456
456
  icon,
457
457
  onClick,
458
458
  type = "primary",
@@ -464,7 +464,7 @@ function IconButton({
464
464
  title,
465
465
  className = "",
466
466
  style
467
- }) {
467
+ }, ref) {
468
468
  const colorScheme = useMemo(() => {
469
469
  if (type === "primary") {
470
470
  return "bg-accent text-accent-fg hover:bg-accent-hover";
@@ -480,6 +480,7 @@ function IconButton({
480
480
  return /* @__PURE__ */ jsx(
481
481
  "button",
482
482
  {
483
+ ref,
483
484
  type: buttonType,
484
485
  disabled: disabled || loading,
485
486
  onClick,
@@ -490,7 +491,9 @@ function IconButton({
490
491
  children: loading ? loadingIcon : icon
491
492
  }
492
493
  );
493
- }
494
+ });
495
+ IconButton.displayName = "IconButton";
496
+ var IconButton_default = IconButton;
494
497
  var VARIANT_CLASSES = {
495
498
  primary: [
496
499
  "bg-accent text-accent-fg",
@@ -558,7 +561,7 @@ var SIZE_CLASSES = {
558
561
  md: "h-9 px-4 text-sm gap-1.5 rounded-lg",
559
562
  lg: "h-11 px-5 text-sm gap-2 rounded-xl"
560
563
  };
561
- var Button = React30.forwardRef(function Button2({
564
+ var Button = React31.forwardRef(function Button2({
562
565
  content,
563
566
  variant = "primary",
564
567
  size = "md",
@@ -666,7 +669,7 @@ function MenuButton({
666
669
  "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
667
670
  "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95"
668
671
  ].join(" "),
669
- children: items.map((item) => /* @__PURE__ */ jsxs(React30.Fragment, { children: [
672
+ children: items.map((item) => /* @__PURE__ */ jsxs(React31.Fragment, { children: [
670
673
  item.separatorBefore && /* @__PURE__ */ jsx(DropdownMenu2.Separator, { className: "my-1 h-px bg-border" }),
671
674
  /* @__PURE__ */ jsxs(
672
675
  DropdownMenu2.Item,
@@ -1754,7 +1757,7 @@ function Kbd({
1754
1757
  style
1755
1758
  }) {
1756
1759
  if (keys && keys.length > 0) {
1757
- return /* @__PURE__ */ jsx("span", { className: cx("inline-flex items-center gap-1", className), style, children: keys.map((k, i) => /* @__PURE__ */ jsxs(React30.Fragment, { children: [
1760
+ return /* @__PURE__ */ jsx("span", { className: cx("inline-flex items-center gap-1", className), style, children: keys.map((k, i) => /* @__PURE__ */ jsxs(React31.Fragment, { children: [
1758
1761
  i > 0 && /* @__PURE__ */ jsx("span", { className: "text-foreground-muted text-xs select-none", children: separator }),
1759
1762
  /* @__PURE__ */ jsx("kbd", { className: [cap, SIZE3[size]].join(" "), children: k })
1760
1763
  ] }, `${k}-${i}`)) });
@@ -1846,7 +1849,7 @@ function FlatCarousel({
1846
1849
  style
1847
1850
  }) {
1848
1851
  const scrollerRef = useRef(null);
1849
- const slides = React30.Children.toArray(children);
1852
+ const slides = React31.Children.toArray(children);
1850
1853
  const [active, setActive] = useState(0);
1851
1854
  const [atStart, setAtStart] = useState(true);
1852
1855
  const [atEnd, setAtEnd] = useState(false);
@@ -1901,7 +1904,7 @@ function RotatingCarousel({
1901
1904
  className = "",
1902
1905
  style
1903
1906
  }) {
1904
- const slides = React30.Children.toArray(children);
1907
+ const slides = React31.Children.toArray(children);
1905
1908
  const count = slides.length;
1906
1909
  const [active, setActive] = useState(0);
1907
1910
  const reduced = useReducedMotion();
@@ -2260,7 +2263,7 @@ function Chat({
2260
2263
  }
2261
2264
  ),
2262
2265
  /* @__PURE__ */ jsx(
2263
- IconButton,
2266
+ IconButton_default,
2264
2267
  {
2265
2268
  type: "primary",
2266
2269
  icon: /* @__PURE__ */ jsx(SendIcon, {}),
@@ -2881,8 +2884,8 @@ function Scheduler({
2881
2884
  children: [
2882
2885
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3", children: [
2883
2886
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
2884
- /* @__PURE__ */ jsx(IconButton, { type: "bordered", size: "sm", icon: /* @__PURE__ */ jsx(Chevron4, { dir: "left" }), title: "Previous", onClick: () => go(-1) }),
2885
- /* @__PURE__ */ jsx(IconButton, { type: "bordered", size: "sm", icon: /* @__PURE__ */ jsx(Chevron4, { dir: "right" }), title: "Next", onClick: () => go(1) }),
2887
+ /* @__PURE__ */ jsx(IconButton_default, { type: "bordered", size: "sm", icon: /* @__PURE__ */ jsx(Chevron4, { dir: "left" }), title: "Previous", onClick: () => go(-1) }),
2888
+ /* @__PURE__ */ jsx(IconButton_default, { type: "bordered", size: "sm", icon: /* @__PURE__ */ jsx(Chevron4, { dir: "right" }), title: "Next", onClick: () => go(1) }),
2886
2889
  /* @__PURE__ */ jsx(Button_default, { variant: "ghost", size: "sm", content: "Today", onClick: goToday }),
2887
2890
  /* @__PURE__ */ jsx(
2888
2891
  MonthYearPicker,
@@ -3006,9 +3009,9 @@ function MonthYearPicker({ label, cursor, onPick }) {
3006
3009
  ].join(" "),
3007
3010
  children: [
3008
3011
  /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center justify-between", children: [
3009
- /* @__PURE__ */ jsx(IconButton, { size: "sm", type: "bordered", icon: /* @__PURE__ */ jsx(Chevron4, { dir: "left" }), title: "Previous year", onClick: () => setViewYear((y) => y - 1) }),
3012
+ /* @__PURE__ */ jsx(IconButton_default, { size: "sm", type: "bordered", icon: /* @__PURE__ */ jsx(Chevron4, { dir: "left" }), title: "Previous year", onClick: () => setViewYear((y) => y - 1) }),
3010
3013
  /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold tabular-nums text-foreground", children: viewYear }),
3011
- /* @__PURE__ */ jsx(IconButton, { size: "sm", type: "bordered", icon: /* @__PURE__ */ jsx(Chevron4, { dir: "right" }), title: "Next year", onClick: () => setViewYear((y) => y + 1) })
3014
+ /* @__PURE__ */ jsx(IconButton_default, { size: "sm", type: "bordered", icon: /* @__PURE__ */ jsx(Chevron4, { dir: "right" }), title: "Next year", onClick: () => setViewYear((y) => y + 1) })
3012
3015
  ] }),
3013
3016
  /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-1", children: MONTHS_SHORT.map((m, i) => {
3014
3017
  const current = i === cursor.getMonth() && viewYear === cursor.getFullYear();
@@ -3392,7 +3395,7 @@ function CartButton({
3392
3395
  const { getItemCount } = useCart();
3393
3396
  const count = getItemCount();
3394
3397
  return /* @__PURE__ */ jsx(Badge, { count, max, tone: badgeTone, className, children: /* @__PURE__ */ jsx(
3395
- IconButton,
3398
+ IconButton_default,
3396
3399
  {
3397
3400
  type: variant,
3398
3401
  icon,
@@ -3511,7 +3514,10 @@ var FormStore = class {
3511
3514
  errors = {};
3512
3515
  touched = {};
3513
3516
  submitted = false;
3517
+ /** True while async field validation runs. */
3514
3518
  validating = false;
3519
+ /** True while the submit handler (`onFinish` / `action`) is executing. */
3520
+ submitting = false;
3515
3521
  initialValues;
3516
3522
  rules;
3517
3523
  validateOn;
@@ -3596,6 +3602,10 @@ var FormStore = class {
3596
3602
  this.submitted = v;
3597
3603
  this.emit();
3598
3604
  };
3605
+ setSubmitting = (v) => {
3606
+ this.submitting = v;
3607
+ this.emit();
3608
+ };
3599
3609
  // ── validation ─────────────────────────────────────────────────────────────
3600
3610
  async validateField(name) {
3601
3611
  const err = await runFieldRules(getPath(this.values, name), this.rules[name], this.values);
@@ -3621,6 +3631,7 @@ var FormStore = class {
3621
3631
  this.errors = {};
3622
3632
  this.touched = {};
3623
3633
  this.submitted = false;
3634
+ this.submitting = false;
3624
3635
  this.keys = {};
3625
3636
  this.fieldCache.clear();
3626
3637
  this.emit();
@@ -3720,7 +3731,8 @@ function useForm(options = {}) {
3720
3731
  errors: store.errors,
3721
3732
  touched: store.touched,
3722
3733
  submitted: store.submitted,
3723
- isSubmitting: store.validating,
3734
+ // True for the whole submit cycle: async validation → onFinish execution.
3735
+ isSubmitting: store.submitting || store.validating,
3724
3736
  isValid: store.isValid,
3725
3737
  getValue: store.getValue,
3726
3738
  getValues: store.getValues,
@@ -3770,7 +3782,12 @@ function Form({
3770
3782
  return;
3771
3783
  }
3772
3784
  if (onFinish) {
3773
- await onFinish(store.getValues());
3785
+ store.setSubmitting(true);
3786
+ try {
3787
+ await onFinish(store.getValues());
3788
+ } finally {
3789
+ store.setSubmitting(false);
3790
+ }
3774
3791
  return;
3775
3792
  }
3776
3793
  if (typeof action === "function") {
@@ -5207,7 +5224,7 @@ function Wizard({
5207
5224
  ] });
5208
5225
  }
5209
5226
  var SearchIcon = /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", className: "w-4 h-4", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { fillRule: "evenodd", d: "M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z", clipRule: "evenodd" }) });
5210
- var SearchInput = React30.forwardRef(function SearchInput2({ value, onChange, disabled, label, htmlFor, placeholder, name, inputStyle, style, layout = "vertical", size = "md", icon, helperText, className }, ref) {
5227
+ var SearchInput = React31.forwardRef(function SearchInput2({ value, onChange, disabled, label, htmlFor, placeholder, name, inputStyle, style, layout = "vertical", size = "md", icon, helperText, className }, ref) {
5211
5228
  return /* @__PURE__ */ jsx(Field, { className, label, htmlFor, layout, helperText, children: /* @__PURE__ */ jsxs(
5212
5229
  "div",
5213
5230
  {
@@ -5505,7 +5522,7 @@ function TableBody({
5505
5522
  return /* @__PURE__ */ jsx("tbody", { children: rows.map((row, i) => {
5506
5523
  const rowKey = getRowKey(row, i);
5507
5524
  const isExpanded = expanded.has(rowKey);
5508
- return /* @__PURE__ */ jsxs(React30.Fragment, { children: [
5525
+ return /* @__PURE__ */ jsxs(React31.Fragment, { children: [
5509
5526
  /* @__PURE__ */ jsxs(
5510
5527
  "tr",
5511
5528
  {
@@ -5956,7 +5973,7 @@ function FlyoutItems({ items }) {
5956
5973
  }
5957
5974
  function CollapsedFlyout({ item, trigger }) {
5958
5975
  const [open, setOpen] = useState(false);
5959
- const closeTimer = React30.useRef(void 0);
5976
+ const closeTimer = React31.useRef(void 0);
5960
5977
  const openNow = () => {
5961
5978
  window.clearTimeout(closeTimer.current);
5962
5979
  setOpen(true);
@@ -5965,7 +5982,7 @@ function CollapsedFlyout({ item, trigger }) {
5965
5982
  window.clearTimeout(closeTimer.current);
5966
5983
  closeTimer.current = window.setTimeout(() => setOpen(false), 150);
5967
5984
  };
5968
- React30.useEffect(() => () => window.clearTimeout(closeTimer.current), []);
5985
+ React31.useEffect(() => () => window.clearTimeout(closeTimer.current), []);
5969
5986
  return /* @__PURE__ */ jsxs(DropdownMenu2.Root, { open, onOpenChange: setOpen, modal: false, children: [
5970
5987
  /* @__PURE__ */ jsx(
5971
5988
  DropdownMenu2.Trigger,
@@ -6257,8 +6274,8 @@ function MegaMenuLink({ href, icon, description, active, onClick, children, clas
6257
6274
  function MegaMenuFeatured({ children, className = "" }) {
6258
6275
  return /* @__PURE__ */ jsx("div", { className: cx("min-w-0 rounded-lg bg-surface-raised border border-border p-4 flex flex-col", className), children });
6259
6276
  }
6260
- var elementsOfType = (children, type) => React30.Children.toArray(children).filter(
6261
- (c) => React30.isValidElement(c) && c.type === type
6277
+ var elementsOfType = (children, type) => React31.Children.toArray(children).filter(
6278
+ (c) => React31.isValidElement(c) && c.type === type
6262
6279
  );
6263
6280
  var MOBILE_CHEVRON = /* @__PURE__ */ jsx(
6264
6281
  "svg",
@@ -6295,9 +6312,9 @@ function MobileLinkRow({ link, onNavigate }) {
6295
6312
  );
6296
6313
  }
6297
6314
  function MobilePanel({ panel, onNavigate }) {
6298
- const nodes = React30.Children.toArray(panel.props.children);
6315
+ const nodes = React31.Children.toArray(panel.props.children);
6299
6316
  return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 px-2 pb-3 pt-1", children: nodes.map((node, i) => {
6300
- if (!React30.isValidElement(node)) return null;
6317
+ if (!React31.isValidElement(node)) return null;
6301
6318
  const el = node;
6302
6319
  if (el.type === MegaMenuSection) {
6303
6320
  const { title, children } = el.props;
@@ -6706,7 +6723,7 @@ function ThemeProvider({
6706
6723
  className = "",
6707
6724
  style
6708
6725
  }) {
6709
- const id = React30.useId().replace(/:/g, "");
6726
+ const id = React31.useId().replace(/:/g, "");
6710
6727
  const scopeClass = `geo-th-${id}`;
6711
6728
  const divRef = useRef(null);
6712
6729
  useEffect(() => {
@@ -9014,7 +9031,7 @@ function OtpInput({
9014
9031
  emit(valid.join(""));
9015
9032
  focusBox(valid.length);
9016
9033
  };
9017
- return /* @__PURE__ */ jsx(Field, { className, label, htmlFor, errorId, errorMessage, required, layout, helperText, children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-2", role: "group", "aria-label": typeof label === "string" ? label : "One-time code", children: chars.map((char, idx) => /* @__PURE__ */ jsxs(React30.Fragment, { children: [
9034
+ return /* @__PURE__ */ jsx(Field, { className, label, htmlFor, errorId, errorMessage, required, layout, helperText, children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-2", role: "group", "aria-label": typeof label === "string" ? label : "One-time code", children: chars.map((char, idx) => /* @__PURE__ */ jsxs(React31.Fragment, { children: [
9018
9035
  /* @__PURE__ */ jsx(
9019
9036
  "input",
9020
9037
  {
@@ -10073,7 +10090,7 @@ function Blog({
10073
10090
  post.tag != null && !post.image && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Badge, { tone: "accent", variant: "soft", size: "sm", children: post.tag }) }),
10074
10091
  /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold leading-snug text-foreground transition-colors group-hover:text-accent", children: post.title }),
10075
10092
  post.excerpt != null && /* @__PURE__ */ jsx("p", { className: "line-clamp-3 text-sm leading-relaxed text-foreground-secondary", children: post.excerpt }),
10076
- meta.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-auto flex flex-wrap items-center gap-x-2 gap-y-1 pt-3 text-xs text-foreground-muted", children: meta.map((m, j) => /* @__PURE__ */ jsxs(React30.Fragment, { children: [
10093
+ meta.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-auto flex flex-wrap items-center gap-x-2 gap-y-1 pt-3 text-xs text-foreground-muted", children: meta.map((m, j) => /* @__PURE__ */ jsxs(React31.Fragment, { children: [
10077
10094
  j > 0 && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
10078
10095
  /* @__PURE__ */ jsx("span", { children: m })
10079
10096
  ] }, j)) })
@@ -10246,6 +10263,6 @@ function LeadCapture({
10246
10263
  );
10247
10264
  }
10248
10265
 
10249
- export { Accordion_default as Accordion, AppShell, AutoComplete, Avatar, Badge, Blog, Box, Breadcrumbs, Button_default as Button, CARD_BRANDS, Card_default as Card, CardCarousel, Cart, CartButton, CartProvider, Catalog, CatalogCarousel, CatalogGrid, Chat, Checkbox, Checkout, ColorPicker, ContextMenu, CookieConsent, CreditCardForm, DateRangePicker, Drawer, Dropdown, EmptyCart, FAB, FadingBase, FeatureGrid, Field, FieldHelpIcon, FieldLabel, FileInput, Flex, Form, FormContext, FormField, FormStore, Grid, GridCard, IconButton, Jumbotron, Kbd, LeadCapture, List2 as List, LoadingSpinner, LogoutTimer, MegaMenu_default as MegaMenu, MenuButton, Modal, NotificationProvider, NumberInput, OpaqueGridCard, OtpInput, Parallax, Password, PasswordStrength, PopConfirm, Portal, PricingPlans, RadioGroup, RadioTile, Rating, ScalableContainer, Scheduler, SearchInput_default as SearchInput, SecureLayout, SegmentedControl, Sidebar, SkeletonBox, SkeletonCard, SkeletonCircle, SkeletonText, SlideShow, Slider, Socials, Statistic, Stepper, Switch, Table, Tabs_default as Tabs, TagsInput, DatePicker as Temporal, Testimonials, TextArea, TextInput, ThemeProvider, ThemeSwitch, TimePicker, Timeline, Tooltip, TooltipProvider, TopBar, Tree, TreeSelect, Typography, Video, VirtualList, Wizard, cardNumberError, cvvError, cx, defaultPasswordRules, detectBrand, expiryError, fieldShell, formatCardNumber, formatExpiry, isRequired, luhnValid, onlyDigits, patterns, runFieldRules, scorePassword, useBreakpoint, useCart, useFieldArray, useForm, useFormField, useFormStore, useJwt, useLocalStorage, useMediaQuery, useNotification };
10266
+ export { Accordion_default as Accordion, AppShell, AutoComplete, Avatar, Badge, Blog, Box, Breadcrumbs, Button_default as Button, CARD_BRANDS, Card_default as Card, CardCarousel, Cart, CartButton, CartProvider, Catalog, CatalogCarousel, CatalogGrid, Chat, Checkbox, Checkout, ColorPicker, ContextMenu, CookieConsent, CreditCardForm, DateRangePicker, Drawer, Dropdown, EmptyCart, FAB, FadingBase, FeatureGrid, Field, FieldHelpIcon, FieldLabel, FileInput, Flex, Form, FormContext, FormField, FormStore, Grid, GridCard, IconButton_default as IconButton, Jumbotron, Kbd, LeadCapture, List2 as List, LoadingSpinner, LogoutTimer, MegaMenu_default as MegaMenu, MenuButton, Modal, NotificationProvider, NumberInput, OpaqueGridCard, OtpInput, Parallax, Password, PasswordStrength, PopConfirm, Portal, PricingPlans, RadioGroup, RadioTile, Rating, ScalableContainer, Scheduler, SearchInput_default as SearchInput, SecureLayout, SegmentedControl, Sidebar, SkeletonBox, SkeletonCard, SkeletonCircle, SkeletonText, SlideShow, Slider, Socials, Statistic, Stepper, Switch, Table, Tabs_default as Tabs, TagsInput, DatePicker as Temporal, Testimonials, TextArea, TextInput, ThemeProvider, ThemeSwitch, TimePicker, Timeline, Tooltip, TooltipProvider, TopBar, Tree, TreeSelect, Typography, Video, VirtualList, Wizard, cardNumberError, cvvError, cx, defaultPasswordRules, detectBrand, expiryError, fieldShell, formatCardNumber, formatExpiry, isRequired, luhnValid, onlyDigits, patterns, runFieldRules, scorePassword, useBreakpoint, useCart, useFieldArray, useForm, useFormField, useFormStore, useJwt, useLocalStorage, useMediaQuery, useNotification };
10250
10267
  //# sourceMappingURL=index.js.map
10251
10268
  //# sourceMappingURL=index.js.map