@things-factory/station 10.1.206 → 10.1.209
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/README.md +14 -14
- package/dist-client/station/station-palette.d.ts +2 -2
- package/dist-client/station/station-palette.js +2 -2
- package/dist-client/station/station-palette.js.map +1 -1
- package/dist-client/station/station-tile-registry.d.ts +2 -2
- package/dist-client/station/station-tile-registry.js +2 -2
- package/dist-client/station/station-tile-registry.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/things-scene.config.js +2 -2
package/README.md
CHANGED
|
@@ -55,7 +55,7 @@ plant · warehouse · yms · ems 가 각자 한 번씩 한다. 기계에 기본
|
|
|
55
55
|
|
|
56
56
|
```
|
|
57
57
|
공통 여섯 모듈이 든다. package.json 의 "things-scene" 과 things-scene.config.js 로
|
|
58
|
-
|
|
58
|
+
플랫폼이 설정을 수집하고, 앱이 모델러 팔레트에 등록한다
|
|
59
59
|
제품 다섯 제품이 짓고 자기 선언으로 건다. 구조를 읽는 것들 — 작업지시 · 정비 · 자재 · 지시서 · 동작
|
|
60
60
|
```
|
|
61
61
|
|
|
@@ -100,7 +100,7 @@ plant · warehouse · yms · ems 가 각자 한 번씩 한다. 기계에 기본
|
|
|
100
100
|
저작 결재 양식 2 파일 plant `server/activities/` 에서 (ADR-0083 결정 7)
|
|
101
101
|
축·흐름 검사 4 파일 plant `shared/` 에서 — 서버와 브라우저가 같은 파일을 읽는다
|
|
102
102
|
시험 15 파일 124 통과
|
|
103
|
-
|
|
103
|
+
번역 파일 39 개 키 상위 모듈이 관리하는 13 개는 제외했다(나중에 병합한 값이 다른 화면의 번역을 덮어쓸 수 있음)
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
**plant 에 남는 것** — 선언 다섯의 구현(`station-context-service` 등 8 파일) · 컴포저 · 모델러 ·
|
|
@@ -108,18 +108,18 @@ plant · warehouse · yms · ems 가 각자 한 번씩 한다. 기계에 기본
|
|
|
108
108
|
|
|
109
109
|
## 아직 안 온 것 (2026-09-24 오후)
|
|
110
110
|
|
|
111
|
-
**operato-plant 는 이제 이
|
|
111
|
+
**operato-plant 는 이제 이 패키지의 화면도 쓴다**(3-가, operato-application `1a1c5c9`). 공통 씬 여섯과 바탕은 여기 것만 돈다.
|
|
112
112
|
|
|
113
|
-
앱이 할 일은 둘이다. **씬 등록을 드러나게 부른다** — 이
|
|
113
|
+
앱이 할 일은 둘이다. **씬 등록을 드러나게 부른다** — 이 패키지의 입구는 씬을 등록하지 않는다(도우미만 가져오는 쪽에 씬 여섯과
|
|
114
114
|
things-scene 이 따라오지 않게):
|
|
115
115
|
|
|
116
116
|
```ts
|
|
117
117
|
import '@things-factory/station/dist-client/station/scene/index.js'
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
bootstrap
|
|
122
|
-
|
|
120
|
+
**팔레트 항목을 등록한다.** 플랫폼은 `things-scene.config.js`에서 이 패키지의 공통 다섯 항목을 수집한다. 앱의
|
|
121
|
+
bootstrap이 `things-scene-components-with-tools`를 읽고 `registerGroup` · `registerTemplate`으로 등록한다. 앱 자체의 타일은
|
|
122
|
+
자동 수집 대상이 아니므로 직접 등록한다. 이때 `station` 그룹을 먼저 등록해야 한다. 존재하지 않는 그룹의 항목은 오류 없이 무시된다.
|
|
123
123
|
|
|
124
124
|
남은 것은 ADR-0083 「걸음 3 을 넷으로 나눈다」가 정본이다:
|
|
125
125
|
|
|
@@ -136,19 +136,19 @@ bootstrap 이 `things-scene-components-with-tools` 를 읽어 `registerGroup` ·
|
|
|
136
136
|
|
|
137
137
|
- 옮긴 26 + 2 파일과 그 시험을 지웠다. 제품 쪽 여덟은 선언 다섯의 구현으로 남았다.
|
|
138
138
|
- `declareStationProduct` 에 `recordChange` 를 채웠다 — 걷는 순간 기동 검사가 비었다고 잡았다.
|
|
139
|
-
- `required-activities.ts` 에서 저작 결재 둘은 **안 뺐다.** 이
|
|
139
|
+
- `required-activities.ts` 에서 저작 결재 둘은 **안 뺐다.** 이 패키지도 등록하지만 같은 이름의 재등록은 덮어쓰기라 해가
|
|
140
140
|
없고(`assertDoorSlugIsFree` 가 같은 이름을 뺀다), plant 의 문 선언이 그 둘을 계속 읽는다.
|
|
141
141
|
- `deletionChanges` 는 plant 가 자기 `fact-change` 의 것을 계속 쓴다(`activity-non-working-withdrawal`). 그 앱의 이력 쪽 함수라 남긴다.
|
|
142
142
|
|
|
143
143
|
### 화면 — 3-가 · 했다 (09-24 `1a1c5c9`) · 두 줄 남음
|
|
144
144
|
|
|
145
|
-
1.
|
|
146
|
-
(operato-twin `client/bootstrap.ts:89-93`).
|
|
147
|
-
2.
|
|
145
|
+
1. **수집한 공통 항목을 등록한다.** `things-scene-components-with-tools`를 읽어 `registerGroup` · `registerTemplate`을 호출하는 열 줄이다
|
|
146
|
+
(operato-twin `client/bootstrap.ts:89-93`). 플랫폼의 자동 수집과 앱의 등록은 별도 단계이다.
|
|
147
|
+
2. **`station` 그룹 등록 후 앱의 제품 타일 다섯을 직접 등록한다.** 자동 수집은 의존 패키지만 대상으로 한다. 그룹 없이 등록한 항목은
|
|
148
148
|
`registerTemplate` 이 오류 없이 버린다.
|
|
149
149
|
3. **모델러가 항목의 `labelKey` 를 읽는다** — 손 지도(`PART_LABEL_KEYS`, 11)를 걷는다.
|
|
150
150
|
4. **원문을 경로로 읽는 시험 19 파일을 가른다.**
|
|
151
|
-
5. **(남음 — 10.1.38 설치 뒤)
|
|
152
|
-
|
|
151
|
+
5. **(남음 — 10.1.38 설치 뒤) 번역 파일의 중복 키 58 개를 제거한다.** 기존 40 개에 이 패키지로 옮긴 흐름 검사 12 개와 표시 이름 6 개를 포함한다.
|
|
152
|
+
번역 파일은 나중에 읽은 값이 우선하므로, 한쪽 문구만 수정하면 다른 파일의 값이 오류 없이 덮어쓸 수 있다.
|
|
153
153
|
7. **(남음 — 10.1.38 설치 뒤) plant 의 범위를 `^10.1.38` 로** — 씬을 등록하지 않는 새 입구가 필요하다.
|
|
154
|
-
6. **`shared/station-*` 넷을 걷는다** — 이
|
|
154
|
+
6. **`shared/station-*` 넷을 걷는다** — 이 패키지에 같은 파일이 있다. 그 앱에서 지금 쓰는 곳 4.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* 저작면 팔레트에 서는 **기계의 타일 다섯**과 그 그룹 (ADR-0083 결정 6).
|
|
3
3
|
*
|
|
4
4
|
* ── 어떻게 서나 ─────────────────────────────────────────────────────────────
|
|
5
|
-
* 이
|
|
6
|
-
* 있으면, `@things-factory/env` 가 의존
|
|
5
|
+
* 이 패키지의 `package.json` 에 `"things-scene": true` 가 있고 뿌리에 `things-scene.config.js` 가
|
|
6
|
+
* 있으면, `@things-factory/env` 가 의존 패키지를 훑어 이것을 모으고 보드 모델러가 세운다. 패키지
|
|
7
7
|
* 42 개가 이미 그 길이다.
|
|
8
8
|
*
|
|
9
9
|
* operato-plant 는 손으로 등록했었다 — 그 부품이 **앱 안에 있어서** 그물에 안 걸렸기 때문이다. 옮기고
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* 저작면 팔레트에 서는 **기계의 타일 다섯**과 그 그룹 (ADR-0083 결정 6).
|
|
3
3
|
*
|
|
4
4
|
* ── 어떻게 서나 ─────────────────────────────────────────────────────────────
|
|
5
|
-
* 이
|
|
6
|
-
* 있으면, `@things-factory/env` 가 의존
|
|
5
|
+
* 이 패키지의 `package.json` 에 `"things-scene": true` 가 있고 뿌리에 `things-scene.config.js` 가
|
|
6
|
+
* 있으면, `@things-factory/env` 가 의존 패키지를 훑어 이것을 모으고 보드 모델러가 세운다. 패키지
|
|
7
7
|
* 42 개가 이미 그 길이다.
|
|
8
8
|
*
|
|
9
9
|
* operato-plant 는 손으로 등록했었다 — 그 부품이 **앱 안에 있어서** 그물에 안 걸렸기 때문이다. 옮기고
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"station-palette.js","sourceRoot":"","sources":["../../client/station/station-palette.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,QAAQ,EACT,MAAM,0BAA0B,CAAA;AAIjC;;;;;GAKG;AACH,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBZ,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,kGAAkG;IAC/G,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA;AAED,0CAA0C;AAC1C,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,KAAa,EAAE,MAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAEvG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAuB;IACpD;QACE,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,2BAA2B;QACrC,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,6CAA6C;QAC1D,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;KAC9F;IACD;QACE,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,yBAAyB;QACnC,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mCAAmC;QAChD,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;KAChF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,gCAAgC;QAC7C,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;KACvE;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,mCAAmC;QAChD,KAAK,EAAE,SAAS;QAChB;;;;;WAKG;QACH,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;KACpF;IACD;QACE;;;;;WAKG;QACH,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,6BAA6B;QACvC,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,uDAAuD;QACpE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;KAChG;CACF,CAAA","sourcesContent":["/**\n * 저작면 팔레트에 서는 **기계의 타일 다섯**과 그 그룹 (ADR-0083 결정 6).\n *\n * ── 어떻게 서나 ─────────────────────────────────────────────────────────────\n * 이
|
|
1
|
+
{"version":3,"file":"station-palette.js","sourceRoot":"","sources":["../../client/station/station-palette.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,QAAQ,EACT,MAAM,0BAA0B,CAAA;AAIjC;;;;;GAKG;AACH,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBZ,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,kGAAkG;IAC/G,IAAI;IACJ,SAAS,EAAE,EAAE;CACd,CAAA;AAED,0CAA0C;AAC1C,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,KAAa,EAAE,MAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAEvG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAuB;IACpD;QACE,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,2BAA2B;QACrC,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,6CAA6C;QAC1D,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;KAC9F;IACD;QACE,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,yBAAyB;QACnC,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mCAAmC;QAChD,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;KAChF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,gCAAgC;QAC7C,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;KACvE;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,mCAAmC;QAChD,KAAK,EAAE,SAAS;QAChB;;;;;WAKG;QACH,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;KACpF;IACD;QACE;;;;;WAKG;QACH,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,6BAA6B;QACvC,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,uDAAuD;QACpE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;KAChG;CACF,CAAA","sourcesContent":["/**\n * 저작면 팔레트에 서는 **기계의 타일 다섯**과 그 그룹 (ADR-0083 결정 6).\n *\n * ── 어떻게 서나 ─────────────────────────────────────────────────────────────\n * 이 패키지의 `package.json` 에 `\"things-scene\": true` 가 있고 뿌리에 `things-scene.config.js` 가\n * 있으면, `@things-factory/env` 가 의존 패키지를 훑어 이것을 모으고 보드 모델러가 세운다. 패키지\n * 42 개가 이미 그 길이다.\n *\n * operato-plant 는 손으로 등록했었다 — 그 부품이 **앱 안에 있어서** 그물에 안 걸렸기 때문이다. 옮기고\n * 나면 그 까닭이 없어진다. 플랫폼에 길이 있는데 옆에 사설 수집기를 세우지 않는다.\n *\n * ── 제품의 타일은 여기 없다 ─────────────────────────────────────────────────\n * 작업지시 · 정비 · 자재 · 지시서 · 동작은 구조를 읽으므로 제품의 것이고, 제품이\n * `registerStationTiles` 로 건다. 가르는 잣대는 **구조를 읽는가**다.\n *\n * ── 이름표는 열쇠다 ─────────────────────────────────────────────────────────\n * `labelKey` 를 항목이 들고 온다(UX 판정 2026-09-20). 값으로 굳히면 언어를 바꿨을 때 옛말이 남는다 —\n * 등록은 기동 때 한 번이고 언어는 그 뒤에도 바뀐다. 손으로 적은 둘째 지도를 두지 않으려는 것이기도\n * 하다: 지도가 안 갈리면 놓인 타일이 이름 대신 `station-counts` 로 뜬다.\n */\n\nimport {\n ICON_CONTEXT,\n ICON_COUNTS,\n ICON_FIELD,\n ICON_NUMPAD,\n ICON_WHO\n} from './scene/station-icons.js'\n\nimport type { StationTileEntry } from './station-tile-registry.js'\n\n/*\n * 그룹 아이콘 — 작업대 위의 태블릿.\n *\n * 다른 그룹 아이콘과 같은 붓을 쓴다: 주된 것은 굵게(2.5), 윤곽은 가늘게(1.0), 강조는 채운다.\n * `{{strokeColor}}` 는 모델러가 테마 색으로 바꿔 넣는다.\n */\nconst icon = `\n<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 30 30\" style=\"enable-background:new 0 0 30 30;\" xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0{fill:{{strokeColor}};}\n .st14{fill:none;stroke:{{strokeColor}};stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n .st15{fill:none;stroke:{{strokeColor}};stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n </style>\n <g>\n <!-- 화면 — 이 그룹의 주인공이라 굵게 -->\n <rect class=\"st14\" x=\"6\" y=\"4.5\" width=\"18\" height=\"12\" rx=\"1.5\"/>\n <!-- 화면 안의 한 줄. 작업자가 읽는 값이 있다는 뜻 -->\n <line class=\"st15\" x1=\"9\" y1=\"8.5\" x2=\"17\" y2=\"8.5\"/>\n <line class=\"st15\" x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/>\n <!-- 받침대 -->\n <line class=\"st15\" x1=\"15\" y1=\"16.5\" x2=\"15\" y2=\"20\"/>\n <!-- 작업대 상판 -->\n <rect class=\"st0\" x=\"4\" y=\"20\" width=\"22\" height=\"2\"/>\n <!-- 다리 -->\n <line class=\"st15\" x1=\"7\" y1=\"22\" x2=\"7\" y2=\"26.5\"/>\n <line class=\"st15\" x1=\"23\" y1=\"22\" x2=\"23\" y2=\"26.5\"/>\n </g>\n</svg>\n`\n\nexport const stationGroup = {\n name: 'station',\n description: 'what an operator sees at a workbench — the values, the prompts, and the buttons that record work',\n icon,\n templates: []\n}\n\n/** 놓았을 때의 자리와 크기. 겹치지 않게 조금씩 어긋나 떨어진다. */\nconst at = (left: number, top: number, width: number, height: number) => ({ left, top, width, height })\n\n/**\n * 기본 크기는 **작업대에서 읽히는 크기**로 잡는다. 저작자가 놓자마자 줄여야 한다면 그 기본값이 틀린\n * 것이다 — 현장 화면은 한 걸음 떨어져서 읽는다.\n *\n * `equipment` 를 비워 둔다. 비면 그 화면이 걸린 작업대를 따르고, 적으면 그 설비에 못 박힌다.\n */\nexport const stationCommonTiles: StationTileEntry[] = [\n {\n type: 'station-field',\n labelKey: 'label.modeller-part-field',\n icon: ICON_FIELD,\n description: 'one value from the station — pick which one',\n group: 'station',\n model: { type: 'station-field', ...at(40, 40, 300, 90), field: '', label: '', valueSize: 26 }\n },\n {\n type: 'station-who',\n labelKey: 'label.modeller-part-who',\n icon: ICON_WHO,\n description: 'who is scanned in at this station',\n group: 'station',\n model: { type: 'station-who', ...at(40, 150, 300, 110), label: '', prompt: '' }\n },\n {\n type: 'station-counts',\n labelKey: 'label.modeller-part-counts',\n icon: ICON_COUNTS,\n description: 'good and reject counted so far',\n group: 'station',\n model: { type: 'station-counts', ...at(360, 40, 300, 110), label: '' }\n },\n {\n type: 'station-numpad',\n labelKey: 'label.modeller-part-numpad',\n icon: ICON_NUMPAD,\n description: 'record a count without a keyboard',\n group: 'station',\n /*\n * 높이는 **저작 검사가 요구하는 최소 위**로 잡는다. 이 검사는 숫자판을 3×4 로 보고 머리 72 를\n * 뺀 뒤 칸이 44 이상인지 본다(`station-design-check`). 240 이던 때는 칸이 42 라, 저작자가 팔레트\n * 에서 놓자마자 「입력 영역을 44px 이상으로 하십시오」가 떴다 — 처음 놓은 것이 이미 틀렸다고\n * 말하는 저작면은 그 검사를 안 믿게 만든다. 260 이면 칸이 47 이다.\n */\n model: { type: 'station-numpad', ...at(360, 160, 300, 260), label: '', counts: '' }\n },\n {\n /*\n * 그리지 않는 부품이다 — 이 화면이 무엇을 얼마나 자주 읽을지를 정한다.\n *\n * 저작면에서는 자리를 차지하지만 작업대에서는 안 보인다. 팔레트에 있어야 하는 이유는, 없으면\n * 저작자가 갱신 주기를 손댈 방법이 아예 없기 때문이다.\n */\n type: 'station-context',\n labelKey: 'label.modeller-part-context',\n icon: ICON_CONTEXT,\n description: 'not drawn — sets what this screen reads and how often',\n group: 'station',\n model: { type: 'station-context', ...at(40, 670, 200, 60), showFields: '', refreshSeconds: 10 }\n }\n]\n"]}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* ## 기계의 것은 여기로 안 온다 (아키텍트 고침)
|
|
14
14
|
*
|
|
15
15
|
* 이 모듈의 공통 타일은 플랫폼의 그물이 걷는다 — `package.json` 의 `"things-scene"` 과 뿌리의
|
|
16
|
-
* `things-scene.config.js` 를 `@things-factory/env` 가 모아 보드 모델러가 세운다(
|
|
16
|
+
* `things-scene.config.js` 를 `@things-factory/env` 가 모아 보드 모델러가 세운다(패키지 42 개가 이미
|
|
17
17
|
* 그 길이다). plant 가 이 모듈을 의존하므로 조건이 선다. 옛 팔레트가 손으로 등록한 것은 그 부품이
|
|
18
18
|
* **앱 안에 있어서** 그물에 안 걸렸기 때문이고, 옮기고 나면 그 까닭이 없어진다. 플랫폼에 길이 있는데
|
|
19
19
|
* 옆에 사설 수집기를 세우지 않는다.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*
|
|
23
23
|
* ## 왜 배열이 아니라 함수인가
|
|
24
24
|
*
|
|
25
|
-
* 기계와 제품이 다른
|
|
25
|
+
* 기계와 제품이 다른 패키지에서 온다. 배열을 export 해 두고 소비자가 import 하면 **그 순간의 사본**을
|
|
26
26
|
* 들고 가므로 늦게 걸린 제품의 것이 닿을 길이 없다. 저작자에게는 팔레트 칸이 덜 선 채로 보이고,
|
|
27
27
|
* 오류는 없다.
|
|
28
28
|
*
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* ## 기계의 것은 여기로 안 온다 (아키텍트 고침)
|
|
14
14
|
*
|
|
15
15
|
* 이 모듈의 공통 타일은 플랫폼의 그물이 걷는다 — `package.json` 의 `"things-scene"` 과 뿌리의
|
|
16
|
-
* `things-scene.config.js` 를 `@things-factory/env` 가 모아 보드 모델러가 세운다(
|
|
16
|
+
* `things-scene.config.js` 를 `@things-factory/env` 가 모아 보드 모델러가 세운다(패키지 42 개가 이미
|
|
17
17
|
* 그 길이다). plant 가 이 모듈을 의존하므로 조건이 선다. 옛 팔레트가 손으로 등록한 것은 그 부품이
|
|
18
18
|
* **앱 안에 있어서** 그물에 안 걸렸기 때문이고, 옮기고 나면 그 까닭이 없어진다. 플랫폼에 길이 있는데
|
|
19
19
|
* 옆에 사설 수집기를 세우지 않는다.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*
|
|
23
23
|
* ## 왜 배열이 아니라 함수인가
|
|
24
24
|
*
|
|
25
|
-
* 기계와 제품이 다른
|
|
25
|
+
* 기계와 제품이 다른 패키지에서 온다. 배열을 export 해 두고 소비자가 import 하면 **그 순간의 사본**을
|
|
26
26
|
* 들고 가므로 늦게 걸린 제품의 것이 닿을 길이 없다. 저작자에게는 팔레트 칸이 덜 선 채로 보이고,
|
|
27
27
|
* 오류는 없다.
|
|
28
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"station-tile-registry.js","sourceRoot":"","sources":["../../client/station/station-tile-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AA6BH,IAAI,OAAO,GAAuB,EAAE,CAAA;AACpC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAA;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IAEzD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,iCAAiC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IACrG,CAAC;IAED,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAoB;IACjD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEvB,OAAO,GAAG,EAAE;QACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5B,CAAC,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,QAAQ,CAAA;AACzD,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,kBAAkB;IAChC,OAAO,GAAG,EAAE,CAAA;IACZ,SAAS,CAAC,KAAK,EAAE,CAAA;AACnB,CAAC","sourcesContent":["/**\n * 제품이 저작면에 **놓을 수 있게** 내놓는 타일 (ADR-0083 결정 6 · UX 판정 · 아키텍트 경계 고침, 2026-09-20).\n *\n * ═══════════════════════════════════════════════════════════════════════════\n * ## 등록은 두 벌이고, 이것은 둘째다\n *\n * `@sceneComponent` 는 **그릴 수 있게** 할 뿐이다. 이미 저장된 화면의 `station-order` 를 씬이 그려\n * 낼 수 있게 되는 것이고, 저작자가 새로 **놓을** 수 있게 되는 것이 아니다.\n *\n * 둘을 한 벌로 세지 않는다. 수명이 다르기 때문이다 — **팔레트에서 뺀 타일도 이미 저장된 화면에서는\n * 계속 그려져야 한다.** 그리기를 지우면 옛 화면이 깨지고, 놓기만 지우면 새로 안 놓일 뿐이다.\n *\n * ## 기계의 것은 여기로 안 온다 (아키텍트 고침)\n *\n * 이 모듈의 공통 타일은 플랫폼의 그물이 걷는다 — `package.json` 의 `\"things-scene\"` 과 뿌리의\n * `things-scene.config.js` 를 `@things-factory/env` 가 모아 보드 모델러가 세운다(
|
|
1
|
+
{"version":3,"file":"station-tile-registry.js","sourceRoot":"","sources":["../../client/station/station-tile-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AA6BH,IAAI,OAAO,GAAuB,EAAE,CAAA;AACpC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAA;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IAEzD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,iCAAiC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IACrG,CAAC;IAED,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAoB;IACjD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEvB,OAAO,GAAG,EAAE;QACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5B,CAAC,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,QAAQ,CAAA;AACzD,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,kBAAkB;IAChC,OAAO,GAAG,EAAE,CAAA;IACZ,SAAS,CAAC,KAAK,EAAE,CAAA;AACnB,CAAC","sourcesContent":["/**\n * 제품이 저작면에 **놓을 수 있게** 내놓는 타일 (ADR-0083 결정 6 · UX 판정 · 아키텍트 경계 고침, 2026-09-20).\n *\n * ═══════════════════════════════════════════════════════════════════════════\n * ## 등록은 두 벌이고, 이것은 둘째다\n *\n * `@sceneComponent` 는 **그릴 수 있게** 할 뿐이다. 이미 저장된 화면의 `station-order` 를 씬이 그려\n * 낼 수 있게 되는 것이고, 저작자가 새로 **놓을** 수 있게 되는 것이 아니다.\n *\n * 둘을 한 벌로 세지 않는다. 수명이 다르기 때문이다 — **팔레트에서 뺀 타일도 이미 저장된 화면에서는\n * 계속 그려져야 한다.** 그리기를 지우면 옛 화면이 깨지고, 놓기만 지우면 새로 안 놓일 뿐이다.\n *\n * ## 기계의 것은 여기로 안 온다 (아키텍트 고침)\n *\n * 이 모듈의 공통 타일은 플랫폼의 그물이 걷는다 — `package.json` 의 `\"things-scene\"` 과 뿌리의\n * `things-scene.config.js` 를 `@things-factory/env` 가 모아 보드 모델러가 세운다(패키지 42 개가 이미\n * 그 길이다). plant 가 이 모듈을 의존하므로 조건이 선다. 옛 팔레트가 손으로 등록한 것은 그 부품이\n * **앱 안에 있어서** 그물에 안 걸렸기 때문이고, 옮기고 나면 그 까닭이 없어진다. 플랫폼에 길이 있는데\n * 옆에 사설 수집기를 세우지 않는다.\n *\n * 여기 오는 것은 **제품의 타일**(작업지시 · 정비 · 자재)과, 그것을 그물 대신 직접 훑는 저작 화면이다.\n *\n * ## 왜 배열이 아니라 함수인가\n *\n * 기계와 제품이 다른 패키지에서 온다. 배열을 export 해 두고 소비자가 import 하면 **그 순간의 사본**을\n * 들고 가므로 늦게 걸린 제품의 것이 닿을 길이 없다. 저작자에게는 팔레트 칸이 덜 선 채로 보이고,\n * 오류는 없다.\n *\n * ## 봉인 함수는 두지 않는다 (아키텍트 고침)\n *\n * 처음에는 `sealStationTiles()` 로 「다 들어왔다」를 말하게 지었다. 그러면 **앱이 그것을 잊었을 때가\n * 다시 조용하다** — 고치려던 실패와 같은 모양이다. 타일 목록은 클라이언트 선언의 **한 칸**이고, 빈\n * 자리는 `declareStationClientProduct` 가 기동 때 거절한다. 서버에서 `declareStationProduct` 가 하는\n * 그 일이다(결정 6 「클라이언트도 같은 선이다」).\n *\n * **아직 그 칸이 아니다.** 클라이언트 선언(`station-client-product`)이 이 모듈로 오는 것이 다음\n * 걸음이고, 그때 이 함수가 그 칸으로 접힌다. 아래 시험이 그날 빨강으로 알린다.\n * ═══════════════════════════════════════════════════════════════════════════\n */\n\n/** 저작면이 이 타일을 어떻게 내놓고, 놓았을 때 무엇이 서는가. */\nexport interface StationTileEntry {\n /** 씬 부품의 이름. `@sceneComponent` 가 쓴 그것과 같아야 한다. */\n type: string\n /** 팔레트 그림. 없으면 보드가 빈 그림을 그린다. */\n icon?: string\n /**\n * 보드 저작면이 항목에 붙여 그리는 글 — **플랫폼의 칸이라 이름이 이것이고, 영어다.**\n *\n * 같은 타일이 두 저작면에서 다르게 읽힌다: 보드 저작면은 이 영어를, 현장 화면 모델러는 번역한\n * 이름을 보여 준다(UX 실측 2026-09-20). 둘이 한 곳을 보게 하는 것이 `labelKey` 이고, 이 칸은\n * 플랫폼이 읽는 자리라 그대로 둔다.\n */\n description?: string\n /**\n * 사람이 읽는 이름의 **열쇠**. 값이 아니다.\n *\n * 여기서 `i18next.t()` 로 굳히면 언어를 바꿨을 때 옛 언어가 남는다 — 등록은 기동 때 한 번이고\n * 언어는 그 뒤에도 바뀐다. 값으로 바꾸는 것은 읽는 쪽에서 한다.\n */\n labelKey?: string\n /** 팔레트 그룹. 비면 `station`. */\n group?: string\n /** 놓았을 때 서는 것 — 자리 · 크기 · 그 부품의 기본 속성. */\n model: Record<string, any>\n}\n\nlet entries: StationTileEntry[] = []\nconst listeners = new Set<() => void>()\n\n/**\n * 제품이 자기 타일을 건다. 기동 때 한 번, 자기 선언과 같은 자리에서 부른다.\n *\n * 그룹이 섰는지 볼 필요가 없다 — 목록으로 받아 두고 읽을 때 편다. 부르는 순서로 실패하지 않는다는\n * 것이 이 자리가 있는 까닭이다. 옛 팔레트는 그룹이 먼저 안 서면 템플릿을 **오류 없이 버렸다.**\n */\nexport function registerStationTiles(adding: StationTileEntry[]): void {\n const already = new Set(entries.map(one => one.type))\n const twice = adding.filter(one => already.has(one.type))\n\n if (twice.length) {\n console.warn(`[station] 같은 타일이 두 번 등록됐습니다 — ${twice.map(one => one.type).join(' · ')}. 뒤엣것은 버립니다.`)\n }\n\n entries = [...entries, ...adding.filter(one => !already.has(one.type))]\n listeners.forEach(listener => listener())\n}\n\n/** 제품이 건 타일 — 소비자는 늘 이 함수로 읽는다. 배열을 import 하면 그 순간의 사본이 된다. */\nexport function stationTiles(): StationTileEntry[] {\n return entries\n}\n\n/**\n * 목록이 바뀌면 알린다 — 읽고 있던 화면이 다시 그리도록.\n *\n * 돌려주는 함수를 부르면 그만 듣는다. 화면이 사라진 뒤에도 듣고 있으면 없는 것을 다시 그리려 한다.\n */\nexport function onStationTiles(listener: () => void): () => void {\n listeners.add(listener)\n\n return () => {\n listeners.delete(listener)\n }\n}\n\n/**\n * 그 타일의 이름 열쇠 — 없으면 `undefined`.\n *\n * 읽는 쪽이 `undefined` 를 받으면 부품 이름(`station-order`)을 그대로 그린다. 그것이 뜨면 등록부에\n * `labelKey` 가 빠진 것이지 이름이 없는 것이 아니다.\n */\nexport function stationTileLabelKey(type: string): string | undefined {\n return entries.find(one => one.type === type)?.labelKey\n}\n\n/** 시험용 — 등록은 기동 때 한 번 하는 일이다. */\nexport function forgetStationTiles(): void {\n entries = []\n listeners.clear()\n}\n"]}
|