paneltir 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/style.css CHANGED
@@ -841,6 +841,128 @@
841
841
  color: var(--pt-color-success);
842
842
  }
843
843
 
844
+ /* src/components/Setup/SetupWizard.css */
845
+ .pt-wizard {
846
+ display: flex;
847
+ flex-direction: column;
848
+ gap: var(--pt-space-lg);
849
+ }
850
+ .pt-wizard__head {
851
+ display: flex;
852
+ align-items: baseline;
853
+ justify-content: space-between;
854
+ gap: var(--pt-space-sm);
855
+ flex-wrap: wrap;
856
+ }
857
+ .pt-wizard__progress {
858
+ margin: 0;
859
+ font-family: var(--pt-font-mono);
860
+ font-size: 12px;
861
+ color: var(--pt-color-ink-faint);
862
+ }
863
+ .pt-wizard__step {
864
+ padding: var(--pt-space-lg);
865
+ border: var(--pt-border-width) solid var(--pt-color-line);
866
+ border-radius: var(--pt-radius-panel);
867
+ background: var(--pt-color-panel);
868
+ }
869
+ .pt-wizard__step--done {
870
+ border-color: var(--pt-color-success);
871
+ }
872
+ .pt-wizard__now {
873
+ margin: 0 0 var(--pt-space-xs);
874
+ font-size: 11px;
875
+ letter-spacing: var(--pt-label-tracking);
876
+ text-transform: uppercase;
877
+ color: var(--pt-color-ink-faint);
878
+ }
879
+ .pt-wizard__label {
880
+ margin: 0 0 var(--pt-space-xs);
881
+ font-size: 16px;
882
+ color: var(--pt-color-ink);
883
+ }
884
+ .pt-wizard__var {
885
+ margin: 0 0 var(--pt-space-sm);
886
+ font-family: var(--pt-font-mono);
887
+ font-size: 12.5px;
888
+ color: var(--pt-color-accent);
889
+ overflow-wrap: anywhere;
890
+ }
891
+ .pt-wizard__enables {
892
+ margin: 0 0 var(--pt-space-sm);
893
+ font-size: 13px;
894
+ line-height: 1.5;
895
+ color: var(--pt-color-ink-dim);
896
+ }
897
+ .pt-wizard__fix {
898
+ font-size: 13px;
899
+ line-height: 1.55;
900
+ color: var(--pt-color-ink-dim);
901
+ }
902
+ .pt-wizard__fix ol,
903
+ .pt-wizard__fix ul {
904
+ margin: 0;
905
+ padding-left: 18px;
906
+ }
907
+ .pt-wizard__fix li {
908
+ margin-bottom: 4px;
909
+ }
910
+ .pt-wizard__fix code,
911
+ .pt-wizard__prompt {
912
+ font-family: var(--pt-font-mono);
913
+ background: var(--pt-color-raised);
914
+ color: var(--pt-color-ink);
915
+ border-radius: var(--pt-radius-square);
916
+ overflow-wrap: anywhere;
917
+ }
918
+ .pt-wizard__fix code {
919
+ font-size: 12px;
920
+ padding: 1px 5px;
921
+ }
922
+ .pt-wizard__actions {
923
+ display: flex;
924
+ align-items: center;
925
+ gap: var(--pt-space-sm);
926
+ flex-wrap: wrap;
927
+ margin-top: var(--pt-space-md);
928
+ }
929
+ .pt-wizard__said {
930
+ margin: 0;
931
+ font-size: 12.5px;
932
+ color: var(--pt-color-warning);
933
+ }
934
+ .pt-wizard__verify {
935
+ margin: var(--pt-space-sm) 0 0;
936
+ padding-left: 18px;
937
+ font-size: 13px;
938
+ line-height: 1.55;
939
+ color: var(--pt-color-ink-dim);
940
+ }
941
+ .pt-wizard__done-title {
942
+ margin: 0 0 var(--pt-space-xs);
943
+ font-size: 11px;
944
+ letter-spacing: var(--pt-label-tracking);
945
+ text-transform: uppercase;
946
+ color: var(--pt-color-ink-faint);
947
+ }
948
+ .pt-wizard__done ul {
949
+ margin: 0;
950
+ padding-left: 18px;
951
+ font-size: 13px;
952
+ color: var(--pt-color-ink-dim);
953
+ }
954
+ .pt-wizard__stuck {
955
+ padding-top: var(--pt-space-md);
956
+ border-top: var(--pt-border-width) solid var(--pt-color-line-faint);
957
+ }
958
+ .pt-wizard__prompt {
959
+ margin: 0 0 var(--pt-space-sm);
960
+ padding: var(--pt-space-sm);
961
+ font-size: 12px;
962
+ line-height: 1.5;
963
+ white-space: pre-wrap;
964
+ }
965
+
844
966
  /* src/components/Notifications/Notifications.css */
845
967
  .pt-bell {
846
968
  position: relative;
package/fingerprint.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "paneltir",
3
- "version": "0.7.0",
4
- "hash": "sha256:406af8c690cfa9b2452360712afff3f3fe9605a7bb0aa834238e5187acfc37c0",
5
- "fileCount": 151,
6
- "generatedAt": "2026-09-07T12:33:30.026Z"
3
+ "version": "0.9.0",
4
+ "hash": "sha256:f65d491a7350ddce22f6981dbcb91531f5e88fc66b7f9f8f83115d802773064f",
5
+ "fileCount": 161,
6
+ "generatedAt": "2026-09-10T03:50:24.162Z"
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paneltir",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "A React UI kit for admin panels: page frame, a board with touch-ready drag and drop, detail sheets, and a whole panel in one component. Structure and behaviour are fixed; colour and brand belong to each project.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "DFKlabs (https://DFKlabs.com)",
@@ -64,7 +64,7 @@
64
64
  "check:boards": "node scripts/check-boards.mjs",
65
65
  "demo:install": "npm --prefix examples/demo ci",
66
66
  "demo:build": "npm --prefix examples/demo run build",
67
- "verify": "npm run typecheck && npm run build && npm run icons:check && npm run seo:check && npm run test:auth && npm run test:marketplace && npm run test:init && npm run test:board && npm run check:boards && npm run check:docs && npm run check:package && npm run fingerprint:check",
67
+ "verify": "npm run typecheck && npm run build && npm run icons:check && npm run seo:check && npm run test:auth && npm run test:marketplace && npm run test:init && npm run test:board && npm run test:move && npm run test:theme && npm run test:setup && npm run test:updates && npm run release-notes:check && npm run check:boards && npm run check:docs && npm run check:package && npm run fingerprint:check",
68
68
  "site:install": "npm --prefix site ci",
69
69
  "site:dev": "npm --prefix site run dev",
70
70
  "site:build": "npm --prefix site run build",
@@ -72,7 +72,13 @@
72
72
  "check:docs": "node scripts/check-docs.mjs",
73
73
  "check:package": "node scripts/check-package.mjs",
74
74
  "test:init": "node scripts/test-init.mjs",
75
- "test:board": "node scripts/test-board.mjs"
75
+ "release-notes": "node scripts/release-notes.mjs",
76
+ "release-notes:check": "node scripts/release-notes.mjs --check",
77
+ "test:updates": "node scripts/test-updates.mjs",
78
+ "test:board": "node scripts/test-board.mjs",
79
+ "test:move": "node scripts/test-move.mjs",
80
+ "test:theme": "node scripts/test-theme.mjs",
81
+ "test:setup": "node scripts/test-setup.mjs"
76
82
  },
77
83
  "peerDependencies": {
78
84
  "react": ">=18",
@@ -90,5 +96,39 @@
90
96
  },
91
97
  "engines": {
92
98
  "node": ">=20"
99
+ },
100
+ "paneltirRelease": {
101
+ "version": "0.9.0",
102
+ "date": "2026-09-10",
103
+ "entries": [
104
+ {
105
+ "kind": "feature",
106
+ "text": {
107
+ "en": "A project's own theme can be offered alongside the kit's four instead of replacing them. Pass it as `extraThemes`; `themes` still means \"exactly these\".",
108
+ "es": "El tema propio de un proyecto puede ofrecerse junto a los cuatro del kit en vez de sustituirlos. Pásalo como `extraThemes`; `themes` sigue significando «exactamente estos»."
109
+ }
110
+ },
111
+ {
112
+ "kind": "fix",
113
+ "text": {
114
+ "en": "A panel that passed one theme of its own showed a settings sheet with a single row: the four presets were silently gone. They are back, and the project's own identity is what the panel opens in.",
115
+ "es": "Un panel que pasaba un tema propio mostraba un solo tema en los ajustes: los cuatro presets desaparecían sin decir nada. Han vuelto, y el panel abre con la identidad del proyecto."
116
+ }
117
+ },
118
+ {
119
+ "kind": "fix",
120
+ "text": {
121
+ "en": "A theme derived from a project is drawn in the kit's own default shape rather than borrowing the shape of an unrelated theme.",
122
+ "es": "Un tema derivado de un proyecto se dibuja con la forma por defecto del kit, en vez de tomar prestada la de un tema que no tiene nada que ver."
123
+ }
124
+ },
125
+ {
126
+ "kind": "chore",
127
+ "text": {
128
+ "en": "The install instructions name every theme the kit ships. They named three of four, so the only light one was never offered to a project — and a check now refuses to let that happen again.",
129
+ "es": "Las instrucciones de instalación nombran todos los temas que trae el kit. Nombraban tres de cuatro, así que el único claro no se ofrecía nunca — y ahora una comprobación impide que vuelva a pasar."
130
+ }
131
+ }
132
+ ]
93
133
  }
94
134
  }
@@ -132,6 +132,47 @@ Never invent a palette. If the project has no colours of its own, say so and
132
132
  leave the theme alone — the kit ships presets for exactly that case, and one
133
133
  of them is a light theme.
134
134
 
135
+ ## Setting the panel up in the first place
136
+
137
+ The panel is asked for this by name: its walkthrough carries a line the owner
138
+ can paste into a session here, and it points at this file. So when somebody
139
+ arrives asking you to set up the Paneltir panel, this is the answer, and the
140
+ job is to walk them through it rather than to hand them a list.
141
+
142
+ Four things live in the **hosting environment** — never in this repository, and
143
+ never in the board.
144
+
145
+ | | What it is | Without it |
146
+ | --- | --- | --- |
147
+ | `ADMIN_PASSWORD` | The panel's password. | The gate answers 503 rather than letting anyone in. It fails closed on purpose: a panel with no password must not become a public one. |
148
+ | `GH_TOKEN` | A GitHub fine-grained token, **Contents: read and write, on this repository only**. | Everything works and Save fails. |
149
+ | `PANEL_REPO` | This project's `owner/repo`. | Save has nowhere to write. There is no default, because writing to the wrong repository is worse than not writing. |
150
+ | `SESSION_SECRET` | Optional; signs the session cookie. Defaults to `ADMIN_PASSWORD`. | Nothing, until the password changes — at which point every session already issued ends, which is usually what was wanted. |
151
+
152
+ `PANEL_FILE` is there too, and only matters when the board is somewhere other
153
+ than `src/data/panel-state.json`.
154
+
155
+ Three things are worth saying while you walk somebody through it:
156
+
157
+ - **Environment variables are read at deploy time.** Adding one to a running
158
+ deployment changes nothing until it redeploys. More than half of "I added it
159
+ and it still says missing" is this.
160
+ - **Scope the token to this repository alone.** A token that can write to
161
+ everything is a token whose blast radius is everything, and this one only
162
+ ever commits one file.
163
+ - **Check, do not assume.** The panel's Help screen asks the server what is
164
+ actually set and reports *whether*, never the value. That answer is worth
165
+ more than a screenshot of a settings page.
166
+
167
+ Then two things to try before the gate is trusted, because a door nobody has
168
+ pushed is not known to be shut:
169
+
170
+ 1. Open `/admin` signed out. It must land on the sign-in screen.
171
+ 2. Signed out, request the panel's own JavaScript bundle. It must answer 401.
172
+ A page that is protected while its bundle is not leaves the board readable
173
+ by anyone who opens the HTML — and that is the failure that looks exactly
174
+ like everything working.
175
+
135
176
  ## When the board will not open
136
177
 
137
178
  Run `npx paneltir board`. It reads the file and names every problem by