@misael703/ui 1.24.0 → 1.25.1

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 (203) hide show
  1. package/dist/{chunk-CGOUG3W5.mjs → chunk-24TLFBBQ.mjs} +3 -3
  2. package/dist/{chunk-CGOUG3W5.mjs.map → chunk-24TLFBBQ.mjs.map} +1 -1
  3. package/dist/{chunk-X2DBGT7M.mjs → chunk-2LHXOVX2.mjs} +3 -3
  4. package/dist/{chunk-X2DBGT7M.mjs.map → chunk-2LHXOVX2.mjs.map} +1 -1
  5. package/dist/{chunk-IZELILHK.js → chunk-2T5KZJGY.js} +5 -5
  6. package/dist/{chunk-IZELILHK.js.map → chunk-2T5KZJGY.js.map} +1 -1
  7. package/dist/{chunk-PKCLA2FD.mjs → chunk-2X66MNCR.mjs} +4 -4
  8. package/dist/{chunk-PKCLA2FD.mjs.map → chunk-2X66MNCR.mjs.map} +1 -1
  9. package/dist/{chunk-RQOTH7I7.js → chunk-3HA3VO2I.js} +40 -2
  10. package/dist/chunk-3HA3VO2I.js.map +1 -0
  11. package/dist/{chunk-56NJXIH7.js → chunk-3OT3FROI.js} +6 -6
  12. package/dist/{chunk-56NJXIH7.js.map → chunk-3OT3FROI.js.map} +1 -1
  13. package/dist/{chunk-JUSOPJZW.mjs → chunk-3U6C2BFM.mjs} +3 -3
  14. package/dist/{chunk-JUSOPJZW.mjs.map → chunk-3U6C2BFM.mjs.map} +1 -1
  15. package/dist/{chunk-55TOQMS2.js → chunk-4CPGEYY3.js} +5 -5
  16. package/dist/{chunk-55TOQMS2.js.map → chunk-4CPGEYY3.js.map} +1 -1
  17. package/dist/{chunk-B4I6BMNS.mjs → chunk-4N2PCBGA.mjs} +9 -6
  18. package/dist/chunk-4N2PCBGA.mjs.map +1 -0
  19. package/dist/{chunk-LYM2VPFL.js → chunk-4RHJW6JI.js} +4 -4
  20. package/dist/{chunk-LYM2VPFL.js.map → chunk-4RHJW6JI.js.map} +1 -1
  21. package/dist/{chunk-PRECODB3.js → chunk-5LSPN6Q6.js} +8 -5
  22. package/dist/chunk-5LSPN6Q6.js.map +1 -0
  23. package/dist/{chunk-LVLJ75ND.mjs → chunk-5OMB6FC5.mjs} +3 -3
  24. package/dist/{chunk-LVLJ75ND.mjs.map → chunk-5OMB6FC5.mjs.map} +1 -1
  25. package/dist/{chunk-PRML6VEF.mjs → chunk-5XT2LX3I.mjs} +10 -3
  26. package/dist/chunk-5XT2LX3I.mjs.map +1 -0
  27. package/dist/{chunk-S4YPRJQQ.js → chunk-6BRRRENF.js} +5 -5
  28. package/dist/{chunk-S4YPRJQQ.js.map → chunk-6BRRRENF.js.map} +1 -1
  29. package/dist/{chunk-RHPXE3E7.js → chunk-6DMU73SO.js} +10 -10
  30. package/dist/{chunk-RHPXE3E7.js.map → chunk-6DMU73SO.js.map} +1 -1
  31. package/dist/{chunk-IZ3FMCZ5.js → chunk-6HNR25ID.js} +4 -4
  32. package/dist/{chunk-IZ3FMCZ5.js.map → chunk-6HNR25ID.js.map} +1 -1
  33. package/dist/{chunk-HYUINOPJ.js → chunk-74ALPTUE.js} +4 -4
  34. package/dist/{chunk-HYUINOPJ.js.map → chunk-74ALPTUE.js.map} +1 -1
  35. package/dist/{chunk-RBJRQ44B.mjs → chunk-7IPB5A75.mjs} +3 -3
  36. package/dist/{chunk-RBJRQ44B.mjs.map → chunk-7IPB5A75.mjs.map} +1 -1
  37. package/dist/{chunk-VCBVLG3Q.js → chunk-A6DHNAM7.js} +4 -4
  38. package/dist/{chunk-VCBVLG3Q.js.map → chunk-A6DHNAM7.js.map} +1 -1
  39. package/dist/{chunk-2BPYXHGW.mjs → chunk-ADF5YEMJ.mjs} +3 -3
  40. package/dist/{chunk-2BPYXHGW.mjs.map → chunk-ADF5YEMJ.mjs.map} +1 -1
  41. package/dist/{chunk-EJ263Y5X.mjs → chunk-ARGGKLQD.mjs} +3 -3
  42. package/dist/{chunk-EJ263Y5X.mjs.map → chunk-ARGGKLQD.mjs.map} +1 -1
  43. package/dist/{chunk-ADQM725E.js → chunk-AS4NTE2Q.js} +5 -5
  44. package/dist/{chunk-ADQM725E.js.map → chunk-AS4NTE2Q.js.map} +1 -1
  45. package/dist/{chunk-VFZ2X655.mjs → chunk-AZTZAY2S.mjs} +4 -4
  46. package/dist/{chunk-VFZ2X655.mjs.map → chunk-AZTZAY2S.mjs.map} +1 -1
  47. package/dist/{chunk-OJNEGJ3P.mjs → chunk-B4BPE3LC.mjs} +4 -4
  48. package/dist/{chunk-OJNEGJ3P.mjs.map → chunk-B4BPE3LC.mjs.map} +1 -1
  49. package/dist/{chunk-FA6526ME.mjs → chunk-CDX256RG.mjs} +3 -3
  50. package/dist/{chunk-FA6526ME.mjs.map → chunk-CDX256RG.mjs.map} +1 -1
  51. package/dist/{chunk-7I5LFBQR.js → chunk-CRKYET66.js} +10 -3
  52. package/dist/chunk-CRKYET66.js.map +1 -0
  53. package/dist/{chunk-XLLARFVP.mjs → chunk-CUWWADL2.mjs} +4 -4
  54. package/dist/{chunk-XLLARFVP.mjs.map → chunk-CUWWADL2.mjs.map} +1 -1
  55. package/dist/{chunk-U3I4IMJI.js → chunk-CXYZK3TK.js} +6 -6
  56. package/dist/{chunk-U3I4IMJI.js.map → chunk-CXYZK3TK.js.map} +1 -1
  57. package/dist/{chunk-5QQ6BTD5.mjs → chunk-D4K255ZA.mjs} +5 -5
  58. package/dist/{chunk-5QQ6BTD5.mjs.map → chunk-D4K255ZA.mjs.map} +1 -1
  59. package/dist/{chunk-VDBGWTIG.js → chunk-DMMZWL7W.js} +4 -4
  60. package/dist/{chunk-VDBGWTIG.js.map → chunk-DMMZWL7W.js.map} +1 -1
  61. package/dist/{chunk-R6XMFBVH.mjs → chunk-EB4TS7VJ.mjs} +3 -3
  62. package/dist/{chunk-R6XMFBVH.mjs.map → chunk-EB4TS7VJ.mjs.map} +1 -1
  63. package/dist/{chunk-XCZVZVYJ.js → chunk-EFEEQBS3.js} +8 -8
  64. package/dist/{chunk-XCZVZVYJ.js.map → chunk-EFEEQBS3.js.map} +1 -1
  65. package/dist/{chunk-QZACPKQ4.js → chunk-F3O6JAL3.js} +4 -4
  66. package/dist/{chunk-QZACPKQ4.js.map → chunk-F3O6JAL3.js.map} +1 -1
  67. package/dist/{chunk-JYHY3UWA.js → chunk-H7HFKEUI.js} +8 -8
  68. package/dist/{chunk-JYHY3UWA.js.map → chunk-H7HFKEUI.js.map} +1 -1
  69. package/dist/{chunk-L353APIO.js → chunk-HEI6PUMK.js} +4 -4
  70. package/dist/{chunk-L353APIO.js.map → chunk-HEI6PUMK.js.map} +1 -1
  71. package/dist/{chunk-L4JQRY4U.mjs → chunk-I3ADS32J.mjs} +4 -4
  72. package/dist/{chunk-L4JQRY4U.mjs.map → chunk-I3ADS32J.mjs.map} +1 -1
  73. package/dist/{chunk-BCE5WXM6.mjs → chunk-JO5WBKF2.mjs} +5 -5
  74. package/dist/{chunk-BCE5WXM6.mjs.map → chunk-JO5WBKF2.mjs.map} +1 -1
  75. package/dist/{chunk-O72DMPH6.js → chunk-KS7CSKO6.js} +9 -9
  76. package/dist/{chunk-O72DMPH6.js.map → chunk-KS7CSKO6.js.map} +1 -1
  77. package/dist/{chunk-4SEJTTTV.mjs → chunk-LJG3AH7G.mjs} +3 -3
  78. package/dist/{chunk-4SEJTTTV.mjs.map → chunk-LJG3AH7G.mjs.map} +1 -1
  79. package/dist/{chunk-55ITZTLL.js → chunk-LJSNE6YQ.js} +8 -8
  80. package/dist/{chunk-55ITZTLL.js.map → chunk-LJSNE6YQ.js.map} +1 -1
  81. package/dist/{chunk-MJ6UOTWQ.js → chunk-M3RO3GSC.js} +12 -12
  82. package/dist/{chunk-MJ6UOTWQ.js.map → chunk-M3RO3GSC.js.map} +1 -1
  83. package/dist/{chunk-2I7NE7QR.mjs → chunk-MSEDQM7C.mjs} +3 -3
  84. package/dist/{chunk-2I7NE7QR.mjs.map → chunk-MSEDQM7C.mjs.map} +1 -1
  85. package/dist/{chunk-XW7DOPY4.mjs → chunk-MVY4UEFB.mjs} +3 -3
  86. package/dist/{chunk-XW7DOPY4.mjs.map → chunk-MVY4UEFB.mjs.map} +1 -1
  87. package/dist/{chunk-L4ITC2U6.mjs → chunk-NCXODB4O.mjs} +4 -4
  88. package/dist/{chunk-L4ITC2U6.mjs.map → chunk-NCXODB4O.mjs.map} +1 -1
  89. package/dist/{chunk-FGNHN34U.js → chunk-NDMMQZZZ.js} +12 -12
  90. package/dist/{chunk-FGNHN34U.js.map → chunk-NDMMQZZZ.js.map} +1 -1
  91. package/dist/{chunk-MOHWK6FH.js → chunk-OEFOGREP.js} +14 -14
  92. package/dist/{chunk-MOHWK6FH.js.map → chunk-OEFOGREP.js.map} +1 -1
  93. package/dist/{chunk-FS42XEU7.js → chunk-PPU5WKZS.js} +6 -6
  94. package/dist/{chunk-FS42XEU7.js.map → chunk-PPU5WKZS.js.map} +1 -1
  95. package/dist/{chunk-HRDLEOYO.mjs → chunk-PVSP7Y2F.mjs} +4 -4
  96. package/dist/{chunk-HRDLEOYO.mjs.map → chunk-PVSP7Y2F.mjs.map} +1 -1
  97. package/dist/{chunk-BSAHYKPF.js → chunk-Q3DKZR44.js} +5 -5
  98. package/dist/{chunk-BSAHYKPF.js.map → chunk-Q3DKZR44.js.map} +1 -1
  99. package/dist/{chunk-5A3MAGA3.mjs → chunk-QAOFEIG4.mjs} +4 -4
  100. package/dist/{chunk-5A3MAGA3.mjs.map → chunk-QAOFEIG4.mjs.map} +1 -1
  101. package/dist/{chunk-QM7BCSCL.mjs → chunk-RDX3D3P5.mjs} +3 -3
  102. package/dist/{chunk-QM7BCSCL.mjs.map → chunk-RDX3D3P5.mjs.map} +1 -1
  103. package/dist/{chunk-HAZDZYF4.mjs → chunk-SHS4QYYN.mjs} +3 -3
  104. package/dist/{chunk-HAZDZYF4.mjs.map → chunk-SHS4QYYN.mjs.map} +1 -1
  105. package/dist/{chunk-YSU3WFND.mjs → chunk-STZ7YDMR.mjs} +3 -3
  106. package/dist/{chunk-YSU3WFND.mjs.map → chunk-STZ7YDMR.mjs.map} +1 -1
  107. package/dist/{chunk-RCXLCU5A.js → chunk-TCFO7YBF.js} +6 -6
  108. package/dist/{chunk-RCXLCU5A.js.map → chunk-TCFO7YBF.js.map} +1 -1
  109. package/dist/{chunk-4QXDOJ7A.js → chunk-TD732KXM.js} +5 -5
  110. package/dist/{chunk-4QXDOJ7A.js.map → chunk-TD732KXM.js.map} +1 -1
  111. package/dist/{chunk-GVYZAOWU.mjs → chunk-TS3WC3G4.mjs} +3 -3
  112. package/dist/{chunk-GVYZAOWU.mjs.map → chunk-TS3WC3G4.mjs.map} +1 -1
  113. package/dist/{chunk-IKGW7HHG.js → chunk-VAAB5DXM.js} +9 -9
  114. package/dist/{chunk-IKGW7HHG.js.map → chunk-VAAB5DXM.js.map} +1 -1
  115. package/dist/{chunk-CIBJKJV3.mjs → chunk-VHYTJD6Z.mjs} +36 -3
  116. package/dist/chunk-VHYTJD6Z.mjs.map +1 -0
  117. package/dist/{chunk-JT2SFHBH.js → chunk-WGEEYXVZ.js} +4 -4
  118. package/dist/{chunk-JT2SFHBH.js.map → chunk-WGEEYXVZ.js.map} +1 -1
  119. package/dist/{chunk-IOBAPH6I.mjs → chunk-Y6EGYS4L.mjs} +3 -3
  120. package/dist/{chunk-IOBAPH6I.mjs.map → chunk-Y6EGYS4L.mjs.map} +1 -1
  121. package/dist/{chunk-GKSUYHGO.js → chunk-YLISYQNI.js} +4 -4
  122. package/dist/{chunk-GKSUYHGO.js.map → chunk-YLISYQNI.js.map} +1 -1
  123. package/dist/{chunk-ORUQ5GCU.mjs → chunk-ZA2AXUIB.mjs} +3 -3
  124. package/dist/{chunk-ORUQ5GCU.mjs.map → chunk-ZA2AXUIB.mjs.map} +1 -1
  125. package/dist/components/AdvancedPickers.js +7 -7
  126. package/dist/components/AdvancedPickers.mjs +3 -3
  127. package/dist/components/AppShell.js +4 -4
  128. package/dist/components/AppShell.mjs +2 -2
  129. package/dist/components/Carousel.js +3 -3
  130. package/dist/components/Carousel.mjs +2 -2
  131. package/dist/components/Code.js +4 -4
  132. package/dist/components/Code.mjs +2 -2
  133. package/dist/components/Comments.js +7 -7
  134. package/dist/components/Comments.mjs +4 -4
  135. package/dist/components/Commerce.js +14 -14
  136. package/dist/components/Commerce.mjs +3 -3
  137. package/dist/components/ContextMenu.js +3 -3
  138. package/dist/components/ContextMenu.mjs +2 -2
  139. package/dist/components/DataTable.js +10 -10
  140. package/dist/components/DataTable.mjs +4 -4
  141. package/dist/components/Display.js +13 -13
  142. package/dist/components/Display.mjs +2 -2
  143. package/dist/components/Display2.js +7 -7
  144. package/dist/components/Display2.mjs +3 -3
  145. package/dist/components/Display3.js +10 -10
  146. package/dist/components/Display3.mjs +4 -4
  147. package/dist/components/Editing.js +9 -9
  148. package/dist/components/Editing.mjs +4 -4
  149. package/dist/components/Filters.js +8 -8
  150. package/dist/components/Filters.mjs +2 -2
  151. package/dist/components/Form.js +12 -12
  152. package/dist/components/Form.mjs +2 -2
  153. package/dist/components/Gallery.js +4 -4
  154. package/dist/components/Gallery.mjs +2 -2
  155. package/dist/components/HoverCard.js +3 -3
  156. package/dist/components/HoverCard.mjs +2 -2
  157. package/dist/components/Icons.d.mts +6 -1
  158. package/dist/components/Icons.d.ts +6 -1
  159. package/dist/components/Icons.js +87 -67
  160. package/dist/components/Icons.mjs +1 -1
  161. package/dist/components/Inputs.js +6 -6
  162. package/dist/components/Inputs.mjs +2 -2
  163. package/dist/components/InputsExtra.js +11 -11
  164. package/dist/components/InputsExtra.mjs +2 -2
  165. package/dist/components/Layout.js +22 -22
  166. package/dist/components/Layout.mjs +3 -3
  167. package/dist/components/Marketing.js +5 -5
  168. package/dist/components/Marketing.mjs +2 -2
  169. package/dist/components/Menubar.js +3 -3
  170. package/dist/components/Menubar.mjs +2 -2
  171. package/dist/components/NavigationMenu.js +4 -4
  172. package/dist/components/NavigationMenu.mjs +3 -3
  173. package/dist/components/Notifications.js +3 -3
  174. package/dist/components/Notifications.mjs +2 -2
  175. package/dist/components/Overlay.js +4 -4
  176. package/dist/components/Overlay.mjs +2 -2
  177. package/dist/components/Permissions.js +4 -4
  178. package/dist/components/Permissions.mjs +3 -3
  179. package/dist/components/Pickers.js +8 -8
  180. package/dist/components/Pickers.mjs +3 -3
  181. package/dist/components/Popover.js +3 -3
  182. package/dist/components/Popover.mjs +2 -2
  183. package/dist/components/Toast.js +4 -4
  184. package/dist/components/Toast.mjs +2 -2
  185. package/dist/components/Toggle.d.mts +8 -0
  186. package/dist/components/Toggle.d.ts +8 -0
  187. package/dist/components/Toggle.js +6 -6
  188. package/dist/components/Toggle.mjs +1 -1
  189. package/dist/hooks/index.js +2 -2
  190. package/dist/hooks/index.mjs +1 -1
  191. package/dist/hooks/usePopoverPosition.js +2 -2
  192. package/dist/hooks/usePopoverPosition.mjs +1 -1
  193. package/dist/index.d.mts +1 -1
  194. package/dist/index.d.ts +1 -1
  195. package/dist/index.js +247 -227
  196. package/dist/index.mjs +31 -31
  197. package/package.json +1 -1
  198. package/dist/chunk-7I5LFBQR.js.map +0 -1
  199. package/dist/chunk-B4I6BMNS.mjs.map +0 -1
  200. package/dist/chunk-CIBJKJV3.mjs.map +0 -1
  201. package/dist/chunk-PRECODB3.js.map +0 -1
  202. package/dist/chunk-PRML6VEF.mjs.map +0 -1
  203. package/dist/chunk-RQOTH7I7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/InputsExtra.tsx"],"names":["React","Slider","cx","jsx","jsxs","useLocale","format","X","MoneyInput","getBrand"],"mappings":"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","file":"chunk-LYM2VPFL.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { X } from './Icons';\nimport { getBrand } from '../brand';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- Slider ------------------------------------------------------\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n showValue?: boolean;\n formatValue?: (v: number) => string;\n}\n\nexport const Slider = React.forwardRef<HTMLInputElement, SliderProps>(function Slider(\n { value, onChange, min = 0, max = 100, step = 1, showValue, formatValue, className, ...rest },\n ref\n) {\n const pct = ((value - min) / (max - min)) * 100;\n return (\n <div className={cx('slider', className)}>\n <input\n ref={ref}\n type=\"range\"\n className=\"slider__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{ '--pct': `${pct}%` } as React.CSSProperties}\n {...rest}\n />\n {showValue && (\n <span className=\"slider__value\">{formatValue ? formatValue(value) : value}</span>\n )}\n </div>\n );\n});\n\n// ---------- Progress (linear + circular) --------------------------------\nexport interface ProgressProps {\n value: number; // 0–100\n variant?: 'blue' | 'orange' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport function Progress({ value, variant = 'blue', showLabel, size = 'md', className }: ProgressProps) {\n const v = Math.max(0, Math.min(100, value));\n return (\n <div className={cx('progress', size === 'sm' && 'progress--sm', className)}>\n <div className={cx('progress__bar', `progress__bar--${variant}`)} style={{ width: `${v}%` }} role=\"progressbar\" aria-valuenow={v} aria-valuemin={0} aria-valuemax={100} />\n {showLabel && <span className=\"progress__label\">{Math.round(v)}%</span>}\n </div>\n );\n}\n\nexport interface ProgressCircleProps {\n value: number;\n size?: number;\n stroke?: number;\n variant?: 'blue' | 'orange' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n className?: string;\n}\n\nexport function ProgressCircle({ value, size = 64, stroke = 6, variant = 'blue', showLabel = true, className }: ProgressCircleProps) {\n const v = Math.max(0, Math.min(100, value));\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n const off = c - (v / 100) * c;\n const colorVar = {\n blue: 'var(--color-primary)',\n orange: 'var(--color-secondary)',\n success: 'var(--color-success)',\n warning: 'var(--color-warning)',\n danger: 'var(--color-danger)',\n }[variant];\n return (\n <div className={cx('progress-circle', className)} style={{ width: size, height: size }} role=\"progressbar\" aria-valuenow={v} aria-valuemin={0} aria-valuemax={100}>\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <circle cx={size/2} cy={size/2} r={r} stroke=\"var(--bg-subtle)\" strokeWidth={stroke} fill=\"none\" />\n <circle\n cx={size/2} cy={size/2} r={r}\n stroke={colorVar} strokeWidth={stroke} fill=\"none\"\n strokeDasharray={c} strokeDashoffset={off} strokeLinecap=\"round\"\n style={{ transform: 'rotate(-90deg)', transformOrigin: '50% 50%', transition: 'stroke-dashoffset 320ms var(--ease-standard, ease-out)' }}\n />\n </svg>\n {showLabel && <span className=\"progress-circle__label\">{Math.round(v)}%</span>}\n </div>\n );\n}\n\n// ---------- Tag input ---------------------------------------------------\nexport interface TagInputProps {\n value: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n separator?: RegExp;\n maxTags?: number;\n validate?: (tag: string) => boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\nexport function TagInput({\n value, onChange, placeholder,\n separator = /[,\\s]+/, maxTags, validate, disabled, className, id,\n}: TagInputProps) {\n const [draft, setDraft] = React.useState('');\n const locale = useLocale();\n const ph = placeholder ?? locale['tagsInput.placeholder'];\n\n const addTags = (raw: string) => {\n const next = raw.split(separator).map((t) => t.trim()).filter(Boolean);\n if (next.length === 0) return;\n let merged = [...value];\n for (const t of next) {\n if (validate && !validate(t)) continue;\n if (merged.includes(t)) continue;\n if (maxTags && merged.length >= maxTags) break;\n merged.push(t);\n }\n onChange(merged);\n setDraft('');\n };\n\n return (\n <div className={cx('tag-input', disabled && 'is-disabled', className)} onClick={(e) => {\n const input = (e.currentTarget.querySelector('input') as HTMLInputElement);\n input?.focus();\n }}>\n {value.map((t, i) => (\n <span key={`${t}-${i}`} className=\"tag-input__tag\">\n {t}\n <button type=\"button\" aria-label={format(locale['tagsInput.remove'], { tag: t })} onClick={() => onChange(value.filter((_, idx) => idx !== i))}><X size={12} /></button>\n </span>\n ))}\n <input\n id={id}\n className=\"tag-input__field\"\n value={draft}\n disabled={disabled}\n placeholder={value.length === 0 ? ph : ''}\n onChange={(e) => {\n const v = e.target.value;\n if (separator.test(v)) addTags(v);\n else setDraft(v);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && draft.trim()) {\n e.preventDefault();\n addTags(draft);\n } else if (e.key === 'Backspace' && !draft && value.length) {\n onChange(value.slice(0, -1));\n }\n }}\n onBlur={() => draft.trim() && addTags(draft)}\n />\n </div>\n );\n}\n\n// ---------- MoneyInput (CLP-friendly, but accepts any locale) -----------\nexport interface MoneyInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {\n value: number | null;\n onChange: (v: number | null) => void;\n currency?: string; // 'CLP' | 'USD' | 'EUR' | …\n locale?: string; // 'es-CL' | …\n invalid?: boolean;\n}\n\nexport const MoneyInput = React.forwardRef<HTMLInputElement, MoneyInputProps>(function MoneyInput(\n { value, onChange, currency, locale, invalid, className, disabled, ...rest },\n ref\n) {\n const brand = getBrand();\n const resolvedCurrency = currency ?? brand.currency;\n const resolvedLocale = locale ?? brand.locale;\n const [focus, setFocus] = React.useState(false);\n const display = value == null\n ? ''\n : focus\n ? String(value)\n : new Intl.NumberFormat(resolvedLocale, { style: 'currency', currency: resolvedCurrency, maximumFractionDigits: 0 }).format(value);\n return (\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n className={cx('input', invalid && 'is-invalid', className)}\n value={display}\n disabled={disabled}\n onFocus={() => setFocus(true)}\n onBlur={() => setFocus(false)}\n onChange={(e) => {\n const cleaned = e.target.value.replace(/[^\\d-]/g, '');\n if (!cleaned || cleaned === '-') return onChange(null);\n const n = Number(cleaned);\n onChange(Number.isFinite(n) ? n : null);\n }}\n aria-invalid={invalid || undefined}\n {...rest}\n />\n );\n});\n\n// ---------- PhoneInput (CL default, prefix + digits) --------------------\nexport interface PhoneInputProps {\n value: string;\n onChange: (v: string) => void;\n prefix?: string;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n placeholder?: string;\n}\n\nexport function PhoneInput({ value, onChange, prefix, invalid, disabled, className, id, placeholder = '9 1234 5678' }: PhoneInputProps) {\n return (\n <div className={cx('phone-input', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n {prefix && <span className=\"phone-input__prefix\">{prefix}</span>}\n <input\n id={id}\n type=\"tel\"\n inputMode=\"tel\"\n placeholder={placeholder}\n className=\"phone-input__field\"\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value.replace(/[^\\d ]/g, ''))}\n aria-invalid={invalid || undefined}\n />\n </div>\n );\n}\n\n// ---------- TimePicker (HH:mm) ------------------------------------------\nexport interface TimePickerProps {\n value: string; // 'HH:mm'\n onChange: (v: string) => void;\n step?: number; // minutes\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\nexport function TimePicker({ value, onChange, step = 15, invalid, disabled, className, id }: TimePickerProps) {\n return (\n <input\n id={id}\n type=\"time\"\n step={step * 60}\n className={cx('input', invalid && 'is-invalid', className)}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n aria-invalid={invalid || undefined}\n />\n );\n}\n\n// ---------- RadioGroup / CheckboxGroup ---------------------------------\nexport interface OptionItem<T = string> { value: T; label: React.ReactNode; description?: React.ReactNode; disabled?: boolean }\n\nexport interface RadioGroupProps<T = string> {\n value: T | null;\n onChange: (v: T) => void;\n options: OptionItem<T>[];\n name: string;\n orientation?: 'vertical' | 'horizontal';\n /** Accessible name for the group (announced as \"<label>, radio group\" by screen readers). */\n label?: string;\n className?: string;\n}\n\nexport function RadioGroup<T = string>({ value, onChange, options, name, orientation = 'vertical', label, className }: RadioGroupProps<T>) {\n return (\n <div role=\"radiogroup\" aria-label={label} className={cx('option-group', `option-group--${orientation}`, className)}>\n {options.map((o) => (\n <label key={String(o.value)} className={cx('option-row', o.disabled && 'is-disabled')}>\n <input\n type=\"radio\"\n className=\"radio\"\n name={name}\n checked={o.value === value}\n disabled={o.disabled}\n onChange={() => onChange(o.value)}\n />\n <span className=\"option-row__body\">\n <span className=\"option-row__label\">{o.label}</span>\n {o.description && <span className=\"option-row__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n\nexport interface CheckboxGroupProps<T = string> {\n value: T[];\n onChange: (v: T[]) => void;\n options: OptionItem<T>[];\n orientation?: 'vertical' | 'horizontal';\n className?: string;\n}\n\nexport function CheckboxGroup<T = string>({ value, onChange, options, orientation = 'vertical', className }: CheckboxGroupProps<T>) {\n const set = new Set(value);\n return (\n <div role=\"group\" className={cx('option-group', `option-group--${orientation}`, className)}>\n {options.map((o) => (\n <label key={String(o.value)} className={cx('option-row', o.disabled && 'is-disabled')}>\n <input\n type=\"checkbox\"\n className=\"checkbox\"\n checked={set.has(o.value)}\n disabled={o.disabled}\n onChange={() => {\n if (set.has(o.value)) onChange(value.filter((v) => v !== o.value));\n else onChange([...value, o.value]);\n }}\n />\n <span className=\"option-row__body\">\n <span className=\"option-row__label\">{o.label}</span>\n {o.description && <span className=\"option-row__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/InputsExtra.tsx"],"names":["React","Slider","cx","jsx","jsxs","useLocale","format","X","MoneyInput","getBrand"],"mappings":"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","file":"chunk-4RHJW6JI.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { X } from './Icons';\nimport { getBrand } from '../brand';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\n// ---------- Slider ------------------------------------------------------\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n step?: number;\n showValue?: boolean;\n formatValue?: (v: number) => string;\n}\n\nexport const Slider = React.forwardRef<HTMLInputElement, SliderProps>(function Slider(\n { value, onChange, min = 0, max = 100, step = 1, showValue, formatValue, className, ...rest },\n ref\n) {\n const pct = ((value - min) / (max - min)) * 100;\n return (\n <div className={cx('slider', className)}>\n <input\n ref={ref}\n type=\"range\"\n className=\"slider__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{ '--pct': `${pct}%` } as React.CSSProperties}\n {...rest}\n />\n {showValue && (\n <span className=\"slider__value\">{formatValue ? formatValue(value) : value}</span>\n )}\n </div>\n );\n});\n\n// ---------- Progress (linear + circular) --------------------------------\nexport interface ProgressProps {\n value: number; // 0–100\n variant?: 'blue' | 'orange' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport function Progress({ value, variant = 'blue', showLabel, size = 'md', className }: ProgressProps) {\n const v = Math.max(0, Math.min(100, value));\n return (\n <div className={cx('progress', size === 'sm' && 'progress--sm', className)}>\n <div className={cx('progress__bar', `progress__bar--${variant}`)} style={{ width: `${v}%` }} role=\"progressbar\" aria-valuenow={v} aria-valuemin={0} aria-valuemax={100} />\n {showLabel && <span className=\"progress__label\">{Math.round(v)}%</span>}\n </div>\n );\n}\n\nexport interface ProgressCircleProps {\n value: number;\n size?: number;\n stroke?: number;\n variant?: 'blue' | 'orange' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n className?: string;\n}\n\nexport function ProgressCircle({ value, size = 64, stroke = 6, variant = 'blue', showLabel = true, className }: ProgressCircleProps) {\n const v = Math.max(0, Math.min(100, value));\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n const off = c - (v / 100) * c;\n const colorVar = {\n blue: 'var(--color-primary)',\n orange: 'var(--color-secondary)',\n success: 'var(--color-success)',\n warning: 'var(--color-warning)',\n danger: 'var(--color-danger)',\n }[variant];\n return (\n <div className={cx('progress-circle', className)} style={{ width: size, height: size }} role=\"progressbar\" aria-valuenow={v} aria-valuemin={0} aria-valuemax={100}>\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <circle cx={size/2} cy={size/2} r={r} stroke=\"var(--bg-subtle)\" strokeWidth={stroke} fill=\"none\" />\n <circle\n cx={size/2} cy={size/2} r={r}\n stroke={colorVar} strokeWidth={stroke} fill=\"none\"\n strokeDasharray={c} strokeDashoffset={off} strokeLinecap=\"round\"\n style={{ transform: 'rotate(-90deg)', transformOrigin: '50% 50%', transition: 'stroke-dashoffset 320ms var(--ease-standard, ease-out)' }}\n />\n </svg>\n {showLabel && <span className=\"progress-circle__label\">{Math.round(v)}%</span>}\n </div>\n );\n}\n\n// ---------- Tag input ---------------------------------------------------\nexport interface TagInputProps {\n value: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n separator?: RegExp;\n maxTags?: number;\n validate?: (tag: string) => boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\nexport function TagInput({\n value, onChange, placeholder,\n separator = /[,\\s]+/, maxTags, validate, disabled, className, id,\n}: TagInputProps) {\n const [draft, setDraft] = React.useState('');\n const locale = useLocale();\n const ph = placeholder ?? locale['tagsInput.placeholder'];\n\n const addTags = (raw: string) => {\n const next = raw.split(separator).map((t) => t.trim()).filter(Boolean);\n if (next.length === 0) return;\n let merged = [...value];\n for (const t of next) {\n if (validate && !validate(t)) continue;\n if (merged.includes(t)) continue;\n if (maxTags && merged.length >= maxTags) break;\n merged.push(t);\n }\n onChange(merged);\n setDraft('');\n };\n\n return (\n <div className={cx('tag-input', disabled && 'is-disabled', className)} onClick={(e) => {\n const input = (e.currentTarget.querySelector('input') as HTMLInputElement);\n input?.focus();\n }}>\n {value.map((t, i) => (\n <span key={`${t}-${i}`} className=\"tag-input__tag\">\n {t}\n <button type=\"button\" aria-label={format(locale['tagsInput.remove'], { tag: t })} onClick={() => onChange(value.filter((_, idx) => idx !== i))}><X size={12} /></button>\n </span>\n ))}\n <input\n id={id}\n className=\"tag-input__field\"\n value={draft}\n disabled={disabled}\n placeholder={value.length === 0 ? ph : ''}\n onChange={(e) => {\n const v = e.target.value;\n if (separator.test(v)) addTags(v);\n else setDraft(v);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && draft.trim()) {\n e.preventDefault();\n addTags(draft);\n } else if (e.key === 'Backspace' && !draft && value.length) {\n onChange(value.slice(0, -1));\n }\n }}\n onBlur={() => draft.trim() && addTags(draft)}\n />\n </div>\n );\n}\n\n// ---------- MoneyInput (CLP-friendly, but accepts any locale) -----------\nexport interface MoneyInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'type'> {\n value: number | null;\n onChange: (v: number | null) => void;\n currency?: string; // 'CLP' | 'USD' | 'EUR' | …\n locale?: string; // 'es-CL' | …\n invalid?: boolean;\n}\n\nexport const MoneyInput = React.forwardRef<HTMLInputElement, MoneyInputProps>(function MoneyInput(\n { value, onChange, currency, locale, invalid, className, disabled, ...rest },\n ref\n) {\n const brand = getBrand();\n const resolvedCurrency = currency ?? brand.currency;\n const resolvedLocale = locale ?? brand.locale;\n const [focus, setFocus] = React.useState(false);\n const display = value == null\n ? ''\n : focus\n ? String(value)\n : new Intl.NumberFormat(resolvedLocale, { style: 'currency', currency: resolvedCurrency, maximumFractionDigits: 0 }).format(value);\n return (\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n className={cx('input', invalid && 'is-invalid', className)}\n value={display}\n disabled={disabled}\n onFocus={() => setFocus(true)}\n onBlur={() => setFocus(false)}\n onChange={(e) => {\n const cleaned = e.target.value.replace(/[^\\d-]/g, '');\n if (!cleaned || cleaned === '-') return onChange(null);\n const n = Number(cleaned);\n onChange(Number.isFinite(n) ? n : null);\n }}\n aria-invalid={invalid || undefined}\n {...rest}\n />\n );\n});\n\n// ---------- PhoneInput (CL default, prefix + digits) --------------------\nexport interface PhoneInputProps {\n value: string;\n onChange: (v: string) => void;\n prefix?: string;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n placeholder?: string;\n}\n\nexport function PhoneInput({ value, onChange, prefix, invalid, disabled, className, id, placeholder = '9 1234 5678' }: PhoneInputProps) {\n return (\n <div className={cx('phone-input', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n {prefix && <span className=\"phone-input__prefix\">{prefix}</span>}\n <input\n id={id}\n type=\"tel\"\n inputMode=\"tel\"\n placeholder={placeholder}\n className=\"phone-input__field\"\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value.replace(/[^\\d ]/g, ''))}\n aria-invalid={invalid || undefined}\n />\n </div>\n );\n}\n\n// ---------- TimePicker (HH:mm) ------------------------------------------\nexport interface TimePickerProps {\n value: string; // 'HH:mm'\n onChange: (v: string) => void;\n step?: number; // minutes\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n}\n\nexport function TimePicker({ value, onChange, step = 15, invalid, disabled, className, id }: TimePickerProps) {\n return (\n <input\n id={id}\n type=\"time\"\n step={step * 60}\n className={cx('input', invalid && 'is-invalid', className)}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n aria-invalid={invalid || undefined}\n />\n );\n}\n\n// ---------- RadioGroup / CheckboxGroup ---------------------------------\nexport interface OptionItem<T = string> { value: T; label: React.ReactNode; description?: React.ReactNode; disabled?: boolean }\n\nexport interface RadioGroupProps<T = string> {\n value: T | null;\n onChange: (v: T) => void;\n options: OptionItem<T>[];\n name: string;\n orientation?: 'vertical' | 'horizontal';\n /** Accessible name for the group (announced as \"<label>, radio group\" by screen readers). */\n label?: string;\n className?: string;\n}\n\nexport function RadioGroup<T = string>({ value, onChange, options, name, orientation = 'vertical', label, className }: RadioGroupProps<T>) {\n return (\n <div role=\"radiogroup\" aria-label={label} className={cx('option-group', `option-group--${orientation}`, className)}>\n {options.map((o) => (\n <label key={String(o.value)} className={cx('option-row', o.disabled && 'is-disabled')}>\n <input\n type=\"radio\"\n className=\"radio\"\n name={name}\n checked={o.value === value}\n disabled={o.disabled}\n onChange={() => onChange(o.value)}\n />\n <span className=\"option-row__body\">\n <span className=\"option-row__label\">{o.label}</span>\n {o.description && <span className=\"option-row__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n\nexport interface CheckboxGroupProps<T = string> {\n value: T[];\n onChange: (v: T[]) => void;\n options: OptionItem<T>[];\n orientation?: 'vertical' | 'horizontal';\n className?: string;\n}\n\nexport function CheckboxGroup<T = string>({ value, onChange, options, orientation = 'vertical', className }: CheckboxGroupProps<T>) {\n const set = new Set(value);\n return (\n <div role=\"group\" className={cx('option-group', `option-group--${orientation}`, className)}>\n {options.map((o) => (\n <label key={String(o.value)} className={cx('option-row', o.disabled && 'is-disabled')}>\n <input\n type=\"checkbox\"\n className=\"checkbox\"\n checked={set.has(o.value)}\n disabled={o.disabled}\n onChange={() => {\n if (set.has(o.value)) onChange(value.filter((v) => v !== o.value));\n else onChange([...value, o.value]);\n }}\n />\n <span className=\"option-row__body\">\n <span className=\"option-row__label\">{o.label}</span>\n {o.description && <span className=\"option-row__desc\">{o.description}</span>}\n </span>\n </label>\n ))}\n </div>\n );\n}\n"]}
@@ -69,7 +69,7 @@ function ToggleGroup(props) {
69
69
  function SegmentedControl({ className, ...rest }) {
70
70
  return /* @__PURE__ */ jsxRuntime.jsx(ToggleGroup, { type: "single", className: chunkPASF6T4H_js.cx("toggle-group--segmented", className), ...rest });
71
71
  }
72
- var ToggleGroupItem = React__namespace.forwardRef(function ToggleGroupItem2({ value, className, children, disabled: itemDisabled, ...rest }, ref) {
72
+ var ToggleGroupItem = React__namespace.forwardRef(function ToggleGroupItem2({ value, className, children, icon, disabled: itemDisabled, ...rest }, ref) {
73
73
  const ctx = React__namespace.useContext(ToggleGroupContext);
74
74
  if (!ctx) throw new Error("ToggleGroupItem must be used inside ToggleGroup");
75
75
  const isPressed = ctx.type === "single" ? ctx.value === value : Array.isArray(ctx.value) && ctx.value.includes(value);
@@ -81,7 +81,7 @@ var ToggleGroupItem = React__namespace.forwardRef(function ToggleGroupItem2({ va
81
81
  ctx.setValue(isPressed ? arr.filter((v) => v !== value) : [...arr, value]);
82
82
  }
83
83
  };
84
- return /* @__PURE__ */ jsxRuntime.jsx(
84
+ return /* @__PURE__ */ jsxRuntime.jsxs(
85
85
  "button",
86
86
  {
87
87
  ref,
@@ -92,7 +92,10 @@ var ToggleGroupItem = React__namespace.forwardRef(function ToggleGroupItem2({ va
92
92
  className: chunkPASF6T4H_js.cx("toggle", `toggle--${ctx.size}`, `toggle--${ctx.variant}`, "toggle-group__item", isPressed && "is-pressed", className),
93
93
  onClick,
94
94
  ...rest,
95
- children
95
+ children: [
96
+ icon,
97
+ children
98
+ ]
96
99
  }
97
100
  );
98
101
  });
@@ -103,5 +106,5 @@ exports.SegmentedControlItem = SegmentedControlItem;
103
106
  exports.Toggle = Toggle;
104
107
  exports.ToggleGroup = ToggleGroup;
105
108
  exports.ToggleGroupItem = ToggleGroupItem;
106
- //# sourceMappingURL=chunk-PRECODB3.js.map
107
- //# sourceMappingURL=chunk-PRECODB3.js.map
109
+ //# sourceMappingURL=chunk-5LSPN6Q6.js.map
110
+ //# sourceMappingURL=chunk-5LSPN6Q6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Toggle.tsx"],"names":["React","Toggle","jsx","cx","ToggleGroupItem","jsxs"],"mappings":"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","file":"chunk-5LSPN6Q6.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport type ToggleSize = 'sm' | 'md' | 'lg';\nexport type ToggleVariant = 'default' | 'outline';\n\nexport interface ToggleProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n pressed?: boolean;\n defaultPressed?: boolean;\n onPressedChange?: (pressed: boolean) => void;\n size?: ToggleSize;\n variant?: ToggleVariant;\n}\n\nexport const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(function Toggle(\n { pressed, defaultPressed, onPressedChange, size = 'md', variant = 'default', className, children, onClick, ...rest },\n ref\n) {\n const [internal, setInternal] = React.useState(defaultPressed ?? false);\n const isControlled = pressed !== undefined;\n const value = isControlled ? pressed : internal;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={value}\n data-state={value ? 'on' : 'off'}\n className={cx('toggle', `toggle--${size}`, `toggle--${variant}`, value && 'is-pressed', className)}\n onClick={(e) => {\n const next = !value;\n if (!isControlled) setInternal(next);\n onPressedChange?.(next);\n onClick?.(e);\n }}\n {...rest}\n >\n {children}\n </button>\n );\n});\n\ninterface ToggleGroupContextValue {\n type: 'single' | 'multiple';\n value: string | string[];\n setValue: (next: string | string[]) => void;\n size: ToggleSize;\n variant: ToggleVariant;\n disabled: boolean;\n}\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue | null>(null);\n\ninterface ToggleGroupBaseProps {\n size?: ToggleSize;\n variant?: ToggleVariant;\n disabled?: boolean;\n className?: string;\n ariaLabel?: string;\n children: React.ReactNode;\n}\n\nexport interface ToggleGroupSingleProps extends ToggleGroupBaseProps {\n type: 'single';\n value?: string | null;\n defaultValue?: string;\n onChange?: (value: string | null) => void;\n rovingFocus?: boolean;\n}\n\nexport interface ToggleGroupMultipleProps extends ToggleGroupBaseProps {\n type: 'multiple';\n value?: string[];\n defaultValue?: string[];\n onChange?: (value: string[]) => void;\n}\n\nexport type ToggleGroupProps = ToggleGroupSingleProps | ToggleGroupMultipleProps;\n\nexport function ToggleGroup(props: ToggleGroupProps) {\n const { type, size = 'md', variant = 'default', disabled = false, className, ariaLabel, children } = props;\n\n const initial: string | string[] =\n type === 'single' ? (props.defaultValue ?? '') : (props.defaultValue ?? []);\n const [internal, setInternal] = React.useState<string | string[]>(initial);\n\n const isControlled = props.value !== undefined && props.value !== null;\n const current: string | string[] = isControlled\n ? type === 'single'\n ? (props.value ?? '')\n : (props.value ?? [])\n : internal;\n\n const setValue = (next: string | string[]) => {\n if (!isControlled) setInternal(next);\n if (type === 'single') {\n const v = (next as string) || null;\n (props as ToggleGroupSingleProps).onChange?.(v);\n } else {\n (props as ToggleGroupMultipleProps).onChange?.(next as string[]);\n }\n };\n\n return (\n <ToggleGroupContext.Provider value={{ type, value: current, setValue, size, variant, disabled }}>\n <div role=\"group\" aria-label={ariaLabel} className={cx('toggle-group', className)}>\n {children}\n </div>\n </ToggleGroupContext.Provider>\n );\n}\n\n/**\n * `SegmentedControl` — a single-select `ToggleGroup` with equal-width\n * segments. The common case (view switcher, filter mode, on/off pair) is\n * `type=\"single\"`; this drops the discriminant so you can't trip the\n * cryptic union error from forgetting `type`. Use `SegmentedControlItem`\n * (alias of `ToggleGroupItem`) for the options.\n *\n * <SegmentedControl value={view} onChange={setView} ariaLabel=\"Vista\">\n * <SegmentedControlItem value=\"list\">Lista</SegmentedControlItem>\n * <SegmentedControlItem value=\"grid\">Tarjetas</SegmentedControlItem>\n * </SegmentedControl>\n */\nexport type SegmentedControlProps = Omit<ToggleGroupSingleProps, 'type'>;\n\nexport function SegmentedControl({ className, ...rest }: SegmentedControlProps) {\n return <ToggleGroup type=\"single\" className={cx('toggle-group--segmented', className)} {...rest} />;\n}\n\nexport interface ToggleGroupItemProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n value: string;\n /**\n * Optional leading icon, rendered before `children` and aligned via the\n * toggle's built-in flex gap. Convenience for view switchers / segmented\n * controls: `<SegmentedControlItem value=\"table\" icon={<Table />}>Tabla</…>`.\n * For an **icon-only** segment, pass `icon` with no children and give the\n * button an accessible name via `aria-label` (icons are decorative).\n */\n icon?: React.ReactNode;\n}\n\nexport const ToggleGroupItem = React.forwardRef<HTMLButtonElement, ToggleGroupItemProps>(function ToggleGroupItem(\n { value, className, children, icon, disabled: itemDisabled, ...rest },\n ref\n) {\n const ctx = React.useContext(ToggleGroupContext);\n if (!ctx) throw new Error('ToggleGroupItem must be used inside ToggleGroup');\n const isPressed =\n ctx.type === 'single'\n ? ctx.value === value\n : Array.isArray(ctx.value) && ctx.value.includes(value);\n\n const onClick = () => {\n if (ctx.type === 'single') {\n ctx.setValue(isPressed ? '' : value);\n } else {\n const arr = (ctx.value as string[]) ?? [];\n ctx.setValue(isPressed ? arr.filter((v) => v !== value) : [...arr, value]);\n }\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={isPressed}\n data-state={isPressed ? 'on' : 'off'}\n disabled={ctx.disabled || itemDisabled}\n className={cx('toggle', `toggle--${ctx.size}`, `toggle--${ctx.variant}`, 'toggle-group__item', isPressed && 'is-pressed', className)}\n onClick={onClick}\n {...rest}\n >\n {icon}\n {children}\n </button>\n );\n});\n\n/** Alias of `ToggleGroupItem` for use inside `SegmentedControl`. */\nexport const SegmentedControlItem = ToggleGroupItem;\n"]}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { Checkbox } from './chunk-GVYZAOWU.mjs';
2
+ import { Checkbox } from './chunk-TS3WC3G4.mjs';
3
3
  import { format } from './chunk-Q4HKSXUE.mjs';
4
4
  import { useLocale } from './chunk-PQV7HHCJ.mjs';
5
5
  import { cx } from './chunk-IEPCH3JB.mjs';
@@ -69,5 +69,5 @@ function PermissionMatrix({
69
69
  }
70
70
 
71
71
  export { PermissionMatrix };
72
- //# sourceMappingURL=chunk-LVLJ75ND.mjs.map
73
- //# sourceMappingURL=chunk-LVLJ75ND.mjs.map
72
+ //# sourceMappingURL=chunk-5OMB6FC5.mjs.map
73
+ //# sourceMappingURL=chunk-5OMB6FC5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Permissions.tsx"],"names":[],"mappings":"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","file":"chunk-LVLJ75ND.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Checkbox } from './Form';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\nexport interface PermissionRole { id: string; label: React.ReactNode }\nexport interface PermissionAction { id: string; label: React.ReactNode; description?: React.ReactNode }\n\nexport interface PermissionMatrixProps extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onChange'> {\n roles: PermissionRole[];\n actions: PermissionAction[];\n /** Map de roleId → set de actionIds permitidos */\n value: Record<string, string[]>;\n onChange: (value: Record<string, string[]>) => void;\n readOnly?: boolean;\n}\n\nexport function PermissionMatrix({\n roles, actions, value, onChange, readOnly, className, ...rest\n}: PermissionMatrixProps) {\n const t = useLocale();\n const has = (roleId: string, actionId: string) => (value[roleId] ?? []).includes(actionId);\n\n const toggle = (roleId: string, actionId: string) => {\n if (readOnly) return;\n const current = new Set(value[roleId] ?? []);\n if (current.has(actionId)) current.delete(actionId);\n else current.add(actionId);\n onChange({ ...value, [roleId]: Array.from(current) });\n };\n\n const toggleAllForRole = (roleId: string, allow: boolean) => {\n if (readOnly) return;\n onChange({ ...value, [roleId]: allow ? actions.map((a) => a.id) : [] });\n };\n\n return (\n <div className={cx('permissions', className)}>\n <table className=\"permissions__table\" {...rest}>\n <thead>\n <tr>\n <th scope=\"col\" className=\"permissions__action-col\">{t['permissions.action']}</th>\n {roles.map((r) => {\n const count = (value[r.id] ?? []).length;\n const all = count === actions.length;\n return (\n <th key={r.id} scope=\"col\" className=\"permissions__role-col\">\n <div className=\"permissions__role-head\">\n <span>{r.label}</span>\n {!readOnly && (\n <button\n type=\"button\"\n className=\"permissions__role-toggle\"\n onClick={() => toggleAllForRole(r.id, !all)}\n >\n {all ? t['permissions.unmarkAll'] : t['permissions.markAll']}\n </button>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {actions.map((a) => (\n <tr key={a.id}>\n <th scope=\"row\" className=\"permissions__action-cell\">\n <div>{a.label}</div>\n {a.description && <div className=\"permissions__action-desc\">{a.description}</div>}\n </th>\n {roles.map((r) => (\n <td key={r.id} className=\"permissions__cell\">\n <Checkbox\n checked={has(r.id, a.id)}\n disabled={readOnly}\n onChange={() => toggle(r.id, a.id)}\n aria-label={format(t['permissions.cellLabel'], {\n action: typeof a.label === 'string' ? a.label : a.id,\n role: typeof r.label === 'string' ? r.label : r.id,\n })}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Permissions.tsx"],"names":[],"mappings":"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","file":"chunk-5OMB6FC5.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Checkbox } from './Form';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format } from '../locale/messages';\n\nexport interface PermissionRole { id: string; label: React.ReactNode }\nexport interface PermissionAction { id: string; label: React.ReactNode; description?: React.ReactNode }\n\nexport interface PermissionMatrixProps extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onChange'> {\n roles: PermissionRole[];\n actions: PermissionAction[];\n /** Map de roleId → set de actionIds permitidos */\n value: Record<string, string[]>;\n onChange: (value: Record<string, string[]>) => void;\n readOnly?: boolean;\n}\n\nexport function PermissionMatrix({\n roles, actions, value, onChange, readOnly, className, ...rest\n}: PermissionMatrixProps) {\n const t = useLocale();\n const has = (roleId: string, actionId: string) => (value[roleId] ?? []).includes(actionId);\n\n const toggle = (roleId: string, actionId: string) => {\n if (readOnly) return;\n const current = new Set(value[roleId] ?? []);\n if (current.has(actionId)) current.delete(actionId);\n else current.add(actionId);\n onChange({ ...value, [roleId]: Array.from(current) });\n };\n\n const toggleAllForRole = (roleId: string, allow: boolean) => {\n if (readOnly) return;\n onChange({ ...value, [roleId]: allow ? actions.map((a) => a.id) : [] });\n };\n\n return (\n <div className={cx('permissions', className)}>\n <table className=\"permissions__table\" {...rest}>\n <thead>\n <tr>\n <th scope=\"col\" className=\"permissions__action-col\">{t['permissions.action']}</th>\n {roles.map((r) => {\n const count = (value[r.id] ?? []).length;\n const all = count === actions.length;\n return (\n <th key={r.id} scope=\"col\" className=\"permissions__role-col\">\n <div className=\"permissions__role-head\">\n <span>{r.label}</span>\n {!readOnly && (\n <button\n type=\"button\"\n className=\"permissions__role-toggle\"\n onClick={() => toggleAllForRole(r.id, !all)}\n >\n {all ? t['permissions.unmarkAll'] : t['permissions.markAll']}\n </button>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {actions.map((a) => (\n <tr key={a.id}>\n <th scope=\"row\" className=\"permissions__action-cell\">\n <div>{a.label}</div>\n {a.description && <div className=\"permissions__action-desc\">{a.description}</div>}\n </th>\n {roles.map((r) => (\n <td key={r.id} className=\"permissions__cell\">\n <Checkbox\n checked={has(r.id, a.id)}\n disabled={readOnly}\n onChange={() => toggle(r.id, a.id)}\n aria-label={format(t['permissions.cellLabel'], {\n action: typeof a.label === 'string' ? a.label : a.id,\n role: typeof r.label === 'string' ? r.label : r.id,\n })}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"]}
@@ -61,15 +61,22 @@ function usePopoverPosition(anchorRef, contentRef, { open, side = "bottom", alig
61
61
  };
62
62
  window.addEventListener("scroll", schedule, { capture: true, passive: true });
63
63
  window.addEventListener("resize", schedule, { passive: true });
64
+ const contentEl = contentRef.current;
65
+ let ro;
66
+ if (contentEl && typeof ResizeObserver !== "undefined") {
67
+ ro = new ResizeObserver(schedule);
68
+ ro.observe(contentEl);
69
+ }
64
70
  return () => {
65
71
  cancelAnimationFrame(raf);
66
72
  window.removeEventListener("scroll", schedule, { capture: true });
67
73
  window.removeEventListener("resize", schedule);
74
+ ro?.disconnect();
68
75
  };
69
- }, [open, compute]);
76
+ }, [open, compute, contentRef]);
70
77
  return pos;
71
78
  }
72
79
 
73
80
  export { usePopoverPosition };
74
- //# sourceMappingURL=chunk-PRML6VEF.mjs.map
75
- //# sourceMappingURL=chunk-PRML6VEF.mjs.map
81
+ //# sourceMappingURL=chunk-5XT2LX3I.mjs.map
82
+ //# sourceMappingURL=chunk-5XT2LX3I.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/usePopoverPosition.ts"],"names":[],"mappings":"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","file":"chunk-5XT2LX3I.mjs","sourcesContent":["import * as React from 'react';\n\nexport type PopoverSide = 'top' | 'bottom' | 'left' | 'right';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\n/** Anything that can report its viewport rect: a DOM element or a virtual\n * anchor (e.g. a point under the cursor for a context menu). */\nexport interface VirtualElement {\n getBoundingClientRect: () => DOMRect;\n}\n\nexport interface UsePopoverPositionOptions {\n open: boolean;\n side?: PopoverSide;\n align?: PopoverAlign;\n offset?: number;\n /** Expose the anchor's width so the consumer can match it (comboboxes). */\n matchAnchorWidth?: boolean;\n}\n\nexport interface PopoverPosition {\n /** Viewport-relative coords (use with `position: fixed` in a body portal).\n * Fixed strategy stays correct inside transformed/fixed ancestors (e.g. a\n * Modal) and scroll containers; the hook recomputes on scroll/resize. */\n top: number;\n left: number;\n /** Side actually used after flipping; useful for arrow/animation origin. */\n side: PopoverSide;\n /** False until the first measure. Keep content `visibility: hidden` until true. */\n ready: boolean;\n /** Anchor width, only when `matchAnchorWidth` is set. */\n width?: number;\n}\n\nconst GUTTER = 8;\n\n/**\n * Positions a floating panel relative to an anchor, for panels portaled to\n * `document.body`. Computes viewport-relative coords from\n * `getBoundingClientRect()` (use with `position: fixed`), flips to the\n * opposite side when the preferred\n * side doesn't fit the viewport, clamps into the viewport, and recomputes\n * on scroll of *any* ancestor (capture-phase) and on resize\n * (rAF-coalesced). Listeners are torn down on close/unmount.\n *\n * The content must be mounted (it can be visually hidden) so its size can\n * be measured — gate visibility on the returned `ready` flag.\n *\n * ```tsx\n * const pos = usePopoverPosition(triggerRef, contentRef, { open, side: 'bottom' });\n * <Portal><div ref={contentRef} style={{\n * position: 'fixed', top: pos.top, left: pos.left,\n * visibility: pos.ready ? 'visible' : 'hidden',\n * }} /></Portal>\n * ```\n */\nexport function usePopoverPosition(\n anchorRef: React.RefObject<HTMLElement | VirtualElement | null>,\n contentRef: React.RefObject<HTMLElement | null>,\n { open, side = 'bottom', align = 'center', offset = 8, matchAnchorWidth = false }: UsePopoverPositionOptions,\n): PopoverPosition {\n const [pos, setPos] = React.useState<PopoverPosition>({\n top: 0,\n left: 0,\n side,\n ready: false,\n });\n\n const compute = React.useCallback((): void => {\n const anchorEl = anchorRef.current;\n const contentEl = contentRef.current;\n if (!anchorEl || !contentEl || typeof window === 'undefined') return;\n\n const a = anchorEl.getBoundingClientRect();\n const c = contentEl.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // With matchAnchorWidth the panel is rendered at `width: a.width`. On the\n // very first open `pos.width` is still undefined, so the just-mounted node\n // measures at its unconstrained natural width — using that inflated\n // `c.width` in the clamp below would yank `left` to the viewport edge and\n // the position never gets re-measured. Use the width the panel *will*\n // have, which is correct by construction.\n const cw = matchAnchorWidth ? a.width : c.width;\n\n let chosen: PopoverSide = side;\n if (side === 'bottom' && a.bottom + offset + c.height > vh && a.top - offset - c.height >= 0) {\n chosen = 'top';\n } else if (side === 'top' && a.top - offset - c.height < 0 && a.bottom + offset + c.height <= vh) {\n chosen = 'bottom';\n } else if (side === 'right' && a.right + offset + cw > vw && a.left - offset - cw >= 0) {\n chosen = 'left';\n } else if (side === 'left' && a.left - offset - cw < 0 && a.right + offset + cw <= vw) {\n chosen = 'right';\n }\n\n let top = 0;\n let left = 0;\n if (chosen === 'bottom' || chosen === 'top') {\n top = chosen === 'bottom' ? a.bottom + offset : a.top - c.height - offset;\n left =\n align === 'start' ? a.left\n : align === 'end' ? a.right - cw\n : a.left + (a.width - cw) / 2;\n } else {\n left = chosen === 'right' ? a.right + offset : a.left - cw - offset;\n top =\n align === 'start' ? a.top\n : align === 'end' ? a.bottom - c.height\n : a.top + (a.height - c.height) / 2;\n }\n\n left = Math.max(GUTTER, Math.min(left, vw - cw - GUTTER));\n top = Math.max(GUTTER, Math.min(top, vh - c.height - GUTTER));\n\n setPos({\n top,\n left,\n side: chosen,\n ready: true,\n width: matchAnchorWidth ? a.width : undefined,\n });\n }, [anchorRef, contentRef, side, align, offset, matchAnchorWidth]);\n\n React.useEffect(() => {\n if (!open) {\n setPos((p) => (p.ready ? { ...p, ready: false } : p));\n return;\n }\n // Portal is synchronous, so by the time this effect runs the content\n // node is committed and measurable — position immediately (no flicker,\n // and deterministic under test without a rAF dependency).\n compute();\n let raf = 0;\n const schedule = (): void => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(compute);\n };\n // Capture-phase: scroll doesn't bubble, so capture catches scrolling\n // from *any* ancestor (the table/card wrapper, not just window).\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule, { passive: true });\n // Recompute when the panel itself resizes — e.g. a combobox list shrinking\n // as the query filters options. Without this the coords computed for the\n // initial (tall) size go stale; a 'top'-flipped panel that shrinks keeps\n // its high `top` and drifts up off the anchor.\n const contentEl = contentRef.current;\n let ro: ResizeObserver | undefined;\n if (contentEl && typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(schedule);\n ro.observe(contentEl);\n }\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener('scroll', schedule, { capture: true });\n window.removeEventListener('resize', schedule);\n ro?.disconnect();\n };\n }, [open, compute, contentRef]);\n\n return pos;\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunk4VMQLSHV_js = require('./chunk-4VMQLSHV.js');
5
- var chunkRQOTH7I7_js = require('./chunk-RQOTH7I7.js');
5
+ var chunk3HA3VO2I_js = require('./chunk-3HA3VO2I.js');
6
6
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
7
7
  var React = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
@@ -137,7 +137,7 @@ function AppShell(props) {
137
137
  "aria-expanded": !collapsed,
138
138
  "aria-label": collapsed ? t["appshell.expandMenu"] : t["appshell.collapseMenu"],
139
139
  title: collapsed ? t["appshell.expand"] : t["appshell.collapse"],
140
- children: collapsed ? /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronRight, { size: 14 }) : /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronLeft, { size: 14 })
140
+ children: collapsed ? /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.ChevronRight, { size: 14 }) : /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.ChevronLeft, { size: 14 })
141
141
  }
142
142
  )
143
143
  ] })
@@ -152,7 +152,7 @@ function AppShell(props) {
152
152
  "aria-label": t["appshell.openMenu"],
153
153
  "aria-expanded": mobileOpen,
154
154
  onClick: () => setMobileOpen((o) => !o),
155
- children: /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.MenuIcon, { size: 20 })
155
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.MenuIcon, { size: 20 })
156
156
  }
157
157
  ),
158
158
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "appshell__topbar-content", children: topbar }),
@@ -183,5 +183,5 @@ function PageHeader({ title, description, breadcrumbs, actions, meta, className
183
183
 
184
184
  exports.AppShell = AppShell;
185
185
  exports.PageHeader = PageHeader;
186
- //# sourceMappingURL=chunk-S4YPRJQQ.js.map
187
- //# sourceMappingURL=chunk-S4YPRJQQ.js.map
186
+ //# sourceMappingURL=chunk-6BRRRENF.js.map
187
+ //# sourceMappingURL=chunk-6BRRRENF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AppShell.tsx"],"names":["React","NavItemNode","cx","jsxs","Fragment","jsx","useLocale","ChevronRight","ChevronLeft","MenuIcon"],"mappings":"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","file":"chunk-S4YPRJQQ.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronLeft, ChevronRight, MenuIcon } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- AppShell (Sidebar + Topbar + Content) -----------------------\n// Designed to drop into a Next.js app/layout.tsx as a Client Component shell.\n\nexport interface NavItem {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n active?: boolean;\n badge?: React.ReactNode;\n onSelect?: () => void;\n children?: NavItem[];\n}\n\nexport interface NavSection {\n id?: string;\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport type AppShellTheme = 'default' | 'brand';\n\nexport type AppShellHeaderLayout = 'side' | 'top';\n\n/**\n * Collapse API handed to header-slot render-props so a consumer-placed control\n * (e.g. a hamburger in `left`) can drive the sidebar — crucially in\n * **uncontrolled** mode, where the `top` layout otherwise has no toggle\n * affordance. This is what lets `persistKey` (uncontrolled) coexist with a\n * custom header trigger: the kit owns the state + persistence, the consumer\n * owns the trigger's look and placement.\n */\nexport interface AppShellHeaderApi {\n /** Current collapsed state. */\n collapsed: boolean;\n /** Flip the collapsed state (persisted if `persistKey` is set). */\n toggle: () => void;\n /** Set the collapsed state explicitly. */\n setCollapsed: (collapsed: boolean) => void;\n}\n\n/**\n * A header slot: a static node, or a render-prop receiving {@link AppShellHeaderApi}.\n * The function form is the only way to toggle an uncontrolled shell from the\n * header (no built-in toggle exists in `top`).\n */\nexport type AppShellHeaderSlot =\n | React.ReactNode\n | ((api: AppShellHeaderApi) => React.ReactNode);\n\nexport interface AppShellHeader {\n /** Left slot — typically a menu/hamburger trigger or back action. */\n left?: AppShellHeaderSlot;\n /** Center slot — typically the brand (Logo). Lands at the true viewport centre. */\n center?: AppShellHeaderSlot;\n /** Right slot — notifications, user avatar, utilities. */\n right?: AppShellHeaderSlot;\n}\n\n/**\n * Props shared by both layouts. The layout-specific props live in\n * `AppShellSideProps` / `AppShellTopProps`; `AppShellProps` is the\n * discriminated union of the two, keyed on `headerLayout`.\n */\nexport interface AppShellBaseProps {\n sections: NavSection[];\n footer?: React.ReactNode;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (c: boolean) => void;\n /**\n * Persist the collapsed state in `localStorage[persistKey]` so it survives\n * reloads. Opt-in: omit it and the shell keeps the default behaviour (resets\n * to `defaultCollapsed` on each mount). SSR-safe — the initial render still\n * uses `defaultCollapsed` (no hydration mismatch); the stored value is read\n * after mount, so a differing value may flash for one frame. Ignored in\n * controlled mode (when `collapsed` is provided): the host owns persistence.\n */\n persistKey?: string;\n children: React.ReactNode;\n className?: string;\n /**\n * Color theme (applies to both layouts):\n * - `default` (light): claro, mejor para apps data-heavy de uso prolongado.\n * - `brand`: superficie azul de marca con texto blanco. Mayor brand recall.\n * En `side` tiñe el sidebar; en `top` tiñe header + sidebar (un solo knob).\n */\n theme?: AppShellTheme;\n /** Render-prop for navigation links so the host app can use Next.js Link, etc. */\n linkAs?: (item: NavItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\n/**\n * Sidebar layout (default, `headerLayout=\"side\"` or omitted). The brand\n * block + collapse rail live in the sidebar; the topbar sits over the\n * content with a mobile hamburger. `header` is **not** valid here — that\n * slot belongs to the `top` layout.\n */\nexport interface AppShellSideProps extends AppShellBaseProps {\n headerLayout?: 'side';\n /** Brand node in the sidebar header (expanded state). */\n brand?: React.ReactNode;\n /** Brand node shown when the rail is collapsed. Falls back to `brand`. */\n brandCollapsed?: React.ReactNode;\n /** Content of the topbar over the page (search, etc.). */\n topbar?: React.ReactNode;\n /** User slot at the right of the topbar (avatar/menu). */\n user?: React.ReactNode;\n /** Not valid in the `side` layout — the header slots belong to `top`. */\n header?: never;\n}\n\n/**\n * Top-header layout (`headerLayout=\"top\"`, v1.15.0). Full-width header\n * above the body with three slots (`header.{left,center,right}`); the\n * centre slot lands at the **true viewport centre** (1fr·auto·1fr grid).\n * The sidebar has no brand block and `collapsed` hides it entirely (no\n * 72px rail); the header is **invariant** to the collapse. `theme=\"brand\"`\n * tints both bands. The `side`-only props are **not** valid here — put your\n * chrome in `header`.\n */\nexport interface AppShellTopProps extends AppShellBaseProps {\n headerLayout: 'top';\n /** Slots for the full-width header. Brand usually goes in `center`. */\n header?: AppShellHeader;\n /**\n * Theme of the **header band only**, independent of the sidebar (`theme`).\n * Defaults to `theme`, so `theme=\"brand\"` still tints both bands (no\n * change for existing consumers). Set `theme=\"default\" headerTheme=\"brand\"`\n * for a branded top bar over a neutral, legible sidebar — common in\n * data-heavy admin apps.\n */\n headerTheme?: AppShellTheme;\n /**\n * Collapse to an icon rail (72px) instead of hiding the sidebar entirely.\n * Default `false` → `collapsed` hides the sidebar (the original `top`\n * behavior). `true` → `collapsed` keeps a 72px rail showing the nav icons\n * (labels hidden, active-item bar kept) — like the `side` layout — and\n * renders a built-in expand/collapse toggle at the bottom of the rail.\n */\n collapsedRail?: boolean;\n /** Not valid in `top` — use `header.center` for the brand. */\n brand?: never;\n /** Not valid in `top` — the sidebar collapses entirely. */\n brandCollapsed?: never;\n /** Not valid in `top` — use the `header` slots. */\n topbar?: never;\n /** Not valid in `top` — use `header.right`. */\n user?: never;\n}\n\n/**\n * Discriminated union keyed on `headerLayout`. TypeScript enforces that\n * `header` is only accepted with `headerLayout=\"top\"` and that\n * `brand`/`brandCollapsed`/`topbar`/`user` are only accepted with the\n * (default) `side` layout — passing the wrong prop for the layout is a\n * compile error instead of being silently ignored at runtime.\n */\nexport type AppShellProps = AppShellSideProps | AppShellTopProps;\n\n// Recursive nav item, memoized so a single item's parent re-render doesn't\n// churn through every other item in the tree. Stability of `linkAs` and\n// `onCloseMobile` is the parent's responsibility (we stabilize\n// `onCloseMobile` via useCallback below; consumers should memoize `linkAs`\n// if they care about avoiding renders, but for typical Next.js Link usage\n// the inline arrow is rarely a hot path).\ninterface NavItemNodeProps {\n item: NavItem;\n depth: number;\n linkAs?: AppShellBaseProps['linkAs'];\n onCloseMobile: () => void;\n}\n\nconst NavItemNode = React.memo(function NavItemNode({\n item, depth, linkAs, onCloseMobile,\n}: NavItemNodeProps) {\n const klass = cx('appshell__navitem', item.active && 'is-active', `appshell__navitem--depth-${depth}`);\n const inner = (\n <>\n {item.icon && <span className=\"appshell__navicon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"appshell__navlabel\">{item.label}</span>\n {item.badge && <span className=\"appshell__navbadge\">{item.badge}</span>}\n </>\n );\n const node = item.href && linkAs\n ? linkAs(item, inner, klass)\n : (\n <a\n href={item.href ?? '#'}\n className={klass}\n aria-current={item.active ? 'page' : undefined}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onSelect?.();\n onCloseMobile();\n }}\n >\n {inner}\n </a>\n );\n return (\n <li>\n {node}\n {item.children && item.children.length > 0 && (\n <ul className=\"appshell__navchildren\">\n {item.children.map((c) => (\n <NavItemNode key={c.id} item={c} depth={depth + 1} linkAs={linkAs} onCloseMobile={onCloseMobile} />\n ))}\n </ul>\n )}\n </li>\n );\n});\n\nexport function AppShell(props: AppShellProps) {\n const {\n sections, footer, defaultCollapsed = false,\n collapsed: ctrlCollapsed, onCollapsedChange, persistKey,\n children, className, theme = 'default', linkAs,\n } = props;\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const [mobileOpen, setMobileOpen] = React.useState(false);\n const t = useLocale();\n const collapsed = ctrlCollapsed ?? internalCollapsed;\n\n // SSR-safe persistence: the initial render uses `defaultCollapsed` (server\n // and first client render agree → no hydration mismatch), then we sync from\n // localStorage after mount. Only in uncontrolled mode; reads can throw\n // (Safari private mode), so they're guarded. Runs once per persistKey.\n React.useEffect(() => {\n if (persistKey == null || ctrlCollapsed !== undefined) return;\n try {\n const stored = window.localStorage.getItem(persistKey);\n if (stored === '0' || stored === '1') setInternalCollapsed(stored === '1');\n } catch {\n /* localStorage unavailable — keep defaultCollapsed */\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- sync once at mount; ctrlCollapsed read intentionally not tracked\n }, [persistKey]);\n\n const setCollapsed = (v: boolean) => {\n if (ctrlCollapsed === undefined) setInternalCollapsed(v);\n if (persistKey != null && ctrlCollapsed === undefined) {\n try {\n window.localStorage.setItem(persistKey, v ? '1' : '0');\n } catch {\n /* localStorage unavailable — persistence is best-effort */\n }\n }\n onCollapsedChange?.(v);\n };\n const closeMobile = React.useCallback(() => setMobileOpen(false), []);\n\n // Top-header variant: full-width header above the body. Topbar is\n // invariant to `collapsed` (only the inner body's columns animate); brand\n // lives in `header.center` at the true viewport centre. Default\n // `headerLayout=\"side\"` falls through to the legacy JSX below\n // (byte-identical for existing consumers). The `props.headerLayout`\n // check narrows the discriminated union, so `header` (top) and\n // `brand`/`topbar`/`user` (side) are each only in scope in their branch.\n if (props.headerLayout === 'top') {\n const { header } = props;\n // Header band themes independently of the sidebar; defaults to `theme`\n // so `theme=\"brand\"` keeps tinting both bands (back-compat).\n const headerTheme = props.headerTheme ?? theme;\n const collapsedRail = props.collapsedRail ?? false;\n // Hand the collapse API to header slots so a consumer trigger (hamburger)\n // can toggle the shell — the only path in uncontrolled `top` (no built-in\n // toggle here). A function slot is called with the API; a node renders as-is.\n const headerApi: AppShellHeaderApi = { collapsed, toggle: () => setCollapsed(!collapsed), setCollapsed };\n const slot = (s: AppShellHeaderSlot): React.ReactNode =>\n typeof s === 'function' ? (s as (api: AppShellHeaderApi) => React.ReactNode)(headerApi) : s;\n return (\n <div className={cx('appshell', `appshell--${theme}`, 'appshell--header-top', `appshell--header-${headerTheme}`, collapsedRail && 'appshell--rail', collapsed && 'is-collapsed', className)}>\n {/* On a brand header the band is dark, so re-scope foreground tokens\n via data-tone=\"inverse\" — anything inside (Avatar, badges, links)\n becomes band-aware automatically without per-call-site colors. */}\n <header className=\"appshell__header\" role=\"banner\" data-tone={headerTheme === 'brand' ? 'inverse' : undefined}>\n <div className=\"appshell__header-left\">{slot(header?.left)}</div>\n <div className=\"appshell__header-center\">{slot(header?.center)}</div>\n <div className=\"appshell__header-right\">{slot(header?.right)}</div>\n </header>\n <div className=\"appshell__body\">\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n {footer != null && (\n <div className=\"appshell__sidebar-foot\">{footer}</div>\n )}\n </aside>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n </div>\n );\n }\n\n const { brand, brandCollapsed, topbar, user } = props;\n return (\n <div className={cx('appshell', `appshell--${theme}`, collapsed && 'is-collapsed', mobileOpen && 'is-mobile-open', className)}>\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <div className=\"appshell__brand\">\n {collapsed ? (brandCollapsed ?? brand) : brand}\n </div>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n <div className=\"appshell__sidebar-foot\">\n {footer}\n <button\n type=\"button\"\n className=\"appshell__collapse\"\n onClick={() => setCollapsed(!collapsed)}\n aria-expanded={!collapsed}\n aria-label={collapsed ? t['appshell.expandMenu'] : t['appshell.collapseMenu']}\n title={collapsed ? t['appshell.expand'] : t['appshell.collapse']}\n >\n {collapsed ? <ChevronRight size={14} /> : <ChevronLeft size={14} />}\n </button>\n </div>\n </aside>\n\n <div className=\"appshell__main\">\n <header className=\"appshell__topbar\">\n <button\n type=\"button\"\n className=\"appshell__hamburger\"\n aria-label={t['appshell.openMenu']}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen((o) => !o)}\n ><MenuIcon size={20} /></button>\n <div className=\"appshell__topbar-content\">{topbar}</div>\n {user && <div className=\"appshell__topbar-user\">{user}</div>}\n </header>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n\n {mobileOpen && (\n <div className=\"appshell__scrim\" onClick={() => setMobileOpen(false)} aria-hidden=\"true\" />\n )}\n </div>\n );\n}\n\n// ---------- PageHeader --------------------------------------------------\nexport interface PageHeaderProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n breadcrumbs?: Array<{ label: React.ReactNode; href?: string }>;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, breadcrumbs, actions, meta, className }: PageHeaderProps) {\n const t = useLocale();\n return (\n <div className={cx('page-header', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"page-header__crumbs\" aria-label={t['appshell.breadcrumb']}>\n <ol>\n {breadcrumbs.map((c, i) => (\n <li key={i}>\n {c.href ? <a href={c.href}>{c.label}</a> : <span aria-current=\"page\">{c.label}</span>}\n {i < breadcrumbs.length - 1 && <span className=\"page-header__crumb-sep\" aria-hidden=\"true\">/</span>}\n </li>\n ))}\n </ol>\n </nav>\n )}\n <div className=\"page-header__row\">\n <div className=\"page-header__title-wrap\">\n <h1 className=\"page-header__title\">{title}</h1>\n {description && <p className=\"page-header__desc\">{description}</p>}\n </div>\n {actions && <div className=\"page-header__actions\">{actions}</div>}\n </div>\n {meta && <div className=\"page-header__meta\">{meta}</div>}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/AppShell.tsx"],"names":["React","NavItemNode","cx","jsxs","Fragment","jsx","useLocale","ChevronRight","ChevronLeft","MenuIcon"],"mappings":"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","file":"chunk-6BRRRENF.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronLeft, ChevronRight, MenuIcon } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\n\n// ---------- AppShell (Sidebar + Topbar + Content) -----------------------\n// Designed to drop into a Next.js app/layout.tsx as a Client Component shell.\n\nexport interface NavItem {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n active?: boolean;\n badge?: React.ReactNode;\n onSelect?: () => void;\n children?: NavItem[];\n}\n\nexport interface NavSection {\n id?: string;\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport type AppShellTheme = 'default' | 'brand';\n\nexport type AppShellHeaderLayout = 'side' | 'top';\n\n/**\n * Collapse API handed to header-slot render-props so a consumer-placed control\n * (e.g. a hamburger in `left`) can drive the sidebar — crucially in\n * **uncontrolled** mode, where the `top` layout otherwise has no toggle\n * affordance. This is what lets `persistKey` (uncontrolled) coexist with a\n * custom header trigger: the kit owns the state + persistence, the consumer\n * owns the trigger's look and placement.\n */\nexport interface AppShellHeaderApi {\n /** Current collapsed state. */\n collapsed: boolean;\n /** Flip the collapsed state (persisted if `persistKey` is set). */\n toggle: () => void;\n /** Set the collapsed state explicitly. */\n setCollapsed: (collapsed: boolean) => void;\n}\n\n/**\n * A header slot: a static node, or a render-prop receiving {@link AppShellHeaderApi}.\n * The function form is the only way to toggle an uncontrolled shell from the\n * header (no built-in toggle exists in `top`).\n */\nexport type AppShellHeaderSlot =\n | React.ReactNode\n | ((api: AppShellHeaderApi) => React.ReactNode);\n\nexport interface AppShellHeader {\n /** Left slot — typically a menu/hamburger trigger or back action. */\n left?: AppShellHeaderSlot;\n /** Center slot — typically the brand (Logo). Lands at the true viewport centre. */\n center?: AppShellHeaderSlot;\n /** Right slot — notifications, user avatar, utilities. */\n right?: AppShellHeaderSlot;\n}\n\n/**\n * Props shared by both layouts. The layout-specific props live in\n * `AppShellSideProps` / `AppShellTopProps`; `AppShellProps` is the\n * discriminated union of the two, keyed on `headerLayout`.\n */\nexport interface AppShellBaseProps {\n sections: NavSection[];\n footer?: React.ReactNode;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (c: boolean) => void;\n /**\n * Persist the collapsed state in `localStorage[persistKey]` so it survives\n * reloads. Opt-in: omit it and the shell keeps the default behaviour (resets\n * to `defaultCollapsed` on each mount). SSR-safe — the initial render still\n * uses `defaultCollapsed` (no hydration mismatch); the stored value is read\n * after mount, so a differing value may flash for one frame. Ignored in\n * controlled mode (when `collapsed` is provided): the host owns persistence.\n */\n persistKey?: string;\n children: React.ReactNode;\n className?: string;\n /**\n * Color theme (applies to both layouts):\n * - `default` (light): claro, mejor para apps data-heavy de uso prolongado.\n * - `brand`: superficie azul de marca con texto blanco. Mayor brand recall.\n * En `side` tiñe el sidebar; en `top` tiñe header + sidebar (un solo knob).\n */\n theme?: AppShellTheme;\n /** Render-prop for navigation links so the host app can use Next.js Link, etc. */\n linkAs?: (item: NavItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\n/**\n * Sidebar layout (default, `headerLayout=\"side\"` or omitted). The brand\n * block + collapse rail live in the sidebar; the topbar sits over the\n * content with a mobile hamburger. `header` is **not** valid here — that\n * slot belongs to the `top` layout.\n */\nexport interface AppShellSideProps extends AppShellBaseProps {\n headerLayout?: 'side';\n /** Brand node in the sidebar header (expanded state). */\n brand?: React.ReactNode;\n /** Brand node shown when the rail is collapsed. Falls back to `brand`. */\n brandCollapsed?: React.ReactNode;\n /** Content of the topbar over the page (search, etc.). */\n topbar?: React.ReactNode;\n /** User slot at the right of the topbar (avatar/menu). */\n user?: React.ReactNode;\n /** Not valid in the `side` layout — the header slots belong to `top`. */\n header?: never;\n}\n\n/**\n * Top-header layout (`headerLayout=\"top\"`, v1.15.0). Full-width header\n * above the body with three slots (`header.{left,center,right}`); the\n * centre slot lands at the **true viewport centre** (1fr·auto·1fr grid).\n * The sidebar has no brand block and `collapsed` hides it entirely (no\n * 72px rail); the header is **invariant** to the collapse. `theme=\"brand\"`\n * tints both bands. The `side`-only props are **not** valid here — put your\n * chrome in `header`.\n */\nexport interface AppShellTopProps extends AppShellBaseProps {\n headerLayout: 'top';\n /** Slots for the full-width header. Brand usually goes in `center`. */\n header?: AppShellHeader;\n /**\n * Theme of the **header band only**, independent of the sidebar (`theme`).\n * Defaults to `theme`, so `theme=\"brand\"` still tints both bands (no\n * change for existing consumers). Set `theme=\"default\" headerTheme=\"brand\"`\n * for a branded top bar over a neutral, legible sidebar — common in\n * data-heavy admin apps.\n */\n headerTheme?: AppShellTheme;\n /**\n * Collapse to an icon rail (72px) instead of hiding the sidebar entirely.\n * Default `false` → `collapsed` hides the sidebar (the original `top`\n * behavior). `true` → `collapsed` keeps a 72px rail showing the nav icons\n * (labels hidden, active-item bar kept) — like the `side` layout — and\n * renders a built-in expand/collapse toggle at the bottom of the rail.\n */\n collapsedRail?: boolean;\n /** Not valid in `top` — use `header.center` for the brand. */\n brand?: never;\n /** Not valid in `top` — the sidebar collapses entirely. */\n brandCollapsed?: never;\n /** Not valid in `top` — use the `header` slots. */\n topbar?: never;\n /** Not valid in `top` — use `header.right`. */\n user?: never;\n}\n\n/**\n * Discriminated union keyed on `headerLayout`. TypeScript enforces that\n * `header` is only accepted with `headerLayout=\"top\"` and that\n * `brand`/`brandCollapsed`/`topbar`/`user` are only accepted with the\n * (default) `side` layout — passing the wrong prop for the layout is a\n * compile error instead of being silently ignored at runtime.\n */\nexport type AppShellProps = AppShellSideProps | AppShellTopProps;\n\n// Recursive nav item, memoized so a single item's parent re-render doesn't\n// churn through every other item in the tree. Stability of `linkAs` and\n// `onCloseMobile` is the parent's responsibility (we stabilize\n// `onCloseMobile` via useCallback below; consumers should memoize `linkAs`\n// if they care about avoiding renders, but for typical Next.js Link usage\n// the inline arrow is rarely a hot path).\ninterface NavItemNodeProps {\n item: NavItem;\n depth: number;\n linkAs?: AppShellBaseProps['linkAs'];\n onCloseMobile: () => void;\n}\n\nconst NavItemNode = React.memo(function NavItemNode({\n item, depth, linkAs, onCloseMobile,\n}: NavItemNodeProps) {\n const klass = cx('appshell__navitem', item.active && 'is-active', `appshell__navitem--depth-${depth}`);\n const inner = (\n <>\n {item.icon && <span className=\"appshell__navicon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"appshell__navlabel\">{item.label}</span>\n {item.badge && <span className=\"appshell__navbadge\">{item.badge}</span>}\n </>\n );\n const node = item.href && linkAs\n ? linkAs(item, inner, klass)\n : (\n <a\n href={item.href ?? '#'}\n className={klass}\n aria-current={item.active ? 'page' : undefined}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onSelect?.();\n onCloseMobile();\n }}\n >\n {inner}\n </a>\n );\n return (\n <li>\n {node}\n {item.children && item.children.length > 0 && (\n <ul className=\"appshell__navchildren\">\n {item.children.map((c) => (\n <NavItemNode key={c.id} item={c} depth={depth + 1} linkAs={linkAs} onCloseMobile={onCloseMobile} />\n ))}\n </ul>\n )}\n </li>\n );\n});\n\nexport function AppShell(props: AppShellProps) {\n const {\n sections, footer, defaultCollapsed = false,\n collapsed: ctrlCollapsed, onCollapsedChange, persistKey,\n children, className, theme = 'default', linkAs,\n } = props;\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const [mobileOpen, setMobileOpen] = React.useState(false);\n const t = useLocale();\n const collapsed = ctrlCollapsed ?? internalCollapsed;\n\n // SSR-safe persistence: the initial render uses `defaultCollapsed` (server\n // and first client render agree → no hydration mismatch), then we sync from\n // localStorage after mount. Only in uncontrolled mode; reads can throw\n // (Safari private mode), so they're guarded. Runs once per persistKey.\n React.useEffect(() => {\n if (persistKey == null || ctrlCollapsed !== undefined) return;\n try {\n const stored = window.localStorage.getItem(persistKey);\n if (stored === '0' || stored === '1') setInternalCollapsed(stored === '1');\n } catch {\n /* localStorage unavailable — keep defaultCollapsed */\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- sync once at mount; ctrlCollapsed read intentionally not tracked\n }, [persistKey]);\n\n const setCollapsed = (v: boolean) => {\n if (ctrlCollapsed === undefined) setInternalCollapsed(v);\n if (persistKey != null && ctrlCollapsed === undefined) {\n try {\n window.localStorage.setItem(persistKey, v ? '1' : '0');\n } catch {\n /* localStorage unavailable — persistence is best-effort */\n }\n }\n onCollapsedChange?.(v);\n };\n const closeMobile = React.useCallback(() => setMobileOpen(false), []);\n\n // Top-header variant: full-width header above the body. Topbar is\n // invariant to `collapsed` (only the inner body's columns animate); brand\n // lives in `header.center` at the true viewport centre. Default\n // `headerLayout=\"side\"` falls through to the legacy JSX below\n // (byte-identical for existing consumers). The `props.headerLayout`\n // check narrows the discriminated union, so `header` (top) and\n // `brand`/`topbar`/`user` (side) are each only in scope in their branch.\n if (props.headerLayout === 'top') {\n const { header } = props;\n // Header band themes independently of the sidebar; defaults to `theme`\n // so `theme=\"brand\"` keeps tinting both bands (back-compat).\n const headerTheme = props.headerTheme ?? theme;\n const collapsedRail = props.collapsedRail ?? false;\n // Hand the collapse API to header slots so a consumer trigger (hamburger)\n // can toggle the shell — the only path in uncontrolled `top` (no built-in\n // toggle here). A function slot is called with the API; a node renders as-is.\n const headerApi: AppShellHeaderApi = { collapsed, toggle: () => setCollapsed(!collapsed), setCollapsed };\n const slot = (s: AppShellHeaderSlot): React.ReactNode =>\n typeof s === 'function' ? (s as (api: AppShellHeaderApi) => React.ReactNode)(headerApi) : s;\n return (\n <div className={cx('appshell', `appshell--${theme}`, 'appshell--header-top', `appshell--header-${headerTheme}`, collapsedRail && 'appshell--rail', collapsed && 'is-collapsed', className)}>\n {/* On a brand header the band is dark, so re-scope foreground tokens\n via data-tone=\"inverse\" — anything inside (Avatar, badges, links)\n becomes band-aware automatically without per-call-site colors. */}\n <header className=\"appshell__header\" role=\"banner\" data-tone={headerTheme === 'brand' ? 'inverse' : undefined}>\n <div className=\"appshell__header-left\">{slot(header?.left)}</div>\n <div className=\"appshell__header-center\">{slot(header?.center)}</div>\n <div className=\"appshell__header-right\">{slot(header?.right)}</div>\n </header>\n <div className=\"appshell__body\">\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n {footer != null && (\n <div className=\"appshell__sidebar-foot\">{footer}</div>\n )}\n </aside>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n </div>\n );\n }\n\n const { brand, brandCollapsed, topbar, user } = props;\n return (\n <div className={cx('appshell', `appshell--${theme}`, collapsed && 'is-collapsed', mobileOpen && 'is-mobile-open', className)}>\n <aside className=\"appshell__sidebar\" aria-label={t['appshell.mainNav']}>\n <div className=\"appshell__brand\">\n {collapsed ? (brandCollapsed ?? brand) : brand}\n </div>\n <nav className=\"appshell__nav\">\n {sections.map((s, i) => (\n <div key={s.id ?? i} className=\"appshell__navsection\">\n {s.label && <div className=\"appshell__navlabel-section\">{s.label}</div>}\n <ul>{s.items.map((it) => (\n <NavItemNode key={it.id} item={it} depth={0} linkAs={linkAs} onCloseMobile={closeMobile} />\n ))}</ul>\n </div>\n ))}\n </nav>\n <div className=\"appshell__sidebar-foot\">\n {footer}\n <button\n type=\"button\"\n className=\"appshell__collapse\"\n onClick={() => setCollapsed(!collapsed)}\n aria-expanded={!collapsed}\n aria-label={collapsed ? t['appshell.expandMenu'] : t['appshell.collapseMenu']}\n title={collapsed ? t['appshell.expand'] : t['appshell.collapse']}\n >\n {collapsed ? <ChevronRight size={14} /> : <ChevronLeft size={14} />}\n </button>\n </div>\n </aside>\n\n <div className=\"appshell__main\">\n <header className=\"appshell__topbar\">\n <button\n type=\"button\"\n className=\"appshell__hamburger\"\n aria-label={t['appshell.openMenu']}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen((o) => !o)}\n ><MenuIcon size={20} /></button>\n <div className=\"appshell__topbar-content\">{topbar}</div>\n {user && <div className=\"appshell__topbar-user\">{user}</div>}\n </header>\n <main className=\"appshell__content\" role=\"main\">{children}</main>\n </div>\n\n {mobileOpen && (\n <div className=\"appshell__scrim\" onClick={() => setMobileOpen(false)} aria-hidden=\"true\" />\n )}\n </div>\n );\n}\n\n// ---------- PageHeader --------------------------------------------------\nexport interface PageHeaderProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n breadcrumbs?: Array<{ label: React.ReactNode; href?: string }>;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n}\n\nexport function PageHeader({ title, description, breadcrumbs, actions, meta, className }: PageHeaderProps) {\n const t = useLocale();\n return (\n <div className={cx('page-header', className)}>\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav className=\"page-header__crumbs\" aria-label={t['appshell.breadcrumb']}>\n <ol>\n {breadcrumbs.map((c, i) => (\n <li key={i}>\n {c.href ? <a href={c.href}>{c.label}</a> : <span aria-current=\"page\">{c.label}</span>}\n {i < breadcrumbs.length - 1 && <span className=\"page-header__crumb-sep\" aria-hidden=\"true\">/</span>}\n </li>\n ))}\n </ol>\n </nav>\n )}\n <div className=\"page-header__row\">\n <div className=\"page-header__title-wrap\">\n <h1 className=\"page-header__title\">{title}</h1>\n {description && <p className=\"page-header__desc\">{description}</p>}\n </div>\n {actions && <div className=\"page-header__actions\">{actions}</div>}\n </div>\n {meta && <div className=\"page-header__meta\">{meta}</div>}\n </div>\n );\n}\n"]}
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkHYUINOPJ_js = require('./chunk-HYUINOPJ.js');
5
- var chunkRCXLCU5A_js = require('./chunk-RCXLCU5A.js');
4
+ var chunk74ALPTUE_js = require('./chunk-74ALPTUE.js');
5
+ var chunkTCFO7YBF_js = require('./chunk-TCFO7YBF.js');
6
6
  var chunkDFQLWCIC_js = require('./chunk-DFQLWCIC.js');
7
7
  var chunk4VMQLSHV_js = require('./chunk-4VMQLSHV.js');
8
- var chunkRQOTH7I7_js = require('./chunk-RQOTH7I7.js');
8
+ var chunk3HA3VO2I_js = require('./chunk-3HA3VO2I.js');
9
9
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
10
10
  var React = require('react');
11
11
  var jsxRuntime = require('react/jsx-runtime');
@@ -46,7 +46,7 @@ function DataTableRowImpl({
46
46
  const interactive = !renderRow && (!!href || !!onActivate);
47
47
  const cells = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
48
48
  selectable && /* @__PURE__ */ jsxRuntime.jsx("td", { className: chunkPASF6T4H_js.cx(interactive && "data-table__cell--above"), children: /* @__PURE__ */ jsxRuntime.jsx(
49
- chunkHYUINOPJ_js.Checkbox,
49
+ chunk74ALPTUE_js.Checkbox,
50
50
  {
51
51
  checked: selected,
52
52
  onChange: () => onToggle(rowK),
@@ -170,7 +170,7 @@ function DataTable({
170
170
  children: [
171
171
  /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
172
172
  selectable && /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "col", style: { width: 40 }, children: /* @__PURE__ */ jsxRuntime.jsx(
173
- chunkHYUINOPJ_js.Checkbox,
173
+ chunk74ALPTUE_js.Checkbox,
174
174
  {
175
175
  ref: headerCbRef,
176
176
  checked: !!allSelected,
@@ -184,7 +184,7 @@ function DataTable({
184
184
  const sortValue = c.sortable ? active ? sort.dir === "asc" ? "ascending" : "descending" : "none" : void 0;
185
185
  const headerInner = /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "data-table__th", children: [
186
186
  c.header,
187
- c.sortable && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "data-table__sort", "aria-hidden": "true", children: active ? sort.dir === "asc" ? /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronUp, { size: 12 }) : /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronDown, { size: 12 }) : /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.MoreVertical, { size: 12 }) })
187
+ c.sortable && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "data-table__sort", "aria-hidden": "true", children: active ? sort.dir === "asc" ? /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.ChevronUp, { size: 12 }) : /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.ChevronDown, { size: 12 }) : /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.MoreVertical, { size: 12 }) })
188
188
  ] });
189
189
  return /* @__PURE__ */ jsxRuntime.jsx(
190
190
  "th",
@@ -286,7 +286,7 @@ function AccordionItem({ id, title, children }) {
286
286
  onClick: () => ctx.toggle(id),
287
287
  children: [
288
288
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: title }),
289
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "accordion__chev", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronDown, { size: 14 }) })
289
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "accordion__chev", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.ChevronDown, { size: 14 }) })
290
290
  ]
291
291
  }
292
292
  ),
@@ -337,7 +337,7 @@ function TablePagination({
337
337
  )
338
338
  ] }),
339
339
  /* @__PURE__ */ jsxRuntime.jsx(
340
- chunkRCXLCU5A_js.Pagination,
340
+ chunkTCFO7YBF_js.Pagination,
341
341
  {
342
342
  page,
343
343
  pageSize,
@@ -359,5 +359,5 @@ exports.Breadcrumbs = Breadcrumbs;
359
359
  exports.DataTable = DataTable;
360
360
  exports.TablePagination = TablePagination;
361
361
  exports.TableToolbar = TableToolbar;
362
- //# sourceMappingURL=chunk-RHPXE3E7.js.map
363
- //# sourceMappingURL=chunk-RHPXE3E7.js.map
362
+ //# sourceMappingURL=chunk-6DMU73SO.js.map
363
+ //# sourceMappingURL=chunk-6DMU73SO.js.map