oc 0.50.53 → 0.50.55

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.
@@ -1,18 +1,18 @@
1
1
 
2
2
  
3
- > oc@0.50.52 prebuild
3
+ > oc@0.50.55 prebuild
4
4
  > rimraf dist
5
5
 
6
6
  ⠙
7
- > oc@0.50.52 build
7
+ > oc@0.50.55 build
8
8
  > npm run lint && tsc && node tasks/build.js
9
9
 
10
10
  ⠙
11
- > oc@0.50.52 lint
11
+ > oc@0.50.55 lint
12
12
  > npx @biomejs/biome check preview src test tasks
13
13
 
14
- ⠙⠹⠸⠼⠴Checked 129 files in 39ms. No fixes applied.
14
+ ⠙⠹⠸⠼Checked 129 files in 83ms. No fixes applied.
15
15
  ⠙⠙Building client
16
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/src/components/oc-client/
16
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/src/components/oc-client/
17
17
  Client has been built and packaged 👍
18
18
  ⠙
@@ -1,43 +1,46 @@
1
-
2
- > oc@0.50.47 test-silent
3
- > npm run build && node tasks/mochaTest.js --silent
4
-
5
-
6
- > oc@0.50.47 prebuild
7
- > rimraf dist
8
-
9
-
10
- > oc@0.50.47 build
11
- > npm run lint && tsc && node tasks/build.js
12
-
13
-
14
- > oc@0.50.47 lint
15
- > npx @biomejs/biome check preview src test tasks
16
-
17
- Checked 128 files in 28ms. No fixes applied.
18
- Building client
19
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/src/components/oc-client/
20
- Client has been built and packaged 👍
21
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/circular-json-error
22
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/container-with-multiple-nested
23
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/container-with-nested
24
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/empty
25
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/hello-world
26
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/hello-world-custom-cookies
27
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/hello-world-custom-headers
28
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/jade-filters
29
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/language
30
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/lodash-component
31
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/no-containers
32
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/welcome
33
- compiling component /Users/Ricardo.Agullo/Work/oc/packages/oc/test/fixtures/components/welcome-with-optional-parameters
34
- Test components packaged 👍
35
-
36
- (node:77761) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.
37
- (Use `node --trace-deprecation ...` to show where the warning was created)
38
-
39
- (node:77761) [DEP0097] DeprecationWarning: Using a domain property in MakeCallback is deprecated. Use the async_context variant of MakeCallback or the AsyncResource class instead. (Triggered by calling processImmediate on process.)
40
-
41
-
42
- 838 passing (8s)
43
-
1
+
2
+ 
3
+ > oc@0.50.55 test-silent
4
+ > npm run build && node tasks/mochaTest.js --silent
5
+
6
+
7
+ > oc@0.50.55 prebuild
8
+ > rimraf dist
9
+
10
+ ⠙
11
+ > oc@0.50.55 build
12
+ > npm run lint && tsc && node tasks/build.js
13
+
14
+ ⠙
15
+ > oc@0.50.55 lint
16
+ > npx @biomejs/biome check preview src test tasks
17
+
18
+ ⠙⠹⠸Checked 129 files in 32ms. No fixes applied.
19
+ ⠙⠙Building client
20
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/src/components/oc-client/
21
+ Client has been built and packaged 👍
22
+ ⠙compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/circular-json-error
23
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/container-with-multiple-nested
24
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/container-with-nested
25
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/empty
26
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/hello-world
27
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/hello-world-custom-cookies
28
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/hello-world-custom-headers
29
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/jade-filters
30
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/language
31
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/lodash-component
32
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/no-containers
33
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/welcome
34
+ compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/welcome-with-optional-parameters
35
+ Test components packaged 👍
36
+
37
+ [?25l [......................................................................................................................] [.....................................................................................................................] [▬....................................................................................................................] [▬▬...................................................................................................................] [▬▬▬..................................................................................................................] [▬▬▬▬.................................................................................................................] [▬▬▬▬▬................................................................................................................] [▬▬▬▬▬▬...............................................................................................................] [▬▬▬▬▬▬▬..............................................................................................................] [▬▬▬▬▬▬▬▬.............................................................................................................] [▬▬▬▬▬▬▬▬▬............................................................................................................] [▬▬▬▬▬▬▬▬▬▬...........................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬..........................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬.........................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬........................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬.......................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬......................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.....................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬....................................................................................................](node:622) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.
38
+ (Use `node --trace-deprecation ...` to show where the warning was created)
39
+  [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬................................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...............................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..............................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.............................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬............................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...........................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..........................................................................................]compiling component /Users/Ricardo.Agullo/Work/opencomponents/oc/packages/oc/test/fixtures/components/hello-world
40
+  [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.........................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬........................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.......................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬......................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.....................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬....................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬................................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...............................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..............................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.............................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬............................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...........................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..........................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.........................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬........................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.......................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬......................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.....................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬....................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬................................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...............................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..............................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.............................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬............................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...........................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..........................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.........................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬........................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.......................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬......................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.....................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬....................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬................................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...............................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..............................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.............................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬............................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...........................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..........................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.........................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬........................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.......................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬......................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.....................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬....................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...................................](node:622) [DEP0097] DeprecationWarning: Using a domain property in MakeCallback is deprecated. Use the async_context variant of MakeCallback or the AsyncResource class instead. (Triggered by calling processImmediate on process.)
41
+  [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬................................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...............................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..............................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.............................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬............................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...........................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..........................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.........................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬........................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.......................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬......................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.....................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬....................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬................] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...............] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..............] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.............](node:622) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
42
+  [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬............] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...........] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..........] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.........] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬........] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.......] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬......] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.....] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬....] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬...] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬..] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬.] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬] [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬][?25h
43
+
44
+   850 passing (9s)
45
+
46
+ ⠙
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  ## Change Log
2
2
 
3
+ ## 0.50.55
4
+
5
+ ### Patch Changes
6
+
7
+ - Add pagination on components
8
+
9
+ ## 0.50.54
10
+
11
+ ### Patch Changes
12
+
13
+ - fix client
14
+
3
15
  ## 0.50.53
4
16
 
5
17
  ### Patch Changes
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "oc-client",
3
3
  "description": "The OpenComponents client-side javascript client",
4
- "version": "0.50.52",
4
+ "version": "0.50.55",
5
5
  "repository": "https://github.com/opencomponents/oc/tree/master/components/oc-client",
6
6
  "author": "Matteo Figus <matteofigus@gmail.com>",
7
7
  "oc": {
@@ -23,14 +23,14 @@
23
23
  ],
24
24
  "dataProvider": {
25
25
  "type": "node.js",
26
- "hashKey": "e81ba1f42539b678079cb54ba2d4f72005ee12dd",
26
+ "hashKey": "ebd4132fcd55c1f8bfa966365e0f2b496a9505b4",
27
27
  "src": "server.js",
28
28
  "size": 644
29
29
  }
30
30
  },
31
- "version": "0.50.52",
31
+ "version": "0.50.55",
32
32
  "packaged": true,
33
- "date": 1781776190510
33
+ "date": 1783073481627
34
34
  },
35
35
  "devDependencies": {
36
36
  "oc-template-es6-compiler": "^8.0.0"
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=(t,s)=>{const{staticPath:e,templates:a}=t;return s(null,{staticPath:e,templates:a})},r=(t,s)=>{o(t,(e,a,i={})=>{if(e)return s(e);if(a==null)return s(null,{__oc_emptyResponse:!0});const n=t.action?a:Object.assign({},a,{_staticPath:t.staticPath,_baseUrl:t.baseUrl,_componentName:"oc-client",_componentVersion:"0.50.52"}),c=t.staticPath.indexOf("http")===0?t.staticPath:"https:"+t.staticPath;return s(null,Object.assign({},{component:{key:"c4abb6bf4dc6657fb718a45b64bd6b2cb92e874a",src:c+"template.js",props:n,esm:!1,development:void 0}}))})};exports.data=r;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=(t,s)=>{const{staticPath:e,templates:a}=t;return s(null,{staticPath:e,templates:a})},r=(t,s)=>{o(t,(e,a,i={})=>{if(e)return s(e);if(a==null)return s(null,{__oc_emptyResponse:!0});const n=t.action?a:Object.assign({},a,{_staticPath:t.staticPath,_baseUrl:t.baseUrl,_componentName:"oc-client",_componentVersion:"0.50.55"}),c=t.staticPath.indexOf("http")===0?t.staticPath:"https:"+t.staticPath;return s(null,Object.assign({},{component:{key:"c4abb6bf4dc6657fb718a45b64bd6b2cb92e874a",src:c+"template.js",props:n,esm:!1,development:void 0}}))})};exports.data=r;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "oc-client",
3
3
  "description": "The OpenComponents client-side javascript client",
4
- "version": "0.50.52",
4
+ "version": "0.50.55",
5
5
  "repository": "https://github.com/opencomponents/oc/tree/master/components/oc-client",
6
6
  "author": "Matteo Figus <matteofigus@gmail.com>",
7
7
  "oc": {
@@ -17,6 +17,6 @@ const ComponentsList = (props) => {
17
17
  ? `${Math.round(component.oc.files.template.size / 1024)} kb`
18
18
  : '? Kb' }))] }) })] }) }));
19
19
  };
20
- return ((0, jsx_runtime_1.jsxs)("div", { id: "components-list", class: "box", children: [(0, jsx_runtime_1.jsxs)("form", { id: "filter-components", children: [(0, jsx_runtime_1.jsxs)("div", { class: "filters", children: [(0, jsx_runtime_1.jsx)("input", { id: "search-filter", type: "text", "aria-label": "Filter by component name", placeholder: "Filter by name\u2026 ( press / )" }), (0, jsx_runtime_1.jsx)("input", { id: "author-filter", type: "text", "aria-label": "Filter by component author", placeholder: "Filter by component author" })] }), (0, jsx_runtime_1.jsxs)("div", { class: "states", children: [(0, jsx_runtime_1.jsx)("span", { children: "Hide:" }), (0, jsx_runtime_1.jsx)(selected_checkbox_1.default, { name: "deprecated", stateCounts: props.stateCounts }), (0, jsx_runtime_1.jsx)(selected_checkbox_1.default, { name: "experimental", stateCounts: props.stateCounts })] })] }), (0, jsx_runtime_1.jsx)("div", { class: "list-meta", children: (0, jsx_runtime_1.jsxs)("span", { id: "results-count", children: [props.components.length, " components"] }) }), (0, jsx_runtime_1.jsxs)("div", { class: "row header componentRow table", children: [(0, jsx_runtime_1.jsx)("div", { class: "title", children: "Component" }), (0, jsx_runtime_1.jsx)("div", { class: "author", children: "Author" }), (0, jsx_runtime_1.jsx)("div", { children: "Latest version" }), isRemote && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { class: "date", children: "Updated" }), (0, jsx_runtime_1.jsx)("div", { class: "activity", children: "Activity" })] })), sizeAvailable && (0, jsx_runtime_1.jsx)("div", { children: "Size" })] }), props.components.map(componentRow), (0, jsx_runtime_1.jsx)("div", { id: "components-empty", class: "empty-state hide", children: "No components match your filters." })] }));
20
+ return ((0, jsx_runtime_1.jsxs)("div", { id: "components-list", class: "box", children: [(0, jsx_runtime_1.jsxs)("form", { id: "filter-components", children: [(0, jsx_runtime_1.jsxs)("div", { class: "filters", children: [(0, jsx_runtime_1.jsx)("input", { id: "search-filter", type: "text", "aria-label": "Filter by component name", placeholder: "Filter by name\u2026 ( press / )" }), (0, jsx_runtime_1.jsx)("input", { id: "author-filter", type: "text", "aria-label": "Filter by component author", placeholder: "Filter by component author" })] }), (0, jsx_runtime_1.jsxs)("div", { class: "states", children: [(0, jsx_runtime_1.jsx)("span", { children: "Hide:" }), (0, jsx_runtime_1.jsx)(selected_checkbox_1.default, { name: "deprecated", stateCounts: props.stateCounts }), (0, jsx_runtime_1.jsx)(selected_checkbox_1.default, { name: "experimental", stateCounts: props.stateCounts })] })] }), (0, jsx_runtime_1.jsx)("div", { class: "list-meta", children: (0, jsx_runtime_1.jsxs)("span", { id: "results-count", children: [props.components.length, " components"] }) }), (0, jsx_runtime_1.jsx)("nav", { id: "components-pagination-top", class: "pagination components-pagination pagination-top hide", "aria-label": "Components pagination" }), (0, jsx_runtime_1.jsxs)("div", { class: "row header componentRow table", children: [(0, jsx_runtime_1.jsx)("div", { class: "title", children: "Component" }), (0, jsx_runtime_1.jsx)("div", { class: "author", children: "Author" }), (0, jsx_runtime_1.jsx)("div", { children: "Latest version" }), isRemote && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { class: "date", children: "Updated" }), (0, jsx_runtime_1.jsx)("div", { class: "activity", children: "Activity" })] })), sizeAvailable && (0, jsx_runtime_1.jsx)("div", { children: "Size" })] }), props.components.map(componentRow), (0, jsx_runtime_1.jsx)("div", { id: "components-empty", class: "empty-state hide", children: "No components match your filters." }), (0, jsx_runtime_1.jsx)("nav", { id: "components-pagination-bottom", class: "pagination components-pagination hide", "aria-label": "Components pagination" })] }));
21
21
  };
22
22
  exports.default = ComponentsList;
@@ -1,2 +1,2 @@
1
- declare const _default: "'use strict';\n\nvar oc = oc || {};\noc.cmd = oc.cmd || [];\n\noc.cmd.push(function() {\n var escapeRegExp = function(s) {\n return String(s).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n\n var safeRegExp = function(pattern, flags) {\n try {\n return new RegExp(pattern, flags);\n } catch (e) {\n return new RegExp(escapeRegExp(pattern), flags);\n }\n };\n\n var componentsListChanged = function() {\n $('.componentRow').removeClass('hide');\n var s = $('#search-filter').val(),\n a = $('#author-filter').val(),\n r = safeRegExp(s, ''),\n ar = safeRegExp(a, 'i'),\n selectedCheckboxes = $('input[type=checkbox]:checked'),\n hiddenStates = [],\n hidden = 0,\n i;\n\n for (i = 0; i < selectedCheckboxes.length; i++) {\n hiddenStates.push($(selectedCheckboxes[i]).attr('name'));\n }\n\n for (i = 0; i < componentsList.length; i++) {\n var matches = !s || !!componentsList[i].name.match(r),\n matchesAuthor =\n !a ||\n (componentsList[i].author.name &&\n !!componentsList[i].author.name.match(ar)),\n selector = $('#component-' + componentsList[i].name),\n isHidden = false;\n\n for (var j = 0; j < hiddenStates.length; j++) {\n if (componentsList[i].state.toLowerCase() === hiddenStates[j]) {\n isHidden = true;\n }\n }\n\n var show = matches && matchesAuthor && !isHidden;\n selector[show ? 'removeClass' : 'addClass']('hide');\n if (!show) {\n hidden += 1;\n }\n }\n\n var totalShowing = componentsList.length - hidden,\n result = totalShowing + (totalShowing === 1 ? ' component' : ' components');\n\n if (s) {\n result += ' matching \"' + s + '\"';\n if (a) {\n result += ' and';\n }\n }\n if (a) {\n result += ' by author \"' + a + '\"';\n }\n\n $('#results-count').text(result);\n $('#components-empty')[totalShowing === 0 ? 'removeClass' : 'addClass']('hide');\n\n return false;\n };\n\n var historyData = [];\n var historyRenderedCount = 0;\n var historyBatchSize = 50; // Number of items to render per batch\n var isLoadingMore = false;\n\n var renderHistoryBatch = function() {\n if (historyRenderedCount >= historyData.length || isLoadingMore) {\n return;\n }\n\n isLoadingMore = true;\n var historyContent = $('#history-content');\n var batchEnd = Math.min(historyRenderedCount + historyBatchSize, historyData.length);\n var batchHtml = '';\n\n for (var i = historyRenderedCount; i < batchEnd; i++) {\n var item = historyData[i];\n var templateSizeText = item.templateSize ? \n ' [' + Math.round(item.templateSize / 1024) + ' kb]' : '';\n \n batchHtml += '<a href=\"' + item.name + '/' + item.version + '/~info\">' +\n '<div class=\"componentRow row table\">' +\n '<p class=\"release\">' +\n item.publishDate + ' - Published ' + item.name + '@' + item.version +\n templateSizeText +\n '</p>' +\n '</div>' +\n '</a>';\n }\n\n // Append new batch to existing content\n historyContent.append(batchHtml);\n historyRenderedCount = batchEnd;\n \n // Add loading indicator if there are more items\n if (historyRenderedCount < historyData.length) {\n historyContent.append('<div id=\"history-loading-more\" class=\"loading-more\">Loading more...</div>');\n }\n \n isLoadingMore = false;\n };\n\n var setupHistoryScrollListener = function() {\n var historyContainer = $('#components-history');\n var checkScroll = function() {\n if (historyRenderedCount >= historyData.length) {\n return;\n }\n\n var containerTop = historyContainer.offset().top;\n var containerHeight = historyContainer.outerHeight();\n var scrollTop = $(window).scrollTop();\n var windowHeight = $(window).height();\n \n // Check if user scrolled close to the bottom of the history container\n var distanceFromBottom = (containerTop + containerHeight) - (scrollTop + windowHeight);\n \n if (distanceFromBottom < 200) { // Load more when 200px from bottom\n $('#history-loading-more').remove();\n renderHistoryBatch();\n }\n };\n\n $(window).on('scroll.history', checkScroll);\n \n // Also check on resize\n $(window).on('resize.history', checkScroll);\n };\n\n var loadComponentsHistory = function() {\n var historyLoader = $('#history-loader');\n var historyContent = $('#history-content');\n var historyError = $('#history-error');\n\n // Show loader\n historyLoader.show();\n historyContent.hide();\n historyError.hide();\n\n // Reset state\n historyData = [];\n historyRenderedCount = 0;\n isLoadingMore = false;\n\n // Remove any existing scroll listeners\n $(window).off('scroll.history resize.history');\n\n // Fetch history data\n fetch('~registry/history')\n .then(function(response) {\n if (!response.ok) {\n throw new Error('Failed to fetch history');\n }\n return response.json();\n })\n .then(function(data) {\n historyData = data.componentsHistory || [];\n \n // Clear content and show container\n historyContent.empty();\n historyLoader.hide();\n historyContent.show();\n \n if (historyData.length === 0) {\n historyContent.html('<p class=\"empty-state\">No components history available.</p>');\n return;\n }\n\n // Render first batch\n renderHistoryBatch();\n \n // Setup scroll listener for infinite loading\n setupHistoryScrollListener();\n })\n .catch(function(error) {\n console.error('Error loading components history:', error);\n historyLoader.hide();\n historyError.show();\n });\n };\n\n var isHistoryLoaded = false;\n\n var initialiseTabs = function() {\n var selectItem = function(target) {\n var $target = $(target);\n $('.box').hide();\n $target.show();\n $('#menuList a').removeClass('selected');\n $('#menuList a[href=\"' + target + '\"]').addClass('selected');\n\n // Keep URL in sync so tab survives refresh and back/forward\n try {\n if (history && history.replaceState && location.hash !== target) {\n history.replaceState(null, '', target);\n }\n } catch (e) {}\n\n // Clean up scroll listeners when leaving history tab\n if (target !== '#components-history') {\n $(window).off('scroll.history resize.history');\n }\n \n // Load history data when history tab is selected for the first time\n if (target === '#components-history' && !isHistoryLoaded) {\n loadComponentsHistory();\n isHistoryLoaded = true;\n }\n // Re-enable scroll listeners when returning to history tab\n else if (target === '#components-history' && isHistoryLoaded && historyRenderedCount < historyData.length) {\n setupHistoryScrollListener();\n }\n };\n\n var hash = location.href.split('#')[1] || '';\n var isHashValid = hash && $('#' + hash);\n var target = isHashValid ? '#' + hash : $($('#menuList a')[0]).attr('href');\n selectItem(target);\n\n $('#menuList a').click(function() {\n selectItem($(this).attr('href'));\n });\n };\n\n var debounce = function(fn, wait) {\n var t;\n return function() {\n var ctx = this, args = arguments;\n clearTimeout(t);\n t = setTimeout(function(){ fn.apply(ctx, args); }, wait);\n };\n };\n\n $('#filter-components')\n .submit(componentsListChanged)\n .keyup(debounce(componentsListChanged, 80));\n $('#filter-components input[type=checkbox]').change(componentsListChanged);\n\n if (q) {\n $('.search').val(q);\n }\n\n // Keyboard shortcuts: \"/\" focuses search, \"Esc\" clears the focused filter\n $(document).on('keydown', function(e) {\n var tag = (e.target && e.target.tagName) ? e.target.tagName.toLowerCase() : '';\n var typing = tag === 'input' || tag === 'textarea' || tag === 'select';\n\n if (e.key === '/' && !typing) {\n var $s = $('#search-filter');\n if ($s.length) {\n e.preventDefault();\n $s.focus();\n }\n } else if (e.key === 'Escape' && typing && $(e.target).closest('#filter-components').length) {\n $(e.target).val('');\n componentsListChanged();\n }\n });\n\n // Focus the search input only on a fresh load (no tab hash, no in-page nav)\n if (!location.hash) {\n var $searchInput = $('#search-filter');\n if ($searchInput.length) { $searchInput.focus(); }\n }\n\n componentsListChanged();\n initialiseTabs();\n});";
1
+ declare const _default: "'use strict';\n\nvar oc = oc || {};\noc.cmd = oc.cmd || [];\n\noc.cmd.push(function() {\n var escapeRegExp = function(s) {\n return String(s).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n\n var safeRegExp = function(pattern, flags) {\n try {\n return new RegExp(pattern, flags);\n } catch (e) {\n return new RegExp(escapeRegExp(pattern), flags);\n }\n };\n\n // Client-side pagination for the components list. Enabled only once the\n // registry has more components than a single page so smaller registries keep\n // the simple single-page view.\n var COMPONENTS_PAGE_SIZE = 50;\n var paginationEnabled = componentsList.length > COMPONENTS_PAGE_SIZE;\n var currentPage = 1;\n\n var renderComponentsPagination = function(totalMatching, totalPages) {\n // Rendered into both the top and bottom containers so they stay in sync.\n var containers = $('.components-pagination');\n if (!paginationEnabled || totalMatching <= COMPONENTS_PAGE_SIZE) {\n containers.addClass('hide').empty();\n return;\n }\n\n // Build a compact list of page numbers: first, last, and a window around\n // the current page, with ellipses for the gaps.\n var pages = [];\n var windowSize = 1;\n var start = Math.max(2, currentPage - windowSize);\n var end = Math.min(totalPages - 1, currentPage + windowSize);\n pages.push(1);\n if (start > 2) {\n pages.push('...');\n }\n for (var p = start; p <= end; p++) {\n pages.push(p);\n }\n if (end < totalPages - 1) {\n pages.push('...');\n }\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n\n var html =\n '<button type=\"button\" class=\"pagination-btn pagination-prev\" data-page=\"' +\n (currentPage - 1) +\n '\"' +\n (currentPage <= 1 ? ' disabled' : '') +\n '>Prev</button>';\n for (var k = 0; k < pages.length; k++) {\n if (pages[k] === '...') {\n html += '<span class=\"pagination-ellipsis\">\u2026</span>';\n } else {\n html +=\n '<button type=\"button\" class=\"pagination-btn pagination-page' +\n (pages[k] === currentPage ? ' active' : '') +\n '\" data-page=\"' +\n pages[k] +\n '\">' +\n pages[k] +\n '</button>';\n }\n }\n html +=\n '<button type=\"button\" class=\"pagination-btn pagination-next\" data-page=\"' +\n (currentPage + 1) +\n '\"' +\n (currentPage >= totalPages ? ' disabled' : '') +\n '>Next</button>';\n\n containers.html(html).removeClass('hide');\n };\n\n var applyComponentsView = function() {\n var s = $('#search-filter').val(),\n a = $('#author-filter').val(),\n r = safeRegExp(s, ''),\n ar = safeRegExp(a, 'i'),\n selectedCheckboxes = $('input[type=checkbox]:checked'),\n hiddenStates = [],\n matchingNames = [],\n i;\n\n for (i = 0; i < selectedCheckboxes.length; i++) {\n hiddenStates.push($(selectedCheckboxes[i]).attr('name'));\n }\n\n // First pass: figure out which components match the current filters.\n for (i = 0; i < componentsList.length; i++) {\n var matches = !s || !!componentsList[i].name.match(r),\n matchesAuthor =\n !a ||\n (componentsList[i].author.name &&\n !!componentsList[i].author.name.match(ar)),\n isHidden = false;\n\n for (var j = 0; j < hiddenStates.length; j++) {\n if (componentsList[i].state.toLowerCase() === hiddenStates[j]) {\n isHidden = true;\n }\n }\n\n if (matches && matchesAuthor && !isHidden) {\n matchingNames.push(componentsList[i].name);\n }\n }\n\n var totalMatching = matchingNames.length;\n var totalPages = paginationEnabled\n ? Math.max(1, Math.ceil(totalMatching / COMPONENTS_PAGE_SIZE))\n : 1;\n if (currentPage > totalPages) {\n currentPage = totalPages;\n }\n if (currentPage < 1) {\n currentPage = 1;\n }\n\n var startIdx = paginationEnabled\n ? (currentPage - 1) * COMPONENTS_PAGE_SIZE\n : 0;\n var endIdx = paginationEnabled ? startIdx + COMPONENTS_PAGE_SIZE : totalMatching;\n var visibleNames = {};\n for (i = startIdx; i < endIdx && i < totalMatching; i++) {\n visibleNames[matchingNames[i]] = true;\n }\n\n // Second pass: only rows that match the filters AND fall on the current\n // page are shown.\n for (i = 0; i < componentsList.length; i++) {\n var name = componentsList[i].name,\n show = visibleNames[name] === true;\n $('#component-' + name)[show ? 'removeClass' : 'addClass']('hide');\n }\n\n var result =\n totalMatching + (totalMatching === 1 ? ' component' : ' components');\n\n if (s) {\n result += ' matching \"' + s + '\"';\n if (a) {\n result += ' and';\n }\n }\n if (a) {\n result += ' by author \"' + a + '\"';\n }\n if (paginationEnabled && totalMatching > COMPONENTS_PAGE_SIZE) {\n result +=\n ' (showing ' +\n (startIdx + 1) +\n '\u2013' +\n Math.min(endIdx, totalMatching) +\n ')';\n }\n\n $('#results-count').text(result);\n $('#components-empty')[totalMatching === 0 ? 'removeClass' : 'addClass'](\n 'hide'\n );\n\n renderComponentsPagination(totalMatching, totalPages);\n\n return false;\n };\n\n var componentsListChanged = function() {\n // Any filter change resets back to the first page.\n currentPage = 1;\n return applyComponentsView();\n };\n\n var historyData = [];\n var historyRenderedCount = 0;\n var historyBatchSize = 50; // Number of items to render per batch\n var isLoadingMore = false;\n\n var renderHistoryBatch = function() {\n if (historyRenderedCount >= historyData.length || isLoadingMore) {\n return;\n }\n\n isLoadingMore = true;\n var historyContent = $('#history-content');\n var batchEnd = Math.min(historyRenderedCount + historyBatchSize, historyData.length);\n var batchHtml = '';\n\n for (var i = historyRenderedCount; i < batchEnd; i++) {\n var item = historyData[i];\n var templateSizeText = item.templateSize ? \n ' [' + Math.round(item.templateSize / 1024) + ' kb]' : '';\n \n batchHtml += '<a href=\"' + item.name + '/' + item.version + '/~info\">' +\n '<div class=\"componentRow row table\">' +\n '<p class=\"release\">' +\n item.publishDate + ' - Published ' + item.name + '@' + item.version +\n templateSizeText +\n '</p>' +\n '</div>' +\n '</a>';\n }\n\n // Append new batch to existing content\n historyContent.append(batchHtml);\n historyRenderedCount = batchEnd;\n \n // Add loading indicator if there are more items\n if (historyRenderedCount < historyData.length) {\n historyContent.append('<div id=\"history-loading-more\" class=\"loading-more\">Loading more...</div>');\n }\n \n isLoadingMore = false;\n };\n\n var setupHistoryScrollListener = function() {\n var historyContainer = $('#components-history');\n var checkScroll = function() {\n if (historyRenderedCount >= historyData.length) {\n return;\n }\n\n var containerTop = historyContainer.offset().top;\n var containerHeight = historyContainer.outerHeight();\n var scrollTop = $(window).scrollTop();\n var windowHeight = $(window).height();\n \n // Check if user scrolled close to the bottom of the history container\n var distanceFromBottom = (containerTop + containerHeight) - (scrollTop + windowHeight);\n \n if (distanceFromBottom < 200) { // Load more when 200px from bottom\n $('#history-loading-more').remove();\n renderHistoryBatch();\n }\n };\n\n $(window).on('scroll.history', checkScroll);\n \n // Also check on resize\n $(window).on('resize.history', checkScroll);\n };\n\n var loadComponentsHistory = function() {\n var historyLoader = $('#history-loader');\n var historyContent = $('#history-content');\n var historyError = $('#history-error');\n\n // Show loader\n historyLoader.show();\n historyContent.hide();\n historyError.hide();\n\n // Reset state\n historyData = [];\n historyRenderedCount = 0;\n isLoadingMore = false;\n\n // Remove any existing scroll listeners\n $(window).off('scroll.history resize.history');\n\n // Fetch history data\n fetch('~registry/history')\n .then(function(response) {\n if (!response.ok) {\n throw new Error('Failed to fetch history');\n }\n return response.json();\n })\n .then(function(data) {\n historyData = data.componentsHistory || [];\n \n // Clear content and show container\n historyContent.empty();\n historyLoader.hide();\n historyContent.show();\n \n if (historyData.length === 0) {\n historyContent.html('<p class=\"empty-state\">No components history available.</p>');\n return;\n }\n\n // Render first batch\n renderHistoryBatch();\n \n // Setup scroll listener for infinite loading\n setupHistoryScrollListener();\n })\n .catch(function(error) {\n console.error('Error loading components history:', error);\n historyLoader.hide();\n historyError.show();\n });\n };\n\n var isHistoryLoaded = false;\n\n var initialiseTabs = function() {\n var selectItem = function(target) {\n var $target = $(target);\n $('.box').hide();\n $target.show();\n $('#menuList a').removeClass('selected');\n $('#menuList a[href=\"' + target + '\"]').addClass('selected');\n\n // Keep URL in sync so tab survives refresh and back/forward\n try {\n if (history && history.replaceState && location.hash !== target) {\n history.replaceState(null, '', target);\n }\n } catch (e) {}\n\n // Clean up scroll listeners when leaving history tab\n if (target !== '#components-history') {\n $(window).off('scroll.history resize.history');\n }\n \n // Load history data when history tab is selected for the first time\n if (target === '#components-history' && !isHistoryLoaded) {\n loadComponentsHistory();\n isHistoryLoaded = true;\n }\n // Re-enable scroll listeners when returning to history tab\n else if (target === '#components-history' && isHistoryLoaded && historyRenderedCount < historyData.length) {\n setupHistoryScrollListener();\n }\n };\n\n var hash = location.href.split('#')[1] || '';\n var isHashValid = hash && $('#' + hash);\n var target = isHashValid ? '#' + hash : $($('#menuList a')[0]).attr('href');\n selectItem(target);\n\n $('#menuList a').click(function() {\n selectItem($(this).attr('href'));\n });\n };\n\n var debounce = function(fn, wait) {\n var t;\n return function() {\n var ctx = this, args = arguments;\n clearTimeout(t);\n t = setTimeout(function(){ fn.apply(ctx, args); }, wait);\n };\n };\n\n $('#filter-components')\n .submit(componentsListChanged)\n .keyup(debounce(componentsListChanged, 80));\n $('#filter-components input[type=checkbox]').change(componentsListChanged);\n\n // Delegated from the stable list container so both the top and bottom\n // pagination bars work. No auto-scroll, so repeated clicks stay put.\n $('#components-list').on('click', '.pagination-btn', function() {\n var $btn = $(this);\n if ($btn.is('[disabled]')) {\n return;\n }\n var page = parseInt($btn.attr('data-page'), 10);\n if (isNaN(page)) {\n return;\n }\n currentPage = page;\n applyComponentsView();\n });\n\n if (q) {\n $('.search').val(q);\n }\n\n // Keyboard shortcuts: \"/\" focuses search, \"Esc\" clears the focused filter\n $(document).on('keydown', function(e) {\n var tag = (e.target && e.target.tagName) ? e.target.tagName.toLowerCase() : '';\n var typing = tag === 'input' || tag === 'textarea' || tag === 'select';\n\n if (e.key === '/' && !typing) {\n var $s = $('#search-filter');\n if ($s.length) {\n e.preventDefault();\n $s.focus();\n }\n } else if (e.key === 'Escape' && typing && $(e.target).closest('#filter-components').length) {\n $(e.target).val('');\n componentsListChanged();\n }\n });\n\n // Focus the search input only on a fresh load (no tab hash, no in-page nav)\n if (!location.hash) {\n var $searchInput = $('#search-filter');\n if ($searchInput.length) { $searchInput.focus(); }\n }\n\n componentsListChanged();\n initialiseTabs();\n});";
2
2
  export default _default;
@@ -18,28 +18,92 @@ oc.cmd.push(function() {
18
18
  }
19
19
  };
20
20
 
21
- var componentsListChanged = function() {
22
- $('.componentRow').removeClass('hide');
21
+ // Client-side pagination for the components list. Enabled only once the
22
+ // registry has more components than a single page so smaller registries keep
23
+ // the simple single-page view.
24
+ var COMPONENTS_PAGE_SIZE = 50;
25
+ var paginationEnabled = componentsList.length > COMPONENTS_PAGE_SIZE;
26
+ var currentPage = 1;
27
+
28
+ var renderComponentsPagination = function(totalMatching, totalPages) {
29
+ // Rendered into both the top and bottom containers so they stay in sync.
30
+ var containers = $('.components-pagination');
31
+ if (!paginationEnabled || totalMatching <= COMPONENTS_PAGE_SIZE) {
32
+ containers.addClass('hide').empty();
33
+ return;
34
+ }
35
+
36
+ // Build a compact list of page numbers: first, last, and a window around
37
+ // the current page, with ellipses for the gaps.
38
+ var pages = [];
39
+ var windowSize = 1;
40
+ var start = Math.max(2, currentPage - windowSize);
41
+ var end = Math.min(totalPages - 1, currentPage + windowSize);
42
+ pages.push(1);
43
+ if (start > 2) {
44
+ pages.push('...');
45
+ }
46
+ for (var p = start; p <= end; p++) {
47
+ pages.push(p);
48
+ }
49
+ if (end < totalPages - 1) {
50
+ pages.push('...');
51
+ }
52
+ if (totalPages > 1) {
53
+ pages.push(totalPages);
54
+ }
55
+
56
+ var html =
57
+ '<button type="button" class="pagination-btn pagination-prev" data-page="' +
58
+ (currentPage - 1) +
59
+ '"' +
60
+ (currentPage <= 1 ? ' disabled' : '') +
61
+ '>Prev</button>';
62
+ for (var k = 0; k < pages.length; k++) {
63
+ if (pages[k] === '...') {
64
+ html += '<span class="pagination-ellipsis">…</span>';
65
+ } else {
66
+ html +=
67
+ '<button type="button" class="pagination-btn pagination-page' +
68
+ (pages[k] === currentPage ? ' active' : '') +
69
+ '" data-page="' +
70
+ pages[k] +
71
+ '">' +
72
+ pages[k] +
73
+ '</button>';
74
+ }
75
+ }
76
+ html +=
77
+ '<button type="button" class="pagination-btn pagination-next" data-page="' +
78
+ (currentPage + 1) +
79
+ '"' +
80
+ (currentPage >= totalPages ? ' disabled' : '') +
81
+ '>Next</button>';
82
+
83
+ containers.html(html).removeClass('hide');
84
+ };
85
+
86
+ var applyComponentsView = function() {
23
87
  var s = $('#search-filter').val(),
24
88
  a = $('#author-filter').val(),
25
89
  r = safeRegExp(s, ''),
26
90
  ar = safeRegExp(a, 'i'),
27
91
  selectedCheckboxes = $('input[type=checkbox]:checked'),
28
92
  hiddenStates = [],
29
- hidden = 0,
93
+ matchingNames = [],
30
94
  i;
31
95
 
32
96
  for (i = 0; i < selectedCheckboxes.length; i++) {
33
97
  hiddenStates.push($(selectedCheckboxes[i]).attr('name'));
34
98
  }
35
99
 
100
+ // First pass: figure out which components match the current filters.
36
101
  for (i = 0; i < componentsList.length; i++) {
37
102
  var matches = !s || !!componentsList[i].name.match(r),
38
103
  matchesAuthor =
39
104
  !a ||
40
105
  (componentsList[i].author.name &&
41
106
  !!componentsList[i].author.name.match(ar)),
42
- selector = $('#component-' + componentsList[i].name),
43
107
  isHidden = false;
44
108
 
45
109
  for (var j = 0; j < hiddenStates.length; j++) {
@@ -48,15 +112,41 @@ oc.cmd.push(function() {
48
112
  }
49
113
  }
50
114
 
51
- var show = matches && matchesAuthor && !isHidden;
52
- selector[show ? 'removeClass' : 'addClass']('hide');
53
- if (!show) {
54
- hidden += 1;
115
+ if (matches && matchesAuthor && !isHidden) {
116
+ matchingNames.push(componentsList[i].name);
55
117
  }
56
118
  }
57
119
 
58
- var totalShowing = componentsList.length - hidden,
59
- result = totalShowing + (totalShowing === 1 ? ' component' : ' components');
120
+ var totalMatching = matchingNames.length;
121
+ var totalPages = paginationEnabled
122
+ ? Math.max(1, Math.ceil(totalMatching / COMPONENTS_PAGE_SIZE))
123
+ : 1;
124
+ if (currentPage > totalPages) {
125
+ currentPage = totalPages;
126
+ }
127
+ if (currentPage < 1) {
128
+ currentPage = 1;
129
+ }
130
+
131
+ var startIdx = paginationEnabled
132
+ ? (currentPage - 1) * COMPONENTS_PAGE_SIZE
133
+ : 0;
134
+ var endIdx = paginationEnabled ? startIdx + COMPONENTS_PAGE_SIZE : totalMatching;
135
+ var visibleNames = {};
136
+ for (i = startIdx; i < endIdx && i < totalMatching; i++) {
137
+ visibleNames[matchingNames[i]] = true;
138
+ }
139
+
140
+ // Second pass: only rows that match the filters AND fall on the current
141
+ // page are shown.
142
+ for (i = 0; i < componentsList.length; i++) {
143
+ var name = componentsList[i].name,
144
+ show = visibleNames[name] === true;
145
+ $('#component-' + name)[show ? 'removeClass' : 'addClass']('hide');
146
+ }
147
+
148
+ var result =
149
+ totalMatching + (totalMatching === 1 ? ' component' : ' components');
60
150
 
61
151
  if (s) {
62
152
  result += ' matching "' + s + '"';
@@ -67,13 +157,31 @@ oc.cmd.push(function() {
67
157
  if (a) {
68
158
  result += ' by author "' + a + '"';
69
159
  }
160
+ if (paginationEnabled && totalMatching > COMPONENTS_PAGE_SIZE) {
161
+ result +=
162
+ ' (showing ' +
163
+ (startIdx + 1) +
164
+ '–' +
165
+ Math.min(endIdx, totalMatching) +
166
+ ')';
167
+ }
70
168
 
71
169
  $('#results-count').text(result);
72
- $('#components-empty')[totalShowing === 0 ? 'removeClass' : 'addClass']('hide');
170
+ $('#components-empty')[totalMatching === 0 ? 'removeClass' : 'addClass'](
171
+ 'hide'
172
+ );
173
+
174
+ renderComponentsPagination(totalMatching, totalPages);
73
175
 
74
176
  return false;
75
177
  };
76
178
 
179
+ var componentsListChanged = function() {
180
+ // Any filter change resets back to the first page.
181
+ currentPage = 1;
182
+ return applyComponentsView();
183
+ };
184
+
77
185
  var historyData = [];
78
186
  var historyRenderedCount = 0;
79
187
  var historyBatchSize = 50; // Number of items to render per batch
@@ -252,6 +360,21 @@ oc.cmd.push(function() {
252
360
  .keyup(debounce(componentsListChanged, 80));
253
361
  $('#filter-components input[type=checkbox]').change(componentsListChanged);
254
362
 
363
+ // Delegated from the stable list container so both the top and bottom
364
+ // pagination bars work. No auto-scroll, so repeated clicks stay put.
365
+ $('#components-list').on('click', '.pagination-btn', function() {
366
+ var $btn = $(this);
367
+ if ($btn.is('[disabled]')) {
368
+ return;
369
+ }
370
+ var page = parseInt($btn.attr('data-page'), 10);
371
+ if (isNaN(page)) {
372
+ return;
373
+ }
374
+ currentPage = page;
375
+ applyComponentsView();
376
+ });
377
+
255
378
  if (q) {
256
379
  $('.search').val(q);
257
380
  }
@@ -1,2 +1,2 @@
1
- declare const _default: "\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;450;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\");\n\n:root {\n /* Brand accent (consistent across themes) */\n --color-primary: #6366f1;\n --color-primary-dark: #4f46e5;\n --color-primary-light: #818cf8;\n --color-secondary: #0891b2;\n --color-accent: #d97706;\n\n --gradient-primary: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n\n /* Spacing / radius scale */\n --radius-sm: 6px;\n --radius-md: 10px;\n --radius-lg: 14px;\n --radius-full: 999px;\n\n --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --font-mono: 'JetBrains Mono', 'SFMono-Regular', Menlo, Monaco, Consolas, monospace;\n}\n\n/* Dark theme (default) */\n:root, [data-theme=\"dark\"] {\n --color-bg-primary: #0b0e14;\n --color-bg-secondary: #11151d;\n --color-bg-card: #11151d;\n --color-bg-elevated: #161c26;\n --color-bg-glass: rgba(255, 255, 255, 0.04);\n --color-bg-hover: rgba(255, 255, 255, 0.035);\n\n --color-text-primary: #e6edf3;\n --color-text-secondary: #aeb6c2;\n --color-text-muted: #7d8693;\n\n --color-border: #222a37;\n --color-border-hover: #323c4d;\n\n --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);\n --shadow-md: 0 4px 12px -2px rgba(0, 0, 0, 0.4);\n --shadow-lg: 0 12px 28px -6px rgba(0, 0, 0, 0.5);\n --shadow-glow: 0 4px 16px -2px rgba(99, 102, 241, 0.4);\n\n --color-text-inverse: #ffffff;\n\n --tint-strength: 0.16;\n --tint-border: 0.32;\n --badge-text-lightness: 78%;\n}\n\n/* Light theme */\n[data-theme=\"light\"] {\n --color-bg-primary: #fbfcfd;\n --color-bg-secondary: #f4f6f8;\n --color-bg-card: #ffffff;\n --color-bg-elevated: #ffffff;\n --color-bg-glass: rgba(255, 255, 255, 0.7);\n --color-bg-hover: rgba(15, 23, 42, 0.025);\n\n --color-text-primary: #1f2328;\n --color-text-secondary: #4a535e;\n --color-text-muted: #6a737d;\n\n --color-border: #e2e6ea;\n --color-border-hover: #cdd3da;\n\n --shadow-sm: 0 1px 2px 0 rgba(15, 23, 42, 0.05);\n --shadow-md: 0 4px 12px -2px rgba(15, 23, 42, 0.08);\n --shadow-lg: 0 12px 28px -6px rgba(15, 23, 42, 0.12);\n --shadow-glow: 0 4px 16px -2px rgba(99, 102, 241, 0.25);\n\n --color-text-inverse: #ffffff;\n\n --tint-strength: 0.1;\n --tint-border: 0.28;\n --badge-text-lightness: 38%;\n}\n\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n @view-transition {\n navigation: auto;\n }\n}\n\nbody {\n font-family: var(--font-sans);\n background: var(--color-bg-primary);\n color: var(--color-text-primary);\n line-height: 1.6;\n min-height: 100vh;\n overflow-x: hidden;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n font-size: 15px;\n}\n\n.container {\n max-width: 1240px;\n margin: 0 auto;\n padding: 0 1.5rem;\n}\n\n/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.header {\n background: color-mix(in srgb, var(--color-bg-primary) 80%, transparent);\n backdrop-filter: blur(12px);\n border-bottom: 1px solid var(--color-border);\n position: sticky;\n top: 0;\n z-index: 100;\n}\n\n.header-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.85rem 0;\n}\n\n.logo {\n display: inline-flex;\n align-items: center;\n gap: 0.65rem;\n text-decoration: none;\n color: var(--color-text-primary);\n font-weight: 600;\n font-size: 1.0rem;\n letter-spacing: -0.01em;\n transition: color 0.15s ease;\n margin-top: 0;\n}\n\n.logo:hover {\n color: var(--color-text-primary);\n text-decoration: none;\n}\n\n.logo-icon {\n color: #fff;\n width: 30px;\n height: 30px;\n background: var(--gradient-primary);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n font-size: 0.8rem;\n letter-spacing: 0.02em;\n box-shadow: var(--shadow-sm);\n}\n\n.logo img {\n width: 30px;\n height: 30px;\n border-radius: 8px;\n}\n\n/* Theme Toggle Button */\n.theme-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.45rem 0.85rem;\n background: var(--color-bg-card);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n color: var(--color-text-secondary);\n font-size: 0.8rem;\n font-weight: 500;\n font-family: inherit;\n transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;\n cursor: pointer;\n}\n\n.theme-toggle:hover {\n border-color: var(--color-border-hover);\n color: var(--color-text-primary);\n background: var(--color-bg-elevated);\n}\n\n.theme-toggle-icon {\n font-size: 1rem;\n line-height: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n}\n\n.theme-toggle:hover .theme-toggle-icon { color: var(--color-text-primary); }\n.theme-toggle-icon svg { display: block; }\n\n/* \u2500\u2500 Typography \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nh1, h2, h3 {\n color: var(--color-text-primary);\n font-weight: 600;\n letter-spacing: -0.02em;\n margin-bottom: 0.4em;\n}\n\nh1 {\n font-size: 2rem;\n font-weight: 680;\n margin-bottom: 0.5rem;\n line-height: 1.2;\n}\n\nh2 {\n font-size: 1.2rem;\n font-weight: 600;\n}\n\nh3 {\n font-size: 1.05rem;\n font-weight: 600;\n}\n\n/* Focus styles for accessibility */\n*:focus {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n*:focus:not(:focus-visible) { outline: none; }\n*:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\na {\n color: var(--color-primary-light);\n text-decoration: none;\n transition: color 0.15s ease;\n border-radius: 4px;\n}\na:hover { color: var(--color-primary); text-decoration: underline; }\na:focus { color: var(--color-primary); }\n\n[data-theme=\"light\"] a { color: var(--color-primary-dark); }\n\n#components-list a:hover { text-decoration: none; }\n\np { margin-top: 0; }\n\n.back {\n width: 100%;\n margin-bottom: 1.5em;\n display: block;\n color: var(--color-text-muted);\n font-size: 0.9em;\n}\n\n/* \u2500\u2500 Hero \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.hero {\n padding: 2.5rem 0 1.5rem;\n position: relative;\n}\n\n.hero h1 { text-align: left; }\n\n.component-title {\n font-family: var(--font-mono);\n font-weight: 600;\n font-size: 1.85rem;\n letter-spacing: -0.01em;\n}\n\n.component-description {\n color: var(--color-text-secondary);\n max-width: 70ch;\n margin-bottom: 0.5rem;\n font-size: 1rem;\n}\n\n.version-selector {\n display: inline-flex;\n align-items: center;\n gap: 0.6rem;\n margin: 0.75rem 0;\n}\n\n.version-label {\n color: var(--color-text-muted);\n font-size: 0.85rem;\n font-weight: 500;\n}\n\n/* \u2500\u2500 Stats badge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.stats-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.6rem;\n background: var(--color-bg-card);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n padding: 0.5rem 0.9rem;\n margin: 1rem 0 0;\n color: var(--color-text-secondary);\n font-size: 0.85rem;\n font-weight: 500;\n max-width: fit-content;\n}\n\n.stats-badge .chart-icon {\n display: flex;\n align-items: flex-end;\n gap: 2px;\n height: 16px;\n}\n\n.stats-badge .chart-bar { width: 3px; border-radius: 2px; }\n.stats-badge .chart-bar:nth-child(1) { height: 8px; background: var(--color-primary-light); }\n.stats-badge .chart-bar:nth-child(2) { height: 12px; background: var(--color-primary); }\n.stats-badge .chart-bar:nth-child(3) { height: 16px; background: var(--color-primary-dark); }\n\n.stats-badge .badge-text {\n color: var(--color-text-secondary);\n font-size: 0.85rem;\n font-weight: 500;\n white-space: nowrap;\n display: inline-flex;\n align-items: center;\n}\n\n/* \u2500\u2500 Main layout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.main-content {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 320px;\n gap: 1.75rem;\n padding: 1rem 0 3rem;\n align-items: start;\n}\n\n.sidebar {\n display: grid;\n gap: 1.25rem;\n align-content: start;\n position: sticky;\n top: 5rem;\n}\n\n/* \u2500\u2500 Tabs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n#menuList {\n display: flex;\n gap: 0.25rem;\n border-bottom: 1px solid var(--color-border);\n margin-bottom: 1.5rem !important;\n overflow-x: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n#menuList::-webkit-scrollbar { display: none; height: 0; }\n\na.tab-link {\n color: var(--color-text-secondary);\n font-weight: 500;\n padding: 0.6rem 0.9rem;\n border-radius: 0;\n transition: color 0.15s ease, border-color 0.15s ease;\n font-size: 0.9rem;\n line-height: 1.2;\n display: inline-block;\n border: none;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n white-space: nowrap;\n}\n\na.tab-link:hover {\n color: var(--color-text-primary);\n background: transparent;\n text-decoration: none;\n}\n\na.tab-link.selected {\n color: var(--color-primary-light);\n background: transparent;\n text-decoration: none;\n border-bottom-color: var(--color-primary);\n}\n\n[data-theme=\"light\"] a.tab-link.selected { color: var(--color-primary-dark); }\n\n/* \u2500\u2500 Cards / sections \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.content-section {\n background: var(--color-bg-card);\n border-radius: var(--radius-lg);\n border: 1px solid var(--color-border);\n overflow: hidden;\n margin-bottom: 1.5rem;\n}\n\n.section-header {\n padding: 1rem 1.5rem;\n background: var(--color-bg-glass);\n border-bottom: 1px solid var(--color-border);\n display: flex;\n align-items: center;\n gap: 0.7rem;\n}\n\n.section-title {\n font-size: 1.05rem;\n font-weight: 600;\n color: var(--color-text-primary);\n letter-spacing: -0.01em;\n}\n\n.section-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--color-primary-light);\n flex-shrink: 0;\n}\n\n.section-icon svg { width: 18px; height: 18px; display: block; }\n\n[data-theme=\"light\"] .section-icon { color: var(--color-primary); }\n\n.section-content { padding: 1.5rem; }\n\n.box {\n background: var(--color-bg-card);\n border-radius: var(--radius-lg);\n border: 1px solid var(--color-border);\n padding: 1.25rem;\n margin-bottom: 1.5em;\n}\n\n/* \u2500\u2500 Info cards (sidebar) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.info-card {\n background: var(--color-bg-card);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-lg);\n padding: 1.25rem 1.35rem;\n}\n\n.info-card .section-title {\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-muted);\n font-weight: 600;\n margin-bottom: 1rem !important;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.info-card .section-title svg { width: 15px; height: 15px; color: var(--color-text-muted); }\n\n.info-item {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.6rem 0;\n border-bottom: 1px solid var(--color-border);\n font-size: 0.875rem;\n}\n\n.info-item:last-child { border-bottom: none; padding-bottom: 0; }\n.info-item:first-of-type { padding-top: 0; }\n\n.info-label {\n font-weight: 500;\n color: var(--color-text-muted);\n flex-shrink: 0;\n}\n\n.info-value {\n color: var(--color-text-primary);\n text-align: right;\n word-break: break-word;\n font-weight: 450;\n}\n\n.info-value a { word-break: break-all; }\n\n/* \u2500\u2500 List / table rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n#components-list.box,\n#components-history.box,\n#components-templates.box,\n#components-dependencies.box,\n#components-plugins.box {\n padding: 0;\n overflow: hidden;\n}\n\n.row {\n background: transparent;\n border: none;\n border-bottom: 1px solid var(--color-border);\n border-radius: 0;\n width: 100%;\n display: flex;\n padding: 0.9rem 1.25rem;\n box-sizing: border-box;\n margin-bottom: 0;\n align-items: center;\n box-shadow: none;\n transition: background 0.12s ease;\n gap: 0.5rem;\n}\n\n.row:last-child { border-bottom: none; }\n\n.row.header {\n background: var(--color-bg-glass);\n border: none;\n border-bottom: 1px solid var(--color-border) !important;\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n border-radius: 0;\n box-shadow: none;\n color: var(--color-text-muted);\n}\n\n.row.header div {\n font-weight: 600;\n margin: 0;\n align-self: center;\n}\n\n.row.double { min-height: 56px; }\n.row div { word-wrap: break-word; }\n.row span { padding-right: 10px; }\n\n/* clickable component rows (anchors that wrap an entire row) */\n#components-list > a,\n#components-history a,\n#components-dependencies > a {\n display: block;\n color: inherit;\n}\n\n.componentRow { transition: background 0.12s ease; }\n\n.componentRow:hover {\n background: var(--color-bg-hover);\n box-shadow: none;\n border-color: var(--color-border);\n transform: none;\n}\n\n#components-list > a:focus-visible,\n#components-history a:focus-visible,\n#components-dependencies > a:focus-visible {\n outline: none;\n}\n\n#components-list > a:focus-visible .componentRow,\n#components-history a:focus-visible .componentRow,\n#components-dependencies > a:focus-visible .componentRow {\n background: var(--color-bg-hover);\n box-shadow: inset 2px 0 0 var(--color-primary);\n}\n\n.componentRow .title .name {\n font-weight: 600;\n font-size: 0.95rem;\n margin: 0;\n width: 100%;\n color: var(--color-text-primary);\n letter-spacing: -0.005em;\n}\n\n.componentRow:hover .title .name { color: var(--color-primary-light); }\n[data-theme=\"light\"] .componentRow:hover .title .name { color: var(--color-primary-dark); }\n\n.componentRow .release {\n font-size: 0.9rem;\n margin: 0;\n width: 100%;\n color: var(--color-text-secondary);\n}\n\n.componentRow .release a { color: var(--color-primary-light); }\n[data-theme=\"light\"] .componentRow .release a { color: var(--color-primary-dark); }\n\n.componentRow .title .description {\n padding: 0;\n font-size: 0.85rem;\n color: var(--color-text-muted);\n margin-top: 0.15rem;\n line-height: 1.45;\n}\n\n.row > * {\n flex: 0 1 9%;\n padding: 0 0.35rem;\n align-self: center;\n font-size: 0.875rem;\n}\n\n.row > *:last-child { padding-right: 0; }\n.row > *:first-child { padding-left: 0; }\n\n.release,\n.title,\n.filters > * {\n flex: 1 0;\n}\n\n.title {\n display: flex;\n flex-direction: column;\n gap: 0.1rem;\n}\n\n.author {\n flex: 0 1 15%;\n word-break: break-word;\n color: var(--color-text-secondary);\n font-size: 0.85rem;\n}\n\n.date { color: var(--color-text-muted); font-size: 0.85rem; }\n.activity { color: var(--color-text-secondary); font-size: 0.85rem; }\n\n/* \u2500\u2500 Filters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.filters {\n width: 100%;\n display: flex;\n justify-content: space-between;\n gap: 0.75rem;\n margin: 0;\n padding: 1.25rem 1.25rem 0.75rem;\n}\n\n.filters input {\n color: var(--color-text-primary);\n background-color: var(--color-bg-secondary);\n margin-bottom: 0;\n}\n\n#author-filter { flex: 0 1 30%; }\n\n.states {\n width: 100%;\n margin: 0;\n padding: 0 1.25rem 1.25rem;\n display: flex;\n align-items: center;\n gap: 1.25rem;\n flex-wrap: wrap;\n border-bottom: 1px solid var(--color-border);\n}\n\n.states > span {\n color: var(--color-text-muted);\n font-weight: 500;\n font-size: 0.8rem;\n}\n\n.states input { margin-right: 6px; }\n\n/* \u2500\u2500 List results meta bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.list-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.7rem 1.25rem;\n font-size: 0.8rem;\n color: var(--color-text-muted);\n font-weight: 500;\n}\n\n#results-count { color: var(--color-text-secondary); }\n\n/* \u2500\u2500 Component URL copy group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.url-input-group {\n display: flex;\n gap: 0.5rem;\n align-items: stretch;\n}\n\n.url-input-group #href {\n flex: 1;\n margin-bottom: 0;\n padding: 0.7rem 0.9rem;\n}\n\n.url-input-group .copy-href {\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.copy-href.copied {\n color: color-mix(in srgb, #10b981 70%, var(--color-text-primary));\n border-color: color-mix(in srgb, #10b981 var(--tint-border), transparent);\n background: color-mix(in srgb, #10b981 var(--tint-strength), transparent);\n}\n\n/* \u2500\u2500 Forms \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\ninput[type=\"text\"],\ninput[type=\"number\"],\ntextarea,\nselect {\n background: var(--color-bg-secondary);\n border: 1px solid var(--color-border);\n color: var(--color-text-primary);\n padding: 0.6rem 0.85rem;\n border-radius: var(--radius-md);\n font-family: inherit;\n font-size: 0.9rem;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n margin-bottom: 10px;\n box-sizing: border-box;\n}\n\ninput[type=\"text\"]:focus,\ninput[type=\"number\"]:focus,\ntextarea:focus,\nselect:focus {\n outline: none;\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent);\n}\n\ninput::placeholder { color: var(--color-text-muted); }\n\nselect {\n cursor: pointer;\n padding-right: 2rem;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%237d8693' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 0.7rem center;\n}\n\n#versions { margin-left: 0; min-width: 160px; margin-bottom: 0; }\n\n.w-100 { width: 100%; }\n.table { width: 100%; }\n\n/* \u2500\u2500 Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 0.9rem;\n border-radius: var(--radius-md);\n font-size: 0.85rem;\n font-weight: 500;\n text-decoration: none;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n cursor: pointer;\n font-family: inherit;\n line-height: 1.2;\n}\n\n.btn-primary { background: var(--color-primary); color: #fff; }\n.btn-primary:hover {\n background: var(--color-primary-dark);\n color: #fff;\n text-decoration: none;\n box-shadow: var(--shadow-glow);\n}\n\n.btn-secondary {\n background: var(--color-bg-card);\n color: var(--color-text-primary);\n border: 1px solid var(--color-border);\n}\n.btn-secondary:hover {\n border-color: var(--color-border-hover);\n background: var(--color-bg-elevated);\n color: var(--color-text-primary);\n text-decoration: none;\n}\n\n/* \u2500\u2500 Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.field { width: 100%; margin-bottom: 1em; }\n\n.field p,\n.field span,\n.field a {\n margin: 0;\n font-weight: 500;\n}\n\n.field p {\n color: var(--color-text-muted);\n font-weight: 600;\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 0.4rem;\n}\n\n#href {\n height: auto;\n font-family: var(--font-mono) !important;\n font-size: 0.825rem !important;\n}\n\n/* \u2500\u2500 Checkbox \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.checkbox-wrapper {\n display: inline-flex;\n align-items: center;\n gap: 0.6rem;\n cursor: pointer;\n user-select: none;\n}\n\n.checkbox-input {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n}\n\n.checkbox-custom {\n position: relative;\n width: 18px;\n height: 18px;\n background: var(--color-bg-secondary);\n border: 1.5px solid var(--color-border-hover);\n border-radius: 5px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.checkbox-input:checked + .checkbox-custom {\n background: var(--color-primary);\n border-color: var(--color-primary);\n}\n\n.checkbox-input:focus-visible + .checkbox-custom {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.checkbox-icon {\n width: 11px;\n height: 11px;\n stroke: #fff;\n stroke-width: 2.5;\n fill: none;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n transform: scale(0.7);\n transition: all 0.15s ease;\n}\n\n.checkbox-input:checked + .checkbox-custom .checkbox-icon {\n opacity: 1;\n transform: scale(1);\n}\n\n.checkbox-wrapper:hover .checkbox-custom { border-color: var(--color-primary-light); }\n\n/* \u2500\u2500 State badges \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.state,\n.state-badge {\n display: inline-flex;\n align-items: center;\n font-size: 0.72rem;\n font-weight: 600;\n padding: 0.18rem 0.55rem;\n border-radius: var(--radius-full);\n white-space: nowrap;\n transition: none;\n border: 1px solid transparent;\n box-shadow: none;\n text-transform: capitalize;\n letter-spacing: 0.01em;\n line-height: 1.4;\n}\n\n.state-badge { margin-left: 0.6rem; }\n.state { margin-right: 0; }\n\n.state-badge:hover { transform: none; box-shadow: none; }\n\n.mobile-compact { display: none; }\n\n/* Tinted, flat state badges (per-state hue) */\n.component-state-experimental {\n background: color-mix(in srgb, #f59e0b var(--tint-strength), transparent);\n color: color-mix(in srgb, #f59e0b var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #f59e0b var(--tint-border), transparent);\n}\n.component-state-deprecated {\n background: color-mix(in srgb, #ef4444 var(--tint-strength), transparent);\n color: color-mix(in srgb, #ef4444 var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #ef4444 var(--tint-border), transparent);\n}\n.component-state-stable {\n background: color-mix(in srgb, #10b981 var(--tint-strength), transparent);\n color: color-mix(in srgb, #10b981 var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #10b981 var(--tint-border), transparent);\n}\n.component-state-beta {\n background: color-mix(in srgb, #3b82f6 var(--tint-strength), transparent);\n color: color-mix(in srgb, #3b82f6 var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #3b82f6 var(--tint-border), transparent);\n}\n.component-state-alpha {\n background: color-mix(in srgb, #8b5cf6 var(--tint-strength), transparent);\n color: color-mix(in srgb, #8b5cf6 var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #8b5cf6 var(--tint-border), transparent);\n}\n\n.bold { font-weight: 600; }\n.hide { display: none !important; }\n\n/* \u2500\u2500 Breadcrumb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.breadcrumb {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--color-text-secondary);\n font-size: 0.85rem;\n margin-bottom: 1rem;\n}\n\n.breadcrumb a { color: var(--color-text-muted); font-weight: 500; }\n.breadcrumb a:hover { color: var(--color-primary); text-decoration: none; }\n\n/* \u2500\u2500 Parameters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.parameter-grid { display: grid; gap: 1rem; }\n\n.parameter-item {\n background: var(--color-bg-secondary);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n padding: 1.1rem 1.25rem;\n transition: border-color 0.15s ease;\n}\n\n.parameter-item:hover { border-color: var(--color-border-hover); box-shadow: none; }\n\n.parameter-header {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n margin-bottom: 0.65rem;\n flex-wrap: wrap;\n}\n\n.parameter-name {\n font-weight: 600;\n color: var(--color-text-primary);\n font-family: var(--font-mono);\n font-size: 0.9rem;\n}\n\n.parameter-type {\n background: var(--color-bg-elevated);\n color: var(--color-text-secondary);\n border: 1px solid var(--color-border);\n padding: 0.12rem 0.5rem;\n border-radius: var(--radius-full);\n font-size: 0.7rem;\n font-weight: 500;\n}\n\n.parameter-required {\n background: color-mix(in srgb, var(--color-accent) var(--tint-strength), transparent);\n color: color-mix(in srgb, var(--color-accent) var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, var(--color-accent) var(--tint-border), transparent);\n}\n\n.parameter-description {\n color: var(--color-text-secondary);\n margin-bottom: 0.65rem;\n line-height: 1.5;\n font-size: 0.875rem;\n}\n\n.parameter-description strong { color: var(--color-text-primary); font-weight: 600; }\n\n.parameter-input {\n width: 100%;\n background: var(--color-bg-card);\n border: 1px solid var(--color-border);\n color: var(--color-text-primary);\n padding: 0.55rem 0.8rem;\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: 0.85rem;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n margin-bottom: 0;\n}\n\n.parameter-input:focus {\n outline: none;\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent);\n}\n\n/* \u2500\u2500 Preview \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.preview-section {\n background: var(--color-bg-card);\n border-radius: var(--radius-lg);\n border: 1px solid var(--color-border);\n overflow: hidden;\n margin-top: 1.5rem;\n}\n\n.preview-controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.85rem 1.5rem;\n background: var(--color-bg-glass);\n border-bottom: 1px solid var(--color-border);\n gap: 1rem;\n flex-wrap: wrap;\n}\n\n.preview-buttons { display: flex; gap: 0.6rem; }\n\n.preview-iframe,\n.preview iframe {\n width: 100%;\n height: 500px;\n border: none;\n background: #fff;\n display: block;\n}\n\n.code,\n.preview {\n width: 100%;\n background: var(--color-bg-card);\n border-radius: var(--radius-lg);\n box-shadow: none;\n margin-bottom: 1.5em;\n border: 1px solid var(--color-border);\n overflow: hidden;\n}\n\n.preview { height: 500px; }\n\n/* \u2500\u2500 Collapsible \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.collapsible-header {\n cursor: pointer;\n user-select: none;\n position: relative;\n transition: background 0.15s ease;\n}\n\n.collapsible-header:hover { background: var(--color-bg-hover); }\n\n.collapse-toggle {\n position: absolute;\n right: 1.25rem;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n color: var(--color-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n padding: 0.4rem;\n border-radius: var(--radius-sm);\n transition: color 0.15s ease, background 0.15s ease;\n}\n\n.collapse-toggle:hover { background: var(--color-bg-hover); color: var(--color-text-primary); }\n\n.collapse-icon { transition: transform 0.2s ease; display: inline-block; }\n\n.collapsible-content { overflow: hidden; transition: all 0.25s ease; }\n\n.collapsible-content.collapsed { max-height: 0; padding-top: 0; padding-bottom: 0; opacity: 0; }\n.collapsible-content.expanded { max-height: 2000px; opacity: 1; }\n\n.collapsible-header.collapsed .collapse-icon { transform: rotate(-90deg); }\n\n/* \u2500\u2500 Loading / empty / error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.loader { text-align: center; padding: 2em; color: var(--color-text-muted); }\n\n.empty-state {\n text-align: center;\n padding: 2.5em 2em;\n color: var(--color-text-muted);\n margin: 0;\n}\n\n.loader p { margin: 0; }\n\n.loader::before {\n content: '';\n display: inline-block;\n width: 18px;\n height: 18px;\n border: 2px solid var(--color-border);\n border-top: 2px solid var(--color-primary);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin-right: 0.6em;\n vertical-align: middle;\n}\n\n@keyframes spin { to { transform: rotate(360deg); } }\n\n.loading-more {\n text-align: center;\n padding: 1em 2em;\n color: var(--color-text-muted);\n font-size: 0.85em;\n border-top: 1px solid var(--color-border);\n}\n\n.loading-more::before {\n content: '';\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid var(--color-border);\n border-top: 2px solid var(--color-primary);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin-right: 0.5em;\n vertical-align: middle;\n}\n\n#history-error {\n text-align: center;\n padding: 1.5em 2em;\n color: color-mix(in srgb, #ef4444 70%, var(--color-text-primary));\n background-color: color-mix(in srgb, #ef4444 var(--tint-strength), transparent);\n border: 1px solid color-mix(in srgb, #ef4444 var(--tint-border), transparent);\n border-radius: var(--radius-md);\n margin: 1em;\n}\n\n#history-error p { margin: 0; }\n\n/* \u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.social {\n width: 100%;\n margin-top: 0;\n padding: 2rem 0 2.5rem;\n text-align: center;\n border-top: 1px solid var(--color-border);\n color: var(--color-text-muted);\n font-size: 0.85rem;\n}\n\n/* \u2500\u2500 Scrollbar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n::-webkit-scrollbar { width: 10px; height: 10px; }\n::-webkit-scrollbar-track { background: transparent; }\n::-webkit-scrollbar-thumb { background: var(--color-border-hover); border-radius: 5px; border: 2px solid var(--color-bg-primary); }\n::-webkit-scrollbar-thumb:hover { background: var(--color-text-muted); }\n\n/* \u2500\u2500 Animations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes fadeInUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 1024px) {\n .container { padding: 0 1.25rem; }\n h1 { font-size: 1.75rem; }\n .main-content { grid-template-columns: 1fr; gap: 1.25rem; }\n .sidebar { order: -1; position: static; }\n .info-item { display: flex; justify-content: space-between; }\n .collapsible-content { max-height: 0; padding-top: 0; padding-bottom: 0; opacity: 0; }\n .collapsible-header.collapsed .collapse-icon { transform: rotate(-90deg); }\n}\n\n@media (max-width: 900px) {\n .container { padding: 0 1rem; }\n .main-content { padding: 0.5rem 0 2rem; gap: 1rem; }\n .filters { flex-direction: column; gap: 0.5em; }\n #author-filter { flex: 1 0; }\n\n .row.header { display: none; }\n\n .componentRow {\n flex-direction: column !important;\n align-items: flex-start !important;\n padding: 1rem 1.25rem !important;\n gap: 0.6rem !important;\n text-align: left !important;\n }\n\n .componentRow > .author,\n .componentRow > .date,\n .componentRow > .activity,\n .componentRow > div:not(.title):not(.state):not(.mobile-compact) {\n display: none !important;\n }\n\n .mobile-compact { display: block !important; width: 100%; }\n\n .mobile-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n font-size: 0.8rem;\n color: var(--color-text-secondary);\n width: 100%;\n }\n\n .mobile-meta span {\n background: var(--color-bg-secondary);\n padding: 0.2rem 0.5rem;\n border-radius: var(--radius-sm);\n border: 1px solid var(--color-border);\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .mobile-author { color: var(--color-text-secondary) !important; }\n .mobile-version { color: var(--color-text-primary) !important; font-weight: 600; }\n .mobile-date { color: var(--color-text-muted) !important; }\n .mobile-activity { color: var(--color-text-secondary) !important; }\n .mobile-size { color: var(--color-text-secondary) !important; }\n\n .componentRow .title { text-align: left !important; width: 100%; }\n .componentRow .title .name { text-align: left !important; }\n .componentRow .title .description { text-align: left !important; }\n\n .box, .info-card, .section-content { }\n .section-content { padding: 1.25rem; }\n\n .sidebar .info-item { flex-direction: column; align-items: flex-start; gap: 0.3rem; }\n .sidebar .info-label { min-width: auto; font-weight: 600; }\n .sidebar .info-value { text-align: left; margin-left: 0; }\n\n h1 { font-size: 1.6rem; }\n .component-title { font-size: 1.5rem; }\n .preview-controls { flex-direction: column; align-items: stretch; }\n .preview-buttons { justify-content: stretch; }\n .preview-buttons .btn { flex: 1; justify-content: center; }\n}\n ";
1
+ declare const _default: "\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;450;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\");\n\n:root {\n /* Brand accent (consistent across themes) */\n --color-primary: #6366f1;\n --color-primary-dark: #4f46e5;\n --color-primary-light: #818cf8;\n --color-secondary: #0891b2;\n --color-accent: #d97706;\n\n --gradient-primary: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n\n /* Spacing / radius scale */\n --radius-sm: 6px;\n --radius-md: 10px;\n --radius-lg: 14px;\n --radius-full: 999px;\n\n --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --font-mono: 'JetBrains Mono', 'SFMono-Regular', Menlo, Monaco, Consolas, monospace;\n}\n\n/* Dark theme (default) */\n:root, [data-theme=\"dark\"] {\n --color-bg-primary: #0b0e14;\n --color-bg-secondary: #11151d;\n --color-bg-card: #11151d;\n --color-bg-elevated: #161c26;\n --color-bg-glass: rgba(255, 255, 255, 0.04);\n --color-bg-hover: rgba(255, 255, 255, 0.035);\n\n --color-text-primary: #e6edf3;\n --color-text-secondary: #aeb6c2;\n --color-text-muted: #7d8693;\n\n --color-border: #222a37;\n --color-border-hover: #323c4d;\n\n --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);\n --shadow-md: 0 4px 12px -2px rgba(0, 0, 0, 0.4);\n --shadow-lg: 0 12px 28px -6px rgba(0, 0, 0, 0.5);\n --shadow-glow: 0 4px 16px -2px rgba(99, 102, 241, 0.4);\n\n --color-text-inverse: #ffffff;\n\n --tint-strength: 0.16;\n --tint-border: 0.32;\n --badge-text-lightness: 78%;\n}\n\n/* Light theme */\n[data-theme=\"light\"] {\n --color-bg-primary: #fbfcfd;\n --color-bg-secondary: #f4f6f8;\n --color-bg-card: #ffffff;\n --color-bg-elevated: #ffffff;\n --color-bg-glass: rgba(255, 255, 255, 0.7);\n --color-bg-hover: rgba(15, 23, 42, 0.025);\n\n --color-text-primary: #1f2328;\n --color-text-secondary: #4a535e;\n --color-text-muted: #6a737d;\n\n --color-border: #e2e6ea;\n --color-border-hover: #cdd3da;\n\n --shadow-sm: 0 1px 2px 0 rgba(15, 23, 42, 0.05);\n --shadow-md: 0 4px 12px -2px rgba(15, 23, 42, 0.08);\n --shadow-lg: 0 12px 28px -6px rgba(15, 23, 42, 0.12);\n --shadow-glow: 0 4px 16px -2px rgba(99, 102, 241, 0.25);\n\n --color-text-inverse: #ffffff;\n\n --tint-strength: 0.1;\n --tint-border: 0.28;\n --badge-text-lightness: 38%;\n}\n\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n @view-transition {\n navigation: auto;\n }\n}\n\nbody {\n font-family: var(--font-sans);\n background: var(--color-bg-primary);\n color: var(--color-text-primary);\n line-height: 1.6;\n min-height: 100vh;\n overflow-x: hidden;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n font-size: 15px;\n}\n\n.container {\n max-width: 1240px;\n margin: 0 auto;\n padding: 0 1.5rem;\n}\n\n/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.header {\n background: color-mix(in srgb, var(--color-bg-primary) 80%, transparent);\n backdrop-filter: blur(12px);\n border-bottom: 1px solid var(--color-border);\n position: sticky;\n top: 0;\n z-index: 100;\n}\n\n.header-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.85rem 0;\n}\n\n.logo {\n display: inline-flex;\n align-items: center;\n gap: 0.65rem;\n text-decoration: none;\n color: var(--color-text-primary);\n font-weight: 600;\n font-size: 1.0rem;\n letter-spacing: -0.01em;\n transition: color 0.15s ease;\n margin-top: 0;\n}\n\n.logo:hover {\n color: var(--color-text-primary);\n text-decoration: none;\n}\n\n.logo-icon {\n color: #fff;\n width: 30px;\n height: 30px;\n background: var(--gradient-primary);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n font-size: 0.8rem;\n letter-spacing: 0.02em;\n box-shadow: var(--shadow-sm);\n}\n\n.logo img {\n width: 30px;\n height: 30px;\n border-radius: 8px;\n}\n\n/* Theme Toggle Button */\n.theme-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.45rem 0.85rem;\n background: var(--color-bg-card);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n color: var(--color-text-secondary);\n font-size: 0.8rem;\n font-weight: 500;\n font-family: inherit;\n transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;\n cursor: pointer;\n}\n\n.theme-toggle:hover {\n border-color: var(--color-border-hover);\n color: var(--color-text-primary);\n background: var(--color-bg-elevated);\n}\n\n.theme-toggle-icon {\n font-size: 1rem;\n line-height: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n}\n\n.theme-toggle:hover .theme-toggle-icon { color: var(--color-text-primary); }\n.theme-toggle-icon svg { display: block; }\n\n/* \u2500\u2500 Typography \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nh1, h2, h3 {\n color: var(--color-text-primary);\n font-weight: 600;\n letter-spacing: -0.02em;\n margin-bottom: 0.4em;\n}\n\nh1 {\n font-size: 2rem;\n font-weight: 680;\n margin-bottom: 0.5rem;\n line-height: 1.2;\n}\n\nh2 {\n font-size: 1.2rem;\n font-weight: 600;\n}\n\nh3 {\n font-size: 1.05rem;\n font-weight: 600;\n}\n\n/* Focus styles for accessibility */\n*:focus {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n*:focus:not(:focus-visible) { outline: none; }\n*:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\na {\n color: var(--color-primary-light);\n text-decoration: none;\n transition: color 0.15s ease;\n border-radius: 4px;\n}\na:hover { color: var(--color-primary); text-decoration: underline; }\na:focus { color: var(--color-primary); }\n\n[data-theme=\"light\"] a { color: var(--color-primary-dark); }\n\n#components-list a:hover { text-decoration: none; }\n\np { margin-top: 0; }\n\n.back {\n width: 100%;\n margin-bottom: 1.5em;\n display: block;\n color: var(--color-text-muted);\n font-size: 0.9em;\n}\n\n/* \u2500\u2500 Hero \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.hero {\n padding: 2.5rem 0 1.5rem;\n position: relative;\n}\n\n.hero h1 { text-align: left; }\n\n.component-title {\n font-family: var(--font-mono);\n font-weight: 600;\n font-size: 1.85rem;\n letter-spacing: -0.01em;\n}\n\n.component-description {\n color: var(--color-text-secondary);\n max-width: 70ch;\n margin-bottom: 0.5rem;\n font-size: 1rem;\n}\n\n.version-selector {\n display: inline-flex;\n align-items: center;\n gap: 0.6rem;\n margin: 0.75rem 0;\n}\n\n.version-label {\n color: var(--color-text-muted);\n font-size: 0.85rem;\n font-weight: 500;\n}\n\n/* \u2500\u2500 Stats badge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.stats-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.6rem;\n background: var(--color-bg-card);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n padding: 0.5rem 0.9rem;\n margin: 1rem 0 0;\n color: var(--color-text-secondary);\n font-size: 0.85rem;\n font-weight: 500;\n max-width: fit-content;\n}\n\n.stats-badge .chart-icon {\n display: flex;\n align-items: flex-end;\n gap: 2px;\n height: 16px;\n}\n\n.stats-badge .chart-bar { width: 3px; border-radius: 2px; }\n.stats-badge .chart-bar:nth-child(1) { height: 8px; background: var(--color-primary-light); }\n.stats-badge .chart-bar:nth-child(2) { height: 12px; background: var(--color-primary); }\n.stats-badge .chart-bar:nth-child(3) { height: 16px; background: var(--color-primary-dark); }\n\n.stats-badge .badge-text {\n color: var(--color-text-secondary);\n font-size: 0.85rem;\n font-weight: 500;\n white-space: nowrap;\n display: inline-flex;\n align-items: center;\n}\n\n/* \u2500\u2500 Main layout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.main-content {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 320px;\n gap: 1.75rem;\n padding: 1rem 0 3rem;\n align-items: start;\n}\n\n.sidebar {\n display: grid;\n gap: 1.25rem;\n align-content: start;\n position: sticky;\n top: 5rem;\n}\n\n/* \u2500\u2500 Tabs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n#menuList {\n display: flex;\n gap: 0.25rem;\n border-bottom: 1px solid var(--color-border);\n margin-bottom: 1.5rem !important;\n overflow-x: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n#menuList::-webkit-scrollbar { display: none; height: 0; }\n\na.tab-link {\n color: var(--color-text-secondary);\n font-weight: 500;\n padding: 0.6rem 0.9rem;\n border-radius: 0;\n transition: color 0.15s ease, border-color 0.15s ease;\n font-size: 0.9rem;\n line-height: 1.2;\n display: inline-block;\n border: none;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n white-space: nowrap;\n}\n\na.tab-link:hover {\n color: var(--color-text-primary);\n background: transparent;\n text-decoration: none;\n}\n\na.tab-link.selected {\n color: var(--color-primary-light);\n background: transparent;\n text-decoration: none;\n border-bottom-color: var(--color-primary);\n}\n\n[data-theme=\"light\"] a.tab-link.selected { color: var(--color-primary-dark); }\n\n/* \u2500\u2500 Cards / sections \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.content-section {\n background: var(--color-bg-card);\n border-radius: var(--radius-lg);\n border: 1px solid var(--color-border);\n overflow: hidden;\n margin-bottom: 1.5rem;\n}\n\n.section-header {\n padding: 1rem 1.5rem;\n background: var(--color-bg-glass);\n border-bottom: 1px solid var(--color-border);\n display: flex;\n align-items: center;\n gap: 0.7rem;\n}\n\n.section-title {\n font-size: 1.05rem;\n font-weight: 600;\n color: var(--color-text-primary);\n letter-spacing: -0.01em;\n}\n\n.section-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--color-primary-light);\n flex-shrink: 0;\n}\n\n.section-icon svg { width: 18px; height: 18px; display: block; }\n\n[data-theme=\"light\"] .section-icon { color: var(--color-primary); }\n\n.section-content { padding: 1.5rem; }\n\n.box {\n background: var(--color-bg-card);\n border-radius: var(--radius-lg);\n border: 1px solid var(--color-border);\n padding: 1.25rem;\n margin-bottom: 1.5em;\n}\n\n/* \u2500\u2500 Info cards (sidebar) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.info-card {\n background: var(--color-bg-card);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-lg);\n padding: 1.25rem 1.35rem;\n}\n\n.info-card .section-title {\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-muted);\n font-weight: 600;\n margin-bottom: 1rem !important;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.info-card .section-title svg { width: 15px; height: 15px; color: var(--color-text-muted); }\n\n.info-item {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.6rem 0;\n border-bottom: 1px solid var(--color-border);\n font-size: 0.875rem;\n}\n\n.info-item:last-child { border-bottom: none; padding-bottom: 0; }\n.info-item:first-of-type { padding-top: 0; }\n\n.info-label {\n font-weight: 500;\n color: var(--color-text-muted);\n flex-shrink: 0;\n}\n\n.info-value {\n color: var(--color-text-primary);\n text-align: right;\n word-break: break-word;\n font-weight: 450;\n}\n\n.info-value a { word-break: break-all; }\n\n/* \u2500\u2500 List / table rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n#components-list.box,\n#components-history.box,\n#components-templates.box,\n#components-dependencies.box,\n#components-plugins.box {\n padding: 0;\n overflow: hidden;\n}\n\n.row {\n background: transparent;\n border: none;\n border-bottom: 1px solid var(--color-border);\n border-radius: 0;\n width: 100%;\n display: flex;\n padding: 0.9rem 1.25rem;\n box-sizing: border-box;\n margin-bottom: 0;\n align-items: center;\n box-shadow: none;\n transition: background 0.12s ease;\n gap: 0.5rem;\n}\n\n.row:last-child { border-bottom: none; }\n\n.row.header {\n background: var(--color-bg-glass);\n border: none;\n border-bottom: 1px solid var(--color-border) !important;\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n border-radius: 0;\n box-shadow: none;\n color: var(--color-text-muted);\n}\n\n.row.header div {\n font-weight: 600;\n margin: 0;\n align-self: center;\n}\n\n.row.double { min-height: 56px; }\n.row div { word-wrap: break-word; }\n.row span { padding-right: 10px; }\n\n/* clickable component rows (anchors that wrap an entire row) */\n#components-list > a,\n#components-history a,\n#components-dependencies > a {\n display: block;\n color: inherit;\n}\n\n.componentRow { transition: background 0.12s ease; }\n\n.componentRow:hover {\n background: var(--color-bg-hover);\n box-shadow: none;\n border-color: var(--color-border);\n transform: none;\n}\n\n#components-list > a:focus-visible,\n#components-history a:focus-visible,\n#components-dependencies > a:focus-visible {\n outline: none;\n}\n\n#components-list > a:focus-visible .componentRow,\n#components-history a:focus-visible .componentRow,\n#components-dependencies > a:focus-visible .componentRow {\n background: var(--color-bg-hover);\n box-shadow: inset 2px 0 0 var(--color-primary);\n}\n\n.componentRow .title .name {\n font-weight: 600;\n font-size: 0.95rem;\n margin: 0;\n width: 100%;\n color: var(--color-text-primary);\n letter-spacing: -0.005em;\n}\n\n.componentRow:hover .title .name { color: var(--color-primary-light); }\n[data-theme=\"light\"] .componentRow:hover .title .name { color: var(--color-primary-dark); }\n\n.componentRow .release {\n font-size: 0.9rem;\n margin: 0;\n width: 100%;\n color: var(--color-text-secondary);\n}\n\n.componentRow .release a { color: var(--color-primary-light); }\n[data-theme=\"light\"] .componentRow .release a { color: var(--color-primary-dark); }\n\n.componentRow .title .description {\n padding: 0;\n font-size: 0.85rem;\n color: var(--color-text-muted);\n margin-top: 0.15rem;\n line-height: 1.45;\n}\n\n.row > * {\n flex: 0 1 9%;\n padding: 0 0.35rem;\n align-self: center;\n font-size: 0.875rem;\n}\n\n.row > *:last-child { padding-right: 0; }\n.row > *:first-child { padding-left: 0; }\n\n.release,\n.title,\n.filters > * {\n flex: 1 0;\n}\n\n.title {\n display: flex;\n flex-direction: column;\n gap: 0.1rem;\n}\n\n.author {\n flex: 0 1 15%;\n word-break: break-word;\n color: var(--color-text-secondary);\n font-size: 0.85rem;\n}\n\n.date { color: var(--color-text-muted); font-size: 0.85rem; }\n.activity { color: var(--color-text-secondary); font-size: 0.85rem; }\n\n/* \u2500\u2500 Filters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.filters {\n width: 100%;\n display: flex;\n justify-content: space-between;\n gap: 0.75rem;\n margin: 0;\n padding: 1.25rem 1.25rem 0.75rem;\n}\n\n.filters input {\n color: var(--color-text-primary);\n background-color: var(--color-bg-secondary);\n margin-bottom: 0;\n}\n\n#author-filter { flex: 0 1 30%; }\n\n.states {\n width: 100%;\n margin: 0;\n padding: 0 1.25rem 1.25rem;\n display: flex;\n align-items: center;\n gap: 1.25rem;\n flex-wrap: wrap;\n border-bottom: 1px solid var(--color-border);\n}\n\n.states > span {\n color: var(--color-text-muted);\n font-weight: 500;\n font-size: 0.8rem;\n}\n\n.states input { margin-right: 6px; }\n\n/* \u2500\u2500 List results meta bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.list-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.7rem 1.25rem;\n font-size: 0.8rem;\n color: var(--color-text-muted);\n font-weight: 500;\n}\n\n#results-count { color: var(--color-text-secondary); }\n\n/* \u2500\u2500 Component URL copy group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.url-input-group {\n display: flex;\n gap: 0.5rem;\n align-items: stretch;\n}\n\n.url-input-group #href {\n flex: 1;\n margin-bottom: 0;\n padding: 0.7rem 0.9rem;\n}\n\n.url-input-group .copy-href {\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.copy-href.copied {\n color: color-mix(in srgb, #10b981 70%, var(--color-text-primary));\n border-color: color-mix(in srgb, #10b981 var(--tint-border), transparent);\n background: color-mix(in srgb, #10b981 var(--tint-strength), transparent);\n}\n\n/* \u2500\u2500 Forms \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\ninput[type=\"text\"],\ninput[type=\"number\"],\ntextarea,\nselect {\n background: var(--color-bg-secondary);\n border: 1px solid var(--color-border);\n color: var(--color-text-primary);\n padding: 0.6rem 0.85rem;\n border-radius: var(--radius-md);\n font-family: inherit;\n font-size: 0.9rem;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n margin-bottom: 10px;\n box-sizing: border-box;\n}\n\ninput[type=\"text\"]:focus,\ninput[type=\"number\"]:focus,\ntextarea:focus,\nselect:focus {\n outline: none;\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent);\n}\n\ninput::placeholder { color: var(--color-text-muted); }\n\nselect {\n cursor: pointer;\n padding-right: 2rem;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%237d8693' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 0.7rem center;\n}\n\n#versions { margin-left: 0; min-width: 160px; margin-bottom: 0; }\n\n.w-100 { width: 100%; }\n.table { width: 100%; }\n\n/* \u2500\u2500 Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.5rem 0.9rem;\n border-radius: var(--radius-md);\n font-size: 0.85rem;\n font-weight: 500;\n text-decoration: none;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n cursor: pointer;\n font-family: inherit;\n line-height: 1.2;\n}\n\n.btn-primary { background: var(--color-primary); color: #fff; }\n.btn-primary:hover {\n background: var(--color-primary-dark);\n color: #fff;\n text-decoration: none;\n box-shadow: var(--shadow-glow);\n}\n\n.btn-secondary {\n background: var(--color-bg-card);\n color: var(--color-text-primary);\n border: 1px solid var(--color-border);\n}\n.btn-secondary:hover {\n border-color: var(--color-border-hover);\n background: var(--color-bg-elevated);\n color: var(--color-text-primary);\n text-decoration: none;\n}\n\n/* \u2500\u2500 Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.field { width: 100%; margin-bottom: 1em; }\n\n.field p,\n.field span,\n.field a {\n margin: 0;\n font-weight: 500;\n}\n\n.field p {\n color: var(--color-text-muted);\n font-weight: 600;\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 0.4rem;\n}\n\n#href {\n height: auto;\n font-family: var(--font-mono) !important;\n font-size: 0.825rem !important;\n}\n\n/* \u2500\u2500 Checkbox \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.checkbox-wrapper {\n display: inline-flex;\n align-items: center;\n gap: 0.6rem;\n cursor: pointer;\n user-select: none;\n}\n\n.checkbox-input {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n}\n\n.checkbox-custom {\n position: relative;\n width: 18px;\n height: 18px;\n background: var(--color-bg-secondary);\n border: 1.5px solid var(--color-border-hover);\n border-radius: 5px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.checkbox-input:checked + .checkbox-custom {\n background: var(--color-primary);\n border-color: var(--color-primary);\n}\n\n.checkbox-input:focus-visible + .checkbox-custom {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.checkbox-icon {\n width: 11px;\n height: 11px;\n stroke: #fff;\n stroke-width: 2.5;\n fill: none;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n transform: scale(0.7);\n transition: all 0.15s ease;\n}\n\n.checkbox-input:checked + .checkbox-custom .checkbox-icon {\n opacity: 1;\n transform: scale(1);\n}\n\n.checkbox-wrapper:hover .checkbox-custom { border-color: var(--color-primary-light); }\n\n/* \u2500\u2500 State badges \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.state,\n.state-badge {\n display: inline-flex;\n align-items: center;\n font-size: 0.72rem;\n font-weight: 600;\n padding: 0.18rem 0.55rem;\n border-radius: var(--radius-full);\n white-space: nowrap;\n transition: none;\n border: 1px solid transparent;\n box-shadow: none;\n text-transform: capitalize;\n letter-spacing: 0.01em;\n line-height: 1.4;\n}\n\n.state-badge { margin-left: 0.6rem; }\n.state { margin-right: 0; }\n\n.state-badge:hover { transform: none; box-shadow: none; }\n\n.mobile-compact { display: none; }\n\n/* Tinted, flat state badges (per-state hue) */\n.component-state-experimental {\n background: color-mix(in srgb, #f59e0b var(--tint-strength), transparent);\n color: color-mix(in srgb, #f59e0b var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #f59e0b var(--tint-border), transparent);\n}\n.component-state-deprecated {\n background: color-mix(in srgb, #ef4444 var(--tint-strength), transparent);\n color: color-mix(in srgb, #ef4444 var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #ef4444 var(--tint-border), transparent);\n}\n.component-state-stable {\n background: color-mix(in srgb, #10b981 var(--tint-strength), transparent);\n color: color-mix(in srgb, #10b981 var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #10b981 var(--tint-border), transparent);\n}\n.component-state-beta {\n background: color-mix(in srgb, #3b82f6 var(--tint-strength), transparent);\n color: color-mix(in srgb, #3b82f6 var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #3b82f6 var(--tint-border), transparent);\n}\n.component-state-alpha {\n background: color-mix(in srgb, #8b5cf6 var(--tint-strength), transparent);\n color: color-mix(in srgb, #8b5cf6 var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, #8b5cf6 var(--tint-border), transparent);\n}\n\n.bold { font-weight: 600; }\n.hide { display: none !important; }\n\n/* \u2500\u2500 Breadcrumb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.breadcrumb {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--color-text-secondary);\n font-size: 0.85rem;\n margin-bottom: 1rem;\n}\n\n.breadcrumb a { color: var(--color-text-muted); font-weight: 500; }\n.breadcrumb a:hover { color: var(--color-primary); text-decoration: none; }\n\n/* \u2500\u2500 Parameters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.parameter-grid { display: grid; gap: 1rem; }\n\n.parameter-item {\n background: var(--color-bg-secondary);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n padding: 1.1rem 1.25rem;\n transition: border-color 0.15s ease;\n}\n\n.parameter-item:hover { border-color: var(--color-border-hover); box-shadow: none; }\n\n.parameter-header {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n margin-bottom: 0.65rem;\n flex-wrap: wrap;\n}\n\n.parameter-name {\n font-weight: 600;\n color: var(--color-text-primary);\n font-family: var(--font-mono);\n font-size: 0.9rem;\n}\n\n.parameter-type {\n background: var(--color-bg-elevated);\n color: var(--color-text-secondary);\n border: 1px solid var(--color-border);\n padding: 0.12rem 0.5rem;\n border-radius: var(--radius-full);\n font-size: 0.7rem;\n font-weight: 500;\n}\n\n.parameter-required {\n background: color-mix(in srgb, var(--color-accent) var(--tint-strength), transparent);\n color: color-mix(in srgb, var(--color-accent) var(--badge-text-lightness), var(--color-text-primary));\n border-color: color-mix(in srgb, var(--color-accent) var(--tint-border), transparent);\n}\n\n.parameter-description {\n color: var(--color-text-secondary);\n margin-bottom: 0.65rem;\n line-height: 1.5;\n font-size: 0.875rem;\n}\n\n.parameter-description strong { color: var(--color-text-primary); font-weight: 600; }\n\n.parameter-input {\n width: 100%;\n background: var(--color-bg-card);\n border: 1px solid var(--color-border);\n color: var(--color-text-primary);\n padding: 0.55rem 0.8rem;\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: 0.85rem;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n margin-bottom: 0;\n}\n\n.parameter-input:focus {\n outline: none;\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent);\n}\n\n/* \u2500\u2500 Preview \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.preview-section {\n background: var(--color-bg-card);\n border-radius: var(--radius-lg);\n border: 1px solid var(--color-border);\n overflow: hidden;\n margin-top: 1.5rem;\n}\n\n.preview-controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.85rem 1.5rem;\n background: var(--color-bg-glass);\n border-bottom: 1px solid var(--color-border);\n gap: 1rem;\n flex-wrap: wrap;\n}\n\n.preview-buttons { display: flex; gap: 0.6rem; }\n\n.preview-iframe,\n.preview iframe {\n width: 100%;\n height: 500px;\n border: none;\n background: #fff;\n display: block;\n}\n\n.code,\n.preview {\n width: 100%;\n background: var(--color-bg-card);\n border-radius: var(--radius-lg);\n box-shadow: none;\n margin-bottom: 1.5em;\n border: 1px solid var(--color-border);\n overflow: hidden;\n}\n\n.preview { height: 500px; }\n\n/* \u2500\u2500 Collapsible \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.collapsible-header {\n cursor: pointer;\n user-select: none;\n position: relative;\n transition: background 0.15s ease;\n}\n\n.collapsible-header:hover { background: var(--color-bg-hover); }\n\n.collapse-toggle {\n position: absolute;\n right: 1.25rem;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n color: var(--color-text-muted);\n font-size: 0.75rem;\n cursor: pointer;\n padding: 0.4rem;\n border-radius: var(--radius-sm);\n transition: color 0.15s ease, background 0.15s ease;\n}\n\n.collapse-toggle:hover { background: var(--color-bg-hover); color: var(--color-text-primary); }\n\n.collapse-icon { transition: transform 0.2s ease; display: inline-block; }\n\n.collapsible-content { overflow: hidden; transition: all 0.25s ease; }\n\n.collapsible-content.collapsed { max-height: 0; padding-top: 0; padding-bottom: 0; opacity: 0; }\n.collapsible-content.expanded { max-height: 2000px; opacity: 1; }\n\n.collapsible-header.collapsed .collapse-icon { transform: rotate(-90deg); }\n\n/* \u2500\u2500 Loading / empty / error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.loader { text-align: center; padding: 2em; color: var(--color-text-muted); }\n\n.empty-state {\n text-align: center;\n padding: 2.5em 2em;\n color: var(--color-text-muted);\n margin: 0;\n}\n\n.loader p { margin: 0; }\n\n.loader::before {\n content: '';\n display: inline-block;\n width: 18px;\n height: 18px;\n border: 2px solid var(--color-border);\n border-top: 2px solid var(--color-primary);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin-right: 0.6em;\n vertical-align: middle;\n}\n\n@keyframes spin { to { transform: rotate(360deg); } }\n\n.loading-more {\n text-align: center;\n padding: 1em 2em;\n color: var(--color-text-muted);\n font-size: 0.85em;\n border-top: 1px solid var(--color-border);\n}\n\n.loading-more::before {\n content: '';\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 2px solid var(--color-border);\n border-top: 2px solid var(--color-primary);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n margin-right: 0.5em;\n vertical-align: middle;\n}\n\n/* \u2500\u2500 Components pagination \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n padding: 1rem 1.25rem;\n border-top: 1px solid var(--color-border);\n}\n\n.pagination-top {\n border-top: none;\n border-bottom: 1px solid var(--color-border);\n}\n\n.pagination-btn {\n min-width: 2.25rem;\n padding: 0.4rem 0.6rem;\n font-size: 0.85rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n background: var(--color-bg-secondary);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-sm);\n cursor: pointer;\n transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;\n}\n\n.pagination-btn:hover:not([disabled]):not(.active) {\n background: var(--color-bg-hover);\n color: var(--color-text-primary);\n border-color: var(--color-border-hover);\n}\n\n.pagination-btn.active {\n color: #fff;\n background: var(--color-primary);\n border-color: var(--color-primary);\n cursor: default;\n}\n\n.pagination-btn[disabled] {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.pagination-ellipsis {\n padding: 0 0.25rem;\n color: var(--color-text-muted);\n user-select: none;\n}\n\n#history-error {\n text-align: center;\n padding: 1.5em 2em;\n color: color-mix(in srgb, #ef4444 70%, var(--color-text-primary));\n background-color: color-mix(in srgb, #ef4444 var(--tint-strength), transparent);\n border: 1px solid color-mix(in srgb, #ef4444 var(--tint-border), transparent);\n border-radius: var(--radius-md);\n margin: 1em;\n}\n\n#history-error p { margin: 0; }\n\n/* \u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.social {\n width: 100%;\n margin-top: 0;\n padding: 2rem 0 2.5rem;\n text-align: center;\n border-top: 1px solid var(--color-border);\n color: var(--color-text-muted);\n font-size: 0.85rem;\n}\n\n/* \u2500\u2500 Scrollbar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n::-webkit-scrollbar { width: 10px; height: 10px; }\n::-webkit-scrollbar-track { background: transparent; }\n::-webkit-scrollbar-thumb { background: var(--color-border-hover); border-radius: 5px; border: 2px solid var(--color-bg-primary); }\n::-webkit-scrollbar-thumb:hover { background: var(--color-text-muted); }\n\n/* \u2500\u2500 Animations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes fadeInUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 1024px) {\n .container { padding: 0 1.25rem; }\n h1 { font-size: 1.75rem; }\n .main-content { grid-template-columns: 1fr; gap: 1.25rem; }\n .sidebar { order: -1; position: static; }\n .info-item { display: flex; justify-content: space-between; }\n .collapsible-content { max-height: 0; padding-top: 0; padding-bottom: 0; opacity: 0; }\n .collapsible-header.collapsed .collapse-icon { transform: rotate(-90deg); }\n}\n\n@media (max-width: 900px) {\n .container { padding: 0 1rem; }\n .main-content { padding: 0.5rem 0 2rem; gap: 1rem; }\n .filters { flex-direction: column; gap: 0.5em; }\n #author-filter { flex: 1 0; }\n\n .row.header { display: none; }\n\n .componentRow {\n flex-direction: column !important;\n align-items: flex-start !important;\n padding: 1rem 1.25rem !important;\n gap: 0.6rem !important;\n text-align: left !important;\n }\n\n .componentRow > .author,\n .componentRow > .date,\n .componentRow > .activity,\n .componentRow > div:not(.title):not(.state):not(.mobile-compact) {\n display: none !important;\n }\n\n .mobile-compact { display: block !important; width: 100%; }\n\n .mobile-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n font-size: 0.8rem;\n color: var(--color-text-secondary);\n width: 100%;\n }\n\n .mobile-meta span {\n background: var(--color-bg-secondary);\n padding: 0.2rem 0.5rem;\n border-radius: var(--radius-sm);\n border: 1px solid var(--color-border);\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .mobile-author { color: var(--color-text-secondary) !important; }\n .mobile-version { color: var(--color-text-primary) !important; font-weight: 600; }\n .mobile-date { color: var(--color-text-muted) !important; }\n .mobile-activity { color: var(--color-text-secondary) !important; }\n .mobile-size { color: var(--color-text-secondary) !important; }\n\n .componentRow .title { text-align: left !important; width: 100%; }\n .componentRow .title .name { text-align: left !important; }\n .componentRow .title .description { text-align: left !important; }\n\n .box, .info-card, .section-content { }\n .section-content { padding: 1.25rem; }\n\n .sidebar .info-item { flex-direction: column; align-items: flex-start; gap: 0.3rem; }\n .sidebar .info-label { min-width: auto; font-weight: 600; }\n .sidebar .info-value { text-align: left; margin-left: 0; }\n\n h1 { font-size: 1.6rem; }\n .component-title { font-size: 1.5rem; }\n .preview-controls { flex-direction: column; align-items: stretch; }\n .preview-buttons { justify-content: stretch; }\n .preview-buttons .btn { flex: 1; justify-content: center; }\n}\n ";
2
2
  export default _default;
@@ -1136,6 +1136,59 @@ select {
1136
1136
  vertical-align: middle;
1137
1137
  }
1138
1138
 
1139
+ /* ── Components pagination ──────────────────────────── */
1140
+ .pagination {
1141
+ display: flex;
1142
+ flex-wrap: wrap;
1143
+ align-items: center;
1144
+ justify-content: center;
1145
+ gap: 0.4rem;
1146
+ padding: 1rem 1.25rem;
1147
+ border-top: 1px solid var(--color-border);
1148
+ }
1149
+
1150
+ .pagination-top {
1151
+ border-top: none;
1152
+ border-bottom: 1px solid var(--color-border);
1153
+ }
1154
+
1155
+ .pagination-btn {
1156
+ min-width: 2.25rem;
1157
+ padding: 0.4rem 0.6rem;
1158
+ font-size: 0.85rem;
1159
+ font-weight: 500;
1160
+ color: var(--color-text-secondary);
1161
+ background: var(--color-bg-secondary);
1162
+ border: 1px solid var(--color-border);
1163
+ border-radius: var(--radius-sm);
1164
+ cursor: pointer;
1165
+ transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
1166
+ }
1167
+
1168
+ .pagination-btn:hover:not([disabled]):not(.active) {
1169
+ background: var(--color-bg-hover);
1170
+ color: var(--color-text-primary);
1171
+ border-color: var(--color-border-hover);
1172
+ }
1173
+
1174
+ .pagination-btn.active {
1175
+ color: #fff;
1176
+ background: var(--color-primary);
1177
+ border-color: var(--color-primary);
1178
+ cursor: default;
1179
+ }
1180
+
1181
+ .pagination-btn[disabled] {
1182
+ opacity: 0.45;
1183
+ cursor: not-allowed;
1184
+ }
1185
+
1186
+ .pagination-ellipsis {
1187
+ padding: 0 0.25rem;
1188
+ color: var(--color-text-muted);
1189
+ user-select: none;
1190
+ }
1191
+
1139
1192
  #history-error {
1140
1193
  text-align: center;
1141
1194
  padding: 1.5em 2em;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oc",
3
- "version": "0.50.53",
3
+ "version": "0.50.55",
4
4
  "description": "A framework for developing and distributing html components",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",