@svelte-thing/primitives 0.0.0 → 0.0.2

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 (120) hide show
  1. package/dist/{chunk-D7D4PA-g.mjs → _virtual/_rolldown/runtime.mjs} +1 -1
  2. package/dist/button/createButton.svelte.d.mts +9 -0
  3. package/dist/button/createButton.svelte.mjs +6 -0
  4. package/dist/button/index.d.mts +1 -8
  5. package/dist/button/index.mjs +1 -5
  6. package/dist/{index-C-ME1Tk9.d.mts → field/date/createPicker.svelte.d.mts} +1 -1
  7. package/dist/field/date/createPicker.svelte.mjs +27 -0
  8. package/dist/field/date/index.d.mts +1 -1
  9. package/dist/field/date/index.mjs +1 -26
  10. package/dist/{index-CA_POIj_.d.mts → field/error/createError.svelte.d.mts} +1 -1
  11. package/dist/field/error/createError.svelte.mjs +10 -0
  12. package/dist/field/error/index.d.mts +1 -1
  13. package/dist/field/error/index.mjs +1 -9
  14. package/dist/field/index.d.mts +10 -9
  15. package/dist/field/index.mjs +16 -9
  16. package/dist/{createInput.svelte-DTz79zNF.d.mts → field/input/createInput.svelte.d.mts} +1 -1
  17. package/dist/{createInput.svelte-DzcT9u1t.mjs → field/input/createInput.svelte.mjs} +2 -2
  18. package/dist/field/input/index.d.mts +1 -1
  19. package/dist/field/input/index.mjs +1 -1
  20. package/dist/{index-OI9KlY5x.d.mts → field/label/createLabel.svelte.d.mts} +1 -1
  21. package/dist/field/label/createLabel.svelte.mjs +15 -0
  22. package/dist/field/label/index.d.mts +1 -1
  23. package/dist/field/label/index.mjs +1 -14
  24. package/dist/field/password/context.d.mts +6 -0
  25. package/dist/field/password/context.mjs +5 -0
  26. package/dist/field/password/createPassword.svelte.d.mts +15 -0
  27. package/dist/field/password/createPassword.svelte.mjs +25 -0
  28. package/dist/field/password/createShow.svelte.d.mts +9 -0
  29. package/dist/field/password/createShow.svelte.mjs +35 -0
  30. package/dist/field/password/index.d.mts +3 -1
  31. package/dist/field/password/index.mjs +3 -60
  32. package/dist/field/root/context.d.mts +6 -0
  33. package/dist/{context-D77KIx26.mjs → field/root/context.mjs} +1 -1
  34. package/dist/{index-BLb5EVhG.d.mts → field/root/createRoot.svelte.d.mts} +1 -4
  35. package/dist/field/root/createRoot.svelte.mjs +79 -0
  36. package/dist/field/root/index.d.mts +2 -1
  37. package/dist/field/root/index.mjs +2 -78
  38. package/dist/index.d.mts +2 -2
  39. package/dist/index.mjs +2 -2
  40. package/dist/menu/index.d.mts +5 -4
  41. package/dist/menu/index.mjs +9 -5
  42. package/dist/menu/item/createItem.svelte.d.mts +14 -0
  43. package/dist/menu/item/createItem.svelte.mjs +86 -0
  44. package/dist/menu/item/index.d.mts +1 -13
  45. package/dist/menu/item/index.mjs +1 -85
  46. package/dist/menu/popup/createPopup.svelte.d.mts +19 -0
  47. package/dist/menu/popup/createPopup.svelte.mjs +121 -0
  48. package/dist/menu/popup/index.d.mts +1 -18
  49. package/dist/menu/popup/index.mjs +1 -120
  50. package/dist/menu/root/context.d.mts +6 -0
  51. package/dist/{context-BJAwVB1S.mjs → menu/root/context.mjs} +1 -1
  52. package/dist/menu/root/createRoot.svelte.d.mts +25 -0
  53. package/dist/menu/root/createRoot.svelte.mjs +69 -0
  54. package/dist/menu/root/index.d.mts +2 -27
  55. package/dist/menu/root/index.mjs +2 -68
  56. package/dist/menu/trigger/createTrigger.svelte.d.mts +13 -0
  57. package/dist/menu/trigger/createTrigger.svelte.mjs +27 -0
  58. package/dist/menu/trigger/index.d.mts +1 -12
  59. package/dist/menu/trigger/index.mjs +1 -26
  60. package/dist/pagination/content/createContent.svelte.d.mts +9 -0
  61. package/dist/pagination/content/createContent.svelte.mjs +6 -0
  62. package/dist/pagination/content/index.d.mts +1 -8
  63. package/dist/pagination/content/index.mjs +1 -5
  64. package/dist/pagination/ellipsis/createEllipsis.svelte.d.mts +9 -0
  65. package/dist/pagination/ellipsis/createEllipsis.svelte.mjs +6 -0
  66. package/dist/pagination/ellipsis/index.d.mts +1 -8
  67. package/dist/pagination/ellipsis/index.mjs +1 -5
  68. package/dist/pagination/index.d.mts +5 -5
  69. package/dist/pagination/index.mjs +5 -5
  70. package/dist/pagination/item/createItem.svelte.d.mts +9 -0
  71. package/dist/pagination/item/createItem.svelte.mjs +6 -0
  72. package/dist/pagination/item/index.d.mts +1 -8
  73. package/dist/pagination/item/index.mjs +1 -5
  74. package/dist/pagination/link/createLink.svelte.d.mts +13 -0
  75. package/dist/pagination/link/createLink.svelte.mjs +13 -0
  76. package/dist/pagination/link/index.d.mts +1 -12
  77. package/dist/pagination/link/index.mjs +1 -12
  78. package/dist/pagination/root/createRoot.svelte.d.mts +9 -0
  79. package/dist/pagination/root/createRoot.svelte.mjs +9 -0
  80. package/dist/pagination/root/index.d.mts +1 -8
  81. package/dist/pagination/root/index.mjs +1 -8
  82. package/dist/tab/index.d.mts +8 -9
  83. package/dist/tab/index.mjs +15 -9
  84. package/dist/{index-07sbgO0w.d.mts → tab/indicator/createIndicator.svelte.d.mts} +1 -1
  85. package/dist/tab/indicator/createIndicator.svelte.mjs +42 -0
  86. package/dist/tab/indicator/index.d.mts +1 -1
  87. package/dist/tab/indicator/index.mjs +1 -41
  88. package/dist/{index-CbchmhrC.d.mts → tab/list/createList.svelte.d.mts} +1 -1
  89. package/dist/tab/list/createList.svelte.mjs +20 -0
  90. package/dist/tab/list/index.d.mts +1 -1
  91. package/dist/tab/list/index.mjs +1 -19
  92. package/dist/{index-D2vzMU8o.d.mts → tab/panel/createPanel.svelte.d.mts} +1 -1
  93. package/dist/tab/panel/createPanel.svelte.mjs +28 -0
  94. package/dist/tab/panel/index.d.mts +1 -1
  95. package/dist/tab/panel/index.mjs +1 -27
  96. package/dist/tab/root/context.d.mts +6 -0
  97. package/dist/{context-DwEoOJU2.mjs → tab/root/context.mjs} +1 -1
  98. package/dist/{index-j-8eH9nJ.d.mts → tab/root/createRoot.svelte.d.mts} +1 -4
  99. package/dist/tab/root/createRoot.svelte.mjs +57 -0
  100. package/dist/tab/root/index.d.mts +2 -1
  101. package/dist/tab/root/index.mjs +2 -56
  102. package/dist/{index-DAHEDQQS.d.mts → tab/title/createTitle.svelte.d.mts} +1 -1
  103. package/dist/tab/title/createTitle.svelte.mjs +18 -0
  104. package/dist/tab/title/index.d.mts +1 -1
  105. package/dist/tab/title/index.mjs +1 -17
  106. package/dist/{index-B-PBb_8h.d.mts → tab/trigger/createTrigger.svelte.d.mts} +1 -1
  107. package/dist/tab/trigger/createTrigger.svelte.mjs +94 -0
  108. package/dist/tab/trigger/index.d.mts +1 -1
  109. package/dist/tab/trigger/index.mjs +1 -93
  110. package/dist/table/index.d.mts +2 -1
  111. package/dist/table/index.mjs +3 -1
  112. package/dist/table/row/context.d.mts +6 -0
  113. package/dist/table/row/context.mjs +5 -0
  114. package/dist/table/row/createRow.svelte.d.mts +14 -0
  115. package/dist/table/row/createRow.svelte.mjs +14 -0
  116. package/dist/table/row/index.d.mts +2 -16
  117. package/dist/table/row/index.mjs +2 -16
  118. package/package.json +146 -30
  119. package/dist/index-BVVgDSdq.d.mts +0 -1
  120. package/dist/index-Boej-mdy.d.mts +0 -25
@@ -1,79 +1,3 @@
1
- import { n as setRoot, t as getRoot } from "../../context-D77KIx26.mjs";
2
- import { uid } from "uid";
3
- //#region src/field/root/createRoot.svelte.ts
4
- function createRoot(props) {
5
- const id = $derived(props.id ?? uid());
6
- const labelId = $derived(`${id}-label`);
7
- const controlId = $derived(`${id}-control`);
8
- const errorId = $derived(`${id}-error`);
9
- let isDirty = $derived(props.isDirty ?? false);
10
- let isDisabled = $derived(props.isDisabled ?? false);
11
- let isFilled = $derived(props.isFilled ?? false);
12
- let isFocused = $derived(props.isFocused ?? false);
13
- let isInvalid = $derived(props.isInvalid ?? false);
14
- let isTouched = $derived(props.isTouched ?? false);
15
- let isValid = $derived(props.isValid ?? false);
16
- const root = {
17
- get id() {
18
- return id;
19
- },
20
- get labelId() {
21
- return labelId;
22
- },
23
- get controlId() {
24
- return controlId;
25
- },
26
- get errorId() {
27
- return errorId;
28
- },
29
- get isDirty() {
30
- return isDirty;
31
- },
32
- set isDirty(value) {
33
- isDirty = value;
34
- },
35
- get isDisabled() {
36
- return isDisabled;
37
- },
38
- set isDisabled(value) {
39
- isDisabled = value;
40
- },
41
- get isFilled() {
42
- return isFilled;
43
- },
44
- set isFilled(value) {
45
- isFilled = value;
46
- },
47
- get isFocused() {
48
- return isFocused;
49
- },
50
- set isFocused(value) {
51
- isFocused = value;
52
- },
53
- get isInvalid() {
54
- return isInvalid;
55
- },
56
- set isInvalid(value) {
57
- isInvalid = value;
58
- },
59
- get isTouched() {
60
- return isTouched;
61
- },
62
- set isTouched(value) {
63
- isTouched = value;
64
- },
65
- get isValid() {
66
- return isValid;
67
- },
68
- set isValid(value) {
69
- isValid = value;
70
- },
71
- props: { get id() {
72
- return id;
73
- } }
74
- };
75
- setRoot(root);
76
- return root;
77
- }
78
- //#endregion
1
+ import { getRoot, setRoot } from "./context.mjs";
2
+ import { createRoot } from "./createRoot.svelte.mjs";
79
3
  export { createRoot, getRoot, setRoot };
package/dist/index.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import { t as index_d_exports } from "./field/index.mjs";
2
- import { t as index_d_exports$1 } from "./tab/index.mjs";
1
+ import { index_d_exports } from "./field/index.mjs";
2
+ import { index_d_exports as index_d_exports$1 } from "./tab/index.mjs";
3
3
  export { index_d_exports as Field, index_d_exports$1 as Tab };
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { t as field_exports } from "./field/index.mjs";
2
- import { t as tab_exports } from "./tab/index.mjs";
1
+ import { field_exports } from "./field/index.mjs";
2
+ import { tab_exports } from "./tab/index.mjs";
3
3
  export { field_exports as Field, tab_exports as Tab };
@@ -1,5 +1,6 @@
1
- import { CreateItemProps, ItemState, createItem } from "./item/index.mjs";
2
- import { CreatePopupProps, PopupState, createPopup } from "./popup/index.mjs";
3
- import { CreateRootProps, Orientation, RootState, createRoot, getRoot, setRoot } from "./root/index.mjs";
4
- import { CreateTriggerProps, TriggerState, createTrigger } from "./trigger/index.mjs";
1
+ import { CreateItemProps, ItemState, createItem } from "./item/createItem.svelte.mjs";
2
+ import { CreatePopupProps, PopupState, createPopup } from "./popup/createPopup.svelte.mjs";
3
+ import { CreateRootProps, Orientation, RootState, createRoot } from "./root/createRoot.svelte.mjs";
4
+ import { getRoot, setRoot } from "./root/context.mjs";
5
+ import { CreateTriggerProps, TriggerState, createTrigger } from "./trigger/createTrigger.svelte.mjs";
5
6
  export { CreateItemProps, CreatePopupProps, CreateRootProps, CreateTriggerProps, ItemState, Orientation, PopupState, RootState, TriggerState, createItem, createPopup, createRoot, createTrigger, getRoot, setRoot };
@@ -1,6 +1,10 @@
1
- import { n as setRoot, t as getRoot } from "../context-BJAwVB1S.mjs";
2
- import { createItem } from "./item/index.mjs";
3
- import { createPopup } from "./popup/index.mjs";
4
- import { createRoot } from "./root/index.mjs";
5
- import { createTrigger } from "./trigger/index.mjs";
1
+ import { getRoot, setRoot } from "./root/context.mjs";
2
+ import { createItem } from "./item/createItem.svelte.mjs";
3
+ import "./item/index.mjs";
4
+ import { createPopup } from "./popup/createPopup.svelte.mjs";
5
+ import "./popup/index.mjs";
6
+ import { createRoot } from "./root/createRoot.svelte.mjs";
7
+ import "./root/index.mjs";
8
+ import { createTrigger } from "./trigger/createTrigger.svelte.mjs";
9
+ import "./trigger/index.mjs";
6
10
  export { createItem, createPopup, createRoot, createTrigger, getRoot, setRoot };
@@ -0,0 +1,14 @@
1
+ import { Exact } from "@svelte-thing/type-utils";
2
+ import { HTMLAttributes } from "svelte/elements";
3
+
4
+ //#region src/menu/item/createItem.svelte.d.ts
5
+ interface CreateItemProps {
6
+ disabled: boolean | null | undefined;
7
+ id: string | null | undefined;
8
+ }
9
+ interface ItemState {
10
+ props: HTMLAttributes<HTMLElement>;
11
+ }
12
+ declare function createItem<T extends CreateItemProps>(props: Exact<CreateItemProps, T>): ItemState;
13
+ //#endregion
14
+ export { CreateItemProps, ItemState, createItem };
@@ -0,0 +1,86 @@
1
+ import { getRoot } from "../root/context.mjs";
2
+ import { flushSync } from "svelte";
3
+ import { uid } from "uid";
4
+ import { createAttachmentKey } from "svelte/attachments";
5
+ //#region src/menu/item/createItem.svelte.ts
6
+ function createItem(props) {
7
+ const root = getRoot();
8
+ const itemId = $derived(props.id ?? `menuitem-${uid()}`);
9
+ return { props: {
10
+ "data-menu-item": "",
11
+ get "aria-disabled"() {
12
+ return props.disabled ? "true" : void 0;
13
+ },
14
+ get "data-disabled"() {
15
+ return props.disabled ? "" : void 0;
16
+ },
17
+ get "data-id"() {
18
+ return itemId;
19
+ },
20
+ get "data-root-id"() {
21
+ return root.id;
22
+ },
23
+ get id() {
24
+ return itemId;
25
+ },
26
+ get tabindex() {
27
+ return root.highlightedItemId === itemId ? 0 : -1;
28
+ },
29
+ onkeydown(event) {
30
+ if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) return;
31
+ let preventDefault = false;
32
+ let pendingHighlighted = null;
33
+ const item = event.currentTarget;
34
+ const items = [...document.querySelectorAll(`[data-menu-item][data-root-id="${root.id}"]:not([data-disabled])`)];
35
+ const currentIndex = items.indexOf(item);
36
+ const nextKeyName = root.orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
37
+ const previousKeyName = root.orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
38
+ switch (event.key) {
39
+ case previousKeyName:
40
+ pendingHighlighted = items[currentIndex === 0 ? items.length - 1 : currentIndex - 1]?.dataset.id ?? null;
41
+ preventDefault = true;
42
+ break;
43
+ case nextKeyName:
44
+ pendingHighlighted = items[(currentIndex + 1) % items.length]?.dataset.id ?? null;
45
+ preventDefault = true;
46
+ break;
47
+ case "Home":
48
+ pendingHighlighted = items[0]?.dataset.id ?? null;
49
+ preventDefault = true;
50
+ break;
51
+ case "End":
52
+ pendingHighlighted = items.at(-1)?.dataset.id ?? null;
53
+ preventDefault = true;
54
+ break;
55
+ default: break;
56
+ }
57
+ if (pendingHighlighted !== null) {
58
+ root.highlightedItemId = pendingHighlighted;
59
+ flushSync();
60
+ items.find((el) => el.dataset.id === pendingHighlighted)?.focus();
61
+ }
62
+ if (preventDefault) {
63
+ event.stopPropagation();
64
+ event.preventDefault();
65
+ }
66
+ },
67
+ onmouseover: (event) => {
68
+ if (root.shouldHighlightOnHover) {
69
+ root.highlightedItemId = itemId;
70
+ flushSync();
71
+ event.currentTarget.focus();
72
+ }
73
+ },
74
+ onmouseleave: () => {
75
+ if (root.shouldHighlightOnHover && root.highlightedItemId === itemId) root.highlightedItemId = null;
76
+ },
77
+ role: "menuitem",
78
+ [createAttachmentKey()]: () => {
79
+ return () => {
80
+ if (root.highlightedItemId === itemId) root.highlightedItemId = null;
81
+ };
82
+ }
83
+ } };
84
+ }
85
+ //#endregion
86
+ export { createItem };
@@ -1,14 +1,2 @@
1
- import { Exact } from "@svelte-thing/type-utils";
2
- import { HTMLAttributes } from "svelte/elements";
3
-
4
- //#region src/menu/item/createItem.svelte.d.ts
5
- interface CreateItemProps {
6
- disabled: boolean | null | undefined;
7
- id: string | null | undefined;
8
- }
9
- interface ItemState {
10
- props: HTMLAttributes<HTMLElement>;
11
- }
12
- declare function createItem<T extends CreateItemProps>(props: Exact<CreateItemProps, T>): ItemState;
13
- //#endregion
1
+ import { CreateItemProps, ItemState, createItem } from "./createItem.svelte.mjs";
14
2
  export { CreateItemProps, ItemState, createItem };
@@ -1,86 +1,2 @@
1
- import { t as getRoot } from "../../context-BJAwVB1S.mjs";
2
- import { flushSync } from "svelte";
3
- import { uid } from "uid";
4
- import { createAttachmentKey } from "svelte/attachments";
5
- //#region src/menu/item/createItem.svelte.ts
6
- function createItem(props) {
7
- const root = getRoot();
8
- const itemId = $derived(props.id ?? `menuitem-${uid()}`);
9
- return { props: {
10
- "data-menu-item": "",
11
- get "aria-disabled"() {
12
- return props.disabled ? "true" : void 0;
13
- },
14
- get "data-disabled"() {
15
- return props.disabled ? "" : void 0;
16
- },
17
- get "data-id"() {
18
- return itemId;
19
- },
20
- get "data-root-id"() {
21
- return root.id;
22
- },
23
- get id() {
24
- return itemId;
25
- },
26
- get tabindex() {
27
- return root.highlightedItemId === itemId ? 0 : -1;
28
- },
29
- onkeydown(event) {
30
- if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) return;
31
- let preventDefault = false;
32
- let pendingHighlighted = null;
33
- const item = event.currentTarget;
34
- const items = [...document.querySelectorAll(`[data-menu-item][data-root-id="${root.id}"]:not([data-disabled])`)];
35
- const currentIndex = items.indexOf(item);
36
- const nextKeyName = root.orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
37
- const previousKeyName = root.orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
38
- switch (event.key) {
39
- case previousKeyName:
40
- pendingHighlighted = items[currentIndex === 0 ? items.length - 1 : currentIndex - 1]?.dataset.id ?? null;
41
- preventDefault = true;
42
- break;
43
- case nextKeyName:
44
- pendingHighlighted = items[(currentIndex + 1) % items.length]?.dataset.id ?? null;
45
- preventDefault = true;
46
- break;
47
- case "Home":
48
- pendingHighlighted = items[0]?.dataset.id ?? null;
49
- preventDefault = true;
50
- break;
51
- case "End":
52
- pendingHighlighted = items.at(-1)?.dataset.id ?? null;
53
- preventDefault = true;
54
- break;
55
- default: break;
56
- }
57
- if (pendingHighlighted !== null) {
58
- root.highlightedItemId = pendingHighlighted;
59
- flushSync();
60
- items.find((el) => el.dataset.id === pendingHighlighted)?.focus();
61
- }
62
- if (preventDefault) {
63
- event.stopPropagation();
64
- event.preventDefault();
65
- }
66
- },
67
- onmouseover: (event) => {
68
- if (root.shouldHighlightOnHover) {
69
- root.highlightedItemId = itemId;
70
- flushSync();
71
- event.currentTarget.focus();
72
- }
73
- },
74
- onmouseleave: () => {
75
- if (root.shouldHighlightOnHover && root.highlightedItemId === itemId) root.highlightedItemId = null;
76
- },
77
- role: "menuitem",
78
- [createAttachmentKey()]: () => {
79
- return () => {
80
- if (root.highlightedItemId === itemId) root.highlightedItemId = null;
81
- };
82
- }
83
- } };
84
- }
85
- //#endregion
1
+ import { createItem } from "./createItem.svelte.mjs";
86
2
  export { createItem };
@@ -0,0 +1,19 @@
1
+ import { HTMLAttributes } from "svelte/elements";
2
+
3
+ //#region src/menu/popup/createPopup.svelte.d.ts
4
+ type Side = 'left' | 'right' | 'bottom' | 'top' | 'inline-end' | 'inline-start';
5
+ type Align = 'start' | 'end' | 'center';
6
+ interface CreatePopupProps {
7
+ popover: HTMLAttributes<HTMLElement>['popover'] | null | undefined;
8
+ align: Align | undefined;
9
+ side: Side | undefined;
10
+ alignOffset: number | undefined;
11
+ positionAnchor: string | null | undefined;
12
+ sideOffset: number | undefined;
13
+ }
14
+ interface PopupState {
15
+ props: HTMLAttributes<HTMLElement>;
16
+ }
17
+ declare function createPopup(props: CreatePopupProps): PopupState;
18
+ //#endregion
19
+ export { CreatePopupProps, PopupState, createPopup };
@@ -0,0 +1,121 @@
1
+ import { getRoot } from "../root/context.mjs";
2
+ import { flushSync, untrack } from "svelte";
3
+ import { createAttachmentKey } from "svelte/attachments";
4
+ import { assertNever } from "@svelte-thing/type-utils";
5
+ import { on } from "svelte/events";
6
+ //#region src/menu/popup/createPopup.svelte.ts
7
+ function createPopup(props) {
8
+ const root = getRoot();
9
+ return { props: {
10
+ "data-menu-popup": "",
11
+ get "data-root-id"() {
12
+ return root.id;
13
+ },
14
+ get "data-open"() {
15
+ return root.isOpen ? "" : void 0;
16
+ },
17
+ get "data-closed"() {
18
+ return root.isOpen ? void 0 : "";
19
+ },
20
+ get "data-side"() {
21
+ return props.side ?? "bottom";
22
+ },
23
+ get "data-align"() {
24
+ return props.align ?? "center";
25
+ },
26
+ get popover() {
27
+ return props.popover ?? "";
28
+ },
29
+ get id() {
30
+ return root.popupId;
31
+ },
32
+ get style() {
33
+ const positionAnchor = props.positionAnchor === void 0 ? root.anchorName : props.positionAnchor;
34
+ const styles = [positionAnchor === null ? void 0 : `position-anchor: ${positionAnchor}`, `justify-self: anchor-${props.align ?? "center"}`];
35
+ const side = props.side ?? "bottom";
36
+ const sideOffset = props.sideOffset ?? 0;
37
+ if (side === "bottom") styles.push(`top: calc(anchor(bottom) + ${sideOffset}px);`);
38
+ else if (side === "top") styles.push(`bottom: calc(anchor(top) + ${sideOffset}px);`);
39
+ else if (side === "left") styles.push(`right: calc(anchor(left) + ${sideOffset}px);`);
40
+ else if (side === "right") styles.push(`left: calc(anchor(right) + ${sideOffset}px);`);
41
+ else if (side === "inline-end") styles.push(`inset-inline-end: calc(anchor(end) + ${sideOffset}px);`);
42
+ else if (side === "inline-start") styles.push(`inset-inline-start: calc(anchor(start) + ${sideOffset}px);`);
43
+ else assertNever(side);
44
+ return styles.filter(Boolean).join("; ");
45
+ },
46
+ get tabindex() {
47
+ return root.isOpen ? -1 : void 0;
48
+ },
49
+ [createAttachmentKey()](element) {
50
+ const update = (event) => {
51
+ if (event && event.newState !== "open") return;
52
+ root.isOpen = event ? true : element.matches(":popover-open");
53
+ flushSync();
54
+ if (root.isOpen) element.focus();
55
+ };
56
+ const open = () => {
57
+ element.showPopover();
58
+ };
59
+ const close = () => {
60
+ element.hidePopover();
61
+ };
62
+ root.open = open;
63
+ root.close = close;
64
+ $effect(() => {
65
+ if (root._propIsOpen === true && !element.matches(":popover-open")) element.showPopover();
66
+ else if (root._propIsOpen === false && element.matches(":popover-open")) element.hidePopover();
67
+ untrack(() => {
68
+ update();
69
+ });
70
+ });
71
+ update();
72
+ const offBefore = on(element, "beforetoggle", update);
73
+ const offAfter = on(element, "toggle", update);
74
+ return () => {
75
+ offBefore();
76
+ offAfter();
77
+ root.open = () => {
78
+ throw new Error("Attempted to open before popup initialization");
79
+ };
80
+ root.close = () => {
81
+ throw new Error("Attempted to close before popup initialization");
82
+ };
83
+ };
84
+ },
85
+ onkeydown(event) {
86
+ if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) return;
87
+ const popup = event.currentTarget;
88
+ if (document.activeElement !== popup) return;
89
+ let preventDefault = false;
90
+ let pendingHighlighted = null;
91
+ const items = [...document.querySelectorAll(`[data-menu-item][data-root-id="${root.id}"]:not([data-disabled])`)];
92
+ const nextKeyName = root.orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
93
+ const previousKeyName = root.orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
94
+ switch (event.key) {
95
+ case previousKeyName:
96
+ case "End":
97
+ pendingHighlighted = items.at(-1)?.dataset.id ?? null;
98
+ preventDefault = true;
99
+ break;
100
+ case nextKeyName:
101
+ case "Home":
102
+ pendingHighlighted = items[0]?.dataset.id ?? null;
103
+ preventDefault = true;
104
+ break;
105
+ default: break;
106
+ }
107
+ if (pendingHighlighted !== null) {
108
+ root.highlightedItemId = pendingHighlighted;
109
+ flushSync();
110
+ items.find((el) => el.dataset.id === pendingHighlighted)?.focus();
111
+ }
112
+ if (preventDefault) {
113
+ event.stopPropagation();
114
+ event.preventDefault();
115
+ }
116
+ },
117
+ role: "menu"
118
+ } };
119
+ }
120
+ //#endregion
121
+ export { createPopup };
@@ -1,19 +1,2 @@
1
- import { HTMLAttributes } from "svelte/elements";
2
-
3
- //#region src/menu/popup/createPopup.svelte.d.ts
4
- type Side = 'left' | 'right' | 'bottom' | 'top' | 'inline-end' | 'inline-start';
5
- type Align = 'start' | 'end' | 'center';
6
- interface CreatePopupProps {
7
- popover: HTMLAttributes<HTMLElement>['popover'] | null | undefined;
8
- align: Align | undefined;
9
- side: Side | undefined;
10
- alignOffset: number | undefined;
11
- positionAnchor: string | null | undefined;
12
- sideOffset: number | undefined;
13
- }
14
- interface PopupState {
15
- props: HTMLAttributes<HTMLElement>;
16
- }
17
- declare function createPopup(props: CreatePopupProps): PopupState;
18
- //#endregion
1
+ import { CreatePopupProps, PopupState, createPopup } from "./createPopup.svelte.mjs";
19
2
  export { CreatePopupProps, PopupState, createPopup };
@@ -1,121 +1,2 @@
1
- import { t as getRoot } from "../../context-BJAwVB1S.mjs";
2
- import { flushSync, untrack } from "svelte";
3
- import { createAttachmentKey } from "svelte/attachments";
4
- import { assertNever } from "@svelte-thing/type-utils";
5
- import { on } from "svelte/events";
6
- //#region src/menu/popup/createPopup.svelte.ts
7
- function createPopup(props) {
8
- const root = getRoot();
9
- return { props: {
10
- "data-menu-popup": "",
11
- get "data-root-id"() {
12
- return root.id;
13
- },
14
- get "data-open"() {
15
- return root.isOpen ? "" : void 0;
16
- },
17
- get "data-closed"() {
18
- return root.isOpen ? void 0 : "";
19
- },
20
- get "data-side"() {
21
- return props.side ?? "bottom";
22
- },
23
- get "data-align"() {
24
- return props.align ?? "center";
25
- },
26
- get popover() {
27
- return props.popover ?? "";
28
- },
29
- get id() {
30
- return root.popupId;
31
- },
32
- get style() {
33
- const positionAnchor = props.positionAnchor === void 0 ? root.anchorName : props.positionAnchor;
34
- const styles = [positionAnchor === null ? void 0 : `position-anchor: ${positionAnchor}`, `justify-self: anchor-${props.align ?? "center"}`];
35
- const side = props.side ?? "bottom";
36
- const sideOffset = props.sideOffset ?? 0;
37
- if (side === "bottom") styles.push(`top: calc(anchor(bottom) + ${sideOffset}px);`);
38
- else if (side === "top") styles.push(`bottom: calc(anchor(top) + ${sideOffset}px);`);
39
- else if (side === "left") styles.push(`right: calc(anchor(left) + ${sideOffset}px);`);
40
- else if (side === "right") styles.push(`left: calc(anchor(right) + ${sideOffset}px);`);
41
- else if (side === "inline-end") styles.push(`inset-inline-end: calc(anchor(end) + ${sideOffset}px);`);
42
- else if (side === "inline-start") styles.push(`inset-inline-start: calc(anchor(start) + ${sideOffset}px);`);
43
- else assertNever(side);
44
- return styles.filter(Boolean).join("; ");
45
- },
46
- get tabindex() {
47
- return root.isOpen ? -1 : void 0;
48
- },
49
- [createAttachmentKey()](element) {
50
- const update = (event) => {
51
- if (event && event.newState !== "open") return;
52
- root.isOpen = event ? true : element.matches(":popover-open");
53
- flushSync();
54
- if (root.isOpen) element.focus();
55
- };
56
- const open = () => {
57
- element.showPopover();
58
- };
59
- const close = () => {
60
- element.hidePopover();
61
- };
62
- root.open = open;
63
- root.close = close;
64
- $effect(() => {
65
- if (root._propIsOpen === true && !element.matches(":popover-open")) element.showPopover();
66
- else if (root._propIsOpen === false && element.matches(":popover-open")) element.hidePopover();
67
- untrack(() => {
68
- update();
69
- });
70
- });
71
- update();
72
- const offBefore = on(element, "beforetoggle", update);
73
- const offAfter = on(element, "toggle", update);
74
- return () => {
75
- offBefore();
76
- offAfter();
77
- root.open = () => {
78
- throw new Error("Attempted to open before popup initialization");
79
- };
80
- root.close = () => {
81
- throw new Error("Attempted to close before popup initialization");
82
- };
83
- };
84
- },
85
- onkeydown(event) {
86
- if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) return;
87
- const popup = event.currentTarget;
88
- if (document.activeElement !== popup) return;
89
- let preventDefault = false;
90
- let pendingHighlighted = null;
91
- const items = [...document.querySelectorAll(`[data-menu-item][data-root-id="${root.id}"]:not([data-disabled])`)];
92
- const nextKeyName = root.orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
93
- const previousKeyName = root.orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
94
- switch (event.key) {
95
- case previousKeyName:
96
- case "End":
97
- pendingHighlighted = items.at(-1)?.dataset.id ?? null;
98
- preventDefault = true;
99
- break;
100
- case nextKeyName:
101
- case "Home":
102
- pendingHighlighted = items[0]?.dataset.id ?? null;
103
- preventDefault = true;
104
- break;
105
- default: break;
106
- }
107
- if (pendingHighlighted !== null) {
108
- root.highlightedItemId = pendingHighlighted;
109
- flushSync();
110
- items.find((el) => el.dataset.id === pendingHighlighted)?.focus();
111
- }
112
- if (preventDefault) {
113
- event.stopPropagation();
114
- event.preventDefault();
115
- }
116
- },
117
- role: "menu"
118
- } };
119
- }
120
- //#endregion
1
+ import { createPopup } from "./createPopup.svelte.mjs";
121
2
  export { createPopup };
@@ -0,0 +1,6 @@
1
+ import { RootState } from "./createRoot.svelte.mjs";
2
+
3
+ //#region src/menu/root/context.d.ts
4
+ declare const getRoot: () => RootState, setRoot: (context: RootState) => RootState;
5
+ //#endregion
6
+ export { getRoot, setRoot };
@@ -2,4 +2,4 @@ import { createContext } from "svelte";
2
2
  //#region src/menu/root/context.ts
3
3
  const [getRoot, setRoot] = createContext();
4
4
  //#endregion
5
- export { setRoot as n, getRoot as t };
5
+ export { getRoot, setRoot };
@@ -0,0 +1,25 @@
1
+ //#region src/menu/root/createRoot.svelte.d.ts
2
+ type Orientation = 'horizontal' | 'vertical';
3
+ interface CreateRootProps {
4
+ anchorName: string | undefined;
5
+ id: string | null | undefined;
6
+ isOpen: boolean | undefined;
7
+ orientation: Orientation | undefined;
8
+ shouldHighlightOnHover: boolean | undefined;
9
+ }
10
+ interface RootState {
11
+ anchorName: string;
12
+ close: () => void;
13
+ highlightedItemId: string | null;
14
+ id: string;
15
+ isOpen: boolean;
16
+ open: () => void;
17
+ orientation: Orientation;
18
+ popupId: string;
19
+ shouldHighlightOnHover: boolean;
20
+ triggerId: string;
21
+ _propIsOpen: boolean | undefined;
22
+ }
23
+ declare function createRoot(props: CreateRootProps): RootState;
24
+ //#endregion
25
+ export { CreateRootProps, Orientation, RootState, createRoot };