@k2b/ui 0.15.0 → 0.17.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 (32) hide show
  1. package/README.md +5 -0
  2. package/dist/base.css +1097 -0
  3. package/dist/browser/chat/ChatPrimitives.js +19 -16
  4. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  5. package/dist/browser/chat/ChatTimeline.js +110 -87
  6. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  7. package/dist/browser/content/StructuredDataPreview.js +4 -1
  8. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  9. package/dist/browser/intl/messages.js +4 -0
  10. package/dist/browser/intl/messages.js.map +1 -1
  11. package/dist/browser/layout/Navigation.js +59 -28
  12. package/dist/browser/layout/Navigation.js.map +1 -1
  13. package/dist/browser/layout/navigation-model.js +1 -1
  14. package/dist/browser/layout/navigation-model.js.map +1 -1
  15. package/dist/ssr/chat/ChatPrimitives.js +2 -2
  16. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  17. package/dist/ssr/chat/ChatTimeline.js +110 -87
  18. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  19. package/dist/ssr/content/StructuredDataPreview.js +1 -1
  20. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  21. package/dist/ssr/intl/messages.js +4 -0
  22. package/dist/ssr/intl/messages.js.map +1 -1
  23. package/dist/ssr/layout/Navigation.js +27 -1
  24. package/dist/ssr/layout/Navigation.js.map +1 -1
  25. package/dist/ssr/layout/navigation-model.js +1 -1
  26. package/dist/ssr/layout/navigation-model.js.map +1 -1
  27. package/dist/styles.css +1 -1
  28. package/dist/types/chat/ChatPrimitives.d.ts +2 -0
  29. package/dist/types/chat/ChatTimeline.d.ts +2 -0
  30. package/dist/types/intl/messages.d.ts +2 -0
  31. package/dist/types/layout/navigation-model.d.ts +11 -0
  32. package/package.json +3 -1
@@ -13,11 +13,12 @@ var _tmpl$ = ["<ul class=\"k2b-navigation__list\">", "</ul>"],
13
13
  _tmpl$7 = ["<button type=\"button\" class=\"k2b-navigation__disclosure\"", "", "><i", " aria-hidden=\"true\"></i></button>"],
14
14
  _tmpl$8 = "<i class=\"ti ti-dots\" aria-hidden=\"true\"></i>",
15
15
  _tmpl$9 = ["<div", ">", "</div>"],
16
- _tmpl$0 = ["<li><div class=\"k2b-navigation__row\"", ">", "", "", "</div>", "</li>"],
16
+ _tmpl$0 = ["<li><div class=\"k2b-navigation__row\"", ">", "", "", "", "</div>", "</li>"],
17
17
  _tmpl$1 = ["<button type=\"button\" class=\"k2b-navigation__control\"", ">", "", "</button>"],
18
18
  _tmpl$10 = ["<nav class=\"k2b-navigation\"", ">", "</nav>"];
19
19
  import { documentNavigate, Link } from "@k2b/ssr/nav";
20
20
  import { createSignal, For, Show } from "solid-js";
21
+ import { IconButton } from "../actions/Button";
21
22
  import { Dropdown } from "../actions/Dropdown";
22
23
  import { useUiMessages } from "../intl/messages";
23
24
  export default function Navigation(props) {
@@ -127,6 +128,31 @@ export default function Navigation(props) {
127
128
  get children() {
128
129
  return _$ssr(_tmpl$7, _$ssrAttribute("aria-label", _$escape(item().label, true), false) + _$ssrAttribute("aria-expanded", _$escape(open(), true), false), _$ssrAttribute("disabled", disabled(), true), _$ssrAttribute("class", open() ? "ti ti-chevron-down" : "ti ti-chevron-right", false));
129
130
  }
131
+ })), _$escape(_$createComponent(For, {
132
+ get each() {
133
+ return (item().inlineActions ?? []).map(action => action.id);
134
+ },
135
+ children: actionId => {
136
+ const action = () => item().inlineActions?.find(entry => entry.id === actionId);
137
+ return _$createComponent(Show, {
138
+ get when() {
139
+ return action();
140
+ },
141
+ children: current => _$createComponent(IconButton, {
142
+ "class": "k2b-navigation__inline-action",
143
+ get label() {
144
+ return current().label;
145
+ },
146
+ get disabled() {
147
+ return disabled() || current().disabled;
148
+ },
149
+ onClick: () => void activate(actionId),
150
+ get children() {
151
+ return _$ssr(_tmpl$2, _$ssrAttribute("class", _$escape(current().icon, true), false));
152
+ }
153
+ })
154
+ });
155
+ }
130
156
  })), _$escape(_$createComponent(Show, {
131
157
  get when() {
132
158
  return item().actions?.length;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/Navigation.tsx"],"sourcesContent":["import { documentNavigate, Link } from \"@k2b/ssr/nav\";\nimport { createSignal, For, Show } from \"solid-js\";\nimport { Dropdown } from \"../actions/Dropdown\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { NavigationController, NavigationItem } from \"./navigation-model\";\n\nexport type NavigationProps = {\n navigation: NavigationController;\n label: string;\n /** A host can finish dismissing its menu before the selected operation runs. */\n beforeSelect?: () => boolean | void | Promise<boolean | void>;\n};\n\nexport default function Navigation(props: NavigationProps) {\n const messages = useUiMessages();\n const [expanded, setExpanded] = createSignal<Record<string, boolean>>({});\n const ready = async () => (await props.beforeSelect?.()) !== false;\n const activate = async (id: string) => {\n if (await ready()) await props.navigation.activate(id);\n };\n const Rows = (rows: { items: readonly NavigationItem[]; disabled?: boolean }) => (\n <ul class=\"k2b-navigation__list\">\n <For each={rows.items.map((item) => item.id)}>\n {(id) => {\n const item = () => rows.items.find((entry) => entry.id === id)!;\n const disabled = () => rows.disabled || item().disabled;\n // `expanded` hands disclosure to the item's owner; every other toggle stays local to this renderer.\n const open = () => item().expanded ?? expanded()[id] ?? item().defaultExpanded ?? true;\n const toggle = () => {\n if (item().expanded !== undefined) props.navigation.onExpandedChange?.(id, !open());\n else setExpanded((current) => ({ ...current, [id]: !open() }));\n };\n const content = () => (\n <>\n <Show when={item().icon}>\n <i class={item().icon} aria-hidden=\"true\" />\n </Show>\n <span class=\"k2b-navigation__copy\">\n <span>{item().label}</span>\n <Show when={item().description}>\n <small>{item().description}</small>\n </Show>\n </span>\n <Show when={item().color}>\n <span class=\"k2b-navigation__color\" style={{ \"background-color\": item().color }} />\n </Show>\n <Show when={item().badge !== undefined}>\n <span class=\"k2b-navigation__badge\">{item().badge}</span>\n </Show>\n </>\n );\n return (\n <li>\n <div class=\"k2b-navigation__row\" data-active={item().active || undefined}>\n <Show\n when={item().href}\n fallback={\n <button\n type=\"button\"\n class=\"k2b-navigation__control\"\n disabled={disabled()}\n aria-expanded={!item().action ? open() : undefined}\n onClick={() => (item().action ? void activate(id) : toggle())}\n >\n {content()}\n <Show when={!item().action && item().children?.length}>\n <i class={open() ? \"ti ti-chevron-down\" : \"ti ti-chevron-right\"} aria-hidden=\"true\" />\n </Show>\n </button>\n }\n >\n {(href) => (\n <Link\n class=\"k2b-navigation__control\"\n href={href()}\n aria-current={item().active ? \"page\" : undefined}\n aria-disabled={disabled() || undefined}\n tabIndex={disabled() ? -1 : undefined}\n scroll={item().scroll}\n onNavigate={async (event) => {\n if (!(await ready())) return;\n if (item().navigation === \"enhanced\" && props.navigation.onNavigate) await props.navigation.onNavigate(event);\n else event.fallback();\n }}\n onClick={(event) => {\n if (disabled()) {\n event.preventDefault();\n return;\n }\n if (!item().action || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)\n return;\n // Local opening can fetch before committing navigation, outside a view transition.\n event.preventDefault();\n void activate(id);\n }}\n >\n {content()}\n </Link>\n )}\n </Show>\n <Show when={(item().href || item().action) && item().children?.length}>\n <button\n type=\"button\"\n class=\"k2b-navigation__disclosure\"\n aria-label={item().label}\n aria-expanded={open()}\n disabled={disabled()}\n onClick={toggle}\n >\n <i class={open() ? \"ti ti-chevron-down\" : \"ti ti-chevron-right\"} aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={item().actions?.length}>\n <Dropdown.Root\n items={(item().actions ?? []).map((action) => ({\n label: action.label,\n icon: action.icon,\n description: action.description,\n disabled: disabled() || action.disabled,\n action: () => {\n if (action.href)\n void ready().then((allowed) => {\n if (allowed) documentNavigate(action.href!);\n });\n else void activate(action.id);\n },\n }))}\n >\n <Dropdown.Trigger iconOnly label={`${item().label}: ${messages().rowAction}`} variant=\"ghost\">\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n <Show when={item().children?.length}>\n <div hidden={!open()}>\n <Rows items={item().children ?? []} disabled={disabled()} />\n </div>\n </Show>\n </li>\n );\n }}\n </For>\n </ul>\n );\n return (\n <nav class=\"k2b-navigation\" aria-label={props.label}>\n <Rows items={props.navigation.items()} />\n </nav>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/Navigation.tsx"],"sourcesContent":["import { documentNavigate, Link } from \"@k2b/ssr/nav\";\nimport { createSignal, For, Show } from \"solid-js\";\nimport { IconButton } from \"../actions/Button\";\nimport { Dropdown } from \"../actions/Dropdown\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { NavigationController, NavigationItem } from \"./navigation-model\";\n\nexport type NavigationProps = {\n navigation: NavigationController;\n label: string;\n /** A host can finish dismissing its menu before the selected operation runs. */\n beforeSelect?: () => boolean | void | Promise<boolean | void>;\n};\n\nexport default function Navigation(props: NavigationProps) {\n const messages = useUiMessages();\n const [expanded, setExpanded] = createSignal<Record<string, boolean>>({});\n const ready = async () => (await props.beforeSelect?.()) !== false;\n const activate = async (id: string) => {\n if (await ready()) await props.navigation.activate(id);\n };\n const Rows = (rows: { items: readonly NavigationItem[]; disabled?: boolean }) => (\n <ul class=\"k2b-navigation__list\">\n <For each={rows.items.map((item) => item.id)}>\n {(id) => {\n const item = () => rows.items.find((entry) => entry.id === id)!;\n const disabled = () => rows.disabled || item().disabled;\n // `expanded` hands disclosure to the item's owner; every other toggle stays local to this renderer.\n const open = () => item().expanded ?? expanded()[id] ?? item().defaultExpanded ?? true;\n const toggle = () => {\n if (item().expanded !== undefined) props.navigation.onExpandedChange?.(id, !open());\n else setExpanded((current) => ({ ...current, [id]: !open() }));\n };\n const content = () => (\n <>\n <Show when={item().icon}>\n <i class={item().icon} aria-hidden=\"true\" />\n </Show>\n <span class=\"k2b-navigation__copy\">\n <span>{item().label}</span>\n <Show when={item().description}>\n <small>{item().description}</small>\n </Show>\n </span>\n <Show when={item().color}>\n <span class=\"k2b-navigation__color\" style={{ \"background-color\": item().color }} />\n </Show>\n <Show when={item().badge !== undefined}>\n <span class=\"k2b-navigation__badge\">{item().badge}</span>\n </Show>\n </>\n );\n return (\n <li>\n <div class=\"k2b-navigation__row\" data-active={item().active || undefined}>\n <Show\n when={item().href}\n fallback={\n <button\n type=\"button\"\n class=\"k2b-navigation__control\"\n disabled={disabled()}\n aria-expanded={!item().action ? open() : undefined}\n onClick={() => (item().action ? void activate(id) : toggle())}\n >\n {content()}\n <Show when={!item().action && item().children?.length}>\n <i class={open() ? \"ti ti-chevron-down\" : \"ti ti-chevron-right\"} aria-hidden=\"true\" />\n </Show>\n </button>\n }\n >\n {(href) => (\n <Link\n class=\"k2b-navigation__control\"\n href={href()}\n aria-current={item().active ? \"page\" : undefined}\n aria-disabled={disabled() || undefined}\n tabIndex={disabled() ? -1 : undefined}\n scroll={item().scroll}\n onNavigate={async (event) => {\n if (!(await ready())) return;\n if (item().navigation === \"enhanced\" && props.navigation.onNavigate) await props.navigation.onNavigate(event);\n else event.fallback();\n }}\n onClick={(event) => {\n if (disabled()) {\n event.preventDefault();\n return;\n }\n if (!item().action || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)\n return;\n // Local opening can fetch before committing navigation, outside a view transition.\n event.preventDefault();\n void activate(id);\n }}\n >\n {content()}\n </Link>\n )}\n </Show>\n <Show when={(item().href || item().action) && item().children?.length}>\n <button\n type=\"button\"\n class=\"k2b-navigation__disclosure\"\n aria-label={item().label}\n aria-expanded={open()}\n disabled={disabled()}\n onClick={toggle}\n >\n <i class={open() ? \"ti ti-chevron-down\" : \"ti ti-chevron-right\"} aria-hidden=\"true\" />\n </button>\n </Show>\n {/* Keyed by id like the rows, so a button keeps its identity and focus when the model updates. */}\n <For each={(item().inlineActions ?? []).map((action) => action.id)}>\n {(actionId) => {\n const action = () => item().inlineActions?.find((entry) => entry.id === actionId);\n return (\n <Show when={action()}>\n {(current) => (\n <IconButton\n class=\"k2b-navigation__inline-action\"\n label={current().label}\n disabled={disabled() || current().disabled}\n onClick={() => void activate(actionId)}\n >\n <i class={current().icon} aria-hidden=\"true\" />\n </IconButton>\n )}\n </Show>\n );\n }}\n </For>\n <Show when={item().actions?.length}>\n <Dropdown.Root\n items={(item().actions ?? []).map((action) => ({\n label: action.label,\n icon: action.icon,\n description: action.description,\n disabled: disabled() || action.disabled,\n action: () => {\n if (action.href)\n void ready().then((allowed) => {\n if (allowed) documentNavigate(action.href!);\n });\n else void activate(action.id);\n },\n }))}\n >\n <Dropdown.Trigger iconOnly label={`${item().label}: ${messages().rowAction}`} variant=\"ghost\">\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n <Show when={item().children?.length}>\n <div hidden={!open()}>\n <Rows items={item().children ?? []} disabled={disabled()} />\n </div>\n </Show>\n </li>\n );\n }}\n </For>\n </ul>\n );\n return (\n <nav class=\"k2b-navigation\" aria-label={props.label}>\n <Rows items={props.navigation.items()} />\n </nav>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -4,7 +4,7 @@ export function findNavigationItem(items, id) {
4
4
  for (const item of items) {
5
5
  if (item.disabled) continue;
6
6
  if (item.id === id) return item;
7
- const found = findNavigationItem(item.children ?? [], id) ?? findNavigationItem(item.actions ?? [], id);
7
+ const found = findNavigationItem(item.children ?? [], id) ?? findNavigationItem(item.inlineActions ?? [], id) ?? findNavigationItem(item.actions ?? [], id);
8
8
  if (found) return found;
9
9
  }
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["layout/navigation-model.ts"],"sourcesContent":["import type { LinkNavigateEvent, NavigationScrollMode } from \"@k2b/ssr/nav\";\nimport type { Accessor } from \"solid-js\";\n\ntype NavigationEntry = {\n id: string;\n label: string;\n icon?: string;\n badge?: string | number;\n description?: string;\n active?: boolean;\n disabled?: boolean;\n color?: string;\n children?: readonly NavigationItem[];\n /** Initial disclosure state; subsequent toggles remain local to the renderer. */\n defaultExpanded?: boolean;\n /** Owner-held disclosure state. The renderer shows it and reports toggles through `onExpandedChange`. */\n expanded?: boolean;\n actions?: readonly NavigationItem[];\n};\n\n/** Serializable presentation. Functions stay with the controller's owning island. */\nexport type NavigationItem = NavigationEntry &\n (\n | { href: string; action?: string; navigation?: \"document\" | \"enhanced\"; scroll?: NavigationScrollMode }\n | { action: string; href?: never; navigation?: never; scroll?: never }\n | { href?: never; action?: never; navigation?: never; scroll?: never; children: readonly NavigationItem[] }\n );\n\nexport type NavigationOptions = {\n items: Accessor<readonly NavigationItem[]>;\n onAction?: (action: string) => void | Promise<void>;\n onNavigate?: (event: LinkNavigateEvent) => void | Promise<void>;\n /** Receives disclosure toggles of items that carry `expanded`; the owner decides the next state. */\n onExpandedChange?: (id: string, expanded: boolean) => void;\n};\n\nexport function findNavigationItem(items: readonly NavigationItem[], id: string): NavigationItem | undefined {\n for (const item of items) {\n if (item.disabled) continue;\n if (item.id === id) return item;\n const found = findNavigationItem(item.children ?? [], id) ?? findNavigationItem(item.actions ?? [], id);\n if (found) return found;\n }\n}\n\n/** One live source for renderers; no router, registry, fetching or persisted state. */\nexport function createNavigation(options: NavigationOptions) {\n return {\n items: options.items,\n onNavigate: options.onNavigate,\n onExpandedChange: options.onExpandedChange,\n async activate(id: string) {\n const item = findNavigationItem(options.items(), id);\n if (item?.action) await options.onAction?.(item.action);\n },\n };\n}\n\nexport type NavigationController = ReturnType<typeof createNavigation>;\n"],"mappings":"AAoBA;;AAgBA,OAAO,SAAS,kBAAkB,CAAC,KAAgC,EAAE,EAAU,EAA8B;EAC3G,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;IACxB,IAAI,IAAI,CAAC,QAAQ,EAAE;IACnB,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,IAAI;IAC/B,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;IACvG,IAAI,KAAK,EAAE,OAAO,KAAK;EACzB;AACF;;AAEA;AACA,OAAO,SAAS,gBAAgB,CAAC,OAA0B,EAAE;EAC3D,OAAO;IACL,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;IAC1C,MAAM,QAAQ,CAAC,EAAU,EAAE;MACzB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;MACpD,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IACzD;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/navigation-model.ts"],"sourcesContent":["import type { LinkNavigateEvent, NavigationScrollMode } from \"@k2b/ssr/nav\";\nimport type { Accessor } from \"solid-js\";\n\ntype NavigationEntry = {\n id: string;\n label: string;\n icon?: string;\n badge?: string | number;\n description?: string;\n active?: boolean;\n disabled?: boolean;\n color?: string;\n children?: readonly NavigationItem[];\n /** Initial disclosure state; subsequent toggles remain local to the renderer. */\n defaultExpanded?: boolean;\n /** Owner-held disclosure state. The renderer shows it and reports toggles through `onExpandedChange`. */\n expanded?: boolean;\n actions?: readonly NavigationItem[];\n /**\n * Square icon buttons in the row, before the `actions` menu. They run an `action`; a destination belongs in a row,\n * where its link keeps modified clicks and new tabs.\n */\n inlineActions?: readonly { id: string; label: string; icon: string; action: string; disabled?: boolean }[];\n};\n\n/** Serializable presentation. Functions stay with the controller's owning island. */\nexport type NavigationItem = NavigationEntry &\n (\n | { href: string; action?: string; navigation?: \"document\" | \"enhanced\"; scroll?: NavigationScrollMode }\n | { action: string; href?: never; navigation?: never; scroll?: never }\n | { href?: never; action?: never; navigation?: never; scroll?: never; children: readonly NavigationItem[] }\n );\n\nexport type NavigationOptions = {\n items: Accessor<readonly NavigationItem[]>;\n onAction?: (action: string) => void | Promise<void>;\n onNavigate?: (event: LinkNavigateEvent) => void | Promise<void>;\n /** Receives disclosure toggles of items that carry `expanded`; the owner decides the next state. */\n onExpandedChange?: (id: string, expanded: boolean) => void;\n};\n\nexport function findNavigationItem(items: readonly NavigationItem[], id: string): NavigationItem | undefined {\n for (const item of items) {\n if (item.disabled) continue;\n if (item.id === id) return item;\n const found =\n findNavigationItem(item.children ?? [], id) ??\n findNavigationItem(item.inlineActions ?? [], id) ??\n findNavigationItem(item.actions ?? [], id);\n if (found) return found;\n }\n}\n\n/** One live source for renderers; no router, registry, fetching or persisted state. */\nexport function createNavigation(options: NavigationOptions) {\n return {\n items: options.items,\n onNavigate: options.onNavigate,\n onExpandedChange: options.onExpandedChange,\n async activate(id: string) {\n const item = findNavigationItem(options.items(), id);\n if (item?.action) await options.onAction?.(item.action);\n },\n };\n}\n\nexport type NavigationController = ReturnType<typeof createNavigation>;\n"],"mappings":"AAyBA;;AAgBA,OAAO,SAAS,kBAAkB,CAAC,KAAgC,EAAE,EAAU,EAA8B;EAC3G,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;IACxB,IAAI,IAAI,CAAC,QAAQ,EAAE;IACnB,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,IAAI;IAC/B,MAAM,KAAK,GACT,kBAAkB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAE,CAAC,IAC3C,kBAAkB,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,EAAE,CAAC,IAChD,kBAAkB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;IAC5C,IAAI,KAAK,EAAE,OAAO,KAAK;EACzB;AACF;;AAEA;AACA,OAAO,SAAS,gBAAgB,CAAC,OAA0B,EAAE;EAC3D,OAAO;IACL,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;IAC1C,MAAM,QAAQ,CAAC,EAAU,EAAE;MACzB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;MACpD,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IACzD;EACF,CAAC;AACH","ignoreList":[]}