runeforge 0.0.53 → 0.0.55

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 (78) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1342 -1222
  3. package/dist/components/Avatar.svelte +31 -31
  4. package/dist/components/IconRenderer.svelte +22 -22
  5. package/dist/components/Modal.svelte +75 -75
  6. package/dist/components/common/Header.svelte +40 -40
  7. package/dist/components/crud/EmbeddedField.svelte +175 -175
  8. package/dist/components/crud/Field.svelte +376 -376
  9. package/dist/components/crud/GenericCRUD.svelte +426 -435
  10. package/dist/components/crud/GenericCRUD.svelte.d.ts +6 -9
  11. package/dist/components/crud/SearchInput.svelte +53 -53
  12. package/dist/components/crud/columns/Avatar.svelte +15 -15
  13. package/dist/components/crud/columns/Icon.svelte +8 -8
  14. package/dist/components/crud/utils/reorder.d.ts +4 -0
  15. package/dist/components/crud/utils/reorder.js +13 -0
  16. package/dist/components/crud/views/Create.svelte +232 -232
  17. package/dist/components/crud/views/Read.svelte +124 -124
  18. package/dist/components/crud/views/Update.svelte +208 -208
  19. package/dist/components/crud/views/list/List.svelte +291 -0
  20. package/dist/components/crud/views/{List.svelte.d.ts → list/List.svelte.d.ts} +4 -14
  21. package/dist/components/crud/views/list/Modals.svelte +56 -0
  22. package/dist/components/crud/views/list/Modals.svelte.d.ts +36 -0
  23. package/dist/components/crud/views/list/Table.svelte +176 -0
  24. package/dist/components/crud/views/list/Table.svelte.d.ts +59 -0
  25. package/dist/components/crud/views/list/Toolbar.svelte +341 -0
  26. package/dist/components/crud/views/list/Toolbar.svelte.d.ts +46 -0
  27. package/dist/components/form/Button.svelte +27 -27
  28. package/dist/components/form/Label.svelte +37 -37
  29. package/dist/components/form/MultiSelect.svelte +248 -248
  30. package/dist/components/form/PasswordInput.svelte +68 -68
  31. package/dist/components/form/Required.svelte +1 -1
  32. package/dist/components/form/Select.svelte +209 -209
  33. package/dist/components/form/Tree.svelte +62 -62
  34. package/dist/components/form/TreeNode.svelte +66 -66
  35. package/dist/components/navigation/Breadcrumbs.svelte +111 -111
  36. package/dist/components/table/ColumnFilter.svelte +168 -168
  37. package/dist/components/table/PaginatedTable.svelte +536 -215
  38. package/dist/components/table/PaginatedTable.svelte.d.ts +11 -2
  39. package/dist/components/table/Paginator.svelte +113 -113
  40. package/dist/components/table/SortHeader.svelte +43 -43
  41. package/dist/components/table/TableBody.svelte +150 -70
  42. package/dist/components/table/TableBody.svelte.d.ts +14 -1
  43. package/dist/components/table/TableHeader.svelte +88 -83
  44. package/dist/components/table/TableHeader.svelte.d.ts +1 -0
  45. package/dist/components/table/sortable.d.ts +27 -0
  46. package/dist/components/table/sortable.js +55 -0
  47. package/dist/components/table/utils.d.ts +28 -1
  48. package/dist/components/table/utils.js +75 -0
  49. package/dist/i18n/en.js +2 -0
  50. package/dist/i18n/es.js +2 -0
  51. package/dist/i18n/types.d.ts +2 -0
  52. package/dist/icons/defaults/Clear.svelte +6 -6
  53. package/dist/icons/defaults/Create.svelte +6 -6
  54. package/dist/icons/defaults/Delete.svelte +6 -6
  55. package/dist/icons/defaults/Download.svelte +7 -7
  56. package/dist/icons/defaults/Edit.svelte +7 -7
  57. package/dist/icons/defaults/Filter.svelte +6 -6
  58. package/dist/icons/defaults/FilterActive.svelte +6 -6
  59. package/dist/icons/defaults/Folder.svelte +6 -6
  60. package/dist/icons/defaults/Grip.svelte +7 -0
  61. package/dist/icons/defaults/Grip.svelte.d.ts +7 -0
  62. package/dist/icons/defaults/Home.svelte +6 -6
  63. package/dist/icons/defaults/PasswordHide.svelte +9 -9
  64. package/dist/icons/defaults/PasswordShow.svelte +7 -7
  65. package/dist/icons/defaults/SortAsc.svelte +6 -6
  66. package/dist/icons/defaults/SortDesc.svelte +6 -6
  67. package/dist/icons/defaults/SortNone.svelte +6 -6
  68. package/dist/icons/defaults/View.svelte +7 -7
  69. package/dist/icons/sets/bootstrap.js +2 -1
  70. package/dist/icons/sets/default.js +2 -0
  71. package/dist/icons/types.d.ts +3 -0
  72. package/dist/index.d.ts +5 -4
  73. package/dist/index.js +3 -2
  74. package/dist/types/attribute.d.ts +9 -0
  75. package/dist/types/crud.d.ts +72 -1
  76. package/dist/types/table.d.ts +56 -0
  77. package/package.json +3 -1
  78. package/dist/components/crud/views/List.svelte +0 -584
@@ -1,31 +1,31 @@
1
- <script lang="ts">
2
- let {
3
- src = null,
4
- text = '',
5
- alt = '',
6
- class: className = 'w-10 rounded-full',
7
- textClass = '',
8
- }: {
9
- src?: string | null;
10
- text?: string;
11
- alt?: string;
12
- class?: string;
13
- textClass?: string;
14
- } = $props();
15
-
16
- const placeholder = $derived(text.trim().slice(0, 2).toUpperCase() || '?');
17
- </script>
18
-
19
- {#if src}
20
- <div class="avatar">
21
- <div class={className}>
22
- <img {src} {alt} />
23
- </div>
24
- </div>
25
- {:else}
26
- <div class="avatar avatar-placeholder">
27
- <div class="bg-neutral text-neutral-content {className}">
28
- <span class={textClass}>{placeholder}</span>
29
- </div>
30
- </div>
31
- {/if}
1
+ <script lang="ts">
2
+ let {
3
+ src = null,
4
+ text = '',
5
+ alt = '',
6
+ class: className = 'w-10 rounded-full',
7
+ textClass = '',
8
+ }: {
9
+ src?: string | null;
10
+ text?: string;
11
+ alt?: string;
12
+ class?: string;
13
+ textClass?: string;
14
+ } = $props();
15
+
16
+ const placeholder = $derived(text.trim().slice(0, 2).toUpperCase() || '?');
17
+ </script>
18
+
19
+ {#if src}
20
+ <div class="avatar">
21
+ <div class={className}>
22
+ <img {src} {alt} />
23
+ </div>
24
+ </div>
25
+ {:else}
26
+ <div class="avatar avatar-placeholder">
27
+ <div class="bg-neutral text-neutral-content {className}">
28
+ <span class={textClass}>{placeholder}</span>
29
+ </div>
30
+ </div>
31
+ {/if}
@@ -1,22 +1,22 @@
1
- <script lang="ts">
2
- import { getIconSet } from '../icons/context.js';
3
-
4
- let {
5
- name,
6
- size = '1em',
7
- class: className = '',
8
- }: {
9
- name: string;
10
- size?: string | number;
11
- class?: string;
12
- } = $props();
13
-
14
- const icons = $derived(getIconSet());
15
- const IconComponent = $derived(icons?.getByName?.(name) ?? null);
16
- </script>
17
-
18
- {#if IconComponent}
19
- <IconComponent {size} class={className} />
20
- {:else}
21
- <span class={className} title={name}></span>
22
- {/if}
1
+ <script lang="ts">
2
+ import { getIconSet } from '../icons/context.js';
3
+
4
+ let {
5
+ name,
6
+ size = '1em',
7
+ class: className = '',
8
+ }: {
9
+ name: string;
10
+ size?: string | number;
11
+ class?: string;
12
+ } = $props();
13
+
14
+ const icons = $derived(getIconSet());
15
+ const IconComponent = $derived(icons?.getByName?.(name) ?? null);
16
+ </script>
17
+
18
+ {#if IconComponent}
19
+ <IconComponent {size} class={className} />
20
+ {:else}
21
+ <span class={className} title={name}></span>
22
+ {/if}
@@ -1,75 +1,75 @@
1
- <script lang="ts">
2
- import type { Snippet } from 'svelte';
3
- import Button from './form/Button.svelte';
4
-
5
- let {
6
- title = '',
7
- onClose,
8
- closeOnClickOutside = true,
9
- onClickOutside,
10
- children,
11
- class: additionalClass,
12
- width,
13
- maxWidth,
14
- height,
15
- maxHeight,
16
- }: {
17
- title?: string;
18
- onClose?: () => void;
19
- /** Whether clicking the backdrop (outside the modal box) closes the modal. */
20
- closeOnClickOutside?: boolean;
21
- /** Callback invoked when clicking outside the modal. Defaults to `onClose`. */
22
- onClickOutside?: () => void;
23
- children: Snippet;
24
- /** Extra classes merged onto the modal box, e.g. Tailwind size utilities
25
- * like `max-w-4xl` or `w-11/12`. */
26
- class?: string;
27
- /** Explicit size overrides (any valid CSS length, e.g. '600px', '90vw').
28
- * Applied as inline styles, so they take priority over `class` utilities. */
29
- width?: string;
30
- maxWidth?: string;
31
- height?: string;
32
- maxHeight?: string;
33
- } = $props();
34
-
35
- const handleClickOutside = $derived(onClickOutside ?? onClose);
36
-
37
- const boxStyle = $derived(
38
- [
39
- width ? `width:${width}` : '',
40
- maxWidth ? `max-width:${maxWidth}` : '',
41
- height ? `height:${height}` : '',
42
- maxHeight ? `max-height:${maxHeight}` : '',
43
- ]
44
- .filter(Boolean)
45
- .join(';')
46
- );
47
- </script>
48
-
49
- <dialog class="modal" open>
50
- <div class={['modal-box', additionalClass]} style={boxStyle}>
51
- <div class="flex items-center justify-between gap-4">
52
- <h3 class="text-lg font-bold">{title}</h3>
53
- {#if onClose}
54
- <Button
55
- variant="ghost"
56
- class="btn-circle"
57
- aria-label="Cerrar"
58
- onclick={onClose}
59
- >
60
-
61
- </Button>
62
- {/if}
63
- </div>
64
-
65
- <div class="divider my-2"></div>
66
-
67
- {@render children()}
68
- </div>
69
-
70
- {#if closeOnClickOutside && handleClickOutside}
71
- <div class="modal-backdrop">
72
- <button onclick={handleClickOutside} aria-label="Cerrar"></button>
73
- </div>
74
- {/if}
75
- </dialog>
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import Button from './form/Button.svelte';
4
+
5
+ let {
6
+ title = '',
7
+ onClose,
8
+ closeOnClickOutside = true,
9
+ onClickOutside,
10
+ children,
11
+ class: additionalClass,
12
+ width,
13
+ maxWidth,
14
+ height,
15
+ maxHeight,
16
+ }: {
17
+ title?: string;
18
+ onClose?: () => void;
19
+ /** Whether clicking the backdrop (outside the modal box) closes the modal. */
20
+ closeOnClickOutside?: boolean;
21
+ /** Callback invoked when clicking outside the modal. Defaults to `onClose`. */
22
+ onClickOutside?: () => void;
23
+ children: Snippet;
24
+ /** Extra classes merged onto the modal box, e.g. Tailwind size utilities
25
+ * like `max-w-4xl` or `w-11/12`. */
26
+ class?: string;
27
+ /** Explicit size overrides (any valid CSS length, e.g. '600px', '90vw').
28
+ * Applied as inline styles, so they take priority over `class` utilities. */
29
+ width?: string;
30
+ maxWidth?: string;
31
+ height?: string;
32
+ maxHeight?: string;
33
+ } = $props();
34
+
35
+ const handleClickOutside = $derived(onClickOutside ?? onClose);
36
+
37
+ const boxStyle = $derived(
38
+ [
39
+ width ? `width:${width}` : '',
40
+ maxWidth ? `max-width:${maxWidth}` : '',
41
+ height ? `height:${height}` : '',
42
+ maxHeight ? `max-height:${maxHeight}` : '',
43
+ ]
44
+ .filter(Boolean)
45
+ .join(';')
46
+ );
47
+ </script>
48
+
49
+ <dialog class="modal" open>
50
+ <div class={['modal-box', additionalClass]} style={boxStyle}>
51
+ <div class="flex items-center justify-between gap-4">
52
+ <h3 class="text-lg font-bold">{title}</h3>
53
+ {#if onClose}
54
+ <Button
55
+ variant="ghost"
56
+ class="btn-circle"
57
+ aria-label="Cerrar"
58
+ onclick={onClose}
59
+ >
60
+
61
+ </Button>
62
+ {/if}
63
+ </div>
64
+
65
+ <div class="divider my-2"></div>
66
+
67
+ {@render children()}
68
+ </div>
69
+
70
+ {#if closeOnClickOutside && handleClickOutside}
71
+ <div class="modal-backdrop">
72
+ <button onclick={handleClickOutside} aria-label="Cerrar"></button>
73
+ </div>
74
+ {/if}
75
+ </dialog>
@@ -1,40 +1,40 @@
1
- <script lang="ts">
2
- import type { Snippet } from 'svelte';
3
- import Breadcrumbs from '../navigation/Breadcrumbs.svelte';
4
- import type { BreadcrumbItem } from '../../types/breadcrumb.js';
5
-
6
- let {
7
- title,
8
- breadcrumbs = [],
9
- buttons,
10
- }: {
11
- title: string;
12
- breadcrumbs?: BreadcrumbItem[];
13
- buttons?: Snippet;
14
- } = $props();
15
- </script>
16
-
17
- <div class="header-root flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
18
- <div class="flex flex-col gap-1 flex-1">
19
- <h1>{title}</h1>
20
- <Breadcrumbs items={breadcrumbs} />
21
- </div>
22
-
23
- {#if buttons}
24
- <div class="flex min-w-0 items-center gap-2 sm:pt-1">
25
- {@render buttons()}
26
- </div>
27
- {/if}
28
- </div>
29
-
30
- <style>
31
- h1 {
32
- font-size: var(--runeforge-crud-title-size, 1.875rem);
33
- }
34
-
35
- .header-root {
36
- width: 100%;
37
- max-width: var(--runeforge-crud-max-width);
38
- margin-inline: auto;
39
- }
40
- </style>
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import Breadcrumbs from '../navigation/Breadcrumbs.svelte';
4
+ import type { BreadcrumbItem } from '../../types/breadcrumb.js';
5
+
6
+ let {
7
+ title,
8
+ breadcrumbs = [],
9
+ buttons,
10
+ }: {
11
+ title: string;
12
+ breadcrumbs?: BreadcrumbItem[];
13
+ buttons?: Snippet;
14
+ } = $props();
15
+ </script>
16
+
17
+ <div class="header-root flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
18
+ <div class="flex flex-col gap-1 flex-1">
19
+ <h1>{title}</h1>
20
+ <Breadcrumbs items={breadcrumbs} />
21
+ </div>
22
+
23
+ {#if buttons}
24
+ <div class="flex min-w-0 items-center gap-2 sm:pt-1">
25
+ {@render buttons()}
26
+ </div>
27
+ {/if}
28
+ </div>
29
+
30
+ <style>
31
+ h1 {
32
+ font-size: var(--runeforge-crud-title-size, 1.875rem);
33
+ }
34
+
35
+ .header-root {
36
+ width: 100%;
37
+ max-width: var(--runeforge-crud-max-width);
38
+ margin-inline: auto;
39
+ }
40
+ </style>