@solidpb/ui-kit 0.1.1 → 0.3.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 (138) hide show
  1. package/README.md +17 -0
  2. package/dist/components/ActivityFeed/ActivityFeed.d.ts +16 -0
  3. package/dist/components/ActivityFeed/ActivityFeed.jsx +54 -0
  4. package/dist/components/ActivityFeed/index.d.ts +1 -0
  5. package/dist/components/ActivityFeed/index.js +1 -0
  6. package/dist/components/AlertDialog/AlertDialog.d.ts +27 -0
  7. package/dist/components/AlertDialog/AlertDialog.jsx +62 -0
  8. package/dist/components/AlertDialog/alertDialogContext.d.ts +9 -0
  9. package/dist/components/AlertDialog/alertDialogContext.js +2 -0
  10. package/dist/components/AlertDialog/index.d.ts +1 -0
  11. package/dist/components/AlertDialog/index.js +1 -0
  12. package/dist/components/Avatar/Avatar.d.ts +10 -0
  13. package/dist/components/Avatar/Avatar.jsx +30 -0
  14. package/dist/components/Avatar/index.d.ts +1 -0
  15. package/dist/components/Avatar/index.js +1 -0
  16. package/dist/components/BreadCrumbs/BreadCrumbs.d.ts +12 -0
  17. package/dist/components/BreadCrumbs/BreadCrumbs.jsx +26 -0
  18. package/dist/components/BreadCrumbs/index.d.ts +1 -0
  19. package/dist/components/BreadCrumbs/index.js +1 -0
  20. package/dist/components/Button/Button.d.ts +3 -3
  21. package/dist/components/Button/Button.jsx +1 -6
  22. package/dist/components/Card/Card.d.ts +1 -0
  23. package/dist/components/Card/Card.jsx +5 -2
  24. package/dist/components/Checkbox/Checkbox.d.ts +6 -7
  25. package/dist/components/Checkbox/Checkbox.jsx +39 -22
  26. package/dist/components/ColorPicker/ColorPicker.d.ts +10 -0
  27. package/dist/components/ColorPicker/ColorPicker.jsx +61 -0
  28. package/dist/components/ColorPicker/index.d.ts +1 -0
  29. package/dist/components/ColorPicker/index.js +1 -0
  30. package/dist/components/Container/Container.d.ts +0 -1
  31. package/dist/components/Container/Container.jsx +2 -8
  32. package/dist/components/DateInput/DateInput.d.ts +5 -0
  33. package/dist/components/DateInput/DateInput.jsx +29 -8
  34. package/dist/components/Drawer/Drawer.d.ts +33 -0
  35. package/dist/components/Drawer/Drawer.jsx +49 -0
  36. package/dist/components/Drawer/drawerContext.d.ts +6 -0
  37. package/dist/components/Drawer/drawerContext.js +9 -0
  38. package/dist/components/Drawer/index.d.ts +1 -0
  39. package/dist/components/Drawer/index.js +1 -0
  40. package/dist/components/DropdownMenu/DropdownMenu.d.ts +23 -7
  41. package/dist/components/DropdownMenu/DropdownMenu.jsx +41 -15
  42. package/dist/components/FileInput/FileInput.d.ts +7 -3
  43. package/dist/components/FileInput/FileInput.jsx +35 -9
  44. package/dist/components/FilterBar/AddFilter.d.ts +9 -0
  45. package/dist/components/FilterBar/AddFilter.jsx +14 -0
  46. package/dist/components/FilterBar/AddSortingDropdown.d.ts +9 -0
  47. package/dist/components/FilterBar/AddSortingDropdown.jsx +67 -0
  48. package/dist/components/FilterBar/EditFilters.d.ts +10 -0
  49. package/dist/components/FilterBar/EditFilters.jsx +12 -0
  50. package/dist/components/FilterBar/FilterBar.d.ts +54 -0
  51. package/dist/components/FilterBar/FilterBar.jsx +234 -0
  52. package/dist/components/FilterBar/FilterChip.d.ts +23 -0
  53. package/dist/components/FilterBar/FilterChip.jsx +220 -0
  54. package/dist/components/FilterBar/FilterEdit.d.ts +13 -0
  55. package/dist/components/FilterBar/FilterEdit.jsx +159 -0
  56. package/dist/components/FilterBar/FiltersEdit.d.ts +13 -0
  57. package/dist/components/FilterBar/FiltersEdit.jsx +45 -0
  58. package/dist/components/FilterBar/index.d.ts +1 -0
  59. package/dist/components/FilterBar/index.js +1 -0
  60. package/dist/components/Form/Form.d.ts +37 -2
  61. package/dist/components/Form/Form.jsx +102 -3
  62. package/dist/components/Form/formContext.d.ts +2 -0
  63. package/dist/components/Form/formContext.js +9 -0
  64. package/dist/components/Image/Image.d.ts +6 -7
  65. package/dist/components/Image/Image.jsx +74 -7
  66. package/dist/components/Input/Input.d.ts +4 -4
  67. package/dist/components/Input/Input.jsx +9 -35
  68. package/dist/components/Kanban/Kanban.d.ts +19 -0
  69. package/dist/components/Kanban/Kanban.jsx +68 -0
  70. package/dist/components/Kanban/KanbanCard.d.ts +11 -0
  71. package/dist/components/Kanban/KanbanCard.jsx +94 -0
  72. package/dist/components/Kanban/KanbanColumn.d.ts +18 -0
  73. package/dist/components/Kanban/KanbanColumn.jsx +251 -0
  74. package/dist/components/Kanban/index.d.ts +1 -0
  75. package/dist/components/Kanban/index.js +1 -0
  76. package/dist/components/Link/Link.d.ts +8 -6
  77. package/dist/components/Link/Link.jsx +17 -5
  78. package/dist/components/Modal/Modal.d.ts +17 -8
  79. package/dist/components/Modal/Modal.jsx +32 -39
  80. package/dist/components/Modal/modalContext.d.ts +2 -3
  81. package/dist/components/Navbar/Navbar.d.ts +26 -0
  82. package/dist/components/Navbar/Navbar.jsx +40 -0
  83. package/dist/components/Navbar/index.d.ts +1 -0
  84. package/dist/components/Navbar/index.js +1 -0
  85. package/dist/components/NumberInput/NumberInput.d.ts +8 -6
  86. package/dist/components/NumberInput/NumberInput.jsx +52 -7
  87. package/dist/components/Pagination/Pagination.d.ts +15 -0
  88. package/dist/components/Pagination/Pagination.jsx +67 -0
  89. package/dist/components/Pagination/index.d.ts +1 -0
  90. package/dist/components/Pagination/index.js +1 -0
  91. package/dist/components/SearchInput/SearchInput.d.ts +3 -0
  92. package/dist/components/SearchInput/SearchInput.jsx +38 -3
  93. package/dist/components/Select/Select.d.ts +13 -11
  94. package/dist/components/Select/Select.jsx +78 -32
  95. package/dist/components/Slider/Slider.d.ts +16 -0
  96. package/dist/components/Slider/Slider.jsx +60 -0
  97. package/dist/components/Slider/index.d.ts +1 -0
  98. package/dist/components/Slider/index.js +1 -0
  99. package/dist/components/Switch/Switch.d.ts +6 -8
  100. package/dist/components/Switch/Switch.jsx +38 -19
  101. package/dist/components/Table/Table.d.ts +27 -0
  102. package/dist/components/Table/Table.jsx +193 -0
  103. package/dist/components/Table/index.d.ts +1 -0
  104. package/dist/components/Table/index.js +1 -0
  105. package/dist/components/Tabs/Tabs.d.ts +25 -1
  106. package/dist/components/Tabs/Tabs.jsx +42 -1
  107. package/dist/components/Tabs/tabContext.d.ts +9 -0
  108. package/dist/components/Tabs/tabContext.js +2 -0
  109. package/dist/components/Tag/Tag.d.ts +7 -5
  110. package/dist/components/Tag/Tag.jsx +40 -14
  111. package/dist/components/TagArea/TagArea.d.ts +6 -2
  112. package/dist/components/TagArea/TagArea.jsx +89 -35
  113. package/dist/components/TextArea/TextArea.d.ts +9 -8
  114. package/dist/components/TextArea/TextArea.jsx +54 -18
  115. package/dist/components/ThemeSwitch/ThemeSwitch.d.ts +11 -0
  116. package/dist/components/ThemeSwitch/ThemeSwitch.jsx +49 -0
  117. package/dist/components/ThemeSwitch/index.d.ts +1 -0
  118. package/dist/components/ThemeSwitch/index.js +1 -0
  119. package/dist/components/Toast/Toast.d.ts +1 -1
  120. package/dist/components/Toast/Toast.jsx +13 -10
  121. package/dist/components/Toast/Toaster.jsx +1 -2
  122. package/dist/components/Tooltip/Tooltip.d.ts +4 -3
  123. package/dist/components/Tooltip/Tooltip.jsx +19 -8
  124. package/dist/constants.d.ts +8 -0
  125. package/dist/constants.js +8 -0
  126. package/dist/index.d.ts +14 -2
  127. package/dist/index.js +14 -2
  128. package/dist/methods/triggerFlash.d.ts +1 -0
  129. package/dist/methods/triggerFlash.js +7 -0
  130. package/package.json +3 -2
  131. package/dist/components/List/List.d.ts +0 -26
  132. package/dist/components/List/List.jsx +0 -120
  133. package/dist/components/List/index.d.ts +0 -1
  134. package/dist/components/List/index.js +0 -1
  135. package/dist/components/RelationPicker/RelationPicker.d.ts +0 -11
  136. package/dist/components/RelationPicker/RelationPicker.jsx +0 -13
  137. package/dist/components/RelationPicker/index.d.ts +0 -1
  138. package/dist/components/RelationPicker/index.js +0 -1
@@ -0,0 +1,251 @@
1
+ import { createSignal, createMemo, createEffect, onCleanup, Show, For } from "solid-js";
2
+ import { attachClosestEdge, extractClosestEdge, } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
3
+ import { dropTargetForElements, draggable, monitorForElements, } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
4
+ import Fold from "lucide-solid/icons/fold-horizontal";
5
+ import UnFold from "lucide-solid/icons/unfold-horizontal";
6
+ import Plus from "lucide-solid/icons/plus";
7
+ import invariant from "tiny-invariant";
8
+ import { tv } from "tailwind-variants";
9
+ import { triggerFlash } from "../../methods/triggerFlash";
10
+ import { iconSize } from "../../constants";
11
+ import { Button } from "../Button";
12
+ import { KanbanCard } from "./KanbanCard";
13
+ import { Input } from "../Input";
14
+ const column = tv({
15
+ base: "kanban-column flex flex-col gap-1 bg-base-300 p-1.5 rounded-md transition-[width] text-nowrap",
16
+ variants: {
17
+ folded: {
18
+ true: "w-9",
19
+ false: "w-70",
20
+ },
21
+ },
22
+ defaultVariants: {
23
+ folded: false,
24
+ },
25
+ });
26
+ const columnHeader = tv({
27
+ base: "font-semibold text-sm sticky top-0 pb-1",
28
+ variants: {
29
+ folded: {
30
+ true: "flex flex-col",
31
+ false: "flex justify-between",
32
+ },
33
+ },
34
+ defaultVariants: {
35
+ folded: false,
36
+ },
37
+ });
38
+ export const KanbanColumn = (props) => {
39
+ let ref;
40
+ const [dragging, setDragging] = createSignal("idle");
41
+ const [closestEdge, setClosestEdge] = createSignal();
42
+ const [cardDraggedOver, setCardDraggedOver] = createSignal(false);
43
+ const [folded, setFolded] = createSignal(false);
44
+ const [creatingItem, setCreatingItem] = createSignal(false);
45
+ const [newItemTitle, setNewItemTitle] = createSignal("");
46
+ const filteredItems = createMemo(() => {
47
+ let items = [...props.items];
48
+ const stateKey = props.itemStateKey;
49
+ const posKey = props.itemPositionKey;
50
+ if (stateKey) {
51
+ items = items.filter((item) => item[stateKey] === props.col?.id);
52
+ }
53
+ if (!posKey)
54
+ return items;
55
+ return items.sort((a, b) => (Number(a[posKey]) || 0) - (Number(b[posKey]) || 0));
56
+ });
57
+ const itemDragEnabled = () => !!props.itemPositionKey;
58
+ const [flashedCardId, setFlashedCardId] = createSignal(null);
59
+ createEffect(() => {
60
+ if (props.flashSignal?.() === props.col?.id && ref) {
61
+ triggerFlash(ref);
62
+ }
63
+ });
64
+ createEffect(() => {
65
+ if (!props.dragEnabled())
66
+ return;
67
+ const element = ref;
68
+ invariant(element);
69
+ const dispose = dropTargetForElements({
70
+ element,
71
+ canDrop({ source }) {
72
+ // not allowing dropping on yourself
73
+ if (source.element === element) {
74
+ return false;
75
+ }
76
+ // only allowing same collection for now to be dropped on me
77
+ return source.data.item.collectionId == props.col?.collectionId;
78
+ },
79
+ getData({ input }) {
80
+ return attachClosestEdge({
81
+ item: props.col,
82
+ isKanbanColumn: true,
83
+ }, { element, input, allowedEdges: ["left", "right"] });
84
+ },
85
+ onDragEnter({ self, source }) {
86
+ setDragging("dragging-over");
87
+ if (source.data.isKanbanColumn) {
88
+ const _closestEdge = extractClosestEdge(self.data);
89
+ setClosestEdge(_closestEdge);
90
+ }
91
+ else if (source.data.isKanbanCard) {
92
+ setCardDraggedOver(true);
93
+ }
94
+ },
95
+ onDrag({ self, source }) {
96
+ if (source.data.isKanbanColumn) {
97
+ const _closestEdge = extractClosestEdge(self.data);
98
+ // Only need to update state if nothing has changed.
99
+ if (dragging() !== "dragging-over" || _closestEdge !== closestEdge()) {
100
+ setDragging("dragging-over");
101
+ setClosestEdge(_closestEdge);
102
+ }
103
+ }
104
+ else if (source.data.isKanbanCard) {
105
+ setCardDraggedOver(true);
106
+ }
107
+ },
108
+ onDragLeave() {
109
+ setDragging("idle");
110
+ setCardDraggedOver(false);
111
+ },
112
+ onDrop() {
113
+ setDragging("idle");
114
+ setCardDraggedOver(false);
115
+ },
116
+ });
117
+ onCleanup(dispose);
118
+ });
119
+ createEffect(() => {
120
+ if (!props.dragEnabled())
121
+ return;
122
+ const element = ref;
123
+ invariant(element);
124
+ const dispose = draggable({
125
+ element,
126
+ getInitialData() {
127
+ return {
128
+ item: props.col,
129
+ isKanbanColumn: true,
130
+ };
131
+ },
132
+ onDragStart() {
133
+ setDragging("dragging");
134
+ },
135
+ onDrop() {
136
+ setDragging("idle");
137
+ },
138
+ });
139
+ onCleanup(dispose);
140
+ });
141
+ createEffect(() => {
142
+ if (!filteredItems().length || !itemDragEnabled())
143
+ return;
144
+ const dispose = monitorForElements({
145
+ canMonitor({ source }) {
146
+ if (!source.data.item) {
147
+ return false;
148
+ }
149
+ return (source.data.item.collectionId == filteredItems()[0].collectionId &&
150
+ !!source.data.isKanbanCard);
151
+ },
152
+ onDrop({ location, source }) {
153
+ const target = location.current.dropTargets[0];
154
+ if (!target) {
155
+ return;
156
+ }
157
+ const sourceData = source.data;
158
+ const targetData = target.data;
159
+ const sourceItem = sourceData.item;
160
+ const targetItem = targetData.item;
161
+ const stateKey = props.itemStateKey;
162
+ const posKey = props.itemPositionKey;
163
+ if (!stateKey || !posKey)
164
+ return;
165
+ if (sourceItem.collectionId !== targetItem.collectionId)
166
+ return;
167
+ if (target.data.isKanbanColumn) {
168
+ let newInd = 0;
169
+ for (const item of props.items.filter((item) => item[stateKey] === target.data.item.id)) {
170
+ if ((Number(item[posKey]) || 0) >= newInd) {
171
+ newInd = (Number(item[posKey]) || 0) + 1;
172
+ }
173
+ }
174
+ if ((sourceItem[posKey] || 0) !== newInd) {
175
+ setFlashedCardId(sourceItem.id);
176
+ setTimeout(() => setFlashedCardId(null), 10);
177
+ }
178
+ // if we drop on the column
179
+ props.onReorderCard?.(sourceItem, Number(sourceItem[posKey]), newInd, String(sourceItem[stateKey]), targetData.item.id);
180
+ }
181
+ else {
182
+ const closestEdgeOfTarget = extractClosestEdge(targetData);
183
+ const newInd = closestEdgeOfTarget === "top" ? Number(targetItem[posKey]) : Number(targetItem[posKey]) + 1;
184
+ if ((sourceItem[posKey] || 0) !== newInd) {
185
+ setFlashedCardId(sourceItem.id);
186
+ setTimeout(() => setFlashedCardId(null), 10);
187
+ }
188
+ props.onReorderCard?.(sourceItem, Number(sourceItem[posKey]), newInd, String(sourceItem[stateKey]), String(targetItem[stateKey]));
189
+ }
190
+ },
191
+ });
192
+ onCleanup(dispose);
193
+ });
194
+ const bgStyle = createMemo(() => {
195
+ if (cardDraggedOver()) {
196
+ return { "background-color": "color-mix(in srgb, var(--color-primary) 10%, transparent)" };
197
+ }
198
+ return {};
199
+ });
200
+ return (<div data-drop-edge={dragging() === "dragging-over" && !cardDraggedOver() ? (closestEdge() ?? undefined) : undefined} ref={ref} class={column({ class: props.class, folded: folded() })} style={{ opacity: dragging() == "dragging" ? 0.2 : 1, ...bgStyle() }}>
201
+ <Show when={props.col}>
202
+ <div class={columnHeader({ folded: folded() })}>
203
+ <div class="flex items-center gap-2">
204
+ <Button size="xs" variant="ghost" modifier="square" onClick={() => setFolded(!folded())}>
205
+ <Show when={folded()} fallback={<Fold size={iconSize["sm"]}/>}>
206
+ <UnFold size={iconSize["sm"]}/>
207
+ </Show>
208
+ </Button>
209
+ {!folded() && (<div>
210
+ {props.col.title}
211
+ <span class="text-xs font-normal text-base-content/50 ml-2">{filteredItems().length}</span>
212
+ </div>)}
213
+ </div>
214
+ <div>
215
+ {!folded() && (<Button size="xs" variant="ghost" modifier="square" aria-label="create new item" onClick={() => setCreatingItem(!creatingItem())}>
216
+ <Plus size={iconSize["sm"]}/>
217
+ </Button>)}
218
+ </div>
219
+ {folded() && (<div class="font-semibold text-sm [writing-mode:vertical-rl] mt-2">
220
+ {props.col.title}
221
+ <span class="text-xs font-normal text-base-content/50 mt-2">{filteredItems().length}</span>
222
+ </div>)}
223
+ </div>
224
+ </Show>
225
+ {!folded() && (<>
226
+ {creatingItem() && props.col && (<div class="card bg-base-100 p-2 rounded-md space-y-1.5">
227
+ <p class="font-medium text-sm">New Item</p>
228
+ <Input value={newItemTitle()} onChange={setNewItemTitle} label="Title"/>
229
+ <div class="flex justify-end space-x-1.5">
230
+ <Button appearance="neutral" size="sm" onClick={() => {
231
+ setCreatingItem(false);
232
+ setNewItemTitle("");
233
+ }}>
234
+ Cancel
235
+ </Button>
236
+ <Button appearance="success" size="sm" onClick={() => {
237
+ setCreatingItem(false);
238
+ props.onCreateItem?.(newItemTitle(), props.col.id);
239
+ setNewItemTitle("");
240
+ }}>
241
+ Add
242
+ </Button>
243
+ </div>
244
+ </div>)}
245
+ <For each={filteredItems()}>
246
+ {(item) => (<KanbanCard item={item} dragEnabled={itemDragEnabled} onCardClick={() => props.onCardClick?.(item)} class={props.cardClass} renderItem={props.renderItem} flashSignal={() => flashedCardId()}/>)}
247
+ </For>
248
+ </>)}
249
+ </div>);
250
+ };
251
+ export default KanbanColumn;
@@ -0,0 +1 @@
1
+ export * from "./Kanban";
@@ -0,0 +1 @@
1
+ export * from "./Kanban";
@@ -1,9 +1,11 @@
1
- import { JSX, ValidComponent, ParentComponent } from "solid-js";
2
- interface LinkProps {
3
- as?: ValidComponent;
1
+ import { PolymorphicProps } from "@kobalte/core";
2
+ import { JSXElement, ValidComponent } from "solid-js";
3
+ type LinkProps<T extends ValidComponent = "a"> = PolymorphicProps<T, {
4
4
  href?: string;
5
- children: JSX.Element;
5
+ disabled?: boolean;
6
6
  class?: string;
7
- }
8
- export declare const Link: ParentComponent<LinkProps>;
7
+ appearance?: "neutral" | "primary" | "secondary" | "accent" | "info" | "success" | "warning" | "error";
8
+ children: JSXElement;
9
+ }>;
10
+ export declare function Link<T extends ValidComponent = "a">(props: LinkProps<T>): import("solid-js").JSX.Element;
9
11
  export default Link;
@@ -2,12 +2,24 @@ import { splitProps } from "solid-js";
2
2
  import { Dynamic } from "solid-js/web";
3
3
  import { tv } from "tailwind-variants";
4
4
  const link = tv({
5
- base: "text-[var(--color-light-primary)] dark:text-[var(--color-dark-primary)] hover:underline underline-offset-4 transition",
5
+ base: "link",
6
+ variants: {
7
+ appearance: {
8
+ neutral: "link-neutral",
9
+ primary: "link-primary",
10
+ secondary: "link-secondary",
11
+ accent: "link-accent",
12
+ info: "link-info",
13
+ success: "link-success",
14
+ warning: "link-warning",
15
+ error: "link-error",
16
+ },
17
+ },
6
18
  });
7
- export const Link = (props) => {
8
- const [local, others] = splitProps(props, ["as", "children", "class"]);
9
- return (<Dynamic component={local.as ?? "a"} {...others} class={link({ class: local.class })}>
19
+ export function Link(props) {
20
+ const [local, others] = splitProps(props, ["as", "class", "children"]);
21
+ return (<Dynamic component={local.as ?? "a"} {...others} class={link({ class: local.class, appearance: props.appearance })}>
10
22
  {local.children}
11
23
  </Dynamic>);
12
- };
24
+ }
13
25
  export default Link;
@@ -1,13 +1,22 @@
1
1
  import { ParentComponent } from "solid-js";
2
- interface Props {
3
- setModalVisible?: (v: boolean) => void;
4
- saveFunc?: () => Promise<void>;
5
- zIndexClass?: string;
2
+ import { Dialog } from "@kobalte/core/dialog";
3
+ interface ModalProps {
6
4
  title?: string;
5
+ open?: boolean;
6
+ onOpenChange?: (open: boolean) => void;
7
7
  }
8
- export declare const Modal: ParentComponent<Props>;
8
+ interface ModalComponents {
9
+ Trigger: typeof Dialog.Trigger;
10
+ Modal: ParentComponent<{
11
+ class?: string;
12
+ }>;
13
+ }
14
+ export declare const Modal: ParentComponent<ModalProps> & ModalComponents;
15
+ export declare const ModalContent: ParentComponent<{
16
+ class?: string;
17
+ }>;
9
18
  export default Modal;
10
- export declare function useModalLoading(): {
11
- loading: import("solid-js").Accessor<boolean>;
12
- setLoading: import("solid-js").Setter<boolean>;
19
+ export declare function useModal(): {
20
+ title?: string;
21
+ setOpen?: (v: boolean) => void;
13
22
  };
@@ -1,51 +1,44 @@
1
- import { createSignal, Show, useContext } from "solid-js";
2
- import { Portal } from "solid-js/web";
3
- import Loader from "lucide-solid/icons/loader";
1
+ import { useContext } from "solid-js";
2
+ import { Dialog } from "@kobalte/core/dialog";
3
+ import Close from "lucide-solid/icons/x";
4
+ import { tv } from "tailwind-variants";
4
5
  import { Button } from "../Button";
5
6
  import { ModalContext } from "./modalContext";
6
7
  export const Modal = (props) => {
7
- const [loading, setLoading] = createSignal(false);
8
- const containerStyle = `${props.zIndexClass !== undefined ? props.zIndexClass : "z-50"} fixed inset-0 flex items-center justify-center bg-black/50`;
9
- return (<Portal>
10
- <Show when={loading()}>
11
- <div class="fixed inset-0 z-100 flex items-center justify-center bg-gray-800/25">
12
- <Loader class="w-9 h-9 animate-spin text-gray-700"/>
13
- </div>
14
- </Show>
15
- <div class={containerStyle} onClick={() => props.setModalVisible?.(false)}>
16
- <div class={`bg-charcoal-500 text-dark-slate-gray-900 rounded-xl shadow-lg p-4 md:p-6
17
- w-full mx-3 sm:w-[50vw] lg:w-[35vw] flex flex-col`} onClick={(e) => e.stopPropagation()}>
18
- <Show when={props.title}>
19
- <h2 class="pb-2">{props.title}</h2>
20
- </Show>
21
- <div class="max-h-[55vh] overflow-y-hidden flex flex-col h-full">
22
- <ModalContext.Provider value={{ loading, setLoading }}>{props.children}</ModalContext.Provider>
23
- </div>
24
- <div class="w-full flex justify-end space-x-2">
25
- <Button onClick={() => props.setModalVisible?.(false)} class="mt-3">
26
- Cancel
27
- </Button>
28
-
29
- <Show when={props.saveFunc}>
30
- <Button appearance="success" onClick={() => {
31
- setLoading(true);
32
- props.saveFunc()
33
- .then(() => props.setModalVisible?.(false))
34
- .finally(() => setLoading(false));
35
- }} class="mt-3">
36
- Save
37
- </Button>
38
- </Show>
8
+ return (<ModalContext.Provider value={{ title: props.title, setOpen: props.onOpenChange }}>
9
+ <Dialog open={props.open} onOpenChange={props.onOpenChange}>
10
+ {props.children}
11
+ </Dialog>
12
+ </ModalContext.Provider>);
13
+ };
14
+ const modalContent = tv({
15
+ base: "modal-box w-fit max-w-[90vw]",
16
+ });
17
+ export const ModalContent = (props) => {
18
+ const { title } = useModal();
19
+ return (<Dialog.Portal>
20
+ <div class="modal modal-open z-10">
21
+ <Dialog.Content class={modalContent({ class: props.class })}>
22
+ <div class="flex justify-between items-start">
23
+ {title && (<Dialog.Title>
24
+ <h3 class="font-bold text-lg mb-2">{title}</h3>
25
+ </Dialog.Title>)}
26
+ <Dialog.CloseButton as={Button} variant="ghost" modifier="square" size="xs">
27
+ <Close size={20}/>
28
+ </Dialog.CloseButton>
39
29
  </div>
40
- </div>
30
+ {props.children}
31
+ </Dialog.Content>
41
32
  </div>
42
- </Portal>);
33
+ </Dialog.Portal>);
43
34
  };
35
+ Modal.Trigger = Dialog.Trigger;
36
+ Modal.Modal = ModalContent;
44
37
  export default Modal;
45
- export function useModalLoading() {
38
+ export function useModal() {
46
39
  const context = useContext(ModalContext);
47
40
  if (!context) {
48
- throw new Error("useModalLoading must be used within a Modal");
41
+ throw new Error("useModal must be used within a Modal");
49
42
  }
50
43
  return context;
51
44
  }
@@ -1,7 +1,6 @@
1
- import { Accessor, Setter } from "solid-js";
2
1
  type ModalContextType = {
3
- loading: Accessor<boolean>;
4
- setLoading: Setter<boolean>;
2
+ title?: string;
3
+ setOpen?: (v: boolean) => void;
5
4
  };
6
5
  export declare const ModalContext: import("solid-js").Context<ModalContextType | undefined>;
7
6
  export {};
@@ -0,0 +1,26 @@
1
+ import { ParentComponent } from "solid-js";
2
+ export interface NavbarProps {
3
+ class?: string;
4
+ }
5
+ export interface NavbarComponents {
6
+ Brand: ParentComponent<{
7
+ href?: string;
8
+ }>;
9
+ Profile: ParentComponent;
10
+ Menu: ParentComponent;
11
+ MenuItem: ParentComponent;
12
+ Submenu: ParentComponent<{
13
+ title: string;
14
+ }>;
15
+ }
16
+ export declare const Navbar: ParentComponent<NavbarProps> & NavbarComponents;
17
+ export declare const NavbarBrand: ParentComponent<{
18
+ href?: string;
19
+ }>;
20
+ export declare const NavbarProfile: ParentComponent;
21
+ export declare const NavbarMenu: ParentComponent;
22
+ export declare const NavbarSubmenu: ParentComponent<{
23
+ title: string;
24
+ }>;
25
+ export declare const NavbarMenuItem: ParentComponent;
26
+ export default Navbar;
@@ -0,0 +1,40 @@
1
+ import { DropdownMenu } from "@kobalte/core/dropdown-menu";
2
+ import { tv } from "tailwind-variants";
3
+ const navbar = tv({
4
+ base: "navbar bg-base-100 shadow-sm flex justify-between sticky top-0 z-10",
5
+ });
6
+ export const Navbar = (props) => {
7
+ return <nav class={navbar({ class: props.class })}>{props.children}</nav>;
8
+ };
9
+ export const NavbarBrand = (props) => {
10
+ return (<a class="btn btn-lg btn-ghost" href={props.href}>
11
+ {props.children}
12
+ </a>);
13
+ };
14
+ export const NavbarProfile = (props) => {
15
+ return <div class="avatar">{props.children}</div>;
16
+ };
17
+ export const NavbarMenu = (props) => {
18
+ return <ul class="menu menu-horizontal">{props.children}</ul>;
19
+ };
20
+ export const NavbarSubmenu = (props) => {
21
+ return (<DropdownMenu>
22
+ <DropdownMenu.Trigger as="details">
23
+ <summary>{props.title}</summary>
24
+ </DropdownMenu.Trigger>
25
+ <DropdownMenu.Portal>
26
+ <DropdownMenu.Content class="z-50">
27
+ <ul class="menu bg-base-100 shadow-sm rounded-box mt-2 border border-base-200">{props.children}</ul>
28
+ </DropdownMenu.Content>
29
+ </DropdownMenu.Portal>
30
+ </DropdownMenu>);
31
+ };
32
+ export const NavbarMenuItem = (props) => {
33
+ return <li>{props.children}</li>;
34
+ };
35
+ Navbar.Brand = NavbarBrand;
36
+ Navbar.Profile = NavbarProfile;
37
+ Navbar.Menu = NavbarMenu;
38
+ Navbar.MenuItem = NavbarMenuItem;
39
+ Navbar.Submenu = NavbarSubmenu;
40
+ export default Navbar;
@@ -0,0 +1 @@
1
+ export * from "./Navbar";
@@ -0,0 +1 @@
1
+ export * from "./Navbar";
@@ -1,13 +1,15 @@
1
1
  import { Component, ValidComponent } from "solid-js";
2
2
  import { type NumberFieldInputProps, type NumberFieldRootProps } from "@kobalte/core/number-field";
3
3
  import type { PolymorphicProps } from "@kobalte/core";
4
- type InputProps<T extends ValidComponent = "input"> = PolymorphicProps<T, NumberFieldInputProps<T>>;
5
- interface ExtraProps {
4
+ export type NumberInputProps<T extends ValidComponent = "input"> = PolymorphicProps<T, NumberFieldInputProps<T>>;
5
+ export interface NumberInputExtraProps {
6
6
  label?: string;
7
- size?: "sm" | "md";
8
- inputProps?: InputProps;
7
+ variant?: "ghost";
8
+ appearance?: "neutral" | "primary" | "secondary" | "accent" | "info" | "success" | "warning" | "error";
9
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
10
+ inputProps?: NumberInputProps;
9
11
  saveFunc?: (v: number) => Promise<any>;
10
12
  }
11
- type InputRootProps<T extends ValidComponent = "div"> = ExtraProps & PolymorphicProps<T, NumberFieldRootProps<T>>;
12
- export declare const NumberInput: Component<InputRootProps>;
13
+ export type NumberInputRootProps<T extends ValidComponent = "div"> = NumberInputExtraProps & PolymorphicProps<T, NumberFieldRootProps<T>>;
14
+ export declare const NumberInput: Component<NumberInputRootProps>;
13
15
  export default NumberInput;
@@ -2,19 +2,64 @@ import { createMemo, Show, splitProps } from "solid-js";
2
2
  import { NumberField, } from "@kobalte/core/number-field";
3
3
  import { debounce } from "../../methods/debounce";
4
4
  import { tv } from "tailwind-variants";
5
- const inputRoot = tv({ base: "flex flex-row items-center space-x-1" });
6
- const inputField = tv({ base: "input outline-none text-right my-0" });
5
+ const inputRoot = tv({
6
+ base: "relative flex flex-col gap-1",
7
+ });
8
+ const inputField = tv({
9
+ base: "input outline-offset-0 text-end font-semibold",
10
+ variants: {
11
+ variant: {
12
+ ghost: "input-ghost",
13
+ none: "",
14
+ },
15
+ size: {
16
+ xs: "input-xs w-18",
17
+ sm: "input-sm w-20",
18
+ md: "input-md w-22",
19
+ lg: "input-lg w-24",
20
+ xl: "input-xl w-26",
21
+ },
22
+ appearance: {
23
+ neutral: "input-neutral",
24
+ primary: "input-primary",
25
+ secondary: "input-secondary",
26
+ accent: "input-accent",
27
+ info: "input-info",
28
+ success: "input-success",
29
+ warning: "input-warning",
30
+ error: "input-error",
31
+ },
32
+ },
33
+ defaultVariants: {
34
+ size: "sm",
35
+ },
36
+ });
7
37
  export const NumberInput = (props) => {
8
- const [local, others] = splitProps(props, ["label", "class", "inputProps", "saveFunc"]);
38
+ const [local, others] = splitProps(props, [
39
+ "label",
40
+ "class",
41
+ "inputProps",
42
+ "saveFunc",
43
+ "variant",
44
+ "appearance",
45
+ "size",
46
+ ]);
9
47
  const debouncedSave = createMemo(() => (local.saveFunc ? debounce(local.saveFunc) : undefined));
10
48
  const handleChange = (v) => {
11
49
  debouncedSave()?.(Number(v));
12
50
  };
13
51
  return (<NumberField {...others} onChange={handleChange} class={inputRoot({ class: local.class })}>
14
- <Show when={local.label}>
15
- <NumberField.Label>{local.label}</NumberField.Label>
16
- </Show>
17
- <NumberField.Input {...local.inputProps} class={inputField({ class: local.inputProps?.class ?? "" })}/>
52
+ <NumberField.Label class="floating-label">
53
+ <Show when={local.label}>
54
+ <span>{local.label}</span>
55
+ </Show>
56
+ <NumberField.Input {...local.inputProps} class={inputField({
57
+ appearance: local.appearance,
58
+ variant: local.variant,
59
+ size: local.size,
60
+ class: local.inputProps?.class,
61
+ })}/>
62
+ </NumberField.Label>
18
63
  </NumberField>);
19
64
  };
20
65
  export default NumberInput;
@@ -0,0 +1,15 @@
1
+ import { Accessor, Component } from "solid-js";
2
+ interface PaginationProps {
3
+ perPage: Accessor<number>;
4
+ perPageOptions: number[];
5
+ page: Accessor<number>;
6
+ totalItems: number;
7
+ onNextPage: () => void;
8
+ onPrevPage: () => void;
9
+ onPageChange: (page: number) => void;
10
+ onPerPageChange: (perPage: number) => void;
11
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
12
+ class?: string;
13
+ }
14
+ export declare const Pagination: Component<PaginationProps>;
15
+ export {};