@rashidee/co2 1.3.7 → 1.3.8

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.
Files changed (77) hide show
  1. package/dist/.co2-dat/app.db +0 -0
  2. package/dist/.co2-dat/app.db-shm +0 -0
  3. package/dist/.co2-dat/app.db-wal +0 -0
  4. package/dist/index.js +167 -68
  5. package/package.json +41 -41
  6. package/plugin/skills/conductor-feature-develop/SKILL.md +1384 -1383
  7. package/plugin/skills/conductor-feature-develop/references/playwright-setup.md +225 -224
  8. package/plugin/skills/mockgen-shadcn/SKILL.md +1073 -1067
  9. package/plugin/skills/mockgen-shadcn/references/admin-layout-template.md +5 -3
  10. package/plugin/skills/mockgen-shadcn/references/mockup-hub-template.md +631 -498
  11. package/plugin/skills/mockgen-shadcn/references/mockup-index-template.md +2 -2
  12. package/plugin/skills/mockgen-tailwind/SKILL.md +913 -904
  13. package/plugin/skills/mockgen-tailwind/references/admin-layout-template.md +722 -720
  14. package/plugin/skills/mockgen-tailwind/references/mockup-hub-template.md +631 -498
  15. package/plugin/skills/mockgen-tailwind/references/mockup-index-template.md +190 -190
  16. package/static/assets/{abnfDiagram-VRR7QNED-CsyqZblo.js → abnfDiagram-VRR7QNED-DP7zbvBZ.js} +1 -1
  17. package/static/assets/{arc-it3yvCvj.js → arc-Ckh0cqx_.js} +1 -1
  18. package/static/assets/{architectureDiagram-ZJ3FMSHR-sjNv2MOQ.js → architectureDiagram-ZJ3FMSHR-EpVuCwzS.js} +1 -1
  19. package/static/assets/{blockDiagram-677ZJIJ3-DW9ZjtwO.js → blockDiagram-677ZJIJ3-DsgBkX_g.js} +1 -1
  20. package/static/assets/{c4Diagram-LMCZKHZV-DP3gJkhN.js → c4Diagram-LMCZKHZV-CR04rrP-.js} +1 -1
  21. package/static/assets/channel-DfxyTZ0M.js +1 -0
  22. package/static/assets/{chunk-2Q5K7J3B-ByxTr7KB.js → chunk-2Q5K7J3B-DeQC-sio.js} +1 -1
  23. package/static/assets/{chunk-32BRIVSS-vNETwpX4.js → chunk-32BRIVSS-Qbam-XOV.js} +1 -1
  24. package/static/assets/{chunk-5VM5RSS4-DbdsRtpE.js → chunk-5VM5RSS4-CH-IX0uh.js} +1 -1
  25. package/static/assets/{chunk-EX3LRPZG-DPkDGikN.js → chunk-EX3LRPZG-6gUCPZ6x.js} +1 -1
  26. package/static/assets/{chunk-JWPE2WC7-Ccpx-Rog.js → chunk-JWPE2WC7-DSNEXnbo.js} +1 -1
  27. package/static/assets/{chunk-MOJQB5TN-CnRPtHb3.js → chunk-MOJQB5TN-BVmlLOXk.js} +1 -1
  28. package/static/assets/{chunk-RYQCIY6F-C--_KRGR.js → chunk-RYQCIY6F-2pIZN6PI.js} +1 -1
  29. package/static/assets/{chunk-V7JOEXUC-BJQ5fwNa.js → chunk-V7JOEXUC-Dj8a39S7.js} +1 -1
  30. package/static/assets/{chunk-VR4S4FIN-BPcVRYqJ.js → chunk-VR4S4FIN-D2kLoVlo.js} +1 -1
  31. package/static/assets/{chunk-XXDRQBXY-BoC3DCKQ.js → chunk-XXDRQBXY-x3SQWIAg.js} +1 -1
  32. package/static/assets/classDiagram-OUVF2IWQ-DPLLyb_P.js +1 -0
  33. package/static/assets/classDiagram-v2-EOCWNBFH-DPLLyb_P.js +1 -0
  34. package/static/assets/{cose-bilkent-JH36ORCC-DlKrOw_E.js → cose-bilkent-JH36ORCC-ltgQwU4R.js} +1 -1
  35. package/static/assets/{cynefin-VYW2F7L2-CZQhaPM1.js → cynefin-VYW2F7L2-BwJnOy5O.js} +1 -1
  36. package/static/assets/{cynefinDiagram-TSTJHNR4-cZP74_0I.js → cynefinDiagram-TSTJHNR4-Bi47Fvnv.js} +1 -1
  37. package/static/assets/{dagre-VKFMJZFB-tB2cBd_e.js → dagre-VKFMJZFB-5_l7QdUh.js} +1 -1
  38. package/static/assets/{diagram-FQU43EPY-QwoADT9c.js → diagram-FQU43EPY-HKDyXOzo.js} +1 -1
  39. package/static/assets/{diagram-G47NLZAW-Bjz2rwUz.js → diagram-G47NLZAW-xHHInyx1.js} +1 -1
  40. package/static/assets/{diagram-NH7WQ7WH-DS9j6K7F.js → diagram-NH7WQ7WH-nftmRdjw.js} +1 -1
  41. package/static/assets/{diagram-OA4YK3LP-CUPwlGEi.js → diagram-OA4YK3LP-CX8gIXu7.js} +1 -1
  42. package/static/assets/{diagram-WEI45ONY-iejOZOdV.js → diagram-WEI45ONY-BaT3ur6a.js} +1 -1
  43. package/static/assets/{ebnfDiagram-CCIWWBDH-Bg3puNXE.js → ebnfDiagram-CCIWWBDH-CM9hwJSh.js} +1 -1
  44. package/static/assets/{erDiagram-Q63AITRT-DTxdGEtK.js → erDiagram-Q63AITRT-C9cK36a5.js} +1 -1
  45. package/static/assets/{flowDiagram-23GEKE2U-CRl-AJlj.js → flowDiagram-23GEKE2U-BQw_JFaW.js} +1 -1
  46. package/static/assets/{ganttDiagram-NO4QXBWP-wCOJ8cfC.js → ganttDiagram-NO4QXBWP-Cgg9ZbM9.js} +1 -1
  47. package/static/assets/{gitGraphDiagram-IHSO6WYX-CnVtKot-.js → gitGraphDiagram-IHSO6WYX-SciNAnN3.js} +1 -1
  48. package/static/assets/{index-xLqMMC0F.css → index-CM4GfOLV.css} +1 -1
  49. package/static/assets/{index-DAL1vVaa.js → index-HUEMwsDE.js} +194 -194
  50. package/static/assets/{infoDiagram-FWYZ7A6U-DmvEl4fi.js → infoDiagram-FWYZ7A6U-BPCKxKmJ.js} +1 -1
  51. package/static/assets/{ishikawaDiagram-FXEZZL3T-CjKerAXn.js → ishikawaDiagram-FXEZZL3T-C0eQKvpo.js} +1 -1
  52. package/static/assets/{journeyDiagram-5HDEW3XC-Bmc4ARKl.js → journeyDiagram-5HDEW3XC-DgrJ90BU.js} +1 -1
  53. package/static/assets/{kanban-definition-HUTT4EX6-BZ9I3imN.js → kanban-definition-HUTT4EX6-ISgFrxBl.js} +1 -1
  54. package/static/assets/{linear-CrHKLpp_.js → linear-CaPqviiq.js} +1 -1
  55. package/static/assets/{mindmap-definition-LN4V7U3C-SUk59XXF.js → mindmap-definition-LN4V7U3C-DTpJ3Okf.js} +1 -1
  56. package/static/assets/{pegDiagram-2B236MQR-CknFYdh_.js → pegDiagram-2B236MQR-D0EbYB8X.js} +1 -1
  57. package/static/assets/{pieDiagram-ENE6RG2P-B3VlLXXT.js → pieDiagram-ENE6RG2P-lAwviOjS.js} +1 -1
  58. package/static/assets/{quadrantDiagram-ABIIQ3AL-BUkZjvW_.js → quadrantDiagram-ABIIQ3AL-Dn8yVCWJ.js} +1 -1
  59. package/static/assets/{railroadDiagram-RFXS5EU6-LklmPimD.js → railroadDiagram-RFXS5EU6-BVLcNBsS.js} +1 -1
  60. package/static/assets/{requirementDiagram-TGXJPOKE-DnRFaZbz.js → requirementDiagram-TGXJPOKE-Bmjsh1uy.js} +1 -1
  61. package/static/assets/{sankeyDiagram-HTMAVEWB-D242DUlQ.js → sankeyDiagram-HTMAVEWB-tdNqcgyd.js} +1 -1
  62. package/static/assets/{sequenceDiagram-DBY2YBRQ-DmiiStqo.js → sequenceDiagram-DBY2YBRQ-ChtQkNW9.js} +1 -1
  63. package/static/assets/{sizeCapture-X5ZJPWSS-cbMvR047.js → sizeCapture-X5ZJPWSS-BAnRJGV8.js} +1 -1
  64. package/static/assets/{stateDiagram-2N3HPSRC-YIIylI9N.js → stateDiagram-2N3HPSRC-CI7wmYAe.js} +1 -1
  65. package/static/assets/stateDiagram-v2-6OUMAXLB-BJrR07NX.js +1 -0
  66. package/static/assets/{swimlanes-5IMT3BWC-Ba309Ysu.js → swimlanes-5IMT3BWC-k6NGsb3p.js} +2 -2
  67. package/static/assets/swimlanesDiagram-G3AALYLV-B0-5v6_-.js +8 -0
  68. package/static/assets/{timeline-definition-FHXFAJF6-BdpW3kGY.js → timeline-definition-FHXFAJF6-CweEa8iU.js} +1 -1
  69. package/static/assets/{vennDiagram-L72KCM5P-BiSgQ9Lf.js → vennDiagram-L72KCM5P-DDPbV_sp.js} +1 -1
  70. package/static/assets/{wardleyDiagram-EHGQE667-Clr8YWGW.js → wardleyDiagram-EHGQE667-IP4J8kqe.js} +1 -1
  71. package/static/assets/{xychartDiagram-FW5EYKEG-LsC066MO.js → xychartDiagram-FW5EYKEG-CMfWLoM8.js} +1 -1
  72. package/static/index.html +2 -2
  73. package/static/assets/channel-C_J_aLZ7.js +0 -1
  74. package/static/assets/classDiagram-OUVF2IWQ-yUfBrCjx.js +0 -1
  75. package/static/assets/classDiagram-v2-EOCWNBFH-yUfBrCjx.js +0 -1
  76. package/static/assets/stateDiagram-v2-6OUMAXLB-m0MSGh0v.js +0 -1
  77. package/static/assets/swimlanesDiagram-G3AALYLV-DY_J_ih_.js +0 -8
@@ -1,190 +1,190 @@
1
- # MOCKUP.html Index Page Template
2
-
3
- Template for the clickable sitemap/index page that links to all role screens.
4
- It is served by the **Mockup Hub** at `/{app_slug}` (open it via the hub, e.g.
5
- `http://localhost:3000/{app_slug}`). All screen links are **root-relative**
6
- (`/{app_slug}/{role}/{page}`) so they work on whatever port the hub is configured
7
- to use — never hardcode `http://localhost:<port>` in links. Links open role screens
8
- in a **new browser tab** via the running hub.
9
-
10
- ## Placeholders
11
-
12
- | Placeholder | Description |
13
- |-------------|-------------|
14
- | `{{APP_NAME}}` | Application name |
15
- | `{{APP_SLUG}}` | App slug used as URL prefix (e.g., "hub_middleware") |
16
- | `{{APP_DESCRIPTION}}` | Brief application description from PRD.md context |
17
- | `{{ROLE_SECTIONS}}` | Generated HTML for each role and its screens |
18
- | `{{TOTAL_SCREENS}}` | Total number of screen files |
19
- | `{{DESIGN_PRIMARY}}` | Primary color hex |
20
- | `{{HEADING_FONT}}` | Heading font |
21
- | `{{BODY_FONT}}` | Body font |
22
- | `{{GOOGLE_FONTS_URL}}` | Google Fonts import URL |
23
- | `{{VERSION}}` | Target version if specified, or latest version found in PRD.md |
24
- | `{{VERSION_LABEL}}` | "Generated for v1.0.1" or "Generated for latest (all versions)" |
25
- | `{{FILTER_SUMMARY}}` | Summary of included/excluded items (e.g., "12 items included, 3 excluded") |
26
- | `{{HUB_PORT}}` | Hub port for **display text only** (read from `<root>/mockup/mockup.config.json`, default 3000) — never used in link hrefs |
27
-
28
- ## Template
29
-
30
- ```html
31
- <!DOCTYPE html>
32
- <html lang="en">
33
- <head>
34
- <meta charset="UTF-8">
35
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
36
- <title>{{APP_NAME}} - UI Mockup Sitemap</title>
37
- <script src="https://cdn.tailwindcss.com"></script>
38
- <link rel="preconnect" href="https://fonts.googleapis.com">
39
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
40
- <link href="{{GOOGLE_FONTS_URL}}" rel="stylesheet">
41
- <script>
42
- tailwind.config = {
43
- theme: {
44
- extend: {
45
- colors: {
46
- primary: '{{DESIGN_PRIMARY}}',
47
- },
48
- fontFamily: {
49
- heading: ['{{HEADING_FONT}}', 'sans-serif'],
50
- body: ['{{BODY_FONT}}', 'sans-serif'],
51
- }
52
- }
53
- }
54
- }
55
- </script>
56
- <style>
57
- body { font-family: '{{BODY_FONT}}', sans-serif; }
58
- h1, h2, h3 { font-family: '{{HEADING_FONT}}', sans-serif; }
59
- </style>
60
- </head>
61
- <body class="bg-slate-50 min-h-screen">
62
-
63
- <div class="max-w-5xl mx-auto px-6 py-12">
64
-
65
- <!-- Server Notice Banner -->
66
- <div class="mb-8 bg-amber-50 border border-amber-200 rounded-xl px-5 py-4 flex items-start gap-3">
67
- <svg class="w-5 h-5 text-amber-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
68
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
69
- d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
70
- </svg>
71
- <div>
72
- <p class="text-sm font-semibold text-amber-800">Mockup Hub Required</p>
73
- <p class="text-sm text-amber-700 mt-0.5">
74
- Screen links open via the shared Mockup Hub (default port
75
- <code class="bg-amber-100 px-1.5 py-0.5 rounded text-amber-900 font-mono text-xs">{{HUB_PORT}}</code>
76
- — configurable via the <code class="bg-amber-100 px-1.5 py-0.5 rounded text-amber-900 font-mono text-xs">PORT</code>
77
- env var or <code class="bg-amber-100 px-1.5 py-0.5 rounded text-amber-900 font-mono text-xs">mockup.config.json</code>).
78
- Start it with:
79
- <code class="bg-amber-100 px-1.5 py-0.5 rounded text-amber-900 font-mono text-xs">cd &lt;root&gt;/mockup &amp;&amp; npm start</code>
80
- (no npm install needed). All applications are listed at
81
- <a href="/" class="underline font-medium">the hub landing page</a>.
82
- </p>
83
- </div>
84
- </div>
85
-
86
- <!-- Header -->
87
- <div class="mb-10">
88
- <div class="flex items-center gap-3 mb-3">
89
- <div class="w-10 h-10 rounded-xl flex items-center justify-center" style="background-color: {{DESIGN_PRIMARY}}">
90
- <svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
91
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
92
- d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zm10 0a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zm10 0a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"/>
93
- </svg>
94
- </div>
95
- <h1 class="text-3xl font-bold text-slate-900">{{APP_NAME}}</h1>
96
- </div>
97
- <p class="text-slate-500 text-lg">{{APP_DESCRIPTION}}</p>
98
- <div class="flex items-center gap-4 mt-4 text-sm text-slate-400">
99
- <span>{{VERSION}}</span>
100
- <span class="w-1 h-1 bg-slate-300 rounded-full"></span>
101
- <span>{{TOTAL_SCREENS}} screens</span>
102
- <span class="w-1 h-1 bg-slate-300 rounded-full"></span>
103
- <span>UI Mockup for Designer Review</span>
104
- </div>
105
- <div class="flex items-center gap-4 mt-2 text-xs text-slate-400">
106
- <span>{{VERSION_LABEL}}</span>
107
- <span class="w-1 h-1 bg-slate-300 rounded-full"></span>
108
- <span>{{FILTER_SUMMARY}}</span>
109
- </div>
110
- </div>
111
-
112
- <!-- Role Sections -->
113
- {{ROLE_SECTIONS}}
114
-
115
- <!-- Footer -->
116
- <div class="mt-12 pt-6 border-t border-slate-200 text-center text-sm text-slate-400">
117
- Generated for UI/UX designer review. Screens open in new tabs via the shared Mockup Hub.
118
- </div>
119
- </div>
120
-
121
- </body>
122
- </html>
123
- ```
124
-
125
- ## Role Section Template
126
-
127
- For each role, generate this block inside `{{ROLE_SECTIONS}}`:
128
-
129
- ```html
130
- <!-- Role: {{ROLE_NAME}} -->
131
- <div class="mb-10">
132
- <div class="flex items-center gap-2 mb-4">
133
- <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" style="color: {{DESIGN_PRIMARY}}">
134
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
135
- d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
136
- </svg>
137
- <h2 class="text-xl font-semibold text-slate-800">{{ROLE_NAME}}</h2>
138
- <span class="text-sm text-slate-400 ml-2">({{SCREEN_COUNT}} screens)</span>
139
- <!-- Quick launch link opens the role home in a new tab -->
140
- <a href="/{{APP_SLUG}}/{{ROLE_FOLDER}}/home"
141
- target="_blank"
142
- rel="noopener noreferrer"
143
- class="ml-auto flex items-center gap-1 text-xs px-3 py-1.5 rounded-lg border transition-colors"
144
- style="color: {{DESIGN_PRIMARY}}; border-color: {{DESIGN_PRIMARY}}">
145
- <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
146
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
147
- d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/>
148
- </svg>
149
- Open Role Dashboard
150
- </a>
151
- </div>
152
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
153
- {{SCREEN_CARDS}}
154
- </div>
155
- </div>
156
- ```
157
-
158
- ## Screen Card Template
159
-
160
- Each card opens the corresponding screen in a **new browser tab**:
161
-
162
- ```html
163
- <a href="/{{APP_SLUG}}/{{ROLE_FOLDER}}/{{SCREEN_FILE_NO_EXT}}"
164
- target="_blank"
165
- rel="noopener noreferrer"
166
- class="block bg-white rounded-xl border border-slate-200 p-4 hover:shadow-md transition-all duration-200 cursor-pointer group">
167
- <div class="flex items-center justify-between mb-2">
168
- <div class="flex items-center gap-2">
169
- <svg class="w-4 h-4 text-slate-400 group-hover:text-primary transition-colors"><!-- module icon --></svg>
170
- <h3 class="font-medium text-slate-800 group-hover:text-primary transition-colors">{{SCREEN_TITLE}}</h3>
171
- </div>
172
- <!-- External link icon to indicate opens in new tab -->
173
- <svg class="w-3.5 h-3.5 text-slate-300 group-hover:text-primary transition-colors shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
174
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
175
- d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/>
176
- </svg>
177
- </div>
178
- <p class="text-sm text-slate-500">{{SCREEN_DESCRIPTION}}</p>
179
- <div class="mt-3 flex flex-wrap gap-1">
180
- <!-- User story tags as badges -->
181
- <span class="text-xs bg-slate-100 text-slate-500 px-2 py-0.5 rounded-full">{{US_TAG}}</span>
182
- </div>
183
- </a>
184
- ```
185
-
186
- The `{{SCREEN_DESCRIPTION}}` is a brief summary of what the screen shows,
187
- derived from the user story action (e.g., "Search and manage geographical information").
188
-
189
- The `{{SCREEN_FILE_NO_EXT}}` is the filename without `.html`
190
- (e.g., `location_information` for `location_information.html`).
1
+ # MOCKUP.html Index Page Template
2
+
3
+ Template for the clickable sitemap/index page that links to all role screens.
4
+ It is served by the **Mockup Hub** at `/{app_slug}` (open it via the hub, e.g.
5
+ `http://localhost:4000/{app_slug}`). All screen links are **root-relative**
6
+ (`/{app_slug}/{role}/{page}`) so they work on whatever port the hub is configured
7
+ to use — never hardcode `http://localhost:<port>` in links. Links open role screens
8
+ in a **new browser tab** via the running hub.
9
+
10
+ ## Placeholders
11
+
12
+ | Placeholder | Description |
13
+ |-------------|-------------|
14
+ | `{{APP_NAME}}` | Application name |
15
+ | `{{APP_SLUG}}` | App slug used as URL prefix (e.g., "hub_middleware") |
16
+ | `{{APP_DESCRIPTION}}` | Brief application description from PRD.md context |
17
+ | `{{ROLE_SECTIONS}}` | Generated HTML for each role and its screens |
18
+ | `{{TOTAL_SCREENS}}` | Total number of screen files |
19
+ | `{{DESIGN_PRIMARY}}` | Primary color hex |
20
+ | `{{HEADING_FONT}}` | Heading font |
21
+ | `{{BODY_FONT}}` | Body font |
22
+ | `{{GOOGLE_FONTS_URL}}` | Google Fonts import URL |
23
+ | `{{VERSION}}` | Target version if specified, or latest version found in PRD.md |
24
+ | `{{VERSION_LABEL}}` | "Generated for v1.0.1" or "Generated for latest (all versions)" |
25
+ | `{{FILTER_SUMMARY}}` | Summary of included/excluded items (e.g., "12 items included, 3 excluded") |
26
+ | `{{HUB_PORT}}` | Hub port for **display text only** (read from `<root>/mockup/mockup.config.json`, default: first unused port from 4000) — never used in link hrefs |
27
+
28
+ ## Template
29
+
30
+ ```html
31
+ <!DOCTYPE html>
32
+ <html lang="en">
33
+ <head>
34
+ <meta charset="UTF-8">
35
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
36
+ <title>{{APP_NAME}} - UI Mockup Sitemap</title>
37
+ <script src="https://cdn.tailwindcss.com"></script>
38
+ <link rel="preconnect" href="https://fonts.googleapis.com">
39
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
40
+ <link href="{{GOOGLE_FONTS_URL}}" rel="stylesheet">
41
+ <script>
42
+ tailwind.config = {
43
+ theme: {
44
+ extend: {
45
+ colors: {
46
+ primary: '{{DESIGN_PRIMARY}}',
47
+ },
48
+ fontFamily: {
49
+ heading: ['{{HEADING_FONT}}', 'sans-serif'],
50
+ body: ['{{BODY_FONT}}', 'sans-serif'],
51
+ }
52
+ }
53
+ }
54
+ }
55
+ </script>
56
+ <style>
57
+ body { font-family: '{{BODY_FONT}}', sans-serif; }
58
+ h1, h2, h3 { font-family: '{{HEADING_FONT}}', sans-serif; }
59
+ </style>
60
+ </head>
61
+ <body class="bg-slate-50 min-h-screen">
62
+
63
+ <div class="max-w-5xl mx-auto px-6 py-12">
64
+
65
+ <!-- Server Notice Banner -->
66
+ <div class="mb-8 bg-amber-50 border border-amber-200 rounded-xl px-5 py-4 flex items-start gap-3">
67
+ <svg class="w-5 h-5 text-amber-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
68
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
69
+ d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
70
+ </svg>
71
+ <div>
72
+ <p class="text-sm font-semibold text-amber-800">Mockup Hub Required</p>
73
+ <p class="text-sm text-amber-700 mt-0.5">
74
+ Screen links open via the shared Mockup Hub (default port
75
+ <code class="bg-amber-100 px-1.5 py-0.5 rounded text-amber-900 font-mono text-xs">{{HUB_PORT}}</code>
76
+ — configurable via the <code class="bg-amber-100 px-1.5 py-0.5 rounded text-amber-900 font-mono text-xs">PORT</code>
77
+ env var or <code class="bg-amber-100 px-1.5 py-0.5 rounded text-amber-900 font-mono text-xs">mockup.config.json</code>).
78
+ Start it with:
79
+ <code class="bg-amber-100 px-1.5 py-0.5 rounded text-amber-900 font-mono text-xs">cd &lt;root&gt;/mockup &amp;&amp; npm start</code>
80
+ (no npm install needed). All applications are listed at
81
+ <a href="/" class="underline font-medium">the hub landing page</a>.
82
+ </p>
83
+ </div>
84
+ </div>
85
+
86
+ <!-- Header -->
87
+ <div class="mb-10">
88
+ <div class="flex items-center gap-3 mb-3">
89
+ <div class="w-10 h-10 rounded-xl flex items-center justify-center" style="background-color: {{DESIGN_PRIMARY}}">
90
+ <svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
91
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
92
+ d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zm10 0a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zm10 0a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"/>
93
+ </svg>
94
+ </div>
95
+ <h1 class="text-3xl font-bold text-slate-900">{{APP_NAME}}</h1>
96
+ </div>
97
+ <p class="text-slate-500 text-lg">{{APP_DESCRIPTION}}</p>
98
+ <div class="flex items-center gap-4 mt-4 text-sm text-slate-400">
99
+ <span>{{VERSION}}</span>
100
+ <span class="w-1 h-1 bg-slate-300 rounded-full"></span>
101
+ <span>{{TOTAL_SCREENS}} screens</span>
102
+ <span class="w-1 h-1 bg-slate-300 rounded-full"></span>
103
+ <span>UI Mockup for Designer Review</span>
104
+ </div>
105
+ <div class="flex items-center gap-4 mt-2 text-xs text-slate-400">
106
+ <span>{{VERSION_LABEL}}</span>
107
+ <span class="w-1 h-1 bg-slate-300 rounded-full"></span>
108
+ <span>{{FILTER_SUMMARY}}</span>
109
+ </div>
110
+ </div>
111
+
112
+ <!-- Role Sections -->
113
+ {{ROLE_SECTIONS}}
114
+
115
+ <!-- Footer -->
116
+ <div class="mt-12 pt-6 border-t border-slate-200 text-center text-sm text-slate-400">
117
+ Generated for UI/UX designer review. Screens open in new tabs via the shared Mockup Hub.
118
+ </div>
119
+ </div>
120
+
121
+ </body>
122
+ </html>
123
+ ```
124
+
125
+ ## Role Section Template
126
+
127
+ For each role, generate this block inside `{{ROLE_SECTIONS}}`:
128
+
129
+ ```html
130
+ <!-- Role: {{ROLE_NAME}} -->
131
+ <div class="mb-10">
132
+ <div class="flex items-center gap-2 mb-4">
133
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" style="color: {{DESIGN_PRIMARY}}">
134
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
135
+ d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
136
+ </svg>
137
+ <h2 class="text-xl font-semibold text-slate-800">{{ROLE_NAME}}</h2>
138
+ <span class="text-sm text-slate-400 ml-2">({{SCREEN_COUNT}} screens)</span>
139
+ <!-- Quick launch link opens the role home in a new tab -->
140
+ <a href="/{{APP_SLUG}}/{{ROLE_FOLDER}}/home"
141
+ target="_blank"
142
+ rel="noopener noreferrer"
143
+ class="ml-auto flex items-center gap-1 text-xs px-3 py-1.5 rounded-lg border transition-colors"
144
+ style="color: {{DESIGN_PRIMARY}}; border-color: {{DESIGN_PRIMARY}}">
145
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
146
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
147
+ d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/>
148
+ </svg>
149
+ Open Role Dashboard
150
+ </a>
151
+ </div>
152
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
153
+ {{SCREEN_CARDS}}
154
+ </div>
155
+ </div>
156
+ ```
157
+
158
+ ## Screen Card Template
159
+
160
+ Each card opens the corresponding screen in a **new browser tab**:
161
+
162
+ ```html
163
+ <a href="/{{APP_SLUG}}/{{ROLE_FOLDER}}/{{SCREEN_FILE_NO_EXT}}"
164
+ target="_blank"
165
+ rel="noopener noreferrer"
166
+ class="block bg-white rounded-xl border border-slate-200 p-4 hover:shadow-md transition-all duration-200 cursor-pointer group">
167
+ <div class="flex items-center justify-between mb-2">
168
+ <div class="flex items-center gap-2">
169
+ <svg class="w-4 h-4 text-slate-400 group-hover:text-primary transition-colors"><!-- module icon --></svg>
170
+ <h3 class="font-medium text-slate-800 group-hover:text-primary transition-colors">{{SCREEN_TITLE}}</h3>
171
+ </div>
172
+ <!-- External link icon to indicate opens in new tab -->
173
+ <svg class="w-3.5 h-3.5 text-slate-300 group-hover:text-primary transition-colors shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
174
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
175
+ d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/>
176
+ </svg>
177
+ </div>
178
+ <p class="text-sm text-slate-500">{{SCREEN_DESCRIPTION}}</p>
179
+ <div class="mt-3 flex flex-wrap gap-1">
180
+ <!-- User story tags as badges -->
181
+ <span class="text-xs bg-slate-100 text-slate-500 px-2 py-0.5 rounded-full">{{US_TAG}}</span>
182
+ </div>
183
+ </a>
184
+ ```
185
+
186
+ The `{{SCREEN_DESCRIPTION}}` is a brief summary of what the screen shows,
187
+ derived from the user story action (e.g., "Search and manage geographical information").
188
+
189
+ The `{{SCREEN_FILE_NO_EXT}}` is the filename without `.html`
190
+ (e.g., `location_information` for `location_information.html`).
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-CnRPtHb3.js";import{p as f}from"./chunk-JWPE2WC7-Ccpx-Rog.js";import{_ as n,l as o}from"./index-DAL1vVaa.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-CZQhaPM1.js";var v=d().RailroadAbnf.parser.LangiumParser,l=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),i=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:i,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return l(e.element);case"AbnfOptionalGroup":return{type:"optional",element:l(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:l(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},w={parser:R,db:a,renderer:u,styles:p};export{w as diagram};
1
+ import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-BVmlLOXk.js";import{p as f}from"./chunk-JWPE2WC7-DSNEXnbo.js";import{_ as n,l as o}from"./index-HUEMwsDE.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-BwJnOy5O.js";var v=d().RailroadAbnf.parser.LangiumParser,l=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),i=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:i,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return l(e.element);case"AbnfOptionalGroup":return{type:"optional",element:l(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:l(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},w={parser:R,db:a,renderer:u,styles:p};export{w as diagram};
@@ -1 +1 @@
1
- import{Y as ln,$ as an,a0 as y,a1 as tn,a2 as F,a3 as q,a4 as _,a5 as un,a6 as rn,a7 as J,a8 as o,a9 as j,aa as sn,ab as on,ac as fn}from"./index-DAL1vVaa.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(fn(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,B=un(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(un(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<rn)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(on((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
1
+ import{Y as ln,$ as an,a0 as y,a1 as tn,a2 as F,a3 as q,a4 as _,a5 as un,a6 as rn,a7 as J,a8 as o,a9 as j,aa as sn,ab as on,ac as fn}from"./index-HUEMwsDE.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(fn(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,B=un(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(un(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<rn)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(on((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};