@iris-ui-kit/vue 0.2.25 → 0.2.27

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 (52) hide show
  1. package/dist/admin.cjs +547 -236
  2. package/dist/admin.cjs.map +1 -1
  3. package/dist/admin.d.cts +4 -2
  4. package/dist/admin.d.ts +4 -2
  5. package/dist/admin.js +2 -2
  6. package/dist/behaviors.cjs +49 -0
  7. package/dist/behaviors.cjs.map +1 -1
  8. package/dist/behaviors.d.cts +57 -1
  9. package/dist/behaviors.d.ts +57 -1
  10. package/dist/behaviors.js +1 -1
  11. package/dist/{chunk-QQ25RKOO.js → chunk-ASFDGYIR.js} +543 -240
  12. package/dist/chunk-ASFDGYIR.js.map +1 -0
  13. package/dist/{chunk-WL67XCH5.js → chunk-IN3DQ55U.js} +2 -2
  14. package/dist/chunk-IN3DQ55U.js.map +1 -0
  15. package/dist/{chunk-7L6UB6MD.js → chunk-IOMKC5OI.js} +53 -5
  16. package/dist/chunk-IOMKC5OI.js.map +1 -0
  17. package/dist/{chunk-3FJUCHCC.js → chunk-IPR5JAVF.js} +11 -3
  18. package/dist/chunk-IPR5JAVF.js.map +1 -0
  19. package/dist/{chunk-BEPH6PPL.js → chunk-LWABTQCB.js} +57 -37
  20. package/dist/chunk-LWABTQCB.js.map +1 -0
  21. package/dist/{chunk-DNRQVM3Q.js → chunk-QBFYIDY7.js} +3 -2
  22. package/dist/chunk-QBFYIDY7.js.map +1 -0
  23. package/dist/data.cjs +1 -0
  24. package/dist/data.cjs.map +1 -1
  25. package/dist/data.d.cts +4 -2
  26. package/dist/data.d.ts +4 -2
  27. package/dist/data.js +1 -1
  28. package/dist/floating.cjs +9 -1
  29. package/dist/floating.cjs.map +1 -1
  30. package/dist/floating.d.cts +6 -0
  31. package/dist/floating.d.ts +6 -0
  32. package/dist/floating.js +1 -1
  33. package/dist/index.cjs +2063 -745
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +172 -8
  36. package/dist/index.d.ts +172 -8
  37. package/dist/index.js +1412 -475
  38. package/dist/index.js.map +1 -1
  39. package/dist/layouts.cjs.map +1 -1
  40. package/dist/layouts.d.cts +1 -1
  41. package/dist/layouts.d.ts +1 -1
  42. package/dist/layouts.js +1 -1
  43. package/dist/skeletons.cjs +55 -35
  44. package/dist/skeletons.cjs.map +1 -1
  45. package/dist/skeletons.js +1 -1
  46. package/package.json +5 -5
  47. package/dist/chunk-3FJUCHCC.js.map +0 -1
  48. package/dist/chunk-7L6UB6MD.js.map +0 -1
  49. package/dist/chunk-BEPH6PPL.js.map +0 -1
  50. package/dist/chunk-DNRQVM3Q.js.map +0 -1
  51. package/dist/chunk-QQ25RKOO.js.map +0 -1
  52. package/dist/chunk-WL67XCH5.js.map +0 -1
@@ -5,6 +5,7 @@ import { offset, flip, shift, size, arrow, autoUpdate, computePosition } from '@
5
5
  function useFloating(options) {
6
6
  const x = ref(0);
7
7
  const y = ref(0);
8
+ const positioned = ref(false);
8
9
  const strategy = ref(options.strategy ?? "absolute");
9
10
  const finalPlacement = ref(options.placement ?? "bottom");
10
11
  const arrowX = ref();
@@ -50,6 +51,7 @@ function useFloating(options) {
50
51
  if (token !== epoch) return;
51
52
  x.value = result.x;
52
53
  y.value = result.y;
54
+ positioned.value = true;
53
55
  finalPlacement.value = result.placement;
54
56
  const arrowData = result.middlewareData.arrow;
55
57
  arrowX.value = arrowData?.x;
@@ -62,6 +64,7 @@ function useFloating(options) {
62
64
  cleanupAutoUpdate = null;
63
65
  epoch++;
64
66
  if (isOpen && anchorEl && floatingEl) {
67
+ positioned.value = false;
65
68
  cleanupAutoUpdate = autoUpdate(anchorEl, floatingEl, () => {
66
69
  void update();
67
70
  });
@@ -88,7 +91,11 @@ function useFloating(options) {
88
91
  top: "0",
89
92
  left: "0",
90
93
  transform: `translate3d(${Math.round(x.value)}px, ${Math.round(y.value)}px, 0)`,
91
- width: "max-content"
94
+ width: "max-content",
95
+ // Hidden until the first positioning cycle lands — prevents a flash at
96
+ // the viewport origin. visibility (not display:none) keeps the panel
97
+ // measurable so Floating UI can compute its real coordinates.
98
+ visibility: positioned.value ? "visible" : "hidden"
92
99
  }));
93
100
  return { x, y, strategy, finalPlacement, floatingStyles, update, arrowX, arrowY, arrowSide };
94
101
  }
@@ -107,6 +114,7 @@ function useDismiss(options) {
107
114
  const onPointerDown = (event) => {
108
115
  if (!options.enabled.value) return;
109
116
  if (isExcluded(event.target)) return;
117
+ if (options.excludePredicate?.(event.target)) return;
110
118
  options.onDismiss();
111
119
  };
112
120
  const onKeyDown = (event) => {
@@ -142,5 +150,5 @@ function useDismiss(options) {
142
150
  }
143
151
 
144
152
  export { useDismiss, useFloating };
145
- //# sourceMappingURL=chunk-3FJUCHCC.js.map
146
- //# sourceMappingURL=chunk-3FJUCHCC.js.map
153
+ //# sourceMappingURL=chunk-IPR5JAVF.js.map
154
+ //# sourceMappingURL=chunk-IPR5JAVF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/floating/useFloating.ts","../src/primitives/floating/useDismiss.ts"],"names":["offsetMiddleware","flipMiddleware","shiftMiddleware","sizeMiddleware","arrowMiddleware","watch","onScopeDispose"],"mappings":"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","file":"chunk-IPR5JAVF.js","sourcesContent":["import { computed, onScopeDispose, ref, shallowRef, watch, type ComputedRef, type Ref } from 'vue'\nimport {\n autoUpdate,\n computePosition,\n arrow as arrowMiddleware,\n flip as flipMiddleware,\n offset as offsetMiddleware,\n shift as shiftMiddleware,\n size as sizeMiddleware,\n type Middleware,\n type Placement,\n type Strategy,\n} from '@floating-ui/dom'\n\nexport interface UseFloatingOptions {\n /** Element the floating panel is positioned relative to. */\n anchor: Ref<HTMLElement | null | undefined>\n /** The floating element itself. */\n floating: Ref<HTMLElement | null | undefined>\n /** Whether the floating element is visible. Controls `autoUpdate` lifecycle. */\n open: Ref<boolean>\n /** Default placement. Floating UI may flip it if `flip` is true. */\n placement?: Placement\n /** CSS position strategy. */\n strategy?: Strategy\n /** Pixel offset between anchor and floating element. */\n offset?: number\n /** Flip to the opposite side when the requested side overflows. Default `true`. */\n flip?: boolean\n /** Shift along the cross-axis to stay in view. Default `true`. */\n shift?: boolean\n /**\n * Constrain the floating element to the available viewport space — sets\n * `maxWidth`/`maxHeight` (minus 8px padding) on it so a long dropdown/popover\n * never overflows the screen (pair with `overflow:auto` for scroll). Off by\n * default. Pass a number to override the viewport padding.\n */\n size?: boolean | number\n /** Extra Floating UI middleware to append. */\n middleware?: Middleware[]\n /**\n * Optional ref to an arrow element inside the floating panel. When provided,\n * `arrowX`, `arrowY`, and `arrowSide` in the return value are populated.\n */\n arrow?: Ref<HTMLElement | null | undefined>\n}\n\nexport interface UseFloatingReturn {\n /** Computed x coordinate (px). */\n x: Ref<number>\n /** Computed y coordinate (px). */\n y: Ref<number>\n /** Final strategy (echo of input). */\n strategy: Ref<Strategy>\n /** Final placement, possibly flipped from the input placement. */\n finalPlacement: Ref<Placement>\n /** Ready-to-bind inline style object for the floating element. */\n floatingStyles: ComputedRef<Record<string, string>>\n /** Trigger a manual recompute. Usually not needed — `autoUpdate` handles scrolling/resizing. */\n update: () => Promise<void>\n /** Arrow x offset (px). Present when `arrow` option is set. */\n arrowX: Ref<number | undefined>\n /** Arrow y offset (px). Present when `arrow` option is set. */\n arrowY: Ref<number | undefined>\n /**\n * Side of the floating element the arrow is on.\n * E.g. `'bottom'` placement → `'top'` (arrow at top pointing up).\n */\n arrowSide: ComputedRef<'top' | 'right' | 'bottom' | 'left' | undefined>\n}\n\n/**\n * Reactive Floating UI integration. Subscribes `autoUpdate` whenever\n * `open === true` and both refs are populated; tears it down on close,\n * unmount, or ref clearing. Returns `floatingStyles` ready to be spread onto\n * the floating element.\n *\n * Pure positioning — does NOT render anything, does NOT manage focus,\n * does NOT handle dismiss behavior. Those concerns live in the consuming\n * primitive (Popover, Tooltip, Dialog, Menu, ...).\n *\n * @example\n * const triggerEl = ref<HTMLElement | null>(null)\n * const contentEl = ref<HTMLElement | null>(null)\n * const open = ref(false)\n * const { floatingStyles } = useFloating({\n * anchor: triggerEl,\n * floating: contentEl,\n * open,\n * placement: 'bottom-start',\n * offset: 8,\n * })\n */\nexport function useFloating(options: UseFloatingOptions): UseFloatingReturn {\n const x = ref(0)\n const y = ref(0)\n // True once the first positioning cycle lands. Until then the panel stays\n // `visibility: hidden` so it never flashes at the viewport origin (0,0).\n const positioned = ref(false)\n const strategy = ref<Strategy>(options.strategy ?? 'absolute')\n const finalPlacement = ref<Placement>(options.placement ?? 'bottom')\n const arrowX = ref<number | undefined>()\n const arrowY = ref<number | undefined>()\n\n const middleware = shallowRef<Middleware[]>([])\n rebuildMiddleware()\n\n function rebuildMiddleware() {\n const mw: Middleware[] = []\n if (options.offset !== undefined) mw.push(offsetMiddleware(options.offset))\n if (options.flip !== false) mw.push(flipMiddleware())\n if (options.shift !== false) mw.push(shiftMiddleware({ padding: 8 }))\n if (options.size) {\n const padding = typeof options.size === 'number' ? options.size : 8\n mw.push(\n sizeMiddleware({\n padding,\n apply({ availableWidth, availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxWidth: `${Math.max(0, Math.floor(availableWidth))}px`,\n maxHeight: `${Math.max(0, Math.floor(availableHeight))}px`,\n })\n },\n }),\n )\n }\n if (options.arrow?.value) mw.push(arrowMiddleware({ element: options.arrow.value }))\n if (options.middleware) mw.push(...options.middleware)\n middleware.value = mw\n }\n\n let cleanupAutoUpdate: (() => void) | null = null\n // Monotonic token bumped on every new positioning cycle and on teardown, so a\n // computePosition() that resolves after the panel closed/re-opened (or after a\n // newer update started) drops its result instead of applying stale coords.\n let epoch = 0\n\n async function update() {\n const a = options.anchor.value\n const f = options.floating.value\n if (!a || !f) return\n rebuildMiddleware()\n const token = ++epoch\n const result = await computePosition(a, f, {\n placement: options.placement ?? 'bottom',\n strategy: strategy.value,\n middleware: middleware.value,\n })\n if (token !== epoch) return\n x.value = result.x\n y.value = result.y\n positioned.value = true\n finalPlacement.value = result.placement\n const arrowData = result.middlewareData.arrow as { x?: number; y?: number } | undefined\n arrowX.value = arrowData?.x\n arrowY.value = arrowData?.y\n }\n\n watch(\n [options.open, options.anchor, options.floating],\n ([isOpen, anchorEl, floatingEl]) => {\n cleanupAutoUpdate?.()\n cleanupAutoUpdate = null\n epoch++\n if (isOpen && anchorEl && floatingEl) {\n positioned.value = false\n cleanupAutoUpdate = autoUpdate(anchorEl, floatingEl, () => {\n void update()\n })\n }\n },\n { flush: 'post', immediate: true },\n )\n\n onScopeDispose(() => {\n cleanupAutoUpdate?.()\n cleanupAutoUpdate = null\n epoch++\n })\n\n const OPPOSITE: Record<string, 'top' | 'right' | 'bottom' | 'left'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n const arrowSide = computed(\n () =>\n OPPOSITE[finalPlacement.value.split('-')[0]] as\n 'top' | 'right' | 'bottom' | 'left' | undefined,\n )\n\n const floatingStyles = computed<Record<string, string>>(() => ({\n position: strategy.value,\n top: '0',\n left: '0',\n transform: `translate3d(${Math.round(x.value)}px, ${Math.round(y.value)}px, 0)`,\n width: 'max-content',\n // Hidden until the first positioning cycle lands — prevents a flash at\n // the viewport origin. visibility (not display:none) keeps the panel\n // measurable so Floating UI can compute its real coordinates.\n visibility: positioned.value ? 'visible' : 'hidden',\n }))\n\n return { x, y, strategy, finalPlacement, floatingStyles, update, arrowX, arrowY, arrowSide }\n}\n","import { onScopeDispose, watch, type Ref } from 'vue'\n\nexport interface UseDismissOptions {\n /** While true, the dismiss listeners are active. */\n enabled: Ref<boolean>\n /** Elements that, if clicked, should NOT trigger dismiss (typically trigger + content). */\n exclude: Array<Ref<HTMLElement | null | undefined>>\n /** Called when the user attempts to dismiss the surface. */\n onDismiss: () => void\n /** Close on Escape key. Default `true`. */\n escape?: boolean\n /** Close on pointerdown outside the excluded elements. Default `true`. */\n outsidePointerDown?: boolean\n /**\n * Extra \"inside\" test for pointerdown targets — e.g. teleported sibling\n * surfaces that belong to the same widget but live outside the excluded\n * refs' DOM trees.\n */\n excludePredicate?: (target: EventTarget | null) => boolean\n}\n\n/**\n * Listen for the universal \"dismiss\" gestures: Escape key and outside\n * pointer-down. Used by Popover / Dialog / Menu / Combobox. Tooltip does\n * NOT use this — it dismisses on mouseleave/blur instead.\n *\n * Listeners are attached to `document` only while `enabled` is true, and\n * removed on disable / unmount. SSR-safe (no-op without `document`).\n */\nexport function useDismiss(options: UseDismissOptions): void {\n const escape = options.escape !== false\n const outsidePointerDown = options.outsidePointerDown !== false\n\n const isExcluded = (target: EventTarget | null): boolean => {\n if (!target || !(target instanceof Node)) return false\n for (const r of options.exclude) {\n const el = r.value\n if (!el) continue\n if (el === target || el.contains(target)) return true\n }\n return false\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (!options.enabled.value) return\n if (isExcluded(event.target)) return\n if (options.excludePredicate?.(event.target)) return\n options.onDismiss()\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!options.enabled.value) return\n if (event.key === 'Escape') {\n event.stopPropagation()\n options.onDismiss()\n }\n }\n\n const attach = () => {\n if (typeof document === 'undefined') return\n if (outsidePointerDown) {\n document.addEventListener('pointerdown', onPointerDown, true)\n }\n if (escape) {\n document.addEventListener('keydown', onKeyDown)\n }\n }\n\n const detach = () => {\n if (typeof document === 'undefined') return\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown)\n }\n\n watch(\n options.enabled,\n (enabled) => {\n detach()\n if (enabled) attach()\n },\n { immediate: true, flush: 'post' },\n )\n\n onScopeDispose(detach)\n}\n"]}
@@ -30,18 +30,18 @@ var IrisInput = defineComponent({
30
30
  const sizeStyles = computed(() => {
31
31
  const map = {
32
32
  sm: {
33
- padding: "4px var(--iris-padding-sm)",
34
- fontSize: "12px",
33
+ padding: "var(--iris-space-xxs, 4px) var(--iris-padding-sm)",
34
+ fontSize: "var(--iris-font-size-xs, 12px)",
35
35
  minHeight: "28px"
36
36
  },
37
37
  md: {
38
- padding: "6px var(--iris-padding-md)",
39
- fontSize: "14px",
38
+ padding: "var(--iris-space-xs, 8px) var(--iris-padding-md)",
39
+ fontSize: "var(--iris-font-size-md, 14px)",
40
40
  minHeight: "34px"
41
41
  },
42
42
  lg: {
43
- padding: "8px var(--iris-padding-md)",
44
- fontSize: "16px",
43
+ padding: "var(--iris-space-xs, 8px) var(--iris-padding-md)",
44
+ fontSize: "var(--iris-font-size-lg, 16px)",
45
45
  minHeight: "40px"
46
46
  }
47
47
  };
@@ -49,7 +49,7 @@ var IrisInput = defineComponent({
49
49
  });
50
50
  const wrapperStyle = computed(() => {
51
51
  const borderColor = props.invalid ? "var(--iris-danger)" : focused.value ? "var(--iris-primary)" : "var(--iris-border)";
52
- const boxShadow = focused.value ? `0 0 0 3px ${props.invalid ? "rgba(239, 68, 68, 0.18)" : "rgba(99, 102, 241, 0.18)"}` : "none";
52
+ const boxShadow = focused.value ? `0 0 0 3px ${props.invalid ? "color-mix(in srgb, var(--iris-danger) 18%, transparent)" : "color-mix(in srgb, var(--iris-primary) 18%, transparent)"}` : "none";
53
53
  return {
54
54
  display: "inline-flex",
55
55
  alignItems: "center",
@@ -203,8 +203,8 @@ var IrisPasswordInput = defineComponent({
203
203
  border: "none",
204
204
  cursor: props.disabled ? "not-allowed" : "pointer",
205
205
  color: "var(--iris-muted)",
206
- padding: "0 2px",
207
- fontSize: "13px",
206
+ padding: "0 var(--iris-space-xxs, 4px)",
207
+ fontSize: "var(--iris-font-size-sm, 13px)",
208
208
  lineHeight: "1"
209
209
  }
210
210
  },
@@ -378,7 +378,10 @@ var CSS = `
378
378
  opacity: 0.6;
379
379
  }
380
380
  .iris-button[data-iris-button-variant="solid"]:not([disabled]):not([aria-busy="true"]):hover {
381
- filter: brightness(1.08);
381
+ background: color-mix(in srgb, var(--iris-danger) 92%, var(--iris-surface));
382
+ }
383
+ .iris-button:not([disabled]):not([aria-busy="true"]):active {
384
+ transform: scale(0.98);
382
385
  }
383
386
  .iris-button[data-iris-button-variant="outline"]:not([disabled]):not([aria-busy="true"]):hover,
384
387
  .iris-button[data-iris-button-variant="ghost"]:not([disabled]):not([aria-busy="true"]):hover {
@@ -420,15 +423,15 @@ function installButtonStyles() {
420
423
  var SIZE_STYLES = {
421
424
  sm: {
422
425
  padding: "var(--iris-padding-sm) var(--iris-padding-md)",
423
- fontSize: "12px"
426
+ fontSize: "var(--iris-font-size-xs, 12px)"
424
427
  },
425
428
  md: {
426
429
  padding: "var(--iris-padding-sm) var(--iris-padding-lg)",
427
- fontSize: "14px"
430
+ fontSize: "var(--iris-font-size-md, 14px)"
428
431
  },
429
432
  lg: {
430
433
  padding: "var(--iris-padding-md) var(--iris-padding-lg)",
431
- fontSize: "16px"
434
+ fontSize: "var(--iris-font-size-lg, 16px)"
432
435
  }
433
436
  };
434
437
  var VARIANT_STYLES = {
@@ -452,6 +455,11 @@ var VARIANT_STYLES = {
452
455
  color: "var(--iris-primary)",
453
456
  border: "1px solid transparent",
454
457
  textDecoration: "none"
458
+ },
459
+ danger: {
460
+ background: "var(--iris-danger)",
461
+ color: "var(--iris-on-color, #ffffff)",
462
+ border: "1px solid var(--iris-danger)"
455
463
  }
456
464
  };
457
465
  function buildInlineStyle(variant, size) {
@@ -647,7 +655,7 @@ var IrisFormField = defineComponent({
647
655
  {
648
656
  id: hintId,
649
657
  "data-iris-form-field-hint": "",
650
- style: { fontSize: "12px", color: "var(--iris-muted)" }
658
+ style: { fontSize: "var(--iris-font-size-xs, 12px)", color: "var(--iris-muted)" }
651
659
  },
652
660
  props.hint
653
661
  ) : null,
@@ -657,7 +665,10 @@ var IrisFormField = defineComponent({
657
665
  id: errorId,
658
666
  "data-iris-form-field-error": "",
659
667
  role: "alert",
660
- style: { fontSize: "12px", color: "var(--iris-danger)" }
668
+ style: {
669
+ fontSize: "var(--iris-font-size-xs, 12px)",
670
+ color: "var(--iris-danger)"
671
+ }
661
672
  },
662
673
  props.error
663
674
  ) : null
@@ -667,7 +678,7 @@ var IrisFormField = defineComponent({
667
678
  }
668
679
  });
669
680
  var TONE_TO_VAR = {
670
- info: "--iris-primary",
681
+ info: "--iris-info",
671
682
  success: "--iris-success",
672
683
  warning: "--iris-warning",
673
684
  danger: "--iris-danger"
@@ -759,7 +770,7 @@ var IrisAlert = defineComponent({
759
770
  border: "none",
760
771
  cursor: "pointer",
761
772
  color: "var(--iris-muted)",
762
- fontSize: "16px",
773
+ fontSize: "var(--iris-font-size-lg, 16px)",
763
774
  padding: "0",
764
775
  lineHeight: "1",
765
776
  flexShrink: "0"
@@ -835,9 +846,9 @@ var IrisDivider = defineComponent({
835
846
  gap: "8px",
836
847
  margin: `${SPACING_MAP[props.spacing]} 0`,
837
848
  color: "var(--iris-muted)",
838
- fontSize: "12px",
849
+ fontSize: "var(--iris-font-size-xs, 12px)",
839
850
  textTransform: "uppercase",
840
- letterSpacing: "0.04em",
851
+ letterSpacing: "var(--iris-letter-spacing-wide, 0.04em)",
841
852
  ...attrs.style ?? {}
842
853
  }
843
854
  },
@@ -914,8 +925,8 @@ var IrisLoginTemplate = defineComponent({
914
925
  background: "var(--iris-surface)",
915
926
  border: "1px solid var(--iris-border)",
916
927
  borderRadius: "var(--iris-radius-lg, 8px)",
917
- padding: "32px",
918
- boxShadow: "0 6px 20px -8px rgba(0, 0, 0, 0.16)"
928
+ padding: "var(--iris-space-2xl, 32px)",
929
+ boxShadow: "var(--iris-shadow-lg)"
919
930
  }
920
931
  },
921
932
  [
@@ -925,8 +936,8 @@ var IrisLoginTemplate = defineComponent({
925
936
  "h1",
926
937
  {
927
938
  style: {
928
- margin: "0 0 4px 0",
929
- fontSize: "22px",
939
+ margin: "0 0 var(--iris-space-xxs, 4px) 0",
940
+ fontSize: "var(--iris-font-size-2xl, 20px)",
930
941
  fontWeight: "700"
931
942
  }
932
943
  },
@@ -938,7 +949,7 @@ var IrisLoginTemplate = defineComponent({
938
949
  style: {
939
950
  margin: "0",
940
951
  color: "var(--iris-muted)",
941
- fontSize: "14px"
952
+ fontSize: "var(--iris-font-size-md, 14px)"
942
953
  }
943
954
  },
944
955
  props.description
@@ -1080,8 +1091,8 @@ var IrisDashboardTemplate = defineComponent({
1080
1091
  "div",
1081
1092
  {
1082
1093
  style: {
1083
- padding: "8px 12px",
1084
- fontSize: "14px",
1094
+ padding: "var(--iris-space-xs, 8px) var(--iris-space-sm, 12px)",
1095
+ fontSize: "var(--iris-font-size-md, 14px)",
1085
1096
  fontWeight: "600",
1086
1097
  color: "var(--iris-foreground)",
1087
1098
  opacity: state.collapsed ? 0 : 1,
@@ -1096,7 +1107,11 @@ var IrisDashboardTemplate = defineComponent({
1096
1107
  "nav",
1097
1108
  {
1098
1109
  "aria-label": "Primary",
1099
- style: { display: "flex", flexDirection: "column", gap: "2px" }
1110
+ style: {
1111
+ display: "flex",
1112
+ flexDirection: "column",
1113
+ gap: "var(--iris-space-xxs, 4px)"
1114
+ }
1100
1115
  },
1101
1116
  props.nav.map((item) => {
1102
1117
  const isActive = item.id === props.activeId;
@@ -1111,14 +1126,14 @@ var IrisDashboardTemplate = defineComponent({
1111
1126
  style: {
1112
1127
  display: "flex",
1113
1128
  alignItems: "center",
1114
- gap: "10px",
1115
- padding: "8px 12px",
1129
+ gap: "var(--iris-space-sm, 12px)",
1130
+ padding: "var(--iris-space-xs, 8px) var(--iris-space-sm, 12px)",
1116
1131
  background: isActive ? "var(--iris-primary)" : "transparent",
1117
1132
  color: isActive ? "var(--iris-primary-foreground, #fff)" : "var(--iris-foreground)",
1118
1133
  border: "none",
1119
1134
  borderRadius: "var(--iris-radius-sm, 4px)",
1120
1135
  cursor: "pointer",
1121
- fontSize: "14px",
1136
+ fontSize: "var(--iris-font-size-md, 14px)",
1122
1137
  fontFamily: "inherit",
1123
1138
  textAlign: "start",
1124
1139
  outline: "none"
@@ -1158,8 +1173,8 @@ var IrisDashboardTemplate = defineComponent({
1158
1173
  "div",
1159
1174
  {
1160
1175
  style: {
1161
- padding: "12px 20px",
1162
- fontSize: "16px",
1176
+ padding: "var(--iris-space-sm, 12px) var(--iris-space-lg, 20px)",
1177
+ fontSize: "var(--iris-font-size-lg, 16px)",
1163
1178
  fontWeight: "600"
1164
1179
  }
1165
1180
  },
@@ -1185,8 +1200,8 @@ var IrisDashboardTemplate = defineComponent({
1185
1200
  "h3",
1186
1201
  {
1187
1202
  style: {
1188
- margin: "0 0 8px 0",
1189
- fontSize: "14px",
1203
+ margin: "0 0 var(--iris-space-xs, 8px) 0",
1204
+ fontSize: "var(--iris-font-size-md, 14px)",
1190
1205
  fontWeight: "600",
1191
1206
  color: "var(--iris-foreground)"
1192
1207
  }
@@ -1195,7 +1210,12 @@ var IrisDashboardTemplate = defineComponent({
1195
1210
  ),
1196
1211
  slots[`card.${card.id}`] ? slots[`card.${card.id}`]() : card.body ? h(
1197
1212
  "div",
1198
- { style: { fontSize: "13px", color: "var(--iris-muted)" } },
1213
+ {
1214
+ style: {
1215
+ fontSize: "var(--iris-font-size-sm, 13px)",
1216
+ color: "var(--iris-muted)"
1217
+ }
1218
+ },
1199
1219
  card.body
1200
1220
  ) : null
1201
1221
  ]
@@ -1211,5 +1231,5 @@ var IrisDashboardTemplate = defineComponent({
1211
1231
  });
1212
1232
 
1213
1233
  export { IrisAlert, IrisButton, IrisCheckbox, IrisDashboardTemplate, IrisDivider, IrisFormField, IrisInput, IrisLoginTemplate, IrisPasswordInput };
1214
- //# sourceMappingURL=chunk-BEPH6PPL.js.map
1215
- //# sourceMappingURL=chunk-BEPH6PPL.js.map
1234
+ //# sourceMappingURL=chunk-LWABTQCB.js.map
1235
+ //# sourceMappingURL=chunk-LWABTQCB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/input/Input.ts","../src/primitives/password-input/PasswordInput.ts","../src/primitives/checkbox/Checkbox.ts","../src/primitives/button/styles.ts","../src/primitives/button/Button.ts","../src/primitives/form-field/FormField.ts","../src/primitives/alert/Alert.ts","../src/primitives/divider/Divider.ts","../src/skeletons/LoginTemplate.ts","../src/skeletons/DashboardTemplate.ts"],"names":["defineComponent","ref","h","computed","watch"],"mappings":"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","file":"chunk-LWABTQCB.js","sourcesContent":["import { computed, defineComponent, h, ref, type PropType } from 'vue'\nimport type { Size } from '@iris-ui-kit/core'\n\nexport type IrisInputSize = Size\nexport type IrisInputType = 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url'\n\n/**\n * Text input primitive. Wraps a native `<input>` with token-driven styling\n * plus optional `prefix` / `suffix` slots for icons or text adornments. The\n * value is two-way bound via `v-model`.\n *\n * Focus styling is handled with `:focus-within` on the wrapping `<label>`,\n * which doubles as the click target so the entire pill is clickable.\n */\nexport const IrisInput = defineComponent({\n name: 'IrisInput',\n inheritAttrs: false,\n props: {\n modelValue: { type: [String, Number] as PropType<string | number>, default: '' },\n type: { type: String as PropType<IrisInputType>, default: 'text' },\n size: { type: String as PropType<IrisInputSize>, default: 'md' },\n placeholder: { type: String, default: '' },\n disabled: { type: Boolean, default: false },\n readonly: { type: Boolean, default: false },\n /** Visual error state — does NOT enforce validation. */\n invalid: { type: Boolean, default: false },\n id: { type: String, default: undefined },\n /** Forwarded as `aria-describedby` on the inner <input>. Set by IrisFormField. */\n ariaDescribedby: { type: String, default: undefined },\n },\n emits: {\n 'update:modelValue': (_value: string) => true,\n focus: (_event: FocusEvent) => true,\n blur: (_event: FocusEvent) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const focused = ref(false)\n\n const sizeStyles = computed<Record<string, string>>(() => {\n const map: Record<IrisInputSize, { padding: string; fontSize: string; minHeight: string }> = {\n sm: {\n padding: 'var(--iris-space-xxs, 4px) var(--iris-padding-sm)',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n minHeight: '28px',\n },\n md: {\n padding: 'var(--iris-space-xs, 8px) var(--iris-padding-md)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n minHeight: '34px',\n },\n lg: {\n padding: 'var(--iris-space-xs, 8px) var(--iris-padding-md)',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n minHeight: '40px',\n },\n }\n return map[props.size]\n })\n\n const wrapperStyle = computed<Record<string, string>>(() => {\n const borderColor = props.invalid\n ? 'var(--iris-danger)'\n : focused.value\n ? 'var(--iris-primary)'\n : 'var(--iris-border)'\n const boxShadow = focused.value\n ? `0 0 0 3px ${props.invalid ? 'color-mix(in srgb, var(--iris-danger) 18%, transparent)' : 'color-mix(in srgb, var(--iris-primary) 18%, transparent)'}`\n : 'none'\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-gap-sm)',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n border: `1px solid ${borderColor}`,\n borderRadius: 'var(--iris-radius-md)',\n cursor: props.disabled ? 'not-allowed' : 'text',\n opacity: props.disabled ? '0.6' : '1',\n transition: 'border-color 120ms ease, box-shadow 120ms ease',\n boxShadow,\n ...sizeStyles.value,\n padding: sizeStyles.value.padding,\n minHeight: sizeStyles.value.minHeight,\n }\n })\n\n const inputStyle: Record<string, string> = {\n flex: '1',\n minWidth: '0',\n border: 'none',\n outline: 'none',\n background: 'transparent',\n color: 'inherit',\n fontFamily: 'inherit',\n fontSize: 'inherit',\n padding: '0',\n }\n\n const onInput = (event: Event) => {\n emit('update:modelValue', (event.target as HTMLInputElement).value)\n }\n const onFocus = (event: FocusEvent) => {\n focused.value = true\n emit('focus', event)\n }\n const onBlur = (event: FocusEvent) => {\n focused.value = false\n emit('blur', event)\n }\n\n return () => {\n const prefix = slots.prefix?.()\n const suffix = slots.suffix?.()\n return h(\n 'label',\n {\n ...attrs,\n 'data-iris-input': '',\n 'data-iris-input-size': props.size,\n 'data-state': props.invalid ? 'invalid' : focused.value ? 'focused' : 'idle',\n style: {\n ...wrapperStyle.value,\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n prefix &&\n h(\n 'span',\n {\n 'data-iris-input-prefix': '',\n style: { display: 'inline-flex', alignItems: 'center', color: 'var(--iris-muted)' },\n },\n prefix,\n ),\n h('input', {\n id: props.id,\n type: props.type,\n value: props.modelValue,\n placeholder: props.placeholder,\n disabled: props.disabled || undefined,\n readonly: props.readonly || undefined,\n 'aria-invalid': props.invalid ? 'true' : undefined,\n 'aria-describedby': props.ariaDescribedby,\n style: inputStyle,\n onInput,\n onFocus,\n onBlur,\n }),\n suffix &&\n h(\n 'span',\n {\n 'data-iris-input-suffix': '',\n style: { display: 'inline-flex', alignItems: 'center', color: 'var(--iris-muted)' },\n },\n suffix,\n ),\n ],\n )\n }\n },\n})\n","import { defineComponent, h, ref, type PropType } from 'vue'\nimport { IrisInput } from '../input/Input'\nimport { useI18n } from '../../i18n'\nimport type { Size } from '@iris-ui-kit/core'\n\nexport type IrisPasswordInputSize = Size\n\n/**\n * Password field wrapping {@link IrisInput}. Adds a visibility toggle as\n * the input's suffix slot — clicking it flips the input type between\n * `password` and `text`.\n */\nexport const IrisPasswordInput = defineComponent({\n name: 'IrisPasswordInput',\n inheritAttrs: false,\n props: {\n modelValue: { type: String, default: '' },\n size: { type: String as PropType<IrisPasswordInputSize>, default: 'md' },\n placeholder: { type: String, default: '' },\n disabled: { type: Boolean, default: false },\n readonly: { type: Boolean, default: false },\n invalid: { type: Boolean, default: false },\n id: { type: String, default: undefined },\n /** Allow the user to toggle visibility. Default `true`. */\n showToggle: { type: Boolean, default: true },\n },\n emits: {\n 'update:modelValue': (_value: string) => true,\n focus: (_event: FocusEvent) => true,\n blur: (_event: FocusEvent) => true,\n },\n setup(props, { attrs, emit, slots }) {\n const { t } = useI18n()\n const visible = ref(false)\n\n const onUpdate = (value: string) => emit('update:modelValue', value)\n const onFocus = (e: FocusEvent) => emit('focus', e)\n const onBlur = (e: FocusEvent) => emit('blur', e)\n\n const toggle = () => {\n if (props.disabled || props.readonly) return\n visible.value = !visible.value\n }\n\n return () =>\n h(\n IrisInput,\n {\n ...attrs,\n modelValue: props.modelValue,\n type: visible.value ? 'text' : 'password',\n size: props.size,\n placeholder: props.placeholder,\n disabled: props.disabled,\n readonly: props.readonly,\n invalid: props.invalid,\n id: props.id,\n 'data-iris-password-input': '',\n 'onUpdate:modelValue': onUpdate,\n onFocus,\n onBlur,\n },\n {\n prefix: slots.prefix,\n suffix: () => [\n slots.suffix?.(),\n props.showToggle\n ? h(\n 'button',\n {\n type: 'button',\n 'data-iris-password-input-toggle': '',\n 'aria-label': visible.value ? t('passwordInput.hide') : t('passwordInput.show'),\n 'aria-pressed': visible.value ? 'true' : 'false',\n onClick: toggle,\n style: {\n background: 'transparent',\n border: 'none',\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n color: 'var(--iris-muted)',\n padding: '0 var(--iris-space-xxs, 4px)',\n fontSize: 'var(--iris-font-size-sm, 13px)',\n lineHeight: '1',\n },\n },\n visible.value ? '🙈' : '👁',\n )\n : null,\n ],\n },\n )\n },\n})\n","import { computed, defineComponent, h, type PropType } from 'vue'\nimport type { Size } from '@iris-ui-kit/core'\n\nexport type IrisCheckboxSize = Size\nexport type IrisCheckboxValue = boolean | 'indeterminate'\n\n/**\n * Tri-state checkbox: `false` (unchecked), `true` (checked), or\n * `'indeterminate'`. The native checkbox is hidden but focusable; the\n * visible box is purely visual and mirrors the state via `data-state`.\n *\n * `v-model` emits `boolean` only — switching FROM indeterminate emits the\n * boolean the user chose by clicking (becomes `true`).\n */\nexport const IrisCheckbox = defineComponent({\n name: 'IrisCheckbox',\n inheritAttrs: false,\n props: {\n modelValue: {\n type: [Boolean, String] as PropType<IrisCheckboxValue>,\n default: false,\n },\n size: { type: String as PropType<IrisCheckboxSize>, default: 'md' },\n disabled: { type: Boolean, default: false },\n id: { type: String, default: undefined },\n name: { type: String, default: undefined },\n value: { type: [String, Number] as PropType<string | number>, default: undefined },\n /** Forwarded as `aria-describedby` on the native checkbox input. Set by IrisFormField. */\n ariaDescribedby: { type: String, default: undefined },\n /**\n * Accessible name for the native checkbox input. Bound as `aria-label` on\n * the `<input>` itself (the element with the checkbox role), NOT the label\n * wrapper. Use when there is no visible label text.\n */\n ariaLabel: { type: String, default: undefined },\n /** Invalid state — sets aria-invalid. Set by IrisFormField. */\n invalid: { type: Boolean, default: false },\n },\n emits: {\n 'update:modelValue': (_value: boolean) => true,\n change: (_value: boolean) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const state = computed<'checked' | 'unchecked' | 'indeterminate'>(() => {\n if (props.modelValue === 'indeterminate') return 'indeterminate'\n return props.modelValue ? 'checked' : 'unchecked'\n })\n\n const dim = computed(() => {\n const map: Record<IrisCheckboxSize, string> = { sm: '14px', md: '18px', lg: '22px' }\n return map[props.size]\n })\n\n const boxStyle = computed<Record<string, string>>(() => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: dim.value,\n height: dim.value,\n borderRadius: 'var(--iris-radius-sm)',\n border: '1px solid var(--iris-border)',\n background: state.value === 'unchecked' ? 'var(--iris-background)' : 'var(--iris-primary)',\n borderColor: state.value === 'unchecked' ? 'var(--iris-border)' : 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground)',\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n opacity: props.disabled ? '0.6' : '1',\n transition: 'background-color 120ms ease, border-color 120ms ease',\n verticalAlign: 'middle',\n }))\n\n const onChange = (event: Event) => {\n const next = (event.target as HTMLInputElement).checked\n emit('update:modelValue', next)\n emit('change', next)\n }\n\n const renderIndicator = () => {\n if (state.value === 'unchecked') return null\n if (state.value === 'indeterminate') {\n return h('span', {\n 'aria-hidden': 'true',\n style: { width: '60%', height: '2px', background: 'currentColor', borderRadius: '1px' },\n })\n }\n return h(\n 'svg',\n {\n 'aria-hidden': 'true',\n viewBox: '0 0 16 16',\n width: '80%',\n height: '80%',\n fill: 'none',\n },\n [\n h('path', {\n d: 'M3 8.5 L6.5 12 L13 4.5',\n stroke: 'currentColor',\n 'stroke-width': '2.4',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ],\n )\n }\n\n return () =>\n h(\n 'label',\n {\n ...attrs,\n 'data-iris-checkbox': '',\n 'data-iris-checkbox-size': props.size,\n 'data-state': state.value,\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-gap-sm)',\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h('input', {\n type: 'checkbox',\n id: props.id,\n name: props.name,\n value: props.value,\n checked: props.modelValue === true,\n indeterminate: props.modelValue === 'indeterminate',\n disabled: props.disabled || undefined,\n 'aria-checked':\n state.value === 'indeterminate'\n ? 'mixed'\n : state.value === 'checked'\n ? 'true'\n : 'false',\n 'aria-describedby': props.ariaDescribedby,\n 'aria-label': props.ariaLabel,\n 'aria-invalid': props.invalid ? 'true' : undefined,\n style: {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n },\n onChange,\n }),\n h('span', { 'aria-hidden': 'true', style: boxStyle.value }, [renderIndicator()]),\n slots.default && h('span', null, slots.default()),\n ],\n )\n },\n})\n","/**\n * Singleton stylesheet for `IrisButton`. Lives in a single injected\n * `<style id=\"iris-button-styles\">` block. Holds only what cannot be inline:\n *\n * - `:hover` / `:focus-visible` pseudo-states\n * - `:disabled` / `[aria-busy=\"true\"]` attribute selectors\n * - The spinner keyframe\n *\n * Everything else (variant colors, size paddings) ships as inline `style`\n * bindings on each button instance, which keeps theme switching instant\n * because the values are CSS variables.\n *\n * Injection is **lazy** (first `IrisButton` mount triggers it) and\n * **idempotent** (subsequent mounts are no-ops). Safe under SSR — the\n * function short-circuits when `document` is undefined.\n */\n\nconst STYLE_ID = 'iris-button-styles'\n\nconst CSS = `\n.iris-button {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--iris-gap-sm, 4px);\n font-family: inherit;\n font-weight: 500;\n line-height: 1.2;\n border-radius: var(--iris-radius-md, 6px);\n white-space: nowrap;\n user-select: none;\n position: relative;\n transition:\n background-color 120ms ease,\n border-color 120ms ease,\n color 120ms ease,\n filter 120ms ease;\n}\n.iris-button:focus-visible {\n outline: 2px solid var(--iris-primary);\n outline-offset: 2px;\n}\n.iris-button[disabled],\n.iris-button[aria-busy=\"true\"] {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.iris-button[data-iris-button-variant=\"solid\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n background: color-mix(in srgb, var(--iris-danger) 92%, var(--iris-surface));\n}\n.iris-button:not([disabled]):not([aria-busy=\"true\"]):active {\n transform: scale(0.98);\n}\n.iris-button[data-iris-button-variant=\"outline\"]:not([disabled]):not([aria-busy=\"true\"]):hover,\n.iris-button[data-iris-button-variant=\"ghost\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n background-color: var(--iris-surface-hover);\n}\n.iris-button[data-iris-button-variant=\"link\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n text-decoration: underline;\n}\n.iris-button-leading {\n display: inline-flex;\n align-items: center;\n}\n.iris-button-spinner {\n width: 1em;\n height: 1em;\n display: inline-block;\n animation: iris-button-spin 0.7s linear infinite;\n}\n@keyframes iris-button-spin {\n to { transform: rotate(360deg); }\n}\n`\n\nlet installed = false\n\nexport function installButtonStyles(): void {\n if (installed) return\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID)) {\n installed = true\n return\n }\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = CSS\n document.head.appendChild(style)\n installed = true\n}\n\n/** Test-only reset. Removes the injected `<style>` and clears the flag. */\nexport function __resetButtonStyles(): void {\n installed = false\n if (typeof document === 'undefined') return\n document.getElementById(STYLE_ID)?.remove()\n}\n\n/** Test-only inspection of the cached install flag. */\nexport const __BUTTON_STYLE_ID = STYLE_ID\n","import { computed, defineComponent, h, type PropType, type VNode } from 'vue'\nimport type { IrisButtonSize, IrisButtonType, IrisButtonVariant } from './types'\nimport { installButtonStyles } from './styles'\nimport { findFirstElement, mergeSlotProps } from '../slot/Slot'\n\ntype StyleMap = Record<string, string>\n\nconst SIZE_STYLES: Record<IrisButtonSize, StyleMap> = {\n sm: {\n padding: 'var(--iris-padding-sm) var(--iris-padding-md)',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n },\n md: {\n padding: 'var(--iris-padding-sm) var(--iris-padding-lg)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n },\n lg: {\n padding: 'var(--iris-padding-md) var(--iris-padding-lg)',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n },\n}\n\nconst VARIANT_STYLES: Record<IrisButtonVariant, StyleMap> = {\n solid: {\n background: 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground)',\n border: '1px solid var(--iris-primary)',\n },\n outline: {\n background: 'transparent',\n color: 'var(--iris-primary)',\n border: '1px solid var(--iris-border)',\n },\n ghost: {\n background: 'transparent',\n color: 'var(--iris-foreground)',\n border: '1px solid transparent',\n },\n link: {\n background: 'transparent',\n color: 'var(--iris-primary)',\n border: '1px solid transparent',\n textDecoration: 'none',\n },\n danger: {\n background: 'var(--iris-danger)',\n color: 'var(--iris-on-color, #ffffff)',\n border: '1px solid var(--iris-danger)',\n },\n}\n\nfunction buildInlineStyle(variant: IrisButtonVariant, size: IrisButtonSize): StyleMap {\n const base: StyleMap = { ...SIZE_STYLES[size], ...VARIANT_STYLES[variant] }\n if (variant === 'link') {\n base.padding = '0'\n }\n return base\n}\n\nfunction renderSpinner(): VNode {\n return h(\n 'svg',\n {\n class: 'iris-button-spinner',\n viewBox: '0 0 24 24',\n fill: 'none',\n 'aria-hidden': 'true',\n },\n [\n h('circle', {\n cx: '12',\n cy: '12',\n r: '10',\n stroke: 'currentColor',\n 'stroke-opacity': '0.25',\n 'stroke-width': '3',\n }),\n h('path', {\n d: 'M22 12a10 10 0 0 1-10 10',\n stroke: 'currentColor',\n 'stroke-width': '3',\n 'stroke-linecap': 'round',\n }),\n ],\n )\n}\n\n/**\n * Foundational button primitive. Props-driven, no internal state machine —\n * Button's behavior is fully derived from `variant`, `size`, `disabled`, and\n * `loading`. Composite primitives (Popover, Tooltip, Dialog, Select) **do**\n * need state machines; Button does not, and forcing one on it would violate\n * the project's \"use a machine only when there is observable state to model\"\n * rule.\n *\n * Styling: variant colors and size paddings ship as inline `style` referencing\n * `var(--iris-*)` so theme switching is instant. A small singleton stylesheet\n * (auto-installed on first mount, removable in tests) covers `:hover`,\n * `:focus-visible`, and the spinner keyframe — things inline `style` cannot\n * express.\n *\n * Accessibility:\n * - native `<button>` (focusable, keyboard-activatable by default)\n * - `disabled` → HTML `disabled` + `aria-disabled=\"true\"`\n * - `loading` → `aria-busy=\"true\"` + click swallowed\n * - default `type=\"button\"` to prevent accidental form submission\n *\n * @example\n * <IrisButton variant=\"solid\" size=\"md\" @click=\"save\">Save</IrisButton>\n *\n * @example\n * <IrisButton variant=\"outline\" :loading=\"isSaving\" @click=\"save\">\n * <template #leading><CheckIcon /></template>\n * Save\n * </IrisButton>\n */\nexport const IrisButton = defineComponent({\n name: 'IrisButton',\n props: {\n variant: { type: String as PropType<IrisButtonVariant>, default: 'solid' },\n size: { type: String as PropType<IrisButtonSize>, default: 'md' },\n disabled: { type: Boolean, default: false },\n loading: { type: Boolean, default: false },\n type: { type: String as PropType<IrisButtonType>, default: 'button' },\n asChild: { type: Boolean, default: false },\n },\n emits: {\n click: (_event: MouseEvent) => true,\n },\n setup(props, { slots, emit }) {\n installButtonStyles()\n\n const isInteractive = computed(() => !props.disabled && !props.loading)\n const inlineStyle = computed(() => buildInlineStyle(props.variant, props.size))\n\n const onClick = (event: MouseEvent) => {\n if (!isInteractive.value) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n emit('click', event)\n }\n\n return () => {\n const baseProps: Record<string, unknown> = {\n class: 'iris-button',\n 'data-iris-button-variant': props.variant,\n 'data-iris-button-size': props.size,\n 'aria-disabled': props.disabled ? 'true' : undefined,\n 'aria-busy': props.loading ? 'true' : undefined,\n style: inlineStyle.value,\n onClick,\n }\n\n if (props.asChild) {\n const root = findFirstElement(slots.default?.())\n if (!root) {\n if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'production') {\n console.warn('[iris-ui] IrisButton: as-child requires a single child element')\n }\n return null\n }\n // For non-<button> roots, the `disabled` HTML attribute may be a no-op.\n // We still set `aria-disabled` (above) and intercept clicks via\n // `composeEventHandlers` inside `mergeSlotProps`, which bails out if\n // the parent handler calls `event.preventDefault()`.\n const parentProps: Record<string, unknown> = {\n ...baseProps,\n disabled: isInteractive.value ? undefined : true,\n }\n const merged = mergeSlotProps(parentProps, (root.props ?? {}) as Record<string, unknown>)\n return h(root.type as string, merged, root.children as unknown as VNode[])\n }\n\n const leadingContent: VNode | VNode[] | undefined = props.loading\n ? renderSpinner()\n : slots.leading?.()\n\n const children: Array<VNode | VNode[] | undefined> = []\n if (leadingContent) {\n children.push(h('span', { class: 'iris-button-leading' }, leadingContent))\n }\n const defaultSlot = slots.default?.()\n if (defaultSlot) children.push(defaultSlot)\n\n return h(\n 'button',\n {\n ...baseProps,\n type: props.type,\n disabled: isInteractive.value ? undefined : true,\n },\n children,\n )\n }\n },\n})\n","import { Fragment, cloneVNode, computed, defineComponent, h, useId, type VNode } from 'vue'\n\n/**\n * Form-field wrapper that handles the label / hint / error trio with the\n * right a11y plumbing. Works as a non-invasive wrapper around any input-like\n * primitive (`IrisInput`, `IrisTextarea`, `IrisSelect`, `IrisNumberInput`,\n * `IrisSwitch`, `IrisCheckbox`, …): it locates the first VNode in the\n * default slot and clones it with the generated `id`, `aria-describedby`,\n * and `aria-invalid` attributes.\n *\n * Composition:\n *\n * ```html\n * <IrisFormField label=\"Email\" :error=\"errors.email\" hint=\"We never share it.\">\n * <IrisInput v-model=\"email\" />\n * </IrisFormField>\n * ```\n *\n * Pass `labelFor` if you want to pin the rendered `<label for>` to a\n * specific id (e.g. when the wrapped control is a custom non-`<input>`\n * widget).\n */\nexport const IrisFormField = defineComponent({\n name: 'IrisFormField',\n inheritAttrs: false,\n props: {\n label: { type: String, default: '' },\n hint: { type: String, default: '' },\n error: { type: String, default: '' },\n required: { type: Boolean, default: false },\n /** Override the auto-generated control id. */\n labelFor: { type: String, default: '' },\n /** Visual size of the label. */\n size: { type: String as () => 'sm' | 'md', default: 'md' },\n },\n setup(props, { slots, attrs }) {\n const baseId = useId()\n const controlId = computed(() => props.labelFor || `${baseId}-control`)\n const hintId = `${baseId}-hint`\n const errorId = `${baseId}-error`\n\n const describedBy = computed(() => {\n const ids: string[] = []\n if (props.hint) ids.push(hintId)\n if (props.error) ids.push(errorId)\n return ids.length > 0 ? ids.join(' ') : undefined\n })\n\n const labelStyle = computed<Record<string, string>>(() => ({\n fontSize: props.size === 'sm' ? '12px' : '14px',\n fontWeight: '500',\n color: props.error ? 'var(--iris-danger)' : 'var(--iris-foreground)',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n }))\n\n return () => {\n const children = (slots.default?.() ?? []) as VNode[]\n // Find the first non-text VNode and inject id + aria-*.\n let injected: VNode | null = null\n const restChildren: (VNode | null)[] = []\n let foundFirst = false\n children.forEach((child) => {\n if (!foundFirst && typeof child.type !== 'symbol' && typeof child.type !== 'string') {\n // Pass props that ALL Iris field primitives understand:\n // - id → forwarded to the native control\n // - invalid → flips aria-invalid + invalid styling\n // - ariaDescribedby → forwarded as aria-describedby on the native control\n injected = cloneVNode(child, {\n id: controlId.value,\n invalid: props.error ? true : undefined,\n ariaDescribedby: describedBy.value,\n })\n foundFirst = true\n } else {\n restChildren.push(child)\n }\n })\n\n return h(\n 'div',\n {\n ...attrs,\n 'data-iris-form-field': '',\n 'data-iris-form-field-state': props.error ? 'invalid' : 'valid',\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n props.label\n ? h(\n 'label',\n {\n for: controlId.value,\n 'data-iris-form-field-label': '',\n style: labelStyle.value,\n },\n [\n props.label,\n props.required\n ? h(\n 'span',\n {\n 'aria-hidden': 'true',\n 'data-iris-form-field-required': '',\n style: { color: 'var(--iris-danger)' },\n },\n '*',\n )\n : null,\n ],\n )\n : null,\n // The wrapped control + any trailing siblings.\n h(Fragment, null, [injected, ...restChildren]),\n props.hint && !props.error\n ? h(\n 'div',\n {\n id: hintId,\n 'data-iris-form-field-hint': '',\n style: { fontSize: 'var(--iris-font-size-xs, 12px)', color: 'var(--iris-muted)' },\n },\n props.hint,\n )\n : null,\n props.error\n ? h(\n 'div',\n {\n id: errorId,\n 'data-iris-form-field-error': '',\n role: 'alert',\n style: {\n fontSize: 'var(--iris-font-size-xs, 12px)',\n color: 'var(--iris-danger)',\n },\n },\n props.error,\n )\n : null,\n ],\n )\n }\n },\n})\n","import { computed, defineComponent, h, ref, watch, type PropType } from 'vue'\nimport { useI18n } from '../../i18n'\n\nexport type IrisAlertTone = 'info' | 'success' | 'warning' | 'danger'\n\nconst TONE_TO_VAR: Record<IrisAlertTone, string> = {\n info: '--iris-info',\n success: '--iris-success',\n warning: '--iris-warning',\n danger: '--iris-danger',\n}\n\n/**\n * Inline status / feedback callout. Use for page- or section-level messages\n * that are part of the document flow (NOT transient — those use Toast).\n *\n * Composition:\n *\n * ```html\n * <IrisAlert tone=\"warning\" closable @close=\"...\">\n * <template #title>Heads up</template>\n * Storage is at 85 % of quota.\n * </IrisAlert>\n * ```\n *\n * Controlled (`v-model:open`) or uncontrolled (default visible). When closed\n * (uncontrolled), the component returns `null` from render rather than\n * leaving an empty wrapper in the tree.\n */\nexport const IrisAlert = defineComponent({\n name: 'IrisAlert',\n inheritAttrs: false,\n props: {\n tone: { type: String as PropType<IrisAlertTone>, default: 'info' },\n title: { type: String, default: '' },\n /** When true, a close button is rendered. */\n closable: { type: Boolean, default: false },\n /** Controlled visibility. Omit for uncontrolled (defaults to visible). */\n open: { type: Boolean, default: undefined },\n },\n emits: {\n 'update:open': (_value: boolean) => true,\n close: () => true,\n },\n setup(props, { slots, attrs, emit }) {\n const { t } = useI18n()\n const internalOpen = ref(true)\n\n watch(\n () => props.open,\n (value) => {\n if (value !== undefined) internalOpen.value = value\n },\n )\n\n const isOpen = computed(() => (props.open !== undefined ? props.open : internalOpen.value))\n\n const onClose = () => {\n if (props.open === undefined) internalOpen.value = false\n emit('update:open', false)\n emit('close')\n }\n\n const tonalVar = computed(() => `var(${TONE_TO_VAR[props.tone]})`)\n\n const containerStyle = computed<Record<string, string>>(() => ({\n display: 'flex',\n gap: 'var(--iris-gap-md, 12px)',\n padding: 'var(--iris-padding-md, 12px)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n border: `1px solid ${tonalVar.value}`,\n // `backgroundColor` is the precomputed fallback under color-mix (engines\n // without it); the `background` shorthand overrides with the exact mix.\n backgroundColor: `var(${TONE_TO_VAR[props.tone]}-subtle)`,\n background: `color-mix(in srgb, ${tonalVar.value} 10%, var(--iris-background))`,\n color: 'var(--iris-foreground)',\n alignItems: 'flex-start',\n }))\n\n return () => {\n if (!isOpen.value) return null\n return h(\n 'div',\n {\n ...attrs,\n role: props.tone === 'danger' || props.tone === 'warning' ? 'alert' : 'status',\n 'data-iris-alert': '',\n 'data-iris-alert-tone': props.tone,\n style: { ...containerStyle.value, ...((attrs.style as Record<string, string>) ?? {}) },\n },\n [\n slots.icon\n ? h(\n 'span',\n {\n 'data-iris-alert-icon': '',\n style: { color: tonalVar.value, flexShrink: '0', display: 'inline-flex' },\n },\n slots.icon(),\n )\n : null,\n h('div', { 'data-iris-alert-body': '', style: { flex: '1', minWidth: '0' } }, [\n props.title || slots.title\n ? h(\n 'div',\n {\n 'data-iris-alert-title': '',\n style: { fontWeight: '600', marginBottom: '4px', color: tonalVar.value },\n },\n slots.title?.() ?? props.title,\n )\n : null,\n h('div', { 'data-iris-alert-content': '' }, slots.default?.()),\n ]),\n props.closable\n ? h(\n 'button',\n {\n type: 'button',\n 'data-iris-alert-close': '',\n 'aria-label': t('alert.close'),\n onClick: onClose,\n style: {\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n padding: '0',\n lineHeight: '1',\n flexShrink: '0',\n },\n },\n '✕',\n )\n : null,\n ],\n )\n }\n },\n})\n","import { computed, defineComponent, h, type PropType } from 'vue'\n\nexport type IrisDividerOrientation = 'horizontal' | 'vertical'\nexport type IrisDividerSpacing = 'sm' | 'md' | 'lg'\n\nconst SPACING_MAP: Record<IrisDividerSpacing, string> = {\n sm: '8px',\n md: '16px',\n lg: '24px',\n}\n\n/**\n * Visual separator. Horizontal renders an `<hr>` for semantic correctness\n * (or a labelled `<div role=\"separator\">` when a label slot is supplied).\n * Vertical always renders a `<div role=\"separator\">`.\n *\n * Pass a `label` (or label slot) to render text in the middle — \"OR\"\n * separators, section dividers, etc.\n */\nexport const IrisDivider = defineComponent({\n name: 'IrisDivider',\n inheritAttrs: false,\n props: {\n orientation: { type: String as PropType<IrisDividerOrientation>, default: 'horizontal' },\n label: { type: String, default: '' },\n spacing: { type: String as PropType<IrisDividerSpacing>, default: 'md' },\n },\n setup(props, { slots, attrs }) {\n const isHorizontal = computed(() => props.orientation === 'horizontal')\n const hasLabel = computed(() => Boolean(props.label || slots.default))\n\n return () => {\n if (isHorizontal.value && !hasLabel.value) {\n return h('hr', {\n ...attrs,\n 'data-iris-divider': '',\n 'data-iris-divider-orientation': 'horizontal',\n style: {\n border: 'none',\n borderTop: '1px solid var(--iris-border)',\n margin: `${SPACING_MAP[props.spacing]} 0`,\n width: '100%',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n })\n }\n\n if (!isHorizontal.value) {\n return h('div', {\n ...attrs,\n role: 'separator',\n 'aria-orientation': 'vertical',\n 'data-iris-divider': '',\n 'data-iris-divider-orientation': 'vertical',\n style: {\n display: 'inline-block',\n width: '1px',\n alignSelf: 'stretch',\n background: 'var(--iris-border)',\n margin: `0 ${SPACING_MAP[props.spacing]}`,\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n })\n }\n\n // Horizontal + label → 3-column flex with text in the middle.\n return h(\n 'div',\n {\n ...attrs,\n role: 'separator',\n 'aria-orientation': 'horizontal',\n 'data-iris-divider': '',\n 'data-iris-divider-orientation': 'horizontal',\n 'data-iris-divider-has-label': 'true',\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n margin: `${SPACING_MAP[props.spacing]} 0`,\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-xs, 12px)',\n textTransform: 'uppercase',\n letterSpacing: 'var(--iris-letter-spacing-wide, 0.04em)',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h('span', { 'data-iris-divider-line': 'before', style: lineStyle() }),\n h('span', { 'data-iris-divider-label': '' }, slots.default?.() ?? props.label),\n h('span', { 'data-iris-divider-line': 'after', style: lineStyle() }),\n ],\n )\n }\n },\n})\n\nfunction lineStyle(): Record<string, string> {\n return {\n flex: '1',\n height: '1px',\n background: 'var(--iris-border)',\n }\n}\n","import { defineComponent, h, ref } from 'vue'\nimport { IrisStack } from '../layouts/Stack'\nimport { IrisContainer } from '../layouts/Container'\nimport { IrisInput } from '../primitives/input/Input'\nimport { IrisPasswordInput } from '../primitives/password-input/PasswordInput'\nimport { IrisCheckbox } from '../primitives/checkbox/Checkbox'\nimport { IrisButton } from '../primitives/button/Button'\nimport { IrisFormField } from '../primitives/form-field/FormField'\nimport { IrisAlert } from '../primitives/alert/Alert'\nimport { IrisDivider } from '../primitives/divider/Divider'\n\nexport interface IrisLoginSubmitPayload {\n email: string\n password: string\n remember: boolean\n}\n\n/**\n * Layer 4 system skeleton: a centered login page using only Iris primitives.\n * Demonstrates the recommended composition pattern (Container + Stack +\n * FormField wrappers) for forms.\n *\n * The template is opinionated about layout and a11y; data binding is left to\n * the consumer via the `submit` event + slot props.\n */\nexport const IrisLoginTemplate = defineComponent({\n name: 'IrisLoginTemplate',\n inheritAttrs: false,\n props: {\n title: { type: String, default: 'Sign in' },\n description: { type: String, default: '' },\n /** Show \"Remember me\" checkbox. */\n showRemember: { type: Boolean, default: true },\n /** Error message shown above the form. */\n error: { type: String, default: '' },\n submitLabel: { type: String, default: 'Sign in' },\n /** Disable the entire form (e.g. while a request is pending). */\n loading: { type: Boolean, default: false },\n },\n emits: {\n submit: (_payload: IrisLoginSubmitPayload) => true,\n },\n setup(props, { attrs, slots, emit }) {\n const email = ref('')\n const password = ref('')\n const remember = ref(false)\n\n const onSubmit = (event: Event) => {\n event.preventDefault()\n emit('submit', {\n email: email.value,\n password: password.value,\n remember: remember.value,\n })\n }\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-iris-login-template': '',\n style: {\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n padding: '24px',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n h(IrisContainer, { maxWidth: '420px', padding: 0 }, () => [\n h(\n 'form',\n {\n onSubmit,\n 'data-iris-login-form': '',\n style: {\n background: 'var(--iris-surface)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-lg, 8px)',\n padding: 'var(--iris-space-2xl, 32px)',\n boxShadow: 'var(--iris-shadow-lg)',\n },\n },\n [\n h(IrisStack, { spacing: 'lg' }, () => [\n slots.header\n ? slots.header()\n : h('div', { style: { textAlign: 'center' } }, [\n h(\n 'h1',\n {\n style: {\n margin: '0 0 var(--iris-space-xxs, 4px) 0',\n fontSize: 'var(--iris-font-size-2xl, 20px)',\n fontWeight: '700',\n },\n },\n props.title,\n ),\n props.description\n ? h(\n 'p',\n {\n style: {\n margin: '0',\n color: 'var(--iris-muted)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n },\n },\n props.description,\n )\n : null,\n ]),\n props.error ? h(IrisAlert, { tone: 'danger', title: props.error }) : null,\n h(IrisFormField, { label: 'Email', required: true }, () =>\n h(IrisInput, {\n type: 'email',\n modelValue: email.value,\n 'onUpdate:modelValue': (v: string) => (email.value = v),\n placeholder: 'you@example.com',\n disabled: props.loading,\n autocomplete: 'email',\n } as Record<string, unknown>),\n ),\n h(IrisFormField, { label: 'Password', required: true }, () =>\n h(IrisPasswordInput, {\n modelValue: password.value,\n 'onUpdate:modelValue': (v: string) => (password.value = v),\n placeholder: 'Enter your password',\n disabled: props.loading,\n autocomplete: 'current-password',\n } as Record<string, unknown>),\n ),\n props.showRemember\n ? h(\n 'div',\n {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n },\n [\n h(\n IrisCheckbox,\n {\n modelValue: remember.value,\n 'onUpdate:modelValue': (v: boolean | 'indeterminate') => {\n remember.value = v === true\n },\n disabled: props.loading,\n } as Record<string, unknown>,\n () => 'Remember me',\n ),\n slots.forgot ? slots.forgot() : null,\n ],\n )\n : null,\n h(\n IrisButton,\n {\n type: 'submit',\n variant: 'solid',\n loading: props.loading,\n style: { width: '100%' },\n } as Record<string, unknown>,\n () => props.submitLabel,\n ),\n slots.footer\n ? h('div', null, [h(IrisDivider, { spacing: 'md', label: 'or' }), slots.footer()])\n : null,\n ]),\n ],\n ),\n ]),\n )\n },\n})\n","import { computed, defineComponent, h, ref, watch, type PropType } from 'vue'\nimport { IrisSidebarLayout } from '../layouts/SidebarLayout'\nimport { IrisHeaderLayout } from '../layouts/HeaderLayout'\nimport { IrisDashboardGrid, IrisDashboardCard } from '../layouts/DashboardGrid'\nimport { IrisStack } from '../layouts/Stack'\n\nexport interface IrisDashboardNavItem {\n id: string\n label: string\n /** Optional icon (any ReactNode-like; ignored if `slots.icon` is used). */\n icon?: string\n}\n\nexport interface IrisDashboardCardSpec {\n id: string\n title: string\n colSpan?: number | 'full'\n rowSpan?: number\n /** Plain text or HTML — replace via `#card.<id>` slot for full control. */\n body?: string\n}\n\n/**\n * Layer 4 system skeleton: a 3-region dashboard shell — sidebar + header +\n * main grid. Built from `IrisSidebarLayout` + `IrisHeaderLayout` +\n * `IrisDashboardGrid` so it inherits collapsing, sticky header, and responsive\n * column layout out of the box.\n */\nexport const IrisDashboardTemplate = defineComponent({\n name: 'IrisDashboardTemplate',\n inheritAttrs: false,\n props: {\n title: { type: String, default: 'Dashboard' },\n sidebarTitle: { type: String, default: '' },\n nav: { type: Array as PropType<IrisDashboardNavItem[]>, default: () => [] },\n /** Currently active nav item id. */\n activeId: { type: String, default: '' },\n /** Cards to render in the main grid. Skip to use the `default` slot only. */\n cards: { type: Array as PropType<IrisDashboardCardSpec[]>, default: () => [] },\n defaultCollapsed: { type: Boolean, default: false },\n /**\n * Controlled collapsed state. When unset (`undefined`), the component\n * manages its own state seeded from `defaultCollapsed`; when set, this\n * value takes precedence and changes are re-emitted via\n * `update:collapsed` (`v-model:collapsed`).\n */\n collapsed: { type: Boolean, default: undefined },\n },\n emits: {\n 'update:activeId': (_id: string) => true,\n 'update:collapsed': (_value: boolean) => true,\n },\n setup(props, { attrs, slots, emit }) {\n const isControlled = computed(() => props.collapsed !== undefined)\n const internalCollapsed = ref(props.defaultCollapsed)\n const collapsed = computed(() =>\n isControlled.value ? Boolean(props.collapsed) : internalCollapsed.value,\n )\n\n // Sync controlled prop changes into internal state on first run so a later\n // detach to uncontrolled mode preserves the last-known value (mirrors\n // IrisSidebarLayout). `immediate` fires the watcher on mount; the\n // `value !== undefined` guard keeps the first run a no-op for\n // pure-uncontrolled mounts so `defaultCollapsed` stays untouched.\n watch(\n () => props.collapsed,\n (value) => {\n if (value !== undefined) internalCollapsed.value = value\n },\n { immediate: true },\n )\n\n const onSelectNav = (id: string) => {\n emit('update:activeId', id)\n }\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-iris-dashboard-template': '',\n style: {\n width: '100%',\n height: '100vh',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n h(\n IrisSidebarLayout,\n {\n collapsed: collapsed.value,\n 'onUpdate:collapsed': (v: boolean) => {\n if (!isControlled.value) internalCollapsed.value = v\n emit('update:collapsed', v)\n },\n width: 240,\n collapsedWidth: 64,\n } as Record<string, unknown>,\n {\n sidebar: (state: { collapsed: boolean; setCollapsed: (v: boolean) => void }) =>\n h(IrisStack, { spacing: 'sm', style: { padding: '12px' } }, () => [\n slots['sidebar-header']\n ? slots['sidebar-header'](state)\n : props.sidebarTitle\n ? h(\n 'div',\n {\n style: {\n padding: 'var(--iris-space-xs, 8px) var(--iris-space-sm, 12px)',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: '600',\n color: 'var(--iris-foreground)',\n opacity: state.collapsed ? 0 : 1,\n transition: 'opacity 120ms ease',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n },\n },\n props.sidebarTitle,\n )\n : null,\n h(\n 'nav',\n {\n 'aria-label': 'Primary',\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--iris-space-xxs, 4px)',\n },\n },\n props.nav.map((item) => {\n const isActive = item.id === props.activeId\n return h(\n 'button',\n {\n key: item.id,\n type: 'button',\n 'data-iris-dashboard-nav-item': item.id,\n 'data-iris-dashboard-nav-active': isActive ? 'true' : undefined,\n onClick: () => onSelectNav(item.id),\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--iris-space-sm, 12px)',\n padding: 'var(--iris-space-xs, 8px) var(--iris-space-sm, 12px)',\n background: isActive ? 'var(--iris-primary)' : 'transparent',\n color: isActive\n ? 'var(--iris-primary-foreground, #fff)'\n : 'var(--iris-foreground)',\n border: 'none',\n borderRadius: 'var(--iris-radius-sm, 4px)',\n cursor: 'pointer',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontFamily: 'inherit',\n textAlign: 'start',\n outline: 'none',\n },\n },\n [\n item.icon\n ? h(\n 'span',\n {\n 'aria-hidden': 'true',\n style: {\n width: '16px',\n display: 'inline-flex',\n justifyContent: 'center',\n },\n },\n item.icon,\n )\n : null,\n h(\n 'span',\n {\n style: {\n opacity: state.collapsed ? 0 : 1,\n transition: 'opacity 120ms ease',\n whiteSpace: 'nowrap',\n },\n },\n item.label,\n ),\n ],\n )\n }),\n ),\n ]),\n default: () =>\n h(IrisHeaderLayout, {} as Record<string, unknown>, {\n header: () =>\n slots.header\n ? slots.header()\n : h(\n 'div',\n {\n style: {\n padding: 'var(--iris-space-sm, 12px) var(--iris-space-lg, 20px)',\n fontSize: 'var(--iris-font-size-lg, 16px)',\n fontWeight: '600',\n },\n },\n props.title,\n ),\n default: () =>\n slots.default\n ? slots.default()\n : h(\n 'div',\n { style: { padding: '20px' } },\n h(IrisDashboardGrid, { columns: 12, gap: 16 }, () =>\n props.cards.map((card) =>\n h(\n IrisDashboardCard,\n {\n key: card.id,\n colSpan: card.colSpan ?? 4,\n rowSpan: card.rowSpan ?? 1,\n 'data-iris-dashboard-card-id': card.id,\n } as Record<string, unknown>,\n () => [\n h(\n 'h3',\n {\n style: {\n margin: '0 0 var(--iris-space-xs, 8px) 0',\n fontSize: 'var(--iris-font-size-md, 14px)',\n fontWeight: '600',\n color: 'var(--iris-foreground)',\n },\n },\n card.title,\n ),\n slots[`card.${card.id}`]\n ? slots[`card.${card.id}`]!()\n : card.body\n ? h(\n 'div',\n {\n style: {\n fontSize: 'var(--iris-font-size-sm, 13px)',\n color: 'var(--iris-muted)',\n },\n },\n card.body,\n )\n : null,\n ],\n ),\n ),\n ),\n ),\n }),\n },\n ),\n )\n },\n})\n"]}
@@ -22,6 +22,7 @@ function useGroupedView(config) {
22
22
  });
23
23
  return {
24
24
  store: controller.store,
25
+ expansion: controller.expansion,
25
26
  setRows: (rows, columns) => controller.setRows(rows, columns),
26
27
  toggleGroup: (key) => controller.toggleGroup(key),
27
28
  expandGroup: (key) => controller.expandGroup(key),
@@ -34,5 +35,5 @@ function useGroupedView(config) {
34
35
  }
35
36
 
36
37
  export { useDataSource, useGroupedView };
37
- //# sourceMappingURL=chunk-DNRQVM3Q.js.map
38
- //# sourceMappingURL=chunk-DNRQVM3Q.js.map
38
+ //# sourceMappingURL=chunk-QBFYIDY7.js.map
39
+ //# sourceMappingURL=chunk-QBFYIDY7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/useDataSource.ts","../src/data/useGroupedView.ts"],"names":[],"mappings":";;;;;AAkCO,SAAS,cAAiB,MAAA,EAA+C;AAC9E,EAAA,MAAM,aAAa,gBAAA,CAAiB,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,KAAA;AAEvC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,SAAA,CAAU,MAAM,KAAK,UAAA,CAAW,IAAA,EAAM,CAAA;AAAA,EACxC;AAGA,EAAA,cAAA,CAAe,MAAM,UAAA,CAAW,OAAA,EAAS,CAAA;AAEzC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AACvC,EAAA,OAAO,EAAE,GAAG,UAAA,EAAY,KAAA,EAAM;AAChC;ACjBO,SAAS,eACd,MAAA,EACwB;AACxB,EAAA,MAAM,UAAA,GAAa,kBAA0B,MAAM,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAM;AAC3B,IAAA,MAAM,IAAI,QAAA,CAAS,KAAA;AACnB,IAAA,OAAO,CAAA,CAAE,KAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAO,UAAA,CAAW,KAAA;AAAA,IAClB,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,SAAS,CAAC,IAAA,EAAM,YAAY,UAAA,CAAW,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,IAC5D,WAAA,EAAa,CAAC,GAAA,KAAQ,UAAA,CAAW,YAAY,GAAG,CAAA;AAAA,IAChD,WAAA,EAAa,CAAC,GAAA,KAAQ,UAAA,CAAW,YAAY,GAAG,CAAA;AAAA,IAChD,aAAA,EAAe,CAAC,GAAA,KAAQ,UAAA,CAAW,cAAc,GAAG,CAAA;AAAA,IACpD,SAAA,EAAW,MAAM,UAAA,CAAW,SAAA,EAAU;AAAA,IACtC,WAAA,EAAa,MAAM,UAAA,CAAW,WAAA,EAAY;AAAA,IAC1C,KAAA;AAAA,IACA,SAAA,EAAW,CAAC,OAAA,KAAY,UAAA,CAAW,UAAU,OAAO;AAAA,GACtD;AACF","file":"chunk-QBFYIDY7.js","sourcesContent":["import { onMounted, onScopeDispose, type ShallowRef } from 'vue'\nimport {\n createDataSource,\n type DataSourceController,\n type DataSourceConfig,\n type DataSourceState,\n} from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseDataSource<T> extends DataSourceController<T> {\n /**\n * The live data-source state as a reactive ref: rows, total, page/pageSize,\n * sort/multiSort, filters/filterRules, loading/loadingMore, hasMore,\n * selectedKeys, and the per-row pendingRows/rowErrors.\n */\n state: ShallowRef<DataSourceState<T>>\n}\n\n/**\n * Vue bridge over the framework-agnostic {@link createDataSource} — the unified\n * data engine (paged/infinite + multi-sort + typed filters + selection +\n * per-row + optimistic mutate). Creates the controller once in `setup()`,\n * mirrors its store into a reactive ref, and returns the controller plus its\n * live `state`. A thin bridge — all logic lives in `@iris-ui-kit/core`.\n *\n * Constructed with `immediate: false` so no fetch fires during `setup()`\n * (SSR-safe: server rendering never runs `onMounted`); the initial load is\n * kicked from `onMounted` when the caller's config says `immediate !== false`.\n * The `onMounted` registration is conditional on that flag — inside a bare\n * `effectScope` there is no component instance and Vue would warn on an\n * unconditional registration. The controller is torn down on scope dispose\n * (aborting any in-flight fetch), so a late response never writes back to a\n * torn-down instance.\n */\nexport function useDataSource<T>(config: DataSourceConfig<T>): UseDataSource<T> {\n const controller = createDataSource({ ...config, immediate: false })\n const immediate = config.immediate !== false\n\n if (immediate) {\n onMounted(() => void controller.load())\n }\n // Abort any in-flight fetch + detach the controller's internal subscriptions\n // on unmount (a late response must not write back to a torn-down instance).\n onScopeDispose(() => controller.destroy())\n\n const state = useStore(controller.store)\n return { ...controller, state }\n}\n","import { computed, type ComputedRef } from 'vue'\nimport {\n createGroupedView,\n type GroupedViewConfig,\n type GroupedViewState,\n type GroupedViewStore,\n} from '@iris-ui-kit/core'\nimport type { DataViewColumn } from '@iris-ui-kit/core'\nimport { useStore } from '../useStore'\n\nexport interface UseGroupedView<Row, K extends string | number = string> {\n store: ReturnType<typeof createGroupedView<Row, K>>['store']\n /** The composed expansion model (multiple-open) — bridge it like a Vue Table: `useStore(expansion.store)`. */\n expansion: ReturnType<typeof createGroupedView<Row, K>>['expansion']\n setRows: (rows: readonly Row[], columns?: readonly DataViewColumn<Row>[]) => void\n toggleGroup: (key: K) => void\n expandGroup: (key: K) => void\n collapseGroup: (key: K) => void\n expandAll: () => void\n collapseAll: () => void\n /** Reactive live grouped-view state. */\n state: ComputedRef<GroupedViewState<Row, K>>\n setConfig: (partial: Partial<GroupedViewConfig<Row, K>>) => void\n}\n\n/**\n * Vue bridge over the framework-agnostic {@link createGroupedView}.\n * Creates the controller once, subscribes its store to a reactive ref,\n * and returns the controller plus a computed `state`.\n */\nexport function useGroupedView<Row, K extends string | number = string>(\n config: GroupedViewConfig<Row, K>,\n): UseGroupedView<Row, K> {\n const controller = createGroupedView<Row, K>(config)\n const storeRef = useStore(controller.store)\n const state = computed(() => {\n const s = storeRef.value as GroupedViewStore<Row, K>\n return s.state\n })\n\n return {\n store: controller.store,\n expansion: controller.expansion,\n setRows: (rows, columns) => controller.setRows(rows, columns),\n toggleGroup: (key) => controller.toggleGroup(key),\n expandGroup: (key) => controller.expandGroup(key),\n collapseGroup: (key) => controller.collapseGroup(key),\n expandAll: () => controller.expandAll(),\n collapseAll: () => controller.collapseAll(),\n state,\n setConfig: (partial) => controller.setConfig(partial),\n }\n}\n"]}
package/dist/data.cjs CHANGED
@@ -30,6 +30,7 @@ function useGroupedView(config) {
30
30
  });
31
31
  return {
32
32
  store: controller.store,
33
+ expansion: controller.expansion,
33
34
  setRows: (rows, columns) => controller.setRows(rows, columns),
34
35
  toggleGroup: (key) => controller.toggleGroup(key),
35
36
  expandGroup: (key) => controller.expandGroup(key),