@quaffui/quaff 1.0.0-beta1 → 1.0.0-beta13

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 (218) hide show
  1. package/README.md +2 -0
  2. package/dist/classes/QScrollObserver.svelte.d.ts +4 -4
  3. package/dist/classes/QScrollObserver.svelte.js +26 -13
  4. package/dist/classes/Quaff.svelte.d.ts +3 -0
  5. package/dist/classes/Quaff.svelte.js +21 -17
  6. package/dist/components/avatar/QAvatar.svelte +4 -0
  7. package/dist/components/avatar/QAvatar.svelte.d.ts +4 -14
  8. package/dist/components/breadcrumbs/QBreadcrumbs.scss +9 -5
  9. package/dist/components/breadcrumbs/QBreadcrumbs.svelte +46 -16
  10. package/dist/components/breadcrumbs/QBreadcrumbs.svelte.d.ts +24 -12
  11. package/dist/components/breadcrumbs/QBreadcrumbsEl.scss +22 -3
  12. package/dist/components/breadcrumbs/QBreadcrumbsEl.svelte +50 -38
  13. package/dist/components/breadcrumbs/QBreadcrumbsEl.svelte.d.ts +4 -14
  14. package/dist/components/breadcrumbs/props.d.ts +4 -4
  15. package/dist/components/button/QBtn.scss +3 -1
  16. package/dist/components/button/QBtn.svelte +38 -22
  17. package/dist/components/button/QBtn.svelte.d.ts +4 -14
  18. package/dist/components/button/props.d.ts +9 -2
  19. package/dist/components/card/QCard.svelte +9 -5
  20. package/dist/components/card/QCard.svelte.d.ts +4 -14
  21. package/dist/components/card/QCardActions.svelte +4 -0
  22. package/dist/components/card/QCardActions.svelte.d.ts +4 -14
  23. package/dist/components/card/QCardSection.svelte +2 -0
  24. package/dist/components/card/QCardSection.svelte.d.ts +4 -14
  25. package/dist/components/checkbox/QCheckbox.svelte +6 -4
  26. package/dist/components/checkbox/QCheckbox.svelte.d.ts +4 -14
  27. package/dist/components/checkbox/props.d.ts +1 -1
  28. package/dist/components/chip/QChip.scss +3 -1
  29. package/dist/components/chip/QChip.svelte +24 -14
  30. package/dist/components/chip/QChip.svelte.d.ts +4 -14
  31. package/dist/components/codeBlock/QCodeBlock.svelte +8 -0
  32. package/dist/components/codeBlock/QCodeBlock.svelte.d.ts +4 -14
  33. package/dist/components/dialog/QDialog.scss +17 -0
  34. package/dist/components/dialog/QDialog.svelte +34 -9
  35. package/dist/components/dialog/QDialog.svelte.d.ts +8 -21
  36. package/dist/components/drawer/QDrawer.scss +2 -2
  37. package/dist/components/drawer/QDrawer.svelte +124 -69
  38. package/dist/components/drawer/QDrawer.svelte.d.ts +8 -21
  39. package/dist/components/drawer/props.d.ts +3 -3
  40. package/dist/components/expansion-item/QExpansionItem.scss +59 -0
  41. package/dist/components/expansion-item/QExpansionItem.svelte +319 -0
  42. package/dist/components/expansion-item/QExpansionItem.svelte.d.ts +8 -0
  43. package/dist/components/expansion-item/docs.d.ts +2 -0
  44. package/dist/components/expansion-item/docs.js +17 -0
  45. package/dist/components/expansion-item/props.d.ts +129 -0
  46. package/dist/components/expansion-item/props.js +1 -0
  47. package/dist/components/footer/QFooter.scss +1 -1
  48. package/dist/components/footer/QFooter.svelte +32 -28
  49. package/dist/components/footer/QFooter.svelte.d.ts +4 -14
  50. package/dist/components/header/QHeader.scss +1 -1
  51. package/dist/components/header/QHeader.svelte +41 -33
  52. package/dist/components/header/QHeader.svelte.d.ts +4 -14
  53. package/dist/components/icon/QIcon.svelte +6 -4
  54. package/dist/components/icon/QIcon.svelte.d.ts +4 -14
  55. package/dist/components/index.d.ts +3 -1
  56. package/dist/components/index.js +3 -1
  57. package/dist/components/input/QInput.svelte +139 -17
  58. package/dist/components/input/QInput.svelte.d.ts +4 -14
  59. package/dist/components/input/docs.js +2 -2
  60. package/dist/components/input/mask.d.ts +10 -0
  61. package/dist/components/input/mask.js +204 -0
  62. package/dist/components/input/props.d.ts +37 -4
  63. package/dist/components/layout/QLayout.svelte +248 -93
  64. package/dist/components/layout/QLayout.svelte.d.ts +67 -15
  65. package/dist/components/layout/props.d.ts +1 -1
  66. package/dist/components/list/QItem.scss +7 -4
  67. package/dist/components/list/QItem.svelte +44 -24
  68. package/dist/components/list/QItem.svelte.d.ts +17 -13
  69. package/dist/components/list/QItemSection.scss +24 -3
  70. package/dist/components/list/QItemSection.svelte +19 -21
  71. package/dist/components/list/QItemSection.svelte.d.ts +4 -14
  72. package/dist/components/list/QList.scss +17 -4
  73. package/dist/components/list/QList.svelte +30 -8
  74. package/dist/components/list/QList.svelte.d.ts +17 -13
  75. package/dist/components/list/props.d.ts +3 -3
  76. package/dist/components/menu/QMenu.scss +37 -0
  77. package/dist/components/menu/QMenu.svelte +314 -0
  78. package/dist/components/menu/QMenu.svelte.d.ts +8 -0
  79. package/dist/components/menu/docs.d.ts +2 -0
  80. package/dist/components/menu/docs.js +27 -0
  81. package/dist/components/menu/props.d.ts +48 -0
  82. package/dist/components/menu/props.js +1 -0
  83. package/dist/components/progress/QCircularProgress.svelte +17 -14
  84. package/dist/components/progress/QCircularProgress.svelte.d.ts +4 -14
  85. package/dist/components/progress/QLinearProgress.svelte +15 -15
  86. package/dist/components/progress/QLinearProgress.svelte.d.ts +4 -14
  87. package/dist/components/radio/QRadio.svelte +6 -4
  88. package/dist/components/radio/QRadio.svelte.d.ts +4 -14
  89. package/dist/components/radio/props.d.ts +1 -1
  90. package/dist/components/railbar/QRailbar.scss +1 -1
  91. package/dist/components/railbar/QRailbar.svelte +36 -35
  92. package/dist/components/railbar/QRailbar.svelte.d.ts +4 -14
  93. package/dist/components/select/QSelect.svelte +316 -102
  94. package/dist/components/select/QSelect.svelte.d.ts +4 -14
  95. package/dist/components/select/filter.d.ts +13 -0
  96. package/dist/components/select/filter.js +73 -0
  97. package/dist/components/select/index.scss +28 -27
  98. package/dist/components/select/option.d.ts +9 -0
  99. package/dist/components/select/option.js +59 -0
  100. package/dist/components/select/props.d.ts +40 -7
  101. package/dist/components/separator/QSeparator.scss +2 -0
  102. package/dist/components/separator/QSeparator.svelte +9 -8
  103. package/dist/components/separator/QSeparator.svelte.d.ts +4 -14
  104. package/dist/components/switch/QSwitch.scss +12 -6
  105. package/dist/components/switch/QSwitch.svelte +7 -1
  106. package/dist/components/switch/QSwitch.svelte.d.ts +4 -14
  107. package/dist/components/table/QTable.svelte +31 -19
  108. package/dist/components/table/QTable.svelte.d.ts +4 -14
  109. package/dist/components/table/index.scss +1 -1
  110. package/dist/components/tabs/QTab.scss +2 -0
  111. package/dist/components/tabs/QTab.svelte +19 -22
  112. package/dist/components/tabs/QTab.svelte.d.ts +4 -14
  113. package/dist/components/tabs/QTabs.svelte +59 -32
  114. package/dist/components/tabs/QTabs.svelte.d.ts +18 -18
  115. package/dist/components/toolbar/QToolbar.svelte +2 -0
  116. package/dist/components/toolbar/QToolbar.svelte.d.ts +4 -14
  117. package/dist/components/toolbar/QToolbarTitle.svelte +2 -0
  118. package/dist/components/toolbar/QToolbarTitle.svelte.d.ts +4 -14
  119. package/dist/components/tooltip/QTooltip.svelte +48 -38
  120. package/dist/components/tooltip/QTooltip.svelte.d.ts +29 -17
  121. package/dist/components/tooltip/QTooltipBase.svelte +18 -8
  122. package/dist/components/tooltip/QTooltipBase.svelte.d.ts +4 -14
  123. package/dist/composables/index.d.ts +2 -0
  124. package/dist/composables/index.js +2 -0
  125. package/dist/composables/useColor.d.ts +1 -0
  126. package/dist/composables/useColor.js +19 -0
  127. package/dist/composables/useRevealScrollObserver.svelte.d.ts +9 -0
  128. package/dist/composables/useRevealScrollObserver.svelte.js +25 -0
  129. package/dist/composables/useRouterLink.d.ts +3 -2
  130. package/dist/composables/useRouterLink.js +2 -2
  131. package/dist/css/_components.scss +2 -0
  132. package/dist/css/classes/_grid.scss +12 -1
  133. package/dist/css/index.css +1 -1
  134. package/dist/css/mixins/_design.scss +1 -1
  135. package/dist/css/mixins/_field.scss +3 -2
  136. package/dist/css/mixins/_table.scss +1 -1
  137. package/dist/css/mixins/_toolbar.scss +1 -1
  138. package/dist/css/shared/q-field.scss +7 -6
  139. package/dist/css/theme/_page.scss +8 -6
  140. package/dist/css/theme/_reset.scss +2 -1
  141. package/dist/helpers/clickOutside.js +5 -4
  142. package/dist/helpers/ripple.js +5 -6
  143. package/dist/helpers/version.d.ts +1 -1
  144. package/dist/helpers/version.js +1 -1
  145. package/dist/{components/private/ContextReseter.svelte → internal/ContextResetter.svelte} +2 -3
  146. package/dist/internal/ContextResetter.svelte.d.ts +8 -0
  147. package/dist/{components/private → internal}/QIconSnippet.svelte +2 -2
  148. package/dist/internal/QIconSnippet.svelte.d.ts +10 -0
  149. package/dist/utils/context.d.ts +49 -32
  150. package/dist/utils/context.js +82 -33
  151. package/dist/utils/dom.d.ts +6 -0
  152. package/dist/utils/dom.js +33 -0
  153. package/dist/utils/events.d.ts +0 -24
  154. package/dist/utils/events.js +0 -24
  155. package/package.json +44 -38
  156. package/dist/classes/QContext.svelte.d.ts +0 -42
  157. package/dist/classes/QContext.svelte.js +0 -63
  158. package/dist/components/avatar/docs.props.d.ts +0 -3
  159. package/dist/components/avatar/docs.props.js +0 -87
  160. package/dist/components/breadcrumbs/docs.props.d.ts +0 -5
  161. package/dist/components/breadcrumbs/docs.props.js +0 -144
  162. package/dist/components/button/docs.props.d.ts +0 -3
  163. package/dist/components/button/docs.props.js +0 -227
  164. package/dist/components/card/docs.props.d.ts +0 -7
  165. package/dist/components/card/docs.props.js +0 -89
  166. package/dist/components/checkbox/docs.props.d.ts +0 -3
  167. package/dist/components/checkbox/docs.props.js +0 -41
  168. package/dist/components/chip/docs.props.d.ts +0 -3
  169. package/dist/components/chip/docs.props.js +0 -137
  170. package/dist/components/codeBlock/docs.props.d.ts +0 -3
  171. package/dist/components/codeBlock/docs.props.js +0 -83
  172. package/dist/components/dialog/docs.props.d.ts +0 -3
  173. package/dist/components/dialog/docs.props.js +0 -65
  174. package/dist/components/drawer/docs.props.d.ts +0 -3
  175. package/dist/components/drawer/docs.props.js +0 -149
  176. package/dist/components/footer/docs.props.d.ts +0 -3
  177. package/dist/components/footer/docs.props.js +0 -65
  178. package/dist/components/header/docs.props.d.ts +0 -7
  179. package/dist/components/header/docs.props.js +0 -131
  180. package/dist/components/icon/docs.props.d.ts +0 -3
  181. package/dist/components/icon/docs.props.js +0 -107
  182. package/dist/components/input/docs.props.d.ts +0 -3
  183. package/dist/components/input/docs.props.js +0 -162
  184. package/dist/components/layout/docs.props.d.ts +0 -3
  185. package/dist/components/layout/docs.props.js +0 -81
  186. package/dist/components/list/docs.props.d.ts +0 -11
  187. package/dist/components/list/docs.props.js +0 -434
  188. package/dist/components/private/ContextReseter.svelte.d.ts +0 -14
  189. package/dist/components/private/QApi.svelte +0 -296
  190. package/dist/components/private/QApi.svelte.d.ts +0 -14
  191. package/dist/components/private/QDocs.svelte +0 -155
  192. package/dist/components/private/QDocs.svelte.d.ts +0 -14
  193. package/dist/components/private/QDocsSection.svelte +0 -62
  194. package/dist/components/private/QDocsSection.svelte.d.ts +0 -14
  195. package/dist/components/private/QIconSnippet.svelte.d.ts +0 -14
  196. package/dist/components/private/index.d.ts +0 -6
  197. package/dist/components/private/index.js +0 -6
  198. package/dist/components/progress/docs.props.d.ts +0 -5
  199. package/dist/components/progress/docs.props.js +0 -314
  200. package/dist/components/radio/docs.props.d.ts +0 -3
  201. package/dist/components/radio/docs.props.js +0 -53
  202. package/dist/components/railbar/docs.props.d.ts +0 -3
  203. package/dist/components/railbar/docs.props.js +0 -47
  204. package/dist/components/select/docs.props.d.ts +0 -3
  205. package/dist/components/select/docs.props.js +0 -198
  206. package/dist/components/separator/docs.props.d.ts +0 -5
  207. package/dist/components/separator/docs.props.js +0 -196
  208. package/dist/components/switch/docs.props.d.ts +0 -3
  209. package/dist/components/switch/docs.props.js +0 -119
  210. package/dist/components/table/docs.props.d.ts +0 -3
  211. package/dist/components/table/docs.props.js +0 -94
  212. package/dist/components/tabs/docs.props.d.ts +0 -5
  213. package/dist/components/tabs/docs.props.js +0 -86
  214. package/dist/components/toolbar/docs.props.d.ts +0 -5
  215. package/dist/components/toolbar/docs.props.js +0 -68
  216. package/dist/components/tooltip/docs.props.d.ts +0 -3
  217. package/dist/components/tooltip/docs.props.js +0 -77
  218. package/dist/utils/types.json +0 -31
@@ -1,12 +1,22 @@
1
1
  <script lang="ts">
2
- import { getContext, onMount, untrack } from "svelte";
3
- import { QScrollObserver } from "../..";
4
- import { QContext } from "../../classes/QContext.svelte";
5
- import { QLayoutCtxName } from "../../utils";
6
- import type { AppbarContext } from "../layout/QLayout.svelte";
7
- import type { QLayoutProps } from "../layout/props";
2
+ import { onMount } from "svelte";
3
+ import { useRevealScrollObserver } from "../../composables";
4
+ import { headerCtx } from "../layout/QLayout.svelte";
8
5
  import type { QHeaderProps } from "./props";
9
6
 
7
+ // #region: --- Non-reactive variables
8
+ const uid = $props.id();
9
+ // #endregion: --- Non-reactive variables
10
+
11
+ // #region: --- Reactive variables
12
+ let headerEl = $state<HTMLElement>();
13
+
14
+ const headerContext = headerCtx.assertGet(
15
+ "QHeader should be used inside QLayout",
16
+ );
17
+ // #endregion: --- Reactive variables
18
+
19
+ // #region: --- Props
10
20
  let {
11
21
  elevated = false,
12
22
  inset = false,
@@ -17,41 +27,37 @@
17
27
  children,
18
28
  ...props
19
29
  }: QHeaderProps = $props();
30
+ // #endregion: --- Props
20
31
 
21
- const uid = $props.id();
22
-
23
- let headerEl = $state<HTMLElement>();
32
+ // #region: --- Derived values
33
+ const revealObserver = useRevealScrollObserver("header", uid, () => reveal);
34
+ const revealScroll = $derived(revealObserver.scroll);
24
35
 
25
- const headerContext = QContext.get<AppbarContext>(QLayoutCtxName.header);
26
- const layoutView = getContext<{ value: NonNullable<QLayoutProps["view"]> }>(
27
- QLayoutCtxName.view,
36
+ const offset = $derived(
37
+ revealScroll ? revealScroll.position - height : undefined,
28
38
  );
29
- if (!headerContext || !layoutView) {
30
- throw new Error("QHeader should be used inside QLayout");
31
- }
32
39
 
33
- const scroll = $derived(
34
- reveal
35
- ? new QScrollObserver(`.q-header--${uid} ~ .q-layout__content`)
36
- : undefined,
37
- );
38
- const offset = $derived(scroll ? scroll.position - height : undefined);
39
40
  // Collapse the header `${reavealOffset}px` below the top of layout content when scrolling down
40
41
  const collapsed = $derived(
41
- reveal && scroll?.direction === "down" && offset! - revealOffset > 0,
42
+ reveal && revealScroll?.direction === "down" && offset! - revealOffset > 0,
42
43
  );
43
44
 
44
- const leftOffset = () => layoutView.value.charAt(0) === "l";
45
- const rightOffset = () => layoutView.value.charAt(2) === "r";
45
+ const leftOffset = $derived(headerContext.view.charAt(0) === "l");
46
+
47
+ const rightOffset = $derived(headerContext.view.charAt(2) === "r");
48
+ // #endregion: --- Derived values
46
49
 
50
+ // #region: --- Effects
47
51
  $effect.pre(() => {
48
- untrack(() => headerContext).updateEntries({
52
+ headerCtx.updateEntries({
49
53
  height,
50
54
  collapsed,
51
55
  ready: true,
52
56
  });
53
57
  });
58
+ // #endregion: --- Effects
54
59
 
60
+ // #region: --- Lifecycle
55
61
  onMount(() => {
56
62
  if (headerContext) {
57
63
  setTimeout(() => {
@@ -62,16 +68,18 @@
62
68
  }
63
69
 
64
70
  return () => {
65
- if (headerContext && headerEl) {
71
+ if (headerEl) {
66
72
  headerEl.style.transition = "none";
67
- headerContext.updateEntries({
68
- height: 0,
69
- collapsed: false,
70
- ready: false,
71
- });
72
73
  }
74
+
75
+ headerCtx.updateEntries({
76
+ height: 0,
77
+ collapsed: false,
78
+ ready: false,
79
+ });
73
80
  };
74
81
  });
82
+ // #endregion: --- Lifecycle
75
83
  </script>
76
84
 
77
85
  <header
@@ -84,8 +92,8 @@
84
92
  elevated && "q-header--elevated",
85
93
  bordered && "q-header--bordered",
86
94
  collapsed && "q-header--collapsed",
87
- leftOffset() && "q-header--offset-left",
88
- rightOffset() && "q-header--offset-right",
95
+ leftOffset && "q-header--offset-left",
96
+ rightOffset && "q-header--offset-right",
89
97
  inset && "q-header--inset",
90
98
  ]}
91
99
  style:--header-height="{height}px"
@@ -1,14 +1,4 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare const __propDef: {
3
- props: Record<string, never>;
4
- events: {
5
- [evt: string]: CustomEvent<any>;
6
- };
7
- slots: {};
8
- };
9
- type QHeaderProps_ = typeof __propDef.props;
10
- export { QHeaderProps_ as QHeaderProps };
11
- export type QHeaderEvents = typeof __propDef.events;
12
- export type QHeaderSlots = typeof __propDef.slots;
13
- export default class QHeader extends SvelteComponentTyped<QHeaderProps_, QHeaderEvents, QHeaderSlots> {
14
- }
1
+ import type { QHeaderProps } from "./props";
2
+ declare const QHeader: import("svelte").Component<QHeaderProps, {}, "">;
3
+ type QHeader = ReturnType<typeof QHeader>;
4
+ export default QHeader;
@@ -1,7 +1,8 @@
1
1
  <script lang="ts">
2
- import { useSize } from "../../composables";
2
+ import { useSize, useColor } from "../../composables";
3
3
  import type { QIconProps } from "./props";
4
4
 
5
+ // #region: --- Props
5
6
  let {
6
7
  size = "md",
7
8
  name,
@@ -14,12 +15,12 @@
14
15
  children,
15
16
  ...props
16
17
  }: QIconProps = $props();
18
+ // #endregion: --- Props
17
19
 
20
+ // #region: --- Derived values
18
21
  const qSize = $derived(useSize(size, "q-icon"));
19
22
 
20
- const parsedColor = $derived(
21
- color && `var(--${color.replace("#", "")}, ${color})`,
22
- );
23
+ const parsedColor = $derived(color && useColor(color));
23
24
 
24
25
  const imgAttrs = $derived({
25
26
  alt: "Quaff Image Icon",
@@ -27,6 +28,7 @@
27
28
  });
28
29
 
29
30
  const typeClass = $derived(`q-icon--${type}`);
31
+ // #endregion: --- Derived values
30
32
  </script>
31
33
 
32
34
  <i
@@ -1,14 +1,4 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare const __propDef: {
3
- props: Record<string, never>;
4
- events: {
5
- [evt: string]: CustomEvent<any>;
6
- };
7
- slots: {};
8
- };
9
- type QIconProps_ = typeof __propDef.props;
10
- export { QIconProps_ as QIconProps };
11
- export type QIconEvents = typeof __propDef.events;
12
- export type QIconSlots = typeof __propDef.slots;
13
- export default class QIcon extends SvelteComponentTyped<QIconProps_, QIconEvents, QIconSlots> {
14
- }
1
+ import type { QIconProps } from "./props";
2
+ declare const QIcon: import("svelte").Component<QIconProps, {}, "">;
3
+ type QIcon = ReturnType<typeof QIcon>;
4
+ export default QIcon;
@@ -11,6 +11,7 @@ import QCircularProgress from "./progress/QCircularProgress.svelte";
11
11
  import QCodeBlock from "./codeBlock/QCodeBlock.svelte";
12
12
  import QDialog from "./dialog/QDialog.svelte";
13
13
  import QDrawer from "./drawer/QDrawer.svelte";
14
+ import QExpansionItem from "./expansion-item/QExpansionItem.svelte";
14
15
  import QFooter from "./footer/QFooter.svelte";
15
16
  import QHeader from "./header/QHeader.svelte";
16
17
  import QIcon from "./icon/QIcon.svelte";
@@ -21,6 +22,7 @@ import QList from "./list/QList.svelte";
21
22
  import QItem from "./list/QItem.svelte";
22
23
  import QItemSection from "./list/QItemSection.svelte";
23
24
  import QLinearProgress from "./progress/QLinearProgress.svelte";
25
+ import QMenu from "./menu/QMenu.svelte";
24
26
  import QRadio from "./radio/QRadio.svelte";
25
27
  import QRailbar from "./railbar/QRailbar.svelte";
26
28
  import QSeparator from "./separator/QSeparator.svelte";
@@ -31,4 +33,4 @@ import QSwitch from "./switch/QSwitch.svelte";
31
33
  import QToolbar from "./toolbar/QToolbar.svelte";
32
34
  import QToolbarTitle from "./toolbar/QToolbarTitle.svelte";
33
35
  import QTooltip from "./tooltip/QTooltip.svelte";
34
- export { QAvatar, QBreadcrumbs, QBreadcrumbsEl, QBtn, QCard, QCardSection, QCardActions, QCheckbox, QChip, QCircularProgress, QCodeBlock, QDialog, QDrawer, QFooter, QHeader, QIcon, QInput, QSelect, QLayout, QList, QItem, QItemSection, QLinearProgress, QRadio, QRailbar, QSeparator, QTabs, QTab, QTable, QSwitch, QToolbar, QToolbarTitle, QTooltip, };
36
+ export { QAvatar, QBreadcrumbs, QBreadcrumbsEl, QBtn, QCard, QCardSection, QCardActions, QCheckbox, QChip, QCircularProgress, QCodeBlock, QDialog, QDrawer, QExpansionItem, QFooter, QHeader, QIcon, QInput, QSelect, QLayout, QList, QItem, QItemSection, QLinearProgress, QMenu, QRadio, QRailbar, QSeparator, QTabs, QTab, QTable, QSwitch, QToolbar, QToolbarTitle, QTooltip, };
@@ -11,6 +11,7 @@ import QCircularProgress from "./progress/QCircularProgress.svelte";
11
11
  import QCodeBlock from "./codeBlock/QCodeBlock.svelte";
12
12
  import QDialog from "./dialog/QDialog.svelte";
13
13
  import QDrawer from "./drawer/QDrawer.svelte";
14
+ import QExpansionItem from "./expansion-item/QExpansionItem.svelte";
14
15
  import QFooter from "./footer/QFooter.svelte";
15
16
  import QHeader from "./header/QHeader.svelte";
16
17
  import QIcon from "./icon/QIcon.svelte";
@@ -21,6 +22,7 @@ import QList from "./list/QList.svelte";
21
22
  import QItem from "./list/QItem.svelte";
22
23
  import QItemSection from "./list/QItemSection.svelte";
23
24
  import QLinearProgress from "./progress/QLinearProgress.svelte";
25
+ import QMenu from "./menu/QMenu.svelte";
24
26
  import QRadio from "./radio/QRadio.svelte";
25
27
  import QRailbar from "./railbar/QRailbar.svelte";
26
28
  import QSeparator from "./separator/QSeparator.svelte";
@@ -31,4 +33,4 @@ import QSwitch from "./switch/QSwitch.svelte";
31
33
  import QToolbar from "./toolbar/QToolbar.svelte";
32
34
  import QToolbarTitle from "./toolbar/QToolbarTitle.svelte";
33
35
  import QTooltip from "./tooltip/QTooltip.svelte";
34
- export { QAvatar, QBreadcrumbs, QBreadcrumbsEl, QBtn, QCard, QCardSection, QCardActions, QCheckbox, QChip, QCircularProgress, QCodeBlock, QDialog, QDrawer, QFooter, QHeader, QIcon, QInput, QSelect, QLayout, QList, QItem, QItemSection, QLinearProgress, QRadio, QRailbar, QSeparator, QTabs, QTab, QTable, QSwitch, QToolbar, QToolbarTitle, QTooltip, };
36
+ export { QAvatar, QBreadcrumbs, QBreadcrumbsEl, QBtn, QCard, QCardSection, QCardActions, QCheckbox, QChip, QCircularProgress, QCodeBlock, QDialog, QDrawer, QExpansionItem, QFooter, QHeader, QIcon, QInput, QSelect, QLayout, QList, QItem, QItemSection, QLinearProgress, QMenu, QRadio, QRailbar, QSeparator, QTabs, QTab, QTable, QSwitch, QToolbar, QToolbarTitle, QTooltip, };
@@ -1,17 +1,27 @@
1
1
  <script lang="ts">
2
- import type { QEvent } from "../../utils";
2
+ import { type QEvent } from "../../utils";
3
+ import {
4
+ deleteMaskedToken,
5
+ maskCaretPosition,
6
+ maskValue,
7
+ unmaskValue,
8
+ } from "./mask";
9
+ import type { QInputProps } from "./props";
3
10
 
4
- type QInputFocusEvent = QEvent<FocusEvent, HTMLDivElement>;
11
+ type QInputFocusEvent = QEvent<FocusEvent, HTMLInputElement>;
12
+ type QInputInputEvent = QEvent<Event, HTMLInputElement>;
13
+ type QInputKeyboardEvent = QEvent<KeyboardEvent, HTMLInputElement>;
5
14
 
15
+ // #region: --- Reactive variables
6
16
  let focus = $state(false);
7
17
 
8
18
  let snippetPrependWidth = $state(0);
19
+ // #endregion: --- Reactive variables
9
20
 
10
- import type { QInputProps } from "../input/props";
11
-
21
+ // #region: --- Props
12
22
  let {
13
23
  dense = false,
14
- disable = false,
24
+ disabled = false,
15
25
  error = false,
16
26
  errorMessage = undefined,
17
27
  filled = false,
@@ -24,29 +34,136 @@
24
34
  append = undefined,
25
35
  after = undefined,
26
36
  value = $bindable(),
27
- ...props
37
+ class: userClass,
38
+ style,
39
+ onfocus,
40
+ onblur,
41
+ placeholder = "",
42
+ tabindex,
43
+ type,
44
+ mask,
45
+ fillMask,
46
+ unmaskedValue = false,
47
+ oninput,
48
+ onkeydown,
49
+ ...inputProps
28
50
  }: QInputProps = $props();
51
+ // #endregion: --- Props
52
+
53
+ // #region: --- Derived values
54
+ const displayValue = $derived(
55
+ mask ? maskValue(String(value ?? ""), mask, fillMask) : (value ?? ""),
56
+ );
57
+ const hasValue = $derived(
58
+ value !== "" && value !== undefined && value !== null,
59
+ );
60
+ const hasNativePlaceholder = $derived(
61
+ ["date", "datetime-local", "month", "time", "week"].includes(String(type)),
62
+ );
63
+ const active = $derived(
64
+ hasValue ||
65
+ focus ||
66
+ !!placeholder ||
67
+ hasNativePlaceholder ||
68
+ (!!mask && fillMask !== undefined),
69
+ );
70
+ const inputType = $derived(mask ? (type ?? "text") : type);
71
+ // #endregion: --- Derived values
72
+
73
+ // #region: --- Functions
74
+ function setCaret(input: HTMLInputElement, position: number) {
75
+ try {
76
+ input.setSelectionRange(position, position);
77
+ } catch {
78
+ // Some native input types do not support text selection.
79
+ }
80
+ }
81
+
82
+ function onInput(e: QInputInputEvent) {
83
+ const input = e.currentTarget;
84
+
85
+ if (!mask) {
86
+ if (type === "number" || type === "range") {
87
+ value = Number.isNaN(input.valueAsNumber) ? "" : input.valueAsNumber;
88
+ } else {
89
+ value = input.value;
90
+ }
91
+ oninput?.(e);
92
+ return;
93
+ }
94
+
95
+ const cursor = input.selectionStart ?? input.value.length;
96
+ const previousDisplayLength = String(displayValue).length;
97
+ const masked = maskValue(input.value, mask, fillMask);
98
+ const unmasked = unmaskValue(masked, mask, fillMask);
99
+ const tokenCount =
100
+ fillMask !== undefined &&
101
+ fillMask !== false &&
102
+ cursor > previousDisplayLength
103
+ ? unmasked.length
104
+ : unmaskValue(input.value.slice(0, cursor), mask, fillMask).length;
105
+ const nextCaret = maskCaretPosition(tokenCount, mask, masked.length);
29
106
 
30
- const active = $derived(value || focus);
107
+ input.value = masked;
108
+ value = unmaskedValue ? unmasked : masked;
109
+ setCaret(input, nextCaret);
110
+ queueMicrotask(() => setCaret(input, nextCaret));
111
+ oninput?.(e);
112
+ }
113
+
114
+ function onKeydown(e: QInputKeyboardEvent) {
115
+ onkeydown?.(e);
116
+ if (
117
+ e.defaultPrevented ||
118
+ !mask ||
119
+ (e.key !== "Backspace" && e.key !== "Delete")
120
+ ) {
121
+ return;
122
+ }
123
+
124
+ const input = e.currentTarget;
125
+ const start = input.selectionStart;
126
+ const end = input.selectionEnd;
127
+ if (start === null || end === null || start !== end) {
128
+ return;
129
+ }
130
+
131
+ const next = deleteMaskedToken(
132
+ input.value,
133
+ mask,
134
+ start,
135
+ e.key === "Backspace" ? "backward" : "forward",
136
+ fillMask,
137
+ );
138
+ if (!next) {
139
+ return;
140
+ }
141
+
142
+ e.preventDefault();
143
+ input.value = next.masked;
144
+ value = next[unmaskedValue ? "unmasked" : "masked"];
145
+ setCaret(input, next.caret);
146
+ queueMicrotask(() => setCaret(input, next.caret));
147
+ }
31
148
 
32
149
  function onFocus(e: QInputFocusEvent) {
33
150
  focus = true;
34
- props.onfocus?.(e);
151
+ onfocus?.(e);
35
152
  }
36
153
 
37
154
  function onBlur(e: QInputFocusEvent) {
38
155
  focus = false;
39
- props.onblur?.(e);
156
+ onblur?.(e);
40
157
  }
158
+ // #endregion: --- Functions
41
159
 
42
160
  // q-field here, q-input in classes
43
161
  </script>
44
162
 
45
163
  <div
46
- {...props}
47
164
  class={[
48
165
  "q-field",
49
- props.class,
166
+ userClass,
50
167
  "q-input",
51
168
  !outlined && !rounded && !filled && "q-field--default",
52
169
  outlined && "q-field--outlined",
@@ -59,11 +176,12 @@
59
176
  label && "q-field--label",
60
177
  !!append && "q-field--snippet-append",
61
178
  !!prepend && "q-field--snippet-prepend",
62
- disable && "q-field--disable",
179
+ disabled && "q-field--disabled",
63
180
  error && "q-field--error",
64
181
  ]}
182
+ {style}
65
183
  style:--snippet-prepend-width="{snippetPrependWidth}px"
66
- aria-disabled={disable || undefined}
184
+ aria-disabled={disabled || undefined}
67
185
  data-quaff
68
186
  >
69
187
  {#if before}
@@ -83,13 +201,17 @@
83
201
  </div>
84
202
  {/if}
85
203
  <input
204
+ {...inputProps}
86
205
  class="q-field__input"
87
- bind:value
88
- placeholder=""
206
+ value={displayValue}
207
+ {placeholder}
208
+ type={inputType}
209
+ oninput={onInput}
210
+ onkeydown={onKeydown}
89
211
  onfocus={onFocus}
90
212
  onblur={onBlur}
91
- disabled={disable}
92
- tabindex={disable === true ? -1 : 0}
213
+ {disabled}
214
+ tabindex={disabled === true ? -1 : (tabindex ?? 0)}
93
215
  />
94
216
  <span class="q-field__label">{label}</span>
95
217
 
@@ -1,14 +1,4 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare const __propDef: {
3
- props: Record<string, never>;
4
- events: {
5
- [evt: string]: CustomEvent<any>;
6
- };
7
- slots: {};
8
- };
9
- type QInputProps_ = typeof __propDef.props;
10
- export { QInputProps_ as QInputProps };
11
- export type QInputEvents = typeof __propDef.events;
12
- export type QInputSlots = typeof __propDef.slots;
13
- export default class QInput extends SvelteComponentTyped<QInputProps_, QInputEvents, QInputSlots> {
14
- }
1
+ import type { QInputProps } from "./props";
2
+ declare const QInput: import("svelte").Component<QInputProps, {}, "value">;
3
+ type QInput = ReturnType<typeof QInput>;
4
+ export default QInput;
@@ -9,8 +9,8 @@ export const QInputDocs = {
9
9
  events: [
10
10
  {
11
11
  name: "input",
12
- type: "(value: string) => void",
13
- description: "Emitted when the user types in the input component.",
12
+ type: "InputEvent",
13
+ description: "Native input event from the inner input element.",
14
14
  },
15
15
  ],
16
16
  },
@@ -0,0 +1,10 @@
1
+ export type QInputFillMask = boolean | string;
2
+ export type QMaskDeleteDirection = "backward" | "forward";
3
+ export declare function unmaskValue(value: string, mask: string, fillMask?: QInputFillMask): string;
4
+ export declare function maskValue(value: string, mask: string, fillMask?: QInputFillMask): string;
5
+ export declare function maskCaretPosition(tokenCount: number, mask: string, displayLength: number): number;
6
+ export declare function deleteMaskedToken(value: string, mask: string, caret: number, direction: QMaskDeleteDirection, fillMask?: QInputFillMask): {
7
+ masked: string;
8
+ unmasked: string;
9
+ caret: number;
10
+ } | null;