@sortsys/ui 0.1.34 → 0.1.35

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.
package/dist/dev.js CHANGED
@@ -441,6 +441,12 @@ function SSDropdown(props) {
441
441
  const [renderMenu, setRenderMenu] = createSignal(false);
442
442
  const [menuState, setMenuState] = createSignal("closed");
443
443
  let rootRef;
444
+ const visibleItems = () => props.items.map((item, index) => ({
445
+ item,
446
+ index
447
+ })).filter(({
448
+ item
449
+ }) => !item.hideIf);
444
450
  const close = () => setOpen(false);
445
451
  createEffect(() => {
446
452
  if (open()) {
@@ -469,64 +475,72 @@ function SSDropdown(props) {
469
475
  window.removeEventListener("keydown", handleKeyDown);
470
476
  });
471
477
  });
472
- return (() => {
473
- var _el$ = _tmpl$25(), _el$2 = _el$.firstChild;
474
- use((el) => rootRef = el, _el$);
475
- _el$2.$$click = () => setOpen((value) => !value);
476
- insert(_el$2, () => props.icon ?? _tmpl$35());
477
- insert(_el$, createComponent(Show, {
478
- get when() {
479
- return renderMenu();
480
- },
481
- get children() {
482
- var _el$3 = _tmpl$14();
483
- insert(_el$3, createComponent(For, {
484
- get each() {
485
- return props.items.filter((item) => !item.hideIf);
486
- },
487
- children: (item) => (() => {
488
- var _el$5 = _tmpl$43(), _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;
489
- _el$5.$$click = async () => {
490
- close();
491
- await item.onclick?.();
492
- };
493
- insert(_el$6, () => item.icon);
494
- insert(_el$7, () => item.label);
495
- insert(_el$5, (() => {
496
- var _c$ = memo(() => !!item.checked);
497
- return () => _c$() && _tmpl$53();
498
- })(), null);
499
- effect((_p$) => {
500
- var _v$5 = item.checked ? "menuitemcheckbox" : "menuitem", _v$6 = item.checked ? "true" : void 0;
501
- _v$5 !== _p$.e && setAttribute(_el$5, "role", _p$.e = _v$5);
502
- _v$6 !== _p$.t && setAttribute(_el$5, "aria-checked", _p$.t = _v$6);
503
- return _p$;
504
- }, {
505
- e: void 0,
506
- t: void 0
507
- });
508
- return _el$5;
509
- })()
510
- }));
511
- effect(() => setAttribute(_el$3, "data-state", menuState()));
512
- return _el$3;
513
- }
514
- }), null);
515
- effect((_p$) => {
516
- var _v$ = `ss_dropdown ${props.class ?? ""}`, _v$2 = props.style, _v$3 = open(), _v$4 = props.ariaLabel ?? "Aktionen \xF6ffnen";
517
- _v$ !== _p$.e && className(_el$, _p$.e = _v$);
518
- _p$.t = style(_el$, _v$2, _p$.t);
519
- _v$3 !== _p$.a && setAttribute(_el$2, "aria-expanded", _p$.a = _v$3);
520
- _v$4 !== _p$.o && setAttribute(_el$2, "aria-label", _p$.o = _v$4);
521
- return _p$;
522
- }, {
523
- e: void 0,
524
- t: void 0,
525
- a: void 0,
526
- o: void 0
527
- });
528
- return _el$;
529
- })();
478
+ return createComponent(Show, {
479
+ get when() {
480
+ return visibleItems().length > 0;
481
+ },
482
+ get children() {
483
+ var _el$ = _tmpl$25(), _el$2 = _el$.firstChild;
484
+ use((el) => rootRef = el, _el$);
485
+ _el$2.$$click = () => setOpen((value) => !value);
486
+ insert(_el$2, () => props.icon ?? _tmpl$35());
487
+ insert(_el$, createComponent(Show, {
488
+ get when() {
489
+ return renderMenu();
490
+ },
491
+ get children() {
492
+ var _el$3 = _tmpl$14();
493
+ insert(_el$3, createComponent(For, {
494
+ get each() {
495
+ return visibleItems();
496
+ },
497
+ children: ({
498
+ item,
499
+ index
500
+ }) => (() => {
501
+ var _el$5 = _tmpl$43(), _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;
502
+ _el$5.$$click = async () => {
503
+ close();
504
+ await item.onclick?.(index);
505
+ };
506
+ insert(_el$6, () => item.icon);
507
+ insert(_el$7, () => item.label);
508
+ insert(_el$5, (() => {
509
+ var _c$ = memo(() => !!item.checked);
510
+ return () => _c$() && _tmpl$53();
511
+ })(), null);
512
+ effect((_p$) => {
513
+ var _v$5 = item.checked ? "menuitemcheckbox" : "menuitem", _v$6 = item.checked ? "true" : void 0;
514
+ _v$5 !== _p$.e && setAttribute(_el$5, "role", _p$.e = _v$5);
515
+ _v$6 !== _p$.t && setAttribute(_el$5, "aria-checked", _p$.t = _v$6);
516
+ return _p$;
517
+ }, {
518
+ e: void 0,
519
+ t: void 0
520
+ });
521
+ return _el$5;
522
+ })()
523
+ }));
524
+ effect(() => setAttribute(_el$3, "data-state", menuState()));
525
+ return _el$3;
526
+ }
527
+ }), null);
528
+ effect((_p$) => {
529
+ var _v$ = `ss_dropdown ${props.class ?? ""}`, _v$2 = props.style, _v$3 = open(), _v$4 = props.ariaLabel ?? "Aktionen \xF6ffnen";
530
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
531
+ _p$.t = style(_el$, _v$2, _p$.t);
532
+ _v$3 !== _p$.a && setAttribute(_el$2, "aria-expanded", _p$.a = _v$3);
533
+ _v$4 !== _p$.o && setAttribute(_el$2, "aria-label", _p$.o = _v$4);
534
+ return _p$;
535
+ }, {
536
+ e: void 0,
537
+ t: void 0,
538
+ a: void 0,
539
+ o: void 0
540
+ });
541
+ return _el$;
542
+ }
543
+ });
530
544
  }
531
545
  delegateEvents(["click"]);
532
546
  var _tmpl$15 = /* @__PURE__ */ template(`<div><div class=ss_expandable__header role=button tabindex=0><span class=ss_expandable__icon aria-hidden=true></span><span class=ss_expandable__title></span></div><div class=ss_expandable__content style=transition-duration:200ms><div class=ss_expandable__content_inner>`);
@@ -2138,161 +2152,111 @@ function SSSurface(props) {
2138
2152
  return _el$;
2139
2153
  })();
2140
2154
  }
2141
- var _tmpl$41 = /* @__PURE__ */ template(`<div>`);
2142
- var _tmpl$211 = /* @__PURE__ */ template(`<div role=tablist>`);
2143
- var _tmpl$310 = /* @__PURE__ */ template(`<button type=button role=tab>`);
2144
- var SSTabsContext = createContext();
2155
+ var _tmpl$41 = /* @__PURE__ */ template(`<div><div class=ss_tablist role=tablist>`);
2156
+ var _tmpl$211 = /* @__PURE__ */ template(`<button type=button role=tab>`);
2145
2157
  function SSTabs(props) {
2146
- const [tabIds, setTabIds] = createSignal([]);
2147
- const tabElements = /* @__PURE__ */ new Map();
2148
- const count = createMemo(() => tabIds().length);
2149
- const registerTab = (id, element) => {
2150
- let nextIndex = -1;
2151
- tabElements.set(id, element);
2152
- setTabIds((prev) => {
2153
- const existing = prev.indexOf(id);
2154
- if (existing >= 0) {
2155
- nextIndex = existing;
2156
- return prev;
2157
- }
2158
- nextIndex = prev.length;
2159
- return [...prev, id];
2158
+ const visibleTabs = createMemo(() => props.tabs.map((tab, index) => ({
2159
+ ...tab,
2160
+ index
2161
+ })).filter((tab) => !tab.hideIf));
2162
+ let tabRefs = [];
2163
+ const handleSelect = (index) => {
2164
+ if (index === props.selectedIndex) return;
2165
+ props.onChange?.({
2166
+ selectedIndex: index,
2167
+ previousIndex: props.selectedIndex
2160
2168
  });
2161
- return nextIndex;
2162
- };
2163
- const unregisterTab = (id) => {
2164
- tabElements.delete(id);
2165
- setTabIds((prev) => prev.filter((entry) => entry !== id));
2166
2169
  };
2167
- const focusTab = (index) => {
2168
- const id = tabIds()[index];
2169
- if (!id) return;
2170
- tabElements.get(id)?.focus();
2170
+ const focusTab = (position) => {
2171
+ const target = tabRefs[position];
2172
+ if (!target) return;
2173
+ target.focus();
2171
2174
  };
2172
- const onSelect = (nextIndex) => {
2173
- const prevIndex = props.selectedIndex;
2174
- if (nextIndex === prevIndex) return;
2175
- props.onChange?.({
2176
- selectedIndex: nextIndex,
2177
- previousIndex: prevIndex
2178
- });
2175
+ const handleKeyDown = (event, position) => {
2176
+ const tabs = visibleTabs();
2177
+ if (!tabs.length) return;
2178
+ let nextPosition = position;
2179
+ if (event.key === "ArrowRight") {
2180
+ nextPosition = (position + 1) % tabs.length;
2181
+ } else if (event.key === "ArrowLeft") {
2182
+ nextPosition = (position - 1 + tabs.length) % tabs.length;
2183
+ } else if (event.key === "Home") {
2184
+ nextPosition = 0;
2185
+ } else if (event.key === "End") {
2186
+ nextPosition = tabs.length - 1;
2187
+ } else {
2188
+ return;
2189
+ }
2190
+ event.preventDefault();
2191
+ const nextTab = tabs[nextPosition];
2192
+ if (!nextTab || nextTab.disabled) {
2193
+ focusTab(nextPosition);
2194
+ return;
2195
+ }
2196
+ handleSelect(nextTab.index);
2197
+ requestAnimationFrame(() => focusTab(nextPosition));
2179
2198
  };
2180
- return createComponent(SSTabsContext.Provider, {
2181
- value: {
2182
- selectedIndex: () => props.selectedIndex,
2183
- count,
2184
- registerTab,
2185
- unregisterTab,
2186
- onSelect,
2187
- focusTab
2199
+ return createComponent(Show, {
2200
+ get when() {
2201
+ return visibleTabs().length > 0;
2188
2202
  },
2189
2203
  get children() {
2190
- var _el$ = _tmpl$41();
2191
- insert(_el$, () => props.children);
2204
+ var _el$ = _tmpl$41(), _el$2 = _el$.firstChild;
2205
+ insert(_el$2, createComponent(For, {
2206
+ get each() {
2207
+ return visibleTabs();
2208
+ },
2209
+ children: (tab, position) => {
2210
+ const isSelected = () => tab.index === props.selectedIndex;
2211
+ return (() => {
2212
+ var _el$3 = _tmpl$211();
2213
+ _el$3.$$keydown = (event) => handleKeyDown(event, position());
2214
+ _el$3.$$click = () => {
2215
+ if (tab.disabled) return;
2216
+ handleSelect(tab.index);
2217
+ };
2218
+ use((el) => tabRefs[position()] = el, _el$3);
2219
+ insert(_el$3, () => tab.label);
2220
+ effect((_p$) => {
2221
+ var _v$4 = `ss_tab ${tab.class ?? ""}`, _v$5 = tab.style, _v$6 = isSelected(), _v$7 = tab.disabled ? "true" : void 0, _v$8 = isSelected() ? 0 : -1, _v$9 = tab.disabled;
2222
+ _v$4 !== _p$.e && className(_el$3, _p$.e = _v$4);
2223
+ _p$.t = style(_el$3, _v$5, _p$.t);
2224
+ _v$6 !== _p$.a && setAttribute(_el$3, "aria-selected", _p$.a = _v$6);
2225
+ _v$7 !== _p$.o && setAttribute(_el$3, "aria-disabled", _p$.o = _v$7);
2226
+ _v$8 !== _p$.i && setAttribute(_el$3, "tabindex", _p$.i = _v$8);
2227
+ _v$9 !== _p$.n && (_el$3.disabled = _p$.n = _v$9);
2228
+ return _p$;
2229
+ }, {
2230
+ e: void 0,
2231
+ t: void 0,
2232
+ a: void 0,
2233
+ o: void 0,
2234
+ i: void 0,
2235
+ n: void 0
2236
+ });
2237
+ return _el$3;
2238
+ })();
2239
+ }
2240
+ }));
2192
2241
  effect((_p$) => {
2193
- var _v$ = `ss_tabs ${props.class ?? ""}`, _v$2 = props.style;
2242
+ var _v$ = `ss_tabs ${props.class ?? ""}`, _v$2 = props.style, _v$3 = props.ariaLabel;
2194
2243
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
2195
2244
  _p$.t = style(_el$, _v$2, _p$.t);
2245
+ _v$3 !== _p$.a && setAttribute(_el$2, "aria-label", _p$.a = _v$3);
2196
2246
  return _p$;
2197
2247
  }, {
2198
2248
  e: void 0,
2199
- t: void 0
2249
+ t: void 0,
2250
+ a: void 0
2200
2251
  });
2201
2252
  return _el$;
2202
2253
  }
2203
2254
  });
2204
2255
  }
2205
- function SSTabList(props) {
2206
- return (() => {
2207
- var _el$2 = _tmpl$211();
2208
- insert(_el$2, () => props.children);
2209
- effect((_p$) => {
2210
- var _v$3 = `ss_tablist ${props.class ?? ""}`, _v$4 = props.style, _v$5 = props.ariaLabel;
2211
- _v$3 !== _p$.e && className(_el$2, _p$.e = _v$3);
2212
- _p$.t = style(_el$2, _v$4, _p$.t);
2213
- _v$5 !== _p$.a && setAttribute(_el$2, "aria-label", _p$.a = _v$5);
2214
- return _p$;
2215
- }, {
2216
- e: void 0,
2217
- t: void 0,
2218
- a: void 0
2219
- });
2220
- return _el$2;
2221
- })();
2222
- }
2223
- function SSTab(props) {
2224
- if (props.hideIf) return null;
2225
- const context = useContext(SSTabsContext);
2226
- if (!context) {
2227
- throw new Error("SSTab must be used within SSTabs");
2228
- }
2229
- const id = createUniqueId();
2230
- const [index, setIndex] = createSignal(null);
2231
- let buttonRef;
2232
- onMount(() => {
2233
- if (!buttonRef) return;
2234
- setIndex(context.registerTab(id, buttonRef));
2235
- });
2236
- onCleanup(() => {
2237
- context.unregisterTab(id);
2238
- });
2239
- const isSelected = () => index() !== null && index() === context.selectedIndex();
2240
- const handleSelect = () => {
2241
- if (props.disabled) return;
2242
- if (index() === null) return;
2243
- context.onSelect(index());
2244
- };
2245
- const handleKeyDown = (event) => {
2246
- if (props.disabled) return;
2247
- const current = index();
2248
- const total = context.count();
2249
- if (current === null || total < 1) return;
2250
- let nextIndex = current;
2251
- if (event.key === "ArrowRight") {
2252
- nextIndex = (current + 1) % total;
2253
- } else if (event.key === "ArrowLeft") {
2254
- nextIndex = (current - 1 + total) % total;
2255
- } else if (event.key === "Home") {
2256
- nextIndex = 0;
2257
- } else if (event.key === "End") {
2258
- nextIndex = total - 1;
2259
- } else {
2260
- return;
2261
- }
2262
- event.preventDefault();
2263
- context.onSelect(nextIndex);
2264
- requestAnimationFrame(() => context.focusTab(nextIndex));
2265
- };
2266
- return (() => {
2267
- var _el$3 = _tmpl$310();
2268
- _el$3.$$keydown = handleKeyDown;
2269
- _el$3.$$click = handleSelect;
2270
- use((el) => buttonRef = el, _el$3);
2271
- insert(_el$3, () => props.children);
2272
- effect((_p$) => {
2273
- var _v$6 = `ss_tab ${props.class ?? ""}`, _v$7 = props.style, _v$8 = isSelected(), _v$9 = props.disabled ? "true" : void 0, _v$0 = isSelected() ? 0 : -1, _v$1 = props.disabled;
2274
- _v$6 !== _p$.e && className(_el$3, _p$.e = _v$6);
2275
- _p$.t = style(_el$3, _v$7, _p$.t);
2276
- _v$8 !== _p$.a && setAttribute(_el$3, "aria-selected", _p$.a = _v$8);
2277
- _v$9 !== _p$.o && setAttribute(_el$3, "aria-disabled", _p$.o = _v$9);
2278
- _v$0 !== _p$.i && setAttribute(_el$3, "tabindex", _p$.i = _v$0);
2279
- _v$1 !== _p$.n && (_el$3.disabled = _p$.n = _v$1);
2280
- return _p$;
2281
- }, {
2282
- e: void 0,
2283
- t: void 0,
2284
- a: void 0,
2285
- o: void 0,
2286
- i: void 0,
2287
- n: void 0
2288
- });
2289
- return _el$3;
2290
- })();
2291
- }
2292
2256
  delegateEvents(["click", "keydown"]);
2293
2257
  var _tmpl$47 = /* @__PURE__ */ template(`<div><div class=ss_tile__row><div class=ss_tile__content>`);
2294
2258
  var _tmpl$212 = /* @__PURE__ */ template(`<span class=ss_tile__icon>`);
2295
- var _tmpl$311 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
2259
+ var _tmpl$310 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
2296
2260
  var _tmpl$48 = /* @__PURE__ */ template(`<h5 class=ss_tile__title><span class=ss_tile__text>`);
2297
2261
  var _tmpl$57 = /* @__PURE__ */ template(`<div class=ss_tile__subtitle>`);
2298
2262
  var _tmpl$64 = /* @__PURE__ */ template(`<div class=ss_tile__trailing>`);
@@ -2311,7 +2275,7 @@ function SSTile(props) {
2311
2275
  insert(_el$3, (() => {
2312
2276
  var _c$2 = memo(() => !!props.href);
2313
2277
  return () => _c$2() ? (() => {
2314
- var _el$5 = _tmpl$311();
2278
+ var _el$5 = _tmpl$310();
2315
2279
  insert(_el$5, createComponent(SSLink, {
2316
2280
  get href() {
2317
2281
  return props.href;
@@ -2426,4 +2390,4 @@ var SSAwaited = (props) => {
2426
2390
  });
2427
2391
  };
2428
2392
 
2429
- export { SSAttrList, SSAwaited, SSButton, SSCallout, SSChip, SSDataTable, SSDivider, SSDropdown, SSExpandable, SSForm, SSHeader, SSLink, SSModal, SSModalsProvider, SSRow, SSShell, SSSurface, SSTab, SSTabList, SSTabs, SSTile, createSSTile, useSSModals };
2393
+ export { SSAttrList, SSAwaited, SSButton, SSCallout, SSChip, SSDataTable, SSDivider, SSDropdown, SSExpandable, SSForm, SSHeader, SSLink, SSModal, SSModalsProvider, SSRow, SSShell, SSSurface, SSTabs, SSTile, createSSTile, useSSModals };
package/dist/index.d.ts CHANGED
@@ -87,7 +87,7 @@ type PromiseOr$2<T> = Promise<T> | T;
87
87
  type SSDropdownItem = {
88
88
  label: string;
89
89
  icon: JSXElement;
90
- onclick?: () => PromiseOr$2<any>;
90
+ onclick?: (index?: number) => PromiseOr$2<any>;
91
91
  checked?: boolean;
92
92
  hideIf?: boolean;
93
93
  };
@@ -388,33 +388,25 @@ type SSSurfaceProps = {
388
388
  };
389
389
  declare function SSSurface(props: SSSurfaceProps): solid_js.JSX.Element;
390
390
 
391
- type SSTabsOnChange = (props: {
392
- selectedIndex: number;
393
- previousIndex: number;
394
- }) => void;
395
- type SSTabsProps = {
396
- selectedIndex: number;
397
- onChange?: SSTabsOnChange;
398
- children: JSXElement;
391
+ type SSTabItem = {
392
+ label: JSXElement;
393
+ hideIf?: boolean;
394
+ disabled?: boolean;
399
395
  class?: string;
400
396
  style?: string;
401
397
  };
402
- type SSTabListProps = {
403
- children: JSXElement;
404
- class?: string;
405
- style?: string;
398
+ type SSTabsProps = {
399
+ tabs: SSTabItem[];
400
+ selectedIndex: number;
401
+ onChange?: (props: {
402
+ selectedIndex: number;
403
+ previousIndex: number;
404
+ }) => void;
406
405
  ariaLabel?: string;
407
- };
408
- type SSTabProps = {
409
- children: JSXElement;
410
- disabled?: boolean;
411
- hideIf?: boolean;
412
406
  class?: string;
413
407
  style?: string;
414
408
  };
415
409
  declare function SSTabs(props: SSTabsProps): solid_js.JSX.Element;
416
- declare function SSTabList(props: SSTabListProps): solid_js.JSX.Element;
417
- declare function SSTab(props: SSTabProps): solid_js.JSX.Element;
418
410
 
419
411
  type SSTileProps = {
420
412
  icon?: JSXElement;
@@ -448,4 +440,4 @@ type AwaitedProps = {
448
440
  declare function _Awaited(props: AwaitedProps): solid_js.JSX.Element;
449
441
  declare const SSAwaited: typeof _Awaited;
450
442
 
451
- export { SSAttrList, SSAwaited, SSButton, SSCallout, SSChip, type SSColor, SSDataTable, SSDivider, SSDropdown, SSExpandable, SSForm, SSHeader, SSLink, SSModal, SSModalsProvider, SSRow, SSShell, SSSurface, SSTab, SSTabList, SSTabs, SSTile, createSSTile, useSSModals };
443
+ export { SSAttrList, SSAwaited, SSButton, SSCallout, SSChip, type SSColor, SSDataTable, SSDivider, SSDropdown, SSExpandable, SSForm, SSHeader, SSLink, SSModal, SSModalsProvider, SSRow, SSShell, SSSurface, SSTabs, SSTile, createSSTile, useSSModals };
package/dist/index.js CHANGED
@@ -441,6 +441,12 @@ function SSDropdown(props) {
441
441
  const [renderMenu, setRenderMenu] = createSignal(false);
442
442
  const [menuState, setMenuState] = createSignal("closed");
443
443
  let rootRef;
444
+ const visibleItems = () => props.items.map((item, index) => ({
445
+ item,
446
+ index
447
+ })).filter(({
448
+ item
449
+ }) => !item.hideIf);
444
450
  const close = () => setOpen(false);
445
451
  createEffect(() => {
446
452
  if (open()) {
@@ -469,64 +475,72 @@ function SSDropdown(props) {
469
475
  window.removeEventListener("keydown", handleKeyDown);
470
476
  });
471
477
  });
472
- return (() => {
473
- var _el$ = _tmpl$25(), _el$2 = _el$.firstChild;
474
- use((el) => rootRef = el, _el$);
475
- _el$2.$$click = () => setOpen((value) => !value);
476
- insert(_el$2, () => props.icon ?? _tmpl$35());
477
- insert(_el$, createComponent(Show, {
478
- get when() {
479
- return renderMenu();
480
- },
481
- get children() {
482
- var _el$3 = _tmpl$14();
483
- insert(_el$3, createComponent(For, {
484
- get each() {
485
- return props.items.filter((item) => !item.hideIf);
486
- },
487
- children: (item) => (() => {
488
- var _el$5 = _tmpl$43(), _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;
489
- _el$5.$$click = async () => {
490
- close();
491
- await item.onclick?.();
492
- };
493
- insert(_el$6, () => item.icon);
494
- insert(_el$7, () => item.label);
495
- insert(_el$5, (() => {
496
- var _c$ = memo(() => !!item.checked);
497
- return () => _c$() && _tmpl$53();
498
- })(), null);
499
- effect((_p$) => {
500
- var _v$5 = item.checked ? "menuitemcheckbox" : "menuitem", _v$6 = item.checked ? "true" : void 0;
501
- _v$5 !== _p$.e && setAttribute(_el$5, "role", _p$.e = _v$5);
502
- _v$6 !== _p$.t && setAttribute(_el$5, "aria-checked", _p$.t = _v$6);
503
- return _p$;
504
- }, {
505
- e: void 0,
506
- t: void 0
507
- });
508
- return _el$5;
509
- })()
510
- }));
511
- effect(() => setAttribute(_el$3, "data-state", menuState()));
512
- return _el$3;
513
- }
514
- }), null);
515
- effect((_p$) => {
516
- var _v$ = `ss_dropdown ${props.class ?? ""}`, _v$2 = props.style, _v$3 = open(), _v$4 = props.ariaLabel ?? "Aktionen \xF6ffnen";
517
- _v$ !== _p$.e && className(_el$, _p$.e = _v$);
518
- _p$.t = style(_el$, _v$2, _p$.t);
519
- _v$3 !== _p$.a && setAttribute(_el$2, "aria-expanded", _p$.a = _v$3);
520
- _v$4 !== _p$.o && setAttribute(_el$2, "aria-label", _p$.o = _v$4);
521
- return _p$;
522
- }, {
523
- e: void 0,
524
- t: void 0,
525
- a: void 0,
526
- o: void 0
527
- });
528
- return _el$;
529
- })();
478
+ return createComponent(Show, {
479
+ get when() {
480
+ return visibleItems().length > 0;
481
+ },
482
+ get children() {
483
+ var _el$ = _tmpl$25(), _el$2 = _el$.firstChild;
484
+ use((el) => rootRef = el, _el$);
485
+ _el$2.$$click = () => setOpen((value) => !value);
486
+ insert(_el$2, () => props.icon ?? _tmpl$35());
487
+ insert(_el$, createComponent(Show, {
488
+ get when() {
489
+ return renderMenu();
490
+ },
491
+ get children() {
492
+ var _el$3 = _tmpl$14();
493
+ insert(_el$3, createComponent(For, {
494
+ get each() {
495
+ return visibleItems();
496
+ },
497
+ children: ({
498
+ item,
499
+ index
500
+ }) => (() => {
501
+ var _el$5 = _tmpl$43(), _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;
502
+ _el$5.$$click = async () => {
503
+ close();
504
+ await item.onclick?.(index);
505
+ };
506
+ insert(_el$6, () => item.icon);
507
+ insert(_el$7, () => item.label);
508
+ insert(_el$5, (() => {
509
+ var _c$ = memo(() => !!item.checked);
510
+ return () => _c$() && _tmpl$53();
511
+ })(), null);
512
+ effect((_p$) => {
513
+ var _v$5 = item.checked ? "menuitemcheckbox" : "menuitem", _v$6 = item.checked ? "true" : void 0;
514
+ _v$5 !== _p$.e && setAttribute(_el$5, "role", _p$.e = _v$5);
515
+ _v$6 !== _p$.t && setAttribute(_el$5, "aria-checked", _p$.t = _v$6);
516
+ return _p$;
517
+ }, {
518
+ e: void 0,
519
+ t: void 0
520
+ });
521
+ return _el$5;
522
+ })()
523
+ }));
524
+ effect(() => setAttribute(_el$3, "data-state", menuState()));
525
+ return _el$3;
526
+ }
527
+ }), null);
528
+ effect((_p$) => {
529
+ var _v$ = `ss_dropdown ${props.class ?? ""}`, _v$2 = props.style, _v$3 = open(), _v$4 = props.ariaLabel ?? "Aktionen \xF6ffnen";
530
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
531
+ _p$.t = style(_el$, _v$2, _p$.t);
532
+ _v$3 !== _p$.a && setAttribute(_el$2, "aria-expanded", _p$.a = _v$3);
533
+ _v$4 !== _p$.o && setAttribute(_el$2, "aria-label", _p$.o = _v$4);
534
+ return _p$;
535
+ }, {
536
+ e: void 0,
537
+ t: void 0,
538
+ a: void 0,
539
+ o: void 0
540
+ });
541
+ return _el$;
542
+ }
543
+ });
530
544
  }
531
545
  delegateEvents(["click"]);
532
546
  var _tmpl$15 = /* @__PURE__ */ template(`<div><div class=ss_expandable__header role=button tabindex=0><span class=ss_expandable__icon aria-hidden=true></span><span class=ss_expandable__title></span></div><div class=ss_expandable__content style=transition-duration:200ms><div class=ss_expandable__content_inner>`);
@@ -2138,161 +2152,111 @@ function SSSurface(props) {
2138
2152
  return _el$;
2139
2153
  })();
2140
2154
  }
2141
- var _tmpl$41 = /* @__PURE__ */ template(`<div>`);
2142
- var _tmpl$211 = /* @__PURE__ */ template(`<div role=tablist>`);
2143
- var _tmpl$310 = /* @__PURE__ */ template(`<button type=button role=tab>`);
2144
- var SSTabsContext = createContext();
2155
+ var _tmpl$41 = /* @__PURE__ */ template(`<div><div class=ss_tablist role=tablist>`);
2156
+ var _tmpl$211 = /* @__PURE__ */ template(`<button type=button role=tab>`);
2145
2157
  function SSTabs(props) {
2146
- const [tabIds, setTabIds] = createSignal([]);
2147
- const tabElements = /* @__PURE__ */ new Map();
2148
- const count = createMemo(() => tabIds().length);
2149
- const registerTab = (id, element) => {
2150
- let nextIndex = -1;
2151
- tabElements.set(id, element);
2152
- setTabIds((prev) => {
2153
- const existing = prev.indexOf(id);
2154
- if (existing >= 0) {
2155
- nextIndex = existing;
2156
- return prev;
2157
- }
2158
- nextIndex = prev.length;
2159
- return [...prev, id];
2158
+ const visibleTabs = createMemo(() => props.tabs.map((tab, index) => ({
2159
+ ...tab,
2160
+ index
2161
+ })).filter((tab) => !tab.hideIf));
2162
+ let tabRefs = [];
2163
+ const handleSelect = (index) => {
2164
+ if (index === props.selectedIndex) return;
2165
+ props.onChange?.({
2166
+ selectedIndex: index,
2167
+ previousIndex: props.selectedIndex
2160
2168
  });
2161
- return nextIndex;
2162
- };
2163
- const unregisterTab = (id) => {
2164
- tabElements.delete(id);
2165
- setTabIds((prev) => prev.filter((entry) => entry !== id));
2166
2169
  };
2167
- const focusTab = (index) => {
2168
- const id = tabIds()[index];
2169
- if (!id) return;
2170
- tabElements.get(id)?.focus();
2170
+ const focusTab = (position) => {
2171
+ const target = tabRefs[position];
2172
+ if (!target) return;
2173
+ target.focus();
2171
2174
  };
2172
- const onSelect = (nextIndex) => {
2173
- const prevIndex = props.selectedIndex;
2174
- if (nextIndex === prevIndex) return;
2175
- props.onChange?.({
2176
- selectedIndex: nextIndex,
2177
- previousIndex: prevIndex
2178
- });
2175
+ const handleKeyDown = (event, position) => {
2176
+ const tabs = visibleTabs();
2177
+ if (!tabs.length) return;
2178
+ let nextPosition = position;
2179
+ if (event.key === "ArrowRight") {
2180
+ nextPosition = (position + 1) % tabs.length;
2181
+ } else if (event.key === "ArrowLeft") {
2182
+ nextPosition = (position - 1 + tabs.length) % tabs.length;
2183
+ } else if (event.key === "Home") {
2184
+ nextPosition = 0;
2185
+ } else if (event.key === "End") {
2186
+ nextPosition = tabs.length - 1;
2187
+ } else {
2188
+ return;
2189
+ }
2190
+ event.preventDefault();
2191
+ const nextTab = tabs[nextPosition];
2192
+ if (!nextTab || nextTab.disabled) {
2193
+ focusTab(nextPosition);
2194
+ return;
2195
+ }
2196
+ handleSelect(nextTab.index);
2197
+ requestAnimationFrame(() => focusTab(nextPosition));
2179
2198
  };
2180
- return createComponent(SSTabsContext.Provider, {
2181
- value: {
2182
- selectedIndex: () => props.selectedIndex,
2183
- count,
2184
- registerTab,
2185
- unregisterTab,
2186
- onSelect,
2187
- focusTab
2199
+ return createComponent(Show, {
2200
+ get when() {
2201
+ return visibleTabs().length > 0;
2188
2202
  },
2189
2203
  get children() {
2190
- var _el$ = _tmpl$41();
2191
- insert(_el$, () => props.children);
2204
+ var _el$ = _tmpl$41(), _el$2 = _el$.firstChild;
2205
+ insert(_el$2, createComponent(For, {
2206
+ get each() {
2207
+ return visibleTabs();
2208
+ },
2209
+ children: (tab, position) => {
2210
+ const isSelected = () => tab.index === props.selectedIndex;
2211
+ return (() => {
2212
+ var _el$3 = _tmpl$211();
2213
+ _el$3.$$keydown = (event) => handleKeyDown(event, position());
2214
+ _el$3.$$click = () => {
2215
+ if (tab.disabled) return;
2216
+ handleSelect(tab.index);
2217
+ };
2218
+ use((el) => tabRefs[position()] = el, _el$3);
2219
+ insert(_el$3, () => tab.label);
2220
+ effect((_p$) => {
2221
+ var _v$4 = `ss_tab ${tab.class ?? ""}`, _v$5 = tab.style, _v$6 = isSelected(), _v$7 = tab.disabled ? "true" : void 0, _v$8 = isSelected() ? 0 : -1, _v$9 = tab.disabled;
2222
+ _v$4 !== _p$.e && className(_el$3, _p$.e = _v$4);
2223
+ _p$.t = style(_el$3, _v$5, _p$.t);
2224
+ _v$6 !== _p$.a && setAttribute(_el$3, "aria-selected", _p$.a = _v$6);
2225
+ _v$7 !== _p$.o && setAttribute(_el$3, "aria-disabled", _p$.o = _v$7);
2226
+ _v$8 !== _p$.i && setAttribute(_el$3, "tabindex", _p$.i = _v$8);
2227
+ _v$9 !== _p$.n && (_el$3.disabled = _p$.n = _v$9);
2228
+ return _p$;
2229
+ }, {
2230
+ e: void 0,
2231
+ t: void 0,
2232
+ a: void 0,
2233
+ o: void 0,
2234
+ i: void 0,
2235
+ n: void 0
2236
+ });
2237
+ return _el$3;
2238
+ })();
2239
+ }
2240
+ }));
2192
2241
  effect((_p$) => {
2193
- var _v$ = `ss_tabs ${props.class ?? ""}`, _v$2 = props.style;
2242
+ var _v$ = `ss_tabs ${props.class ?? ""}`, _v$2 = props.style, _v$3 = props.ariaLabel;
2194
2243
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
2195
2244
  _p$.t = style(_el$, _v$2, _p$.t);
2245
+ _v$3 !== _p$.a && setAttribute(_el$2, "aria-label", _p$.a = _v$3);
2196
2246
  return _p$;
2197
2247
  }, {
2198
2248
  e: void 0,
2199
- t: void 0
2249
+ t: void 0,
2250
+ a: void 0
2200
2251
  });
2201
2252
  return _el$;
2202
2253
  }
2203
2254
  });
2204
2255
  }
2205
- function SSTabList(props) {
2206
- return (() => {
2207
- var _el$2 = _tmpl$211();
2208
- insert(_el$2, () => props.children);
2209
- effect((_p$) => {
2210
- var _v$3 = `ss_tablist ${props.class ?? ""}`, _v$4 = props.style, _v$5 = props.ariaLabel;
2211
- _v$3 !== _p$.e && className(_el$2, _p$.e = _v$3);
2212
- _p$.t = style(_el$2, _v$4, _p$.t);
2213
- _v$5 !== _p$.a && setAttribute(_el$2, "aria-label", _p$.a = _v$5);
2214
- return _p$;
2215
- }, {
2216
- e: void 0,
2217
- t: void 0,
2218
- a: void 0
2219
- });
2220
- return _el$2;
2221
- })();
2222
- }
2223
- function SSTab(props) {
2224
- if (props.hideIf) return null;
2225
- const context = useContext(SSTabsContext);
2226
- if (!context) {
2227
- throw new Error("SSTab must be used within SSTabs");
2228
- }
2229
- const id = createUniqueId();
2230
- const [index, setIndex] = createSignal(null);
2231
- let buttonRef;
2232
- onMount(() => {
2233
- if (!buttonRef) return;
2234
- setIndex(context.registerTab(id, buttonRef));
2235
- });
2236
- onCleanup(() => {
2237
- context.unregisterTab(id);
2238
- });
2239
- const isSelected = () => index() !== null && index() === context.selectedIndex();
2240
- const handleSelect = () => {
2241
- if (props.disabled) return;
2242
- if (index() === null) return;
2243
- context.onSelect(index());
2244
- };
2245
- const handleKeyDown = (event) => {
2246
- if (props.disabled) return;
2247
- const current = index();
2248
- const total = context.count();
2249
- if (current === null || total < 1) return;
2250
- let nextIndex = current;
2251
- if (event.key === "ArrowRight") {
2252
- nextIndex = (current + 1) % total;
2253
- } else if (event.key === "ArrowLeft") {
2254
- nextIndex = (current - 1 + total) % total;
2255
- } else if (event.key === "Home") {
2256
- nextIndex = 0;
2257
- } else if (event.key === "End") {
2258
- nextIndex = total - 1;
2259
- } else {
2260
- return;
2261
- }
2262
- event.preventDefault();
2263
- context.onSelect(nextIndex);
2264
- requestAnimationFrame(() => context.focusTab(nextIndex));
2265
- };
2266
- return (() => {
2267
- var _el$3 = _tmpl$310();
2268
- _el$3.$$keydown = handleKeyDown;
2269
- _el$3.$$click = handleSelect;
2270
- use((el) => buttonRef = el, _el$3);
2271
- insert(_el$3, () => props.children);
2272
- effect((_p$) => {
2273
- var _v$6 = `ss_tab ${props.class ?? ""}`, _v$7 = props.style, _v$8 = isSelected(), _v$9 = props.disabled ? "true" : void 0, _v$0 = isSelected() ? 0 : -1, _v$1 = props.disabled;
2274
- _v$6 !== _p$.e && className(_el$3, _p$.e = _v$6);
2275
- _p$.t = style(_el$3, _v$7, _p$.t);
2276
- _v$8 !== _p$.a && setAttribute(_el$3, "aria-selected", _p$.a = _v$8);
2277
- _v$9 !== _p$.o && setAttribute(_el$3, "aria-disabled", _p$.o = _v$9);
2278
- _v$0 !== _p$.i && setAttribute(_el$3, "tabindex", _p$.i = _v$0);
2279
- _v$1 !== _p$.n && (_el$3.disabled = _p$.n = _v$1);
2280
- return _p$;
2281
- }, {
2282
- e: void 0,
2283
- t: void 0,
2284
- a: void 0,
2285
- o: void 0,
2286
- i: void 0,
2287
- n: void 0
2288
- });
2289
- return _el$3;
2290
- })();
2291
- }
2292
2256
  delegateEvents(["click", "keydown"]);
2293
2257
  var _tmpl$47 = /* @__PURE__ */ template(`<div><div class=ss_tile__row><div class=ss_tile__content>`);
2294
2258
  var _tmpl$212 = /* @__PURE__ */ template(`<span class=ss_tile__icon>`);
2295
- var _tmpl$311 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
2259
+ var _tmpl$310 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
2296
2260
  var _tmpl$48 = /* @__PURE__ */ template(`<h5 class=ss_tile__title><span class=ss_tile__text>`);
2297
2261
  var _tmpl$57 = /* @__PURE__ */ template(`<div class=ss_tile__subtitle>`);
2298
2262
  var _tmpl$64 = /* @__PURE__ */ template(`<div class=ss_tile__trailing>`);
@@ -2311,7 +2275,7 @@ function SSTile(props) {
2311
2275
  insert(_el$3, (() => {
2312
2276
  var _c$2 = memo(() => !!props.href);
2313
2277
  return () => _c$2() ? (() => {
2314
- var _el$5 = _tmpl$311();
2278
+ var _el$5 = _tmpl$310();
2315
2279
  insert(_el$5, createComponent(SSLink, {
2316
2280
  get href() {
2317
2281
  return props.href;
@@ -2426,4 +2390,4 @@ var SSAwaited = (props) => {
2426
2390
  });
2427
2391
  };
2428
2392
 
2429
- export { SSAttrList, SSAwaited, SSButton, SSCallout, SSChip, SSDataTable, SSDivider, SSDropdown, SSExpandable, SSForm, SSHeader, SSLink, SSModal, SSModalsProvider, SSRow, SSShell, SSSurface, SSTab, SSTabList, SSTabs, SSTile, createSSTile, useSSModals };
2393
+ export { SSAttrList, SSAwaited, SSButton, SSCallout, SSChip, SSDataTable, SSDivider, SSDropdown, SSExpandable, SSForm, SSHeader, SSLink, SSModal, SSModalsProvider, SSRow, SSShell, SSSurface, SSTabs, SSTile, createSSTile, useSSModals };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sortsys/ui",
3
- "version": "0.1.34",
3
+ "version": "0.1.35",
4
4
  "description": "Simple and beautiful UI library for sortsys",
5
5
  "license": "MIT",
6
6
  "author": "Ludwig Lehnert",