fictoan-react 2.0.0-beta.17 → 2.0.0-beta.18

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 (181) hide show
  1. package/dist/components/Accordion/Accordion.d.ts.map +1 -1
  2. package/dist/components/Accordion/Accordion.js +27 -0
  3. package/dist/components/Accordion/Accordion.js.map +1 -0
  4. package/dist/components/Badge/Badge.d.ts.map +1 -1
  5. package/dist/components/Badge/Badge.js +56 -0
  6. package/dist/components/Badge/Badge.js.map +1 -0
  7. package/dist/components/Breadcrumbs/Breadcrumbs.js +65 -0
  8. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -0
  9. package/dist/components/Button/Button.js +28 -0
  10. package/dist/components/Button/Button.js.map +1 -0
  11. package/dist/components/ButtonGroup/ButtonGroup.js +27 -0
  12. package/dist/components/ButtonGroup/ButtonGroup.js.map +1 -0
  13. package/dist/components/Callout/Callout.js +31 -0
  14. package/dist/components/Callout/Callout.js.map +1 -0
  15. package/dist/components/Card/Card.js +27 -0
  16. package/dist/components/Card/Card.js.map +1 -0
  17. package/dist/components/CodeBlock/CodeBlock.js +191 -0
  18. package/dist/components/CodeBlock/CodeBlock.js.map +1 -0
  19. package/dist/components/Divider/Divider.js +29 -0
  20. package/dist/components/Divider/Divider.js.map +1 -0
  21. package/dist/components/Drawer/Drawer.d.ts +3 -0
  22. package/dist/components/Drawer/Drawer.d.ts.map +1 -1
  23. package/dist/components/Drawer/Drawer.js +96 -0
  24. package/dist/components/Drawer/Drawer.js.map +1 -0
  25. package/dist/components/Element/Element.d.ts +6 -2
  26. package/dist/components/Element/Element.d.ts.map +1 -1
  27. package/dist/components/Element/Element.js +152 -0
  28. package/dist/components/Element/Element.js.map +1 -0
  29. package/dist/components/Element/Tags.js +31 -0
  30. package/dist/components/Element/Tags.js.map +1 -0
  31. package/dist/components/Element/constants.js +8 -0
  32. package/dist/components/Element/constants.js.map +1 -0
  33. package/dist/components/Form/Checkbox/Checkbox.d.ts.map +1 -1
  34. package/dist/components/Form/Checkbox/Checkbox.js +78 -0
  35. package/dist/components/Form/Checkbox/Checkbox.js.map +1 -0
  36. package/dist/components/Form/Checkbox/CheckboxAndSwitchGroup.d.ts.map +1 -1
  37. package/dist/components/Form/Checkbox/CheckboxAndSwitchGroup.js +177 -0
  38. package/dist/components/Form/Checkbox/CheckboxAndSwitchGroup.js.map +1 -0
  39. package/dist/components/Form/Checkbox/Switch.d.ts.map +1 -1
  40. package/dist/components/Form/Checkbox/Switch.js +78 -0
  41. package/dist/components/Form/Checkbox/Switch.js.map +1 -0
  42. package/dist/components/Form/FileUpload/FileUpload.d.ts.map +1 -1
  43. package/dist/components/Form/FileUpload/FileUpload.js +142 -0
  44. package/dist/components/Form/FileUpload/FileUpload.js.map +1 -0
  45. package/dist/components/Form/Form/Form.js +37 -0
  46. package/dist/components/Form/Form/Form.js.map +1 -0
  47. package/dist/components/Form/Form/FormGenerator.js +64 -0
  48. package/dist/components/Form/Form/FormGenerator.js.map +1 -0
  49. package/dist/components/Form/FormItem/FormItem.d.ts +16 -0
  50. package/dist/components/Form/FormItem/FormItem.d.ts.map +1 -1
  51. package/dist/components/Form/FormItem/FormItem.js +127 -0
  52. package/dist/components/Form/FormItem/FormItem.js.map +1 -0
  53. package/dist/components/Form/FormItemGroup/FormItemGroup.js +42 -0
  54. package/dist/components/Form/FormItemGroup/FormItemGroup.js.map +1 -0
  55. package/dist/components/Form/InputField/InputField.d.ts.map +1 -1
  56. package/dist/components/Form/InputField/InputField.js +156 -0
  57. package/dist/components/Form/InputField/InputField.js.map +1 -0
  58. package/dist/components/Form/InputLabel/InputLabel.js +30 -0
  59. package/dist/components/Form/InputLabel/InputLabel.js.map +1 -0
  60. package/dist/components/Form/ListBox/ListBox.d.ts.map +1 -1
  61. package/dist/components/Form/ListBox/ListBox.js +284 -0
  62. package/dist/components/Form/ListBox/ListBox.js.map +1 -0
  63. package/dist/components/Form/ListBox/constants.d.ts +1 -1
  64. package/dist/components/Form/ListBox/constants.d.ts.map +1 -1
  65. package/dist/components/Form/ListBox/listBoxUtils.js +49 -0
  66. package/dist/components/Form/ListBox/listBoxUtils.js.map +1 -0
  67. package/dist/components/Form/PinInputField/PinInputField.d.ts +6 -1
  68. package/dist/components/Form/PinInputField/PinInputField.d.ts.map +1 -1
  69. package/dist/components/Form/PinInputField/PinInputField.js +165 -0
  70. package/dist/components/Form/PinInputField/PinInputField.js.map +1 -0
  71. package/dist/components/Form/RadioButton/RadioButton.d.ts.map +1 -1
  72. package/dist/components/Form/RadioButton/RadioButton.js +82 -0
  73. package/dist/components/Form/RadioButton/RadioButton.js.map +1 -0
  74. package/dist/components/Form/RadioButton/RadioGroup.d.ts.map +1 -1
  75. package/dist/components/Form/RadioButton/RadioGroup.js +97 -0
  76. package/dist/components/Form/RadioButton/RadioGroup.js.map +1 -0
  77. package/dist/components/Form/RadioButton/RadioTabGroup.d.ts.map +1 -1
  78. package/dist/components/Form/RadioButton/RadioTabGroup.js +182 -0
  79. package/dist/components/Form/RadioButton/RadioTabGroup.js.map +1 -0
  80. package/dist/components/Form/Range/Range.js +376 -0
  81. package/dist/components/Form/Range/Range.js.map +1 -0
  82. package/dist/components/Form/Select/Select.d.ts.map +1 -1
  83. package/dist/components/Form/Select/Select.js +83 -0
  84. package/dist/components/Form/Select/Select.js.map +1 -0
  85. package/dist/components/Form/TextArea/TextArea.d.ts.map +1 -1
  86. package/dist/components/Form/TextArea/TextArea.js +111 -0
  87. package/dist/components/Form/TextArea/TextArea.js.map +1 -0
  88. package/dist/components/Meter/Meter.js +110 -0
  89. package/dist/components/Meter/Meter.js.map +1 -0
  90. package/dist/components/Modal/Modal.d.ts.map +1 -1
  91. package/dist/components/Modal/Modal.js +75 -0
  92. package/dist/components/Modal/Modal.js.map +1 -0
  93. package/dist/components/Notification/NotificationItem/NotificationItem.d.ts.map +1 -1
  94. package/dist/components/Notification/NotificationItem/NotificationItem.js +70 -0
  95. package/dist/components/Notification/NotificationItem/NotificationItem.js.map +1 -0
  96. package/dist/components/Notification/NotificationsProvider/NotificationsProvider.js +88 -0
  97. package/dist/components/Notification/NotificationsProvider/NotificationsProvider.js.map +1 -0
  98. package/dist/components/Notification/NotificationsWrapper/NotificationsWrapper.d.ts.map +1 -1
  99. package/dist/components/Notification/NotificationsWrapper/NotificationsWrapper.js +35 -0
  100. package/dist/components/Notification/NotificationsWrapper/NotificationsWrapper.js.map +1 -0
  101. package/dist/components/OptionCard/OptionCard.js +150 -0
  102. package/dist/components/OptionCard/OptionCard.js.map +1 -0
  103. package/dist/components/Pagination/Pagination.d.ts.map +1 -1
  104. package/dist/components/Pagination/Pagination.js +206 -0
  105. package/dist/components/Pagination/Pagination.js.map +1 -0
  106. package/dist/components/Pagination/usePagination.js +35 -0
  107. package/dist/components/Pagination/usePagination.js.map +1 -0
  108. package/dist/components/Portion/Portion.js +34 -0
  109. package/dist/components/Portion/Portion.js.map +1 -0
  110. package/dist/components/ProgressBar/ProgressBar.js +63 -0
  111. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  112. package/dist/components/Row/Row.js +40 -0
  113. package/dist/components/Row/Row.js.map +1 -0
  114. package/dist/components/Sidebar/ContentWrapper/ContentWrapper.js +23 -0
  115. package/dist/components/Sidebar/ContentWrapper/ContentWrapper.js.map +1 -0
  116. package/dist/components/Sidebar/SidebarFooter/SidebarFooter.js +25 -0
  117. package/dist/components/Sidebar/SidebarFooter/SidebarFooter.js.map +1 -0
  118. package/dist/components/Sidebar/SidebarHeader/SidebarHeader.js +25 -0
  119. package/dist/components/Sidebar/SidebarHeader/SidebarHeader.js.map +1 -0
  120. package/dist/components/Sidebar/SidebarItem/SidebarItem.js +30 -0
  121. package/dist/components/Sidebar/SidebarItem/SidebarItem.js.map +1 -0
  122. package/dist/components/Sidebar/SidebarItemsGroup/SidebarItemsGroup.js +29 -0
  123. package/dist/components/Sidebar/SidebarItemsGroup/SidebarItemsGroup.js.map +1 -0
  124. package/dist/components/Sidebar/SidebarWrapper/SidebarWrapper.d.ts.map +1 -1
  125. package/dist/components/Sidebar/SidebarWrapper/SidebarWrapper.js +35 -0
  126. package/dist/components/Sidebar/SidebarWrapper/SidebarWrapper.js.map +1 -0
  127. package/dist/components/Skeleton/Skeleton.js +84 -0
  128. package/dist/components/Skeleton/Skeleton.js.map +1 -0
  129. package/dist/components/Spinner/Spinner.js +33 -0
  130. package/dist/components/Spinner/Spinner.js.map +1 -0
  131. package/dist/components/Table/Table.js +53 -0
  132. package/dist/components/Table/Table.js.map +1 -0
  133. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  134. package/dist/components/Tabs/Tabs.js +104 -0
  135. package/dist/components/Tabs/Tabs.js.map +1 -0
  136. package/dist/components/ThemeProvider/ThemeProvider.d.ts +6 -0
  137. package/dist/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  138. package/dist/components/ThemeProvider/ThemeProvider.js +52 -0
  139. package/dist/components/ThemeProvider/ThemeProvider.js.map +1 -0
  140. package/dist/components/Toast/ToastItem/ToastItem.js +47 -0
  141. package/dist/components/Toast/ToastItem/ToastItem.js.map +1 -0
  142. package/dist/components/Toast/ToastsProvider/ToastsProvider.js +45 -0
  143. package/dist/components/Toast/ToastsProvider/ToastsProvider.js.map +1 -0
  144. package/dist/components/Toast/ToastsWrapper/ToastsWrapper.d.ts.map +1 -1
  145. package/dist/components/Toast/ToastsWrapper/ToastsWrapper.js +28 -0
  146. package/dist/components/Toast/ToastsWrapper/ToastsWrapper.js.map +1 -0
  147. package/dist/components/Tooltip/Tooltip.d.ts +1 -1
  148. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  149. package/dist/components/Tooltip/Tooltip.js +62 -0
  150. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  151. package/dist/components/Typography/Heading.js +30 -0
  152. package/dist/components/Typography/Heading.js.map +1 -0
  153. package/dist/components/Typography/Text.js +15 -0
  154. package/dist/components/Typography/Text.js.map +1 -0
  155. package/dist/components/index.js +124 -75
  156. package/dist/components/index.js.map +1 -1
  157. package/dist/fictoan-schema.json +2070 -0
  158. package/dist/hooks/UseClickOutside.js +17 -0
  159. package/dist/hooks/UseClickOutside.js.map +1 -0
  160. package/dist/hooks/UseViewTransition.d.ts +2 -0
  161. package/dist/hooks/UseViewTransition.d.ts.map +1 -0
  162. package/dist/hooks/UseViewTransition.js +17 -0
  163. package/dist/hooks/UseViewTransition.js.map +1 -0
  164. package/dist/index.css +6 -10661
  165. package/dist/index.d.ts +1 -0
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +142 -151
  168. package/dist/index.js.map +1 -1
  169. package/dist/scripts/generateSchema.d.ts +2 -0
  170. package/dist/scripts/generateSchema.d.ts.map +1 -0
  171. package/dist/scripts/schema-meta.d.ts +12 -0
  172. package/dist/scripts/schema-meta.d.ts.map +1 -0
  173. package/dist/styles/colours.js +55 -0
  174. package/dist/styles/colours.js.map +1 -0
  175. package/dist/utils/classNames.js +6 -0
  176. package/dist/utils/classNames.js.map +1 -0
  177. package/dist/utils/propSeparation.js +77 -0
  178. package/dist/utils/propSeparation.js.map +1 -0
  179. package/package.json +12 -18
  180. package/dist/Accordion-CeGNgNW8.js +0 -4254
  181. package/dist/Accordion-CeGNgNW8.js.map +0 -1
@@ -0,0 +1,150 @@
1
+ "use client";
2
+ import { jsxs as S, Fragment as j, jsx as g } from "react/jsx-runtime";
3
+ import E, { useContext as b, createContext as z, useState as R, useRef as B, useCallback as f } from "react";
4
+ import { Div as K } from "../Element/Tags.js";
5
+ import { Card as _ } from "../Card/Card.js";
6
+ /* empty css */
7
+ import { Element as F } from "../Element/Element.js";
8
+ const x = z({
9
+ isSelected: () => !1,
10
+ toggleSelection: () => {
11
+ },
12
+ showTickIcon: !1,
13
+ tickPosition: "top-right",
14
+ selectAll: () => {
15
+ },
16
+ selectNone: () => {
17
+ },
18
+ selectInverse: () => {
19
+ },
20
+ registerOption: () => {
21
+ },
22
+ unregisterOption: () => {
23
+ }
24
+ }), V = E.forwardRef(
25
+ ({
26
+ children: s,
27
+ allowMultipleSelections: r = !1,
28
+ showTickIcon: o,
29
+ onSelectionChange: a,
30
+ tickPosition: p = "top-right",
31
+ selectionLimit: n,
32
+ defaultSelectedIds: m,
33
+ selectedIds: I,
34
+ ...k
35
+ }, C) => {
36
+ const u = I !== void 0, [y, O] = R(
37
+ m ? new Set(m) : /* @__PURE__ */ new Set()
38
+ ), l = B(/* @__PURE__ */ new Map()), i = u ? I : y, c = f((e) => {
39
+ u || O(e), a == null || a(e);
40
+ }, [u, a]), N = f((e, t) => {
41
+ l.current.set(e, t);
42
+ }, []), D = f((e) => {
43
+ l.current.delete(e);
44
+ }, []), d = f((e) => {
45
+ const t = new Set(i);
46
+ if (r)
47
+ if (t.has(e))
48
+ t.delete(e);
49
+ else {
50
+ if (n && t.size >= n)
51
+ return;
52
+ t.add(e);
53
+ }
54
+ else
55
+ t.has(e) && i.size === 1 ? t.clear() : (t.clear(), t.add(e));
56
+ c(t);
57
+ }, [i, r, n, c]), h = f(() => {
58
+ if (!r) return;
59
+ const e = Array.from(l.current.entries()).filter(([w, v]) => !v).map(([w]) => w), t = n ? e.slice(0, n) : e;
60
+ c(new Set(t));
61
+ }, [r, n, c]), T = f(() => {
62
+ c(/* @__PURE__ */ new Set());
63
+ }, [c]), A = f(() => {
64
+ if (!r) return;
65
+ const t = Array.from(l.current.entries()).filter(([v, M]) => !M).map(([v]) => v).filter((v) => !i.has(v)), w = n ? t.slice(0, n) : t;
66
+ c(new Set(w));
67
+ }, [i, r, n, c]), G = f((e) => i.has(e), [i]);
68
+ E.useImperativeHandle(C, () => ({
69
+ selectAll: h,
70
+ selectNone: T,
71
+ selectInverse: A
72
+ }), [h, T, A]);
73
+ const H = {
74
+ isSelected: G,
75
+ toggleSelection: d,
76
+ showTickIcon: o,
77
+ tickPosition: p,
78
+ selectAll: h,
79
+ selectNone: T,
80
+ selectInverse: A,
81
+ registerOption: N,
82
+ unregisterOption: D
83
+ };
84
+ return /* @__PURE__ */ g(x.Provider, { value: H, children: /* @__PURE__ */ g(K, { "data-option-cards-group": !0, className: `tick-${p}`, children: s }) });
85
+ }
86
+ );
87
+ V.displayName = "OptionCardsGroup";
88
+ const W = (s) => {
89
+ const r = b(x);
90
+ return {
91
+ isSelected: r.isSelected(s),
92
+ toggleSelection: () => r.toggleSelection(s),
93
+ showTickIcon: r.showTickIcon
94
+ };
95
+ }, X = () => {
96
+ const { selectAll: s, selectNone: r, selectInverse: o } = b(x);
97
+ return { selectAll: s, selectNone: r, selectInverse: o };
98
+ }, Y = ({ id: s, children: r, disabled: o = !1, ...a }) => {
99
+ const { isSelected: p, toggleSelection: n, showTickIcon: m, registerOption: I, unregisterOption: k } = b(x), [C, u] = R(!1), [y, O] = R(!0);
100
+ E.useEffect(() => (I(s, o), () => k(s)), [s, o, I, k]);
101
+ let l = [];
102
+ p(s) && l.push("selected"), o && l.push("disabled"), C && l.push("show-deselect");
103
+ const i = () => {
104
+ p(s) && !y && u(!0);
105
+ }, c = () => {
106
+ u(!1), O(!1);
107
+ }, N = (d) => {
108
+ var h;
109
+ o || (O(!0), u(!1), n(s), (h = a.onClick) == null || h.call(a, d));
110
+ }, D = (d) => {
111
+ (d.key === "Enter" || d.key === " ") && !o && (d.preventDefault(), O(!0), u(!1), n(s));
112
+ };
113
+ return /* @__PURE__ */ S(
114
+ F,
115
+ {
116
+ as: _,
117
+ "data-option-card": !0,
118
+ role: "button",
119
+ tabIndex: o ? -1 : 0,
120
+ "aria-disabled": o,
121
+ "aria-pressed": p(s),
122
+ classNames: l,
123
+ onClick: N,
124
+ onKeyDown: D,
125
+ onMouseEnter: i,
126
+ onMouseLeave: c,
127
+ ...a,
128
+ children: [
129
+ m && /* @__PURE__ */ S(j, { children: [
130
+ /* @__PURE__ */ S("svg", { viewBox: "0 0 24 24", className: "tick-icon", children: [
131
+ /* @__PURE__ */ g("circle", { cx: "12", cy: "12", r: "11" }),
132
+ /* @__PURE__ */ g("path", { d: "M8 13 L11 15 L16 9" })
133
+ ] }),
134
+ /* @__PURE__ */ S("svg", { viewBox: "0 0 24 24", className: "deselect-icon", children: [
135
+ /* @__PURE__ */ g("circle", { cx: "12", cy: "12", r: "11" }),
136
+ /* @__PURE__ */ g("path", { d: "M8 8 L16 16 M16 8 L8 16" })
137
+ ] })
138
+ ] }),
139
+ r
140
+ ]
141
+ }
142
+ );
143
+ };
144
+ export {
145
+ Y as OptionCard,
146
+ V as OptionCardsGroup,
147
+ W as useOptionCard,
148
+ X as useOptionCardsGroup
149
+ };
150
+ //# sourceMappingURL=OptionCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OptionCard.js","sources":["../../../src/components/OptionCard/OptionCard.tsx"],"sourcesContent":["// FRAMEWORK ===========================================================================================================\nimport React, { createContext, useContext, useState, ReactNode, useCallback, useRef, useEffect } from \"react\";\n\n// FICTOAN =============================================================================================================\nimport { Element } from \"$element\";\nimport { Div } from \"$tags\";\nimport { Card, CardElementType, CardProps } from \"../Card/Card\";\n\n// STYLES ==============================================================================================================\nimport \"./option-card.css\";\n\n// TYPES ===============================================================================================================\nexport type TickPosition =\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"centre-left\"\n | \"center-left\"\n | \"centre-right\"\n | \"center-right\"\n | \"centre-top\"\n | \"center-top\"\n | \"center-bottom\"\n | \"centre-bottom\"\n | \"centre\"\n | \"center\";\n\nexport interface OptionCardsProviderProps {\n children : ReactNode;\n allowMultipleSelections ? : boolean;\n showTickIcon ? : boolean;\n tickPosition ? : TickPosition;\n onSelectionChange ? : (selectedIds: Set<string>) => void;\n selectionLimit ? : number;\n defaultSelectedIds ? : Set<string>; // Uncontrolled mode - initial selection\n selectedIds ? : Set<string>; // Controlled mode - external state\n}\n\nexport interface OptionCardProps extends CardProps {\n id : string;\n children : ReactNode;\n disabled ? : boolean;\n}\n\nexport interface OptionCardsGroupRef {\n selectAll : () => void;\n selectNone : () => void;\n selectInverse : () => void;\n}\n\ninterface OptionCardsContextType {\n isSelected : (id: string) => boolean;\n toggleSelection : (id: string) => void;\n showTickIcon ? : boolean;\n tickPosition ? : TickPosition;\n selectAll ? : () => void;\n selectNone ? : () => void;\n selectInverse ? : () => void;\n registerOption : (id: string, disabled: boolean) => void;\n unregisterOption : (id: string) => void;\n}\n\nconst OptionCardsContext = createContext<OptionCardsContextType>({\n isSelected : () => false,\n toggleSelection : () => {},\n showTickIcon : false,\n tickPosition : \"top-right\",\n selectAll : () => {},\n selectNone : () => {},\n selectInverse : () => {},\n registerOption : () => {},\n unregisterOption : () => {},\n});\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const OptionCardsGroup = React.forwardRef<OptionCardsGroupRef, OptionCardsProviderProps>(\n (\n {\n children,\n allowMultipleSelections = false,\n showTickIcon,\n onSelectionChange,\n tickPosition = \"top-right\",\n selectionLimit,\n defaultSelectedIds,\n selectedIds: selectedIdsProp,\n ...props\n },\n ref\n ) => {\n // Determine if controlled or uncontrolled mode\n const isControlled = selectedIdsProp !== undefined;\n\n // Internal state for uncontrolled mode only\n const [internalSelectedIds, setInternalSelectedIds] = useState<Set<string>>(\n defaultSelectedIds ? new Set(defaultSelectedIds) : new Set()\n );\n const availableOptionsRef = useRef<Map<string, boolean>>(new Map()); // id -> disabled\n\n // Use controlled value if provided, otherwise use internal state\n const selectedIds = isControlled ? selectedIdsProp : internalSelectedIds;\n\n // Wrapper to update selection - in controlled mode, just call onSelectionChange\n const updateSelectedIds = useCallback((newIds: Set<string>) => {\n if (!isControlled) {\n setInternalSelectedIds(newIds);\n }\n onSelectionChange?.(newIds);\n }, [isControlled, onSelectionChange]);\n\n const registerOption = useCallback((id: string, disabled: boolean) => {\n availableOptionsRef.current.set(id, disabled);\n }, []);\n\n const unregisterOption = useCallback((id: string) => {\n availableOptionsRef.current.delete(id);\n }, []);\n\n // Click to toggle an option ===================================================================================\n const toggleSelection = useCallback((id: string) => {\n const newSelectedIds = new Set(selectedIds);\n if (allowMultipleSelections) {\n if (newSelectedIds.has(id)) {\n newSelectedIds.delete(id);\n } else {\n if (selectionLimit && newSelectedIds.size >= selectionLimit) {\n return;\n }\n newSelectedIds.add(id);\n }\n } else {\n if (newSelectedIds.has(id) && selectedIds.size === 1) {\n newSelectedIds.clear();\n } else {\n newSelectedIds.clear();\n newSelectedIds.add(id);\n }\n }\n updateSelectedIds(newSelectedIds);\n }, [selectedIds, allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n // Select all available options ================================================================================\n const selectAll = useCallback(() => {\n if (!allowMultipleSelections) return;\n\n // Get all enabled options\n const enabledOptions = Array.from(availableOptionsRef.current.entries())\n .filter(([_, disabled]) => !disabled)\n .map(([id]) => id);\n\n // Respect selection limit if set\n const optionsToSelect = selectionLimit\n ? enabledOptions.slice(0, selectionLimit)\n : enabledOptions;\n\n updateSelectedIds(new Set(optionsToSelect));\n }, [allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n // De-select all options =======================================================================================\n const selectNone = useCallback(() => {\n updateSelectedIds(new Set());\n }, [updateSelectedIds]);\n\n // Invert selection ============================================================================================\n const selectInverse = useCallback(() => {\n if (!allowMultipleSelections) return;\n\n // Get all enabled options\n const enabledOptions = Array.from(availableOptionsRef.current.entries())\n .filter(([_, disabled]) => !disabled)\n .map(([id]) => id);\n\n // Select options that are not currently selected\n const invertedSelection = enabledOptions.filter(id => !selectedIds.has(id));\n\n // Respect selection limit if set\n const optionsToSelect = selectionLimit\n ? invertedSelection.slice(0, selectionLimit)\n : invertedSelection;\n\n updateSelectedIds(new Set(optionsToSelect));\n }, [selectedIds, allowMultipleSelections, selectionLimit, updateSelectedIds]);\n\n const isSelected = useCallback((id: string) => {\n return selectedIds.has(id);\n }, [selectedIds]);\n\n // Expose methods via ref\n React.useImperativeHandle(ref, () => ({\n selectAll,\n selectNone,\n selectInverse,\n }), [selectAll, selectNone, selectInverse]);\n\n const contextValue = {\n isSelected,\n toggleSelection,\n showTickIcon,\n tickPosition,\n selectAll,\n selectNone,\n selectInverse,\n registerOption,\n unregisterOption,\n };\n\n return (\n <OptionCardsContext.Provider value={contextValue}>\n <Div data-option-cards-group className={`tick-${tickPosition}`}>\n {children}\n </Div>\n </OptionCardsContext.Provider>\n );\n }\n);\nOptionCardsGroup.displayName = \"OptionCardsGroup\";\n\nexport const useOptionCard = (id: string) => {\n const context = useContext(OptionCardsContext);\n return {\n isSelected : context.isSelected(id),\n toggleSelection : () => context.toggleSelection(id),\n showTickIcon : context.showTickIcon,\n };\n};\n\nexport const useOptionCardsGroup = () => {\n const { selectAll, selectNone, selectInverse } = useContext(OptionCardsContext);\n return { selectAll, selectNone, selectInverse };\n};\n\nexport const OptionCard: React.FC<OptionCardProps> = ({ id, children, disabled = false, ...props }) => {\n const { isSelected, toggleSelection, showTickIcon, registerOption, unregisterOption } = useContext(OptionCardsContext);\n const [showDeselect, setShowDeselect] = useState(false);\n const [isInitialHover, setIsInitialHover] = useState(true);\n\n // Register/unregister this option\n React.useEffect(() => {\n registerOption(id, disabled);\n return () => unregisterOption(id);\n }, [id, disabled, registerOption, unregisterOption]);\n\n let classNames = [];\n\n if (isSelected(id)) {\n classNames.push(\"selected\");\n }\n\n if (disabled) {\n classNames.push(\"disabled\");\n }\n\n if (showDeselect) {\n classNames.push(\"show-deselect\");\n }\n\n const handleMouseEnter = () => {\n if (isSelected(id) && !isInitialHover) {\n setShowDeselect(true);\n }\n };\n\n const handleMouseLeave = () => {\n setShowDeselect(false);\n setIsInitialHover(false);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (!disabled) {\n setIsInitialHover(true);\n setShowDeselect(false);\n toggleSelection(id);\n props.onClick?.(e);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) {\n e.preventDefault();\n setIsInitialHover(true);\n setShowDeselect(false);\n toggleSelection(id);\n }\n };\n\n return (\n <Element<CardElementType>\n as={Card}\n data-option-card\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n aria-pressed={isSelected(id)}\n classNames={classNames}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n {showTickIcon && (\n <>\n <svg viewBox=\"0 0 24 24\" className=\"tick-icon\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" />\n <path d=\"M8 13 L11 15 L16 9\" />\n </svg>\n\n <svg viewBox=\"0 0 24 24\" className=\"deselect-icon\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" />\n <path d=\"M8 8 L16 16 M16 8 L8 16\" />\n </svg>\n </>\n )}\n {children}\n </Element>\n );\n};\n"],"names":["OptionCardsContext","createContext","OptionCardsGroup","React","children","allowMultipleSelections","showTickIcon","onSelectionChange","tickPosition","selectionLimit","defaultSelectedIds","selectedIdsProp","props","ref","isControlled","internalSelectedIds","setInternalSelectedIds","useState","availableOptionsRef","useRef","selectedIds","updateSelectedIds","useCallback","newIds","registerOption","id","disabled","unregisterOption","toggleSelection","newSelectedIds","selectAll","enabledOptions","_","optionsToSelect","selectNone","selectInverse","invertedSelection","isSelected","contextValue","jsx","Div","useOptionCard","context","useContext","useOptionCardsGroup","OptionCard","showDeselect","setShowDeselect","isInitialHover","setIsInitialHover","classNames","handleMouseEnter","handleMouseLeave","handleClick","e","_a","handleKeyDown","jsxs","Element","Card","Fragment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/components/Pagination/Pagination.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,kBAAkB,CAAC;AAoF1B,eAAO,MAAM,UAAU,2OAsKtB,CAAC"}
1
+ {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/components/Pagination/Pagination.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,kBAAkB,CAAC;AA4F1B,eAAO,MAAM,UAAU,2OAsKtB,CAAC"}
@@ -0,0 +1,206 @@
1
+ "use client";
2
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
3
+ import B from "react";
4
+ import { Div as x } from "../Element/Tags.js";
5
+ /* empty css */
6
+ import { Button as F } from "../Button/Button.js";
7
+ import { Spinner as H } from "../Spinner/Spinner.js";
8
+ import { Text as h } from "../Typography/Text.js";
9
+ import { usePagination as J } from "./usePagination.js";
10
+ import { Element as L } from "../Element/Element.js";
11
+ const M = ({
12
+ type: n,
13
+ page: s,
14
+ selected: o,
15
+ disabled: c,
16
+ onClick: f,
17
+ key: w,
18
+ ...v
19
+ }) => {
20
+ if (n === "ellipsis")
21
+ return /* @__PURE__ */ e(h, { className: "pagination-ellipsis", children: "..." });
22
+ const d = {
23
+ first: "Go to first page",
24
+ previous: "Go to previous page",
25
+ next: "Go to next page",
26
+ last: "Go to last page"
27
+ }, k = {
28
+ type: "button",
29
+ className: `pagination-item ${o ? "selected" : ""} ${c ? "disabled" : ""}`,
30
+ onClick: f,
31
+ disabled: c,
32
+ ...d[n] ? { "aria-label": d[n] } : {},
33
+ ...v
34
+ };
35
+ let i;
36
+ switch (n) {
37
+ case "first":
38
+ i = i = /* @__PURE__ */ t("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [
39
+ /* @__PURE__ */ e("line", { x1: "5", y1: "18", x2: "5", y2: "6" }),
40
+ /* @__PURE__ */ e("polyline", { points: "14 18 9 12 14 6" }),
41
+ /* @__PURE__ */ e("line", { x1: "10", y1: "12", x2: "19", y2: "12" })
42
+ ] });
43
+ break;
44
+ case "previous":
45
+ i = /* @__PURE__ */ t("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [
46
+ /* @__PURE__ */ e("polyline", { points: "12 18 7 12 12 6" }),
47
+ /* @__PURE__ */ e("line", { x1: "8", y1: "12", x2: "17", y2: "12" })
48
+ ] });
49
+ break;
50
+ case "next":
51
+ i = i = /* @__PURE__ */ t("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [
52
+ /* @__PURE__ */ e("polyline", { points: "12 6 17 12 12 18" }),
53
+ /* @__PURE__ */ e("line", { x1: "16", y1: "12", x2: "7", y2: "12" })
54
+ ] });
55
+ break;
56
+ case "last":
57
+ i = i = /* @__PURE__ */ t("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [
58
+ /* @__PURE__ */ e("polyline", { points: "10 6 15 12 10 18" }),
59
+ /* @__PURE__ */ e("line", { x1: "19", y1: "6", x2: "19", y2: "18" }),
60
+ /* @__PURE__ */ e("line", { x1: "14", y1: "12", x2: "5", y2: "12" })
61
+ ] });
62
+ break;
63
+ default:
64
+ i = s;
65
+ }
66
+ return /* @__PURE__ */ e(
67
+ F,
68
+ {
69
+ kind: "custom",
70
+ ...k,
71
+ children: i
72
+ }
73
+ );
74
+ }, O = B.forwardRef(
75
+ ({
76
+ totalItems: n,
77
+ currentPage: s,
78
+ onPageChange: o,
79
+ itemsToShowEachSide: c = 1,
80
+ kind: f = "plain",
81
+ showGoToFirstItemButton: w = !0,
82
+ showGoToLastItemButton: v = !0,
83
+ showPreviousButton: d = !0,
84
+ showNextButton: k = !0,
85
+ showGoToInput: i = !1,
86
+ disabled: l = !1,
87
+ hideDisabledButtons: u = !1,
88
+ renderItem: p = M,
89
+ isLoading: G = !1,
90
+ loadingText: P,
91
+ emptyText: R,
92
+ itemDisplayText: N = "Page",
93
+ ...j
94
+ }, z) => {
95
+ const {
96
+ items: C,
97
+ totalPages: b,
98
+ rangeStart: E,
99
+ hasPrevPage: y,
100
+ hasNextPage: g
101
+ } = J({
102
+ totalItems: n,
103
+ currentPage: s,
104
+ itemsToShowEachSide: c
105
+ }), [$, S] = B.useState(""), K = (a) => {
106
+ S(a.target.value);
107
+ }, q = (a) => {
108
+ if (a.key === "Enter") {
109
+ const r = parseInt($);
110
+ !isNaN(r) && r >= 1 && r <= b && (o(r), S(""));
111
+ }
112
+ };
113
+ if (n === 0)
114
+ return /* @__PURE__ */ e(h, { className: "pagination-empty", children: R || "No items to display" });
115
+ let m = ["pagination"];
116
+ return f && m.push(f), l && m.push("disabled"), G && m.push("loading"), /* @__PURE__ */ t(
117
+ L,
118
+ {
119
+ as: "nav",
120
+ "data-pagination": !0,
121
+ ref: z,
122
+ classNames: m,
123
+ role: "navigation",
124
+ "aria-label": "pagination",
125
+ ...j,
126
+ children: [
127
+ /* @__PURE__ */ t(x, { className: "pagination-controls", children: [
128
+ w && (!u || y) && p({
129
+ type: "first",
130
+ disabled: !y || l,
131
+ selected: !1,
132
+ onClick: () => o(1)
133
+ }),
134
+ d && (!u || y) && p({
135
+ type: "previous",
136
+ disabled: !y || l,
137
+ selected: !1,
138
+ onClick: () => o(s - 1)
139
+ }),
140
+ C.map((a, r) => {
141
+ const A = a === "..." ? {
142
+ key: `ellipsis-${r}`,
143
+ type: "ellipsis",
144
+ selected: !1,
145
+ disabled: !0
146
+ } : {
147
+ key: a.toString(),
148
+ type: "page",
149
+ page: a,
150
+ selected: a === s,
151
+ disabled: l,
152
+ "aria-current": a === s ? "page" : void 0,
153
+ onClick: () => o(a)
154
+ };
155
+ return p(A);
156
+ }),
157
+ k && (!u || g) && p({
158
+ type: "next",
159
+ disabled: !g || l,
160
+ selected: !1,
161
+ onClick: () => o(s + 1)
162
+ }),
163
+ v && (!u || g) && p({
164
+ type: "last",
165
+ disabled: !g || l,
166
+ selected: !1,
167
+ onClick: () => o(b)
168
+ }),
169
+ G && /* @__PURE__ */ t(x, { className: "pagination-loading", children: [
170
+ /* @__PURE__ */ e(H, {}),
171
+ P && /* @__PURE__ */ e(h, { size: "small", children: P })
172
+ ] })
173
+ ] }),
174
+ /* @__PURE__ */ t(x, { className: "pagination-info", children: [
175
+ /* @__PURE__ */ t(h, { size: "tiny", children: [
176
+ N,
177
+ " ",
178
+ E,
179
+ " of ",
180
+ n
181
+ ] }),
182
+ i && /* @__PURE__ */ e(x, { className: "pagination-go-to", children: /* @__PURE__ */ e(
183
+ "input",
184
+ {
185
+ type: "number",
186
+ min: 1,
187
+ max: b,
188
+ value: $,
189
+ onChange: K,
190
+ onKeyDown: q,
191
+ placeholder: `Go to ${N}`,
192
+ "aria-label": `Go to ${N}`,
193
+ disabled: l
194
+ }
195
+ ) })
196
+ ] })
197
+ ]
198
+ }
199
+ );
200
+ }
201
+ );
202
+ O.displayName = "Pagination";
203
+ export {
204
+ O as Pagination
205
+ };
206
+ //# sourceMappingURL=Pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"../Element/Tags\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./pagination.css\";\n\n// OTHER ===============================================================================================================\nimport { Button } from \"../Button/Button\";\nimport { PaginationProps, PaginationElementType, RenderItemProps } from \"./constants\";\nimport { Spinner } from \"../Spinner/Spinner\";\nimport { Text } from \"../Typography/Text\";\nimport { usePagination } from \"./usePagination\";\n\nconst defaultRenderItem = (\n {\n type,\n page,\n selected,\n disabled,\n onClick,\n key,\n ...props\n }: RenderItemProps) => {\n if (type === \"ellipsis\") {\n return (\n <Text className=\"pagination-ellipsis\">...</Text>\n );\n }\n\n const iconButtonLabels: Record<string, string> = {\n first : \"Go to first page\",\n previous : \"Go to previous page\",\n next : \"Go to next page\",\n last : \"Go to last page\",\n };\n\n const paginationItemProps = {\n type : \"button\",\n className : `pagination-item ${selected ? \"selected\" : \"\"} ${disabled ? \"disabled\" : \"\"}`,\n onClick,\n disabled,\n ...(iconButtonLabels[type] ? { \"aria-label\" : iconButtonLabels[type] } : {}),\n ...props,\n };\n\n let content;\n switch (type) {\n case \"first\":\n content = content = (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <line x1=\"5\" y1=\"18\" x2=\"5\" y2=\"6\" />\n <polyline points=\"14 18 9 12 14 6\" />\n <line x1=\"10\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n break;\n case \"previous\":\n content = (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <polyline points=\"12 18 7 12 12 6\" />\n <line x1=\"8\" y1=\"12\" x2=\"17\" y2=\"12\" />\n </svg>\n );\n break;\n case \"next\":\n content = content = (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <polyline points=\"12 6 17 12 12 18\" />\n <line x1=\"16\" y1=\"12\" x2=\"7\" y2=\"12\" />\n </svg>\n );\n break;\n case \"last\":\n content = content = (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <polyline points=\"10 6 15 12 10 18\" />\n <line x1=\"19\" y1=\"6\" x2=\"19\" y2=\"18\" />\n <line x1=\"14\" y1=\"12\" x2=\"5\" y2=\"12\" />\n </svg>\n );\n break;\n default:\n content = page;\n }\n\n return (\n <Button\n kind=\"custom\"\n {...paginationItemProps}\n >\n {content}\n </Button>\n );\n};\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Pagination = React.forwardRef(\n (\n {\n totalItems,\n currentPage,\n onPageChange,\n itemsToShowEachSide = 1,\n kind = \"plain\",\n showGoToFirstItemButton = true,\n showGoToLastItemButton = true,\n showPreviousButton = true,\n showNextButton = true,\n showGoToInput = false,\n disabled = false,\n hideDisabledButtons = false,\n renderItem = defaultRenderItem,\n isLoading = false,\n loadingText,\n emptyText,\n itemDisplayText = \"Page\",\n ...props\n }: PaginationProps, ref: React.Ref<PaginationElementType>) => {\n const {\n items,\n totalPages,\n rangeStart,\n rangeEnd,\n hasPrevPage,\n hasNextPage,\n } = usePagination({\n totalItems,\n currentPage,\n itemsToShowEachSide,\n });\n\n const [ goToPage, setGoToPage ] = React.useState(\"\");\n\n const handlePageInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setGoToPage(e.target.value);\n };\n\n const handlePageInputKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n const page = parseInt(goToPage);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n onPageChange(page);\n setGoToPage(\"\");\n }\n }\n };\n\n if (totalItems === 0) {\n return <Text className=\"pagination-empty\">{emptyText || \"No items to display\"}</Text>;\n }\n\n let classNames = [ \"pagination\" ];\n\n if (kind) {\n classNames.push(kind);\n }\n\n if (disabled) {\n classNames.push(\"disabled\");\n }\n\n if (isLoading) {\n classNames.push(\"loading\");\n }\n\n return (\n <Element<PaginationElementType>\n as=\"nav\"\n data-pagination\n ref={ref}\n classNames={classNames}\n role=\"navigation\"\n aria-label=\"pagination\"\n {...props}\n >\n <Div className=\"pagination-controls\">\n {/* GO TO FIRST ITEM */}\n {showGoToFirstItemButton && (!hideDisabledButtons || hasPrevPage) && renderItem({\n type : \"first\",\n disabled : !hasPrevPage || disabled,\n selected : false,\n onClick : () => onPageChange(1),\n })}\n\n {/* GO TO PREVIOUS ITEM */}\n {showPreviousButton && (!hideDisabledButtons || hasPrevPage) && renderItem({\n type : \"previous\",\n disabled : !hasPrevPage || disabled,\n selected : false,\n onClick : () => onPageChange(currentPage - 1),\n })}\n\n {/* SHOW PAGE ITEM OR ELLIPSIS */}\n {items.map((item, index) => {\n const itemProps: RenderItemProps = item === \"...\"\n ? {\n key : `ellipsis-${index}`,\n type : \"ellipsis\",\n selected : false,\n disabled : true,\n }\n : {\n key : item.toString(),\n type : \"page\",\n page : item as number,\n selected : item === currentPage,\n disabled : disabled,\n \"aria-current\" : item === currentPage ? \"page\" : undefined,\n onClick : () => onPageChange(item as number),\n };\n\n return renderItem(itemProps);\n })}\n\n {/* GO TO NEXT ITEM */}\n {showNextButton && (!hideDisabledButtons || hasNextPage) && renderItem({\n type : \"next\",\n disabled : !hasNextPage || disabled,\n selected : false,\n onClick : () => onPageChange(currentPage + 1),\n })}\n\n {/* GO TO LAST ITEM */}\n {showGoToLastItemButton && (!hideDisabledButtons || hasNextPage) && renderItem({\n type : \"last\",\n disabled : !hasNextPage || disabled,\n selected : false,\n onClick : () => onPageChange(totalPages),\n })}\n\n {isLoading && (\n <Div className=\"pagination-loading\">\n <Spinner />\n {loadingText && <Text size=\"small\">{loadingText}</Text>}\n </Div>\n )}\n </Div>\n\n <Div className=\"pagination-info\">\n <Text size=\"tiny\">\n {itemDisplayText} {rangeStart} of {totalItems}\n </Text>\n\n {showGoToInput && (\n <Div className=\"pagination-go-to\">\n <input\n type=\"number\"\n min={1}\n max={totalPages}\n value={goToPage}\n onChange={handlePageInputChange}\n onKeyDown={handlePageInputKeyPress}\n placeholder={`Go to ${itemDisplayText}`}\n aria-label={`Go to ${itemDisplayText}`}\n disabled={disabled}\n />\n </Div>\n )}\n </Div>\n </Element>\n );\n },\n);\nPagination.displayName = \"Pagination\";\n"],"names":["defaultRenderItem","type","page","selected","disabled","onClick","key","props","jsx","Text","iconButtonLabels","paginationItemProps","content","jsxs","Button","Pagination","React","totalItems","currentPage","onPageChange","itemsToShowEachSide","kind","showGoToFirstItemButton","showGoToLastItemButton","showPreviousButton","showNextButton","showGoToInput","hideDisabledButtons","renderItem","isLoading","loadingText","emptyText","itemDisplayText","ref","items","totalPages","rangeStart","hasPrevPage","hasNextPage","usePagination","goToPage","setGoToPage","handlePageInputChange","e","handlePageInputKeyPress","classNames","Element","Div","item","index","itemProps","Spinner"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ const f = (m, s) => {
3
+ const n = s - m + 1;
4
+ return Array.from({ length: n }, (t, o) => m + o);
5
+ }, b = ({
6
+ totalItems: m,
7
+ currentPage: s,
8
+ itemsToShowEachSide: n
9
+ }) => {
10
+ const t = m;
11
+ return {
12
+ items: (() => {
13
+ const i = n * 2 + 1;
14
+ let a = [];
15
+ if (t <= i)
16
+ a = f(1, t);
17
+ else {
18
+ const l = Math.min(s - 1, n), h = Math.min(t - s, n);
19
+ a.push(1), s - n > 2 && a.push("...");
20
+ const N = Math.max(2, s - l), p = Math.min(t - 1, s + h);
21
+ a.push(...f(N, p)), t - s > n + 1 && a.push("..."), p < t && a.push(t);
22
+ }
23
+ return a;
24
+ })(),
25
+ totalPages: t,
26
+ rangeStart: s,
27
+ rangeEnd: s,
28
+ hasPrevPage: s > 1,
29
+ hasNextPage: s < t
30
+ };
31
+ };
32
+ export {
33
+ b as usePagination
34
+ };
35
+ //# sourceMappingURL=usePagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePagination.js","sources":["../../../src/components/Pagination/usePagination.ts"],"sourcesContent":["const range = (start: number, end: number) => {\n const length = end - start + 1;\n return Array.from({ length }, (_, i) => start + i);\n};\n\ninterface UsePaginationProps {\n totalItems : number;\n currentPage : number;\n itemsToShowEachSide : number;\n}\n\ninterface UsePaginationResult {\n items: (number | string)[];\n totalPages: number;\n rangeStart: number;\n rangeEnd: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n}\n\nexport const usePagination = (\n {\n totalItems,\n currentPage,\n itemsToShowEachSide,\n }: UsePaginationProps): UsePaginationResult => {\n const totalPages = totalItems; // Each item gets its own page\n\n const items = (() => {\n const totalNumbers = itemsToShowEachSide * 2 + 1;\n let pageNumbers: (number | string)[] = [];\n\n if (totalPages <= totalNumbers) {\n // If we have fewer pages than the desired display count, show all pages\n pageNumbers = range(1, totalPages);\n } else {\n const leftSideNumbers = Math.min(currentPage - 1, itemsToShowEachSide);\n const rightSideNumbers = Math.min(totalPages - currentPage, itemsToShowEachSide);\n\n // Always show first page\n pageNumbers.push(1);\n\n // Add ellipsis after first page if needed\n if (currentPage - itemsToShowEachSide > 2) {\n pageNumbers.push(\"...\");\n }\n\n // Add pages around current page\n const rangeStart = Math.max(2, currentPage - leftSideNumbers);\n const rangeEnd = Math.min(totalPages - 1, currentPage + rightSideNumbers);\n pageNumbers.push(...range(rangeStart, rangeEnd));\n\n // Add ellipsis before last page if needed\n if (totalPages - currentPage > itemsToShowEachSide + 1) {\n pageNumbers.push(\"...\");\n }\n\n // Always show last page if we're not already at it\n if (rangeEnd < totalPages) {\n pageNumbers.push(totalPages);\n }\n }\n\n return pageNumbers;\n })();\n\n return {\n items,\n totalPages,\n rangeStart: currentPage,\n rangeEnd: currentPage,\n hasPrevPage: currentPage > 1,\n hasNextPage: currentPage < totalPages,\n };\n};\n"],"names":["range","start","end","length","_","i","usePagination","totalItems","currentPage","itemsToShowEachSide","totalPages","totalNumbers","pageNumbers","leftSideNumbers","rightSideNumbers","rangeStart","rangeEnd"],"mappings":"AAAA,MAAMA,IAAQ,CAACC,GAAeC,MAAgB;AAC1C,QAAMC,IAASD,IAAMD,IAAQ;AAC7B,SAAO,MAAM,KAAK,EAAE,QAAAE,EAAA,GAAU,CAACC,GAAGC,MAAMJ,IAAQI,CAAC;AACrD,GAiBaC,IAAgB,CACzB;AAAA,EACI,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,qBAAAC;AACJ,MAA+C;AAC/C,QAAMC,IAAaH;AAwCnB,SAAO;AAAA,IACH,QAvCW,MAAM;AACjB,YAAMI,IAAeF,IAAsB,IAAI;AAC/C,UAAIG,IAAmC,CAAA;AAEvC,UAAIF,KAAcC;AAEd,QAAAC,IAAcZ,EAAM,GAAGU,CAAU;AAAA,WAC9B;AACH,cAAMG,IAAkB,KAAK,IAAIL,IAAc,GAAGC,CAAmB,GAC/DK,IAAmB,KAAK,IAAIJ,IAAaF,GAAaC,CAAmB;AAG/E,QAAAG,EAAY,KAAK,CAAC,GAGdJ,IAAcC,IAAsB,KACpCG,EAAY,KAAK,KAAK;AAI1B,cAAMG,IAAa,KAAK,IAAI,GAAGP,IAAcK,CAAe,GACtDG,IAAW,KAAK,IAAIN,IAAa,GAAGF,IAAcM,CAAgB;AACxE,QAAAF,EAAY,KAAK,GAAGZ,EAAMe,GAAYC,CAAQ,CAAC,GAG3CN,IAAaF,IAAcC,IAAsB,KACjDG,EAAY,KAAK,KAAK,GAItBI,IAAWN,KACXE,EAAY,KAAKF,CAAU;AAAA,MAEnC;AAEA,aAAOE;AAAA,IACX,GAAA;AAAA,IAII,YAAAF;AAAA,IACA,YAAYF;AAAA,IACZ,UAAUA;AAAA,IACV,aAAaA,IAAc;AAAA,IAC3B,aAAaA,IAAcE;AAAA,EAAA;AAEnC;"}
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { jsx as e } from "react/jsx-runtime";
3
+ import l from "react";
4
+ /* empty css */
5
+ import { Element as $ } from "../Element/Element.js";
6
+ const p = l.forwardRef(
7
+ ({
8
+ desktopSpan: r,
9
+ mobileSpan: i,
10
+ tabletLandscapeSpan: f,
11
+ tabletPortraitSpan: s,
12
+ isHorizontal: m,
13
+ role: h,
14
+ ...t
15
+ }, u) => {
16
+ let o = [];
17
+ return r || f || s || i ? (r && o.push(`${r}`), f && o.push(`${f}-on-tablet-landscape`), s && o.push(`${s}-on-tablet-portrait`), i && o.push(`${i}-on-mobile`)) : o.push("whole"), m && o.push("horizontal"), /* @__PURE__ */ e(
18
+ $,
19
+ {
20
+ as: "div",
21
+ "data-portion": !0,
22
+ ref: u,
23
+ classNames: o,
24
+ role: h,
25
+ ...t
26
+ }
27
+ );
28
+ }
29
+ );
30
+ p.displayName = "Portion";
31
+ export {
32
+ p as Portion
33
+ };
34
+ //# sourceMappingURL=Portion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Portion.js","sources":["../../../src/components/Portion/Portion.tsx"],"sourcesContent":["// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// ELEMENT =============================================================================================================\nimport { CommonAndHTMLProps } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./portion.css\";\n\n// OTHER ===============================================================================================================\nimport { SpanTypes } from \"./types\";\n\n// prettier-ignore\nexport interface PortionCustomProps {\n desktopSpan ? : SpanTypes;\n tabletLandscapeSpan ? : SpanTypes;\n tabletPortraitSpan ? : SpanTypes;\n mobileSpan ? : SpanTypes;\n isHorizontal ? : boolean;\n role ? : string;\n}\n\nexport type PortionElementType = HTMLDivElement;\nexport type PortionProps = Omit<CommonAndHTMLProps<PortionElementType>, keyof PortionCustomProps> & PortionCustomProps;\n\n// COMPONENT //////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const Portion = React.forwardRef(\n (\n {\n desktopSpan,\n mobileSpan,\n tabletLandscapeSpan,\n tabletPortraitSpan,\n isHorizontal,\n role,\n ...props\n }: PortionProps,\n ref: React.Ref<PortionElementType>\n ) => {\n // CLASS NAMES -------------------------------------------------------------------------------------------------\n let classNames = [];\n\n if (desktopSpan || tabletLandscapeSpan || tabletPortraitSpan || mobileSpan) {\n if (desktopSpan) {\n classNames.push(`${desktopSpan}`);\n }\n\n if (tabletLandscapeSpan) {\n classNames.push(`${tabletLandscapeSpan}-on-tablet-landscape`);\n }\n\n if (tabletPortraitSpan) {\n classNames.push(`${tabletPortraitSpan}-on-tablet-portrait`);\n }\n\n if (mobileSpan) {\n classNames.push(`${mobileSpan}-on-mobile`);\n }\n } else {\n classNames.push(\"whole\");\n }\n\n if (isHorizontal) {\n classNames.push(\"horizontal\");\n }\n\n // RENDER ---------------------------------------------------------------------------------------------------\n return (\n <Element<PortionElementType>\n as=\"div\"\n data-portion\n ref={ref}\n classNames={classNames}\n role={role}\n {...props}\n />\n );\n }\n);\nPortion.displayName = \"Portion\";\n"],"names":["Portion","React","desktopSpan","mobileSpan","tabletLandscapeSpan","tabletPortraitSpan","isHorizontal","role","props","ref","classNames","jsx","Element"],"mappings":";;;;AA2BO,MAAMA,IAAUC,EAAM;AAAA,EACzB,CACI;AAAA,IACI,aAAAC;AAAA,IACA,YAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,MAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAEPC,MACC;AAED,QAAIC,IAAa,CAAA;AAEjB,WAAIR,KAAeE,KAAuBC,KAAsBF,KACxDD,KACAQ,EAAW,KAAK,GAAGR,CAAW,EAAE,GAGhCE,KACAM,EAAW,KAAK,GAAGN,CAAmB,sBAAsB,GAG5DC,KACAK,EAAW,KAAK,GAAGL,CAAkB,qBAAqB,GAG1DF,KACAO,EAAW,KAAK,GAAGP,CAAU,YAAY,KAG7CO,EAAW,KAAK,OAAO,GAGvBJ,KACAI,EAAW,KAAK,YAAY,GAK5B,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,gBAAY;AAAA,QACZ,KAAAH;AAAA,QACA,YAAAC;AAAA,QACA,MAAAH;AAAA,QACC,GAAGC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACJ;AACAR,EAAQ,cAAc;"}
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { jsxs as m, Fragment as b, jsx as s } from "react/jsx-runtime";
3
+ import y from "react";
4
+ /* empty css */
5
+ import { Text as l } from "../Typography/Text.js";
6
+ import { Element as u } from "../Element/Element.js";
7
+ const B = y.forwardRef(
8
+ ({
9
+ label: r,
10
+ value: d,
11
+ height: g,
12
+ max: a = 100,
13
+ shape: p,
14
+ bgColor: c,
15
+ bgColour: f,
16
+ fillColor: v,
17
+ fillColour: h,
18
+ ...o
19
+ }, x) => {
20
+ const e = Math.max(0, Math.min(a, Number(d) || 0)), t = `${e}${o.suffix || ""}`, i = f || c, n = h || v, $ = {
21
+ height: g,
22
+ ...i && { "--progress-bar-bg": `var(--${i})` },
23
+ ...n && { "--progress-bar-fill": `var(--${n})` }
24
+ };
25
+ return /* @__PURE__ */ m(b, { children: [
26
+ r && /* @__PURE__ */ m(
27
+ u,
28
+ {
29
+ as: "div",
30
+ "data-progress-bar-meta": !0,
31
+ "aria-hidden": "true",
32
+ children: [
33
+ /* @__PURE__ */ s(l, { children: r }),
34
+ /* @__PURE__ */ s(l, { children: t })
35
+ ]
36
+ }
37
+ ),
38
+ /* @__PURE__ */ s(
39
+ u,
40
+ {
41
+ as: "progress",
42
+ "data-progress-bar": !0,
43
+ ref: x,
44
+ value: e,
45
+ max: a,
46
+ "aria-label": r,
47
+ "aria-valuemin": 0,
48
+ "aria-valuemax": a,
49
+ "aria-valuenow": e,
50
+ "aria-valuetext": `${r ? `${r}: ` : ""}${t}`,
51
+ shape: p,
52
+ ...o,
53
+ style: $
54
+ }
55
+ )
56
+ ] });
57
+ }
58
+ );
59
+ B.displayName = "ProgressBar";
60
+ export {
61
+ B as ProgressBar
62
+ };
63
+ //# sourceMappingURL=ProgressBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressBar.js","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"sourcesContent":["// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps, ColourPropTypes, ShapeTypes } from \"../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./progress-bar.css\";\n\n// OTHER ===============================================================================================================\nimport { Text } from \"../Typography/Text\";\n\nexport interface ProgressBarLabelCustomProps {\n suffix ? : string;\n}\n\nexport interface ProgressBarCustomProps {\n label ? : string;\n value ? : number;\n suffix ? : string;\n height ? : string;\n max ? : number;\n shape ? : ShapeTypes;\n bgColor ? : ColourPropTypes;\n bgColour ? : ColourPropTypes;\n fillColor ? : ColourPropTypes;\n fillColour ? : ColourPropTypes;\n}\n\nexport type ProgressBarElementType = HTMLProgressElement;\nexport type ProgressBarProps = Omit<CommonAndHTMLProps<ProgressBarElementType>, keyof ProgressBarCustomProps> &\n ProgressBarCustomProps;\nexport type ProgressBarMetaProps = Omit<CommonAndHTMLProps<HTMLDivElement>, keyof ProgressBarLabelCustomProps> &\n ProgressBarLabelCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ProgressBar = React.forwardRef(\n (\n {\n label,\n value,\n height,\n max = 100,\n shape,\n bgColor,\n bgColour,\n fillColor,\n fillColour,\n ...props\n } : ProgressBarProps, ref : React.Ref<ProgressBarElementType>) => {\n const validValue = Math.max(0, Math.min(max, Number(value) || 0));\n const progressText = `${validValue}${props.suffix || \"\"}`;\n\n // Use UK spelling as primary, fall back to US spelling\n const backgroundColour = bgColour || bgColor;\n const progressFillColour = fillColour || fillColor;\n\n // Build CSS custom properties for styling\n const progressBarStyles : React.CSSProperties = {\n height,\n ...(backgroundColour && {\"--progress-bar-bg\" : `var(--${backgroundColour})`}),\n ...(progressFillColour && {\"--progress-bar-fill\" : `var(--${progressFillColour})`}),\n };\n\n return (\n <>\n {label && (\n <Element<HTMLDivElement>\n as=\"div\"\n data-progress-bar-meta\n aria-hidden=\"true\"\n >\n <Text>{label}</Text>\n <Text>\n {progressText}\n </Text>\n </Element>\n )}\n\n <Element<ProgressBarElementType>\n as=\"progress\"\n data-progress-bar\n ref={ref}\n value={validValue}\n max={max}\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={validValue}\n aria-valuetext={`${label ? `${label}: ` : \"\"}${progressText}`}\n shape={shape}\n {...props}\n style={progressBarStyles}\n />\n </>\n );\n },\n);\nProgressBar.displayName = \"ProgressBar\";"],"names":["ProgressBar","React","label","value","height","max","shape","bgColor","bgColour","fillColor","fillColour","props","ref","validValue","progressText","backgroundColour","progressFillColour","progressBarStyles","jsxs","Fragment","Element","jsx","Text"],"mappings":";;;;;AAqCO,MAAMA,IAAcC,EAAM;AAAA,EAC7B,CACI;AAAA,IACI,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC;AAAA,IACA,KAAAC,IAAM;AAAA,IACN,OAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GACeC,MAA4C;AAClE,UAAMC,IAAa,KAAK,IAAI,GAAG,KAAK,IAAIR,GAAK,OAAOF,CAAK,KAAK,CAAC,CAAC,GAC1DW,IAAe,GAAGD,CAAU,GAAGF,EAAM,UAAU,EAAE,IAGjDI,IAAmBP,KAAYD,GAC/BS,IAAqBN,KAAcD,GAGnCQ,IAA0C;AAAA,MAC5C,QAAAb;AAAA,MACA,GAAIW,KAAoB,EAAC,qBAAsB,SAASA,CAAgB,IAAA;AAAA,MACxE,GAAIC,KAAsB,EAAC,uBAAwB,SAASA,CAAkB,IAAA;AAAA,IAAG;AAGrF,WACI,gBAAAE,EAAAC,GAAA,EACK,UAAA;AAAA,MAAAjB,KACG,gBAAAgB;AAAA,QAACE;AAAA,QAAA;AAAA,UACG,IAAG;AAAA,UACH,0BAAsB;AAAA,UACtB,eAAY;AAAA,UAEZ,UAAA;AAAA,YAAA,gBAAAC,EAACC,KAAM,UAAApB,EAAA,CAAM;AAAA,YACb,gBAAAmB,EAACC,KACI,UAAAR,EAAA,CACL;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIR,gBAAAO;AAAA,QAACD;AAAA,QAAA;AAAA,UACG,IAAG;AAAA,UACH,qBAAiB;AAAA,UACjB,KAAAR;AAAA,UACA,OAAOC;AAAA,UACP,KAAAR;AAAA,UACA,cAAYH;AAAA,UACZ,iBAAe;AAAA,UACf,iBAAeG;AAAA,UACf,iBAAeQ;AAAA,UACf,kBAAgB,GAAGX,IAAQ,GAAGA,CAAK,OAAO,EAAE,GAAGY,CAAY;AAAA,UAC3D,OAAAR;AAAA,UACC,GAAGK;AAAA,UACJ,OAAOM;AAAA,QAAA;AAAA,MAAA;AAAA,IACX,GACJ;AAAA,EAER;AACJ;AACAjB,EAAY,cAAc;"}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { jsx as u } from "react/jsx-runtime";
3
+ import f from "react";
4
+ /* empty css */
5
+ import { Element as d } from "../Element/Element.js";
6
+ const y = f.forwardRef(
7
+ ({
8
+ layout: o = "grid",
9
+ gutters: a = "medium",
10
+ retainLayoutOnTabletLandscape: i,
11
+ retainLayoutOnTabletPortrait: e,
12
+ retainLayoutOnMobile: r,
13
+ retainLayoutAlways: l,
14
+ allowUltraWide: n,
15
+ groupLabel: s,
16
+ ...m
17
+ }, p) => {
18
+ let t = [];
19
+ return o && t.push(`layout-${o}`), a && t.push(a === "none" ? "no-gutters" : `${a}-gutters`), i && t.push("retain-layout-on-tablet-landscape"), e && t.push("retain-layout-on-tablet-portrait"), r && t.push("retain-layout-on-mobile"), l && t.push(
20
+ "retain-layout-on-tablet-landscape retain-layout-on-tablet-portrait retain-layout-on-mobile"
21
+ ), n && t.push("allow-ultra-wide"), /* @__PURE__ */ u(
22
+ d,
23
+ {
24
+ as: "div",
25
+ "data-row": !0,
26
+ ref: p,
27
+ classNames: [t.join(" ")],
28
+ marginBottom: "tiny",
29
+ role: "grid",
30
+ "aria-label": s,
31
+ ...m
32
+ }
33
+ );
34
+ }
35
+ );
36
+ y.displayName = "Row";
37
+ export {
38
+ y as Row
39
+ };
40
+ //# sourceMappingURL=Row.js.map