@k2b/ui 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +1 -1
  2. package/dist/browser/content/MarkdownView.js +13 -5
  3. package/dist/browser/content/MarkdownView.js.map +1 -1
  4. package/dist/browser/content/PdfPreview.js +5 -2
  5. package/dist/browser/content/PdfPreview.js.map +1 -1
  6. package/dist/browser/content/index.js +1 -0
  7. package/dist/browser/content/index.js.map +1 -1
  8. package/dist/browser/content/markdown-info-blocks.js +363 -0
  9. package/dist/browser/content/markdown-info-blocks.js.map +1 -0
  10. package/dist/browser/feedback/InstallGuide.js +267 -0
  11. package/dist/browser/feedback/InstallGuide.js.map +1 -0
  12. package/dist/browser/feedback/announce.js +50 -0
  13. package/dist/browser/feedback/announce.js.map +1 -0
  14. package/dist/browser/feedback/dialog-core.js +88 -2
  15. package/dist/browser/feedback/dialog-core.js.map +1 -1
  16. package/dist/browser/feedback/index.js +4 -0
  17. package/dist/browser/feedback/index.js.map +1 -1
  18. package/dist/browser/feedback/install.js +99 -0
  19. package/dist/browser/feedback/install.js.map +1 -0
  20. package/dist/browser/feedback/prompts.js +11 -1
  21. package/dist/browser/feedback/prompts.js.map +1 -1
  22. package/dist/browser/feedback/theme-color.js +15 -0
  23. package/dist/browser/feedback/theme-color.js.map +1 -0
  24. package/dist/browser/feedback/toast.js +10 -44
  25. package/dist/browser/feedback/toast.js.map +1 -1
  26. package/dist/browser/inputs/QrScanner.js +164 -0
  27. package/dist/browser/inputs/QrScanner.js.map +1 -0
  28. package/dist/browser/inputs/index.js +1 -0
  29. package/dist/browser/inputs/index.js.map +1 -1
  30. package/dist/browser/intl/messages.js +96 -2
  31. package/dist/browser/intl/messages.js.map +1 -1
  32. package/dist/browser/layout/Discussion.js +2 -1
  33. package/dist/browser/layout/Discussion.js.map +1 -1
  34. package/dist/browser/layout/MobileShell.js +284 -0
  35. package/dist/browser/layout/MobileShell.js.map +1 -0
  36. package/dist/browser/layout/TabBar.js +69 -0
  37. package/dist/browser/layout/TabBar.js.map +1 -0
  38. package/dist/browser/layout/index.js +2 -0
  39. package/dist/browser/layout/index.js.map +1 -1
  40. package/dist/browser/surfaces/NoticeCard.js +55 -60
  41. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  42. package/dist/browser/surfaces/index.js +1 -1
  43. package/dist/browser/surfaces/index.js.map +1 -1
  44. package/dist/ssr/content/MarkdownView.js +13 -5
  45. package/dist/ssr/content/MarkdownView.js.map +1 -1
  46. package/dist/ssr/content/PdfPreview.js +4 -2
  47. package/dist/ssr/content/PdfPreview.js.map +1 -1
  48. package/dist/ssr/content/index.js +1 -0
  49. package/dist/ssr/content/index.js.map +1 -1
  50. package/dist/ssr/content/markdown-info-blocks.js +363 -0
  51. package/dist/ssr/content/markdown-info-blocks.js.map +1 -0
  52. package/dist/ssr/feedback/InstallGuide.js +201 -0
  53. package/dist/ssr/feedback/InstallGuide.js.map +1 -0
  54. package/dist/ssr/feedback/announce.js +50 -0
  55. package/dist/ssr/feedback/announce.js.map +1 -0
  56. package/dist/ssr/feedback/dialog-core.js +88 -2
  57. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  58. package/dist/ssr/feedback/index.js +4 -0
  59. package/dist/ssr/feedback/index.js.map +1 -1
  60. package/dist/ssr/feedback/install.js +99 -0
  61. package/dist/ssr/feedback/install.js.map +1 -0
  62. package/dist/ssr/feedback/prompts.js +11 -1
  63. package/dist/ssr/feedback/prompts.js.map +1 -1
  64. package/dist/ssr/feedback/theme-color.js +15 -0
  65. package/dist/ssr/feedback/theme-color.js.map +1 -0
  66. package/dist/ssr/feedback/toast.js +10 -44
  67. package/dist/ssr/feedback/toast.js.map +1 -1
  68. package/dist/ssr/inputs/QrScanner.js +128 -0
  69. package/dist/ssr/inputs/QrScanner.js.map +1 -0
  70. package/dist/ssr/inputs/index.js +1 -0
  71. package/dist/ssr/inputs/index.js.map +1 -1
  72. package/dist/ssr/intl/messages.js +96 -2
  73. package/dist/ssr/intl/messages.js.map +1 -1
  74. package/dist/ssr/layout/Discussion.js +2 -1
  75. package/dist/ssr/layout/Discussion.js.map +1 -1
  76. package/dist/ssr/layout/MobileShell.js +253 -0
  77. package/dist/ssr/layout/MobileShell.js.map +1 -0
  78. package/dist/ssr/layout/TabBar.js +25 -0
  79. package/dist/ssr/layout/TabBar.js.map +1 -0
  80. package/dist/ssr/layout/index.js +2 -0
  81. package/dist/ssr/layout/index.js.map +1 -1
  82. package/dist/ssr/surfaces/NoticeCard.js +21 -30
  83. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  84. package/dist/ssr/surfaces/index.js +1 -1
  85. package/dist/ssr/surfaces/index.js.map +1 -1
  86. package/dist/styles.css +1 -1
  87. package/dist/tabler.css +1 -1
  88. package/dist/types/content/MarkdownView.d.ts +6 -2
  89. package/dist/types/content/index.d.ts +1 -0
  90. package/dist/types/content/markdown-info-blocks.d.ts +67 -0
  91. package/dist/types/feedback/InstallGuide.d.ts +26 -0
  92. package/dist/types/feedback/announce.d.ts +19 -0
  93. package/dist/types/feedback/dialog-core.d.ts +5 -0
  94. package/dist/types/feedback/index.d.ts +7 -0
  95. package/dist/types/feedback/install.d.ts +32 -0
  96. package/dist/types/feedback/prompts.d.ts +2 -0
  97. package/dist/types/feedback/theme-color.d.ts +6 -0
  98. package/dist/types/inputs/QrScanner.d.ts +20 -0
  99. package/dist/types/inputs/index.d.ts +2 -0
  100. package/dist/types/intl/messages.d.ts +47 -0
  101. package/dist/types/layout/MobileShell.d.ts +40 -0
  102. package/dist/types/layout/TabBar.d.ts +26 -0
  103. package/dist/types/layout/index.d.ts +4 -0
  104. package/dist/types/surfaces/NoticeCard.d.ts +4 -4
  105. package/dist/types/surfaces/index.d.ts +1 -1
  106. package/package.json +3 -2
@@ -0,0 +1,253 @@
1
+ import { ssr as _$ssr } from "solid-js/web";
2
+ import { createComponent as _$createComponent } from "solid-js/web";
3
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ var _tmpl$ = ["<div", ">", "<main class=\"k2b-mobile-shell__main\">", "</main>", "</div>"],
6
+ _tmpl$2 = ["<div class=\"k2b-mobile-shell__actions\">", "</div>"],
7
+ _tmpl$3 = ["<header class=\"k2b-mobile-shell__header\">", "<h1 class=\"k2b-mobile-shell__title\">", "</h1>", "</header>"],
8
+ _tmpl$4 = "<i class=\"ti ti-chevron-left\" aria-hidden=\"true\"></i>";
9
+ import { onCleanup, onMount, Show } from "solid-js";
10
+ import { IconButton, IconButtonLink } from "../actions/Button";
11
+ import ScrollArea from "./ScrollArea";
12
+ import { installScrollFades } from "./scroll-fade";
13
+ /** Read by the toast rail, which is portalled outside the shell, so it lives on the body. */
14
+ const FOOTER_HEIGHT = "--k2b-mobile-shell-footer-height";
15
+ /** How much of the scroll area a persistent toast covers; local to the shell. */
16
+ const TOAST_INSET = "--k2b-mobile-shell-toast-inset";
17
+
18
+ /**
19
+ * The visible part of the toast rail when it holds a toast without a timer (`duration: 0`, running progress, or a
20
+ * custom slot), so the last row of the scroll area can still scroll above it. A rail that sits elsewhere, such as
21
+ * above a dialog, covers nothing.
22
+ */
23
+ const persistentToastInset = body => {
24
+ if (document.querySelector("dialog:modal")) return 0;
25
+ const cards = [...document.querySelectorAll("[data-k2b-toast-container] [data-k2b-toast]:not([data-closing])")];
26
+ if (!cards.some(card => card.dataset.persistent === "true")) return 0;
27
+ const area = body.getBoundingClientRect();
28
+ const top = Math.min(...cards.map(card => card.getBoundingClientRect().top));
29
+ return Math.max(0, Math.min(area.height, area.bottom - top));
30
+ };
31
+
32
+ /** Marks the link whose page is loading; the tab bar shows it as selected. */
33
+ const PENDING = "data-k2b-pending";
34
+ /** On a link: the title of the page it opens. Such a link switches the shell to that page's frame at the first touch. */
35
+ const PAGE_TITLE = "data-k2b-title";
36
+ /** On the root while the shell shows the frame of the page that is loading. */
37
+ const SWITCHING = "data-k2b-switching";
38
+ /** On the header title while the shell switches: the loading page's title, which the title shows instead. */
39
+ const NEXT_TITLE = "data-k2b-next-title";
40
+
41
+ /** The link a click or press follows as a page load of this origin, or null when it does something else. */
42
+ const pageLink = (root, event) => {
43
+ if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return null;
44
+ const link = event.target instanceof Element ? event.target.closest("a[href]") : null;
45
+ if (!link || !root.contains(link) || link.hasAttribute("download") || link.target && link.target !== "_self") return null;
46
+ const url = new URL(link.href);
47
+ if (url.origin !== location.origin) return null;
48
+ // A jump inside the page loads nothing.
49
+ if (url.hash && url.pathname === location.pathname && url.search === location.search) return null;
50
+ return link;
51
+ };
52
+
53
+ /**
54
+ * Taps on the shell's links. iOS shows `:active` only while the page listens to touches, so a tap gets its pressed
55
+ * state at once. A link's page keeps loading while the old page stays visible; a second tap on it would cancel that
56
+ * load and start it over, so it is ignored. A link that names its page's title, such as a tab, shows that page's
57
+ * frame at the first touch instead of at the end of the tap: its title and an empty content area, until the page
58
+ * arrives. Returns the cleanup.
59
+ */
60
+ const observeLinkTaps = root => {
61
+ /** The link marked as the next page. */
62
+ let pending;
63
+ /** Whether its page is loading; a pressed tab waits for its click. */
64
+ let loading = false;
65
+ const clear = () => {
66
+ pending = undefined;
67
+ loading = false;
68
+ for (const link of root.querySelectorAll(`[${PENDING}]`)) link.removeAttribute(PENDING);
69
+ root.removeAttribute(SWITCHING);
70
+ root.querySelector(".k2b-mobile-shell__title")?.removeAttribute(NEXT_TITLE);
71
+ };
72
+ const mark = link => {
73
+ clear();
74
+ pending = link.href;
75
+ link.setAttribute(PENDING, "");
76
+ const title = link.getAttribute(PAGE_TITLE);
77
+ const heading = root.querySelector(".k2b-mobile-shell__title");
78
+ if (title === null || !heading) return;
79
+ heading.setAttribute(NEXT_TITLE, title);
80
+ root.setAttribute(SWITCHING, "");
81
+ };
82
+ const touch = () => {};
83
+ // A press on a tab shows its page's frame while the finger is still down. The page itself loads with the click
84
+ // that ends the tap, as for any link: only the end of a touch counts as the person's action, and a load that
85
+ // started before it could let the browser's Back skip this page.
86
+ const press = event => {
87
+ if (!event.isPrimary) return;
88
+ const link = pageLink(root, event);
89
+ if (!link?.hasAttribute(PAGE_TITLE) || link.href === pending && loading) return;
90
+ mark(link);
91
+ };
92
+ // A press that the browser takes over, such as one that turns into a scroll, ends without a click and takes its
93
+ // frame back.
94
+ const cancel = event => {
95
+ if (event.isPrimary && !loading) clear();
96
+ };
97
+ // On the window, so it runs after every handler of the click, including delegated ones that prevent it.
98
+ const click = event => {
99
+ const link = pageLink(root, event);
100
+ if (link && link.href === pending && loading) {
101
+ event.preventDefault();
102
+ return;
103
+ }
104
+ // Any other tap ends the wait, also for a link that answered with a download instead of a page.
105
+ clear();
106
+ if (!link) return;
107
+ mark(link);
108
+ loading = true;
109
+ };
110
+ // iOS sends no click for a tap on content without an action, so the end of a tap anywhere else ends the wait as
111
+ // well. A touch that scrolls ends without a pointerup and keeps a load's wait.
112
+ const release = event => {
113
+ if (pending === undefined) return;
114
+ const link = event.target instanceof Element ? event.target.closest("a[href]") : null;
115
+ if (link?.href !== pending) clear();
116
+ };
117
+ // A page restored from the back/forward cache shows the state it was left in.
118
+ const show = event => {
119
+ if (event.persisted) clear();
120
+ };
121
+ document.addEventListener("touchstart", touch, {
122
+ passive: true
123
+ });
124
+ window.addEventListener("pointerdown", press);
125
+ window.addEventListener("pointercancel", cancel);
126
+ window.addEventListener("pointerup", release);
127
+ window.addEventListener("click", click);
128
+ window.addEventListener("pageshow", show);
129
+ return () => {
130
+ document.removeEventListener("touchstart", touch);
131
+ window.removeEventListener("pointerdown", press);
132
+ window.removeEventListener("pointercancel", cancel);
133
+ window.removeEventListener("pointerup", release);
134
+ window.removeEventListener("click", click);
135
+ window.removeEventListener("pageshow", show);
136
+ clear();
137
+ };
138
+ };
139
+
140
+ /**
141
+ * Keeps a mounted shell working: the footer height on the body, which the portalled toast rail reads, the room a
142
+ * persistent toast takes from the scroll area, the scroll area's edge fade, and immediate feedback for link taps.
143
+ * The fade is the only cue at the footer's edge, which has no rule. `MobileShell` calls it itself;
144
+ * a page that renders the shell on the server without hydrating it calls it once in the browser. Returns the
145
+ * cleanup.
146
+ */
147
+ export function observeMobileShell(root) {
148
+ const main = root.querySelector(":scope > .k2b-mobile-shell__main");
149
+ const body = main?.querySelector(":scope > .k2b-mobile-shell__body");
150
+ if (!main || !body) return () => {};
151
+ const stopLinkTaps = observeLinkTaps(root);
152
+ const stopScrollFades = installScrollFades(body);
153
+ let frame = 0;
154
+ const measure = () => {
155
+ frame = 0;
156
+ const footer = Math.max(0, root.getBoundingClientRect().bottom - main.getBoundingClientRect().bottom);
157
+ document.body.style.setProperty(FOOTER_HEIGHT, `${footer}px`);
158
+ root.style.setProperty(TOAST_INSET, `${persistentToastInset(body)}px`);
159
+ };
160
+ const schedule = () => {
161
+ if (!frame) frame = requestAnimationFrame(measure);
162
+ };
163
+ measure();
164
+ // The footer can appear, disappear, or change height; the main area takes whatever it leaves.
165
+ const resize = new ResizeObserver(schedule);
166
+ resize.observe(root);
167
+ resize.observe(main);
168
+ // Toasts arrive and leave anywhere in the document, and their slots grow and collapse in a transition.
169
+ const mutations = new MutationObserver(schedule);
170
+ mutations.observe(document.body, {
171
+ childList: true,
172
+ subtree: true,
173
+ attributes: true,
174
+ attributeFilter: ["data-state", "data-closing", "data-persistent", "open"]
175
+ });
176
+ document.addEventListener("transitionend", schedule, true);
177
+ return () => {
178
+ if (frame) cancelAnimationFrame(frame);
179
+ resize.disconnect();
180
+ mutations.disconnect();
181
+ document.removeEventListener("transitionend", schedule, true);
182
+ document.body.style.removeProperty(FOOTER_HEIGHT);
183
+ stopLinkTaps();
184
+ stopScrollFades();
185
+ };
186
+ }
187
+ function MobileShellRoot(props) {
188
+ let root;
189
+ onMount(() => onCleanup(observeMobileShell(root)));
190
+ return _$ssr(_tmpl$, _$ssrAttribute("class", props.class ? `k2b-mobile-shell ${_$escape(props.class, true)}` : "k2b-mobile-shell", false), _$escape(props.header), _$escape(_$createComponent(ScrollArea, {
191
+ "class": "k2b-mobile-shell__body",
192
+ get children() {
193
+ return props.children;
194
+ }
195
+ })), _$escape(props.footer));
196
+ }
197
+ function MobileShellHeader(props) {
198
+ return _$ssr(_tmpl$3, _$escape(_$createComponent(Show, {
199
+ get when() {
200
+ return props.back;
201
+ },
202
+ children: back => _$createComponent(Show, {
203
+ get when() {
204
+ return back().href;
205
+ },
206
+ get fallback() {
207
+ return _$createComponent(IconButton, {
208
+ "class": "k2b-mobile-shell__back",
209
+ get label() {
210
+ return back().label;
211
+ },
212
+ tooltip: false,
213
+ onClick: () => back().onClick?.(),
214
+ get children() {
215
+ return _$ssr(_tmpl$4);
216
+ }
217
+ });
218
+ },
219
+ children: href => _$createComponent(IconButtonLink, {
220
+ "class": "k2b-mobile-shell__back",
221
+ get href() {
222
+ return href();
223
+ },
224
+ get label() {
225
+ return back().label;
226
+ },
227
+ tooltip: false,
228
+ onClick: () => back().onClick?.(),
229
+ get children() {
230
+ return _$ssr(_tmpl$4);
231
+ }
232
+ })
233
+ })
234
+ })), _$escape(props.title), _$escape(_$createComponent(Show, {
235
+ get when() {
236
+ return props.actions;
237
+ },
238
+ get children() {
239
+ return _$ssr(_tmpl$2, _$escape(props.actions));
240
+ }
241
+ })));
242
+ }
243
+
244
+ /**
245
+ * The full-screen frame of a phone app: a header, one scroll area, and an optional footer such as a `TabBar`. While
246
+ * it is mounted, the document itself never scrolls, pinch zoom and rubber-banding are off, and the toast rail sits
247
+ * above the footer. Mount one per page, as the page's layout.
248
+ */
249
+ export const MobileShell = Object.assign(MobileShellRoot, {
250
+ Header: MobileShellHeader
251
+ });
252
+ export default MobileShell;
253
+ //# sourceMappingURL=MobileShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["layout/MobileShell.tsx"],"sourcesContent":["import { type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { IconButton, IconButtonLink } from \"../actions/Button\";\nimport ScrollArea from \"./ScrollArea\";\nimport { installScrollFades } from \"./scroll-fade\";\n\nexport type MobileShellProps = {\n /** Usually `MobileShell.Header`; it sits above the scroll area and pads the top safe area. */\n header: JSX.Element;\n /** Usually a `TabBar`; it sits below the scroll area and pads the bottom safe area itself. */\n footer?: JSX.Element;\n /** The page content, inside the shell's only scroll area. */\n children: JSX.Element;\n class?: string;\n};\n\nexport type MobileShellHeaderProps = {\n title: string;\n /** A Back control before the title: a link with `href`, otherwise a button. */\n back?: { href?: string; onClick?: () => void; label: string };\n /** Controls after the title, such as a menu. */\n actions?: JSX.Element;\n};\n\n/** Read by the toast rail, which is portalled outside the shell, so it lives on the body. */\nconst FOOTER_HEIGHT = \"--k2b-mobile-shell-footer-height\";\n/** How much of the scroll area a persistent toast covers; local to the shell. */\nconst TOAST_INSET = \"--k2b-mobile-shell-toast-inset\";\n\n/**\n * The visible part of the toast rail when it holds a toast without a timer (`duration: 0`, running progress, or a\n * custom slot), so the last row of the scroll area can still scroll above it. A rail that sits elsewhere, such as\n * above a dialog, covers nothing.\n */\nconst persistentToastInset = (body: HTMLElement): number => {\n if (document.querySelector(\"dialog:modal\")) return 0;\n const cards = [...document.querySelectorAll<HTMLElement>(\"[data-k2b-toast-container] [data-k2b-toast]:not([data-closing])\")];\n if (!cards.some((card) => card.dataset.persistent === \"true\")) return 0;\n const area = body.getBoundingClientRect();\n const top = Math.min(...cards.map((card) => card.getBoundingClientRect().top));\n return Math.max(0, Math.min(area.height, area.bottom - top));\n};\n\n/** Marks the link whose page is loading; the tab bar shows it as selected. */\nconst PENDING = \"data-k2b-pending\";\n/** On a link: the title of the page it opens. Such a link switches the shell to that page's frame at the first touch. */\nconst PAGE_TITLE = \"data-k2b-title\";\n/** On the root while the shell shows the frame of the page that is loading. */\nconst SWITCHING = \"data-k2b-switching\";\n/** On the header title while the shell switches: the loading page's title, which the title shows instead. */\nconst NEXT_TITLE = \"data-k2b-next-title\";\n\n/** The link a click or press follows as a page load of this origin, or null when it does something else. */\nconst pageLink = (root: HTMLElement, event: MouseEvent): HTMLAnchorElement | null => {\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return null;\n const link = event.target instanceof Element ? event.target.closest<HTMLAnchorElement>(\"a[href]\") : null;\n if (!link || !root.contains(link) || link.hasAttribute(\"download\") || (link.target && link.target !== \"_self\")) return null;\n const url = new URL(link.href);\n if (url.origin !== location.origin) return null;\n // A jump inside the page loads nothing.\n if (url.hash && url.pathname === location.pathname && url.search === location.search) return null;\n return link;\n};\n\n/**\n * Taps on the shell's links. iOS shows `:active` only while the page listens to touches, so a tap gets its pressed\n * state at once. A link's page keeps loading while the old page stays visible; a second tap on it would cancel that\n * load and start it over, so it is ignored. A link that names its page's title, such as a tab, shows that page's\n * frame at the first touch instead of at the end of the tap: its title and an empty content area, until the page\n * arrives. Returns the cleanup.\n */\nconst observeLinkTaps = (root: HTMLElement): (() => void) => {\n /** The link marked as the next page. */\n let pending: string | undefined;\n /** Whether its page is loading; a pressed tab waits for its click. */\n let loading = false;\n const clear = () => {\n pending = undefined;\n loading = false;\n for (const link of root.querySelectorAll(`[${PENDING}]`)) link.removeAttribute(PENDING);\n root.removeAttribute(SWITCHING);\n root.querySelector(\".k2b-mobile-shell__title\")?.removeAttribute(NEXT_TITLE);\n };\n const mark = (link: HTMLAnchorElement) => {\n clear();\n pending = link.href;\n link.setAttribute(PENDING, \"\");\n const title = link.getAttribute(PAGE_TITLE);\n const heading = root.querySelector(\".k2b-mobile-shell__title\");\n if (title === null || !heading) return;\n heading.setAttribute(NEXT_TITLE, title);\n root.setAttribute(SWITCHING, \"\");\n };\n const touch = () => {};\n // A press on a tab shows its page's frame while the finger is still down. The page itself loads with the click\n // that ends the tap, as for any link: only the end of a touch counts as the person's action, and a load that\n // started before it could let the browser's Back skip this page.\n const press = (event: PointerEvent) => {\n if (!event.isPrimary) return;\n const link = pageLink(root, event);\n if (!link?.hasAttribute(PAGE_TITLE) || (link.href === pending && loading)) return;\n mark(link);\n };\n // A press that the browser takes over, such as one that turns into a scroll, ends without a click and takes its\n // frame back.\n const cancel = (event: PointerEvent) => {\n if (event.isPrimary && !loading) clear();\n };\n // On the window, so it runs after every handler of the click, including delegated ones that prevent it.\n const click = (event: MouseEvent) => {\n const link = pageLink(root, event);\n if (link && link.href === pending && loading) {\n event.preventDefault();\n return;\n }\n // Any other tap ends the wait, also for a link that answered with a download instead of a page.\n clear();\n if (!link) return;\n mark(link);\n loading = true;\n };\n // iOS sends no click for a tap on content without an action, so the end of a tap anywhere else ends the wait as\n // well. A touch that scrolls ends without a pointerup and keeps a load's wait.\n const release = (event: PointerEvent) => {\n if (pending === undefined) return;\n const link = event.target instanceof Element ? event.target.closest<HTMLAnchorElement>(\"a[href]\") : null;\n if (link?.href !== pending) clear();\n };\n // A page restored from the back/forward cache shows the state it was left in.\n const show = (event: PageTransitionEvent) => {\n if (event.persisted) clear();\n };\n document.addEventListener(\"touchstart\", touch, { passive: true });\n window.addEventListener(\"pointerdown\", press);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"pointerup\", release);\n window.addEventListener(\"click\", click);\n window.addEventListener(\"pageshow\", show);\n return () => {\n document.removeEventListener(\"touchstart\", touch);\n window.removeEventListener(\"pointerdown\", press);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"pointerup\", release);\n window.removeEventListener(\"click\", click);\n window.removeEventListener(\"pageshow\", show);\n clear();\n };\n};\n\n/**\n * Keeps a mounted shell working: the footer height on the body, which the portalled toast rail reads, the room a\n * persistent toast takes from the scroll area, the scroll area's edge fade, and immediate feedback for link taps.\n * The fade is the only cue at the footer's edge, which has no rule. `MobileShell` calls it itself;\n * a page that renders the shell on the server without hydrating it calls it once in the browser. Returns the\n * cleanup.\n */\nexport function observeMobileShell(root: HTMLElement): () => void {\n const main = root.querySelector<HTMLElement>(\":scope > .k2b-mobile-shell__main\");\n const body = main?.querySelector<HTMLElement>(\":scope > .k2b-mobile-shell__body\");\n if (!main || !body) return () => {};\n const stopLinkTaps = observeLinkTaps(root);\n const stopScrollFades = installScrollFades(body);\n let frame = 0;\n const measure = () => {\n frame = 0;\n const footer = Math.max(0, root.getBoundingClientRect().bottom - main.getBoundingClientRect().bottom);\n document.body.style.setProperty(FOOTER_HEIGHT, `${footer}px`);\n root.style.setProperty(TOAST_INSET, `${persistentToastInset(body)}px`);\n };\n const schedule = () => {\n if (!frame) frame = requestAnimationFrame(measure);\n };\n measure();\n // The footer can appear, disappear, or change height; the main area takes whatever it leaves.\n const resize = new ResizeObserver(schedule);\n resize.observe(root);\n resize.observe(main);\n // Toasts arrive and leave anywhere in the document, and their slots grow and collapse in a transition.\n const mutations = new MutationObserver(schedule);\n mutations.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"data-state\", \"data-closing\", \"data-persistent\", \"open\"],\n });\n document.addEventListener(\"transitionend\", schedule, true);\n return () => {\n if (frame) cancelAnimationFrame(frame);\n resize.disconnect();\n mutations.disconnect();\n document.removeEventListener(\"transitionend\", schedule, true);\n document.body.style.removeProperty(FOOTER_HEIGHT);\n stopLinkTaps();\n stopScrollFades();\n };\n}\n\nfunction MobileShellRoot(props: MobileShellProps): JSX.Element {\n let root!: HTMLDivElement;\n\n onMount(() => onCleanup(observeMobileShell(root)));\n\n return (\n <div ref={root} class={props.class ? `k2b-mobile-shell ${props.class}` : \"k2b-mobile-shell\"}>\n {props.header}\n <main class=\"k2b-mobile-shell__main\">\n <ScrollArea class=\"k2b-mobile-shell__body\">{props.children}</ScrollArea>\n </main>\n {props.footer}\n </div>\n );\n}\n\nfunction MobileShellHeader(props: MobileShellHeaderProps): JSX.Element {\n return (\n <header class=\"k2b-mobile-shell__header\">\n <Show when={props.back}>\n {(back) => (\n <Show\n when={back().href}\n fallback={\n <IconButton class=\"k2b-mobile-shell__back\" label={back().label} tooltip={false} onClick={() => back().onClick?.()}>\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </IconButton>\n }\n >\n {(href) => (\n <IconButtonLink\n class=\"k2b-mobile-shell__back\"\n href={href()}\n label={back().label}\n tooltip={false}\n onClick={() => back().onClick?.()}\n >\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </IconButtonLink>\n )}\n </Show>\n )}\n </Show>\n <h1 class=\"k2b-mobile-shell__title\">{props.title}</h1>\n <Show when={props.actions}>\n <div class=\"k2b-mobile-shell__actions\">{props.actions}</div>\n </Show>\n </header>\n );\n}\n\n/**\n * The full-screen frame of a phone app: a header, one scroll area, and an optional footer such as a `TabBar`. While\n * it is mounted, the document itself never scrolls, pinch zoom and rubber-banding are off, and the toast rail sits\n * above the footer. Mount one per page, as the page's layout.\n */\nexport const MobileShell = Object.assign(MobileShellRoot, { Header: MobileShellHeader });\n\nexport default MobileShell;\n"],"mappings":";;;;;;;;AAAA,SAAmB,SAAS,EAAE,OAAO,EAAE,IAAI,QAAQ,UAAU;AAC7D,SAAS,UAAU,EAAE,cAAc,QAAQ,mBAAmB;AAC9D,OAAO,UAAU,MAAM,cAAc;AACrC,SAAS,kBAAkB,QAAQ,eAAe;AAoBlD;AACA,MAAM,aAAa,GAAG,kCAAkC;AACxD;AACA,MAAM,WAAW,GAAG,gCAAgC;;AAEpD;AACA;AACA;AACA;AACA;AACA,MAAM,oBAAoB,GAAI,IAAiB,IAAa;EAC1D,IAAI,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;EACpD,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAc,iEAAiE,CAAC,CAAC;EAC5H,IAAI,CAAC,KAAK,CAAC,IAAI,CAAE,IAAI,IAAK,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC;EACvE,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;EACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAE,IAAI,IAAK,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;EAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AAC9D,CAAC;;AAED;AACA,MAAM,OAAO,GAAG,kBAAkB;AAClC;AACA,MAAM,UAAU,GAAG,gBAAgB;AACnC;AACA,MAAM,SAAS,GAAG,oBAAoB;AACtC;AACA,MAAM,UAAU,GAAG,qBAAqB;;AAExC;AACA,MAAM,QAAQ,GAAG,CAAC,IAAiB,EAAE,KAAiB,KAA+B;EACnF,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI;EACjI,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,YAAY,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAoB,SAAS,CAAC,GAAG,IAAI;EACxG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,OAAQ,EAAE,OAAO,IAAI;EAC3H,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;EAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,OAAO,IAAI;EAC/C;EACA,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,OAAO,IAAI;EACjG,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,eAAe,GAAI,IAAiB,IAAmB;EAC3D;EACA,IAAI,OAA2B;EAC/B;EACA,IAAI,OAAO,GAAG,KAAK;EACnB,MAAM,KAAK,GAAG,MAAM;IAClB,OAAO,GAAG,SAAS;IACnB,OAAO,GAAG,KAAK;IACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;IACvF,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;IAC/B,IAAI,CAAC,aAAa,CAAC,0BAA0B,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC;EAC7E,CAAC;EACD,MAAM,IAAI,GAAI,IAAuB,IAAK;IACxC,KAAK,CAAC,CAAC;IACP,OAAO,GAAG,IAAI,CAAC,IAAI;IACnB,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,0BAA0B,CAAC;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;IAChC,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC;IACvC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC;EAClC,CAAC;EACD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;EACtB;EACA;EACA;EACA,MAAM,KAAK,GAAI,KAAmB,IAAK;IACrC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;IACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,IAAK,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,OAAQ,EAAE;IAC3E,IAAI,CAAC,IAAI,CAAC;EACZ,CAAC;EACD;EACA;EACA,MAAM,MAAM,GAAI,KAAmB,IAAK;IACtC,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EAC1C,CAAC;EACD;EACA,MAAM,KAAK,GAAI,KAAiB,IAAK;IACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAClC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,EAAE;MAC5C,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB;IACF;IACA;IACA,KAAK,CAAC,CAAC;IACP,IAAI,CAAC,IAAI,EAAE;IACX,IAAI,CAAC,IAAI,CAAC;IACV,OAAO,GAAG,IAAI;EAChB,CAAC;EACD;EACA;EACA,MAAM,OAAO,GAAI,KAAmB,IAAK;IACvC,IAAI,OAAO,KAAK,SAAS,EAAE;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,YAAY,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAoB,SAAS,CAAC,GAAG,IAAI;IACxG,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE,KAAK,CAAC,CAAC;EACrC,CAAC;EACD;EACA,MAAM,IAAI,GAAI,KAA0B,IAAK;IAC3C,IAAI,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;EAC9B,CAAC;EACD,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,EAAE;IAAE,OAAO,EAAE;EAAK,CAAC,CAAC;EACjE,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC;EAC7C,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC;EAChD,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC;EAC7C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;EACvC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC;EACzC,OAAO,MAAM;IACX,QAAQ,CAAC,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC;IACjD,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC;IAChD,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC;IACnD,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC;IAChD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;IAC1C,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC;IAC5C,KAAK,CAAC,CAAC;EACT,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,kBAAkB,CAAC,IAAiB,EAAc;EAChE,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAc,kCAAkC,CAAC;EAChF,MAAM,IAAI,GAAG,IAAI,EAAE,aAAa,CAAc,kCAAkC,CAAC;EACjF,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,MAAM,CAAC,CAAC;EACnC,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC;EAC1C,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC;EAChD,IAAI,KAAK,GAAG,CAAC;EACb,MAAM,OAAO,GAAG,MAAM;IACpB,KAAK,GAAG,CAAC;IACT,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC;IACrG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;EACxE,CAAC;EACD,MAAM,QAAQ,GAAG,MAAM;IACrB,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC;EACpD,CAAC;EACD,OAAO,CAAC,CAAC;EACT;EACA,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC;EAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;EACpB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;EACpB;EACA,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC;EAChD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;IAC/B,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,IAAI;IAChB,eAAe,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM;EAC3E,CAAC,CAAC;EACF,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC;EAC1D,OAAO,MAAM;IACX,IAAI,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC;IACtC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnB,SAAS,CAAC,UAAU,CAAC,CAAC;IACtB,QAAQ,CAAC,mBAAmB,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC;IAC7D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC;IACjD,YAAY,CAAC,CAAC;IACd,eAAe,CAAC,CAAC;EACnB,CAAC;AACH;AAEA,SAAS,eAAe,CAAC,KAAuB,EAAe;EAC7D,IAAI,IAAqB;EAEzB,OAAO,CAAC,MAAM,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;EAElD,6CACyB,KAAK,CAAC,KAAK,GAAG,6BAAoB,KAAK,CAAC,KAAK,SAAE,GAAG,kBAAkB,mBACxF,KAAK,CAAC,MAAM,8BAEV,UAAU;IAAA;IAAA;MAAA,OAAiC,KAAK,CAAC,QAAQ;IAAA;EAAA,cAE3D,KAAK,CAAC,MAAM;AAGnB;AAEA,SAAS,iBAAiB,CAAC,KAA6B,EAAe;EACrE,iDAEK,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI;IAAA;IAAA,UAClB,IAAI,sBACH,IAAI;MAAA,IACH,IAAI;QAAA,OAAE,IAAI,CAAC,CAAC,CAAC,IAAI;MAAA;MAAA,IACjB,QAAQ;QAAA,yBACL,UAAU;UAAA;UAAA,IAAgC,KAAK;YAAA,OAAE,IAAI,CAAC,CAAC,CAAC,KAAK;UAAA;UAAE,OAAO,EAAE,KAAK;UAAE,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC;UAAA;YAAA;UAAA;QAAA;MAAA;MAAA,UAKjH,IAAI,sBACH,cAAc;QAAA;QAAA,IAEb,IAAI;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IACZ,KAAK;UAAA,OAAE,IAAI,CAAC,CAAC,CAAC,KAAK;QAAA;QACnB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC;QAAA;UAAA;QAAA;MAAA;IAIpC;EAEJ,cAEkC,KAAK,CAAC,KAAK,8BAC/C,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,OAAO;IAAA;IAAA;MAAA,+BACiB,KAAK,CAAC,OAAO;IAAA;EAAA;AAI7D;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE;EAAE,MAAM,EAAE;AAAkB,CAAC,CAAC;AAExF,eAAe,WAAW","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ import { ssr as _$ssr } from "solid-js/web";
2
+ import { createComponent as _$createComponent } from "solid-js/web";
3
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ var _tmpl$ = ["<nav", "><ul>", "</ul></nav>"],
6
+ _tmpl$2 = ["<li><a", "><i", " aria-hidden=\"true\"></i><span>", "</span></a></li>"];
7
+ import { For } from "solid-js";
8
+ /** A phone app's bottom navigation holds at most five destinations. */
9
+ const TAB_BAR_MAX_ITEMS = 5;
10
+
11
+ /**
12
+ * Bottom navigation between a phone app's top-level pages: native links with equal widths, an icon above each label,
13
+ * and `aria-current="page"` on the open page. Place it in `MobileShell`'s footer; it pads the bottom safe area. There a
14
+ * tab switches at the first touch: the shell shows the item's `title` while its page loads.
15
+ */
16
+ export function TabBar(props) {
17
+ return _$ssr(_tmpl$, _$ssrAttribute("class", props.class ? `k2b-tab-bar ${_$escape(props.class, true)}` : "k2b-tab-bar", false) + _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$escape(_$createComponent(For, {
18
+ get each() {
19
+ return props.items.slice(0, TAB_BAR_MAX_ITEMS);
20
+ },
21
+ children: item => _$ssr(_tmpl$2, _$ssrAttribute("href", _$escape(item.href, true), false) + _$ssrAttribute("aria-current", item.current ? "page" : _$escape(undefined, true), false) + _$ssrAttribute("data-tab", _$escape(item.id, true), false) + _$ssrAttribute("data-k2b-title", _$escape(item.title ?? item.label, true), false), _$ssrAttribute("class", _$escape(item.icon, true), false), _$escape(item.label))
22
+ })));
23
+ }
24
+ export default TabBar;
25
+ //# sourceMappingURL=TabBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["layout/TabBar.tsx"],"sourcesContent":["import { For, type JSX } from \"solid-js\";\n\nexport type TabBarItem = {\n id: string;\n label: string;\n /** Icon class, for example `ti ti-home`. */\n icon: string;\n href: string;\n /** The header title of the page this item opens, shown while that page loads. Defaults to `label`. */\n title?: string;\n /** The page this item leads to is open. */\n current?: boolean;\n};\n\nexport type TabBarProps = {\n /** Accessible name of the navigation landmark. */\n label: string;\n /** Up to five destinations; further items are not rendered. Put the rest behind a \"More\" destination. */\n items: readonly TabBarItem[];\n class?: string;\n};\n\n/** A phone app's bottom navigation holds at most five destinations. */\nconst TAB_BAR_MAX_ITEMS = 5;\n\n/**\n * Bottom navigation between a phone app's top-level pages: native links with equal widths, an icon above each label,\n * and `aria-current=\"page\"` on the open page. Place it in `MobileShell`'s footer; it pads the bottom safe area. There a\n * tab switches at the first touch: the shell shows the item's `title` while its page loads.\n */\nexport function TabBar(props: TabBarProps): JSX.Element {\n return (\n <nav class={props.class ? `k2b-tab-bar ${props.class}` : \"k2b-tab-bar\"} aria-label={props.label}>\n <ul>\n <For each={props.items.slice(0, TAB_BAR_MAX_ITEMS)}>\n {(item) => (\n <li>\n <a\n href={item.href}\n aria-current={item.current ? \"page\" : undefined}\n data-tab={item.id}\n data-k2b-title={item.title ?? item.label}\n >\n <i class={item.icon} aria-hidden=\"true\" />\n <span>{item.label}</span>\n </a>\n </li>\n )}\n </For>\n </ul>\n </nav>\n );\n}\n\nexport default TabBar;\n"],"mappings":";;;;;;AAAA,SAAS,GAAG,QAAkB,UAAU;AAsBxC;AACA,MAAM,iBAAiB,GAAG,CAAC;;AAE3B;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,MAAM,CAAC,KAAkB,EAAe;EACtD,6CACc,KAAK,CAAC,KAAK,GAAG,wBAAe,KAAK,CAAC,KAAK,SAAE,GAAG,aAAa,iDAAc,KAAK,CAAC,KAAK,4CAE1F,GAAG;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC;IAAA;IAAA,UAC9C,IAAI,mDAGM,IAAI,CAAC,IAAI,iDACD,IAAI,CAAC,OAAO,GAAG,MAAM,YAAG,SAAS,sDACrC,IAAI,CAAC,EAAE,4DACD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,kDAE9B,IAAI,CAAC,IAAI,0BACZ,IAAI,CAAC,KAAK;EAGtB;AAKX;AAEA,eAAe,MAAM","ignoreList":[]}
@@ -7,6 +7,7 @@ export { DataPanel } from "./DataPanel";
7
7
  export { default as DetailPanel } from "./DetailPanel";
8
8
  export { default as Discussion } from "./Discussion";
9
9
  export { default as FloatingWindow, fitFloatingWindowRect, openFloatingWindow } from "./FloatingWindow";
10
+ export { default as MobileShell, observeMobileShell } from "./MobileShell";
10
11
  export { default as Navigation } from "./Navigation";
11
12
  export { createNavigation, findNavigationItem } from "./navigation-model";
12
13
  export { confirmDiscardIfDirty, default as PanelDialog, panelDialogFixedOptions, panelDialogFixedPanelClass, panelDialogOptions, panelDialogPanelClass, panelDialogWideOptions, panelDialogWidePanelClass, panelDialogWorkspaceOptions, panelDialogWorkspacePanelClass } from "./PanelDialog";
@@ -18,4 +19,5 @@ export { default as ScrollArea } from "./ScrollArea";
18
19
  export { readSettingsError, SettingsField, SettingsGroup, SettingsPage, SettingsPanelFooter, SettingsSaveBar, SettingsSection, sameSettingValue } from "./Settings";
19
20
  export { default as SettingsCollection } from "./SettingsCollection";
20
21
  export { default as SettingsModal } from "./SettingsModal";
22
+ export { default as TabBar } from "./TabBar";
21
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewCardsProps,\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport { type BottomSheetProps, bottomSheetOptions, default as BottomSheet } from \"./BottomSheet\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelActionSecondary,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport { default as Navigation, type NavigationProps } from \"./Navigation\";\nexport {\n createNavigation,\n findNavigationItem,\n type NavigationController,\n type NavigationItem,\n type NavigationOptions,\n} from \"./navigation-model\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type { PullToRefreshProps, PullToRefreshState } from \"./PullToRefresh\";\nexport { default as PullToRefresh } from \"./PullToRefresh\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\n"],"mappings":"AAMA,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AA4BtD,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,6BAA6B,QAAQ,4BAA4B;AAK1E,SACE,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wCAAwC,EACxC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,QAC5B,uBAAuB;AAC9B,SAAgC,kBAAkB,EAAE,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEjG,SAAS,SAAS,QAAQ,aAAa;AAcvC,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAMpD,SACE,OAAO,IAAI,cAAc,EAEzB,qBAAqB,EACrB,kBAAkB,QACb,kBAAkB;AACzB,SAAS,OAAO,IAAI,UAAU,QAA8B,cAAc;AAC1E,SACE,gBAAgB,EAChB,kBAAkB,QAIb,oBAAoB;AAW3B,SACE,qBAAqB,EACrB,OAAO,IAAI,WAAW,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,QACzB,eAAe;AAEtB,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAa1D,SACE,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,QACX,gBAAgB;AAEvB,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAWpD,SACE,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,QACX,YAAY;AASnB,SAAS,OAAO,IAAI,kBAAkB,QAAQ,sBAAsB;AAQpE,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewCardsProps,\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport { type BottomSheetProps, bottomSheetOptions, default as BottomSheet } from \"./BottomSheet\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelActionSecondary,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport type { MobileShellHeaderProps, MobileShellProps } from \"./MobileShell\";\nexport { default as MobileShell, observeMobileShell } from \"./MobileShell\";\nexport { default as Navigation, type NavigationProps } from \"./Navigation\";\nexport {\n createNavigation,\n findNavigationItem,\n type NavigationController,\n type NavigationItem,\n type NavigationOptions,\n} from \"./navigation-model\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type { PullToRefreshProps, PullToRefreshState } from \"./PullToRefresh\";\nexport { default as PullToRefresh } from \"./PullToRefresh\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\nexport type { TabBarItem, TabBarProps } from \"./TabBar\";\nexport { default as TabBar } from \"./TabBar\";\n"],"mappings":"AAMA,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AA4BtD,SAAS,OAAO,IAAI,YAAY,QAAQ,gBAAgB;AAExD,SAAS,6BAA6B,QAAQ,4BAA4B;AAK1E,SACE,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wCAAwC,EACxC,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,QAC5B,uBAAuB;AAC9B,SAAgC,kBAAkB,EAAE,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEjG,SAAS,SAAS,QAAQ,aAAa;AAcvC,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAMpD,SACE,OAAO,IAAI,cAAc,EAEzB,qBAAqB,EACrB,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,OAAO,IAAI,WAAW,EAAE,kBAAkB,QAAQ,eAAe;AAC1E,SAAS,OAAO,IAAI,UAAU,QAA8B,cAAc;AAC1E,SACE,gBAAgB,EAChB,kBAAkB,QAIb,oBAAoB;AAW3B,SACE,qBAAqB,EACrB,OAAO,IAAI,WAAW,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,QACzB,eAAe;AAEtB,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAa1D,SACE,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,QACX,gBAAgB;AAEvB,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAWpD,SACE,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,QACX,YAAY;AASnB,SAAS,OAAO,IAAI,kBAAkB,QAAQ,sBAAsB;AAQpE,SAAS,OAAO,IAAI,aAAa,QAAQ,iBAAiB;AAE1D,SAAS,OAAO,IAAI,MAAM,QAAQ,UAAU","ignoreList":[]}
@@ -1,63 +1,54 @@
1
1
  import { ssrElement as _$ssrElement } from "solid-js/web";
2
2
  import { mergeProps as _$mergeProps } from "solid-js/web";
3
- import { createComponent as _$createComponent } from "solid-js/web";
4
3
  import { ssr as _$ssr } from "solid-js/web";
4
+ import { createComponent as _$createComponent } from "solid-js/web";
5
5
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
6
6
  import { escape as _$escape } from "solid-js/web";
7
- var _tmpl$ = ["<i class=\"", "\" aria-hidden=\"true\"></i>"],
8
- _tmpl$2 = ["<div", ">", "<div", ">", "", "", "</div></div>"],
9
- _tmpl$3 = ["<p", ">", "</p>"],
10
- _tmpl$4 = ["<div class=\"", "\">", "</div>"],
11
- _tmpl$5 = ["<div class=\"", "\"", ">", "</div>"];
7
+ var _tmpl$ = ["<div", ">", "", "", "</div>"],
8
+ _tmpl$2 = ["<div", "><p", ">", "</p>", "</div>"],
9
+ _tmpl$3 = ["<span", ">", "</span>"],
10
+ _tmpl$4 = ["<p", ">", "</p>"],
11
+ _tmpl$5 = ["<div class=\"", "\">", "</div>"],
12
+ _tmpl$6 = ["<div class=\"", "\"", ">", "</div>"];
12
13
  import { For, Show, splitProps } from "solid-js";
13
14
  export const NOTICE_CARD_CLASSES = {
14
15
  root: "k2b-notice-card",
15
- inner: "k2b-notice-card__inner",
16
- icon: "k2b-notice-card__icon",
17
16
  content: "k2b-notice-card__content",
17
+ head: "k2b-notice-card__head",
18
18
  title: "k2b-notice-card__title",
19
+ meta: "k2b-notice-card__meta",
19
20
  description: "k2b-notice-card__description",
20
21
  body: "k2b-notice-card__body"
21
22
  };
22
- export const NOTICE_CARD_ICONS = {
23
- neutral: "ti ti-note",
24
- info: "ti ti-info-circle",
25
- success: "ti ti-circle-check",
26
- warning: "ti ti-alert-triangle",
27
- danger: "ti ti-alert-circle"
28
- };
29
23
  function NoticeCardComponent(props) {
30
- const [local, articleProps] = splitProps(props, ["tone", "title", "detail", "children", "icon", "class", "bodyClass"]);
31
- const tone = () => local.tone ?? "warning";
24
+ const [local, articleProps] = splitProps(props, ["tone", "title", "detail", "meta", "children", "class", "bodyClass"]);
32
25
  return _$ssrElement("article", _$mergeProps(articleProps, {
33
26
  get ["class"]() {
34
27
  return `${NOTICE_CARD_CLASSES.root} ${local.class ?? ""}`;
35
28
  },
36
29
  get ["data-tone"]() {
37
- return tone();
38
- }
39
- }), _$ssr(_tmpl$2, _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.inner, true), false), _$escape(_$createComponent(Show, {
40
- get when() {
41
- return local.icon !== false;
42
- },
43
- get children() {
44
- return _$ssr(_tmpl$, `${typeof local.icon === "string" ? _$escape(local.icon, true) : _$escape(NOTICE_CARD_ICONS[tone()], true)} ${_$escape(NOTICE_CARD_CLASSES.icon, true)}`);
30
+ return local.tone ?? "neutral";
45
31
  }
46
- })), _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.content, true), false), _$escape(_$createComponent(Show, {
32
+ }), _$ssr(_tmpl$, _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.content, true), false), _$escape(_$createComponent(Show, {
47
33
  get when() {
48
34
  return local.title;
49
35
  },
50
- children: title => _$ssr(_tmpl$3, _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.title, true), false), _$escape(title()))
36
+ children: title => _$ssr(_tmpl$2, _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.head, true), false), _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.title, true), false), _$escape(title()), _$escape(_$createComponent(Show, {
37
+ get when() {
38
+ return local.meta;
39
+ },
40
+ children: meta => _$ssr(_tmpl$3, _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.meta, true), false), _$escape(meta()))
41
+ })))
51
42
  })), _$escape(_$createComponent(Show, {
52
43
  get when() {
53
44
  return local.detail;
54
45
  },
55
- children: detail => _$ssr(_tmpl$3, _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.description, true), false), _$escape(detail()))
46
+ children: detail => _$ssr(_tmpl$4, _$ssrAttribute("class", _$escape(NOTICE_CARD_CLASSES.description, true), false), _$escape(detail()))
56
47
  })), _$escape(_$createComponent(Show, {
57
48
  get when() {
58
49
  return local.children;
59
50
  },
60
- children: body => _$ssr(_tmpl$4, `${_$escape(NOTICE_CARD_CLASSES.body, true)} ${_$escape(local.bodyClass ?? "", true)}`, _$escape(body()))
51
+ children: body => _$ssr(_tmpl$5, `${_$escape(NOTICE_CARD_CLASSES.body, true)} ${_$escape(local.bodyClass ?? "", true)}`, _$escape(body()))
61
52
  }))), false);
62
53
  }
63
54
  function NoticeGrid(props) {
@@ -67,7 +58,7 @@ function NoticeGrid(props) {
67
58
  return props.items.length > 0;
68
59
  },
69
60
  get children() {
70
- return _$ssr(_tmpl$5, `k2b-notice-grid ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-columns", _$escape(columns(), true), false), _$escape(_$createComponent(For, {
61
+ return _$ssr(_tmpl$6, `k2b-notice-grid ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-columns", _$escape(columns(), true), false), _$escape(_$createComponent(For, {
71
62
  get each() {
72
63
  return props.items;
73
64
  },
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["surfaces/NoticeCard.tsx"],"sourcesContent":["import { For, type JSX, Show, splitProps } from \"solid-js\";\nimport type { IntentTone } from \"../semantics\";\n\nexport type NoticeTone = Extract<IntentTone, \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\">;\n\ntype NoticeCardContentProps =\n | { title: JSX.Element; detail?: JSX.Element; children?: JSX.Element }\n | { title?: never; detail?: never; children: JSX.Element };\n\nexport type NoticeCardProps = Omit<JSX.HTMLAttributes<HTMLElement>, \"children\" | \"class\" | \"title\"> &\n NoticeCardContentProps & {\n tone?: NoticeTone;\n icon?: string | false;\n class?: string;\n bodyClass?: string;\n };\n\nexport const NOTICE_CARD_CLASSES = {\n root: \"k2b-notice-card\",\n inner: \"k2b-notice-card__inner\",\n icon: \"k2b-notice-card__icon\",\n content: \"k2b-notice-card__content\",\n title: \"k2b-notice-card__title\",\n description: \"k2b-notice-card__description\",\n body: \"k2b-notice-card__body\",\n} as const;\n\nexport const NOTICE_CARD_ICONS: Readonly<Record<NoticeTone, string>> = {\n neutral: \"ti ti-note\",\n info: \"ti ti-info-circle\",\n success: \"ti ti-circle-check\",\n warning: \"ti ti-alert-triangle\",\n danger: \"ti ti-alert-circle\",\n};\n\nfunction NoticeCardComponent(props: NoticeCardProps): JSX.Element {\n const [local, articleProps] = splitProps(props, [\"tone\", \"title\", \"detail\", \"children\", \"icon\", \"class\", \"bodyClass\"]);\n const tone = () => local.tone ?? \"warning\";\n return (\n <article {...articleProps} class={`${NOTICE_CARD_CLASSES.root} ${local.class ?? \"\"}`} data-tone={tone()}>\n <div class={NOTICE_CARD_CLASSES.inner}>\n <Show when={local.icon !== false}>\n <i\n class={`${typeof local.icon === \"string\" ? local.icon : NOTICE_CARD_ICONS[tone()]} ${NOTICE_CARD_CLASSES.icon}`}\n aria-hidden=\"true\"\n />\n </Show>\n <div class={NOTICE_CARD_CLASSES.content}>\n <Show when={local.title}>{(title) => <p class={NOTICE_CARD_CLASSES.title}>{title()}</p>}</Show>\n <Show when={local.detail}>{(detail) => <p class={NOTICE_CARD_CLASSES.description}>{detail()}</p>}</Show>\n <Show when={local.children}>{(body) => <div class={`${NOTICE_CARD_CLASSES.body} ${local.bodyClass ?? \"\"}`}>{body()}</div>}</Show>\n </div>\n </div>\n </article>\n );\n}\n\nexport type NoticeGridProps<T> = {\n items: readonly T[];\n children: (item: T) => JSX.Element;\n class?: string;\n};\n\nfunction NoticeGrid<T>(props: NoticeGridProps<T>): JSX.Element {\n const columns = () => (props.items.length <= 1 ? \"one\" : props.items.length === 2 ? \"two\" : \"three\");\n return (\n <Show when={props.items.length > 0}>\n <div class={`k2b-notice-grid ${props.class ?? \"\"}`} data-columns={columns()}>\n <For each={props.items}>{(item) => props.children(item)}</For>\n </div>\n </Show>\n );\n}\n\nexport const NoticeCard = Object.assign(NoticeCardComponent, { Grid: NoticeGrid });\nexport default NoticeCard;\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,GAAG,EAAY,IAAI,EAAE,UAAU,QAAQ,UAAU;AAiB1D,OAAO,MAAM,mBAAmB,GAAG;EACjC,IAAI,EAAE,iBAAiB;EACvB,KAAK,EAAE,wBAAwB;EAC/B,IAAI,EAAE,uBAAuB;EAC7B,OAAO,EAAE,0BAA0B;EACnC,KAAK,EAAE,wBAAwB;EAC/B,WAAW,EAAE,8BAA8B;EAC3C,IAAI,EAAE;AACR,CAAU;AAEV,OAAO,MAAM,iBAAuD,GAAG;EACrE,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,mBAAmB;EACzB,OAAO,EAAE,oBAAoB;EAC7B,OAAO,EAAE,sBAAsB;EAC/B,MAAM,EAAE;AACV,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAsB,EAAe;EAChE,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;EACtH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,IAAI,SAAS;EAC1C,4CACe,YAAY;IAAA;MAAA,OAAS,GAAG,mBAAmB,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;IAAA;IAAA;MAAA,OAAa,IAAI,CAAC,CAAC;IAAA;EAAA,oDACzF,mBAAmB,CAAC,KAAK,4CAClC,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI,KAAK,KAAK;IAAA;IAAA;MAAA,qBAErB,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,YAAG,KAAK,CAAC,IAAI,mBAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAI,mBAAmB,CAAC,IAAI,SAAE;IAAA;EAAA,sCAIvG,mBAAmB,CAAC,OAAO,4CACpC,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA,UAAI,KAAK,oDAAe,mBAAmB,CAAC,KAAK,0BAAG,KAAK,CAAC,CAAC;EAAK,gCACtF,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,MAAM;IAAA;IAAA,UAAI,MAAM,oDAAe,mBAAmB,CAAC,WAAW,0BAAG,MAAM,CAAC,CAAC;EAAK,gCAC/F,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,UAAI,IAAI,mBAAiB,YAAG,mBAAmB,CAAC,IAAI,oBAAI,KAAK,CAAC,SAAS,IAAI,EAAE,SAAE,WAAG,IAAI,CAAC,CAAC;EAAO;AAKnI;AAQA,SAAS,UAAU,CAAI,KAAyB,EAAe;EAC7D,MAAM,OAAO,GAAG,MAAO,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,GAAG,OAAQ;EACpG,yBACG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;IAAA;IAAA;MAAA,sBACpB,4BAAmB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,0CAAgB,OAAO,CAAC,CAAC,4CACxE,GAAG;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA,UAAI,IAAI,IAAK,KAAK,CAAC,QAAQ,CAAC,IAAI;MAAC;IAAA;EAAA;AAI/D;AAEA,OAAO,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE;EAAE,IAAI,EAAE;AAAW,CAAC,CAAC;AAClF,eAAe,UAAU","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["surfaces/NoticeCard.tsx"],"sourcesContent":["import { For, type JSX, Show, splitProps } from \"solid-js\";\nimport type { IntentTone } from \"../semantics\";\n\nexport type NoticeTone = Extract<IntentTone, \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\">;\n\ntype NoticeCardContentProps =\n | { title: JSX.Element; detail?: JSX.Element; meta?: JSX.Element; children?: JSX.Element }\n | { title?: never; detail?: never; meta?: never; children: JSX.Element };\n\nexport type NoticeCardProps = Omit<JSX.HTMLAttributes<HTMLElement>, \"children\" | \"class\" | \"title\"> &\n NoticeCardContentProps & {\n tone?: NoticeTone;\n class?: string;\n bodyClass?: string;\n };\n\nexport const NOTICE_CARD_CLASSES = {\n root: \"k2b-notice-card\",\n content: \"k2b-notice-card__content\",\n head: \"k2b-notice-card__head\",\n title: \"k2b-notice-card__title\",\n meta: \"k2b-notice-card__meta\",\n description: \"k2b-notice-card__description\",\n body: \"k2b-notice-card__body\",\n} as const;\n\nfunction NoticeCardComponent(props: NoticeCardProps): JSX.Element {\n const [local, articleProps] = splitProps(props, [\"tone\", \"title\", \"detail\", \"meta\", \"children\", \"class\", \"bodyClass\"]);\n return (\n <article {...articleProps} class={`${NOTICE_CARD_CLASSES.root} ${local.class ?? \"\"}`} data-tone={local.tone ?? \"neutral\"}>\n <div class={NOTICE_CARD_CLASSES.content}>\n <Show when={local.title}>\n {(title) => (\n <div class={NOTICE_CARD_CLASSES.head}>\n <p class={NOTICE_CARD_CLASSES.title}>{title()}</p>\n <Show when={local.meta}>{(meta) => <span class={NOTICE_CARD_CLASSES.meta}>{meta()}</span>}</Show>\n </div>\n )}\n </Show>\n <Show when={local.detail}>{(detail) => <p class={NOTICE_CARD_CLASSES.description}>{detail()}</p>}</Show>\n <Show when={local.children}>{(body) => <div class={`${NOTICE_CARD_CLASSES.body} ${local.bodyClass ?? \"\"}`}>{body()}</div>}</Show>\n </div>\n </article>\n );\n}\n\nexport type NoticeGridProps<T> = {\n items: readonly T[];\n children: (item: T) => JSX.Element;\n class?: string;\n};\n\nfunction NoticeGrid<T>(props: NoticeGridProps<T>): JSX.Element {\n const columns = () => (props.items.length <= 1 ? \"one\" : props.items.length === 2 ? \"two\" : \"three\");\n return (\n <Show when={props.items.length > 0}>\n <div class={`k2b-notice-grid ${props.class ?? \"\"}`} data-columns={columns()}>\n <For each={props.items}>{(item) => props.children(item)}</For>\n </div>\n </Show>\n );\n}\n\nexport const NoticeCard = Object.assign(NoticeCardComponent, { Grid: NoticeGrid });\nexport default NoticeCard;\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,GAAG,EAAY,IAAI,EAAE,UAAU,QAAQ,UAAU;AAgB1D,OAAO,MAAM,mBAAmB,GAAG;EACjC,IAAI,EAAE,iBAAiB;EACvB,OAAO,EAAE,0BAA0B;EACnC,IAAI,EAAE,uBAAuB;EAC7B,KAAK,EAAE,wBAAwB;EAC/B,IAAI,EAAE,uBAAuB;EAC7B,WAAW,EAAE,8BAA8B;EAC3C,IAAI,EAAE;AACR,CAAU;AAEV,SAAS,mBAAmB,CAAC,KAAsB,EAAe;EAChE,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;EACtH,4CACe,YAAY;IAAA;MAAA,OAAS,GAAG,mBAAmB,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;IAAA;IAAA;MAAA,OAAa,KAAK,CAAC,IAAI,IAAI,SAAS;IAAA;EAAA,mDAC1G,mBAAmB,CAAC,OAAO,4CACpC,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA,UACnB,KAAK,oDACO,mBAAmB,CAAC,IAAI,kDACxB,mBAAmB,CAAC,KAAK,0BAAG,KAAK,CAAC,CAAC,8BAC5C,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,IAAI;MAAA;MAAA,UAAI,IAAI,oDAAkB,mBAAmB,CAAC,IAAI,0BAAG,IAAI,CAAC,CAAC;IAAQ;EAE5F,gCAEF,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,MAAM;IAAA;IAAA,UAAI,MAAM,oDAAe,mBAAmB,CAAC,WAAW,0BAAG,MAAM,CAAC,CAAC;EAAK,gCAC/F,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,UAAI,IAAI,mBAAiB,YAAG,mBAAmB,CAAC,IAAI,oBAAI,KAAK,CAAC,SAAS,IAAI,EAAE,SAAE,WAAG,IAAI,CAAC,CAAC;EAAO;AAIjI;AAQA,SAAS,UAAU,CAAI,KAAyB,EAAe;EAC7D,MAAM,OAAO,GAAG,MAAO,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,GAAG,OAAQ;EACpG,yBACG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;IAAA;IAAA;MAAA,sBACpB,4BAAmB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,0CAAgB,OAAO,CAAC,CAAC,4CACxE,GAAG;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA,UAAI,IAAI,IAAK,KAAK,CAAC,QAAQ,CAAC,IAAI;MAAC;IAAA;EAAA;AAI/D;AAEA,OAAO,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE;EAAE,IAAI,EAAE;AAAW,CAAC,CAAC;AAClF,eAAe,UAAU","ignoreList":[]}
@@ -2,7 +2,7 @@ export { Avatar } from "./Avatar";
2
2
  export { DescriptionList } from "./DescriptionList";
3
3
  export { LinkCard } from "./LinkCard";
4
4
  export { NotFoundState } from "./NotFoundState";
5
- export { NOTICE_CARD_CLASSES, NOTICE_CARD_ICONS, NoticeCard } from "./NoticeCard";
5
+ export { NOTICE_CARD_CLASSES, NoticeCard } from "./NoticeCard";
6
6
  export { Paper } from "./Paper";
7
7
  export { default as Placeholder } from "./Placeholder";
8
8
  export { ProgressBar } from "./ProgressBar";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["surfaces/index.ts"],"sourcesContent":["export type { AvatarProps, AvatarSize } from \"./Avatar\";\nexport { Avatar } from \"./Avatar\";\nexport type { DescriptionListItem, DescriptionListProps } from \"./DescriptionList\";\nexport { DescriptionList } from \"./DescriptionList\";\nexport type { LinkCardColor, LinkCardProps } from \"./LinkCard\";\nexport { LinkCard } from \"./LinkCard\";\nexport type { NotFoundStateAction, NotFoundStateProps } from \"./NotFoundState\";\nexport { NotFoundState } from \"./NotFoundState\";\nexport type { NoticeCardProps, NoticeGridProps, NoticeTone } from \"./NoticeCard\";\nexport { NOTICE_CARD_CLASSES, NOTICE_CARD_ICONS, NoticeCard } from \"./NoticeCard\";\nexport type { PaperProps, PaperTag } from \"./Paper\";\nexport { Paper } from \"./Paper\";\nexport type {\n PlaceholderAlign,\n PlaceholderProps,\n PlaceholderState,\n PlaceholderSurface,\n PlaceholderVariant,\n} from \"./Placeholder\";\nexport { default as Placeholder } from \"./Placeholder\";\nexport type { ProgressBarProps, ProgressBarTone } from \"./ProgressBar\";\nexport { ProgressBar } from \"./ProgressBar\";\nexport type { ProgressRingProps, ProgressRingTone } from \"./ProgressRing\";\nexport { ProgressRing } from \"./ProgressRing\";\nexport type { StatCellAccent, StatCellProps, StatCellTone } from \"./StatCell\";\nexport { StatCell } from \"./StatCell\";\nexport type {\n StatGridAction,\n StatGridColumns,\n StatGridProps,\n StatGridSize,\n StatGridSurface,\n} from \"./StatGrid\";\nexport { StatGrid } from \"./StatGrid\";\nexport type { StatusBadgeProps, StatusTone } from \"./StatusBadge\";\nexport { StatusBadge } from \"./StatusBadge\";\nexport type { TagProps, TagSize } from \"./Tag\";\nexport { Tag } from \"./Tag\";\n"],"mappings":"AACA,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,eAAe,QAAQ,mBAAmB;AAEnD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,QAAQ,cAAc;AAEjF,SAAS,KAAK,QAAQ,SAAS;AAQ/B,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,GAAG,QAAQ,OAAO","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["surfaces/index.ts"],"sourcesContent":["export type { AvatarProps, AvatarSize } from \"./Avatar\";\nexport { Avatar } from \"./Avatar\";\nexport type { DescriptionListItem, DescriptionListProps } from \"./DescriptionList\";\nexport { DescriptionList } from \"./DescriptionList\";\nexport type { LinkCardColor, LinkCardProps } from \"./LinkCard\";\nexport { LinkCard } from \"./LinkCard\";\nexport type { NotFoundStateAction, NotFoundStateProps } from \"./NotFoundState\";\nexport { NotFoundState } from \"./NotFoundState\";\nexport type { NoticeCardProps, NoticeGridProps, NoticeTone } from \"./NoticeCard\";\nexport { NOTICE_CARD_CLASSES, NoticeCard } from \"./NoticeCard\";\nexport type { PaperProps, PaperTag } from \"./Paper\";\nexport { Paper } from \"./Paper\";\nexport type {\n PlaceholderAlign,\n PlaceholderProps,\n PlaceholderState,\n PlaceholderSurface,\n PlaceholderVariant,\n} from \"./Placeholder\";\nexport { default as Placeholder } from \"./Placeholder\";\nexport type { ProgressBarProps, ProgressBarTone } from \"./ProgressBar\";\nexport { ProgressBar } from \"./ProgressBar\";\nexport type { ProgressRingProps, ProgressRingTone } from \"./ProgressRing\";\nexport { ProgressRing } from \"./ProgressRing\";\nexport type { StatCellAccent, StatCellProps, StatCellTone } from \"./StatCell\";\nexport { StatCell } from \"./StatCell\";\nexport type {\n StatGridAction,\n StatGridColumns,\n StatGridProps,\n StatGridSize,\n StatGridSurface,\n} from \"./StatGrid\";\nexport { StatGrid } from \"./StatGrid\";\nexport type { StatusBadgeProps, StatusTone } from \"./StatusBadge\";\nexport { StatusBadge } from \"./StatusBadge\";\nexport type { TagProps, TagSize } from \"./Tag\";\nexport { Tag } from \"./Tag\";\n"],"mappings":"AACA,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,eAAe,QAAQ,mBAAmB;AAEnD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,mBAAmB,EAAE,UAAU,QAAQ,cAAc;AAE9D,SAAS,KAAK,QAAQ,SAAS;AAQ/B,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,GAAG,QAAQ,OAAO","ignoreList":[]}