@elmethis/qwik 1.0.0-alpha.29 → 1.0.0-alpha.31

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/lib/style.css CHANGED
@@ -1,4 +1,4 @@
1
- ._elm-tabs_1fco0_1 {
1
+ ._elm-tabs_fka8s_1 {
2
2
  margin-block-start: var(--elmethis-margin-block-start);
3
3
  display: flex;
4
4
  flex-direction: column;
@@ -11,15 +11,20 @@
11
11
  background-color: var(--elmethis-color-surface-raised);
12
12
  }
13
13
 
14
- ._tab-container_1fco0_14 {
14
+ ._tab-container_fka8s_14 {
15
15
  display: flex;
16
16
  flex-direction: row;
17
17
  border-bottom: solid 1px oklch(from var(--elmethis-color-primary) l c h / 30%);
18
+ overflow-x: auto;
19
+ scrollbar-width: thin;
20
+ scrollbar-color: var(--elmethis-color-neutral-weak)
21
+ var(--elmethis-color-surface-base);
18
22
  }
19
23
 
20
- ._tab_1fco0_14 {
24
+ ._tab_fka8s_14 {
21
25
  box-sizing: border-box;
22
26
  min-width: 6rem;
27
+ flex-shrink: 0;
23
28
  padding: 1rem;
24
29
  margin: 0;
25
30
  cursor: pointer;
@@ -34,7 +39,7 @@
34
39
  color: var(--elmethis-scoped-color, var(--elmethis-color-neutral));
35
40
  user-select: none;
36
41
 
37
- &._active_1fco0_37 {
42
+ &._active_fka8s_42 {
38
43
  background-color: oklch(from var(--elmethis-color-primary) l c h / 5%);
39
44
  border-bottom-color: var(--elmethis-color-primary);
40
45
  cursor: default;
@@ -45,12 +50,12 @@
45
50
  }
46
51
  }
47
52
 
48
- ._tab-content_1fco0_48 {
53
+ ._tab-content_fka8s_53 {
49
54
  width: 100%;
50
55
  margin: 0;
51
56
  }
52
57
 
53
- ._tab-content-inner_1fco0_53 {
58
+ ._tab-content-inner_fka8s_58 {
54
59
  box-sizing: border-box;
55
60
  padding: 1em;
56
61
  }
@@ -1754,14 +1759,74 @@
1754
1759
  list-style-type: none;
1755
1760
  }
1756
1761
  }
1757
- ._elm-table_14qfo_1 {
1762
+ /* Non-scrolling frame: owns the outer spacing and pins the edge shadows so they
1763
+ stay glued to the viewport edges while the table scrolls underneath. */
1764
+ ._elm-table-frame_wl7v3_3 {
1765
+ position: relative;
1766
+ width: 100%;
1758
1767
  margin-block-start: var(--elmethis-margin-block-start);
1768
+ }
1769
+
1770
+ ._elm-table-frame_wl7v3_3::before,
1771
+ ._elm-table-frame_wl7v3_3::after {
1772
+ content: "";
1773
+ position: absolute;
1774
+ inset-block: 0;
1775
+ width: 1.5rem;
1776
+ z-index: 2;
1777
+ pointer-events: none;
1778
+ opacity: 0;
1779
+ transition: opacity 200ms;
1780
+ }
1781
+
1782
+ ._elm-table-frame_wl7v3_3::before {
1783
+ inset-inline-start: 0;
1784
+ background: linear-gradient(
1785
+ to right,
1786
+ oklch(from var(--elmethis-color-surface-sunken) l c h / 50%),
1787
+ transparent
1788
+ );
1789
+ }
1790
+
1791
+ ._elm-table-frame_wl7v3_3::after {
1792
+ inset-inline-end: 0;
1793
+ background: linear-gradient(
1794
+ to left,
1795
+ oklch(from var(--elmethis-color-surface-sunken) l c h / 50%),
1796
+ transparent
1797
+ );
1798
+ }
1799
+
1800
+ /* Shadows are revealed only when there is content to scroll toward, set from the
1801
+ scroll position in elm-table.tsx. */
1802
+ ._elm-table-frame_wl7v3_3[data-overflow-start]::before {
1803
+ opacity: 1;
1804
+ }
1805
+
1806
+ ._elm-table-frame_wl7v3_3[data-overflow-end]::after {
1807
+ opacity: 1;
1808
+ }
1809
+
1810
+ /* The actual scroller. Mirrors the house pattern from elm-code-block. */
1811
+ ._elm-table-scroll_wl7v3_50 {
1812
+ overflow-x: auto;
1813
+ scrollbar-width: thin;
1814
+ scrollbar-color: var(--elmethis-color-primary-weak)
1815
+ var(--elmethis-color-surface-base);
1816
+ }
1817
+
1818
+ ._elm-table-scroll_wl7v3_50:focus-visible {
1819
+ outline: 2px solid var(--elmethis-color-primary);
1820
+ outline-offset: 2px;
1821
+ }
1822
+
1823
+ ._elm-table_wl7v3_3 {
1759
1824
  border-collapse: collapse;
1760
1825
  border-spacing: 0;
1761
1826
  box-shadow: 0 0 0.125rem rgb(0 0 0 / 20%);
1762
1827
  }
1763
1828
 
1764
- ._caption_14qfo_8 {
1829
+ ._caption_wl7v3_68 {
1765
1830
  position: relative;
1766
1831
  width: 100%;
1767
1832
  display: inline-flex;
@@ -1771,18 +1836,46 @@
1771
1836
  margin-block-end: 1rem;
1772
1837
  }
1773
1838
 
1774
- ._caption-inner_14qfo_18 {
1839
+ ._caption-inner_wl7v3_78 {
1775
1840
  display: inline-flex;
1776
1841
  justify-content: center;
1777
1842
  align-items: center;
1778
1843
  gap: 0.25rem;
1779
1844
  }
1780
1845
 
1781
- ._spacing_14qfo_25 {
1846
+ ._spacing_wl7v3_85 {
1782
1847
  flex-grow: 1;
1783
1848
  height: 1px;
1784
1849
  background-color: rgb(128 128 128 / 20%);
1785
1850
  }
1851
+
1852
+ /* Sticky label column. When the first column holds row headers, pin it so the
1853
+ labels stay visible while the data columns scroll. The structural
1854
+ `:first-child` selector targets the lead cell of every row regardless of
1855
+ whether the caller threaded a `columnIndex` prop, and an opaque background
1856
+ (matched to each row's stripe) keeps scrolled cells from bleeding through. */
1857
+ ._sticky-row-header_wl7v3_96 :where(thead, tbody) tr > :first-child {
1858
+ position: sticky;
1859
+ inset-inline-start: 0;
1860
+ z-index: 1;
1861
+ box-shadow: 1px 0 0 oklch(from var(--elmethis-color-primary-weak) l c h / 50%);
1862
+ }
1863
+
1864
+ ._sticky-row-header_wl7v3_96 thead tr > :first-child {
1865
+ background-color: var(--elmethis-color-surface-sunken);
1866
+ }
1867
+
1868
+ ._sticky-row-header_wl7v3_96 tbody tr:nth-child(odd) > :first-child {
1869
+ background-color: var(--elmethis-color-surface-raised);
1870
+ }
1871
+
1872
+ ._sticky-row-header_wl7v3_96 tbody tr:nth-child(even) > :first-child {
1873
+ background-color: var(--elmethis-color-surface-base);
1874
+ }
1875
+
1876
+ ._sticky-row-header_wl7v3_96 tbody tr:hover > :first-child {
1877
+ background-color: var(--elmethis-color-surface-sunken);
1878
+ }
1786
1879
  ._elm-table-header_jhft7_1 {
1787
1880
  text-align: left;
1788
1881
  transition:
@@ -6,6 +6,7 @@ type Story = StoryObj<ElmTabsProps>;
6
6
  export declare const Primary: Story;
7
7
  export declare const DefaultSelected: Story;
8
8
  export declare const Controlled: Story;
9
+ export declare const Scrollable: Story;
9
10
  export declare const UncontrolledClickTest: Story;
10
11
  export declare const DefaultValueTest: Story;
11
12
  export declare const ControlledSignalTest: Story;
@@ -9,3 +9,4 @@ export declare const ArtistOnly: Story;
9
9
  export declare const FilenameFallback: Story;
10
10
  export declare const BigSeekStep: Story;
11
11
  export declare const Errored: Story;
12
+ export declare const Short: Story;
@@ -3,4 +3,11 @@ import { type ElmTableProps } from "./elm-table";
3
3
  declare const meta: Meta<ElmTableProps>;
4
4
  export default meta;
5
5
  type Story = StoryObj<ElmTableProps>;
6
+ /**
7
+ * Wide table inside a narrow (mobile-sized) frame. The table scrolls
8
+ * horizontally, edge shadows hint at off-screen columns, and the row-header
9
+ * column stays pinned via `hasRowHeader`. The wrapper becomes a focusable,
10
+ * labeled scroll region while it overflows.
11
+ */
12
+ export declare const ScrollableWithRowHeader: Story;
6
13
  export declare const Primary: Story;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elmethis/qwik",
3
- "version": "1.0.0-alpha.29",
3
+ "version": "1.0.0-alpha.31",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -40,27 +40,29 @@
40
40
  "devDependencies": {
41
41
  "@eslint/js": "latest",
42
42
  "@qwik.dev/core": "2.0.0-beta.36",
43
- "@storybook/addon-docs": "^10.4.4",
43
+ "@storybook/addon-docs": "^10.4.6",
44
44
  "@types/lodash-es": "^4.17.12",
45
45
  "@types/node": "25.7.0",
46
46
  "@vitest/browser-playwright": "^4.1.8",
47
+ "@vitest/coverage-istanbul": "^4.1.8",
48
+ "@vitest/coverage-v8": "^4.1.8",
47
49
  "@vitest/ui": "^4.1.8",
48
50
  "concurrently": "^10.0.3",
49
- "eslint": "10.4.1",
51
+ "eslint": "10.5.0",
50
52
  "eslint-plugin-qwik": "2.0.0-beta.37",
51
53
  "globals": "17.6.0",
52
- "happy-dom": "^20.10.2",
54
+ "happy-dom": "^20.10.4",
53
55
  "np": "^11.2.1",
54
56
  "playwright": "^1.60.0",
55
57
  "prettier": "3.8.4",
56
- "storybook": "^10.4.4",
58
+ "storybook": "^10.4.6",
57
59
  "storybook-framework-qwik": "0.6.2--canary.95.25602496384.0",
58
60
  "stylelint": "^17.13.0",
59
61
  "stylelint-config-css-modules": "^4.6.0",
60
62
  "stylelint-config-standard": "^40.0.0",
61
63
  "stylelint-value-no-unknown-custom-properties": "^6.1.1",
62
64
  "typescript": "5.9.3",
63
- "typescript-eslint": "8.61.0",
65
+ "typescript-eslint": "8.61.1",
64
66
  "undici": "*",
65
67
  "vite": "^7",
66
68
  "vite-tsconfig-paths": "^6.1.1",
@@ -83,7 +85,7 @@
83
85
  "uuid": "^14.0.0",
84
86
  "zod": "^3",
85
87
  "zod-to-json-schema": "^3.25.2",
86
- "@elmethis/core": "^0.13.0"
88
+ "@elmethis/core": "^0.14.0"
87
89
  },
88
90
  "peerDependencies": {
89
91
  "@qwik.dev/core": ">=2.0.0-beta.31"
@@ -102,10 +104,12 @@
102
104
  "start": "vite --open --mode ssr",
103
105
  "test": "pnpm run test.unit && pnpm run test.browser",
104
106
  "test.unit": "vitest --run",
107
+ "test.coverage": "vitest --run --coverage",
105
108
  "test.browser": "vitest --run --config vitest.browser.config.ts",
109
+ "test.coverage.browser": "vitest --run --coverage --config vitest.browser.config.ts",
106
110
  "test.build": "pnpm run build && pnpm run build-storybook",
107
- "check": "concurrently -g \"pnpm:fmt.check\" \"pnpm:lint\" \"pnpm:lint.css\" \"pnpm:build.types\" \"pnpm:test.unit\"",
108
- "check.ci": "concurrently -g \"pnpm:check\" \"pnpm:test.build\" \"pnpm:test.browser\"",
111
+ "check": "concurrently -g \"pnpm:fmt.check\" \"pnpm:lint\" \"pnpm:lint.css\" \"pnpm:build.types\"",
112
+ "check.ci": "concurrently -g \"pnpm:check\" \"pnpm:test.build\" \"pnpm:test.unit\" \"pnpm:test.browser\"",
109
113
  "qwik": "qwik"
110
114
  }
111
115
  }