@sortsys/ui 0.1.33 → 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;
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,160 +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
- const context = useContext(SSTabsContext);
2225
- if (!context) {
2226
- throw new Error("SSTab must be used within SSTabs");
2227
- }
2228
- const id = createUniqueId();
2229
- const [index, setIndex] = createSignal(null);
2230
- let buttonRef;
2231
- onMount(() => {
2232
- if (!buttonRef) return;
2233
- setIndex(context.registerTab(id, buttonRef));
2234
- });
2235
- onCleanup(() => {
2236
- context.unregisterTab(id);
2237
- });
2238
- const isSelected = () => index() !== null && index() === context.selectedIndex();
2239
- const handleSelect = () => {
2240
- if (props.disabled) return;
2241
- if (index() === null) return;
2242
- context.onSelect(index());
2243
- };
2244
- const handleKeyDown = (event) => {
2245
- if (props.disabled) return;
2246
- const current = index();
2247
- const total = context.count();
2248
- if (current === null || total < 1) return;
2249
- let nextIndex = current;
2250
- if (event.key === "ArrowRight") {
2251
- nextIndex = (current + 1) % total;
2252
- } else if (event.key === "ArrowLeft") {
2253
- nextIndex = (current - 1 + total) % total;
2254
- } else if (event.key === "Home") {
2255
- nextIndex = 0;
2256
- } else if (event.key === "End") {
2257
- nextIndex = total - 1;
2258
- } else {
2259
- return;
2260
- }
2261
- event.preventDefault();
2262
- context.onSelect(nextIndex);
2263
- requestAnimationFrame(() => context.focusTab(nextIndex));
2264
- };
2265
- return (() => {
2266
- var _el$3 = _tmpl$310();
2267
- _el$3.$$keydown = handleKeyDown;
2268
- _el$3.$$click = handleSelect;
2269
- use((el) => buttonRef = el, _el$3);
2270
- insert(_el$3, () => props.children);
2271
- effect((_p$) => {
2272
- 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;
2273
- _v$6 !== _p$.e && className(_el$3, _p$.e = _v$6);
2274
- _p$.t = style(_el$3, _v$7, _p$.t);
2275
- _v$8 !== _p$.a && setAttribute(_el$3, "aria-selected", _p$.a = _v$8);
2276
- _v$9 !== _p$.o && setAttribute(_el$3, "aria-disabled", _p$.o = _v$9);
2277
- _v$0 !== _p$.i && setAttribute(_el$3, "tabindex", _p$.i = _v$0);
2278
- _v$1 !== _p$.n && (_el$3.disabled = _p$.n = _v$1);
2279
- return _p$;
2280
- }, {
2281
- e: void 0,
2282
- t: void 0,
2283
- a: void 0,
2284
- o: void 0,
2285
- i: void 0,
2286
- n: void 0
2287
- });
2288
- return _el$3;
2289
- })();
2290
- }
2291
2256
  delegateEvents(["click", "keydown"]);
2292
2257
  var _tmpl$47 = /* @__PURE__ */ template(`<div><div class=ss_tile__row><div class=ss_tile__content>`);
2293
2258
  var _tmpl$212 = /* @__PURE__ */ template(`<span class=ss_tile__icon>`);
2294
- var _tmpl$311 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
2259
+ var _tmpl$310 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
2295
2260
  var _tmpl$48 = /* @__PURE__ */ template(`<h5 class=ss_tile__title><span class=ss_tile__text>`);
2296
2261
  var _tmpl$57 = /* @__PURE__ */ template(`<div class=ss_tile__subtitle>`);
2297
2262
  var _tmpl$64 = /* @__PURE__ */ template(`<div class=ss_tile__trailing>`);
@@ -2310,7 +2275,7 @@ function SSTile(props) {
2310
2275
  insert(_el$3, (() => {
2311
2276
  var _c$2 = memo(() => !!props.href);
2312
2277
  return () => _c$2() ? (() => {
2313
- var _el$5 = _tmpl$311();
2278
+ var _el$5 = _tmpl$310();
2314
2279
  insert(_el$5, createComponent(SSLink, {
2315
2280
  get href() {
2316
2281
  return props.href;
@@ -2425,4 +2390,4 @@ var SSAwaited = (props) => {
2425
2390
  });
2426
2391
  };
2427
2392
 
2428
- 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,8 +87,9 @@ 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
+ hideIf?: boolean;
92
93
  };
93
94
  type SSDropdownProps = {
94
95
  items: SSDropdownItem[];
@@ -387,32 +388,25 @@ type SSSurfaceProps = {
387
388
  };
388
389
  declare function SSSurface(props: SSSurfaceProps): solid_js.JSX.Element;
389
390
 
390
- type SSTabsOnChange = (props: {
391
- selectedIndex: number;
392
- previousIndex: number;
393
- }) => void;
394
- type SSTabsProps = {
395
- selectedIndex: number;
396
- onChange?: SSTabsOnChange;
397
- children: JSXElement;
391
+ type SSTabItem = {
392
+ label: JSXElement;
393
+ hideIf?: boolean;
394
+ disabled?: boolean;
398
395
  class?: string;
399
396
  style?: string;
400
397
  };
401
- type SSTabListProps = {
402
- children: JSXElement;
403
- class?: string;
404
- style?: string;
398
+ type SSTabsProps = {
399
+ tabs: SSTabItem[];
400
+ selectedIndex: number;
401
+ onChange?: (props: {
402
+ selectedIndex: number;
403
+ previousIndex: number;
404
+ }) => void;
405
405
  ariaLabel?: string;
406
- };
407
- type SSTabProps = {
408
- children: JSXElement;
409
- disabled?: boolean;
410
406
  class?: string;
411
407
  style?: string;
412
408
  };
413
409
  declare function SSTabs(props: SSTabsProps): solid_js.JSX.Element;
414
- declare function SSTabList(props: SSTabListProps): solid_js.JSX.Element;
415
- declare function SSTab(props: SSTabProps): solid_js.JSX.Element;
416
410
 
417
411
  type SSTileProps = {
418
412
  icon?: JSXElement;
@@ -446,4 +440,4 @@ type AwaitedProps = {
446
440
  declare function _Awaited(props: AwaitedProps): solid_js.JSX.Element;
447
441
  declare const SSAwaited: typeof _Awaited;
448
442
 
449
- 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;
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,160 +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
- const context = useContext(SSTabsContext);
2225
- if (!context) {
2226
- throw new Error("SSTab must be used within SSTabs");
2227
- }
2228
- const id = createUniqueId();
2229
- const [index, setIndex] = createSignal(null);
2230
- let buttonRef;
2231
- onMount(() => {
2232
- if (!buttonRef) return;
2233
- setIndex(context.registerTab(id, buttonRef));
2234
- });
2235
- onCleanup(() => {
2236
- context.unregisterTab(id);
2237
- });
2238
- const isSelected = () => index() !== null && index() === context.selectedIndex();
2239
- const handleSelect = () => {
2240
- if (props.disabled) return;
2241
- if (index() === null) return;
2242
- context.onSelect(index());
2243
- };
2244
- const handleKeyDown = (event) => {
2245
- if (props.disabled) return;
2246
- const current = index();
2247
- const total = context.count();
2248
- if (current === null || total < 1) return;
2249
- let nextIndex = current;
2250
- if (event.key === "ArrowRight") {
2251
- nextIndex = (current + 1) % total;
2252
- } else if (event.key === "ArrowLeft") {
2253
- nextIndex = (current - 1 + total) % total;
2254
- } else if (event.key === "Home") {
2255
- nextIndex = 0;
2256
- } else if (event.key === "End") {
2257
- nextIndex = total - 1;
2258
- } else {
2259
- return;
2260
- }
2261
- event.preventDefault();
2262
- context.onSelect(nextIndex);
2263
- requestAnimationFrame(() => context.focusTab(nextIndex));
2264
- };
2265
- return (() => {
2266
- var _el$3 = _tmpl$310();
2267
- _el$3.$$keydown = handleKeyDown;
2268
- _el$3.$$click = handleSelect;
2269
- use((el) => buttonRef = el, _el$3);
2270
- insert(_el$3, () => props.children);
2271
- effect((_p$) => {
2272
- 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;
2273
- _v$6 !== _p$.e && className(_el$3, _p$.e = _v$6);
2274
- _p$.t = style(_el$3, _v$7, _p$.t);
2275
- _v$8 !== _p$.a && setAttribute(_el$3, "aria-selected", _p$.a = _v$8);
2276
- _v$9 !== _p$.o && setAttribute(_el$3, "aria-disabled", _p$.o = _v$9);
2277
- _v$0 !== _p$.i && setAttribute(_el$3, "tabindex", _p$.i = _v$0);
2278
- _v$1 !== _p$.n && (_el$3.disabled = _p$.n = _v$1);
2279
- return _p$;
2280
- }, {
2281
- e: void 0,
2282
- t: void 0,
2283
- a: void 0,
2284
- o: void 0,
2285
- i: void 0,
2286
- n: void 0
2287
- });
2288
- return _el$3;
2289
- })();
2290
- }
2291
2256
  delegateEvents(["click", "keydown"]);
2292
2257
  var _tmpl$47 = /* @__PURE__ */ template(`<div><div class=ss_tile__row><div class=ss_tile__content>`);
2293
2258
  var _tmpl$212 = /* @__PURE__ */ template(`<span class=ss_tile__icon>`);
2294
- var _tmpl$311 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
2259
+ var _tmpl$310 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
2295
2260
  var _tmpl$48 = /* @__PURE__ */ template(`<h5 class=ss_tile__title><span class=ss_tile__text>`);
2296
2261
  var _tmpl$57 = /* @__PURE__ */ template(`<div class=ss_tile__subtitle>`);
2297
2262
  var _tmpl$64 = /* @__PURE__ */ template(`<div class=ss_tile__trailing>`);
@@ -2310,7 +2275,7 @@ function SSTile(props) {
2310
2275
  insert(_el$3, (() => {
2311
2276
  var _c$2 = memo(() => !!props.href);
2312
2277
  return () => _c$2() ? (() => {
2313
- var _el$5 = _tmpl$311();
2278
+ var _el$5 = _tmpl$310();
2314
2279
  insert(_el$5, createComponent(SSLink, {
2315
2280
  get href() {
2316
2281
  return props.href;
@@ -2425,4 +2390,4 @@ var SSAwaited = (props) => {
2425
2390
  });
2426
2391
  };
2427
2392
 
2428
- 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.33",
3
+ "version": "0.1.35",
4
4
  "description": "Simple and beautiful UI library for sortsys",
5
5
  "license": "MIT",
6
6
  "author": "Ludwig Lehnert",