noph-ui 0.44.0 → 0.45.1

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 (136) hide show
  1. package/README.md +10 -1
  2. package/dist/animation.d.ts +2 -0
  3. package/dist/animation.js +33 -0
  4. package/dist/app-bar/AppBar.svelte +230 -0
  5. package/dist/app-bar/AppBar.svelte.d.ts +4 -0
  6. package/dist/app-bar/index.d.ts +1 -0
  7. package/dist/app-bar/index.js +1 -0
  8. package/dist/app-bar/types.d.ts +13 -0
  9. package/dist/app-bar/types.js +1 -0
  10. package/dist/autocomplete/AutoComplete.svelte +10 -11
  11. package/dist/autocomplete/AutoComplete.svelte.d.ts +1 -1
  12. package/dist/autocomplete/types.d.ts +1 -1
  13. package/dist/badge/Badge.svelte +6 -1
  14. package/dist/badge/types.d.ts +0 -1
  15. package/dist/button/Button.svelte +5 -15
  16. package/dist/button/IconButton.svelte +5 -15
  17. package/dist/button/SegmentedButton.svelte +15 -1
  18. package/dist/button/SplitButton.svelte +75 -0
  19. package/dist/button/SplitButton.svelte.d.ts +4 -0
  20. package/dist/button/index.d.ts +1 -0
  21. package/dist/button/index.js +1 -0
  22. package/dist/button/types.d.ts +17 -4
  23. package/dist/card/types.d.ts +1 -1
  24. package/dist/checkbox/Checkbox.svelte +47 -58
  25. package/dist/chip/AssistChip.svelte +5 -5
  26. package/dist/chip/ChipSet.svelte +3 -11
  27. package/dist/chip/FilterChip.svelte +33 -27
  28. package/dist/chip/InputChip.svelte +13 -2
  29. package/dist/chip/SuggestionChip.svelte +29 -0
  30. package/dist/chip/SuggestionChip.svelte.d.ts +4 -0
  31. package/dist/chip/index.d.ts +1 -0
  32. package/dist/chip/index.js +1 -0
  33. package/dist/chip/types.d.ts +16 -9
  34. package/dist/date-picker/Calendar.svelte +1 -1
  35. package/dist/date-picker/DatePickerDialog.svelte +23 -11
  36. package/dist/date-picker/DatePickerDialog.svelte.d.ts +4 -1
  37. package/dist/date-picker/DateRangePicker.svelte +40 -10
  38. package/dist/date-picker/DateRangePicker.svelte.d.ts +4 -1
  39. package/dist/date-picker/DockedDatePicker.svelte +13 -10
  40. package/dist/date-picker/DockedDatePicker.svelte.d.ts +4 -1
  41. package/dist/date-picker/DockedDateTimePicker.svelte +13 -7
  42. package/dist/date-picker/DockedDateTimePicker.svelte.d.ts +4 -1
  43. package/dist/date-picker/SelectionList.svelte +6 -32
  44. package/dist/date-picker/SelectionList.svelte.d.ts +2 -12
  45. package/dist/date-picker/TimeColumn.svelte +4 -29
  46. package/dist/date-picker/exitVisibility.svelte.d.ts +5 -0
  47. package/dist/date-picker/exitVisibility.svelte.js +23 -0
  48. package/dist/date-picker/optionList.d.ts +4 -0
  49. package/dist/date-picker/optionList.js +31 -0
  50. package/dist/date-picker/types.d.ts +11 -4
  51. package/dist/dialog/Dialog.svelte +55 -68
  52. package/dist/dialog/Dialog.svelte.d.ts +3 -3
  53. package/dist/dialog/types.d.ts +4 -3
  54. package/dist/fab/ExtendedFab.svelte +255 -0
  55. package/dist/fab/ExtendedFab.svelte.d.ts +5 -0
  56. package/dist/fab/Fab.svelte +211 -0
  57. package/dist/fab/Fab.svelte.d.ts +5 -0
  58. package/dist/fab/FabMenu.svelte +207 -0
  59. package/dist/fab/FabMenu.svelte.d.ts +7 -0
  60. package/dist/fab/index.d.ts +3 -0
  61. package/dist/fab/index.js +3 -0
  62. package/dist/fab/types.d.ts +34 -0
  63. package/dist/fab/types.js +1 -0
  64. package/dist/icons/ArrowBackIcon.svelte +13 -0
  65. package/dist/icons/ArrowBackIcon.svelte.d.ts +7 -0
  66. package/dist/icons/ChevronDownIcon.svelte +3 -0
  67. package/dist/icons/ChevronDownIcon.svelte.d.ts +26 -0
  68. package/dist/icons/SearchIcon.svelte +15 -0
  69. package/dist/icons/SearchIcon.svelte.d.ts +7 -0
  70. package/dist/icons/index.d.ts +3 -0
  71. package/dist/icons/index.js +3 -0
  72. package/dist/index.d.ts +6 -0
  73. package/dist/index.js +6 -0
  74. package/dist/internal/focus-ring.css +12 -0
  75. package/dist/loading-indicator/shapes.js +0 -7
  76. package/dist/menu/Menu.svelte +12 -7
  77. package/dist/menu/Menu.svelte.d.ts +2 -2
  78. package/dist/menu/types.d.ts +0 -2
  79. package/dist/navigation-bar/NavigationBar.svelte +59 -0
  80. package/dist/navigation-bar/NavigationBar.svelte.d.ts +4 -0
  81. package/dist/navigation-bar/NavigationBarItem.svelte +239 -0
  82. package/dist/navigation-bar/NavigationBarItem.svelte.d.ts +5 -0
  83. package/dist/navigation-bar/index.d.ts +2 -0
  84. package/dist/navigation-bar/index.js +2 -0
  85. package/dist/navigation-bar/types.d.ts +19 -0
  86. package/dist/navigation-bar/types.js +1 -0
  87. package/dist/navigation-drawer/NavigationDrawer.svelte +107 -76
  88. package/dist/navigation-drawer/NavigationDrawer.svelte.d.ts +4 -1
  89. package/dist/navigation-drawer/NavigationDrawerItem.svelte +10 -3
  90. package/dist/navigation-drawer/types.d.ts +3 -1
  91. package/dist/navigation-rail/NavigationRailItem.svelte +16 -0
  92. package/dist/navigation-rail/types.d.ts +3 -0
  93. package/dist/popover.svelte.d.ts +5 -0
  94. package/dist/popover.svelte.js +22 -0
  95. package/dist/press.svelte.d.ts +6 -0
  96. package/dist/press.svelte.js +32 -0
  97. package/dist/radio/Radio.svelte +26 -7
  98. package/dist/radio/types.d.ts +3 -0
  99. package/dist/search/Search.svelte +391 -0
  100. package/dist/search/Search.svelte.d.ts +5 -0
  101. package/dist/search/index.d.ts +1 -0
  102. package/dist/search/index.js +1 -0
  103. package/dist/search/types.d.ts +19 -0
  104. package/dist/search/types.js +1 -0
  105. package/dist/select/Select.svelte +48 -87
  106. package/dist/sheet/Sheet.svelte +235 -0
  107. package/dist/sheet/Sheet.svelte.d.ts +7 -0
  108. package/dist/sheet/index.d.ts +1 -0
  109. package/dist/sheet/index.js +1 -0
  110. package/dist/sheet/types.d.ts +11 -0
  111. package/dist/sheet/types.js +1 -0
  112. package/dist/slider/Slider.svelte +118 -30
  113. package/dist/slider/types.d.ts +3 -0
  114. package/dist/snackbar/Snackbar.svelte +32 -35
  115. package/dist/snackbar/Snackbar.svelte.d.ts +2 -2
  116. package/dist/snackbar/types.d.ts +3 -2
  117. package/dist/switch/Switch.svelte +51 -20
  118. package/dist/switch/types.d.ts +3 -0
  119. package/dist/tabs/Tab.svelte +4 -12
  120. package/dist/tabs/Tabs.svelte +5 -5
  121. package/dist/text-field/TextField.svelte +2 -4
  122. package/dist/toolbar/Toolbar.svelte +121 -0
  123. package/dist/toolbar/Toolbar.svelte.d.ts +4 -0
  124. package/dist/toolbar/index.d.ts +1 -0
  125. package/dist/toolbar/index.js +1 -0
  126. package/dist/toolbar/types.d.ts +8 -0
  127. package/dist/toolbar/types.js +1 -0
  128. package/dist/tooltip/RichTooltip.svelte +18 -12
  129. package/dist/tooltip/RichTooltip.svelte.d.ts +2 -2
  130. package/dist/tooltip/Tooltip.svelte +22 -11
  131. package/dist/tooltip/Tooltip.svelte.d.ts +4 -1
  132. package/dist/types.d.ts +6 -0
  133. package/dist/types.js +6 -0
  134. package/package.json +13 -13
  135. package/dist/date-picker/enterAnimation.d.ts +0 -1
  136. package/dist/date-picker/enterAnimation.js +0 -10
@@ -0,0 +1,207 @@
1
+ <script lang="ts">
2
+ import CloseIcon from '../icons/CloseIcon.svelte'
3
+ import { arrowKeyNav, rovingTabindex } from '../keyboard-nav.js'
4
+ import { popoverController, syncOpenEffect } from '../popover.svelte.js'
5
+ import { PRESS_DURATION } from '../press.svelte.js'
6
+ import { onMount } from 'svelte'
7
+ import { MediaQuery } from 'svelte/reactivity'
8
+ import Fab from './Fab.svelte'
9
+ import type { FabMenuProps } from './types.js'
10
+
11
+ let {
12
+ label = 'Actions',
13
+ icon,
14
+ closeIcon,
15
+ children,
16
+ variant = 'primary-container',
17
+ size = 's',
18
+ placement = 'block-start',
19
+ closeOnSelect = true,
20
+ open = $bindable(false),
21
+ element = $bindable(),
22
+ ...attributes
23
+ }: FabMenuProps = $props()
24
+
25
+ const uid = $props.id()
26
+ const menuId = `np-fab-menu-${uid}`
27
+ const anchorName = `--np-fab-menu-${uid}`
28
+
29
+ let menuElement: HTMLDivElement | undefined = $state()
30
+ const reducedMotion = new MediaQuery('(prefers-reduced-motion: reduce)', false)
31
+
32
+ const ITEMS = 'button, a[href], [role="menuitem"]'
33
+ const attach = rovingTabindex(ITEMS)
34
+ const arrowHandler = $derived(
35
+ arrowKeyNav(ITEMS, placement.startsWith('inline') ? 'horizontal' : 'vertical'),
36
+ )
37
+
38
+ const controller = popoverController(() => menuElement)
39
+
40
+ export const show = () => controller.show()
41
+
42
+ export const close = () => {
43
+ clearTimeout(closeTimeout)
44
+ controller.close()
45
+ }
46
+
47
+ let closeTimeout: ReturnType<typeof setTimeout>
48
+
49
+ const closeAfterPress = () => {
50
+ if (reducedMotion.current) {
51
+ close()
52
+ return
53
+ }
54
+ clearTimeout(closeTimeout)
55
+ closeTimeout = setTimeout(close, PRESS_DURATION)
56
+ }
57
+
58
+ onMount(() => {
59
+ return () => {
60
+ clearTimeout(closeTimeout)
61
+ }
62
+ })
63
+
64
+ syncOpenEffect(
65
+ () => menuElement,
66
+ () => open,
67
+ show,
68
+ close,
69
+ )
70
+ </script>
71
+
72
+ {#snippet triggerIcon()}
73
+ <span class="np-fab-menu-icons" aria-hidden="true">
74
+ <span class="np-fab-menu-icon" class:np-fab-menu-icon-away={open}>
75
+ {#if icon}{@render icon()}{/if}
76
+ </span>
77
+ <span class="np-fab-menu-icon" class:np-fab-menu-icon-away={!open}>
78
+ {#if closeIcon}{@render closeIcon()}{:else}<CloseIcon />{/if}
79
+ </span>
80
+ </span>
81
+ {/snippet}
82
+
83
+ <div
84
+ {...attributes}
85
+ bind:this={element}
86
+ style="anchor-name: {anchorName}; {attributes.style ?? ''}"
87
+ class={['np-fab-menu', `np-fab-menu-${placement}`, attributes.class]}
88
+ >
89
+ <Fab
90
+ {variant}
91
+ {size}
92
+ {label}
93
+ shape={open ? 'square' : 'round'}
94
+ command="toggle-popover"
95
+ commandfor={menuId}
96
+ aria-haspopup="menu"
97
+ aria-expanded={open}
98
+ class="np-fab-menu-trigger"
99
+ icon={triggerIcon}
100
+ />
101
+
102
+ <div
103
+ bind:this={menuElement}
104
+ id={menuId}
105
+ style="position-anchor: {anchorName}"
106
+ popover="auto"
107
+ role="menu"
108
+ tabindex="-1"
109
+ aria-label={label}
110
+ class="np-fab-menu-list"
111
+ {@attach attach}
112
+ onkeydown={arrowHandler}
113
+ onclick={(event) => {
114
+ if (!closeOnSelect) return
115
+ const target = event.target as HTMLElement
116
+ if (target.closest(ITEMS)) closeAfterPress()
117
+ }}
118
+ ontoggle={(event) => {
119
+ open = event.newState === 'open'
120
+ }}
121
+ >
122
+ {@render children?.()}
123
+ </div>
124
+ </div>
125
+
126
+ <style>
127
+ .np-fab-menu {
128
+ position: relative;
129
+ display: inline-flex;
130
+ }
131
+
132
+ .np-fab-menu-icons {
133
+ display: grid;
134
+ }
135
+ .np-fab-menu-icon {
136
+ grid-area: 1 / 1;
137
+ display: flex;
138
+ }
139
+ .np-fab-menu-icon-away {
140
+ opacity: 0;
141
+ }
142
+
143
+ @media (prefers-reduced-motion: no-preference) {
144
+ .np-fab-menu-icon {
145
+ transition:
146
+ opacity var(--np-motion-expressive-fast-effects),
147
+ rotate var(--np-motion-expressive-default-spatial);
148
+ }
149
+ .np-fab-menu-icon-away {
150
+ rotate: -45deg;
151
+ }
152
+ }
153
+
154
+ .np-fab-menu-list {
155
+ position: absolute;
156
+ margin: 0;
157
+ padding: 0;
158
+ border: none;
159
+ background: none;
160
+ flex-direction: column;
161
+ align-items: flex-end;
162
+ gap: 0.5rem;
163
+ overflow: visible;
164
+ }
165
+
166
+ .np-fab-menu-list:popover-open {
167
+ display: flex;
168
+ }
169
+
170
+ .np-fab-menu-block-start .np-fab-menu-list {
171
+ position-area: block-start;
172
+ margin-block-end: 0.75rem;
173
+ flex-direction: column-reverse;
174
+ }
175
+ .np-fab-menu-block-end .np-fab-menu-list {
176
+ position-area: block-end;
177
+ margin-block-start: 0.75rem;
178
+ }
179
+ .np-fab-menu-inline-start .np-fab-menu-list {
180
+ position-area: inline-start;
181
+ margin-inline-end: 0.75rem;
182
+ flex-direction: row-reverse;
183
+ align-items: center;
184
+ }
185
+ .np-fab-menu-inline-end .np-fab-menu-list {
186
+ position-area: inline-end;
187
+ margin-inline-start: 0.75rem;
188
+ flex-direction: row;
189
+ align-items: center;
190
+ }
191
+
192
+ @media (prefers-reduced-motion: no-preference) {
193
+ .np-fab-menu-list:popover-open > :global(*) {
194
+ --_stagger-window: 210ms;
195
+ --_delay: calc((sibling-index() - 1) / sibling-count() * var(--_stagger-window));
196
+ animation: np-fab-menu-item-in var(--np-motion-expressive-default-spatial) both;
197
+ animation-delay: var(--_delay);
198
+ }
199
+ }
200
+
201
+ @keyframes np-fab-menu-item-in {
202
+ from {
203
+ opacity: 0;
204
+ translate: 0 0.5rem;
205
+ }
206
+ }
207
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { FabMenuProps } from './types.ts';
2
+ declare const FabMenu: import("svelte").Component<FabMenuProps, {
3
+ show: () => void;
4
+ close: () => void;
5
+ }, "element" | "open">;
6
+ type FabMenu = ReturnType<typeof FabMenu>;
7
+ export default FabMenu;
@@ -0,0 +1,3 @@
1
+ export { default as ExtendedFab } from './ExtendedFab.svelte';
2
+ export { default as Fab } from './Fab.svelte';
3
+ export { default as FabMenu } from './FabMenu.svelte';
@@ -0,0 +1,3 @@
1
+ export { default as ExtendedFab } from './ExtendedFab.svelte';
2
+ export { default as Fab } from './Fab.svelte';
3
+ export { default as FabMenu } from './FabMenu.svelte';
@@ -0,0 +1,34 @@
1
+ import type { ButtonElement } from '../button/types.js';
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLAnchorAttributes, HTMLAttributes, HTMLButtonAttributes } from 'svelte/elements';
4
+ export type FabElement = ButtonElement;
5
+ interface BaseFabProps extends HTMLAttributes<FabElement>, Omit<HTMLButtonAttributes, keyof HTMLAttributes<HTMLButtonElement> | 'type'>, Omit<HTMLAnchorAttributes, keyof HTMLAttributes<HTMLAnchorElement> | 'type'> {
6
+ element?: FabElement;
7
+ variant?: 'primary' | 'secondary' | 'tertiary' | 'primary-container' | 'secondary-container' | 'tertiary-container';
8
+ size?: 's' | 'm' | 'l';
9
+ shape?: 'round' | 'square';
10
+ lowered?: boolean;
11
+ disabled?: boolean | null;
12
+ type?: 'submit' | 'reset' | 'button' | (string & {}) | null;
13
+ }
14
+ export interface FabProps extends BaseFabProps {
15
+ icon?: Snippet;
16
+ label?: string;
17
+ }
18
+ export interface ExtendedFabProps extends BaseFabProps {
19
+ icon?: Snippet;
20
+ label?: string;
21
+ collapsed?: boolean;
22
+ }
23
+ export interface FabMenuProps extends HTMLAttributes<HTMLDivElement> {
24
+ label?: string;
25
+ icon?: Snippet;
26
+ closeIcon?: Snippet;
27
+ variant?: FabProps['variant'];
28
+ size?: FabProps['size'];
29
+ placement?: 'block-start' | 'block-end' | 'inline-start' | 'inline-end';
30
+ open?: boolean;
31
+ closeOnSelect?: boolean;
32
+ element?: HTMLDivElement;
33
+ }
34
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ <script lang="ts">
2
+ let {
3
+ height = 24,
4
+ width = 24,
5
+ }: {
6
+ height?: number
7
+ width?: number
8
+ } = $props()
9
+ </script>
10
+
11
+ <svg xmlns="http://www.w3.org/2000/svg" {height} viewBox="0 -960 960 960" {width}
12
+ ><path d="m313-440 224 224-57 56-320-320 320-320 57 56-224 224h487v80H313Z" /></svg
13
+ >
@@ -0,0 +1,7 @@
1
+ type $$ComponentProps = {
2
+ height?: number;
3
+ width?: number;
4
+ };
5
+ declare const ArrowBackIcon: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type ArrowBackIcon = ReturnType<typeof ArrowBackIcon>;
7
+ export default ArrowBackIcon;
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"
2
+ ><path d="M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z" /></svg
3
+ >
@@ -0,0 +1,26 @@
1
+ export default ChevronDownIcon;
2
+ type ChevronDownIcon = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const ChevronDownIcon: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -0,0 +1,15 @@
1
+ <script lang="ts">
2
+ let {
3
+ height = 24,
4
+ width = 24,
5
+ }: {
6
+ height?: number
7
+ width?: number
8
+ } = $props()
9
+ </script>
10
+
11
+ <svg xmlns="http://www.w3.org/2000/svg" {height} viewBox="0 -960 960 960" {width}
12
+ ><path
13
+ d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"
14
+ /></svg
15
+ >
@@ -0,0 +1,7 @@
1
+ type $$ComponentProps = {
2
+ height?: number;
3
+ width?: number;
4
+ };
5
+ declare const SearchIcon: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type SearchIcon = ReturnType<typeof SearchIcon>;
7
+ export default SearchIcon;
@@ -1,8 +1,11 @@
1
+ export { default as ArrowBackIcon } from './ArrowBackIcon.svelte';
1
2
  export { default as ArrowDropDownIcon } from './ArrowDropDownIcon.svelte';
2
3
  export { default as CalendarToday } from './CalendarToday.svelte';
3
4
  export { default as CheckIcon } from './CheckIcon.svelte';
5
+ export { default as ChevronDownIcon } from './ChevronDownIcon.svelte';
4
6
  export { default as ChevronLeftIcon } from './ChevronLeftIcon.svelte';
5
7
  export { default as ChevronRightIcon } from './ChevronRightIcon.svelte';
6
8
  export { default as CloseIcon } from './CloseIcon.svelte';
7
9
  export { default as EditCalendarIcon } from './EditCalendarIcon.svelte';
8
10
  export { default as Icon } from './Icon.svelte';
11
+ export { default as SearchIcon } from './SearchIcon.svelte';
@@ -1,8 +1,11 @@
1
+ export { default as ArrowBackIcon } from './ArrowBackIcon.svelte';
1
2
  export { default as ArrowDropDownIcon } from './ArrowDropDownIcon.svelte';
2
3
  export { default as CalendarToday } from './CalendarToday.svelte';
3
4
  export { default as CheckIcon } from './CheckIcon.svelte';
5
+ export { default as ChevronDownIcon } from './ChevronDownIcon.svelte';
4
6
  export { default as ChevronLeftIcon } from './ChevronLeftIcon.svelte';
5
7
  export { default as ChevronRightIcon } from './ChevronRightIcon.svelte';
6
8
  export { default as CloseIcon } from './CloseIcon.svelte';
7
9
  export { default as EditCalendarIcon } from './EditCalendarIcon.svelte';
8
10
  export { default as Icon } from './Icon.svelte';
11
+ export { default as SearchIcon } from './SearchIcon.svelte';
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './app-bar/index.js';
1
2
  export * from './autocomplete/index.js';
2
3
  export * from './badge/index.js';
3
4
  export * from './button/index.js';
@@ -7,18 +8,23 @@ export * from './chip/index.js';
7
8
  export * from './date-picker/index.js';
8
9
  export * from './dialog/index.js';
9
10
  export * from './divider/index.js';
11
+ export * from './fab/index.js';
10
12
  export * from './list/index.js';
11
13
  export * from './loading-indicator/index.js';
12
14
  export * from './menu/index.js';
15
+ export * from './navigation-bar/index.js';
13
16
  export * from './navigation-drawer/index.js';
14
17
  export * from './navigation-rail/index.js';
15
18
  export * from './progress/index.js';
16
19
  export * from './radio/index.js';
17
20
  export * from './ripple/index.js';
21
+ export * from './search/index.js';
18
22
  export * from './select/index.js';
23
+ export * from './sheet/index.js';
19
24
  export * from './slider/index.js';
20
25
  export * from './snackbar/index.js';
21
26
  export * from './switch/index.js';
22
27
  export * from './tabs/index.js';
23
28
  export * from './text-field/index.js';
29
+ export * from './toolbar/index.js';
24
30
  export * from './tooltip/index.js';
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './app-bar/index.js';
1
2
  export * from './autocomplete/index.js';
2
3
  export * from './badge/index.js';
3
4
  export * from './button/index.js';
@@ -7,18 +8,23 @@ export * from './chip/index.js';
7
8
  export * from './date-picker/index.js';
8
9
  export * from './dialog/index.js';
9
10
  export * from './divider/index.js';
11
+ export * from './fab/index.js';
10
12
  export * from './list/index.js';
11
13
  export * from './loading-indicator/index.js';
12
14
  export * from './menu/index.js';
15
+ export * from './navigation-bar/index.js';
13
16
  export * from './navigation-drawer/index.js';
14
17
  export * from './navigation-rail/index.js';
15
18
  export * from './progress/index.js';
16
19
  export * from './radio/index.js';
17
20
  export * from './ripple/index.js';
21
+ export * from './search/index.js';
18
22
  export * from './select/index.js';
23
+ export * from './sheet/index.js';
19
24
  export * from './slider/index.js';
20
25
  export * from './snackbar/index.js';
21
26
  export * from './switch/index.js';
22
27
  export * from './tabs/index.js';
23
28
  export * from './text-field/index.js';
29
+ export * from './toolbar/index.js';
24
30
  export * from './tooltip/index.js';
@@ -24,3 +24,15 @@
24
24
  outline-width: 3px;
25
25
  }
26
26
  }
27
+
28
+ .np-focus-ring:focus-visible {
29
+ outline-style: solid;
30
+ outline-color: var(--np-color-secondary);
31
+ outline-width: 3px;
32
+ outline-offset: 2px;
33
+ }
34
+ @media (prefers-reduced-motion: no-preference) {
35
+ .np-focus-ring:focus-visible {
36
+ animation: focusAnimation var(--np-motion-expressive-slow-effects) forwards;
37
+ }
38
+ }
@@ -7,19 +7,12 @@ const decode = (encoded) => {
7
7
  return radii;
8
8
  };
9
9
  export const SHAPES = [
10
- // MaterialShapes.SoftBurst
11
10
  '2zl30r3533bb3ik3pq3se3s33oh3gs39u33v30a2zn31b3693co3k53qk3sk3ro3n53fb38k32t2zz2zr32037h3e23ls3r83sm3r43lj3dv37c31y2zr30032w38p3fi3ne3rq3sj3qf3jw3ch3653192zm30b33y39z3h03oo3s53sd3pk3ib3b534z30q2zl30r3533bb3ik3pq3se3s33oh3gs39u33v30a2zn31b3693co3k53qk3sk3ro3n53fb38k32t2zz2zr32037h3e23ls3r83sm3r43lj3dv37c31y2zr30032w38p3fi3ne3rq3sj3qf3jw3ch3653192zm30b33y39z3h03oo3s53sd3pk3ib3b534z30q',
12
- // MaterialShapes.Cookie9Sided
13
11
  '3ne3kp3hr3g53fr3gl3iq3m33ot3qq3rw3sa3rz3qx3p33mg3jc3hi3gz3hn3jn3my3pp3rn3st3t73sv3rs3pw3n73jz3i23hg3i23jz3n73pw3rs3sv3t73st3rn3pp3my3jn3hn3gz3hi3jc3mg3p33qx3rz3sa3rw3qq3ot3m33iq3gl3fr3g53hr3kp3ne3pb3qg3qw3qm3pm3nv3lc3i13fk3eg3ei3fr3ie3lc3nh3ov3pk3pk3ou3ne3l83i93fb3dr3df3e83gb3jh3lz3nr3os3p53os3nr3lz3jh3gb3e83df3dr3fb3i93l83ne3ou3pk3pk3ov3nh3lc3ie3fr3ei3eg3fk3i13lc3nv3pm3qm3qw3qg3pb',
14
- // MaterialShapes.Pentagon
15
12
  '3ng3lh3jw3im3ho3h23gq3gq3h03hl3ih3jp3l93n63ph3s73vc3y23zz41241e40z3zr3xr3uz3se3q73od3mx3lt3l13kk3kf3kk3l13lt3mx3od3q73se3uz3xr3zr40z41e4123zz3y23vc3s73ph3n63l93jp3ih3hl3h03gq3gq3h23ho3im3jw3lh3ng3pp3rf3se3sp3sb3r93pg3mx3jm3gc3dh3b138z37935u34r33x33e33533533f33y34s35w37b3913b43df3f93gk3hb3hl3hb3gk3f93df3b439137b35w34s33y33f33533533e33x34r35u37938z3b13dh3gc3jm3mx3pg3r93sb3sp3se3rf3pp',
16
- // MaterialShapes.Pill
17
13
  '3t53rz3qr3pj3o93mz3lo3kd3j13hp3gd3f13dq3cp3by3bj3be3bj3by3cp3dq3f13gd3hp3j13kd3lo3mz3o93pj3qr3rz3t53ua3vd3wc3wu3xm3yg3z83zx40k41341j41x42842f42k42l42k42f42841x41j41340k3zx3z83yg3xm3wu3wc3vd3ua3t53rz3qr3pj3o93mz3lo3kd3j13hp3gd3f13dq3cp3by3bj3be3bj3by3cp3dq3f13gd3hp3j13kd3lo3mz3o93pj3qr3rz3t53ua3vd3wc3wu3xm3yg3z83zx40k41341j41x42842f42k42l42k42f42841x41j41340k3zx3z83yg3xm3wu3wc3vd3ua',
18
- // MaterialShapes.Sunny
19
14
  '3t63sa3pe3l73hi3ea3bj3973893973bj3ea3hi3l73pe3sa3t63sa3pe3l73hi3ea3bj3973893973bj3ea3hi3l73pe3sa3t63sa3pe3l73hi3ea3bj3973893973bj3ea3hi3l73pe3sa3t63sa3pe3l73hi3ea3bj3973893973bj3ea3hi3l73pe3sa3t63sa3pe3l73hi3ea3bj3973893973bj3ea3hi3l73pe3sa3t63sa3pe3l73hi3ea3bj3973893973bj3ea3hi3l73pe3sa3t63sa3pe3l73hi3ea3bj3973893973bj3ea3hi3l73pe3sa3t63sa3pe3l73hi3ea3bj3973893973bj3ea3hi3l73pe3sa',
20
- // MaterialShapes.Cookie4Sided
21
15
  '2yr2z530a32b35g39l3ea3iv3mz3qk3tm3w53y73zr40v41j41r41i40u3zr3y63w43tk3qi3mw3it3e739j35f32a3092z42yr2z530a32b35g39l3ea3iv3mz3qk3tm3w53y73zr40v41j41r41i40u3zr3y63w43tk3qi3mw3it3e739j35f32a3092z42yr2z530a32b35g39l3ea3iv3mz3qk3tm3w53y73zr40v41j41r41i40u3zr3y63w43tk3qi3mw3it3e739j35f32a3092z42yr2z530a32b35g39l3ea3iv3mz3qk3tm3w53y73zr40v41j41r41i40u3zr3y63w43tk3qi3mw3it3e739j35f32a3092z4',
22
- // MaterialShapes.Oval
23
16
  '3ec3bw39m37i35k33s32630q2zg2yb2xc2wj2vv2vd2uz2ur2up2ur2uz2vd2vv2wj2xc2yb2zg30q32633s35k37i39m3bw3ec3gx3jn3mi3ph3sj3vn3yr41t44r47j4a14c84e14fd4g64gg4g64fd4e14c84a147j44r41t3yr3vn3sj3ph3mi3jn3gx3ec3bw39m37i35k33s32630q2zg2yb2xc2wj2vv2vd2uz2ur2up2ur2uz2vd2vv2wj2xc2yb2zg30q32633s35k37i39m3bw3ec3gx3jn3mi3ph3sj3vn3yr41t44r47j4a14c84e14fd4g64gg4g64fd4e14c84a147j44r41t3yr3vn3sj3ph3mi3jn3gx',
24
17
  ].map(decode);
25
18
  export const CIRCLE = decode('3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so3so');
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { arrowKeyNav, rovingTabindex } from '../keyboard-nav.js'
3
+ import { popoverController, syncOpenEffect } from '../popover.svelte.js'
3
4
  import type { MenuProps } from './types.js'
4
5
 
5
6
  const MENU_ITEM_SELECTOR = '[role="menuitem"]'
@@ -21,13 +22,17 @@
21
22
  let contentHeight = $state(0)
22
23
  let innerHeight = $state(0)
23
24
 
24
- export const showPopover = () => {
25
- element?.showPopover()
26
- }
25
+ const controller = popoverController(() => element)
27
26
 
28
- export const hidePopover = () => {
29
- element?.hidePopover()
30
- }
27
+ export const show = () => controller.show()
28
+ export const close = () => controller.close()
29
+
30
+ syncOpenEffect(
31
+ () => element,
32
+ () => open,
33
+ show,
34
+ close,
35
+ )
31
36
 
32
37
  const calculateTransformOrigin = (anchorRect: DOMRect, menuRect: DOMRect) => {
33
38
  const pivot = (anchorStart: number, anchorEnd: number, menuStart: number, menuEnd: number) => {
@@ -82,7 +87,7 @@
82
87
  }}
83
88
  >
84
89
  <div {@attach attach} bind:clientHeight={contentHeight} class="np-menu" role="none">
85
- {@render children()}
90
+ {@render children?.()}
86
91
  </div>
87
92
  </div>
88
93
 
@@ -1,7 +1,7 @@
1
1
  import type { MenuProps } from './types.ts';
2
2
  declare const Menu: import("svelte").Component<MenuProps, {
3
- showPopover: () => void;
4
- hidePopover: () => void;
3
+ show: () => void;
4
+ close: () => void;
5
5
  }, "element" | "open">;
6
6
  type Menu = ReturnType<typeof Menu>;
7
7
  export default Menu;
@@ -1,8 +1,6 @@
1
1
  import type { ItemProps } from '../list/types.js';
2
- import type { Snippet } from 'svelte';
3
2
  import type { HTMLAttributes } from 'svelte/elements';
4
3
  export interface MenuProps extends HTMLAttributes<HTMLDivElement> {
5
- children: Snippet;
6
4
  anchor?: HTMLElement | undefined;
7
5
  element?: HTMLDivElement;
8
6
  open?: boolean;
@@ -0,0 +1,59 @@
1
+ <script lang="ts">
2
+ import { arrowKeyNav, rovingTabindex } from '../keyboard-nav.js'
3
+ import type { NavigationBarProps } from './types.js'
4
+
5
+ let {
6
+ children,
7
+ arrangement = 'equal-weight',
8
+ element = $bindable(),
9
+ onkeydown: userKeydown,
10
+ ...attributes
11
+ }: NavigationBarProps = $props()
12
+
13
+ const attach = rovingTabindex('.np-navigation-bar-item')
14
+ const arrowHandler = arrowKeyNav('.np-navigation-bar-item', 'horizontal')
15
+
16
+ const handleKeydown = (event: KeyboardEvent & { currentTarget: EventTarget & HTMLElement }) => {
17
+ userKeydown?.(event)
18
+ if (!event.defaultPrevented) arrowHandler(event)
19
+ }
20
+ </script>
21
+
22
+ <nav
23
+ {...attributes}
24
+ {@attach attach}
25
+ bind:this={element}
26
+ class={[
27
+ 'np-navigation-bar',
28
+ arrangement === 'centered' && 'np-navigation-bar-centered',
29
+ attributes.class,
30
+ ]}
31
+ onkeydown={handleKeydown}
32
+ >
33
+ {@render children?.()}
34
+ </nav>
35
+
36
+ <style>
37
+ .np-navigation-bar {
38
+ display: flex;
39
+ justify-content: space-around;
40
+ align-items: stretch;
41
+ box-sizing: border-box;
42
+ width: 100%;
43
+ min-height: 5rem;
44
+ padding-block: 0.75rem;
45
+ padding-inline: 0.5rem;
46
+ background-color: var(--np-navigation-bar-container-color, var(--np-color-surface-container));
47
+ padding-bottom: max(0.75rem, env(safe-area-inset-bottom));
48
+ z-index: 8;
49
+ }
50
+
51
+ .np-navigation-bar-centered {
52
+ justify-content: center;
53
+ gap: 0.5rem;
54
+ }
55
+ :global(.np-navigation-bar-centered .np-navigation-bar-item.np-navigation-bar-item) {
56
+ flex: 0 0 auto;
57
+ min-width: 0;
58
+ }
59
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { NavigationBarProps } from './types.ts';
2
+ declare const NavigationBar: import("svelte").Component<NavigationBarProps, {}, "element">;
3
+ type NavigationBar = ReturnType<typeof NavigationBar>;
4
+ export default NavigationBar;