anylumino 0.1.0__tar.gz

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 (220) hide show
  1. anylumino-0.1.0/.github/workflows/ci.yml +77 -0
  2. anylumino-0.1.0/.github/workflows/docs.yml +65 -0
  3. anylumino-0.1.0/.github/workflows/release.yml +123 -0
  4. anylumino-0.1.0/.gitignore +17 -0
  5. anylumino-0.1.0/CHANGELOG.md +6 -0
  6. anylumino-0.1.0/CONTRIBUTING.md +26 -0
  7. anylumino-0.1.0/LICENSE +21 -0
  8. anylumino-0.1.0/Makefile +72 -0
  9. anylumino-0.1.0/PKG-INFO +403 -0
  10. anylumino-0.1.0/README.md +387 -0
  11. anylumino-0.1.0/THIRD_PARTY_LICENSES.md +1161 -0
  12. anylumino-0.1.0/app/docs/[[...slug]]/page.tsx +53 -0
  13. anylumino-0.1.0/app/docs/layout.tsx +12 -0
  14. anylumino-0.1.0/app/global.css +146 -0
  15. anylumino-0.1.0/app/layout.tsx +28 -0
  16. anylumino-0.1.0/app/page.tsx +15 -0
  17. anylumino-0.1.0/app/static.json/route.ts +6 -0
  18. anylumino-0.1.0/content/docs/api/astryx/base/Component.mdx +66 -0
  19. anylumino-0.1.0/content/docs/api/astryx/base/Theme.mdx +162 -0
  20. anylumino-0.1.0/content/docs/api/astryx/base/Widget.mdx +223 -0
  21. anylumino-0.1.0/content/docs/api/astryx/base/index.mdx +171 -0
  22. anylumino-0.1.0/content/docs/api/astryx/data/Avatar.mdx +81 -0
  23. anylumino-0.1.0/content/docs/api/astryx/data/Banner.mdx +106 -0
  24. anylumino-0.1.0/content/docs/api/astryx/data/Blockquote.mdx +47 -0
  25. anylumino-0.1.0/content/docs/api/astryx/data/CodeBlock.mdx +161 -0
  26. anylumino-0.1.0/content/docs/api/astryx/data/EmptyState.mdx +82 -0
  27. anylumino-0.1.0/content/docs/api/astryx/data/Icon.mdx +65 -0
  28. anylumino-0.1.0/content/docs/api/astryx/data/Kbd.mdx +47 -0
  29. anylumino-0.1.0/content/docs/api/astryx/data/Link.mdx +157 -0
  30. anylumino-0.1.0/content/docs/api/astryx/data/Markdown.mdx +139 -0
  31. anylumino-0.1.0/content/docs/api/astryx/data/Pagination.mdx +107 -0
  32. anylumino-0.1.0/content/docs/api/astryx/data/ProgressBar.mdx +106 -0
  33. anylumino-0.1.0/content/docs/api/astryx/data/Skeleton.mdx +68 -0
  34. anylumino-0.1.0/content/docs/api/astryx/data/Spinner.mdx +68 -0
  35. anylumino-0.1.0/content/docs/api/astryx/data/StatusDot.mdx +76 -0
  36. anylumino-0.1.0/content/docs/api/astryx/data/Table.mdx +420 -0
  37. anylumino-0.1.0/content/docs/api/astryx/data/Thumbnail.mdx +110 -0
  38. anylumino-0.1.0/content/docs/api/astryx/data/Timestamp.mdx +119 -0
  39. anylumino-0.1.0/content/docs/api/astryx/data/Token.mdx +125 -0
  40. anylumino-0.1.0/content/docs/api/astryx/data/index.mdx +47 -0
  41. anylumino-0.1.0/content/docs/api/astryx/index.mdx +19 -0
  42. anylumino-0.1.0/content/docs/api/astryx/inputs/Badge.mdx +50 -0
  43. anylumino-0.1.0/content/docs/api/astryx/inputs/Button.mdx +111 -0
  44. anylumino-0.1.0/content/docs/api/astryx/inputs/Checkbox.mdx +128 -0
  45. anylumino-0.1.0/content/docs/api/astryx/inputs/DateInput.mdx +126 -0
  46. anylumino-0.1.0/content/docs/api/astryx/inputs/DateRangeInput.mdx +131 -0
  47. anylumino-0.1.0/content/docs/api/astryx/inputs/DateTimeInput.mdx +142 -0
  48. anylumino-0.1.0/content/docs/api/astryx/inputs/Heading.mdx +118 -0
  49. anylumino-0.1.0/content/docs/api/astryx/inputs/IconButton.mdx +100 -0
  50. anylumino-0.1.0/content/docs/api/astryx/inputs/LogSlider.mdx +105 -0
  51. anylumino-0.1.0/content/docs/api/astryx/inputs/MultiSelector.mdx +178 -0
  52. anylumino-0.1.0/content/docs/api/astryx/inputs/NumberInput.mdx +162 -0
  53. anylumino-0.1.0/content/docs/api/astryx/inputs/PowerSearch.mdx +95 -0
  54. anylumino-0.1.0/content/docs/api/astryx/inputs/SelectionSlider.mdx +103 -0
  55. anylumino-0.1.0/content/docs/api/astryx/inputs/Selector.mdx +152 -0
  56. anylumino-0.1.0/content/docs/api/astryx/inputs/Slider.mdx +150 -0
  57. anylumino-0.1.0/content/docs/api/astryx/inputs/Switch.mdx +127 -0
  58. anylumino-0.1.0/content/docs/api/astryx/inputs/Text.mdx +136 -0
  59. anylumino-0.1.0/content/docs/api/astryx/inputs/TextArea.mdx +171 -0
  60. anylumino-0.1.0/content/docs/api/astryx/inputs/TextInput.mdx +177 -0
  61. anylumino-0.1.0/content/docs/api/astryx/inputs/TimeInput.mdx +145 -0
  62. anylumino-0.1.0/content/docs/api/astryx/inputs/ToggleButton.mdx +96 -0
  63. anylumino-0.1.0/content/docs/api/astryx/inputs/index.mdx +53 -0
  64. anylumino-0.1.0/content/docs/api/astryx/layout/AccordionPanel.mdx +135 -0
  65. anylumino-0.1.0/content/docs/api/astryx/layout/ResponsivePanel.mdx +89 -0
  66. anylumino-0.1.0/content/docs/api/astryx/layout/ScrollBox.mdx +102 -0
  67. anylumino-0.1.0/content/docs/api/astryx/layout/SplitPanel.mdx +89 -0
  68. anylumino-0.1.0/content/docs/api/astryx/layout/StackedPanel.mdx +92 -0
  69. anylumino-0.1.0/content/docs/api/astryx/layout/TabPanel.mdx +152 -0
  70. anylumino-0.1.0/content/docs/api/astryx/layout/index.mdx +31 -0
  71. anylumino-0.1.0/content/docs/api/astryx/surfaces/AlertDialog.mdx +134 -0
  72. anylumino-0.1.0/content/docs/api/astryx/surfaces/AspectRatio.mdx +49 -0
  73. anylumino-0.1.0/content/docs/api/astryx/surfaces/AvatarGroup.mdx +68 -0
  74. anylumino-0.1.0/content/docs/api/astryx/surfaces/Breadcrumbs.mdx +76 -0
  75. anylumino-0.1.0/content/docs/api/astryx/surfaces/ButtonGroup.mdx +99 -0
  76. anylumino-0.1.0/content/docs/api/astryx/surfaces/Calendar.mdx +116 -0
  77. anylumino-0.1.0/content/docs/api/astryx/surfaces/Card.mdx +100 -0
  78. anylumino-0.1.0/content/docs/api/astryx/surfaces/Carousel.mdx +71 -0
  79. anylumino-0.1.0/content/docs/api/astryx/surfaces/Center.mdx +79 -0
  80. anylumino-0.1.0/content/docs/api/astryx/surfaces/CheckboxList.mdx +114 -0
  81. anylumino-0.1.0/content/docs/api/astryx/surfaces/Citation.mdx +65 -0
  82. anylumino-0.1.0/content/docs/api/astryx/surfaces/ClickableCard.mdx +127 -0
  83. anylumino-0.1.0/content/docs/api/astryx/surfaces/Code.mdx +45 -0
  84. anylumino-0.1.0/content/docs/api/astryx/surfaces/Collapsible.mdx +78 -0
  85. anylumino-0.1.0/content/docs/api/astryx/surfaces/CommandPalette.mdx +136 -0
  86. anylumino-0.1.0/content/docs/api/astryx/surfaces/ContextMenu.mdx +81 -0
  87. anylumino-0.1.0/content/docs/api/astryx/surfaces/Dialog.mdx +116 -0
  88. anylumino-0.1.0/content/docs/api/astryx/surfaces/Divider.mdx +75 -0
  89. anylumino-0.1.0/content/docs/api/astryx/surfaces/DropdownMenu.mdx +126 -0
  90. anylumino-0.1.0/content/docs/api/astryx/surfaces/Field.mdx +141 -0
  91. anylumino-0.1.0/content/docs/api/astryx/surfaces/FieldStatus.mdx +60 -0
  92. anylumino-0.1.0/content/docs/api/astryx/surfaces/FileInput.mdx +158 -0
  93. anylumino-0.1.0/content/docs/api/astryx/surfaces/FormLayout.mdx +55 -0
  94. anylumino-0.1.0/content/docs/api/astryx/surfaces/Grid.mdx +122 -0
  95. anylumino-0.1.0/content/docs/api/astryx/surfaces/HoverCard.mdx +127 -0
  96. anylumino-0.1.0/content/docs/api/astryx/surfaces/InputGroup.mdx +123 -0
  97. anylumino-0.1.0/content/docs/api/astryx/surfaces/Lightbox.mdx +76 -0
  98. anylumino-0.1.0/content/docs/api/astryx/surfaces/List.mdx +90 -0
  99. anylumino-0.1.0/content/docs/api/astryx/surfaces/MetadataList.mdx +92 -0
  100. anylumino-0.1.0/content/docs/api/astryx/surfaces/MoreMenu.mdx +110 -0
  101. anylumino-0.1.0/content/docs/api/astryx/surfaces/Outline.mdx +81 -0
  102. anylumino-0.1.0/content/docs/api/astryx/surfaces/Overlay.mdx +87 -0
  103. anylumino-0.1.0/content/docs/api/astryx/surfaces/Popover.mdx +133 -0
  104. anylumino-0.1.0/content/docs/api/astryx/surfaces/RadioList.mdx +115 -0
  105. anylumino-0.1.0/content/docs/api/astryx/surfaces/Section.mdx +113 -0
  106. anylumino-0.1.0/content/docs/api/astryx/surfaces/SegmentedControl.mdx +88 -0
  107. anylumino-0.1.0/content/docs/api/astryx/surfaces/SelectableCard.mdx +114 -0
  108. anylumino-0.1.0/content/docs/api/astryx/surfaces/Stack.mdx +134 -0
  109. anylumino-0.1.0/content/docs/api/astryx/surfaces/TabList.mdx +93 -0
  110. anylumino-0.1.0/content/docs/api/astryx/surfaces/ToggleButtonGroup.mdx +100 -0
  111. anylumino-0.1.0/content/docs/api/astryx/surfaces/Tokenizer.mdx +179 -0
  112. anylumino-0.1.0/content/docs/api/astryx/surfaces/Toolbar.mdx +104 -0
  113. anylumino-0.1.0/content/docs/api/astryx/surfaces/Tooltip.mdx +133 -0
  114. anylumino-0.1.0/content/docs/api/astryx/surfaces/TreeList.mdx +72 -0
  115. anylumino-0.1.0/content/docs/api/astryx/surfaces/Typeahead.mdx +165 -0
  116. anylumino-0.1.0/content/docs/api/astryx/surfaces/index.mdx +101 -0
  117. anylumino-0.1.0/content/docs/api/components/ComponentWidget.mdx +166 -0
  118. anylumino-0.1.0/content/docs/api/components/index.mdx +15 -0
  119. anylumino-0.1.0/content/docs/api/controls/DatePicker.mdx +77 -0
  120. anylumino-0.1.0/content/docs/api/controls/DatetimePicker.mdx +83 -0
  121. anylumino-0.1.0/content/docs/api/controls/TimePicker.mdx +83 -0
  122. anylumino-0.1.0/content/docs/api/controls/index.mdx +15 -0
  123. anylumino-0.1.0/content/docs/api/index.mdx +17 -0
  124. anylumino-0.1.0/content/docs/api/layout/AccordionPanel.mdx +63 -0
  125. anylumino-0.1.0/content/docs/api/layout/BoxPanel.mdx +143 -0
  126. anylumino-0.1.0/content/docs/api/layout/CommandPalette.mdx +54 -0
  127. anylumino-0.1.0/content/docs/api/layout/DockPanel.mdx +70 -0
  128. anylumino-0.1.0/content/docs/api/layout/GridPanel.mdx +104 -0
  129. anylumino-0.1.0/content/docs/api/layout/HBox.mdx +107 -0
  130. anylumino-0.1.0/content/docs/api/layout/KeyedChildren.mdx +366 -0
  131. anylumino-0.1.0/content/docs/api/layout/LayoutWidget.mdx +35 -0
  132. anylumino-0.1.0/content/docs/api/layout/MenuBar.mdx +49 -0
  133. anylumino-0.1.0/content/docs/api/layout/ResponsivePanel.mdx +102 -0
  134. anylumino-0.1.0/content/docs/api/layout/ScrollBox.mdx +106 -0
  135. anylumino-0.1.0/content/docs/api/layout/SplitPanel.mdx +97 -0
  136. anylumino-0.1.0/content/docs/api/layout/StackedPanel.mdx +93 -0
  137. anylumino-0.1.0/content/docs/api/layout/TabPanel.mdx +147 -0
  138. anylumino-0.1.0/content/docs/api/layout/TextWidget.mdx +30 -0
  139. anylumino-0.1.0/content/docs/api/layout/Toolbar.mdx +48 -0
  140. anylumino-0.1.0/content/docs/api/layout/VBox.mdx +107 -0
  141. anylumino-0.1.0/content/docs/api/layout/index.mdx +61 -0
  142. anylumino-0.1.0/content/docs/api/meta.json +10 -0
  143. anylumino-0.1.0/content/docs/assets/anylumino-mark.svg +92 -0
  144. anylumino-0.1.0/content/docs/astryx.mdx +404 -0
  145. anylumino-0.1.0/content/docs/controls.mdx +161 -0
  146. anylumino-0.1.0/content/docs/examples.mdx +142 -0
  147. anylumino-0.1.0/content/docs/guide-overview.mdx +105 -0
  148. anylumino-0.1.0/content/docs/guide.mdx +212 -0
  149. anylumino-0.1.0/content/docs/index.mdx +122 -0
  150. anylumino-0.1.0/content/docs/meta.json +12 -0
  151. anylumino-0.1.0/docs/astryx_brand_theme.md +261 -0
  152. anylumino-0.1.0/docs/astryx_review.md +141 -0
  153. anylumino-0.1.0/docs/astryx_widgets.md +378 -0
  154. anylumino-0.1.0/docs/release_recommendations.md +119 -0
  155. anylumino-0.1.0/docs-site/components/mdx.tsx +35 -0
  156. anylumino-0.1.0/docs-site/lib/docs-href.mjs +20 -0
  157. anylumino-0.1.0/docs-site/lib/layout.shared.tsx +10 -0
  158. anylumino-0.1.0/docs-site/lib/source.ts +18 -0
  159. anylumino-0.1.0/eslint.config.mjs +18 -0
  160. anylumino-0.1.0/licenses/astryx.txt +21 -0
  161. anylumino-0.1.0/licenses/lumino.txt +56 -0
  162. anylumino-0.1.0/licenses/stylex.txt +21 -0
  163. anylumino-0.1.0/next-env.d.ts +7 -0
  164. anylumino-0.1.0/next.config.mjs +18 -0
  165. anylumino-0.1.0/notebooks/astryx_components_smoke.py +669 -0
  166. anylumino-0.1.0/notebooks/astryx_layout_panels.py +200 -0
  167. anylumino-0.1.0/notebooks/astryx_table.py +167 -0
  168. anylumino-0.1.0/notebooks/astryx_themes.py +133 -0
  169. anylumino-0.1.0/notebooks/input_controls_hbox.py +130 -0
  170. anylumino-0.1.0/notebooks/itables_tabs.py +186 -0
  171. anylumino-0.1.0/notebooks/plotly_dashboard.py +499 -0
  172. anylumino-0.1.0/notebooks/plotly_tabs.py +84 -0
  173. anylumino-0.1.0/package-lock.json +11815 -0
  174. anylumino-0.1.0/package.json +51 -0
  175. anylumino-0.1.0/postcss.config.mjs +7 -0
  176. anylumino-0.1.0/pyproject.toml +44 -0
  177. anylumino-0.1.0/scripts/build-frontend.mjs +30 -0
  178. anylumino-0.1.0/scripts/bundle-entries.mjs +15 -0
  179. anylumino-0.1.0/scripts/generate-api-docs.mjs +73 -0
  180. anylumino-0.1.0/scripts/generate-frontend-licenses.mjs +114 -0
  181. anylumino-0.1.0/src/anylumino/__init__.py +47 -0
  182. anylumino-0.1.0/src/anylumino/astryx/__init__.py +194 -0
  183. anylumino-0.1.0/src/anylumino/astryx/base.py +785 -0
  184. anylumino-0.1.0/src/anylumino/astryx/data.py +1623 -0
  185. anylumino-0.1.0/src/anylumino/astryx/inputs.py +2116 -0
  186. anylumino-0.1.0/src/anylumino/astryx/layout.py +467 -0
  187. anylumino-0.1.0/src/anylumino/astryx/surfaces.py +3622 -0
  188. anylumino-0.1.0/src/anylumino/common.py +115 -0
  189. anylumino-0.1.0/src/anylumino/components.py +125 -0
  190. anylumino-0.1.0/src/anylumino/controls.py +199 -0
  191. anylumino-0.1.0/src/anylumino/layout.py +1383 -0
  192. anylumino-0.1.0/src/anylumino/py.typed +1 -0
  193. anylumino-0.1.0/src/anylumino/static/astryx/astryx_bridge.mjs +151 -0
  194. anylumino-0.1.0/src/anylumino/static/astryx/astryx_theme.mjs +114 -0
  195. anylumino-0.1.0/src/anylumino/static/astryx/astryx_widget.bundle.css +1 -0
  196. anylumino-0.1.0/src/anylumino/static/astryx/astryx_widget.bundle.js +280 -0
  197. anylumino-0.1.0/src/anylumino/static/astryx/astryx_widget.css +109 -0
  198. anylumino-0.1.0/src/anylumino/static/astryx/astryx_widget.js +2121 -0
  199. anylumino-0.1.0/src/anylumino/static/controls/native_control_widget.bundle.js +1 -0
  200. anylumino-0.1.0/src/anylumino/static/controls/native_control_widget.css +105 -0
  201. anylumino-0.1.0/src/anylumino/static/controls/native_control_widget.js +180 -0
  202. anylumino-0.1.0/src/anylumino/static/layout/action_panel.bundle.js +1 -0
  203. anylumino-0.1.0/src/anylumino/static/layout/action_panel.css +177 -0
  204. anylumino-0.1.0/src/anylumino/static/layout/action_panel.js +350 -0
  205. anylumino-0.1.0/src/anylumino/static/layout/composition.js +373 -0
  206. anylumino-0.1.0/src/anylumino/static/layout/layout_panel.bundle.js +1 -0
  207. anylumino-0.1.0/src/anylumino/static/layout/layout_panel.css +207 -0
  208. anylumino-0.1.0/src/anylumino/static/layout/layout_panel.js +508 -0
  209. anylumino-0.1.0/src/anylumino/static/layout/tab_panel.bundle.js +1 -0
  210. anylumino-0.1.0/src/anylumino/static/layout/tab_panel.css +156 -0
  211. anylumino-0.1.0/src/anylumino/static/layout/tab_panel.js +329 -0
  212. anylumino-0.1.0/src/anylumino/static/layout/text_widget.css +10 -0
  213. anylumino-0.1.0/src/anylumino/static/layout/text_widget.js +21 -0
  214. anylumino-0.1.0/tests/docs-href.test.mjs +24 -0
  215. anylumino-0.1.0/tests/frontend/astryx_bridge.test.mjs +165 -0
  216. anylumino-0.1.0/tests/frontend/astryx_theme.test.mjs +179 -0
  217. anylumino-0.1.0/tests/frontend/composition.test.mjs +163 -0
  218. anylumino-0.1.0/tests/test_widgets.py +1715 -0
  219. anylumino-0.1.0/tsconfig.json +32 -0
  220. anylumino-0.1.0/uv.lock +1993 -0
@@ -0,0 +1,77 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - name: Check out repository
13
+ uses: actions/checkout@v4
14
+
15
+ - name: Set up Python
16
+ uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.14"
19
+
20
+ - name: Set up uv
21
+ uses: astral-sh/setup-uv@v5
22
+
23
+ - name: Set up Node.js
24
+ uses: actions/setup-node@v4
25
+ with:
26
+ node-version: "22"
27
+ cache: npm
28
+
29
+ - name: Install frontend dependencies
30
+ run: npm ci
31
+
32
+ - name: Build frontend bundles
33
+ run: npm run build
34
+
35
+ - name: Verify committed bundles are current
36
+ run: git diff --exit-code -- src/anylumino/static
37
+
38
+ - name: Regenerate bundled dependency licenses
39
+ run: npm run licenses
40
+
41
+ - name: Verify the license inventory is current
42
+ run: git diff --exit-code -- THIRD_PARTY_LICENSES.md
43
+
44
+ - name: Run frontend tests
45
+ run: npm test
46
+
47
+ - name: Install Python dependencies
48
+ run: uv sync --dev
49
+
50
+ - name: Check documentation
51
+ run: make docs-check
52
+
53
+ - name: Run tests
54
+ run: uv run --no-sync pytest
55
+
56
+ - name: Build distributions
57
+ run: uv build
58
+
59
+ - name: Validate distributions for publication
60
+ run: uv publish --dry-run --trusted-publishing never dist/*
61
+
62
+ - name: Test installed wheel
63
+ run: |
64
+ uv venv /tmp/anylumino-wheel
65
+ uv pip install --python /tmp/anylumino-wheel/bin/python dist/*.whl
66
+ cd /tmp
67
+ /tmp/anylumino-wheel/bin/python - <<'PY'
68
+ import anylumino as al
69
+ import anylumino.astryx as ax
70
+
71
+ panel = al.TabPanel({"text": ax.Text("Wheel check")})
72
+ assert panel.child_keys == ["text"]
73
+ for widget in (panel, panel["text"], al.DatePicker()):
74
+ state = widget.get_state()
75
+ assert "export" in state["_esm"]
76
+ assert "anylumino" in state["_css"]
77
+ PY
@@ -0,0 +1,65 @@
1
+ name: Docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ pages: write
11
+ id-token: write
12
+
13
+ concurrency:
14
+ group: pages
15
+ cancel-in-progress: false
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - name: Check out repository
23
+ uses: actions/checkout@v4
24
+
25
+ - name: Set up Python
26
+ uses: actions/setup-python@v5
27
+ with:
28
+ python-version: "3.14"
29
+
30
+ - name: Set up uv
31
+ uses: astral-sh/setup-uv@v5
32
+
33
+ - name: Set up Node.js
34
+ uses: actions/setup-node@v4
35
+ with:
36
+ node-version: "22"
37
+ cache: npm
38
+
39
+ - name: Install dependencies
40
+ run: |
41
+ npm ci
42
+ uv sync --dev
43
+
44
+ - name: Build the documentation site
45
+ env:
46
+ NEXT_PUBLIC_BASE_PATH: /anylumino
47
+ run: make docs
48
+
49
+ - name: Upload the exported site
50
+ uses: actions/upload-pages-artifact@v3
51
+ with:
52
+ path: out
53
+
54
+ deploy:
55
+ needs: build
56
+ runs-on: ubuntu-latest
57
+
58
+ environment:
59
+ name: github-pages
60
+ url: ${{ steps.deployment.outputs.page_url }}
61
+
62
+ steps:
63
+ - name: Deploy to GitHub Pages
64
+ id: deployment
65
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,123 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+ workflow_dispatch:
7
+ inputs:
8
+ index:
9
+ description: Index to publish to
10
+ type: choice
11
+ options: [pypi, testpypi]
12
+ default: testpypi
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - name: Check out repository
23
+ uses: actions/checkout@v4
24
+
25
+ - name: Set up Python
26
+ uses: actions/setup-python@v5
27
+ with:
28
+ python-version: "3.14"
29
+
30
+ - name: Set up uv
31
+ uses: astral-sh/setup-uv@v5
32
+
33
+ - name: Set up Node.js
34
+ uses: actions/setup-node@v4
35
+ with:
36
+ node-version: "22"
37
+ cache: npm
38
+
39
+ - name: Build frontend bundles
40
+ run: |
41
+ npm ci
42
+ npm run build
43
+
44
+ - name: Verify committed bundles are current
45
+ run: git diff --exit-code -- src/anylumino/static
46
+
47
+ - name: Verify the tag matches the project version
48
+ if: github.ref_type == 'tag'
49
+ run: |
50
+ version="$(uv version --short)"
51
+ if [ "v$version" != "${{ github.ref_name }}" ]; then
52
+ echo "Tag ${{ github.ref_name }} does not match project version $version"
53
+ exit 1
54
+ fi
55
+
56
+ - name: Build distributions
57
+ run: uv build
58
+
59
+ - name: Validate distributions for publication
60
+ run: uv publish --dry-run --trusted-publishing never dist/*
61
+
62
+ - name: Upload distributions
63
+ uses: actions/upload-artifact@v4
64
+ with:
65
+ name: distributions
66
+ path: dist
67
+
68
+ publish:
69
+ needs: build
70
+ runs-on: ubuntu-latest
71
+
72
+ # Trusted Publishing exchanges this job's OIDC token for a short-lived
73
+ # upload token, so the workflow needs no stored PyPI credentials.
74
+ environment: ${{ github.event.inputs.index || 'pypi' }}
75
+ permissions:
76
+ id-token: write
77
+
78
+ steps:
79
+ - name: Set up uv
80
+ uses: astral-sh/setup-uv@v5
81
+
82
+ - name: Download distributions
83
+ uses: actions/download-artifact@v4
84
+ with:
85
+ name: distributions
86
+ path: dist
87
+
88
+ - name: Publish to PyPI
89
+ if: github.event.inputs.index != 'testpypi'
90
+ run: uv publish dist/*
91
+
92
+ - name: Publish to TestPyPI
93
+ if: github.event.inputs.index == 'testpypi'
94
+ run: uv publish --publish-url https://test.pypi.org/legacy/ dist/*
95
+
96
+ attach:
97
+ needs: build
98
+ if: github.ref_type == 'tag'
99
+ runs-on: ubuntu-latest
100
+
101
+ permissions:
102
+ contents: write
103
+
104
+ steps:
105
+ - name: Check out repository
106
+ uses: actions/checkout@v4
107
+
108
+ - name: Download distributions
109
+ uses: actions/download-artifact@v4
110
+ with:
111
+ name: distributions
112
+ path: dist
113
+
114
+ - name: Attach distributions to the release
115
+ env:
116
+ GH_TOKEN: ${{ github.token }}
117
+ TAG: ${{ github.ref_name }}
118
+ run: |
119
+ if gh release view "$TAG" > /dev/null 2>&1; then
120
+ gh release upload "$TAG" dist/* --clobber
121
+ else
122
+ gh release create "$TAG" dist/* --verify-tag --generate-notes --title "anylumino ${TAG#v}"
123
+ fi
@@ -0,0 +1,17 @@
1
+ .venv/
2
+ .uv-cache/
3
+ node_modules/
4
+ .next/
5
+ out/
6
+ *.tsbuildinfo
7
+ .pytest_cache/
8
+ .ipynb_checkpoints/
9
+ **/.ipynb_checkpoints/
10
+ __pycache__/
11
+ **/__pycache__/
12
+ *.py[cod]
13
+ *.ipynb
14
+ *.egg-info/
15
+ dist/
16
+ build/
17
+ .DS_Store
@@ -0,0 +1,6 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ - Documented the `uv` build, validation, TestPyPI, and PyPI release workflow.
6
+ - Added contributor setup and verification guidance.
@@ -0,0 +1,26 @@
1
+ # Contributing
2
+
3
+ Install the development dependencies and build the frontend before running the
4
+ checks:
5
+
6
+ ```sh
7
+ uv sync --group dev
8
+ npm ci
9
+ npm run build
10
+ ```
11
+
12
+ Run `uv run --no-sync pytest` for Python tests, `npm test` for frontend tests,
13
+ and `make docs-check` for generated API pages, documentation links, linting,
14
+ types, and the production documentation build. Keep generated frontend bundles
15
+ current by running `npm run build` after frontend changes, and regenerate
16
+ `THIRD_PARTY_LICENSES.md` with `npm run licenses` after frontend dependency
17
+ changes. CI verifies both files.
18
+
19
+ Keep pull requests focused. Add or update a runnable notebook when a change
20
+ introduces a user-facing widget pattern, and update the relevant documentation
21
+ when public behavior changes.
22
+
23
+ Releases run from a `v*` tag. Bump the version in `pyproject.toml`, tag the
24
+ release commit, and push the tag; the Release workflow builds the
25
+ distributions, attaches them to the GitHub release, and publishes to PyPI
26
+ through Trusted Publishing.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Faysal Aberkane <faysal.aberkane@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,72 @@
1
+ DOCS_PORT ?= 4200
2
+ DOCS_HOST ?= 127.0.0.1
3
+ OPEN ?= open
4
+ DOCS_URL = http://$(DOCS_HOST):$(DOCS_PORT)/docs
5
+
6
+ .PHONY: install-dev
7
+ install-dev:
8
+ uv sync --group dev
9
+ npm ci
10
+ npm run build
11
+ uv run --no-sync jupytext-config set-default-viewer
12
+
13
+ .PHONY: update-dependencies
14
+ update-dependencies:
15
+ uv lock \
16
+ --upgrade-package anywidget \
17
+ --upgrade-package jupyter \
18
+ --upgrade-package jupyterlab \
19
+ --upgrade-package jupyter-builder
20
+ npm install --save-exact @lumino/commands@latest @lumino/widgets@latest
21
+ npm install --save-prefix='^' @astryxdesign/core@latest @astryxdesign/theme-neutral@latest
22
+ npm install --save-dev --save-prefix='^' @astryxdesign/cli@latest
23
+ npm run build
24
+
25
+ .PHONY: frontend
26
+ frontend:
27
+ npm run build
28
+
29
+ .PHONY: test
30
+ test:
31
+ npm test
32
+ uv run pytest
33
+
34
+ .PHONY: docs-reference
35
+ docs-reference: docs-install
36
+ @mkdir -p build/docs
37
+ PYTHONPATH=node_modules/fumadocs-python:src uv run --no-sync python -c 'from fumapy import generate; generate()' anylumino --docstring-style numpy --dir build/docs
38
+ npm run docs:convert
39
+
40
+ .PHONY: docs-install
41
+ docs-install:
42
+ uv sync --group dev
43
+ npm ci
44
+
45
+ .PHONY: docs-check-port
46
+ docs-check-port:
47
+ @if lsof -nP -iTCP:$(DOCS_PORT) -sTCP:LISTEN >/dev/null 2>&1; then \
48
+ echo "Port $(DOCS_PORT) is already in use. Stop the process below or run with DOCS_PORT=<free-port>:"; \
49
+ lsof -nP -iTCP:$(DOCS_PORT) -sTCP:LISTEN; \
50
+ exit 1; \
51
+ fi
52
+
53
+ .PHONY: docs
54
+ docs: docs-reference
55
+ npm run docs:build
56
+
57
+ .PHONY: docs-preview
58
+ docs-preview: docs-reference
59
+ (sleep 2; $(OPEN) $(DOCS_URL)) &
60
+ npm run docs:dev -- --hostname $(DOCS_HOST) --port $(DOCS_PORT)
61
+
62
+ .PHONY: docs-serve
63
+ docs-serve: docs-check-port docs
64
+ (sleep 1; $(OPEN) $(DOCS_URL)) &
65
+ uv run --no-sync python -m http.server $(DOCS_PORT) --bind $(DOCS_HOST) --directory out
66
+
67
+ .PHONY: docs-check
68
+ docs-check: docs-reference
69
+ npm run docs:test-links
70
+ npm run docs:lint
71
+ npm run docs:types
72
+ npm run docs:build