@malilion/block-ui-react 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/components/actions/BlockMenu/BlockMenu.d.ts.map +1 -1
  2. package/dist/components/actions/BlockMenu/BlockMenu.js +17 -117
  3. package/dist/components/actions/BlockMenu/BlockMenu.js.map +1 -1
  4. package/dist/components/actions/BlockMenu/BlockMenu.utils.d.ts +2 -0
  5. package/dist/components/actions/BlockMenu/BlockMenu.utils.d.ts.map +1 -1
  6. package/dist/components/actions/BlockMenu/BlockMenu.utils.js +5 -1
  7. package/dist/components/actions/BlockMenu/BlockMenu.utils.js.map +1 -1
  8. package/dist/components/actions/BlockMenu/MenuList.d.ts +28 -0
  9. package/dist/components/actions/BlockMenu/MenuList.d.ts.map +1 -0
  10. package/dist/components/actions/BlockMenu/MenuList.js +134 -0
  11. package/dist/components/actions/BlockMenu/MenuList.js.map +1 -0
  12. package/dist/components/actions/ContextMenu/ContextMenu.d.ts +8 -0
  13. package/dist/components/actions/ContextMenu/ContextMenu.d.ts.map +1 -0
  14. package/dist/components/actions/ContextMenu/ContextMenu.js +100 -0
  15. package/dist/components/actions/ContextMenu/ContextMenu.js.map +1 -0
  16. package/dist/components/actions/ContextMenu/ContextMenu.module.js +7 -0
  17. package/dist/components/actions/ContextMenu/ContextMenu.module.js.map +1 -0
  18. package/dist/components/actions/ContextMenu/ContextMenu.types.d.ts +15 -0
  19. package/dist/components/actions/ContextMenu/ContextMenu.types.d.ts.map +1 -0
  20. package/dist/components/actions/ContextMenu/index.d.ts +3 -0
  21. package/dist/components/actions/ContextMenu/index.d.ts.map +1 -0
  22. package/dist/components/actions/index.d.ts +1 -0
  23. package/dist/components/actions/index.d.ts.map +1 -1
  24. package/dist/components/crafting/RecipeBook/RecipeBook.js +2 -2
  25. package/dist/components/crafting/RecipeBook/RecipeBook.js.map +1 -1
  26. package/dist/components/display/Avatar/Avatar.d.ts +7 -0
  27. package/dist/components/display/Avatar/Avatar.d.ts.map +1 -0
  28. package/dist/components/display/Avatar/Avatar.js +53 -0
  29. package/dist/components/display/Avatar/Avatar.js.map +1 -0
  30. package/dist/components/display/Avatar/Avatar.module.js +17 -0
  31. package/dist/components/display/Avatar/Avatar.module.js.map +1 -0
  32. package/dist/components/display/Avatar/Avatar.types.d.ts +18 -0
  33. package/dist/components/display/Avatar/Avatar.types.d.ts.map +1 -0
  34. package/dist/components/display/Avatar/Avatar.types.js +11 -0
  35. package/dist/components/display/Avatar/Avatar.types.js.map +1 -0
  36. package/dist/components/display/Avatar/Avatar.utils.d.ts +7 -0
  37. package/dist/components/display/Avatar/Avatar.utils.d.ts.map +1 -0
  38. package/dist/components/display/Avatar/Avatar.utils.js +28 -0
  39. package/dist/components/display/Avatar/Avatar.utils.js.map +1 -0
  40. package/dist/components/display/Avatar/index.d.ts +5 -0
  41. package/dist/components/display/Avatar/index.d.ts.map +1 -0
  42. package/dist/components/display/Kbd/Kbd.d.ts +4 -0
  43. package/dist/components/display/Kbd/Kbd.d.ts.map +1 -0
  44. package/dist/components/display/Kbd/Kbd.js +33 -0
  45. package/dist/components/display/Kbd/Kbd.js.map +1 -0
  46. package/dist/components/display/Kbd/Kbd.module.js +13 -0
  47. package/dist/components/display/Kbd/Kbd.module.js.map +1 -0
  48. package/dist/components/display/Kbd/Kbd.types.d.ts +9 -0
  49. package/dist/components/display/Kbd/Kbd.types.d.ts.map +1 -0
  50. package/dist/components/display/Kbd/index.d.ts +3 -0
  51. package/dist/components/display/Kbd/index.d.ts.map +1 -0
  52. package/dist/components/display/Popover/Popover.d.ts +8 -0
  53. package/dist/components/display/Popover/Popover.d.ts.map +1 -0
  54. package/dist/components/display/Popover/Popover.js +101 -0
  55. package/dist/components/display/Popover/Popover.js.map +1 -0
  56. package/dist/components/display/Popover/Popover.module.js +15 -0
  57. package/dist/components/display/Popover/Popover.module.js.map +1 -0
  58. package/dist/components/display/Popover/Popover.types.d.ts +26 -0
  59. package/dist/components/display/Popover/Popover.types.d.ts.map +1 -0
  60. package/dist/components/display/Popover/index.d.ts +3 -0
  61. package/dist/components/display/Popover/index.d.ts.map +1 -0
  62. package/dist/components/display/SkillTree/SkillTree.js +2 -2
  63. package/dist/components/display/SkillTree/SkillTree.js.map +1 -1
  64. package/dist/components/display/index.d.ts +3 -0
  65. package/dist/components/display/index.d.ts.map +1 -1
  66. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.js +2 -2
  67. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.js.map +1 -1
  68. package/dist/components/feedback/Drawer/Drawer.d.ts +7 -0
  69. package/dist/components/feedback/Drawer/Drawer.d.ts.map +1 -0
  70. package/dist/components/feedback/Drawer/Drawer.js +78 -0
  71. package/dist/components/feedback/Drawer/Drawer.js.map +1 -0
  72. package/dist/components/feedback/Drawer/Drawer.module.js +25 -0
  73. package/dist/components/feedback/Drawer/Drawer.module.js.map +1 -0
  74. package/dist/components/feedback/Drawer/Drawer.types.d.ts +21 -0
  75. package/dist/components/feedback/Drawer/Drawer.types.d.ts.map +1 -0
  76. package/dist/components/feedback/Drawer/index.d.ts +3 -0
  77. package/dist/components/feedback/Drawer/index.d.ts.map +1 -0
  78. package/dist/components/feedback/EmptyState/EmptyState.d.ts +4 -0
  79. package/dist/components/feedback/EmptyState/EmptyState.d.ts.map +1 -0
  80. package/dist/components/feedback/EmptyState/EmptyState.js +35 -0
  81. package/dist/components/feedback/EmptyState/EmptyState.js.map +1 -0
  82. package/dist/components/feedback/EmptyState/EmptyState.module.js +17 -0
  83. package/dist/components/feedback/EmptyState/EmptyState.module.js.map +1 -0
  84. package/dist/components/feedback/EmptyState/EmptyState.types.d.ts +14 -0
  85. package/dist/components/feedback/EmptyState/EmptyState.types.d.ts.map +1 -0
  86. package/dist/components/feedback/EmptyState/index.d.ts +3 -0
  87. package/dist/components/feedback/EmptyState/index.d.ts.map +1 -0
  88. package/dist/components/feedback/Modal/BlockModal.d.ts.map +1 -1
  89. package/dist/components/feedback/Modal/BlockModal.js +3 -12
  90. package/dist/components/feedback/Modal/BlockModal.js.map +1 -1
  91. package/dist/components/feedback/Skeleton/Skeleton.d.ts +7 -0
  92. package/dist/components/feedback/Skeleton/Skeleton.d.ts.map +1 -0
  93. package/dist/components/feedback/Skeleton/Skeleton.js +33 -0
  94. package/dist/components/feedback/Skeleton/Skeleton.js.map +1 -0
  95. package/dist/components/feedback/Skeleton/Skeleton.module.js +12 -0
  96. package/dist/components/feedback/Skeleton/Skeleton.module.js.map +1 -0
  97. package/dist/components/feedback/Skeleton/Skeleton.types.d.ts +14 -0
  98. package/dist/components/feedback/Skeleton/Skeleton.types.d.ts.map +1 -0
  99. package/dist/components/feedback/Skeleton/Skeleton.types.js +11 -0
  100. package/dist/components/feedback/Skeleton/Skeleton.types.js.map +1 -0
  101. package/dist/components/feedback/Skeleton/index.d.ts +4 -0
  102. package/dist/components/feedback/Skeleton/index.d.ts.map +1 -0
  103. package/dist/components/feedback/index.d.ts +3 -0
  104. package/dist/components/feedback/index.d.ts.map +1 -1
  105. package/dist/components/forms/NumberInput/NumberInput.d.ts +8 -0
  106. package/dist/components/forms/NumberInput/NumberInput.d.ts.map +1 -0
  107. package/dist/components/forms/NumberInput/NumberInput.js +122 -0
  108. package/dist/components/forms/NumberInput/NumberInput.js.map +1 -0
  109. package/dist/components/forms/NumberInput/NumberInput.module.js +13 -0
  110. package/dist/components/forms/NumberInput/NumberInput.module.js.map +1 -0
  111. package/dist/components/forms/NumberInput/NumberInput.types.d.ts +20 -0
  112. package/dist/components/forms/NumberInput/NumberInput.types.d.ts.map +1 -0
  113. package/dist/components/forms/NumberInput/NumberInput.utils.d.ts +11 -0
  114. package/dist/components/forms/NumberInput/NumberInput.utils.d.ts.map +1 -0
  115. package/dist/components/forms/NumberInput/NumberInput.utils.js +26 -0
  116. package/dist/components/forms/NumberInput/NumberInput.utils.js.map +1 -0
  117. package/dist/components/forms/NumberInput/index.d.ts +3 -0
  118. package/dist/components/forms/NumberInput/index.d.ts.map +1 -0
  119. package/dist/components/forms/index.d.ts +1 -0
  120. package/dist/components/forms/index.d.ts.map +1 -1
  121. package/dist/components/inventory/InventorySlot/InventorySlot.js +2 -2
  122. package/dist/components/inventory/InventorySlot/InventorySlot.js.map +1 -1
  123. package/dist/components/layout/Accordion/Accordion.d.ts +7 -0
  124. package/dist/components/layout/Accordion/Accordion.d.ts.map +1 -0
  125. package/dist/components/layout/Accordion/Accordion.js +95 -0
  126. package/dist/components/layout/Accordion/Accordion.js.map +1 -0
  127. package/dist/components/layout/Accordion/Accordion.module.js +23 -0
  128. package/dist/components/layout/Accordion/Accordion.module.js.map +1 -0
  129. package/dist/components/layout/Accordion/Accordion.types.d.ts +21 -0
  130. package/dist/components/layout/Accordion/Accordion.types.d.ts.map +1 -0
  131. package/dist/components/layout/Accordion/index.d.ts +3 -0
  132. package/dist/components/layout/Accordion/index.d.ts.map +1 -0
  133. package/dist/components/layout/BlockContainer/BlockContainer.d.ts +4 -0
  134. package/dist/components/layout/BlockContainer/BlockContainer.d.ts.map +1 -0
  135. package/dist/components/layout/BlockContainer/BlockContainer.js +18 -0
  136. package/dist/components/layout/BlockContainer/BlockContainer.js.map +1 -0
  137. package/dist/components/layout/BlockContainer/BlockContainer.module.js +7 -0
  138. package/dist/components/layout/BlockContainer/BlockContainer.module.js.map +1 -0
  139. package/dist/components/layout/BlockContainer/BlockContainer.types.d.ts +11 -0
  140. package/dist/components/layout/BlockContainer/BlockContainer.types.d.ts.map +1 -0
  141. package/dist/components/layout/BlockContainer/index.d.ts +3 -0
  142. package/dist/components/layout/BlockContainer/index.d.ts.map +1 -0
  143. package/dist/components/layout/BlockGrid/BlockGrid.d.ts +4 -0
  144. package/dist/components/layout/BlockGrid/BlockGrid.d.ts.map +1 -0
  145. package/dist/components/layout/BlockGrid/BlockGrid.js +25 -0
  146. package/dist/components/layout/BlockGrid/BlockGrid.js.map +1 -0
  147. package/dist/components/layout/BlockGrid/BlockGrid.module.js +7 -0
  148. package/dist/components/layout/BlockGrid/BlockGrid.module.js.map +1 -0
  149. package/dist/components/layout/BlockGrid/BlockGrid.types.d.ts +16 -0
  150. package/dist/components/layout/BlockGrid/BlockGrid.types.d.ts.map +1 -0
  151. package/dist/components/layout/BlockGrid/index.d.ts +3 -0
  152. package/dist/components/layout/BlockGrid/index.d.ts.map +1 -0
  153. package/dist/components/layout/index.d.ts +3 -0
  154. package/dist/components/layout/index.d.ts.map +1 -1
  155. package/dist/components/navigation/BlockSidebar/BlockSidebar.js +3 -3
  156. package/dist/components/navigation/BlockSidebar/BlockSidebar.js.map +1 -1
  157. package/dist/components/navigation/BlockStepper/BlockStepper.d.ts +8 -0
  158. package/dist/components/navigation/BlockStepper/BlockStepper.d.ts.map +1 -0
  159. package/dist/components/navigation/BlockStepper/BlockStepper.js +66 -0
  160. package/dist/components/navigation/BlockStepper/BlockStepper.js.map +1 -0
  161. package/dist/components/navigation/BlockStepper/BlockStepper.module.js +23 -0
  162. package/dist/components/navigation/BlockStepper/BlockStepper.module.js.map +1 -0
  163. package/dist/components/navigation/BlockStepper/BlockStepper.types.d.ts +19 -0
  164. package/dist/components/navigation/BlockStepper/BlockStepper.types.d.ts.map +1 -0
  165. package/dist/components/navigation/BlockStepper/index.d.ts +3 -0
  166. package/dist/components/navigation/BlockStepper/index.d.ts.map +1 -0
  167. package/dist/components/navigation/Breadcrumb/Breadcrumb.js +2 -2
  168. package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -1
  169. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.js +3 -3
  170. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.js.map +1 -1
  171. package/dist/components/navigation/index.d.ts +1 -0
  172. package/dist/components/navigation/index.d.ts.map +1 -1
  173. package/dist/hooks/useAnchoredPosition.d.ts +3 -1
  174. package/dist/hooks/useAnchoredPosition.d.ts.map +1 -1
  175. package/dist/hooks/useAnchoredPosition.js.map +1 -1
  176. package/dist/hooks/useScrollLock.d.ts +6 -0
  177. package/dist/hooks/useScrollLock.d.ts.map +1 -0
  178. package/dist/hooks/useScrollLock.js +26 -0
  179. package/dist/hooks/useScrollLock.js.map +1 -0
  180. package/dist/index.js +16 -1
  181. package/dist/styles.css +776 -36
  182. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"SkillTree.js","names":["styles","_Fragment"],"sources":["../../../../src/components/display/SkillTree/SkillTree.tsx"],"sourcesContent":["import { forwardRef, useId, useState, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport styles from \"./SkillTree.module.css\";\nimport type { SkillTreeProps } from \"./SkillTree.types\";\nimport { gridSize, skillState } from \"./SkillTree.utils\";\n\nconst STATE_TEXT = { locked: \"locked\", available: \"available\", unlocked: \"unlocked\" } as const;\n\n/**\n * Skill tree: nodes on a grid joined to their prerequisites. Unlocked skills\n * glow, available ones can be bought with skill points, locked ones show what\n * they need. Selecting a node shows its details and Unlock button.\n */\nexport const SkillTree = forwardRef<HTMLDivElement, SkillTreeProps>(function SkillTree(\n { skills, unlocked, points, onUnlock, defaultValue, label = \"Skill tree\", className, ...rest },\n ref,\n) {\n const detailId = useId();\n const [selectedId, setSelectedId] = useState(defaultValue ?? skills[0]?.id ?? \"\");\n const unlockedSet = new Set(unlocked);\n const byId = new Map(skills.map((skill) => [skill.id, skill]));\n const { rows, columns } = gridSize(skills);\n const selected = byId.get(selectedId);\n const selectedState = selected ? skillState(selected, unlockedSet) : undefined;\n const selectedCost = selected?.cost ?? 1;\n const affordable = points === undefined || points >= selectedCost;\n const missing =\n selected && selectedState === \"locked\"\n ? (selected.requires ?? [])\n .filter((id) => !unlockedSet.has(id))\n .map((id) => byId.get(id)?.label ?? id)\n : [];\n\n // Connector centres in grid units (0.5 = middle of the first cell).\n const edges = skills.flatMap((skill) =>\n (skill.requires ?? []).flatMap((id) => {\n const from = byId.get(id);\n return from\n ? [{ key: `${id}-${skill.id}`, from, to: skill, lit: unlockedSet.has(skill.id) }]\n : [];\n }),\n );\n\n return (\n <div ref={ref} role=\"group\" aria-label={label} className={cx(styles.tree, className)} {...rest}>\n {points !== undefined ? (\n <p className={styles.points}>\n Skill points: <strong>{points}</strong>\n </p>\n ) : null}\n <div\n className={styles.board}\n style={{ \"--block-skill-rows\": rows, \"--block-skill-columns\": columns } as CSSProperties}\n >\n <svg\n className={styles.lines}\n viewBox={`0 0 ${columns} ${rows}`}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n {edges.map(({ key, from, to, lit }) => (\n <line\n key={key}\n x1={from.column - 0.5}\n y1={from.row - 0.5}\n x2={to.column - 0.5}\n y2={to.row - 0.5}\n data-lit={lit || undefined}\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n </svg>\n <ul className={styles.nodes} aria-label=\"Skills\">\n {skills.map((skill) => {\n const state = skillState(skill, unlockedSet);\n return (\n <li\n key={skill.id}\n className={styles.cell}\n style={\n {\n \"--block-skill-row\": skill.row,\n \"--block-skill-col\": skill.column,\n } as CSSProperties\n }\n >\n <button\n type=\"button\"\n className={styles.node}\n data-state={state}\n aria-pressed={skill.id === selectedId}\n aria-controls={detailId}\n aria-label={`${skill.label}, ${STATE_TEXT[state]}`}\n onClick={() => setSelectedId(skill.id)}\n >\n <span className={styles.icon} aria-hidden=\"true\">\n {skill.icon}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n <section\n id={detailId}\n className={styles.detail}\n aria-live=\"polite\"\n aria-label=\"Skill details\"\n >\n {selected ? (\n <>\n <p className={styles.name}>\n {selected.label}{\" \"}\n <span className={styles.state} data-state={selectedState}>\n {selectedState}\n </span>\n </p>\n {selected.description ? (\n <p className={styles.description}>{selected.description}</p>\n ) : null}\n {missing.length > 0 ? (\n <p className={styles.requires}>Requires: {missing.join(\", \")}</p>\n ) : null}\n {selectedState === \"available\" && onUnlock ? (\n <BlockButton\n variant=\"emerald\"\n size=\"sm\"\n disabled={!affordable}\n onClick={() => onUnlock(selected.id)}\n >\n {affordable\n ? `Unlock (${selectedCost} ${selectedCost === 1 ? \"point\" : \"points\"})`\n : `Needs ${selectedCost} ${selectedCost === 1 ? \"point\" : \"points\"}`}\n </BlockButton>\n ) : null}\n </>\n ) : null}\n </section>\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"SkillTree.js","names":["styles","_Fragment"],"sources":["../../../../src/components/display/SkillTree/SkillTree.tsx"],"sourcesContent":["import { forwardRef, useId, useState, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport styles from \"./SkillTree.module.css\";\nimport type { SkillTreeProps } from \"./SkillTree.types\";\nimport { gridSize, skillState } from \"./SkillTree.utils\";\n\nconst STATE_TEXT = { locked: \"locked\", available: \"available\", unlocked: \"unlocked\" } as const;\n\n/**\n * Skill tree: nodes on a grid joined to their prerequisites. Unlocked skills\n * glow, available ones can be bought with skill points, locked ones show what\n * they need. Selecting a node shows its details and Unlock button.\n */\nexport const SkillTree = forwardRef<HTMLDivElement, SkillTreeProps>(function SkillTree(\n { skills, unlocked, points, onUnlock, defaultValue, label = \"Skill tree\", className, ...rest },\n ref,\n) {\n const detailId = useId();\n const [selectedId, setSelectedId] = useState(defaultValue ?? skills[0]?.id ?? \"\");\n const unlockedSet = new Set(unlocked);\n const byId = new Map(skills.map((skill) => [skill.id, skill]));\n const { rows, columns } = gridSize(skills);\n const selected = byId.get(selectedId);\n const selectedState = selected ? skillState(selected, unlockedSet) : undefined;\n const selectedCost = selected?.cost ?? 1;\n const affordable = points === undefined || points >= selectedCost;\n const missing =\n selected && selectedState === \"locked\"\n ? (selected.requires ?? [])\n .filter((id) => !unlockedSet.has(id))\n .map((id) => byId.get(id)?.label ?? id)\n : [];\n\n // Connector centres in grid units (0.5 = middle of the first cell).\n const edges = skills.flatMap((skill) =>\n (skill.requires ?? []).flatMap((id) => {\n const from = byId.get(id);\n return from\n ? [{ key: `${id}-${skill.id}`, from, to: skill, lit: unlockedSet.has(skill.id) }]\n : [];\n }),\n );\n\n return (\n <div ref={ref} role=\"group\" aria-label={label} className={cx(styles.tree, className)} {...rest}>\n {points !== undefined ? (\n <p className={styles.points}>\n Skill points: <strong>{points}</strong>\n </p>\n ) : null}\n <div\n className={styles.board}\n style={{ \"--block-skill-rows\": rows, \"--block-skill-columns\": columns } as CSSProperties}\n >\n <svg\n className={styles.lines}\n viewBox={`0 0 ${columns} ${rows}`}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n {edges.map(({ key, from, to, lit }) => (\n <line\n key={key}\n x1={from.column - 0.5}\n y1={from.row - 0.5}\n x2={to.column - 0.5}\n y2={to.row - 0.5}\n data-lit={lit || undefined}\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n </svg>\n <ul className={styles.nodes} aria-label=\"Skills\">\n {skills.map((skill) => {\n const state = skillState(skill, unlockedSet);\n return (\n <li\n key={skill.id}\n className={styles.cell}\n style={\n {\n \"--block-skill-row\": skill.row,\n \"--block-skill-col\": skill.column,\n } as CSSProperties\n }\n >\n <button\n type=\"button\"\n className={styles.node}\n data-state={state}\n aria-pressed={skill.id === selectedId}\n aria-controls={detailId}\n aria-label={`${skill.label}, ${STATE_TEXT[state]}`}\n onClick={() => setSelectedId(skill.id)}\n >\n <span className={styles.icon} aria-hidden=\"true\">\n {skill.icon}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n <section\n id={detailId}\n className={styles.detail}\n aria-live=\"polite\"\n aria-label=\"Skill details\"\n >\n {selected ? (\n <>\n <p className={styles.name}>\n {selected.label}{\" \"}\n <span className={styles.state} data-state={selectedState}>\n {selectedState}\n </span>\n </p>\n {selected.description ? (\n <p className={styles.description}>{selected.description}</p>\n ) : null}\n {missing.length > 0 ? (\n <p className={styles.requires}>Requires: {missing.join(\", \")}</p>\n ) : null}\n {selectedState === \"available\" && onUnlock ? (\n <BlockButton\n variant=\"emerald\"\n size=\"sm\"\n disabled={!affordable}\n onClick={() => onUnlock(selected.id)}\n >\n {affordable\n ? `Unlock (${selectedCost} ${selectedCost === 1 ? \"point\" : \"points\"})`\n : `Needs ${selectedCost} ${selectedCost === 1 ? \"point\" : \"points\"}`}\n </BlockButton>\n ) : null}\n </>\n ) : null}\n </section>\n </div>\n );\n});\n"],"mappings":";;;;;;;AAOA,IAAM,aAAa;CAAE,QAAQ;CAAU,WAAW;CAAa,UAAU;AAAW;;;;;;AAOpF,IAAa,YAAY,WAA2C,SAAS,UAC3E,EAAE,QAAQ,UAAU,QAAQ,UAAU,cAAc,QAAQ,cAAc,WAAW,GAAG,QACxF,KACA;CACA,MAAM,WAAW,MAAM;CACvB,MAAM,CAAC,YAAY,iBAAiB,SAAS,gBAAgB,OAAO,EAAE,EAAE,MAAM,EAAE;CAChF,MAAM,cAAc,IAAI,IAAI,QAAQ;CACpC,MAAM,OAAO,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;CAC7D,MAAM,EAAE,MAAM,YAAY,SAAS,MAAM;CACzC,MAAM,WAAW,KAAK,IAAI,UAAU;CACpC,MAAM,gBAAgB,WAAW,WAAW,UAAU,WAAW,IAAI,KAAA;CACrE,MAAM,eAAe,UAAU,QAAQ;CACvC,MAAM,aAAa,WAAW,KAAA,KAAa,UAAU;CACrD,MAAM,UACJ,YAAY,kBAAkB,YACzB,SAAS,YAAY,CAAC,EAAA,CACpB,QAAQ,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CACpC,KAAK,OAAO,KAAK,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,IACxC,CAAC;CAGP,MAAM,QAAQ,OAAO,SAAS,WAC3B,MAAM,YAAY,CAAC,EAAA,CAAG,SAAS,OAAO;EACrC,MAAM,OAAO,KAAK,IAAI,EAAE;EACxB,OAAO,OACH,CAAC;GAAE,KAAK,GAAG,GAAG,GAAG,MAAM;GAAM;GAAM,IAAI;GAAO,KAAK,YAAY,IAAI,MAAM,EAAE;EAAE,CAAC,IAC9E,CAAC;CACP,CAAC,CACH;CAEA,OACE,qBAAC,OAAD;EAAU;EAAK,MAAK;EAAQ,cAAY;EAAO,WAAW,GAAGA,yBAAO,MAAM,SAAS;EAAG,GAAI;EAA1F,UAAA;GACG,WAAW,KAAA,IACV,qBAAC,KAAD;IAAG,WAAWA,yBAAO;IAArB,UAAA,CAA6B,kBACb,oBAAC,UAAD,EAAA,UAAS,OAAe,CAAA,CACrC;GACD,CAAA,IAAA;GACJ,qBAAC,OAAD;IACE,WAAWA,yBAAO;IAClB,OAAO;KAAE,sBAAsB;KAAM,yBAAyB;IAAQ;IAFxE,UAAA,CAIE,oBAAC,OAAD;KACE,WAAWA,yBAAO;KAClB,SAAS,OAAO,QAAQ,GAAG;KAC3B,qBAAoB;KACpB,eAAY;KAEX,UAAA,MAAM,KAAK,EAAE,KAAK,MAAM,IAAI,UAC3B,oBAAC,QAAD;MAEE,IAAI,KAAK,SAAS;MAClB,IAAI,KAAK,MAAM;MACf,IAAI,GAAG,SAAS;MAChB,IAAI,GAAG,MAAM;MACb,YAAU,OAAO,KAAA;MACjB,cAAa;KACd,GAPM,GAON,CACF;IACE,CAAA,GACL,oBAAC,MAAD;KAAI,WAAWA,yBAAO;KAAO,cAAW;KACrC,UAAA,OAAO,KAAK,UAAU;MACrB,MAAM,QAAQ,WAAW,OAAO,WAAW;MAC3C,OACE,oBAAC,MAAD;OAEE,WAAWA,yBAAO;OAClB,OACE;QACE,qBAAqB,MAAM;QAC3B,qBAAqB,MAAM;OAC7B;OAGF,UAAA,oBAAC,UAAD;QACE,MAAK;QACL,WAAWA,yBAAO;QAClB,cAAY;QACZ,gBAAc,MAAM,OAAO;QAC3B,iBAAe;QACf,cAAY,GAAG,MAAM,MAAM,IAAI,WAAW;QAC1C,eAAe,cAAc,MAAM,EAAE;QAErC,UAAA,oBAAC,QAAD;SAAM,WAAWA,yBAAO;SAAM,eAAY;SACvC,UAAA,MAAM;QACH,CAAA;OACA,CAAA;MACN,GAtBG,MAAM,EAsBT;KAER,CAAC;IACC,CAAA,CACD;;GACL,oBAAC,WAAD;IACE,IAAI;IACJ,WAAWA,yBAAO;IAClB,aAAU;IACV,cAAW;IAEV,UAAA,WACC,qBAAAC,YAAA,EAAA,UAAA;KACE,qBAAC,KAAD;MAAG,WAAWD,yBAAO;MAArB,UAAA;OACG,SAAS;OAAO;OACjB,oBAAC,QAAD;QAAM,WAAWA,yBAAO;QAAO,cAAY;QACxC,UAAA;OACG,CAAA;MACL;;KACF,SAAS,cACR,oBAAC,KAAD;MAAG,WAAWA,yBAAO;MAAc,UAAA,SAAS;KAAe,CAAA,IACzD;KACH,QAAQ,SAAS,IAChB,qBAAC,KAAD;MAAG,WAAWA,yBAAO;MAArB,UAAA,CAA+B,cAAW,QAAQ,KAAK,IAAI,CAAK;KAC9D,CAAA,IAAA;KACH,kBAAkB,eAAe,WAChC,oBAAC,aAAD;MACE,SAAQ;MACR,MAAK;MACL,UAAU,CAAC;MACX,eAAe,SAAS,SAAS,EAAE;MAElC,UAAA,aACG,WAAW,aAAa,GAAG,iBAAiB,IAAI,UAAU,SAAS,KACnE,SAAS,aAAa,GAAG,iBAAiB,IAAI,UAAU;KACjD,CAAA,IACX;IACJ,EAAA,CAAA,IACA;GACG,CAAA;EACN;;AAET,CAAC"}
@@ -2,4 +2,7 @@ export * from "./BlockBadge";
2
2
  export * from "./BlockTooltip";
3
3
  export * from "./BlockTable";
4
4
  export * from "./SkillTree";
5
+ export * from "./Avatar";
6
+ export * from "./Popover";
7
+ export * from "./Kbd";
5
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/display/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/display/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { BlockButton } from "../../actions/BlockButton/BlockButton.js";
2
2
  import { BlockModal } from "../Modal/BlockModal.js";
3
3
  import { useRef } from "react";
4
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/feedback/ConfirmDialog/ConfirmDialog.tsx
6
6
  /**
7
7
  * Confirmation built on `BlockModal` with `role="alertdialog"`. For the
@@ -25,7 +25,7 @@ function ConfirmDialog({ open, title, description, confirmText = "Confirm", canc
25
25
  initialFocusRef: danger ? cancelRef : confirmRef,
26
26
  className,
27
27
  "data-variant": variant,
28
- footer: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(BlockButton, {
28
+ footer: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(BlockButton, {
29
29
  ref: cancelRef,
30
30
  variant: "stone",
31
31
  onClick: onCancel,
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmDialog.js","names":["_Fragment"],"sources":["../../../../src/components/feedback/ConfirmDialog/ConfirmDialog.tsx"],"sourcesContent":["import { useRef } from \"react\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockModal } from \"../Modal/BlockModal\";\nimport type { ConfirmDialogProps } from \"./ConfirmDialog.types\";\n\n/**\n * Confirmation built on `BlockModal` with `role=\"alertdialog\"`. For the\n * `danger` variant the safe action (Cancel) receives focus first.\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmText = \"Confirm\",\n cancelText = \"Cancel\",\n variant = \"default\",\n onConfirm,\n onCancel,\n loading = false,\n icon,\n children,\n className,\n}: ConfirmDialogProps) {\n const cancelRef = useRef<HTMLButtonElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n const danger = variant === \"danger\";\n\n return (\n <BlockModal\n open={open}\n onClose={onCancel}\n title={title}\n description={description}\n role=\"alertdialog\"\n size=\"sm\"\n icon={icon}\n hideCloseButton\n closeOnOverlayClick={!loading}\n closeOnEscape={!loading}\n initialFocusRef={danger ? cancelRef : confirmRef}\n className={className}\n data-variant={variant}\n footer={\n <>\n <BlockButton ref={cancelRef} variant=\"stone\" onClick={onCancel} disabled={loading}>\n {cancelText}\n </BlockButton>\n <BlockButton\n ref={confirmRef}\n variant={danger ? \"redstone\" : \"grass\"}\n onClick={onConfirm}\n loading={loading}\n >\n {confirmText}\n </BlockButton>\n </>\n }\n >\n {children}\n </BlockModal>\n );\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,cAAc,EAC5B,MACA,OACA,aACA,cAAc,WACd,aAAa,UACb,UAAU,WACV,WACA,UACA,UAAU,OACV,MACA,UACA,aACqB;CACrB,MAAM,YAAY,OAA0B,IAAI;CAChD,MAAM,aAAa,OAA0B,IAAI;CACjD,MAAM,SAAS,YAAY;CAE3B,OACE,oBAAC,YAAD;EACQ;EACN,SAAS;EACF;EACM;EACb,MAAK;EACL,MAAK;EACC;EACN,iBAAA;EACA,qBAAqB,CAAC;EACtB,eAAe,CAAC;EAChB,iBAAiB,SAAS,YAAY;EAC3B;EACX,gBAAc;EACd,QACE,qBAAAA,UAAA,EAAA,UAAA,CACE,oBAAC,aAAD;GAAa,KAAK;GAAW,SAAQ;GAAQ,SAAS;GAAU,UAAU;GACvE,UAAA;EACU,CAAA,GACb,oBAAC,aAAD;GACE,KAAK;GACL,SAAS,SAAS,aAAa;GAC/B,SAAS;GACA;GAER,UAAA;EACU,CAAA,CACb,EAAA,CAAA;EAGH;CACS,CAAA;AAEhB"}
1
+ {"version":3,"file":"ConfirmDialog.js","names":["_Fragment"],"sources":["../../../../src/components/feedback/ConfirmDialog/ConfirmDialog.tsx"],"sourcesContent":["import { useRef } from \"react\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockModal } from \"../Modal/BlockModal\";\nimport type { ConfirmDialogProps } from \"./ConfirmDialog.types\";\n\n/**\n * Confirmation built on `BlockModal` with `role=\"alertdialog\"`. For the\n * `danger` variant the safe action (Cancel) receives focus first.\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmText = \"Confirm\",\n cancelText = \"Cancel\",\n variant = \"default\",\n onConfirm,\n onCancel,\n loading = false,\n icon,\n children,\n className,\n}: ConfirmDialogProps) {\n const cancelRef = useRef<HTMLButtonElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n const danger = variant === \"danger\";\n\n return (\n <BlockModal\n open={open}\n onClose={onCancel}\n title={title}\n description={description}\n role=\"alertdialog\"\n size=\"sm\"\n icon={icon}\n hideCloseButton\n closeOnOverlayClick={!loading}\n closeOnEscape={!loading}\n initialFocusRef={danger ? cancelRef : confirmRef}\n className={className}\n data-variant={variant}\n footer={\n <>\n <BlockButton ref={cancelRef} variant=\"stone\" onClick={onCancel} disabled={loading}>\n {cancelText}\n </BlockButton>\n <BlockButton\n ref={confirmRef}\n variant={danger ? \"redstone\" : \"grass\"}\n onClick={onConfirm}\n loading={loading}\n >\n {confirmText}\n </BlockButton>\n </>\n }\n >\n {children}\n </BlockModal>\n );\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,cAAc,EAC5B,MACA,OACA,aACA,cAAc,WACd,aAAa,UACb,UAAU,WACV,WACA,UACA,UAAU,OACV,MACA,UACA,aACqB;CACrB,MAAM,YAAY,OAA0B,IAAI;CAChD,MAAM,aAAa,OAA0B,IAAI;CACjD,MAAM,SAAS,YAAY;CAE3B,OACE,oBAAC,YAAD;EACQ;EACN,SAAS;EACF;EACM;EACb,MAAK;EACL,MAAK;EACC;EACN,iBAAA;EACA,qBAAqB,CAAC;EACtB,eAAe,CAAC;EAChB,iBAAiB,SAAS,YAAY;EAC3B;EACX,gBAAc;EACd,QACE,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,aAAD;GAAa,KAAK;GAAW,SAAQ;GAAQ,SAAS;GAAU,UAAU;GACvE,UAAA;EACU,CAAA,GACb,oBAAC,aAAD;GACE,KAAK;GACL,SAAS,SAAS,aAAa;GAC/B,SAAS;GACA;GAER,UAAA;EACU,CAAA,CACb,EAAA,CAAA;EAGH;CACS,CAAA;AAEhB"}
@@ -0,0 +1,7 @@
1
+ import type { DrawerProps } from "./Drawer.types";
2
+ /**
3
+ * Panel that slides in from an edge (inventory, settings, mobile menu). Modal
4
+ * like `BlockModal`: focus trap, Escape, overlay click and focus restoration.
5
+ */
6
+ export declare const Drawer: import("react").ForwardRefExoticComponent<DrawerProps & import("react").RefAttributes<HTMLDivElement>>;
7
+ //# sourceMappingURL=Drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Drawer/Drawer.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,MAAM,wGAsEjB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { cx } from "../../../utils/cx.js";
2
+ import { usePortalContainer } from "../../../provider/context.js";
3
+ import { mergeRefs } from "../../../utils/refs.js";
4
+ import { useFocusTrap } from "../../../hooks/useFocusTrap.js";
5
+ import { useScrollLock } from "../../../hooks/useScrollLock.js";
6
+ import Drawer_module_default from "./Drawer.module.js";
7
+ import { forwardRef, useId, useRef } from "react";
8
+ import { createPortal } from "react-dom";
9
+ import { CloseIcon } from "@malilion/block-ui-icons";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ //#region src/components/feedback/Drawer/Drawer.tsx
12
+ /**
13
+ * Panel that slides in from an edge (inventory, settings, mobile menu). Modal
14
+ * like `BlockModal`: focus trap, Escape, overlay click and focus restoration.
15
+ */
16
+ var Drawer = forwardRef(function Drawer({ open, onClose, title, children, footer, side = "right", size = "md", closeOnOverlayClick = true, closeOnEscape = true, initialFocusRef, className, ...rest }, ref) {
17
+ const container = usePortalContainer();
18
+ const panelRef = useRef(null);
19
+ const titleId = useId();
20
+ useFocusTrap(panelRef, open && container !== null, { initialFocus: initialFocusRef });
21
+ useScrollLock(open);
22
+ if (!open || !container) return null;
23
+ const handleKeyDown = (event) => {
24
+ if (event.key === "Escape" && closeOnEscape) {
25
+ event.stopPropagation();
26
+ onClose();
27
+ }
28
+ };
29
+ const handleOverlayClick = (event) => {
30
+ if (closeOnOverlayClick && event.target === event.currentTarget) onClose();
31
+ };
32
+ return createPortal(/* @__PURE__ */ jsx("div", {
33
+ role: "presentation",
34
+ className: Drawer_module_default.overlay,
35
+ "data-side": side,
36
+ onMouseDown: handleOverlayClick,
37
+ onKeyDown: handleKeyDown,
38
+ children: /* @__PURE__ */ jsxs("div", {
39
+ ref: mergeRefs(panelRef, ref),
40
+ role: "dialog",
41
+ "aria-modal": "true",
42
+ "aria-labelledby": titleId,
43
+ tabIndex: -1,
44
+ "data-side": side,
45
+ "data-size": size,
46
+ className: cx(Drawer_module_default.drawer, className),
47
+ ...rest,
48
+ children: [
49
+ /* @__PURE__ */ jsxs("div", {
50
+ className: Drawer_module_default.header,
51
+ children: [/* @__PURE__ */ jsx("h2", {
52
+ id: titleId,
53
+ className: Drawer_module_default.title,
54
+ children: title
55
+ }), /* @__PURE__ */ jsx("button", {
56
+ type: "button",
57
+ className: Drawer_module_default.close,
58
+ "aria-label": "Close",
59
+ onClick: onClose,
60
+ children: /* @__PURE__ */ jsx(CloseIcon, { size: 16 })
61
+ })]
62
+ }),
63
+ /* @__PURE__ */ jsx("div", {
64
+ className: Drawer_module_default.body,
65
+ children
66
+ }),
67
+ footer ? /* @__PURE__ */ jsx("div", {
68
+ className: Drawer_module_default.footer,
69
+ children: footer
70
+ }) : null
71
+ ]
72
+ })
73
+ }), container);
74
+ });
75
+ //#endregion
76
+ export { Drawer };
77
+
78
+ //# sourceMappingURL=Drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer.js","names":["styles"],"sources":["../../../../src/components/feedback/Drawer/Drawer.tsx"],"sourcesContent":["import { CloseIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId, useRef, type KeyboardEvent, type MouseEvent } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useFocusTrap } from \"../../../hooks/useFocusTrap\";\nimport { useScrollLock } from \"../../../hooks/useScrollLock\";\nimport { usePortalContainer } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { mergeRefs } from \"../../../utils/refs\";\nimport styles from \"./Drawer.module.css\";\nimport type { DrawerProps } from \"./Drawer.types\";\n\n/**\n * Panel that slides in from an edge (inventory, settings, mobile menu). Modal\n * like `BlockModal`: focus trap, Escape, overlay click and focus restoration.\n */\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(function Drawer(\n {\n open,\n onClose,\n title,\n children,\n footer,\n side = \"right\",\n size = \"md\",\n closeOnOverlayClick = true,\n closeOnEscape = true,\n initialFocusRef,\n className,\n ...rest\n },\n ref,\n) {\n const container = usePortalContainer();\n const panelRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n\n useFocusTrap(panelRef, open && container !== null, { initialFocus: initialFocusRef });\n useScrollLock(open);\n\n if (!open || !container) return null;\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\" && closeOnEscape) {\n event.stopPropagation();\n onClose();\n }\n };\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (closeOnOverlayClick && event.target === event.currentTarget) onClose();\n };\n\n return createPortal(\n <div\n role=\"presentation\"\n className={styles.overlay}\n data-side={side}\n onMouseDown={handleOverlayClick}\n onKeyDown={handleKeyDown}\n >\n <div\n ref={mergeRefs(panelRef, ref)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n data-side={side}\n data-size={size}\n className={cx(styles.drawer, className)}\n {...rest}\n >\n <div className={styles.header}>\n <h2 id={titleId} className={styles.title}>\n {title}\n </h2>\n <button type=\"button\" className={styles.close} aria-label=\"Close\" onClick={onClose}>\n <CloseIcon size={16} />\n </button>\n </div>\n <div className={styles.body}>{children}</div>\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n </div>,\n container,\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;AAeA,IAAa,SAAS,WAAwC,SAAS,OACrE,EACE,MACA,SACA,OACA,UACA,QACA,OAAO,SACP,OAAO,MACP,sBAAsB,MACtB,gBAAgB,MAChB,iBACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,YAAY,mBAAmB;CACrC,MAAM,WAAW,OAAuB,IAAI;CAC5C,MAAM,UAAU,MAAM;CAEtB,aAAa,UAAU,QAAQ,cAAc,MAAM,EAAE,cAAc,gBAAgB,CAAC;CACpF,cAAc,IAAI;CAElB,IAAI,CAAC,QAAQ,CAAC,WAAW,OAAO;CAEhC,MAAM,iBAAiB,UAAyC;EAC9D,IAAI,MAAM,QAAQ,YAAY,eAAe;GAC3C,MAAM,gBAAgB;GACtB,QAAQ;EACV;CACF;CAEA,MAAM,sBAAsB,UAAsC;EAChE,IAAI,uBAAuB,MAAM,WAAW,MAAM,eAAe,QAAQ;CAC3E;CAEA,OAAO,aACL,oBAAC,OAAD;EACE,MAAK;EACL,WAAWA,sBAAO;EAClB,aAAW;EACX,aAAa;EACb,WAAW;EAEX,UAAA,qBAAC,OAAD;GACE,KAAK,UAAU,UAAU,GAAG;GAC5B,MAAK;GACL,cAAW;GACX,mBAAiB;GACjB,UAAU;GACV,aAAW;GACX,aAAW;GACX,WAAW,GAAGA,sBAAO,QAAQ,SAAS;GACtC,GAAI;GATN,UAAA;IAWE,qBAAC,OAAD;KAAK,WAAWA,sBAAO;KAAvB,UAAA,CACE,oBAAC,MAAD;MAAI,IAAI;MAAS,WAAWA,sBAAO;MAChC,UAAA;KACC,CAAA,GACJ,oBAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,sBAAO;MAAO,cAAW;MAAQ,SAAS;MACzE,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;KAChB,CAAA,CACL;;IACL,oBAAC,OAAD;KAAK,WAAWA,sBAAO;KAAO;IAAc,CAAA;IAC3C,SAAS,oBAAC,OAAD;KAAK,WAAWA,sBAAO;KAAS,UAAA;IAAY,CAAA,IAAI;GACvD;;CACF,CAAA,GACL,SACF;AACF,CAAC"}
@@ -0,0 +1,25 @@
1
+ //#region src/components/feedback/Drawer/Drawer.module.css
2
+ var overlay = "block-overlay-MaF41";
3
+ var drawer = "block-drawer-aWDC6";
4
+ var header = "block-header-FheCx";
5
+ var title = "block-title-4QE9I";
6
+ var close = "block-close-fdVrq";
7
+ var body = "block-body-aFN-w";
8
+ var footer = "block-footer-m9z0P";
9
+ var Drawer_module_default = {
10
+ overlay,
11
+ "block-drawer-fade": "block-block-drawer-fade-4rcmM",
12
+ drawer,
13
+ "block-drawer-in-right": "block-block-drawer-in-right-Krar9",
14
+ "block-drawer-in-left": "block-block-drawer-in-left-EnlSn",
15
+ "block-drawer-in-bottom": "block-block-drawer-in-bottom-yyZ8z",
16
+ header,
17
+ title,
18
+ close,
19
+ body,
20
+ footer
21
+ };
22
+ //#endregion
23
+ export { body, close, Drawer_module_default as default, drawer, footer, header, overlay, title };
24
+
25
+ //# sourceMappingURL=Drawer.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer.module.js","names":[],"sources":["../../../../src/components/feedback/Drawer/Drawer.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n z-index: var(--block-z-modal);\n display: flex;\n justify-content: flex-end;\n background-color: var(--block-overlay);\n animation: block-drawer-fade var(--block-duration-fast) steps(3, end);\n}\n\n.overlay[data-side=\"left\"] {\n justify-content: flex-start;\n}\n\n.overlay[data-side=\"bottom\"] {\n flex-direction: column;\n justify-content: flex-end;\n}\n\n.drawer {\n --drawer-size: 360px;\n display: flex;\n flex-direction: column;\n width: min(var(--drawer-size), 100%);\n height: 100%;\n color: var(--block-text);\n background-color: var(--block-surface);\n background-image:\n linear-gradient(\n color-mix(in srgb, var(--block-surface) 88%, transparent),\n color-mix(in srgb, var(--block-surface) 88%, transparent)\n ),\n var(--block-texture);\n background-size:\n auto,\n 64px 64px;\n border-left: var(--block-border-width) solid var(--block-border);\n box-shadow: var(--block-shadow-bevel);\n outline: none;\n animation: block-drawer-in-right var(--block-duration-normal) steps(4, end);\n}\n\n.drawer[data-size=\"sm\"] {\n --drawer-size: 280px;\n}\n\n.drawer[data-size=\"lg\"] {\n --drawer-size: 520px;\n}\n\n.drawer[data-side=\"left\"] {\n border-left: 0;\n border-right: var(--block-border-width) solid var(--block-border);\n animation-name: block-drawer-in-left;\n}\n\n.drawer[data-side=\"bottom\"] {\n --drawer-size: 50dvh;\n width: 100%;\n height: min(var(--drawer-size), 100%);\n border-left: 0;\n border-top: var(--block-border-width) solid var(--block-border);\n animation-name: block-drawer-in-bottom;\n}\n\n.drawer[data-side=\"bottom\"][data-size=\"sm\"] {\n --drawer-size: 33dvh;\n}\n\n.drawer[data-side=\"bottom\"][data-size=\"lg\"] {\n --drawer-size: 80dvh;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: var(--block-space-2);\n margin: 3px 3px 0;\n padding: var(--block-space-2) var(--block-space-3);\n background-color: var(--block-surface-header);\n border-bottom: var(--block-border-width-thin) solid var(--block-border);\n}\n\n.title {\n flex: 1;\n margin: 0;\n font-family: var(--block-font-display);\n font-size: var(--block-font-size-lg);\n font-weight: var(--block-font-weight-bold);\n letter-spacing: var(--block-letter-spacing-wide);\n text-transform: uppercase;\n text-shadow: var(--block-shadow-text);\n}\n\n.close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n color: var(--block-text);\n background-color: var(--block-slot);\n border: var(--block-border-width-thin) solid var(--block-border);\n box-shadow: var(--block-shadow-inset);\n cursor: pointer;\n}\n\n.close:focus-visible {\n outline: 3px solid var(--block-focus);\n outline-offset: 2px;\n}\n\n.body {\n flex: 1;\n min-height: 0;\n padding: var(--block-space-4);\n overflow-y: auto;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--block-space-2);\n padding: var(--block-space-3) var(--block-space-4);\n border-top: var(--block-border-width-thin) solid var(--block-border);\n}\n\n@keyframes block-drawer-fade {\n from {\n opacity: 0;\n }\n}\n\n@keyframes block-drawer-in-right {\n from {\n transform: translateX(100%);\n }\n}\n\n@keyframes block-drawer-in-left {\n from {\n transform: translateX(-100%);\n }\n}\n\n@keyframes block-drawer-in-bottom {\n from {\n transform: translateY(100%);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { HTMLAttributes, ReactNode, RefObject } from "react";
2
+ export interface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
3
+ open: boolean;
4
+ /** Called on Escape, overlay click or the close button. */
5
+ onClose: () => void;
6
+ title: ReactNode;
7
+ children?: ReactNode;
8
+ /** Action row pinned to the bottom. */
9
+ footer?: ReactNode;
10
+ /** Edge the drawer slides from. @default "right" */
11
+ side?: "left" | "right" | "bottom";
12
+ /** Width (or height for `bottom`). @default "md" */
13
+ size?: "sm" | "md" | "lg";
14
+ /** @default true */
15
+ closeOnOverlayClick?: boolean;
16
+ /** @default true */
17
+ closeOnEscape?: boolean;
18
+ /** Element focused when the drawer opens. Defaults to the first focusable element. */
19
+ initialFocusRef?: RefObject<HTMLElement | null>;
20
+ }
21
+ //# sourceMappingURL=Drawer.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer.types.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Drawer/Drawer.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElE,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAChF,IAAI,EAAE,OAAO,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,uCAAuC;IACvC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnC,oDAAoD;IACpD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,oBAAoB;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sFAAsF;IACtF,eAAe,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACjD"}
@@ -0,0 +1,3 @@
1
+ export { Drawer } from "./Drawer";
2
+ export type { DrawerProps } from "./Drawer.types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Drawer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { EmptyStateProps } from "./EmptyState.types";
2
+ /** Placeholder for an empty list or search: icon, title, description and an action. */
3
+ export declare const EmptyState: import("react").ForwardRefExoticComponent<EmptyStateProps & import("react").RefAttributes<HTMLDivElement>>;
4
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/EmptyState/EmptyState.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,uFAAuF;AACvF,eAAO,MAAM,UAAU,4GAcrB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { cx } from "../../../utils/cx.js";
2
+ import EmptyState_module_default from "./EmptyState.module.js";
3
+ import { createElement, forwardRef } from "react";
4
+ import { ChestIcon } from "@malilion/block-ui-icons";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/feedback/EmptyState/EmptyState.tsx
7
+ /** Placeholder for an empty list or search: icon, title, description and an action. */
8
+ var EmptyState = forwardRef(function EmptyState({ title, description, icon, action, headingLevel = 3, size = "md", className, ...rest }, ref) {
9
+ return /* @__PURE__ */ jsxs("div", {
10
+ ref,
11
+ "data-size": size,
12
+ className: cx(EmptyState_module_default.empty, className),
13
+ ...rest,
14
+ children: [
15
+ /* @__PURE__ */ jsx("span", {
16
+ className: EmptyState_module_default.icon,
17
+ "aria-hidden": "true",
18
+ children: icon ?? /* @__PURE__ */ jsx(ChestIcon, { size: size === "sm" ? 32 : 48 })
19
+ }),
20
+ createElement(`h${headingLevel}`, { className: EmptyState_module_default.title }, title),
21
+ description ? /* @__PURE__ */ jsx("p", {
22
+ className: EmptyState_module_default.description,
23
+ children: description
24
+ }) : null,
25
+ action ? /* @__PURE__ */ jsx("div", {
26
+ className: EmptyState_module_default.action,
27
+ children: action
28
+ }) : null
29
+ ]
30
+ });
31
+ });
32
+ //#endregion
33
+ export { EmptyState };
34
+
35
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","names":["styles"],"sources":["../../../../src/components/feedback/EmptyState/EmptyState.tsx"],"sourcesContent":["import { ChestIcon } from \"@malilion/block-ui-icons\";\nimport { createElement, forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./EmptyState.module.css\";\nimport type { EmptyStateProps } from \"./EmptyState.types\";\n\n/** Placeholder for an empty list or search: icon, title, description and an action. */\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n { title, description, icon, action, headingLevel = 3, size = \"md\", className, ...rest },\n ref,\n) {\n return (\n <div ref={ref} data-size={size} className={cx(styles.empty, className)} {...rest}>\n <span className={styles.icon} aria-hidden=\"true\">\n {icon ?? <ChestIcon size={size === \"sm\" ? 32 : 48} />}\n </span>\n {createElement(`h${headingLevel}`, { className: styles.title }, title)}\n {description ? <p className={styles.description}>{description}</p> : null}\n {action ? <div className={styles.action}>{action}</div> : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;AAOA,IAAa,aAAa,WAA4C,SAAS,WAC7E,EAAE,OAAO,aAAa,MAAM,QAAQ,eAAe,GAAG,OAAO,MAAM,WAAW,GAAG,QACjF,KACA;CACA,OACE,qBAAC,OAAD;EAAU;EAAK,aAAW;EAAM,WAAW,GAAGA,0BAAO,OAAO,SAAS;EAAG,GAAI;EAA5E,UAAA;GACE,oBAAC,QAAD;IAAM,WAAWA,0BAAO;IAAM,eAAY;IACvC,UAAA,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,OAAO,KAAK,GAAK,CAAA;GAChD,CAAA;GACL,cAAc,IAAI,gBAAgB,EAAE,WAAWA,0BAAO,MAAM,GAAG,KAAK;GACpE,cAAc,oBAAC,KAAD;IAAG,WAAWA,0BAAO;IAAc,UAAA;GAAe,CAAA,IAAI;GACpE,SAAS,oBAAC,OAAD;IAAK,WAAWA,0BAAO;IAAS,UAAA;GAAY,CAAA,IAAI;EACvD;;AAET,CAAC"}
@@ -0,0 +1,17 @@
1
+ //#region src/components/feedback/EmptyState/EmptyState.module.css
2
+ var empty = "block-empty-CypAE";
3
+ var icon = "block-icon-RT29d";
4
+ var title = "block-title-gsp4I";
5
+ var description = "block-description-es-JM";
6
+ var action = "block-action-TqLZE";
7
+ var EmptyState_module_default = {
8
+ empty,
9
+ icon,
10
+ title,
11
+ description,
12
+ action
13
+ };
14
+ //#endregion
15
+ export { action, EmptyState_module_default as default, description, empty, icon, title };
16
+
17
+ //# sourceMappingURL=EmptyState.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.module.js","names":[],"sources":["../../../../src/components/feedback/EmptyState/EmptyState.module.css"],"sourcesContent":[".empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--block-space-2);\n width: 100%;\n padding: var(--block-space-8) var(--block-space-4);\n text-align: center;\n color: var(--block-text);\n background-color: var(--block-slot);\n border: var(--block-border-width-thin) dashed var(--block-border);\n}\n\n.empty[data-size=\"sm\"] {\n padding: var(--block-space-4) var(--block-space-3);\n}\n\n.icon {\n display: inline-flex;\n opacity: 0.6;\n filter: grayscale(0.5);\n}\n\n.title {\n margin: 0;\n font-family: var(--block-font-display);\n font-size: var(--block-font-size-md);\n font-weight: var(--block-font-weight-bold);\n letter-spacing: var(--block-letter-spacing-wide);\n text-transform: uppercase;\n text-shadow: var(--block-shadow-text);\n}\n\n.empty[data-size=\"sm\"] .title {\n font-size: var(--block-font-size-sm);\n}\n\n.description {\n max-width: 42ch;\n margin: 0;\n font-size: var(--block-font-size-sm);\n color: var(--block-text-muted);\n}\n\n.action {\n margin-top: var(--block-space-2);\n}\n"],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { HTMLAttributes, ReactNode } from "react";
2
+ export interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
3
+ title: ReactNode;
4
+ description?: ReactNode;
5
+ /** Pixel icon above the title. Defaults to an empty chest. */
6
+ icon?: ReactNode;
7
+ /** Call to action, usually a `BlockButton`. */
8
+ action?: ReactNode;
9
+ /** Heading level of the title. @default 3 */
10
+ headingLevel?: 2 | 3 | 4 | 5 | 6;
11
+ /** @default "md" */
12
+ size?: "sm" | "md";
13
+ }
14
+ //# sourceMappingURL=EmptyState.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.types.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/EmptyState/EmptyState.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACpF,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,oBAAoB;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ export { EmptyState } from "./EmptyState";
2
+ export type { EmptyStateProps } from "./EmptyState.types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/EmptyState/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"BlockModal.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Modal/BlockModal.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D;;;GAGG;AACH,eAAO,MAAM,UAAU,4GAiGrB,CAAC"}
1
+ {"version":3,"file":"BlockModal.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Modal/BlockModal.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,UAAU,4GAwFrB,CAAC"}
@@ -2,13 +2,13 @@ import { cx } from "../../../utils/cx.js";
2
2
  import { usePortalContainer } from "../../../provider/context.js";
3
3
  import { mergeRefs } from "../../../utils/refs.js";
4
4
  import { useFocusTrap } from "../../../hooks/useFocusTrap.js";
5
+ import { useScrollLock } from "../../../hooks/useScrollLock.js";
5
6
  import BlockModal_module_default from "./BlockModal.module.js";
6
- import { forwardRef, useEffect, useId, useRef } from "react";
7
+ import { forwardRef, useId, useRef } from "react";
7
8
  import { createPortal } from "react-dom";
8
9
  import { CloseIcon } from "@malilion/block-ui-icons";
9
10
  import { jsx, jsxs } from "react/jsx-runtime";
10
11
  //#region src/components/feedback/Modal/BlockModal.tsx
11
- var openModals = 0;
12
12
  /**
13
13
  * Accessible modal dialog: focus trap, `Escape` to close, overlay, focus
14
14
  * restoration and `aria-modal` dialog semantics (PRD §45).
@@ -19,16 +19,7 @@ var BlockModal = forwardRef(function BlockModal({ open, onClose, title, descript
19
19
  const titleId = useId();
20
20
  const descriptionId = useId();
21
21
  useFocusTrap(dialogRef, open && container !== null, { initialFocus: initialFocusRef });
22
- useEffect(() => {
23
- if (!open) return void 0;
24
- openModals += 1;
25
- const previous = document.body.style.overflow;
26
- document.body.style.overflow = "hidden";
27
- return () => {
28
- openModals -= 1;
29
- if (openModals === 0) document.body.style.overflow = previous;
30
- };
31
- }, [open]);
22
+ useScrollLock(open);
32
23
  if (!open || !container) return null;
33
24
  const handleKeyDown = (event) => {
34
25
  if (event.key === "Escape" && closeOnEscape) {
@@ -1 +1 @@
1
- {"version":3,"file":"BlockModal.js","names":["styles"],"sources":["../../../../src/components/feedback/Modal/BlockModal.tsx"],"sourcesContent":["import { CloseIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useEffect, useId, useRef, type KeyboardEvent, type MouseEvent } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useFocusTrap } from \"../../../hooks/useFocusTrap\";\nimport { usePortalContainer } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { mergeRefs } from \"../../../utils/refs\";\nimport styles from \"./BlockModal.module.css\";\nimport type { BlockModalProps } from \"./BlockModal.types\";\n\nlet openModals = 0;\n\n/**\n * Accessible modal dialog: focus trap, `Escape` to close, overlay, focus\n * restoration and `aria-modal` dialog semantics (PRD §45).\n */\nexport const BlockModal = forwardRef<HTMLDivElement, BlockModalProps>(function BlockModal(\n {\n open,\n onClose,\n title,\n description,\n children,\n footer,\n size = \"md\",\n closeOnOverlayClick = true,\n closeOnEscape = true,\n hideCloseButton = false,\n initialFocusRef,\n role = \"dialog\",\n icon,\n className,\n ...rest\n },\n ref,\n) {\n const container = usePortalContainer();\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const descriptionId = useId();\n\n useFocusTrap(dialogRef, open && container !== null, { initialFocus: initialFocusRef });\n\n useEffect(() => {\n if (!open) return undefined;\n openModals += 1;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n openModals -= 1;\n if (openModals === 0) document.body.style.overflow = previous;\n };\n }, [open]);\n\n if (!open || !container) return null;\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\" && closeOnEscape) {\n event.stopPropagation();\n onClose();\n }\n };\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (closeOnOverlayClick && event.target === event.currentTarget) onClose();\n };\n\n return createPortal(\n <div\n role=\"presentation\"\n className={styles.overlay}\n onMouseDown={handleOverlayClick}\n onKeyDown={handleKeyDown}\n >\n <div\n ref={mergeRefs(dialogRef, ref)}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n tabIndex={-1}\n data-size={size}\n className={cx(styles.dialog, className)}\n {...rest}\n >\n <div className={styles.header}>\n <h2 id={titleId} className={styles.title}>\n {title}\n </h2>\n {hideCloseButton ? null : (\n <button type=\"button\" className={styles.close} aria-label=\"Close\" onClick={onClose}>\n <CloseIcon size={16} />\n </button>\n )}\n </div>\n <div className={styles.body}>\n {icon ? (\n <div className={styles.icon} aria-hidden=\"true\">\n {icon}\n </div>\n ) : null}\n {description ? (\n <div id={descriptionId} className={styles.description}>\n {description}\n </div>\n ) : null}\n {children}\n </div>\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n </div>,\n container,\n );\n});\n"],"mappings":";;;;;;;;;;AAUA,IAAI,aAAa;;;;;AAMjB,IAAa,aAAa,WAA4C,SAAS,WAC7E,EACE,MACA,SACA,OACA,aACA,UACA,QACA,OAAO,MACP,sBAAsB,MACtB,gBAAgB,MAChB,kBAAkB,OAClB,iBACA,OAAO,UACP,MACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,YAAY,mBAAmB;CACrC,MAAM,YAAY,OAAuB,IAAI;CAC7C,MAAM,UAAU,MAAM;CACtB,MAAM,gBAAgB,MAAM;CAE5B,aAAa,WAAW,QAAQ,cAAc,MAAM,EAAE,cAAc,gBAAgB,CAAC;CAErF,gBAAgB;EACd,IAAI,CAAC,MAAM,OAAO,KAAA;EAClB,cAAc;EACd,MAAM,WAAW,SAAS,KAAK,MAAM;EACrC,SAAS,KAAK,MAAM,WAAW;EAC/B,aAAa;GACX,cAAc;GACd,IAAI,eAAe,GAAG,SAAS,KAAK,MAAM,WAAW;EACvD;CACF,GAAG,CAAC,IAAI,CAAC;CAET,IAAI,CAAC,QAAQ,CAAC,WAAW,OAAO;CAEhC,MAAM,iBAAiB,UAAyC;EAC9D,IAAI,MAAM,QAAQ,YAAY,eAAe;GAC3C,MAAM,gBAAgB;GACtB,QAAQ;EACV;CACF;CAEA,MAAM,sBAAsB,UAAsC;EAChE,IAAI,uBAAuB,MAAM,WAAW,MAAM,eAAe,QAAQ;CAC3E;CAEA,OAAO,aACL,oBAAC,OAAD;EACE,MAAK;EACL,WAAWA,0BAAO;EAClB,aAAa;EACb,WAAW;EAEX,UAAA,qBAAC,OAAD;GACE,KAAK,UAAU,WAAW,GAAG;GACvB;GACN,cAAW;GACX,mBAAiB;GACjB,oBAAkB,cAAc,gBAAgB,KAAA;GAChD,UAAU;GACV,aAAW;GACX,WAAW,GAAGA,0BAAO,QAAQ,SAAS;GACtC,GAAI;GATN,UAAA;IAWE,qBAAC,OAAD;KAAK,WAAWA,0BAAO;KAAvB,UAAA,CACE,oBAAC,MAAD;MAAI,IAAI;MAAS,WAAWA,0BAAO;MAChC,UAAA;KACC,CAAA,GACH,kBAAkB,OACjB,oBAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,0BAAO;MAAO,cAAW;MAAQ,SAAS;MACzE,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;KAChB,CAAA,CAEP;;IACL,qBAAC,OAAD;KAAK,WAAWA,0BAAO;KAAvB,UAAA;MACG,OACC,oBAAC,OAAD;OAAK,WAAWA,0BAAO;OAAM,eAAY;OACtC,UAAA;MACE,CAAA,IACH;MACH,cACC,oBAAC,OAAD;OAAK,IAAI;OAAe,WAAWA,0BAAO;OACvC,UAAA;MACE,CAAA,IACH;MACH;KACE;;IACJ,SAAS,oBAAC,OAAD;KAAK,WAAWA,0BAAO;KAAS,UAAA;IAAY,CAAA,IAAI;GACvD;;CACF,CAAA,GACL,SACF;AACF,CAAC"}
1
+ {"version":3,"file":"BlockModal.js","names":["styles"],"sources":["../../../../src/components/feedback/Modal/BlockModal.tsx"],"sourcesContent":["import { CloseIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId, useRef, type KeyboardEvent, type MouseEvent } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useFocusTrap } from \"../../../hooks/useFocusTrap\";\nimport { useScrollLock } from \"../../../hooks/useScrollLock\";\nimport { usePortalContainer } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { mergeRefs } from \"../../../utils/refs\";\nimport styles from \"./BlockModal.module.css\";\nimport type { BlockModalProps } from \"./BlockModal.types\";\n\n/**\n * Accessible modal dialog: focus trap, `Escape` to close, overlay, focus\n * restoration and `aria-modal` dialog semantics (PRD §45).\n */\nexport const BlockModal = forwardRef<HTMLDivElement, BlockModalProps>(function BlockModal(\n {\n open,\n onClose,\n title,\n description,\n children,\n footer,\n size = \"md\",\n closeOnOverlayClick = true,\n closeOnEscape = true,\n hideCloseButton = false,\n initialFocusRef,\n role = \"dialog\",\n icon,\n className,\n ...rest\n },\n ref,\n) {\n const container = usePortalContainer();\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const descriptionId = useId();\n\n useFocusTrap(dialogRef, open && container !== null, { initialFocus: initialFocusRef });\n\n useScrollLock(open);\n\n if (!open || !container) return null;\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\" && closeOnEscape) {\n event.stopPropagation();\n onClose();\n }\n };\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (closeOnOverlayClick && event.target === event.currentTarget) onClose();\n };\n\n return createPortal(\n <div\n role=\"presentation\"\n className={styles.overlay}\n onMouseDown={handleOverlayClick}\n onKeyDown={handleKeyDown}\n >\n <div\n ref={mergeRefs(dialogRef, ref)}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n tabIndex={-1}\n data-size={size}\n className={cx(styles.dialog, className)}\n {...rest}\n >\n <div className={styles.header}>\n <h2 id={titleId} className={styles.title}>\n {title}\n </h2>\n {hideCloseButton ? null : (\n <button type=\"button\" className={styles.close} aria-label=\"Close\" onClick={onClose}>\n <CloseIcon size={16} />\n </button>\n )}\n </div>\n <div className={styles.body}>\n {icon ? (\n <div className={styles.icon} aria-hidden=\"true\">\n {icon}\n </div>\n ) : null}\n {description ? (\n <div id={descriptionId} className={styles.description}>\n {description}\n </div>\n ) : null}\n {children}\n </div>\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n </div>,\n container,\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;AAeA,IAAa,aAAa,WAA4C,SAAS,WAC7E,EACE,MACA,SACA,OACA,aACA,UACA,QACA,OAAO,MACP,sBAAsB,MACtB,gBAAgB,MAChB,kBAAkB,OAClB,iBACA,OAAO,UACP,MACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,YAAY,mBAAmB;CACrC,MAAM,YAAY,OAAuB,IAAI;CAC7C,MAAM,UAAU,MAAM;CACtB,MAAM,gBAAgB,MAAM;CAE5B,aAAa,WAAW,QAAQ,cAAc,MAAM,EAAE,cAAc,gBAAgB,CAAC;CAErF,cAAc,IAAI;CAElB,IAAI,CAAC,QAAQ,CAAC,WAAW,OAAO;CAEhC,MAAM,iBAAiB,UAAyC;EAC9D,IAAI,MAAM,QAAQ,YAAY,eAAe;GAC3C,MAAM,gBAAgB;GACtB,QAAQ;EACV;CACF;CAEA,MAAM,sBAAsB,UAAsC;EAChE,IAAI,uBAAuB,MAAM,WAAW,MAAM,eAAe,QAAQ;CAC3E;CAEA,OAAO,aACL,oBAAC,OAAD;EACE,MAAK;EACL,WAAWA,0BAAO;EAClB,aAAa;EACb,WAAW;EAEX,UAAA,qBAAC,OAAD;GACE,KAAK,UAAU,WAAW,GAAG;GACvB;GACN,cAAW;GACX,mBAAiB;GACjB,oBAAkB,cAAc,gBAAgB,KAAA;GAChD,UAAU;GACV,aAAW;GACX,WAAW,GAAGA,0BAAO,QAAQ,SAAS;GACtC,GAAI;GATN,UAAA;IAWE,qBAAC,OAAD;KAAK,WAAWA,0BAAO;KAAvB,UAAA,CACE,oBAAC,MAAD;MAAI,IAAI;MAAS,WAAWA,0BAAO;MAChC,UAAA;KACC,CAAA,GACH,kBAAkB,OACjB,oBAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,0BAAO;MAAO,cAAW;MAAQ,SAAS;MACzE,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;KAChB,CAAA,CAEP;;IACL,qBAAC,OAAD;KAAK,WAAWA,0BAAO;KAAvB,UAAA;MACG,OACC,oBAAC,OAAD;OAAK,WAAWA,0BAAO;OAAM,eAAY;OACtC,UAAA;MACE,CAAA,IACH;MACH,cACC,oBAAC,OAAD;OAAK,IAAI;OAAe,WAAWA,0BAAO;OACvC,UAAA;MACE,CAAA,IACH;MACH;KACE;;IACJ,SAAS,oBAAC,OAAD;KAAK,WAAWA,0BAAO;KAAS,UAAA;IAAY,CAAA,IAAI;GACvD;;CACF,CAAA,GACL,SACF;AACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SkeletonProps } from "./Skeleton.types";
2
+ /**
3
+ * Pixel placeholder shown while content loads. Decorative (`aria-hidden`):
4
+ * mark the loading container with `aria-busy` and announce loading separately.
5
+ */
6
+ export declare const Skeleton: import("react").ForwardRefExoticComponent<SkeletonProps & import("react").RefAttributes<HTMLSpanElement>>;
7
+ //# sourceMappingURL=Skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Skeleton.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Skeleton/Skeleton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,QAAQ,2GA6BnB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { cx } from "../../../utils/cx.js";
2
+ import Skeleton_module_default from "./Skeleton.module.js";
3
+ import { forwardRef } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/components/feedback/Skeleton/Skeleton.tsx
6
+ /**
7
+ * Pixel placeholder shown while content loads. Decorative (`aria-hidden`):
8
+ * mark the loading container with `aria-busy` and announce loading separately.
9
+ */
10
+ var Skeleton = forwardRef(function Skeleton({ variant = "text", lines = 1, width, height, className, style, ...rest }, ref) {
11
+ const sizing = {
12
+ ...width ? { "--block-skeleton-width": width } : null,
13
+ ...height ? { "--block-skeleton-height": height } : null,
14
+ ...style
15
+ };
16
+ const count = variant === "text" ? Math.max(1, Math.floor(lines)) : 1;
17
+ return /* @__PURE__ */ jsx("span", {
18
+ ref,
19
+ "aria-hidden": "true",
20
+ "data-variant": variant,
21
+ className: cx(Skeleton_module_default.skeleton, className),
22
+ style: sizing,
23
+ ...rest,
24
+ children: Array.from({ length: count }, (_, index) => /* @__PURE__ */ jsx("span", {
25
+ className: Skeleton_module_default.bone,
26
+ "data-last": count > 1 && index === count - 1 || void 0
27
+ }, index))
28
+ });
29
+ });
30
+ //#endregion
31
+ export { Skeleton };
32
+
33
+ //# sourceMappingURL=Skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Skeleton.js","names":["styles"],"sources":["../../../../src/components/feedback/Skeleton/Skeleton.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./Skeleton.module.css\";\nimport type { SkeletonProps } from \"./Skeleton.types\";\n\n/**\n * Pixel placeholder shown while content loads. Decorative (`aria-hidden`):\n * mark the loading container with `aria-busy` and announce loading separately.\n */\nexport const Skeleton = forwardRef<HTMLSpanElement, SkeletonProps>(function Skeleton(\n { variant = \"text\", lines = 1, width, height, className, style, ...rest },\n ref,\n) {\n const sizing = {\n ...(width ? { \"--block-skeleton-width\": width } : null),\n ...(height ? { \"--block-skeleton-height\": height } : null),\n ...style,\n } as CSSProperties;\n const count = variant === \"text\" ? Math.max(1, Math.floor(lines)) : 1;\n\n return (\n <span\n ref={ref}\n aria-hidden=\"true\"\n data-variant={variant}\n className={cx(styles.skeleton, className)}\n style={sizing}\n {...rest}\n >\n {Array.from({ length: count }, (_, index) => (\n <span\n key={index}\n className={styles.bone}\n data-last={(count > 1 && index === count - 1) || undefined}\n />\n ))}\n </span>\n );\n});\n"],"mappings":";;;;;;;;;AASA,IAAa,WAAW,WAA2C,SAAS,SAC1E,EAAE,UAAU,QAAQ,QAAQ,GAAG,OAAO,QAAQ,WAAW,OAAO,GAAG,QACnE,KACA;CACA,MAAM,SAAS;EACb,GAAI,QAAQ,EAAE,0BAA0B,MAAM,IAAI;EAClD,GAAI,SAAS,EAAE,2BAA2B,OAAO,IAAI;EACrD,GAAG;CACL;CACA,MAAM,QAAQ,YAAY,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;CAEpE,OACE,oBAAC,QAAD;EACO;EACL,eAAY;EACZ,gBAAc;EACd,WAAW,GAAGA,wBAAO,UAAU,SAAS;EACxC,OAAO;EACP,GAAI;EAEH,UAAA,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,UACjC,oBAAC,QAAD;GAEE,WAAWA,wBAAO;GAClB,aAAY,QAAQ,KAAK,UAAU,QAAQ,KAAM,KAAA;EAClD,GAHM,KAGN,CACF;CACG,CAAA;AAEV,CAAC"}
@@ -0,0 +1,12 @@
1
+ //#region src/components/feedback/Skeleton/Skeleton.module.css
2
+ var skeleton = "block-skeleton-iGMZW";
3
+ var bone = "block-bone-cYRm-";
4
+ var Skeleton_module_default = {
5
+ skeleton,
6
+ bone,
7
+ "block-skeleton-sweep": "block-block-skeleton-sweep-8kYA1"
8
+ };
9
+ //#endregion
10
+ export { bone, Skeleton_module_default as default, skeleton };
11
+
12
+ //# sourceMappingURL=Skeleton.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Skeleton.module.js","names":[],"sources":["../../../../src/components/feedback/Skeleton/Skeleton.module.css"],"sourcesContent":[".skeleton {\n display: flex;\n flex-direction: column;\n gap: var(--block-space-2);\n width: var(--block-skeleton-width, 100%);\n max-width: 100%;\n}\n\n.bone {\n display: block;\n height: 12px;\n background-color: var(--block-slot);\n background-image: linear-gradient(\n 90deg,\n transparent 0 40%,\n color-mix(in srgb, var(--block-text) 12%, transparent) 40% 60%,\n transparent 60%\n );\n background-size: 300% 100%;\n border: var(--block-border-width-thin) solid var(--block-border);\n animation: block-skeleton-sweep 1.2s steps(8, end) infinite;\n}\n\n.bone[data-last] {\n width: 60%;\n}\n\n.skeleton[data-variant=\"block\"] .bone {\n height: var(--block-skeleton-height, 96px);\n}\n\n.skeleton[data-variant=\"slot\"] {\n width: var(--block-skeleton-width, var(--block-size-slot-md));\n}\n\n.skeleton[data-variant=\"slot\"] .bone {\n aspect-ratio: 1;\n height: auto;\n box-shadow: var(--block-shadow-inset);\n}\n\n.skeleton[data-variant=\"avatar\"] {\n width: var(--block-skeleton-width, 48px);\n}\n\n.skeleton[data-variant=\"avatar\"] .bone {\n aspect-ratio: 1;\n height: auto;\n}\n\n/* A stepped highlight sweep; reduced motion stops it (base.css). */\n@keyframes block-skeleton-sweep {\n from {\n background-position: 100% 0;\n }\n to {\n background-position: 0 0;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { HTMLAttributes } from "react";
2
+ export declare const skeletonVariants: readonly ["text", "block", "slot", "avatar"];
3
+ export type SkeletonVariant = (typeof skeletonVariants)[number];
4
+ export interface SkeletonProps extends HTMLAttributes<HTMLSpanElement> {
5
+ /** `text` lines, a `block` rectangle, an inventory `slot` or a square `avatar`. @default "text" */
6
+ variant?: SkeletonVariant;
7
+ /** Number of lines for `text` (the last one is shorter). @default 1 */
8
+ lines?: number;
9
+ /** CSS width, e.g. `"200px"` or `"60%"`. */
10
+ width?: string;
11
+ /** CSS height for `block`, e.g. `"120px"`. */
12
+ height?: string;
13
+ }
14
+ //# sourceMappingURL=Skeleton.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Skeleton.types.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Skeleton/Skeleton.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,eAAO,MAAM,gBAAgB,8CAA+C,CAAC;AAE7E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,eAAe,CAAC;IACpE,mGAAmG;IACnG,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,11 @@
1
+ //#region src/components/feedback/Skeleton/Skeleton.types.ts
2
+ var skeletonVariants = [
3
+ "text",
4
+ "block",
5
+ "slot",
6
+ "avatar"
7
+ ];
8
+ //#endregion
9
+ export { skeletonVariants };
10
+
11
+ //# sourceMappingURL=Skeleton.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Skeleton.types.js","names":[],"sources":["../../../../src/components/feedback/Skeleton/Skeleton.types.ts"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\n\nexport const skeletonVariants = [\"text\", \"block\", \"slot\", \"avatar\"] as const;\n\nexport type SkeletonVariant = (typeof skeletonVariants)[number];\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLSpanElement> {\n /** `text` lines, a `block` rectangle, an inventory `slot` or a square `avatar`. @default \"text\" */\n variant?: SkeletonVariant;\n /** Number of lines for `text` (the last one is shorter). @default 1 */\n lines?: number;\n /** CSS width, e.g. `\"200px\"` or `\"60%\"`. */\n width?: string;\n /** CSS height for `block`, e.g. `\"120px\"`. */\n height?: string;\n}\n"],"mappings":";AAEA,IAAa,mBAAmB;CAAC;CAAQ;CAAS;CAAQ;AAAQ"}
@@ -0,0 +1,4 @@
1
+ export { Skeleton } from "./Skeleton";
2
+ export { skeletonVariants } from "./Skeleton.types";
3
+ export type { SkeletonProps, SkeletonVariant } from "./Skeleton.types";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Skeleton/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
@@ -4,4 +4,7 @@ export * from "./Modal";
4
4
  export * from "./ConfirmDialog";
5
5
  export * from "./Progress";
6
6
  export * from "./Loading";
7
+ export * from "./Drawer";
8
+ export * from "./EmptyState";
9
+ export * from "./Skeleton";
7
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { NumberInputProps } from "./NumberInput.types";
2
+ /**
3
+ * Number field with − / + buttons, following the WAI-ARIA spinbutton pattern:
4
+ * ↑ / ↓ step, Page Up / Down step ×10, Home / End jump to min / max. Values are
5
+ * clamped and rounded when committed (step, Enter or blur).
6
+ */
7
+ export declare const NumberInput: import("react").ForwardRefExoticComponent<NumberInputProps & import("react").RefAttributes<HTMLInputElement>>;
8
+ //# sourceMappingURL=NumberInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/NumberInput/NumberInput.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D;;;;GAIG;AACH,eAAO,MAAM,WAAW,+GAmItB,CAAC"}