@askrjs/themes 0.0.25 → 0.0.28

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 (189) hide show
  1. package/dist/components/_internal/style.js +2 -1
  2. package/dist/components/_internal/style.js.map +1 -1
  3. package/dist/components/alert/alert.d.ts +5 -0
  4. package/dist/components/alert/alert.js +5 -0
  5. package/dist/components/alert/alert.js.map +1 -1
  6. package/dist/components/alert/alert.types.d.ts +3 -0
  7. package/dist/components/aside/aside.d.ts +1 -0
  8. package/dist/components/aside/aside.js +1 -0
  9. package/dist/components/aside/aside.js.map +1 -1
  10. package/dist/components/aside/aside.types.d.ts +1 -0
  11. package/dist/components/aspect-ratio/aspect-ratio.d.ts +5 -0
  12. package/dist/components/aspect-ratio/aspect-ratio.js.map +1 -1
  13. package/dist/components/aspect-ratio/aspect-ratio.types.d.ts +3 -0
  14. package/dist/components/badge/badge.d.ts +1 -0
  15. package/dist/components/badge/badge.js.map +1 -1
  16. package/dist/components/badge/badge.types.d.ts +4 -0
  17. package/dist/components/block/block.d.ts +6 -0
  18. package/dist/components/block/block.js.map +1 -1
  19. package/dist/components/block/block.types.d.ts +8 -0
  20. package/dist/components/brand/brand.d.ts +3 -0
  21. package/dist/components/brand/brand.js +3 -0
  22. package/dist/components/brand/brand.js.map +1 -1
  23. package/dist/components/brand/brand.types.d.ts +6 -0
  24. package/dist/components/button-group/button-group.d.ts +1 -0
  25. package/dist/components/button-group/button-group.js +1 -0
  26. package/dist/components/button-group/button-group.js.map +1 -1
  27. package/dist/components/button-group/button-group.types.d.ts +2 -0
  28. package/dist/components/card/card.d.ts +7 -0
  29. package/dist/components/card/card.js +7 -0
  30. package/dist/components/card/card.js.map +1 -1
  31. package/dist/components/card/card.types.d.ts +9 -0
  32. package/dist/components/catalog.d.ts +122 -0
  33. package/dist/components/catalog.js +118 -0
  34. package/dist/components/catalog.js.map +1 -1
  35. package/dist/components/close/close.d.ts +1 -0
  36. package/dist/components/close/close.js.map +1 -1
  37. package/dist/components/close/close.types.d.ts +2 -0
  38. package/dist/components/command-palette/command-palette.d.ts +14 -0
  39. package/dist/components/command-palette/command-palette.js +13 -0
  40. package/dist/components/command-palette/command-palette.js.map +1 -1
  41. package/dist/components/command-palette/command-palette.types.d.ts +6 -0
  42. package/dist/components/container/container.d.ts +1 -0
  43. package/dist/components/container/container.js +1 -0
  44. package/dist/components/container/container.js.map +1 -1
  45. package/dist/components/container/container.types.d.ts +1 -0
  46. package/dist/components/empty-state/empty-state.d.ts +1 -0
  47. package/dist/components/empty-state/empty-state.js +1 -0
  48. package/dist/components/empty-state/empty-state.js.map +1 -1
  49. package/dist/components/empty-state/empty-state.types.d.ts +2 -0
  50. package/dist/components/field/field.d.ts +3 -0
  51. package/dist/components/field/field.js +3 -0
  52. package/dist/components/field/field.js.map +1 -1
  53. package/dist/components/field/field.types.d.ts +3 -0
  54. package/dist/components/footer/footer.d.ts +7 -0
  55. package/dist/components/footer/footer.js +7 -0
  56. package/dist/components/footer/footer.js.map +1 -1
  57. package/dist/components/footer/footer.types.d.ts +7 -0
  58. package/dist/components/grid/grid.d.ts +1 -0
  59. package/dist/components/grid/grid.js +1 -0
  60. package/dist/components/grid/grid.js.map +1 -1
  61. package/dist/components/grid/grid.types.d.ts +4 -0
  62. package/dist/components/header/header.d.ts +1 -0
  63. package/dist/components/header/header.js +1 -0
  64. package/dist/components/header/header.js.map +1 -1
  65. package/dist/components/header/header.types.d.ts +1 -0
  66. package/dist/components/input-group/input-group.d.ts +2 -0
  67. package/dist/components/input-group/input-group.js +1 -0
  68. package/dist/components/input-group/input-group.js.map +1 -1
  69. package/dist/components/input-group/input-group.types.d.ts +4 -0
  70. package/dist/components/main/main.d.ts +1 -0
  71. package/dist/components/main/main.js +1 -0
  72. package/dist/components/main/main.js.map +1 -1
  73. package/dist/components/main/main.types.d.ts +1 -0
  74. package/dist/components/nav/nav.d.ts +6 -0
  75. package/dist/components/nav/nav.js +3 -0
  76. package/dist/components/nav/nav.js.map +1 -1
  77. package/dist/components/nav/nav.types.d.ts +14 -0
  78. package/dist/components/navbar/navbar.d.ts +8 -0
  79. package/dist/components/navbar/navbar.js +8 -0
  80. package/dist/components/navbar/navbar.js.map +1 -1
  81. package/dist/components/navbar/navbar.types.d.ts +5 -0
  82. package/dist/components/overlays/dropdown-content.d.ts +5 -0
  83. package/dist/components/overlays/dropdown-content.js.map +1 -1
  84. package/dist/components/page/page.d.ts +1 -0
  85. package/dist/components/page/page.js +1 -0
  86. package/dist/components/page/page.js.map +1 -1
  87. package/dist/components/page/page.types.d.ts +1 -0
  88. package/dist/components/page-header/page-header.d.ts +1 -0
  89. package/dist/components/page-header/page-header.js +1 -0
  90. package/dist/components/page-header/page-header.js.map +1 -1
  91. package/dist/components/page-header/page-header.types.d.ts +1 -0
  92. package/dist/components/section/section.d.ts +1 -0
  93. package/dist/components/section/section.js +1 -0
  94. package/dist/components/section/section.js.map +1 -1
  95. package/dist/components/section/section.types.d.ts +1 -0
  96. package/dist/components/separator/separator.d.ts +5 -0
  97. package/dist/components/separator/separator.js.map +1 -1
  98. package/dist/components/separator/separator.types.d.ts +4 -0
  99. package/dist/components/sidebar/sidebar.d.ts +16 -0
  100. package/dist/components/sidebar/sidebar.js +16 -0
  101. package/dist/components/sidebar/sidebar.js.map +1 -1
  102. package/dist/components/sidebar/sidebar.types.d.ts +8 -0
  103. package/dist/components/skeleton/skeleton.d.ts +1 -0
  104. package/dist/components/skeleton/skeleton.js.map +1 -1
  105. package/dist/components/skeleton/skeleton.types.d.ts +3 -0
  106. package/dist/components/spinner/spinner.d.ts +1 -0
  107. package/dist/components/spinner/spinner.js +1 -0
  108. package/dist/components/spinner/spinner.js.map +1 -1
  109. package/dist/components/spinner/spinner.types.d.ts +3 -0
  110. package/dist/components/stat/stat.d.ts +4 -0
  111. package/dist/components/stat/stat.js +4 -0
  112. package/dist/components/stat/stat.js.map +1 -1
  113. package/dist/components/stat/stat.types.d.ts +4 -0
  114. package/dist/components/text/text.d.ts +1 -0
  115. package/dist/components/text/text.js +1 -0
  116. package/dist/components/text/text.js.map +1 -1
  117. package/dist/components/text/text.types.d.ts +8 -0
  118. package/dist/components/theme/theme.d.ts +25 -0
  119. package/dist/components/theme/theme.js +22 -3
  120. package/dist/components/theme/theme.js.map +1 -1
  121. package/dist/components/toolbar/toolbar.d.ts +1 -0
  122. package/dist/components/toolbar/toolbar.js +1 -0
  123. package/dist/components/toolbar/toolbar.js.map +1 -1
  124. package/dist/components/toolbar/toolbar.types.d.ts +1 -0
  125. package/package.json +1 -1
  126. package/src/components/_internal/style.ts +8 -1
  127. package/src/components/alert/alert.tsx +5 -0
  128. package/src/components/alert/alert.types.ts +3 -0
  129. package/src/components/aside/aside.tsx +1 -0
  130. package/src/components/aside/aside.types.ts +1 -0
  131. package/src/components/aspect-ratio/aspect-ratio.tsx +5 -0
  132. package/src/components/aspect-ratio/aspect-ratio.types.ts +3 -0
  133. package/src/components/badge/badge.tsx +1 -0
  134. package/src/components/badge/badge.types.ts +4 -0
  135. package/src/components/block/block.tsx +6 -0
  136. package/src/components/block/block.types.ts +8 -0
  137. package/src/components/brand/brand.tsx +3 -0
  138. package/src/components/brand/brand.types.ts +6 -0
  139. package/src/components/button-group/button-group.tsx +1 -0
  140. package/src/components/button-group/button-group.types.ts +2 -0
  141. package/src/components/card/card.tsx +7 -0
  142. package/src/components/card/card.types.ts +9 -0
  143. package/src/components/catalog.tsx +122 -0
  144. package/src/components/close/close.tsx +1 -0
  145. package/src/components/close/close.types.ts +2 -0
  146. package/src/components/command-palette/command-palette.tsx +14 -0
  147. package/src/components/command-palette/command-palette.types.ts +6 -0
  148. package/src/components/container/container.tsx +1 -0
  149. package/src/components/container/container.types.ts +1 -0
  150. package/src/components/empty-state/empty-state.tsx +1 -0
  151. package/src/components/empty-state/empty-state.types.ts +2 -0
  152. package/src/components/field/field.tsx +3 -0
  153. package/src/components/field/field.types.ts +3 -0
  154. package/src/components/footer/footer.tsx +7 -0
  155. package/src/components/footer/footer.types.ts +7 -0
  156. package/src/components/grid/grid.tsx +1 -0
  157. package/src/components/grid/grid.types.ts +4 -0
  158. package/src/components/header/header.tsx +1 -0
  159. package/src/components/header/header.types.ts +1 -0
  160. package/src/components/input-group/input-group.tsx +2 -0
  161. package/src/components/input-group/input-group.types.ts +4 -0
  162. package/src/components/main/main.tsx +1 -0
  163. package/src/components/main/main.types.ts +1 -0
  164. package/src/components/nav/nav.tsx +6 -0
  165. package/src/components/nav/nav.types.ts +14 -0
  166. package/src/components/navbar/navbar.tsx +8 -0
  167. package/src/components/navbar/navbar.types.ts +5 -0
  168. package/src/components/overlays/dropdown-content.tsx +5 -0
  169. package/src/components/page/page.tsx +1 -0
  170. package/src/components/page/page.types.ts +1 -0
  171. package/src/components/page-header/page-header.tsx +1 -0
  172. package/src/components/page-header/page-header.types.ts +1 -0
  173. package/src/components/section/section.tsx +1 -0
  174. package/src/components/section/section.types.ts +1 -0
  175. package/src/components/separator/separator.tsx +5 -0
  176. package/src/components/separator/separator.types.ts +4 -0
  177. package/src/components/sidebar/sidebar.tsx +16 -0
  178. package/src/components/sidebar/sidebar.types.ts +8 -0
  179. package/src/components/skeleton/skeleton.tsx +1 -0
  180. package/src/components/skeleton/skeleton.types.ts +3 -0
  181. package/src/components/spinner/spinner.tsx +1 -0
  182. package/src/components/spinner/spinner.types.ts +3 -0
  183. package/src/components/stat/stat.tsx +4 -0
  184. package/src/components/stat/stat.types.ts +4 -0
  185. package/src/components/text/text.tsx +1 -0
  186. package/src/components/text/text.types.ts +8 -0
  187. package/src/components/theme/theme.tsx +35 -2
  188. package/src/components/toolbar/toolbar.tsx +1 -0
  189. package/src/components/toolbar/toolbar.types.ts +1 -0
@@ -3,6 +3,7 @@ import { mergeProps } from "../_internal/merge-props.js";
3
3
  import { Block } from "../block/block.js";
4
4
  import { jsx } from "@askrjs/askr/jsx-runtime";
5
5
  //#region src/components/footer/footer.tsx
6
+ /** Renders a `<footer>`-element {@link Block} with a muted background and top border. */
6
7
  function Footer(props) {
7
8
  const { children, ...rest } = props;
8
9
  return /* @__PURE__ */ jsx(Block, {
@@ -14,6 +15,7 @@ function Footer(props) {
14
15
  children
15
16
  });
16
17
  }
18
+ /** Renders the main content wrapper of a {@link Footer}. */
17
19
  function FooterContent(props) {
18
20
  const { children, class: className, ref, ...rest } = props;
19
21
  const finalProps = mergeProps(rest, {
@@ -26,6 +28,7 @@ function FooterContent(props) {
26
28
  children
27
29
  });
28
30
  }
31
+ /** Renders a grouped section within a {@link Footer}. */
29
32
  function FooterSection(props) {
30
33
  const { children, class: className, ref, ...rest } = props;
31
34
  const finalProps = mergeProps(rest, {
@@ -38,6 +41,7 @@ function FooterSection(props) {
38
41
  children
39
42
  });
40
43
  }
44
+ /** Renders a section title (`<h2>`) within a {@link Footer}. */
41
45
  function FooterTitle(props) {
42
46
  const { children, class: className, ref, ...rest } = props;
43
47
  const finalProps = mergeProps(rest, {
@@ -50,6 +54,7 @@ function FooterTitle(props) {
50
54
  children
51
55
  });
52
56
  }
57
+ /** Renders supporting description text within a {@link Footer}. */
53
58
  function FooterDescription(props) {
54
59
  const { children, class: className, ref, ...rest } = props;
55
60
  const finalProps = mergeProps(rest, {
@@ -62,6 +67,7 @@ function FooterDescription(props) {
62
67
  children
63
68
  });
64
69
  }
70
+ /** Renders a `<nav>` wrapper for a group of {@link FooterLink}s. */
65
71
  function FooterLinks(props) {
66
72
  const { children, class: className, ref, ...rest } = props;
67
73
  const finalProps = mergeProps(rest, {
@@ -74,6 +80,7 @@ function FooterLinks(props) {
74
80
  children
75
81
  });
76
82
  }
83
+ /** Renders a single link within a {@link Footer}. */
77
84
  function FooterLink(props) {
78
85
  const { children, class: className, ref, ...rest } = props;
79
86
  const finalProps = mergeProps(rest, {
@@ -1 +1 @@
1
- {"version":3,"file":"footer.js","names":[],"sources":["../../../src/components/footer/footer.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Block } from \"../block\";\nimport { classes } from \"../_internal/classes\";\nimport { mergeProps } from \"../_internal/merge-props\";\nimport type {\n FooterContentProps,\n FooterDescriptionProps,\n FooterLinkProps,\n FooterLinksProps,\n FooterProps,\n FooterSectionProps,\n FooterTitleProps,\n} from \"./footer.types\";\n\nexport function Footer(props: FooterProps): JSX.Element {\n const { children, ...rest } = props;\n\n return (\n <Block as=\"footer\" background=\"muted\" borderTop {...rest} data-slot=\"footer\">\n {children}\n </Block>\n );\n}\n\nexport function FooterContent(props: FooterContentProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-content\", className),\n \"data-slot\": \"footer-content\",\n });\n\n return <div {...finalProps}>{children}</div>;\n}\n\nexport function FooterSection(props: FooterSectionProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-section\", className),\n \"data-slot\": \"footer-section\",\n });\n\n return <div {...finalProps}>{children}</div>;\n}\n\nexport function FooterTitle(props: FooterTitleProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-title\", className),\n \"data-slot\": \"footer-title\",\n });\n\n return <h2 {...finalProps}>{children}</h2>;\n}\n\nexport function FooterDescription(props: FooterDescriptionProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-description\", className),\n \"data-slot\": \"footer-description\",\n });\n\n return <p {...finalProps}>{children}</p>;\n}\n\nexport function FooterLinks(props: FooterLinksProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-links\", className),\n \"data-slot\": \"footer-links\",\n });\n\n return <nav {...finalProps}>{children}</nav>;\n}\n\nexport function FooterLink(props: FooterLinkProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-link\", className),\n \"data-slot\": \"footer-link\",\n });\n\n return <a {...finalProps}>{children}</a>;\n}\n"],"mappings":";;;;;AAcA,SAAgB,OAAO,OAAiC;CACtD,MAAM,EAAE,UAAU,GAAG,SAAS;CAE9B,OACE,oBAAC,OAAD;EAAO,IAAG;EAAS,YAAW;EAAQ,WAAA;EAAU,GAAI;EAAM,aAAU;EACjE;CACI,CAAA;AAEX;AAEA,SAAgB,cAAc,OAAwC;CACpE,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,kBAAkB,SAAS;EAC1C,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,OAAD;EAAK,GAAI;EAAa;CAAc,CAAA;AAC7C;AAEA,SAAgB,cAAc,OAAwC;CACpE,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,kBAAkB,SAAS;EAC1C,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,OAAD;EAAK,GAAI;EAAa;CAAc,CAAA;AAC7C;AAEA,SAAgB,YAAY,OAAsC;CAChE,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,gBAAgB,SAAS;EACxC,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,MAAD;EAAI,GAAI;EAAa;CAAa,CAAA;AAC3C;AAEA,SAAgB,kBAAkB,OAA4C;CAC5E,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,sBAAsB,SAAS;EAC9C,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,KAAD;EAAG,GAAI;EAAa;CAAY,CAAA;AACzC;AAEA,SAAgB,YAAY,OAAsC;CAChE,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,gBAAgB,SAAS;EACxC,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,OAAD;EAAK,GAAI;EAAa;CAAc,CAAA;AAC7C;AAEA,SAAgB,WAAW,OAAqC;CAC9D,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,eAAe,SAAS;EACvC,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,KAAD;EAAG,GAAI;EAAa;CAAY,CAAA;AACzC"}
1
+ {"version":3,"file":"footer.js","names":[],"sources":["../../../src/components/footer/footer.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Block } from \"../block\";\nimport { classes } from \"../_internal/classes\";\nimport { mergeProps } from \"../_internal/merge-props\";\nimport type {\n FooterContentProps,\n FooterDescriptionProps,\n FooterLinkProps,\n FooterLinksProps,\n FooterProps,\n FooterSectionProps,\n FooterTitleProps,\n} from \"./footer.types\";\n\n/** Renders a `<footer>`-element {@link Block} with a muted background and top border. */\nexport function Footer(props: FooterProps): JSX.Element {\n const { children, ...rest } = props;\n\n return (\n <Block as=\"footer\" background=\"muted\" borderTop {...rest} data-slot=\"footer\">\n {children}\n </Block>\n );\n}\n\n/** Renders the main content wrapper of a {@link Footer}. */\nexport function FooterContent(props: FooterContentProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-content\", className),\n \"data-slot\": \"footer-content\",\n });\n\n return <div {...finalProps}>{children}</div>;\n}\n\n/** Renders a grouped section within a {@link Footer}. */\nexport function FooterSection(props: FooterSectionProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-section\", className),\n \"data-slot\": \"footer-section\",\n });\n\n return <div {...finalProps}>{children}</div>;\n}\n\n/** Renders a section title (`<h2>`) within a {@link Footer}. */\nexport function FooterTitle(props: FooterTitleProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-title\", className),\n \"data-slot\": \"footer-title\",\n });\n\n return <h2 {...finalProps}>{children}</h2>;\n}\n\n/** Renders supporting description text within a {@link Footer}. */\nexport function FooterDescription(props: FooterDescriptionProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-description\", className),\n \"data-slot\": \"footer-description\",\n });\n\n return <p {...finalProps}>{children}</p>;\n}\n\n/** Renders a `<nav>` wrapper for a group of {@link FooterLink}s. */\nexport function FooterLinks(props: FooterLinksProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-links\", className),\n \"data-slot\": \"footer-links\",\n });\n\n return <nav {...finalProps}>{children}</nav>;\n}\n\n/** Renders a single link within a {@link Footer}. */\nexport function FooterLink(props: FooterLinkProps): JSX.Element {\n const { children, class: className, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"footer-link\", className),\n \"data-slot\": \"footer-link\",\n });\n\n return <a {...finalProps}>{children}</a>;\n}\n"],"mappings":";;;;;;AAeA,SAAgB,OAAO,OAAiC;CACtD,MAAM,EAAE,UAAU,GAAG,SAAS;CAE9B,OACE,oBAAC,OAAD;EAAO,IAAG;EAAS,YAAW;EAAQ,WAAA;EAAU,GAAI;EAAM,aAAU;EACjE;CACI,CAAA;AAEX;;AAGA,SAAgB,cAAc,OAAwC;CACpE,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,kBAAkB,SAAS;EAC1C,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,OAAD;EAAK,GAAI;EAAa;CAAc,CAAA;AAC7C;;AAGA,SAAgB,cAAc,OAAwC;CACpE,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,kBAAkB,SAAS;EAC1C,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,OAAD;EAAK,GAAI;EAAa;CAAc,CAAA;AAC7C;;AAGA,SAAgB,YAAY,OAAsC;CAChE,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,gBAAgB,SAAS;EACxC,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,MAAD;EAAI,GAAI;EAAa;CAAa,CAAA;AAC3C;;AAGA,SAAgB,kBAAkB,OAA4C;CAC5E,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,sBAAsB,SAAS;EAC9C,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,KAAD;EAAG,GAAI;EAAa;CAAY,CAAA;AACzC;;AAGA,SAAgB,YAAY,OAAsC;CAChE,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,gBAAgB,SAAS;EACxC,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,OAAD;EAAK,GAAI;EAAa;CAAc,CAAA;AAC7C;;AAGA,SAAgB,WAAW,OAAqC;CAC9D,MAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,SAAS;CACrD,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,eAAe,SAAS;EACvC,aAAa;CACf,CAAC;CAED,OAAO,oBAAC,KAAD;EAAG,GAAI;EAAa;CAAY,CAAA;AACzC"}
@@ -3,32 +3,39 @@ import "../block/index.js";
3
3
  import { JSX } from "@askrjs/askr/jsx-runtime";
4
4
  import { Ref } from "@askrjs/askr/foundations/utilities";
5
5
  //#region src/components/footer/footer.types.d.ts
6
+ /** Props for the {@link Footer} component. */
6
7
  type FooterProps = Omit<BlockElementProps<"footer">, "as">;
7
8
  type DivProps = Omit<JSX.IntrinsicElements["div"], "children" | "ref">;
8
9
  type HeadingProps = Omit<JSX.IntrinsicElements["h2"], "children" | "ref">;
9
10
  type ParagraphProps = Omit<JSX.IntrinsicElements["p"], "children" | "ref">;
10
11
  type NavProps = Omit<JSX.IntrinsicElements["nav"], "children" | "ref">;
11
12
  type AnchorProps = Omit<JSX.IntrinsicElements["a"], "children" | "ref">;
13
+ /** Props for the {@link FooterContent} component. */
12
14
  type FooterContentProps = DivProps & {
13
15
  children?: unknown;
14
16
  ref?: Ref<HTMLDivElement>;
15
17
  };
18
+ /** Props for the {@link FooterSection} component. */
16
19
  type FooterSectionProps = DivProps & {
17
20
  children?: unknown;
18
21
  ref?: Ref<HTMLDivElement>;
19
22
  };
23
+ /** Props for the {@link FooterTitle} component. */
20
24
  type FooterTitleProps = HeadingProps & {
21
25
  children?: unknown;
22
26
  ref?: Ref<HTMLHeadingElement>;
23
27
  };
28
+ /** Props for the {@link FooterDescription} component. */
24
29
  type FooterDescriptionProps = ParagraphProps & {
25
30
  children?: unknown;
26
31
  ref?: Ref<HTMLParagraphElement>;
27
32
  };
33
+ /** Props for the {@link FooterLinks} component. */
28
34
  type FooterLinksProps = NavProps & {
29
35
  children?: unknown;
30
36
  ref?: Ref<HTMLElement>;
31
37
  };
38
+ /** Props for the {@link FooterLink} component. */
32
39
  type FooterLinkProps = AnchorProps & {
33
40
  children?: unknown;
34
41
  ref?: Ref<HTMLAnchorElement>;
@@ -1,6 +1,7 @@
1
1
  import { GridElement, GridProps } from "./grid.types.js";
2
2
  import { JSX } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/grid/grid.d.ts
4
+ /** CSS grid layout primitive: turns `columns`/`gap`/`align` (each optionally responsive) into generated grid-template styles, rendering as `<div>` by default. */
4
5
  declare function Grid<TElement extends GridElement = "div">(props: GridProps<TElement>): JSX.Element;
5
6
  //#endregion
6
7
  export { Grid };
@@ -17,6 +17,7 @@ function resolveAlign(value) {
17
17
  if (value === "end") return "end";
18
18
  return value;
19
19
  }
20
+ /** CSS grid layout primitive: turns `columns`/`gap`/`align` (each optionally responsive) into generated grid-template styles, rendering as `<div>` by default. */
20
21
  function Grid(props) {
21
22
  const { as, columns, gap, align, children, class: classProp, className, ref, style: userStyle, ...rest } = props;
22
23
  const styles = {};
@@ -1 +1 @@
1
- {"version":3,"file":"grid.js","names":[],"sources":["../../../src/components/grid/grid.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { classes } from \"../_internal/classes\";\nimport { mergeLayoutStyles, resolveSpaceValue, setResponsiveVar } from \"../_internal/block-layout\";\nimport { mergeProps } from \"../_internal/merge-props\";\nimport { intrinsicElement } from \"../_internal/jsx\";\nimport { styleDeclarationsToClass } from \"../_internal/style\";\nimport type { BlockSpace } from \"../_internal/block-layout\";\nimport type { GridAlign, GridColumns, GridElement, GridProps } from \"./grid.types\";\n\nconst DEFAULT_ELEMENT = \"div\";\nfunction resolveColumns(value: GridColumns): string {\n if (typeof value === \"number\") {\n return `repeat(${value}, minmax(0, 1fr))`;\n }\n\n const trimmed = value.trim();\n return trimmed || \"minmax(0, 1fr)\";\n}\n\nfunction resolveGap(value: BlockSpace): string {\n return String(resolveSpaceValue(value));\n}\n\nfunction resolveAlign(value: GridAlign): string {\n if (value === \"start\") return \"start\";\n if (value === \"end\") return \"end\";\n return value;\n}\n\nexport function Grid<TElement extends GridElement = \"div\">(\n props: GridProps<TElement>,\n): JSX.Element {\n const {\n as,\n columns,\n gap,\n align,\n children,\n class: classProp,\n className,\n ref,\n style: userStyle,\n ...rest\n } = props as GridProps<GridElement> & {\n class?: unknown;\n className?: unknown;\n style?: unknown;\n };\n\n const styles: Record<string, string | number> = {};\n setResponsiveVar(styles, \"grid-columns\", columns, resolveColumns);\n setResponsiveVar(styles, \"grid-gap\", gap, resolveGap);\n setResponsiveVar(styles, \"grid-align\", align, resolveAlign);\n\n const generatedClass = styleDeclarationsToClass(mergeLayoutStyles(styles, userStyle));\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"grid\", classProp, className, generatedClass),\n \"data-slot\": \"grid\",\n });\n\n return intrinsicElement(as ?? DEFAULT_ELEMENT, finalProps, children);\n}\n"],"mappings":";;;;;;AASA,MAAM,kBAAkB;AACxB,SAAS,eAAe,OAA4B;CAClD,IAAI,OAAO,UAAU,UACnB,OAAO,UAAU,MAAM;CAIzB,OADgB,MAAM,KACT,KAAK;AACpB;AAEA,SAAS,WAAW,OAA2B;CAC7C,OAAO,OAAO,kBAAkB,KAAK,CAAC;AACxC;AAEA,SAAS,aAAa,OAA0B;CAC9C,IAAI,UAAU,SAAS,OAAO;CAC9B,IAAI,UAAU,OAAO,OAAO;CAC5B,OAAO;AACT;AAEA,SAAgB,KACd,OACa;CACb,MAAM,EACJ,IACA,SACA,KACA,OACA,UACA,OAAO,WACP,WACA,KACA,OAAO,WACP,GAAG,SACD;CAMJ,MAAM,SAA0C,CAAC;CACjD,iBAAiB,QAAQ,gBAAgB,SAAS,cAAc;CAChE,iBAAiB,QAAQ,YAAY,KAAK,UAAU;CACpD,iBAAiB,QAAQ,cAAc,OAAO,YAAY;CAE1D,MAAM,iBAAiB,yBAAyB,kBAAkB,QAAQ,SAAS,CAAC;CACpF,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,QAAQ,WAAW,WAAW,cAAc;EAC3D,aAAa;CACf,CAAC;CAED,OAAO,iBAAiB,MAAM,iBAAiB,YAAY,QAAQ;AACrE"}
1
+ {"version":3,"file":"grid.js","names":[],"sources":["../../../src/components/grid/grid.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { classes } from \"../_internal/classes\";\nimport { mergeLayoutStyles, resolveSpaceValue, setResponsiveVar } from \"../_internal/block-layout\";\nimport { mergeProps } from \"../_internal/merge-props\";\nimport { intrinsicElement } from \"../_internal/jsx\";\nimport { styleDeclarationsToClass } from \"../_internal/style\";\nimport type { BlockSpace } from \"../_internal/block-layout\";\nimport type { GridAlign, GridColumns, GridElement, GridProps } from \"./grid.types\";\n\nconst DEFAULT_ELEMENT = \"div\";\nfunction resolveColumns(value: GridColumns): string {\n if (typeof value === \"number\") {\n return `repeat(${value}, minmax(0, 1fr))`;\n }\n\n const trimmed = value.trim();\n return trimmed || \"minmax(0, 1fr)\";\n}\n\nfunction resolveGap(value: BlockSpace): string {\n return String(resolveSpaceValue(value));\n}\n\nfunction resolveAlign(value: GridAlign): string {\n if (value === \"start\") return \"start\";\n if (value === \"end\") return \"end\";\n return value;\n}\n\n/** CSS grid layout primitive: turns `columns`/`gap`/`align` (each optionally responsive) into generated grid-template styles, rendering as `<div>` by default. */\nexport function Grid<TElement extends GridElement = \"div\">(\n props: GridProps<TElement>,\n): JSX.Element {\n const {\n as,\n columns,\n gap,\n align,\n children,\n class: classProp,\n className,\n ref,\n style: userStyle,\n ...rest\n } = props as GridProps<GridElement> & {\n class?: unknown;\n className?: unknown;\n style?: unknown;\n };\n\n const styles: Record<string, string | number> = {};\n setResponsiveVar(styles, \"grid-columns\", columns, resolveColumns);\n setResponsiveVar(styles, \"grid-gap\", gap, resolveGap);\n setResponsiveVar(styles, \"grid-align\", align, resolveAlign);\n\n const generatedClass = styleDeclarationsToClass(mergeLayoutStyles(styles, userStyle));\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(\"grid\", classProp, className, generatedClass),\n \"data-slot\": \"grid\",\n });\n\n return intrinsicElement(as ?? DEFAULT_ELEMENT, finalProps, children);\n}\n"],"mappings":";;;;;;AASA,MAAM,kBAAkB;AACxB,SAAS,eAAe,OAA4B;CAClD,IAAI,OAAO,UAAU,UACnB,OAAO,UAAU,MAAM;CAIzB,OADgB,MAAM,KACT,KAAK;AACpB;AAEA,SAAS,WAAW,OAA2B;CAC7C,OAAO,OAAO,kBAAkB,KAAK,CAAC;AACxC;AAEA,SAAS,aAAa,OAA0B;CAC9C,IAAI,UAAU,SAAS,OAAO;CAC9B,IAAI,UAAU,OAAO,OAAO;CAC5B,OAAO;AACT;;AAGA,SAAgB,KACd,OACa;CACb,MAAM,EACJ,IACA,SACA,KACA,OACA,UACA,OAAO,WACP,WACA,KACA,OAAO,WACP,GAAG,SACD;CAMJ,MAAM,SAA0C,CAAC;CACjD,iBAAiB,QAAQ,gBAAgB,SAAS,cAAc;CAChE,iBAAiB,QAAQ,YAAY,KAAK,UAAU;CACpD,iBAAiB,QAAQ,cAAc,OAAO,YAAY;CAE1D,MAAM,iBAAiB,yBAAyB,kBAAkB,QAAQ,SAAS,CAAC;CACpF,MAAM,aAAa,WAAW,MAAM;EAClC;EACA,OAAO,QAAQ,QAAQ,WAAW,WAAW,cAAc;EAC3D,aAAa;CACf,CAAC;CAED,OAAO,iBAAiB,MAAM,iBAAiB,YAAY,QAAQ;AACrE"}
@@ -2,10 +2,14 @@ import { BlockSpace, ResponsiveValue } from "../_internal/block-layout.js";
2
2
  import { JSX } from "@askrjs/askr/jsx-runtime";
3
3
  import { Ref } from "@askrjs/askr/foundations/utilities";
4
4
  //#region src/components/grid/grid.types.d.ts
5
+ /** Element tags {@link Grid} can render as via its `as` prop. */
5
6
  type GridElement = "div" | "section" | "ul";
7
+ /** Column definition for {@link Grid}: a track count or a raw `grid-template-columns` string. */
6
8
  type GridColumns = number | string;
9
+ /** `align-items` value applied to a {@link Grid}. */
7
10
  type GridAlign = "start" | "center" | "end" | "stretch";
8
11
  type GridIntrinsicProps<TElement extends GridElement> = Omit<JSX.IntrinsicElements[TElement], "children" | "ref">;
12
+ /** Props for the {@link Grid} component, specialized for a given {@link GridElement} `TElement`. */
9
13
  type GridProps<TElement extends GridElement = "div"> = GridIntrinsicProps<TElement> & {
10
14
  as?: TElement;
11
15
  columns?: ResponsiveValue<GridColumns>;
@@ -1,6 +1,7 @@
1
1
  import { HeaderProps } from "./header.types.js";
2
2
  import { JSX } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/header/header.d.ts
4
+ /** Renders a `<header>`-element {@link Block} with a surface background and bottom border, optionally sticky-positioned via `position`/`sticky`. */
4
5
  declare function Header(props: HeaderProps): JSX.Element;
5
6
  //#endregion
6
7
  export { Header };
@@ -1,6 +1,7 @@
1
1
  import { Block } from "../block/block.js";
2
2
  import { jsx } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/header/header.tsx
4
+ /** Renders a `<header>`-element {@link Block} with a surface background and bottom border, optionally sticky-positioned via `position`/`sticky`. */
4
5
  function Header(props) {
5
6
  const { children, position, sticky = position === "sticky", ...rest } = props;
6
7
  return /* @__PURE__ */ jsx(Block, {
@@ -1 +1 @@
1
- {"version":3,"file":"header.js","names":[],"sources":["../../../src/components/header/header.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Block } from \"../block\";\nimport type { HeaderProps } from \"./header.types\";\n\nexport function Header(props: HeaderProps): JSX.Element {\n const { children, position, sticky = position === \"sticky\", ...rest } = props;\n\n return (\n <Block\n as=\"header\"\n sticky={sticky}\n top={sticky ? \"0\" : undefined}\n zIndex={sticky ? \"header\" : undefined}\n background=\"surface\"\n borderBottom\n {...rest}\n data-slot=\"header\"\n >\n {children}\n </Block>\n );\n}\n"],"mappings":";;;AAIA,SAAgB,OAAO,OAAiC;CACtD,MAAM,EAAE,UAAU,UAAU,SAAS,aAAa,UAAU,GAAG,SAAS;CAExE,OACE,oBAAC,OAAD;EACE,IAAG;EACK;EACR,KAAK,SAAS,MAAM,KAAA;EACpB,QAAQ,SAAS,WAAW,KAAA;EAC5B,YAAW;EACX,cAAA;EACA,GAAI;EACJ,aAAU;EAET;CACI,CAAA;AAEX"}
1
+ {"version":3,"file":"header.js","names":[],"sources":["../../../src/components/header/header.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Block } from \"../block\";\nimport type { HeaderProps } from \"./header.types\";\n\n/** Renders a `<header>`-element {@link Block} with a surface background and bottom border, optionally sticky-positioned via `position`/`sticky`. */\nexport function Header(props: HeaderProps): JSX.Element {\n const { children, position, sticky = position === \"sticky\", ...rest } = props;\n\n return (\n <Block\n as=\"header\"\n sticky={sticky}\n top={sticky ? \"0\" : undefined}\n zIndex={sticky ? \"header\" : undefined}\n background=\"surface\"\n borderBottom\n {...rest}\n data-slot=\"header\"\n >\n {children}\n </Block>\n );\n}\n"],"mappings":";;;;AAKA,SAAgB,OAAO,OAAiC;CACtD,MAAM,EAAE,UAAU,UAAU,SAAS,aAAa,UAAU,GAAG,SAAS;CAExE,OACE,oBAAC,OAAD;EACE,IAAG;EACK;EACR,KAAK,SAAS,MAAM,KAAA;EACpB,QAAQ,SAAS,WAAW,KAAA;EAC5B,YAAW;EACX,cAAA;EACA,GAAI;EACJ,aAAU;EAET;CACI,CAAA;AAEX"}
@@ -1,6 +1,7 @@
1
1
  import { BlockElementProps } from "../block/block.types.js";
2
2
  import "../block/index.js";
3
3
  //#region src/components/header/header.types.d.ts
4
+ /** Props for the {@link Header} component. */
4
5
  type HeaderProps = Omit<BlockElementProps<"header">, "as" | "sticky"> & {
5
6
  position?: "sticky" | "static";
6
7
  sticky?: boolean;
@@ -1,7 +1,9 @@
1
1
  import { InputGroupProps, InputGroupTextAsChildProps, InputGroupTextProps } from "./input-group.types.js";
2
2
  import { JSX } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/input-group/input-group.d.ts
4
+ /** Groups related inputs/addons together, optionally visually attached, with a horizontal or vertical orientation and `role="group"` by default. */
4
5
  declare function InputGroup(props: InputGroupProps): JSX.Element;
6
+ /** Renders static text/label content within an {@link InputGroup}. */
5
7
  declare function InputGroupText(props: InputGroupTextProps): JSX.Element;
6
8
  declare function InputGroupText(props: InputGroupTextAsChildProps): JSX.Element;
7
9
  //#endregion
@@ -4,6 +4,7 @@ import { jsx } from "@askrjs/askr/jsx-runtime";
4
4
  import { Slot } from "@askrjs/askr/foundations";
5
5
  import { mergeProps } from "@askrjs/askr/foundations/utilities";
6
6
  //#region src/components/input-group/input-group.tsx
7
+ /** Groups related inputs/addons together, optionally visually attached, with a horizontal or vertical orientation and `role="group"` by default. */
7
8
  function InputGroup(props) {
8
9
  const { attached = true, children, class: className, orientation = "horizontal", ref, role, ...rest } = props;
9
10
  return /* @__PURE__ */ jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"input-group.js","names":[],"sources":["../../../src/components/input-group/input-group.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Slot } from \"@askrjs/askr/foundations\";\nimport { mergeProps } from \"@askrjs/askr/foundations/utilities\";\nimport { classes } from \"../_internal/classes\";\nimport { intrinsicElement } from \"../_internal/jsx\";\nimport type {\n InputGroupProps,\n InputGroupTextAsChildProps,\n InputGroupTextProps,\n} from \"./input-group.types\";\n\nexport function InputGroup(props: InputGroupProps): JSX.Element {\n const {\n attached = true,\n children,\n class: className,\n orientation = \"horizontal\",\n ref,\n role,\n ...rest\n } = props;\n\n return (\n <div\n {...rest}\n ref={ref}\n class={classes(\n \"input-group\",\n orientation === \"vertical\" ? \"input-group-vertical\" : undefined,\n className,\n )}\n data-attached={attached ? \"true\" : \"false\"}\n data-orientation={orientation}\n data-slot=\"input-group\"\n role={(role ?? \"group\") as string}\n >\n {children}\n </div>\n );\n}\n\nexport function InputGroupText(props: InputGroupTextProps): JSX.Element;\nexport function InputGroupText(props: InputGroupTextAsChildProps): JSX.Element;\nexport function InputGroupText(\n props: InputGroupTextProps | InputGroupTextAsChildProps,\n): JSX.Element {\n const { asChild, children, ref, class: className, ...rest } = props;\n const finalProps = mergeProps(rest, {\n class: classes(\"input-group-text\", className),\n ref,\n \"data-slot\": \"input-group-text\",\n });\n\n if (asChild) {\n return <Slot asChild {...finalProps} children={children} />;\n }\n\n return intrinsicElement(\"span\", finalProps, children);\n}\n"],"mappings":";;;;;;AAWA,SAAgB,WAAW,OAAqC;CAC9D,MAAM,EACJ,WAAW,MACX,UACA,OAAO,WACP,cAAc,cACd,KACA,MACA,GAAG,SACD;CAEJ,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,OAAO,QACL,eACA,gBAAgB,aAAa,yBAAyB,KAAA,GACtD,SACF;EACA,iBAAe,WAAW,SAAS;EACnC,oBAAkB;EAClB,aAAU;EACV,MAAO,QAAQ;EAEd;CACE,CAAA;AAET;AAIA,SAAgB,eACd,OACa;CACb,MAAM,EAAE,SAAS,UAAU,KAAK,OAAO,WAAW,GAAG,SAAS;CAC9D,MAAM,aAAa,WAAW,MAAM;EAClC,OAAO,QAAQ,oBAAoB,SAAS;EAC5C;EACA,aAAa;CACf,CAAC;CAED,IAAI,SACF,OAAO,oBAAC,MAAD;EAAM,SAAA;EAAQ,GAAI;EAAsB;CAAW,CAAA;CAG5D,OAAO,iBAAiB,QAAQ,YAAY,QAAQ;AACtD"}
1
+ {"version":3,"file":"input-group.js","names":[],"sources":["../../../src/components/input-group/input-group.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Slot } from \"@askrjs/askr/foundations\";\nimport { mergeProps } from \"@askrjs/askr/foundations/utilities\";\nimport { classes } from \"../_internal/classes\";\nimport { intrinsicElement } from \"../_internal/jsx\";\nimport type {\n InputGroupProps,\n InputGroupTextAsChildProps,\n InputGroupTextProps,\n} from \"./input-group.types\";\n\n/** Groups related inputs/addons together, optionally visually attached, with a horizontal or vertical orientation and `role=\"group\"` by default. */\nexport function InputGroup(props: InputGroupProps): JSX.Element {\n const {\n attached = true,\n children,\n class: className,\n orientation = \"horizontal\",\n ref,\n role,\n ...rest\n } = props;\n\n return (\n <div\n {...rest}\n ref={ref}\n class={classes(\n \"input-group\",\n orientation === \"vertical\" ? \"input-group-vertical\" : undefined,\n className,\n )}\n data-attached={attached ? \"true\" : \"false\"}\n data-orientation={orientation}\n data-slot=\"input-group\"\n role={(role ?? \"group\") as string}\n >\n {children}\n </div>\n );\n}\n\n/** Renders static text/label content within an {@link InputGroup}. */\nexport function InputGroupText(props: InputGroupTextProps): JSX.Element;\nexport function InputGroupText(props: InputGroupTextAsChildProps): JSX.Element;\nexport function InputGroupText(\n props: InputGroupTextProps | InputGroupTextAsChildProps,\n): JSX.Element {\n const { asChild, children, ref, class: className, ...rest } = props;\n const finalProps = mergeProps(rest, {\n class: classes(\"input-group-text\", className),\n ref,\n \"data-slot\": \"input-group-text\",\n });\n\n if (asChild) {\n return <Slot asChild {...finalProps} children={children} />;\n }\n\n return intrinsicElement(\"span\", finalProps, children);\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,WAAW,OAAqC;CAC9D,MAAM,EACJ,WAAW,MACX,UACA,OAAO,WACP,cAAc,cACd,KACA,MACA,GAAG,SACD;CAEJ,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,OAAO,QACL,eACA,gBAAgB,aAAa,yBAAyB,KAAA,GACtD,SACF;EACA,iBAAe,WAAW,SAAS;EACnC,oBAAkB;EAClB,aAAU;EACV,MAAO,QAAQ;EAEd;CACE,CAAA;AAET;AAKA,SAAgB,eACd,OACa;CACb,MAAM,EAAE,SAAS,UAAU,KAAK,OAAO,WAAW,GAAG,SAAS;CAC9D,MAAM,aAAa,WAAW,MAAM;EAClC,OAAO,QAAQ,oBAAoB,SAAS;EAC5C;EACA,aAAa;CACf,CAAC;CAED,IAAI,SACF,OAAO,oBAAC,MAAD;EAAM,SAAA;EAAQ,GAAI;EAAsB;CAAW,CAAA;CAG5D,OAAO,iBAAiB,QAAQ,YAAY,QAAQ;AACtD"}
@@ -2,20 +2,24 @@ import { JSX } from "@askrjs/askr/jsx-runtime";
2
2
  import { JSXElement } from "@askrjs/askr/foundations";
3
3
  import { Ref } from "@askrjs/askr/foundations/utilities";
4
4
  //#region src/components/input-group/input-group.types.d.ts
5
+ /** Layout direction of an {@link InputGroup}. */
5
6
  type InputGroupOrientation = "horizontal" | "vertical";
6
7
  type DivProps = Omit<JSX.IntrinsicElements["div"], "children" | "ref">;
7
8
  type SpanProps = Omit<JSX.IntrinsicElements["span"], "children" | "ref">;
9
+ /** Props for the {@link InputGroup} component. */
8
10
  type InputGroupProps = DivProps & {
9
11
  children?: unknown;
10
12
  attached?: boolean;
11
13
  orientation?: InputGroupOrientation;
12
14
  ref?: Ref<HTMLDivElement>;
13
15
  };
16
+ /** Props for {@link InputGroupText} rendered as its default `<span>` element. */
14
17
  type InputGroupTextProps = SpanProps & {
15
18
  asChild?: false;
16
19
  children?: unknown;
17
20
  ref?: Ref<HTMLSpanElement>;
18
21
  };
22
+ /** Props for {@link InputGroupText} rendered with `asChild`, merging its attributes onto a single child element. */
19
23
  type InputGroupTextAsChildProps = SpanProps & {
20
24
  asChild: true;
21
25
  children: JSXElement;
@@ -1,6 +1,7 @@
1
1
  import { MainProps } from "./main.types.js";
2
2
  import { JSX } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/main/main.d.ts
4
+ /** Renders a `<main>`-element {@link Block} that grows to fill available space. */
4
5
  declare function Main(props: MainProps): JSX.Element;
5
6
  //#endregion
6
7
  export { Main };
@@ -1,6 +1,7 @@
1
1
  import { Block } from "../block/block.js";
2
2
  import { jsx } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/main/main.tsx
4
+ /** Renders a `<main>`-element {@link Block} that grows to fill available space. */
4
5
  function Main(props) {
5
6
  const { children, ...rest } = props;
6
7
  return /* @__PURE__ */ jsx(Block, {
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","names":[],"sources":["../../../src/components/main/main.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Block } from \"../block\";\nimport type { MainProps } from \"./main.types\";\n\nexport function Main(props: MainProps): JSX.Element {\n const { children, ...rest } = props;\n\n return (\n <Block as=\"main\" grow {...rest} data-slot=\"main\">\n {children}\n </Block>\n );\n}\n"],"mappings":";;;AAIA,SAAgB,KAAK,OAA+B;CAClD,MAAM,EAAE,UAAU,GAAG,SAAS;CAE9B,OACE,oBAAC,OAAD;EAAO,IAAG;EAAO,MAAA;EAAK,GAAI;EAAM,aAAU;EACvC;CACI,CAAA;AAEX"}
1
+ {"version":3,"file":"main.js","names":[],"sources":["../../../src/components/main/main.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Block } from \"../block\";\nimport type { MainProps } from \"./main.types\";\n\n/** Renders a `<main>`-element {@link Block} that grows to fill available space. */\nexport function Main(props: MainProps): JSX.Element {\n const { children, ...rest } = props;\n\n return (\n <Block as=\"main\" grow {...rest} data-slot=\"main\">\n {children}\n </Block>\n );\n}\n"],"mappings":";;;;AAKA,SAAgB,KAAK,OAA+B;CAClD,MAAM,EAAE,UAAU,GAAG,SAAS;CAE9B,OACE,oBAAC,OAAD;EAAO,IAAG;EAAO,MAAA;EAAK,GAAI;EAAM,aAAU;EACvC;CACI,CAAA;AAEX"}
@@ -1,6 +1,7 @@
1
1
  import { BlockElementProps } from "../block/block.types.js";
2
2
  import "../block/index.js";
3
3
  //#region src/components/main/main.types.d.ts
4
+ /** Props for the {@link Main} component. */
4
5
  type MainProps = Omit<BlockElementProps<"main">, "as">;
5
6
  //#endregion
6
7
  export { MainProps };
@@ -1,14 +1,20 @@
1
1
  import { NavItemAsChildProps, NavItemProps, NavLinkProps, PillProps, PillsAsChildProps, PillsProps, TabProps, TabsAsChildProps, TabsProps } from "./nav.types.js";
2
2
  import { JSX } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/nav/nav.d.ts
4
+ /** Renders a `<nav>` wrapper (or, with `asChild`, merges onto a child) for a set of {@link Tab} links. */
4
5
  declare function Tabs(props: TabsProps): JSX.Element;
5
6
  declare function Tabs(props: TabsAsChildProps): JSX.Element;
7
+ /** Renders a `<nav>` wrapper (or, with `asChild`, merges onto a child) for a set of {@link Pill} links. */
6
8
  declare function Pills(props: PillsProps): JSX.Element;
7
9
  declare function Pills(props: PillsAsChildProps): JSX.Element;
10
+ /** A router-aware link styled as a tab, auto-marked active by matching the current route (see {@link NavLinkProps.match}). */
8
11
  declare function Tab(props: TabProps): JSX.Element;
12
+ /** A router-aware link styled as a pill, auto-marked active by matching the current route, with an active background highlight. */
9
13
  declare function Pill(props: PillProps): JSX.Element;
14
+ /** A generic navigation item, rendered as an `<a>` (or, with `asChild`, merged onto a child), highlighted when `active`. */
10
15
  declare function NavItem(props: NavItemProps): JSX.Element;
11
16
  declare function NavItem(props: NavItemAsChildProps): JSX.Element;
17
+ /** A router-aware navigation link that highlights itself when its route matches the current location. */
12
18
  declare function NavLink(props: NavLinkProps): JSX.Element;
13
19
  //#endregion
14
20
  export { NavItem, NavLink, Pill, Pills, Tab, Tabs };
@@ -106,9 +106,11 @@ function Tabs(props) {
106
106
  function Pills(props) {
107
107
  return renderNavSet(props, "pills");
108
108
  }
109
+ /** A router-aware link styled as a tab, auto-marked active by matching the current route (see {@link NavLinkProps.match}). */
109
110
  function Tab(props) {
110
111
  return renderRoutedLink(props, "tab", { className: "tab" });
111
112
  }
113
+ /** A router-aware link styled as a pill, auto-marked active by matching the current route, with an active background highlight. */
112
114
  function Pill(props) {
113
115
  return renderRoutedLink(props, "pill", {
114
116
  activeBackground: true,
@@ -144,6 +146,7 @@ function NavItem(props) {
144
146
  children
145
147
  });
146
148
  }
149
+ /** A router-aware navigation link that highlights itself when its route matches the current location. */
147
150
  function NavLink(props) {
148
151
  return renderRoutedLink(props, "nav-item", {
149
152
  activeBackground: true,
@@ -1 +1 @@
1
- {"version":3,"file":"nav.js","names":[],"sources":["../../../src/components/nav/nav.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Slot } from \"@askrjs/askr/foundations\";\nimport { currentRoute, Link } from \"@askrjs/askr/router\";\nimport { Block } from \"../block\";\nimport { classes } from \"../_internal/classes\";\nimport { mergeProps } from \"../_internal/merge-props\";\nimport { intrinsicElement } from \"../_internal/jsx\";\nimport { assertSafeNavigationHref, resolvePathname } from \"../_internal/pathname\";\nimport type {\n NavItemAsChildProps,\n NavItemProps,\n NavLinkProps,\n PillProps,\n PillsAsChildProps,\n PillsProps,\n TabProps,\n TabsAsChildProps,\n TabsProps,\n} from \"./nav.types\";\n\nconst LayoutBlock = Block as (props: Record<string, unknown>) => JSX.Element;\n\nfunction normalizePathname(pathname: string): string {\n return pathname.endsWith(\"/\") && pathname !== \"/\" ? pathname.slice(0, -1) : pathname;\n}\n\nfunction getCurrentPathname(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n return normalizePathname(window.location.pathname || \"/\");\n}\n\nfunction getReactiveCurrentPathname(): string | null {\n try {\n return normalizePathname(currentRoute().path || \"/\");\n } catch {\n return getCurrentPathname();\n }\n}\n\nfunction isActiveNavLink(\n currentPathname: string,\n targetPathname: string,\n match: NavLinkProps[\"match\"] = \"prefix\",\n): boolean {\n if (targetPathname === \"/\") {\n return currentPathname === \"/\";\n }\n\n if (match === \"exact\") {\n return currentPathname === targetPathname;\n }\n\n return currentPathname === targetPathname || currentPathname.startsWith(`${targetPathname}/`);\n}\n\nfunction renderNavSet(\n props: TabsProps | TabsAsChildProps | PillsProps | PillsAsChildProps,\n slot: \"tabs\" | \"pills\",\n): JSX.Element {\n const className = \"class\" in props ? props.class : undefined;\n const { asChild, children, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(slot, className),\n \"data-slot\": slot,\n });\n\n if (asChild) {\n return <Slot asChild {...finalProps} children={children as JSX.Element} />;\n }\n\n return intrinsicElement(\"nav\", finalProps, children);\n}\n\nfunction renderRoutedLink(\n props: NavLinkProps | TabProps | PillProps,\n slot: \"nav-item\" | \"tab\" | \"pill\",\n options: { activeBackground?: boolean; className?: string; inheritSlot?: boolean } = {},\n): JSX.Element {\n const {\n active,\n children,\n href: suppliedHref,\n to,\n onPress,\n onClick,\n ref,\n class: className,\n match = \"prefix\",\n target,\n ...rest\n } = props as NavLinkProps & {\n onPress?: (event: Event) => void;\n onClick?: (event: MouseEvent) => void;\n };\n const href = to?.href ?? suppliedHref;\n if (!href) {\n throw new Error(\"Nav link requires href or to.\");\n }\n assertSafeNavigationHref(href);\n const inheritedSlot =\n options.inheritSlot && typeof (rest as Record<string, unknown>)[\"data-slot\"] === \"string\"\n ? String((rest as Record<string, unknown>)[\"data-slot\"])\n : undefined;\n const resolvedSlot = (inheritedSlot ?? slot) as \"nav-item\" | \"tab\" | \"pill\";\n const inheritedNavClass =\n slot === \"nav-item\" && resolvedSlot !== \"nav-item\" ? \"nav-item\" : undefined;\n const { \"data-slot\": _dataSlot, ...childRest } = rest as Record<string, unknown>;\n void _dataSlot;\n const hasDownload = (rest as Record<string, unknown>).download !== undefined;\n const currentPathname = getReactiveCurrentPathname();\n const targetPathname = resolvePathname(href);\n const routeActive =\n currentPathname !== null &&\n targetPathname !== null &&\n isActiveNavLink(currentPathname, targetPathname, match);\n const isActive = active ?? routeActive;\n const activeProps = isActive\n ? {\n \"aria-current\": \"page\" as const,\n \"data-active\": \"true\" as const,\n }\n : {\n \"data-active\": undefined,\n };\n const rendersRouterLink = targetPathname !== null && !target && !hasDownload;\n const childProps: NavLinkProps = to\n ? ({ ...childRest, to, target, onPress, onClick } as NavLinkProps)\n : ({ ...childRest, href, target, onPress, onClick } as NavLinkProps);\n const handleClick = (event: MouseEvent) => {\n onPress?.(event);\n if (event.defaultPrevented) return;\n onClick?.(event);\n };\n\n return (\n <LayoutBlock\n asChild\n paddingX=\"sm\"\n paddingY=\"xs\"\n radius={resolvedSlot === \"pill\" ? \"round\" : \"md\"}\n background={isActive && options.activeBackground ? \"selected\" : undefined}\n ref={ref}\n className={classes(options.className, inheritedNavClass, className)}\n data-slot={resolvedSlot}\n {...activeProps}\n >\n {rendersRouterLink ? (\n <Link {...childProps}>{children}</Link>\n ) : (\n <a {...childRest} href={href} target={target} onClick={handleClick}>\n {children}\n </a>\n )}\n </LayoutBlock>\n );\n}\n\nexport function Tabs(props: TabsProps): JSX.Element;\nexport function Tabs(props: TabsAsChildProps): JSX.Element;\nexport function Tabs(props: TabsProps | TabsAsChildProps): JSX.Element {\n return renderNavSet(props, \"tabs\");\n}\n\nexport function Pills(props: PillsProps): JSX.Element;\nexport function Pills(props: PillsAsChildProps): JSX.Element;\nexport function Pills(props: PillsProps | PillsAsChildProps): JSX.Element {\n return renderNavSet(props, \"pills\");\n}\n\nexport function Tab(props: TabProps): JSX.Element {\n return renderRoutedLink(props, \"tab\", { className: \"tab\" });\n}\n\nexport function Pill(props: PillProps): JSX.Element {\n return renderRoutedLink(props, \"pill\", { activeBackground: true, className: \"pill\" });\n}\n\nexport function NavItem(props: NavItemProps): JSX.Element;\nexport function NavItem(props: NavItemAsChildProps): JSX.Element;\nexport function NavItem(props: NavItemProps | NavItemAsChildProps): JSX.Element {\n const {\n asChild,\n active = false,\n children,\n ref,\n class: className,\n match: _match,\n ...rest\n } = props as (NavItemProps | NavItemAsChildProps) & { match?: unknown };\n void _match;\n\n if (asChild) {\n return (\n <LayoutBlock\n asChild\n paddingX=\"sm\"\n paddingY=\"xs\"\n radius=\"md\"\n background={active ? \"selected\" : undefined}\n {...rest}\n ref={ref}\n className={className}\n data-active={active ? \"true\" : undefined}\n data-slot=\"nav-item\"\n >\n {children}\n </LayoutBlock>\n );\n }\n\n return (\n <LayoutBlock\n as=\"a\"\n paddingX=\"sm\"\n paddingY=\"xs\"\n radius=\"md\"\n background={active ? \"selected\" : undefined}\n {...rest}\n ref={ref}\n className={className}\n data-active={active ? \"true\" : undefined}\n data-slot=\"nav-item\"\n >\n {children}\n </LayoutBlock>\n );\n}\n\nexport function NavLink(props: NavLinkProps): JSX.Element {\n return renderRoutedLink(props, \"nav-item\", { activeBackground: true, inheritSlot: true });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"nav.js","names":[],"sources":["../../../src/components/nav/nav.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { Slot } from \"@askrjs/askr/foundations\";\nimport { currentRoute, Link } from \"@askrjs/askr/router\";\nimport { Block } from \"../block\";\nimport { classes } from \"../_internal/classes\";\nimport { mergeProps } from \"../_internal/merge-props\";\nimport { intrinsicElement } from \"../_internal/jsx\";\nimport { assertSafeNavigationHref, resolvePathname } from \"../_internal/pathname\";\nimport type {\n NavItemAsChildProps,\n NavItemProps,\n NavLinkProps,\n PillProps,\n PillsAsChildProps,\n PillsProps,\n TabProps,\n TabsAsChildProps,\n TabsProps,\n} from \"./nav.types\";\n\nconst LayoutBlock = Block as (props: Record<string, unknown>) => JSX.Element;\n\nfunction normalizePathname(pathname: string): string {\n return pathname.endsWith(\"/\") && pathname !== \"/\" ? pathname.slice(0, -1) : pathname;\n}\n\nfunction getCurrentPathname(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n return normalizePathname(window.location.pathname || \"/\");\n}\n\nfunction getReactiveCurrentPathname(): string | null {\n try {\n return normalizePathname(currentRoute().path || \"/\");\n } catch {\n return getCurrentPathname();\n }\n}\n\nfunction isActiveNavLink(\n currentPathname: string,\n targetPathname: string,\n match: NavLinkProps[\"match\"] = \"prefix\",\n): boolean {\n if (targetPathname === \"/\") {\n return currentPathname === \"/\";\n }\n\n if (match === \"exact\") {\n return currentPathname === targetPathname;\n }\n\n return currentPathname === targetPathname || currentPathname.startsWith(`${targetPathname}/`);\n}\n\nfunction renderNavSet(\n props: TabsProps | TabsAsChildProps | PillsProps | PillsAsChildProps,\n slot: \"tabs\" | \"pills\",\n): JSX.Element {\n const className = \"class\" in props ? props.class : undefined;\n const { asChild, children, ref, ...rest } = props;\n const finalProps = mergeProps(rest, {\n ref,\n class: classes(slot, className),\n \"data-slot\": slot,\n });\n\n if (asChild) {\n return <Slot asChild {...finalProps} children={children as JSX.Element} />;\n }\n\n return intrinsicElement(\"nav\", finalProps, children);\n}\n\nfunction renderRoutedLink(\n props: NavLinkProps | TabProps | PillProps,\n slot: \"nav-item\" | \"tab\" | \"pill\",\n options: { activeBackground?: boolean; className?: string; inheritSlot?: boolean } = {},\n): JSX.Element {\n const {\n active,\n children,\n href: suppliedHref,\n to,\n onPress,\n onClick,\n ref,\n class: className,\n match = \"prefix\",\n target,\n ...rest\n } = props as NavLinkProps & {\n onPress?: (event: Event) => void;\n onClick?: (event: MouseEvent) => void;\n };\n const href = to?.href ?? suppliedHref;\n if (!href) {\n throw new Error(\"Nav link requires href or to.\");\n }\n assertSafeNavigationHref(href);\n const inheritedSlot =\n options.inheritSlot && typeof (rest as Record<string, unknown>)[\"data-slot\"] === \"string\"\n ? String((rest as Record<string, unknown>)[\"data-slot\"])\n : undefined;\n const resolvedSlot = (inheritedSlot ?? slot) as \"nav-item\" | \"tab\" | \"pill\";\n const inheritedNavClass =\n slot === \"nav-item\" && resolvedSlot !== \"nav-item\" ? \"nav-item\" : undefined;\n const { \"data-slot\": _dataSlot, ...childRest } = rest as Record<string, unknown>;\n void _dataSlot;\n const hasDownload = (rest as Record<string, unknown>).download !== undefined;\n const currentPathname = getReactiveCurrentPathname();\n const targetPathname = resolvePathname(href);\n const routeActive =\n currentPathname !== null &&\n targetPathname !== null &&\n isActiveNavLink(currentPathname, targetPathname, match);\n const isActive = active ?? routeActive;\n const activeProps = isActive\n ? {\n \"aria-current\": \"page\" as const,\n \"data-active\": \"true\" as const,\n }\n : {\n \"data-active\": undefined,\n };\n const rendersRouterLink = targetPathname !== null && !target && !hasDownload;\n const childProps: NavLinkProps = to\n ? ({ ...childRest, to, target, onPress, onClick } as NavLinkProps)\n : ({ ...childRest, href, target, onPress, onClick } as NavLinkProps);\n const handleClick = (event: MouseEvent) => {\n onPress?.(event);\n if (event.defaultPrevented) return;\n onClick?.(event);\n };\n\n return (\n <LayoutBlock\n asChild\n paddingX=\"sm\"\n paddingY=\"xs\"\n radius={resolvedSlot === \"pill\" ? \"round\" : \"md\"}\n background={isActive && options.activeBackground ? \"selected\" : undefined}\n ref={ref}\n className={classes(options.className, inheritedNavClass, className)}\n data-slot={resolvedSlot}\n {...activeProps}\n >\n {rendersRouterLink ? (\n <Link {...childProps}>{children}</Link>\n ) : (\n <a {...childRest} href={href} target={target} onClick={handleClick}>\n {children}\n </a>\n )}\n </LayoutBlock>\n );\n}\n\n/** Renders a `<nav>` wrapper (or, with `asChild`, merges onto a child) for a set of {@link Tab} links. */\nexport function Tabs(props: TabsProps): JSX.Element;\nexport function Tabs(props: TabsAsChildProps): JSX.Element;\nexport function Tabs(props: TabsProps | TabsAsChildProps): JSX.Element {\n return renderNavSet(props, \"tabs\");\n}\n\n/** Renders a `<nav>` wrapper (or, with `asChild`, merges onto a child) for a set of {@link Pill} links. */\nexport function Pills(props: PillsProps): JSX.Element;\nexport function Pills(props: PillsAsChildProps): JSX.Element;\nexport function Pills(props: PillsProps | PillsAsChildProps): JSX.Element {\n return renderNavSet(props, \"pills\");\n}\n\n/** A router-aware link styled as a tab, auto-marked active by matching the current route (see {@link NavLinkProps.match}). */\nexport function Tab(props: TabProps): JSX.Element {\n return renderRoutedLink(props, \"tab\", { className: \"tab\" });\n}\n\n/** A router-aware link styled as a pill, auto-marked active by matching the current route, with an active background highlight. */\nexport function Pill(props: PillProps): JSX.Element {\n return renderRoutedLink(props, \"pill\", { activeBackground: true, className: \"pill\" });\n}\n\n/** A generic navigation item, rendered as an `<a>` (or, with `asChild`, merged onto a child), highlighted when `active`. */\nexport function NavItem(props: NavItemProps): JSX.Element;\nexport function NavItem(props: NavItemAsChildProps): JSX.Element;\nexport function NavItem(props: NavItemProps | NavItemAsChildProps): JSX.Element {\n const {\n asChild,\n active = false,\n children,\n ref,\n class: className,\n match: _match,\n ...rest\n } = props as (NavItemProps | NavItemAsChildProps) & { match?: unknown };\n void _match;\n\n if (asChild) {\n return (\n <LayoutBlock\n asChild\n paddingX=\"sm\"\n paddingY=\"xs\"\n radius=\"md\"\n background={active ? \"selected\" : undefined}\n {...rest}\n ref={ref}\n className={className}\n data-active={active ? \"true\" : undefined}\n data-slot=\"nav-item\"\n >\n {children}\n </LayoutBlock>\n );\n }\n\n return (\n <LayoutBlock\n as=\"a\"\n paddingX=\"sm\"\n paddingY=\"xs\"\n radius=\"md\"\n background={active ? \"selected\" : undefined}\n {...rest}\n ref={ref}\n className={className}\n data-active={active ? \"true\" : undefined}\n data-slot=\"nav-item\"\n >\n {children}\n </LayoutBlock>\n );\n}\n\n/** A router-aware navigation link that highlights itself when its route matches the current location. */\nexport function NavLink(props: NavLinkProps): JSX.Element {\n return renderRoutedLink(props, \"nav-item\", { activeBackground: true, inheritSlot: true });\n}\n"],"mappings":"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"}
@@ -3,50 +3,64 @@ import { JSXElement } from "@askrjs/askr/foundations";
3
3
  import { LinkProps } from "@askrjs/askr/router";
4
4
  import { Ref } from "@askrjs/askr/foundations/utilities";
5
5
  //#region src/components/nav/nav.types.d.ts
6
+ /** Route-matching strategy for {@link NavLinkProps.match}: `"prefix"` matches sub-routes, `"exact"` requires an identical path. */
6
7
  type NavLinkMatch = "prefix" | "exact";
8
+ /** Props shared by both {@link Tabs} call signatures. */
7
9
  type TabsOwnProps = {
8
10
  children?: unknown;
9
11
  };
12
+ /** Props for {@link Tabs} rendered as its default `<nav>` element. */
10
13
  type TabsProps = Omit<JSX.IntrinsicElements["nav"], "children" | "ref"> & TabsOwnProps & {
11
14
  asChild?: false;
12
15
  ref?: Ref<HTMLElement>;
13
16
  };
17
+ /** Props for {@link Tabs} rendered with `asChild`, merging onto a single child element. */
14
18
  type TabsAsChildProps = Omit<JSX.IntrinsicElements["nav"], "children" | "ref"> & TabsOwnProps & {
15
19
  asChild: true;
16
20
  children: JSXElement;
17
21
  ref?: Ref<unknown>;
18
22
  };
23
+ /** Props shared by both {@link Pills} call signatures. */
19
24
  type PillsOwnProps = {
20
25
  children?: unknown;
21
26
  };
27
+ /** Props for {@link Pills} rendered as its default `<nav>` element. */
22
28
  type PillsProps = Omit<JSX.IntrinsicElements["nav"], "children" | "ref"> & PillsOwnProps & {
23
29
  asChild?: false;
24
30
  ref?: Ref<HTMLElement>;
25
31
  };
32
+ /** Props for {@link Pills} rendered with `asChild`, merging onto a single child element. */
26
33
  type PillsAsChildProps = Omit<JSX.IntrinsicElements["nav"], "children" | "ref"> & PillsOwnProps & {
27
34
  asChild: true;
28
35
  children: JSXElement;
29
36
  ref?: Ref<unknown>;
30
37
  };
38
+ /** Props shared by both {@link NavItem} call signatures. */
31
39
  type NavItemOwnProps = {
32
40
  active?: boolean;
33
41
  children?: unknown;
34
42
  };
43
+ /** Props for {@link NavItem} rendered as its default `<a>` element. */
35
44
  type NavItemProps = Omit<JSX.IntrinsicElements["a"], "children" | "ref"> & NavItemOwnProps & {
36
45
  asChild?: false;
37
46
  ref?: Ref<HTMLAnchorElement>;
38
47
  };
48
+ /** Props for {@link NavItem} rendered with `asChild`, merging onto a single child element. */
39
49
  type NavItemAsChildProps = Omit<JSX.IntrinsicElements["a"], "children" | "ref"> & NavItemOwnProps & {
40
50
  asChild: true;
41
51
  children: JSXElement;
42
52
  ref?: Ref<unknown>;
43
53
  };
54
+ /** Props shared by {@link NavLink}, {@link Tab}, and {@link Pill}. */
44
55
  type NavLinkOwnProps = NavItemOwnProps & {
45
56
  match?: NavLinkMatch;
46
57
  onPress?: (event: Event) => void;
47
58
  };
59
+ /** Props for the {@link NavLink} component. */
48
60
  type NavLinkProps = LinkProps & NavLinkOwnProps;
61
+ /** Props for the {@link Tab} component. */
49
62
  type TabProps = LinkProps & NavLinkOwnProps;
63
+ /** Props for the {@link Pill} component. */
50
64
  type PillProps = LinkProps & NavLinkOwnProps;
51
65
  //#endregion
52
66
  export { NavItemAsChildProps, NavItemOwnProps, NavItemProps, NavLinkMatch, NavLinkOwnProps, NavLinkProps, PillProps, PillsAsChildProps, PillsOwnProps, PillsProps, TabProps, TabsAsChildProps, TabsOwnProps, TabsProps };
@@ -1,9 +1,17 @@
1
1
  import { NavBrandProps, NavDropdownProps, NavGroupProps, NavbarProps } from "./navbar.types.js";
2
2
  import { JSX } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/navbar/navbar.d.ts
4
+ /**
5
+ * Horizontal navigation bar. Below `collapseAt`/`breakpoint`, non-brand
6
+ * children are grouped behind a collapsible toggle so brand content stays
7
+ * visible while the rest collapses on small screens.
8
+ */
4
9
  declare function Navbar(props: NavbarProps): JSX.Element;
10
+ /** Renders the brand/logo slot of a {@link Navbar}; excluded from the collapsible section. */
5
11
  declare function NavBrand(props: NavBrandProps): JSX.Element;
12
+ /** Groups related {@link Navbar} items under an optional label. */
6
13
  declare function NavGroup(props: NavGroupProps): JSX.Element;
14
+ /** Renders a dropdown menu triggered from within a {@link Navbar}. */
7
15
  declare function NavDropdown(props: NavDropdownProps): JSX.Element;
8
16
  //#endregion
9
17
  export { NavBrand, NavDropdown, NavGroup, Navbar };
@@ -22,6 +22,11 @@ function hasRenderableChildren(children) {
22
22
  return child !== void 0 && child !== null && typeof child !== "boolean";
23
23
  });
24
24
  }
25
+ /**
26
+ * Horizontal navigation bar. Below `collapseAt`/`breakpoint`, non-brand
27
+ * children are grouped behind a collapsible toggle so brand content stays
28
+ * visible while the rest collapses on small screens.
29
+ */
25
30
  function Navbar(props) {
26
31
  const { breakpoint, children, collapseAt = breakpoint ?? false, collapseIcon, collapseLabel = "Menu", ...rest } = props;
27
32
  if (!collapseAt) return /* @__PURE__ */ jsx(LayoutBlock, {
@@ -72,6 +77,7 @@ function Navbar(props) {
72
77
  children: [...brandChildren, collapse]
73
78
  });
74
79
  }
80
+ /** Renders the brand/logo slot of a {@link Navbar}; excluded from the collapsible section. */
75
81
  function NavBrand(props) {
76
82
  const { children, ...rest } = props;
77
83
  return /* @__PURE__ */ jsx(LayoutBlock, {
@@ -84,6 +90,7 @@ function NavBrand(props) {
84
90
  children
85
91
  });
86
92
  }
93
+ /** Groups related {@link Navbar} items under an optional label. */
87
94
  function NavGroup(props) {
88
95
  const { align, children, label, title = label, ...rest } = props;
89
96
  return /* @__PURE__ */ jsxs(LayoutBlock, {
@@ -102,6 +109,7 @@ function NavGroup(props) {
102
109
  })]
103
110
  });
104
111
  }
112
+ /** Renders a dropdown menu triggered from within a {@link Navbar}. */
105
113
  function NavDropdown(props) {
106
114
  const { align = "end", children, label, side = "bottom", sideOffset = 6, ...rest } = props;
107
115
  return /* @__PURE__ */ jsx(LayoutBlock, {
@@ -1 +1 @@
1
- {"version":3,"file":"navbar.js","names":["DropdownContent"],"sources":["../../../src/components/navbar/navbar.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Dropdown,\n DropdownTrigger,\n} from \"@askrjs/ui\";\nimport { Block } from \"../block\";\nimport { classes } from \"../_internal/classes\";\nimport { isJsxElement, toChildArray } from \"../_internal/jsx\";\nimport { DropdownContent } from \"../overlays/dropdown-content\";\nimport type { NavBrandProps, NavDropdownProps, NavGroupProps, NavbarProps } from \"./navbar.types\";\n\nconst ASKR_FRAGMENT = Symbol.for(\"askr.fragment\");\nconst LayoutBlock = Block as (props: Record<string, unknown>) => JSX.Element;\n\nfunction flattenNavbarChildren(children: unknown): unknown[] {\n return toChildArray(children).flatMap((child) => {\n if (isJsxElement(child) && child.type === ASKR_FRAGMENT) {\n return flattenNavbarChildren(child.props?.children);\n }\n\n return [child];\n });\n}\n\nfunction isNavBrandChild(child: unknown): boolean {\n return (\n isJsxElement(child) && (child.type === NavBrand || child.props?.[\"data-slot\"] === \"nav-brand\")\n );\n}\n\nfunction hasRenderableChildren(children: readonly unknown[]): boolean {\n return children.some((child) => {\n if (Array.isArray(child)) {\n return hasRenderableChildren(child);\n }\n\n return child !== undefined && child !== null && typeof child !== \"boolean\";\n });\n}\n\nexport function Navbar(props: NavbarProps): JSX.Element {\n const {\n breakpoint,\n children,\n collapseAt = breakpoint ?? false,\n collapseIcon,\n collapseLabel = \"Menu\",\n ...rest\n } = props;\n\n if (!collapseAt) {\n return (\n <LayoutBlock\n as=\"nav\"\n direction=\"row\"\n align=\"center\"\n gap=\"md\"\n width=\"full\"\n {...rest}\n data-slot=\"navbar\"\n >\n {children}\n </LayoutBlock>\n );\n }\n\n const navbarChildren = flattenNavbarChildren(children);\n const brandChildren = navbarChildren.filter(isNavBrandChild);\n const navChildren = navbarChildren.filter((child) => !isNavBrandChild(child));\n const hasNavContent = hasRenderableChildren(navChildren);\n const content = (\n <LayoutBlock direction=\"row\" align=\"center\" gap=\"md\" width=\"full\" data-slot=\"navbar-content\">\n {navChildren}\n </LayoutBlock>\n );\n const collapse = hasNavContent ? (\n <div data-slot=\"navbar-collapse\">\n <Collapsible>\n <CollapsibleTrigger aria-label={collapseLabel} data-slot=\"navbar-toggle\">\n {collapseIcon}\n <span data-slot=\"navbar-toggle-label\">{collapseLabel}</span>\n </CollapsibleTrigger>\n <CollapsibleContent forceMount asChild data-slot=\"navbar-content\">\n {content}\n </CollapsibleContent>\n </Collapsible>\n </div>\n ) : null;\n\n return (\n <LayoutBlock\n as=\"nav\"\n direction=\"row\"\n align=\"center\"\n gap=\"md\"\n width=\"full\"\n {...rest}\n data-collapse-at={collapseAt}\n data-slot=\"navbar\"\n >\n {[...brandChildren, collapse]}\n </LayoutBlock>\n );\n}\n\nexport function NavBrand(props: NavBrandProps): JSX.Element {\n const { children, ...rest } = props;\n\n return (\n <LayoutBlock\n direction=\"row\"\n align=\"center\"\n gap=\"sm\"\n shrink={false}\n {...rest}\n data-slot=\"nav-brand\"\n >\n {children}\n </LayoutBlock>\n );\n}\n\nexport function NavGroup(props: NavGroupProps): JSX.Element {\n const { align, children, label, title = label, ...rest } = props;\n\n return (\n <LayoutBlock align={align} gap=\"sm\" {...rest} data-align={align} data-slot=\"nav-group\">\n {title !== undefined ? <div data-slot=\"nav-group-label\">{title}</div> : null}\n <LayoutBlock gap=\"xs\" data-slot=\"nav-group-body\">\n {children}\n </LayoutBlock>\n </LayoutBlock>\n );\n}\n\nexport function NavDropdown(props: NavDropdownProps): JSX.Element {\n const { align = \"end\", children, label, side = \"bottom\", sideOffset = 6, ...rest } = props;\n\n return (\n <LayoutBlock direction=\"row\" align=\"center\" data-slot=\"nav-dropdown\">\n <Dropdown {...rest}>\n <DropdownTrigger class={classes(\"nav-item\")} data-slot=\"nav-dropdown-trigger\">\n {label}\n </DropdownTrigger>\n <DropdownContent\n align={align}\n class={classes(\"dropdown-content\")}\n data-slot=\"nav-dropdown-content\"\n side={side}\n sideOffset={sideOffset}\n >\n {children}\n </DropdownContent>\n </Dropdown>\n </LayoutBlock>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"navbar.js","names":["DropdownContent"],"sources":["../../../src/components/navbar/navbar.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Dropdown,\n DropdownTrigger,\n} from \"@askrjs/ui\";\nimport { Block } from \"../block\";\nimport { classes } from \"../_internal/classes\";\nimport { isJsxElement, toChildArray } from \"../_internal/jsx\";\nimport { DropdownContent } from \"../overlays/dropdown-content\";\nimport type { NavBrandProps, NavDropdownProps, NavGroupProps, NavbarProps } from \"./navbar.types\";\n\nconst ASKR_FRAGMENT = Symbol.for(\"askr.fragment\");\nconst LayoutBlock = Block as (props: Record<string, unknown>) => JSX.Element;\n\nfunction flattenNavbarChildren(children: unknown): unknown[] {\n return toChildArray(children).flatMap((child) => {\n if (isJsxElement(child) && child.type === ASKR_FRAGMENT) {\n return flattenNavbarChildren(child.props?.children);\n }\n\n return [child];\n });\n}\n\nfunction isNavBrandChild(child: unknown): boolean {\n return (\n isJsxElement(child) && (child.type === NavBrand || child.props?.[\"data-slot\"] === \"nav-brand\")\n );\n}\n\nfunction hasRenderableChildren(children: readonly unknown[]): boolean {\n return children.some((child) => {\n if (Array.isArray(child)) {\n return hasRenderableChildren(child);\n }\n\n return child !== undefined && child !== null && typeof child !== \"boolean\";\n });\n}\n\n/**\n * Horizontal navigation bar. Below `collapseAt`/`breakpoint`, non-brand\n * children are grouped behind a collapsible toggle so brand content stays\n * visible while the rest collapses on small screens.\n */\nexport function Navbar(props: NavbarProps): JSX.Element {\n const {\n breakpoint,\n children,\n collapseAt = breakpoint ?? false,\n collapseIcon,\n collapseLabel = \"Menu\",\n ...rest\n } = props;\n\n if (!collapseAt) {\n return (\n <LayoutBlock\n as=\"nav\"\n direction=\"row\"\n align=\"center\"\n gap=\"md\"\n width=\"full\"\n {...rest}\n data-slot=\"navbar\"\n >\n {children}\n </LayoutBlock>\n );\n }\n\n const navbarChildren = flattenNavbarChildren(children);\n const brandChildren = navbarChildren.filter(isNavBrandChild);\n const navChildren = navbarChildren.filter((child) => !isNavBrandChild(child));\n const hasNavContent = hasRenderableChildren(navChildren);\n const content = (\n <LayoutBlock direction=\"row\" align=\"center\" gap=\"md\" width=\"full\" data-slot=\"navbar-content\">\n {navChildren}\n </LayoutBlock>\n );\n const collapse = hasNavContent ? (\n <div data-slot=\"navbar-collapse\">\n <Collapsible>\n <CollapsibleTrigger aria-label={collapseLabel} data-slot=\"navbar-toggle\">\n {collapseIcon}\n <span data-slot=\"navbar-toggle-label\">{collapseLabel}</span>\n </CollapsibleTrigger>\n <CollapsibleContent forceMount asChild data-slot=\"navbar-content\">\n {content}\n </CollapsibleContent>\n </Collapsible>\n </div>\n ) : null;\n\n return (\n <LayoutBlock\n as=\"nav\"\n direction=\"row\"\n align=\"center\"\n gap=\"md\"\n width=\"full\"\n {...rest}\n data-collapse-at={collapseAt}\n data-slot=\"navbar\"\n >\n {[...brandChildren, collapse]}\n </LayoutBlock>\n );\n}\n\n/** Renders the brand/logo slot of a {@link Navbar}; excluded from the collapsible section. */\nexport function NavBrand(props: NavBrandProps): JSX.Element {\n const { children, ...rest } = props;\n\n return (\n <LayoutBlock\n direction=\"row\"\n align=\"center\"\n gap=\"sm\"\n shrink={false}\n {...rest}\n data-slot=\"nav-brand\"\n >\n {children}\n </LayoutBlock>\n );\n}\n\n/** Groups related {@link Navbar} items under an optional label. */\nexport function NavGroup(props: NavGroupProps): JSX.Element {\n const { align, children, label, title = label, ...rest } = props;\n\n return (\n <LayoutBlock align={align} gap=\"sm\" {...rest} data-align={align} data-slot=\"nav-group\">\n {title !== undefined ? <div data-slot=\"nav-group-label\">{title}</div> : null}\n <LayoutBlock gap=\"xs\" data-slot=\"nav-group-body\">\n {children}\n </LayoutBlock>\n </LayoutBlock>\n );\n}\n\n/** Renders a dropdown menu triggered from within a {@link Navbar}. */\nexport function NavDropdown(props: NavDropdownProps): JSX.Element {\n const { align = \"end\", children, label, side = \"bottom\", sideOffset = 6, ...rest } = props;\n\n return (\n <LayoutBlock direction=\"row\" align=\"center\" data-slot=\"nav-dropdown\">\n <Dropdown {...rest}>\n <DropdownTrigger class={classes(\"nav-item\")} data-slot=\"nav-dropdown-trigger\">\n {label}\n </DropdownTrigger>\n <DropdownContent\n align={align}\n class={classes(\"dropdown-content\")}\n data-slot=\"nav-dropdown-content\"\n side={side}\n sideOffset={sideOffset}\n >\n {children}\n </DropdownContent>\n </Dropdown>\n </LayoutBlock>\n );\n}\n"],"mappings":"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"}
@@ -2,18 +2,23 @@ import { BlockAsChildProps, BlockDivProps, BlockElementProps } from "../block/bl
2
2
  import "../block/index.js";
3
3
  import { DropdownContentOwnProps, DropdownProps } from "@askrjs/ui";
4
4
  //#region src/components/navbar/navbar.types.d.ts
5
+ /** Breakpoint at which a {@link Navbar} collapses non-brand content behind a toggle. */
5
6
  type NavbarCollapseBreakpoint = "sm" | "md" | "lg" | "xl";
7
+ /** Props for the {@link Navbar} component. */
6
8
  type NavbarProps = Omit<BlockElementProps<"nav">, "as" | "direction" | "align"> & {
7
9
  breakpoint?: NavbarCollapseBreakpoint | false;
8
10
  collapseAt?: NavbarCollapseBreakpoint | false;
9
11
  collapseLabel?: string;
10
12
  collapseIcon?: unknown;
11
13
  };
14
+ /** Props for the {@link NavBrand} component. */
12
15
  type NavBrandProps = BlockDivProps | BlockElementProps<"a"> | BlockAsChildProps;
16
+ /** Props for the {@link NavGroup} component. */
13
17
  type NavGroupProps = Omit<BlockDivProps, "title"> & {
14
18
  label?: unknown;
15
19
  title?: unknown;
16
20
  };
21
+ /** Props for the {@link NavDropdown} component. */
17
22
  type NavDropdownProps = Omit<DropdownProps, "children"> & Pick<DropdownContentOwnProps, "align" | "side" | "sideOffset"> & {
18
23
  label: unknown;
19
24
  children?: unknown;
@@ -1,6 +1,11 @@
1
1
  import { DropdownContentAsChildProps, DropdownContentProps } from "@askrjs/ui";
2
2
  import { JSX } from "@askrjs/askr/jsx-runtime";
3
3
  //#region src/components/overlays/dropdown-content.d.ts
4
+ /**
5
+ * Dropdown/context-menu content wrapper around `@askrjs/ui`'s `DropdownContent`.
6
+ * Non-`asChild` usage lazily evaluates `children` inside a body component so
7
+ * they're only rendered once the dropdown is actually open.
8
+ */
4
9
  declare function DropdownContent$1(props: DropdownContentProps): JSX.Element | null;
5
10
  declare function DropdownContent$1(props: DropdownContentAsChildProps): JSX.Element | null;
6
11
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-content.js","names":["DropdownContent","UiDropdownContent"],"sources":["../../../src/components/overlays/dropdown-content.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { DropdownContent as UiDropdownContent } from \"@askrjs/ui\";\nimport type { DropdownContentAsChildProps, DropdownContentProps } from \"@askrjs/ui\";\n\ntype DropdownContentBodyProps = {\n render: () => unknown;\n};\n\nfunction DropdownContentBody(props: DropdownContentBodyProps): JSX.Element {\n return <>{props.render()}</>;\n}\n\nexport function DropdownContent(props: DropdownContentProps): JSX.Element | null;\nexport function DropdownContent(props: DropdownContentAsChildProps): JSX.Element | null;\nexport function DropdownContent(\n props: DropdownContentProps | DropdownContentAsChildProps,\n): JSX.Element | null {\n if (\"asChild\" in props && props.asChild) {\n return <UiDropdownContent {...props} />;\n }\n\n const { children, ...rest } = props as DropdownContentProps;\n\n return (\n <UiDropdownContent {...rest}>\n <DropdownContentBody render={() => children} />\n </UiDropdownContent>\n );\n}\n"],"mappings":";;;AAQA,SAAS,oBAAoB,OAA8C;CACzE,OAAO,oBAAA,UAAA,EAAA,UAAG,MAAM,OAAO,EAAI,CAAA;AAC7B;AAIA,SAAgBA,kBACd,OACoB;CACpB,IAAI,aAAa,SAAS,MAAM,SAC9B,OAAO,oBAACC,iBAAD,EAAmB,GAAI,MAAQ,CAAA;CAGxC,MAAM,EAAE,UAAU,GAAG,SAAS;CAE9B,OACE,oBAACA,iBAAD;EAAmB,GAAI;EACrB,UAAA,oBAAC,qBAAD,EAAqB,cAAc,SAAW,CAAA;CAC7B,CAAA;AAEvB"}
1
+ {"version":3,"file":"dropdown-content.js","names":["DropdownContent","UiDropdownContent"],"sources":["../../../src/components/overlays/dropdown-content.tsx"],"sourcesContent":["import type { JSX } from \"@askrjs/askr/jsx-runtime\";\nimport { DropdownContent as UiDropdownContent } from \"@askrjs/ui\";\nimport type { DropdownContentAsChildProps, DropdownContentProps } from \"@askrjs/ui\";\n\ntype DropdownContentBodyProps = {\n render: () => unknown;\n};\n\nfunction DropdownContentBody(props: DropdownContentBodyProps): JSX.Element {\n return <>{props.render()}</>;\n}\n\n/**\n * Dropdown/context-menu content wrapper around `@askrjs/ui`'s `DropdownContent`.\n * Non-`asChild` usage lazily evaluates `children` inside a body component so\n * they're only rendered once the dropdown is actually open.\n */\nexport function DropdownContent(props: DropdownContentProps): JSX.Element | null;\nexport function DropdownContent(props: DropdownContentAsChildProps): JSX.Element | null;\nexport function DropdownContent(\n props: DropdownContentProps | DropdownContentAsChildProps,\n): JSX.Element | null {\n if (\"asChild\" in props && props.asChild) {\n return <UiDropdownContent {...props} />;\n }\n\n const { children, ...rest } = props as DropdownContentProps;\n\n return (\n <UiDropdownContent {...rest}>\n <DropdownContentBody render={() => children} />\n </UiDropdownContent>\n );\n}\n"],"mappings":";;;AAQA,SAAS,oBAAoB,OAA8C;CACzE,OAAO,oBAAA,UAAA,EAAA,UAAG,MAAM,OAAO,EAAI,CAAA;AAC7B;AASA,SAAgBA,kBACd,OACoB;CACpB,IAAI,aAAa,SAAS,MAAM,SAC9B,OAAO,oBAACC,iBAAD,EAAmB,GAAI,MAAQ,CAAA;CAGxC,MAAM,EAAE,UAAU,GAAG,SAAS;CAE9B,OACE,oBAACA,iBAAD;EAAmB,GAAI;EACrB,UAAA,oBAAC,qBAAD,EAAqB,cAAc,SAAW,CAAA;CAC7B,CAAA;AAEvB"}