@jiwambe/components 0.2.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 (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +367 -0
  3. package/dist/client.d.ts +40 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +46 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/components/Accordion/Accordion.d.ts +74 -0
  8. package/dist/components/Accordion/Accordion.d.ts.map +1 -0
  9. package/dist/components/Accordion/Accordion.js +297 -0
  10. package/dist/components/Accordion/Accordion.js.map +1 -0
  11. package/dist/components/Box/Box.d.ts +56 -0
  12. package/dist/components/Box/Box.d.ts.map +1 -0
  13. package/dist/components/Box/Box.js +51 -0
  14. package/dist/components/Box/Box.js.map +1 -0
  15. package/dist/components/Breadcrumb/Breadcrumb.d.ts +66 -0
  16. package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +1 -0
  17. package/dist/components/Button/Button.d.ts +54 -0
  18. package/dist/components/Button/Button.d.ts.map +1 -0
  19. package/dist/components/Button/Button.js +92 -0
  20. package/dist/components/Button/Button.js.map +1 -0
  21. package/dist/components/Card/Card.d.ts +54 -0
  22. package/dist/components/Card/Card.d.ts.map +1 -0
  23. package/dist/components/Card/Card.js +98 -0
  24. package/dist/components/Card/Card.js.map +1 -0
  25. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +61 -0
  26. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -0
  27. package/dist/components/CheckboxGroup/CheckboxGroup.js +205 -0
  28. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -0
  29. package/dist/components/Container/Container.d.ts +72 -0
  30. package/dist/components/Container/Container.d.ts.map +1 -0
  31. package/dist/components/Container/Container.js +69 -0
  32. package/dist/components/Container/Container.js.map +1 -0
  33. package/dist/components/DateInput/DateInput.d.ts +61 -0
  34. package/dist/components/DateInput/DateInput.d.ts.map +1 -0
  35. package/dist/components/DateInput/DateInput.js +234 -0
  36. package/dist/components/DateInput/DateInput.js.map +1 -0
  37. package/dist/components/Divider/Divider.d.ts +44 -0
  38. package/dist/components/Divider/Divider.d.ts.map +1 -0
  39. package/dist/components/Divider/Divider.js +35 -0
  40. package/dist/components/Divider/Divider.js.map +1 -0
  41. package/dist/components/Drawer/Drawer.d.ts +35 -0
  42. package/dist/components/Drawer/Drawer.d.ts.map +1 -0
  43. package/dist/components/Drawer/Drawer.js +37 -0
  44. package/dist/components/Drawer/Drawer.js.map +1 -0
  45. package/dist/components/FAQ/FAQ.d.ts +40 -0
  46. package/dist/components/FAQ/FAQ.d.ts.map +1 -0
  47. package/dist/components/FAQ/FAQ.js +161 -0
  48. package/dist/components/FAQ/FAQ.js.map +1 -0
  49. package/dist/components/Grid/Grid.d.ts +61 -0
  50. package/dist/components/Grid/Grid.d.ts.map +1 -0
  51. package/dist/components/Grid/Grid.js +95 -0
  52. package/dist/components/Grid/Grid.js.map +1 -0
  53. package/dist/components/Icon/Icon.d.ts +21 -0
  54. package/dist/components/Icon/Icon.d.ts.map +1 -0
  55. package/dist/components/Icon/Icon.js +167 -0
  56. package/dist/components/Icon/Icon.js.map +1 -0
  57. package/dist/components/Link/Link.d.ts +49 -0
  58. package/dist/components/Link/Link.d.ts.map +1 -0
  59. package/dist/components/Link/Link.js +70 -0
  60. package/dist/components/Link/Link.js.map +1 -0
  61. package/dist/components/List/List.d.ts +36 -0
  62. package/dist/components/List/List.d.ts.map +1 -0
  63. package/dist/components/List/List.js +42 -0
  64. package/dist/components/List/List.js.map +1 -0
  65. package/dist/components/List/index.d.ts +3 -0
  66. package/dist/components/List/index.d.ts.map +1 -0
  67. package/dist/components/Overlay/Overlay.d.ts +35 -0
  68. package/dist/components/Overlay/Overlay.d.ts.map +1 -0
  69. package/dist/components/Overlay/Overlay.js +51 -0
  70. package/dist/components/Overlay/Overlay.js.map +1 -0
  71. package/dist/components/PhoneInput/PhoneInput.d.ts +55 -0
  72. package/dist/components/PhoneInput/PhoneInput.d.ts.map +1 -0
  73. package/dist/components/PhoneInput/PhoneInput.js +255 -0
  74. package/dist/components/PhoneInput/PhoneInput.js.map +1 -0
  75. package/dist/components/Popover/Popover.d.ts +46 -0
  76. package/dist/components/Popover/Popover.d.ts.map +1 -0
  77. package/dist/components/Popover/Popover.js +57 -0
  78. package/dist/components/Popover/Popover.js.map +1 -0
  79. package/dist/components/ProductImage/ProductImage.d.ts +78 -0
  80. package/dist/components/ProductImage/ProductImage.d.ts.map +1 -0
  81. package/dist/components/ProductImage/ProductImage.js +220 -0
  82. package/dist/components/ProductImage/ProductImage.js.map +1 -0
  83. package/dist/components/RadioGroup/RadioGroup.d.ts +63 -0
  84. package/dist/components/RadioGroup/RadioGroup.d.ts.map +1 -0
  85. package/dist/components/RadioGroup/RadioGroup.js +233 -0
  86. package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
  87. package/dist/components/Section/Section.d.ts +44 -0
  88. package/dist/components/Section/Section.d.ts.map +1 -0
  89. package/dist/components/Section/Section.js +48 -0
  90. package/dist/components/Section/Section.js.map +1 -0
  91. package/dist/components/Select/Select.d.ts +47 -0
  92. package/dist/components/Select/Select.d.ts.map +1 -0
  93. package/dist/components/Select/Select.js +153 -0
  94. package/dist/components/Select/Select.js.map +1 -0
  95. package/dist/components/SelectTab/SelectTab.d.ts +62 -0
  96. package/dist/components/SelectTab/SelectTab.d.ts.map +1 -0
  97. package/dist/components/SelectTab/SelectTab.js +192 -0
  98. package/dist/components/SelectTab/SelectTab.js.map +1 -0
  99. package/dist/components/Skeleton/Skeleton.d.ts +87 -0
  100. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
  101. package/dist/components/Skeleton/Skeleton.js +97 -0
  102. package/dist/components/Skeleton/Skeleton.js.map +1 -0
  103. package/dist/components/Skeleton/index.d.ts +3 -0
  104. package/dist/components/Skeleton/index.d.ts.map +1 -0
  105. package/dist/components/Slider/Slider.d.ts +47 -0
  106. package/dist/components/Slider/Slider.d.ts.map +1 -0
  107. package/dist/components/Slider/Slider.js +147 -0
  108. package/dist/components/Slider/Slider.js.map +1 -0
  109. package/dist/components/Stack/Stack.d.ts +145 -0
  110. package/dist/components/Stack/Stack.d.ts.map +1 -0
  111. package/dist/components/Stack/Stack.js +80 -0
  112. package/dist/components/Stack/Stack.js.map +1 -0
  113. package/dist/components/Tab/Tab.d.ts +38 -0
  114. package/dist/components/Tab/Tab.d.ts.map +1 -0
  115. package/dist/components/Tab/Tab.js +146 -0
  116. package/dist/components/Tab/Tab.js.map +1 -0
  117. package/dist/components/TextArea/TextArea.d.ts +32 -0
  118. package/dist/components/TextArea/TextArea.d.ts.map +1 -0
  119. package/dist/components/TextArea/TextArea.js +118 -0
  120. package/dist/components/TextArea/TextArea.js.map +1 -0
  121. package/dist/components/TextInput/TextInput.d.ts +35 -0
  122. package/dist/components/TextInput/TextInput.d.ts.map +1 -0
  123. package/dist/components/TextInput/TextInput.js +128 -0
  124. package/dist/components/TextInput/TextInput.js.map +1 -0
  125. package/dist/components/Toggle/Toggle.d.ts +83 -0
  126. package/dist/components/Toggle/Toggle.d.ts.map +1 -0
  127. package/dist/components/Toggle/Toggle.js +121 -0
  128. package/dist/components/Toggle/Toggle.js.map +1 -0
  129. package/dist/components/Typography/Typography.d.ts +321 -0
  130. package/dist/components/Typography/Typography.d.ts.map +1 -0
  131. package/dist/components/Typography/Typography.js +21 -0
  132. package/dist/components/Typography/Typography.js.map +1 -0
  133. package/dist/components/UploadInput/UploadInput.d.ts +39 -0
  134. package/dist/components/UploadInput/UploadInput.d.ts.map +1 -0
  135. package/dist/components/UploadInput/UploadInput.js +297 -0
  136. package/dist/components/UploadInput/UploadInput.js.map +1 -0
  137. package/dist/components/index.d.ts +65 -0
  138. package/dist/components/index.d.ts.map +1 -0
  139. package/dist/index.d.ts +7 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +69 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/plugin/jiwambe-plugin.d.ts +37 -0
  144. package/dist/plugin/jiwambe-plugin.d.ts.map +1 -0
  145. package/dist/plugin/jiwambe-plugin.js +640 -0
  146. package/dist/plugin/jiwambe-plugin.js.map +1 -0
  147. package/dist/server.d.ts +22 -0
  148. package/dist/server.d.ts.map +1 -0
  149. package/dist/server.js +23 -0
  150. package/dist/server.js.map +1 -0
  151. package/dist/types/index.d.ts +103 -0
  152. package/dist/types/index.d.ts.map +1 -0
  153. package/dist/types/layout.d.ts +138 -0
  154. package/dist/types/layout.d.ts.map +1 -0
  155. package/dist/types/list.d.ts +69 -0
  156. package/dist/types/list.d.ts.map +1 -0
  157. package/dist/types/list.js +9 -0
  158. package/dist/types/list.js.map +1 -0
  159. package/dist/types/skeleton.d.ts +38 -0
  160. package/dist/types/skeleton.d.ts.map +1 -0
  161. package/dist/types/skeleton.js +13 -0
  162. package/dist/types/skeleton.js.map +1 -0
  163. package/dist/types/spacing.d.ts +105 -0
  164. package/dist/types/spacing.d.ts.map +1 -0
  165. package/dist/utils/layoutClasses.d.ts +44 -0
  166. package/dist/utils/layoutClasses.d.ts.map +1 -0
  167. package/dist/utils/layoutClasses.js +88 -0
  168. package/dist/utils/layoutClasses.js.map +1 -0
  169. package/dist/utils/responsive-props.d.ts +60 -0
  170. package/dist/utils/responsive-props.d.ts.map +1 -0
  171. package/dist/utils/responsive-props.js +184 -0
  172. package/dist/utils/responsive-props.js.map +1 -0
  173. package/dist/utils/spacing.d.ts +52 -0
  174. package/dist/utils/spacing.d.ts.map +1 -0
  175. package/dist/utils/spacing.js +625 -0
  176. package/dist/utils/spacing.js.map +1 -0
  177. package/package.json +96 -0
  178. package/tailwind.preset.d.ts +3 -0
  179. package/tailwind.preset.ts +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer.js","sources":["../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\n/**\n * Edge from which the drawer panel slides in. Use 'left' for navigation-style drawers,\n * 'right' for filters or detail panels.\n */\nexport type DrawerAnchor = 'left' | 'right';\n\n/**\n * Props for the Drawer component. Drawer does not control visibility — use it inside\n * an Overlay and control open/onClose on the Overlay.\n */\nexport interface DrawerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Which edge the drawer panel slides in from. @default 'right' */\n anchor?: DrawerAnchor;\n /** Max width of the drawer panel. @default '24rem' (384px) */\n maxWidth?: string;\n /** Panel content. Typically Stack or nav content. @default undefined */\n children?: React.ReactNode;\n /** Forwarded ref for the root div. @default undefined */\n ref?: React.Ref<HTMLDivElement>;\n}\n\nconst anchorClasses: Record<DrawerAnchor, string> = {\n left: 'left-0',\n right: 'right-0',\n};\n\n/**\n * Slide-in side panel for mobile navigation, filters, or detail views.\n * Designed to be used inside an `<Overlay>`.\n *\n * @example\n * ```tsx\n * <Overlay open={isOpen} onClose={close}>\n * <Drawer anchor=\"right\">\n * <Stack gap=\"space-4\" className=\"p-space-4\">...</Stack>\n * </Drawer>\n * </Overlay>\n * ```\n */\nexport function Drawer({\n anchor = 'right',\n maxWidth = '24rem',\n children,\n className = '',\n style,\n ref,\n ...rest\n}: DrawerProps) {\n const classes = [\n 'absolute inset-y-0 w-full bg-fill-bg-primary shadow-elevation-normal',\n anchorClasses[anchor],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={ref}\n className={classes}\n style={{ maxWidth, ...style }}\n role=\"dialog\"\n aria-modal=\"true\"\n {...rest}\n >\n {children}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAyBA;AAAoD;AAC5C;AAER;AAeO;AAAgB;AACZ;AACE;AACX;AACY;AACZ;AACA;AAEF;AACE;AAAgB;AACd;AACoB;AACpB;AAKF;AACE;AAAC;AAAA;AACC;AACW;AACW;AACjB;AACM;AACP;AAEH;AAAA;AAGP;;;;"}
@@ -0,0 +1,40 @@
1
+ import { default as React } from 'react';
2
+ import { FAQItem } from '../../types';
3
+ /**
4
+ * Props for the FAQ component. Each item uses the FAQItem shape: question, answer, disabled?.
5
+ * @see FAQItem
6
+ */
7
+ export interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {
8
+ /** Section heading displayed above the accordion list. @default 'FAQ' */
9
+ heading?: string;
10
+ /** Array of question/answer pairs. Each item: question (string), answer (ReactNode), disabled? (boolean). */
11
+ items: FAQItem[];
12
+ /** Index of the item open by default (uncontrolled). -1 = none. @default undefined */
13
+ defaultOpenIndex?: number;
14
+ /** Currently open index (controlled). Pass -1 for all closed. Use with onChange. @default undefined */
15
+ value?: number;
16
+ /** Called when the open index changes. @default undefined */
17
+ onChange?: (index: number) => void;
18
+ /** Optional link rendered below the list (e.g. "View all FAQs"). @default undefined */
19
+ link?: {
20
+ label: string;
21
+ href: string;
22
+ };
23
+ /** Component to render the footer link as (e.g. next/link). @default 'a' */
24
+ linkAs?: React.ElementType;
25
+ /** Forwarded ref for the section. @default undefined */
26
+ ref?: React.Ref<HTMLElement>;
27
+ }
28
+ /**
29
+ * FAQ section: heading plus an accordion of question/answer pairs. Uses FAQItem shape
30
+ * (question, answer, optional disabled). Supports controlled (value/onChange) or uncontrolled
31
+ * (defaultOpenIndex) expansion. Optional footer link for "View all FAQs" etc.
32
+ *
33
+ * @example
34
+ * <FAQ heading="Questions" items={[{ question: 'What is X?', answer: 'X is...' }]} />
35
+ *
36
+ * @example
37
+ * <FAQ items={faqItems} defaultOpenIndex={0} link={{ label: 'View all', href: '/faq' }} />
38
+ */
39
+ export declare function FAQ({ heading, items, defaultOpenIndex, value, onChange, link, linkAs, className, ref, ...rest }: FAQProps): import("react/jsx-runtime").JSX.Element;
40
+ //# sourceMappingURL=FAQ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FAQ.d.ts","sourceRoot":"","sources":["../../../src/components/FAQ/FAQ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqB3C;;;GAGG;AACH,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IACnF,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,uFAAuF;IACvF,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,4EAA4E;IAC5E,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAC3B,wDAAwD;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,GAAG,CAAC,EAClB,OAAe,EACf,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,SAAc,EACd,GAAG,EACH,GAAG,IAAI,EACR,EAAE,QAAQ,2CA6IV"}
@@ -0,0 +1,161 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import React, { useId, useState, useEffect, useRef, useCallback } from "react";
4
+ function ChevronIcon({ className }) {
5
+ return /* @__PURE__ */ jsx(
6
+ "svg",
7
+ {
8
+ className,
9
+ width: "24",
10
+ height: "24",
11
+ viewBox: "0 0 24 24",
12
+ fill: "none",
13
+ stroke: "currentColor",
14
+ strokeWidth: "1.5",
15
+ strokeLinecap: "round",
16
+ strokeLinejoin: "round",
17
+ "aria-hidden": "true",
18
+ children: /* @__PURE__ */ jsx("path", { d: "M6 9l6 6 6-6" })
19
+ }
20
+ );
21
+ }
22
+ function FAQ({
23
+ heading = "FAQ",
24
+ items,
25
+ defaultOpenIndex,
26
+ value,
27
+ onChange,
28
+ link,
29
+ linkAs,
30
+ className = "",
31
+ ref,
32
+ ...rest
33
+ }) {
34
+ const baseId = useId();
35
+ const isControlled = value !== void 0;
36
+ const [internalOpen, setInternalOpen] = useState(defaultOpenIndex ?? -1);
37
+ const openIndex = isControlled ? value : internalOpen;
38
+ useEffect(() => {
39
+ if (!isControlled && defaultOpenIndex !== void 0) {
40
+ setInternalOpen(defaultOpenIndex);
41
+ }
42
+ }, [defaultOpenIndex, isControlled]);
43
+ const triggerRefs = useRef([]);
44
+ const toggle = useCallback(
45
+ (index) => {
46
+ const next = openIndex === index ? -1 : index;
47
+ if (isControlled) {
48
+ onChange == null ? void 0 : onChange(next);
49
+ } else {
50
+ setInternalOpen(next);
51
+ }
52
+ },
53
+ [openIndex, isControlled, onChange]
54
+ );
55
+ const focusTrigger = (index) => {
56
+ var _a;
57
+ (_a = triggerRefs.current[index]) == null ? void 0 : _a.focus();
58
+ };
59
+ const handleKeyDown = (e, index) => {
60
+ const enabledIndices = items.map((_, i) => i).filter((i) => !items[i].disabled);
61
+ const currentPos = enabledIndices.indexOf(index);
62
+ switch (e.key) {
63
+ case "ArrowDown": {
64
+ e.preventDefault();
65
+ focusTrigger(enabledIndices[(currentPos + 1) % enabledIndices.length]);
66
+ break;
67
+ }
68
+ case "ArrowUp": {
69
+ e.preventDefault();
70
+ focusTrigger(enabledIndices[(currentPos - 1 + enabledIndices.length) % enabledIndices.length]);
71
+ break;
72
+ }
73
+ case "Home": {
74
+ e.preventDefault();
75
+ focusTrigger(enabledIndices[0]);
76
+ break;
77
+ }
78
+ case "End": {
79
+ e.preventDefault();
80
+ focusTrigger(enabledIndices[enabledIndices.length - 1]);
81
+ break;
82
+ }
83
+ }
84
+ };
85
+ return /* @__PURE__ */ jsx(
86
+ "section",
87
+ {
88
+ ref,
89
+ className: `w-full bg-fill-bg-secondary px-space-fluid-4-8 py-space-fluid-8-16 ${className}`,
90
+ ...rest,
91
+ children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-[1328px]", children: [
92
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-space-fluid-4-5", children: [
93
+ heading && /* @__PURE__ */ jsx("h2", { className: "text-title-lg text-text-primary", children: heading }),
94
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-space-2", children: items.map((item, index) => {
95
+ const isOpen = openIndex === index;
96
+ const triggerId = `${baseId}-faq-trigger-${index}`;
97
+ const panelId = `${baseId}-faq-panel-${index}`;
98
+ const disabled = !!item.disabled;
99
+ return /* @__PURE__ */ jsxs(
100
+ "div",
101
+ {
102
+ className: "flex flex-col gap-space-fluid-2-4 rounded-rad-md overflow-hidden bg-fill-action-inverse p-space-fluid-4-8",
103
+ children: [
104
+ /* @__PURE__ */ jsx("h3", { children: /* @__PURE__ */ jsxs(
105
+ "button",
106
+ {
107
+ ref: (el) => {
108
+ triggerRefs.current[index] = el;
109
+ },
110
+ id: triggerId,
111
+ type: "button",
112
+ className: `flex w-full items-center justify-between gap-space-fluid-4-6 text-title-sm text-left transition-colors outline-none ${disabled ? "text-text-disabled cursor-not-allowed" : "text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer"}`,
113
+ "aria-expanded": isOpen,
114
+ "aria-controls": panelId,
115
+ "aria-disabled": disabled || void 0,
116
+ disabled,
117
+ onClick: () => toggle(index),
118
+ onKeyDown: (e) => handleKeyDown(e, index),
119
+ children: [
120
+ /* @__PURE__ */ jsx("span", { children: item.question }),
121
+ /* @__PURE__ */ jsx(
122
+ ChevronIcon,
123
+ {
124
+ className: `h-6 w-6 shrink-0 transition-transform duration-200 ${isOpen ? "rotate-180" : ""}`
125
+ }
126
+ )
127
+ ]
128
+ }
129
+ ) }),
130
+ /* @__PURE__ */ jsx(
131
+ "div",
132
+ {
133
+ id: panelId,
134
+ role: "region",
135
+ "aria-labelledby": triggerId,
136
+ className: `overflow-hidden transition-all duration-200 ease-in-out ${isOpen ? "max-h-[2000px] opacity-100" : "max-h-0 opacity-0"}`,
137
+ children: /* @__PURE__ */ jsx("div", { className: "text-text-md text-text-primary", children: item.answer })
138
+ }
139
+ )
140
+ ]
141
+ },
142
+ index
143
+ );
144
+ }) })
145
+ ] }),
146
+ link && /* @__PURE__ */ jsx("div", { className: "mt-space-fluid-4-6", children: React.createElement(
147
+ linkAs || "a",
148
+ {
149
+ href: link.href,
150
+ className: "text-link-md text-link-primary underline hover:text-link-primary-hover transition-colors"
151
+ },
152
+ link.label
153
+ ) })
154
+ ] })
155
+ }
156
+ );
157
+ }
158
+ export {
159
+ FAQ
160
+ };
161
+ //# sourceMappingURL=FAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FAQ.js","sources":["../../../src/components/FAQ/FAQ.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useRef, useCallback, useId, useEffect } from 'react';\nimport type { FAQItem } from '../../types';\n\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n );\n}\n\n/**\n * Props for the FAQ component. Each item uses the FAQItem shape: question, answer, disabled?.\n * @see FAQItem\n */\nexport interface FAQProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Section heading displayed above the accordion list. @default 'FAQ' */\n heading?: string;\n /** Array of question/answer pairs. Each item: question (string), answer (ReactNode), disabled? (boolean). */\n items: FAQItem[];\n /** Index of the item open by default (uncontrolled). -1 = none. @default undefined */\n defaultOpenIndex?: number;\n /** Currently open index (controlled). Pass -1 for all closed. Use with onChange. @default undefined */\n value?: number;\n /** Called when the open index changes. @default undefined */\n onChange?: (index: number) => void;\n /** Optional link rendered below the list (e.g. \"View all FAQs\"). @default undefined */\n link?: {\n label: string;\n href: string;\n };\n /** Component to render the footer link as (e.g. next/link). @default 'a' */\n linkAs?: React.ElementType;\n /** Forwarded ref for the section. @default undefined */\n ref?: React.Ref<HTMLElement>;\n}\n\n/**\n * FAQ section: heading plus an accordion of question/answer pairs. Uses FAQItem shape\n * (question, answer, optional disabled). Supports controlled (value/onChange) or uncontrolled\n * (defaultOpenIndex) expansion. Optional footer link for \"View all FAQs\" etc.\n *\n * @example\n * <FAQ heading=\"Questions\" items={[{ question: 'What is X?', answer: 'X is...' }]} />\n *\n * @example\n * <FAQ items={faqItems} defaultOpenIndex={0} link={{ label: 'View all', href: '/faq' }} />\n */\nexport function FAQ({\n heading = 'FAQ',\n items,\n defaultOpenIndex,\n value,\n onChange,\n link,\n linkAs,\n className = '',\n ref,\n ...rest\n}: FAQProps) {\n const baseId = useId();\n const isControlled = value !== undefined;\n\n const [internalOpen, setInternalOpen] = useState<number>(defaultOpenIndex ?? -1);\n const openIndex = isControlled ? value : internalOpen;\n\n useEffect(() => {\n if (!isControlled && defaultOpenIndex !== undefined) {\n setInternalOpen(defaultOpenIndex);\n }\n }, [defaultOpenIndex, isControlled]);\n\n const triggerRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const toggle = useCallback(\n (index: number) => {\n const next = openIndex === index ? -1 : index;\n if (isControlled) {\n onChange?.(next);\n } else {\n setInternalOpen(next);\n }\n },\n [openIndex, isControlled, onChange],\n );\n\n const focusTrigger = (index: number) => {\n triggerRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n const enabledIndices = items\n .map((_, i) => i)\n .filter((i) => !items[i].disabled);\n const currentPos = enabledIndices.indexOf(index);\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos + 1) % enabledIndices.length]);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n focusTrigger(enabledIndices[(currentPos - 1 + enabledIndices.length) % enabledIndices.length]);\n break;\n }\n case 'Home': {\n e.preventDefault();\n focusTrigger(enabledIndices[0]);\n break;\n }\n case 'End': {\n e.preventDefault();\n focusTrigger(enabledIndices[enabledIndices.length - 1]);\n break;\n }\n }\n };\n\n return (\n <section\n ref={ref}\n className={`w-full bg-fill-bg-secondary px-space-fluid-4-8 py-space-fluid-8-16 ${className}`}\n {...rest}\n >\n <div className=\"mx-auto w-full max-w-[1328px]\">\n <div className=\"flex flex-col gap-space-fluid-4-5\">\n {heading && (\n <h2 className=\"text-title-lg text-text-primary\">{heading}</h2>\n )}\n\n <div className=\"flex flex-col gap-space-2\">\n {items.map((item, index) => {\n const isOpen = openIndex === index;\n const triggerId = `${baseId}-faq-trigger-${index}`;\n const panelId = `${baseId}-faq-panel-${index}`;\n const disabled = !!item.disabled;\n\n return (\n <div\n key={index}\n className=\"flex flex-col gap-space-fluid-2-4 rounded-rad-md overflow-hidden bg-fill-action-inverse p-space-fluid-4-8\"\n >\n <h3>\n <button\n ref={(el) => { triggerRefs.current[index] = el; }}\n id={triggerId}\n type=\"button\"\n className={`flex w-full items-center justify-between gap-space-fluid-4-6 text-title-sm text-left transition-colors outline-none ${\n disabled\n ? 'text-text-disabled cursor-not-allowed'\n : 'text-text-primary hover:bg-fill-bg-secondary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus cursor-pointer'\n }`}\n aria-expanded={isOpen}\n aria-controls={panelId}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={() => toggle(index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n <span>{item.question}</span>\n <ChevronIcon\n className={`h-6 w-6 shrink-0 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n />\n </button>\n </h3>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={`overflow-hidden transition-all duration-200 ease-in-out ${\n isOpen ? 'max-h-[2000px] opacity-100' : 'max-h-0 opacity-0'\n }`}\n >\n <div className=\"text-text-md text-text-primary\">\n {item.answer}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {link && (\n <div className=\"mt-space-fluid-4-6\">\n {React.createElement(\n linkAs || 'a',\n {\n href: link.href,\n className: 'text-link-md text-link-primary underline hover:text-link-primary-hover transition-colors',\n },\n link.label,\n )}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":";;;AAKA;AACE;AACE;AAAC;AAAA;AACC;AACM;AACC;AACC;AACH;AACE;AACK;AACE;AACC;AACH;AAEW;AAAA;AAG7B;AAuCO;AAAa;AACR;AACV;AACA;AACA;AACA;AACA;AACA;AACY;AACZ;AAEF;AACI;AACA;AAEA;AACA;AAEA;AACE;AACE;AAAgC;AAClC;AAGF;AAEA;AAAe;AAEX;AACA;AACE;AAAW;AAEX;AAAoB;AACtB;AACF;AACkC;AAGpC;;AACE;AAA4B;AAG9B;AACE;AAGA;AAEA;AAAU;AAEN;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAEE;AACA;AACA;AAAA;AACF;AAAA;AAIJ;AACE;AAAC;AAAA;AACC;AAC0F;AACtF;AAGF;AACG;AAC0D;AAKvD;AACA;AACA;AACA;AAEA;AACE;AAAC;AAAA;AAEW;AAEV;AACE;AAAC;AAAA;AACgB;AAA6B;AAAI;AAC5C;AACC;AAKL;AACe;AACA;AACY;AAC3B;AAC2B;AACa;AAExC;AAAqB;AACrB;AAAC;AAAA;AAC4F;AAAA;AAAA;AAC7F;AAAA;AAEJ;AACA;AAAC;AAAA;AACK;AACC;AACY;AAGjB;AAIA;AAAA;AAAA;AACF;AAAA;AArCK;AAAA;AAyCb;AACF;AAIW;AACK;AACV;AACa;AACA;AAAA;AAER;AAET;AAEJ;AAAA;AAGR;;;;"}
@@ -0,0 +1,61 @@
1
+ import { default as React } from 'react';
2
+ import { ResponsiveValue } from '../../utils/responsive-props';
3
+ import { SpacingProps, GapProps } from '../../types/spacing';
4
+ import { LayoutProps } from '../../types/layout';
5
+ /**
6
+ * Props for the Grid component. Extends div attributes (display omitted),
7
+ * SpacingProps, GapProps, and a subset of LayoutProps (alignItems,
8
+ * justifyContent, alignSelf only).
9
+ */
10
+ export interface GridProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'display'>, SpacingProps, GapProps, Pick<LayoutProps, 'alignItems' | 'justifyContent' | 'alignSelf'> {
11
+ /**
12
+ * Number of equal-width columns in the grid.
13
+ *
14
+ * Pass a number for a fixed layout:
15
+ * columns={3} → grid-template-columns: repeat(3, minmax(0, 1fr))
16
+ *
17
+ * Pass a responsive object for breakpoint-specific layouts:
18
+ * columns={{ base: 1, sm: 2, lg: 4 }}
19
+ * Breakpoints: sm=600px, md=800px, lg=940px, xl=1440px
20
+ *
21
+ * When undefined, defaults to a 9-column grid at base and
22
+ * 12-column at sm (the library's default layout grid).
23
+ * @default undefined
24
+ */
25
+ columns?: ResponsiveValue<number>;
26
+ /** Forwarded ref for the root div. @default undefined */
27
+ ref?: React.Ref<HTMLDivElement>;
28
+ /** Grid cell content. @default undefined */
29
+ children?: React.ReactNode;
30
+ }
31
+ /**
32
+ * Two-dimensional CSS grid layout component. Use for multi-column
33
+ * layouts, card grids, and any content that needs rows and columns.
34
+ *
35
+ * For one-dimensional sequences of children, use Stack instead.
36
+ * Grid renders with display: grid and width: 100% by default.
37
+ *
38
+ * The columns prop accepts a number for a fixed column count or a
39
+ * responsive object for breakpoint-specific column counts.
40
+ *
41
+ * @example
42
+ * // Fixed 3-column grid
43
+ * <Grid columns={3} gap="space-4">
44
+ * <Card />
45
+ * <Card />
46
+ * <Card />
47
+ * </Grid>
48
+ *
49
+ * @example
50
+ * // Responsive column grid
51
+ * <Grid columns={{ base: 1, sm: 2, lg: 3 }} gap="space-6" p="space-4">
52
+ * <Card />
53
+ * <Card />
54
+ * <Card />
55
+ * </Grid>
56
+ */
57
+ export declare function Grid({ columns, gap, rowGap, columnGap, alignItems, justifyContent, alignSelf, children, className, style, ref, ...rest }: GridProps): import("react/jsx-runtime").JSX.Element;
58
+ export declare namespace Grid {
59
+ var displayName: string;
60
+ }
61
+ //# sourceMappingURL=Grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../../../src/components/Grid/Grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD;;;;GAIG;AACH,MAAM,WAAW,SACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,EAC3D,YAAY,EACZ,QAAQ,EACR,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,gBAAgB,GAAG,WAAW,CAAC;IAClE;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAClC,yDAAyD;IACzD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,GAAe,EACf,MAAM,EACN,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,QAAQ,EACR,SAAc,EACd,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,SAAS,2CA6EX;yBA1Fe,IAAI"}
@@ -0,0 +1,95 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { isResponsiveObject, buildMediaCSS, generateScopeId, renderScopedStyle } from "../../utils/responsive-props.js";
3
+ import { resolveSpacing, SPACING_PROP_KEYS } from "../../utils/spacing.js";
4
+ import { resolveLayout } from "../../utils/layoutClasses.js";
5
+ const GRID_SPACING_KEYS = [
6
+ ...SPACING_PROP_KEYS,
7
+ "gap",
8
+ "rowGap",
9
+ "columnGap"
10
+ ];
11
+ const GRID_LAYOUT_KEYS = ["alignItems", "justifyContent", "alignSelf"];
12
+ function Grid({
13
+ columns,
14
+ gap = "space-2",
15
+ rowGap,
16
+ columnGap,
17
+ alignItems,
18
+ justifyContent,
19
+ alignSelf,
20
+ children,
21
+ className = "",
22
+ style,
23
+ ref,
24
+ ...rest
25
+ }) {
26
+ const spacingClasses = resolveSpacing({
27
+ ...rest,
28
+ gap,
29
+ rowGap,
30
+ columnGap
31
+ });
32
+ const layoutClasses = resolveLayout({
33
+ alignItems,
34
+ justifyContent,
35
+ alignSelf
36
+ });
37
+ const restWithoutSpacing = { ...rest };
38
+ for (const key of GRID_SPACING_KEYS) {
39
+ delete restWithoutSpacing[key];
40
+ }
41
+ for (const key of GRID_LAYOUT_KEYS) {
42
+ delete restWithoutSpacing[key];
43
+ }
44
+ const base = {
45
+ display: "grid",
46
+ width: "100%",
47
+ ...style
48
+ };
49
+ let needsId = false;
50
+ const mediaRules = {};
51
+ const useDefaultColumns = columns === void 0;
52
+ if (columns !== void 0) {
53
+ if (isResponsiveObject(columns)) {
54
+ needsId = true;
55
+ for (const [bp, val] of Object.entries(columns)) {
56
+ if (val === void 0) continue;
57
+ const gridVal = `repeat(${val}, minmax(0, 1fr))`;
58
+ if (bp === "base") {
59
+ base.gridTemplateColumns = gridVal;
60
+ } else {
61
+ if (!mediaRules[bp]) mediaRules[bp] = {};
62
+ mediaRules[bp]["grid-template-columns"] = gridVal;
63
+ }
64
+ }
65
+ } else {
66
+ base.gridTemplateColumns = `repeat(${columns}, minmax(0, 1fr))`;
67
+ }
68
+ }
69
+ const componentMedia = buildMediaCSS(mediaRules);
70
+ const scopeId = needsId && componentMedia ? generateScopeId(componentMedia, "grd") : void 0;
71
+ const classes = [
72
+ useDefaultColumns ? "grid-cols-9 sm:grid-cols-12" : "",
73
+ layoutClasses,
74
+ spacingClasses,
75
+ className
76
+ ].filter(Boolean).join(" ");
77
+ const elementProps = {
78
+ ref,
79
+ className: classes || void 0,
80
+ style: base,
81
+ ...restWithoutSpacing
82
+ };
83
+ if (scopeId) {
84
+ elementProps["data-jds"] = scopeId;
85
+ }
86
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
87
+ scopeId && renderScopedStyle(componentMedia, scopeId),
88
+ /* @__PURE__ */ jsx("div", { ...elementProps, children })
89
+ ] });
90
+ }
91
+ Grid.displayName = "Grid";
92
+ export {
93
+ Grid
94
+ };
95
+ //# sourceMappingURL=Grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.js","sources":["../../../src/components/Grid/Grid.tsx"],"sourcesContent":["import React from 'react';\nimport {\n isResponsiveObject,\n generateScopeId,\n buildMediaCSS,\n renderScopedStyle,\n type ResponsiveValue,\n} from '../../utils/responsive-props';\nimport type { SpacingProps, GapProps } from '../../types/spacing';\nimport type { LayoutProps } from '../../types/layout';\nimport { resolveSpacing, SPACING_PROP_KEYS } from '../../utils/spacing';\nimport { resolveLayout } from '../../utils/layoutClasses';\n\nconst GRID_SPACING_KEYS = [\n ...SPACING_PROP_KEYS,\n 'gap',\n 'rowGap',\n 'columnGap',\n] as const;\n\nconst GRID_LAYOUT_KEYS = ['alignItems', 'justifyContent', 'alignSelf'] as const;\n\n/**\n * Props for the Grid component. Extends div attributes (display omitted),\n * SpacingProps, GapProps, and a subset of LayoutProps (alignItems,\n * justifyContent, alignSelf only).\n */\nexport interface GridProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'display'>,\n SpacingProps,\n GapProps,\n Pick<LayoutProps, 'alignItems' | 'justifyContent' | 'alignSelf'> {\n /**\n * Number of equal-width columns in the grid.\n *\n * Pass a number for a fixed layout:\n * columns={3} → grid-template-columns: repeat(3, minmax(0, 1fr))\n *\n * Pass a responsive object for breakpoint-specific layouts:\n * columns={{ base: 1, sm: 2, lg: 4 }}\n * Breakpoints: sm=600px, md=800px, lg=940px, xl=1440px\n *\n * When undefined, defaults to a 9-column grid at base and\n * 12-column at sm (the library's default layout grid).\n * @default undefined\n */\n columns?: ResponsiveValue<number>;\n /** Forwarded ref for the root div. @default undefined */\n ref?: React.Ref<HTMLDivElement>;\n /** Grid cell content. @default undefined */\n children?: React.ReactNode;\n}\n\n/**\n * Two-dimensional CSS grid layout component. Use for multi-column\n * layouts, card grids, and any content that needs rows and columns.\n *\n * For one-dimensional sequences of children, use Stack instead.\n * Grid renders with display: grid and width: 100% by default.\n *\n * The columns prop accepts a number for a fixed column count or a\n * responsive object for breakpoint-specific column counts.\n *\n * @example\n * // Fixed 3-column grid\n * <Grid columns={3} gap=\"space-4\">\n * <Card />\n * <Card />\n * <Card />\n * </Grid>\n *\n * @example\n * // Responsive column grid\n * <Grid columns={{ base: 1, sm: 2, lg: 3 }} gap=\"space-6\" p=\"space-4\">\n * <Card />\n * <Card />\n * <Card />\n * </Grid>\n */\nexport function Grid({\n columns,\n gap = 'space-2',\n rowGap,\n columnGap,\n alignItems,\n justifyContent,\n alignSelf,\n children,\n className = '',\n style,\n ref,\n ...rest\n}: GridProps) {\n const spacingClasses = resolveSpacing({\n ...rest,\n gap,\n rowGap,\n columnGap,\n });\n const layoutClasses = resolveLayout({\n alignItems,\n justifyContent,\n alignSelf,\n });\n const restWithoutSpacing = { ...rest };\n for (const key of GRID_SPACING_KEYS) {\n delete (restWithoutSpacing as Record<string, unknown>)[key];\n }\n for (const key of GRID_LAYOUT_KEYS) {\n delete (restWithoutSpacing as Record<string, unknown>)[key];\n }\n\n const base: React.CSSProperties = {\n display: 'grid',\n width: '100%',\n ...style,\n };\n\n let needsId = false;\n const mediaRules: Record<string, Record<string, string>> = {};\n const useDefaultColumns = columns === undefined;\n\n if (columns !== undefined) {\n if (isResponsiveObject(columns)) {\n needsId = true;\n for (const [bp, val] of Object.entries(columns)) {\n if (val === undefined) continue;\n const gridVal = `repeat(${val}, minmax(0, 1fr))`;\n if (bp === 'base') {\n base.gridTemplateColumns = gridVal;\n } else {\n if (!mediaRules[bp]) mediaRules[bp] = {};\n mediaRules[bp]['grid-template-columns'] = gridVal;\n }\n }\n } else {\n base.gridTemplateColumns = `repeat(${columns}, minmax(0, 1fr))`;\n }\n }\n\n const componentMedia = buildMediaCSS(mediaRules);\n const scopeId = needsId && componentMedia ? generateScopeId(componentMedia, 'grd') : undefined;\n\n const classes = [\n useDefaultColumns ? 'grid-cols-9 sm:grid-cols-12' : '',\n layoutClasses,\n spacingClasses,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const elementProps: Record<string, unknown> = {\n ref,\n className: classes || undefined,\n style: base,\n ...restWithoutSpacing,\n };\n\n if (scopeId) {\n elementProps['data-jds'] = scopeId;\n }\n\n return (\n <>\n {scopeId && renderScopedStyle(componentMedia, scopeId)}\n <div {...elementProps}>{children}</div>\n </>\n );\n}\n\nGrid.displayName = 'Grid';\n"],"names":[],"mappings":";;;;AAaA,MAAM,oBAAoB;AAAA,EACxB,GAAG;AAAA,EACH;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,mBAAmB,CAAC,cAAc,kBAAkB,WAAW;AA2D9D,SAAS,KAAK;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAc;AACZ,QAAM,iBAAiB,eAAe;AAAA,IACpC,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,gBAAgB,cAAc;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,qBAAqB,EAAE,GAAG,KAAA;AAChC,aAAW,OAAO,mBAAmB;AACnC,WAAQ,mBAA+C,GAAG;AAAA,EAC5D;AACA,aAAW,OAAO,kBAAkB;AAClC,WAAQ,mBAA+C,GAAG;AAAA,EAC5D;AAEA,QAAM,OAA4B;AAAA,IAChC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,GAAG;AAAA,EAAA;AAGL,MAAI,UAAU;AACd,QAAM,aAAqD,CAAA;AAC3D,QAAM,oBAAoB,YAAY;AAEtC,MAAI,YAAY,QAAW;AACzB,QAAI,mBAAmB,OAAO,GAAG;AAC/B,gBAAU;AACV,iBAAW,CAAC,IAAI,GAAG,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC/C,YAAI,QAAQ,OAAW;AACvB,cAAM,UAAU,UAAU,GAAG;AAC7B,YAAI,OAAO,QAAQ;AACjB,eAAK,sBAAsB;AAAA,QAC7B,OAAO;AACL,cAAI,CAAC,WAAW,EAAE,EAAG,YAAW,EAAE,IAAI,CAAA;AACtC,qBAAW,EAAE,EAAE,uBAAuB,IAAI;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,sBAAsB,UAAU,OAAO;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,iBAAiB,cAAc,UAAU;AAC/C,QAAM,UAAU,WAAW,iBAAiB,gBAAgB,gBAAgB,KAAK,IAAI;AAErF,QAAM,UAAU;AAAA,IACd,oBAAoB,gCAAgC;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,eAAwC;AAAA,IAC5C;AAAA,IACA,WAAW,WAAW;AAAA,IACtB,OAAO;AAAA,IACP,GAAG;AAAA,EAAA;AAGL,MAAI,SAAS;AACX,iBAAa,UAAU,IAAI;AAAA,EAC7B;AAEA,SACE,qBAAA,UAAA,EACG,UAAA;AAAA,IAAA,WAAW,kBAAkB,gBAAgB,OAAO;AAAA,IACrD,oBAAC,OAAA,EAAK,GAAG,cAAe,SAAA,CAAS;AAAA,EAAA,GACnC;AAEJ;AAEA,KAAK,cAAc;"}
@@ -0,0 +1,21 @@
1
+ import { default as React } from 'react';
2
+ /**
3
+ * Union of all available icon names in the library. Use with the Icon component's name prop.
4
+ * Icons use currentColor so they inherit text colour from CSS.
5
+ */
6
+ export type IconName = 'chevron-down' | 'chevron-up' | 'chevron-left' | 'chevron-right' | 'arrow-right' | 'arrow-left' | 'arrow-up' | 'arrow-down' | 'close' | 'menu' | 'check' | 'search' | 'globe' | 'info' | 'warning' | 'error' | 'plus' | 'minus' | 'edit' | 'trash' | 'eye' | 'eye-off' | 'copy' | 'download' | 'upload' | 'filter' | 'sort' | 'calendar' | 'clock' | 'user' | 'settings' | 'home' | 'mail' | 'phone' | 'map-pin' | 'external-link' | 'link' | 'star' | 'heart' | 'share' | 'whatsapp' | 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'x-twitter';
7
+ /**
8
+ * Props for the Icon component. Renders an inline SVG; colour comes from CSS (currentColor).
9
+ */
10
+ export interface IconProps extends React.SVGAttributes<SVGSVGElement> {
11
+ /** Which icon to render. Must be a valid IconName. */
12
+ name: IconName;
13
+ /** Width and height in pixels. @default 24 */
14
+ size?: number;
15
+ /** Additional class names. @default undefined */
16
+ className?: string;
17
+ /** Forwarded ref for the SVG element. @default undefined */
18
+ ref?: React.Ref<SVGSVGElement>;
19
+ }
20
+ export declare function Icon({ name, size, className, style, ref, ...rest }: IconProps): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=Icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.d.ts","sourceRoot":"","sources":["../../../src/components/Icon/Icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAChB,cAAc,GACd,YAAY,GACZ,cAAc,GACd,eAAe,GACf,aAAa,GACb,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,OAAO,GACP,MAAM,GACN,OAAO,GACP,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,OAAO,GACP,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,KAAK,GACL,SAAS,GACT,MAAM,GACN,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,UAAU,GACV,OAAO,GACP,MAAM,GACN,UAAU,GACV,MAAM,GACN,MAAM,GACN,OAAO,GACP,SAAS,GACT,eAAe,GACf,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,GACP,UAAU,GACV,UAAU,GACV,WAAW,GACX,QAAQ,GACR,UAAU,GACV,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC;IACnE,sDAAsD;IACtD,IAAI,EAAE,QAAQ,CAAC;IACf,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;CAChC;AA0PD,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,SAAc,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,2CAiBvF"}