Compare commits

...

No commits in common. "pages" and "master" have entirely different histories.

28 changed files with 191 additions and 298 deletions

53
.gitignore vendored Normal file
View File

@ -0,0 +1,53 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# Virtual environments
.venv/
venv/
ENV/
# IDE
.idea/
.vscode/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Testing
.pytest_cache/
.coverage
htmlcov/
.tox/
.nox/
# mypy
.mypy_cache/
# Local config
.env
*.local.yaml
# Documentation symlink (points to project-docs)
docs

File diff suppressed because one or more lines are too long

76
CLAUDE.md Normal file
View File

@ -0,0 +1,76 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
**Directory MapView** - A reimagined file picker dialog that displays the filesystem like a road map.
### Vision
Traditional file dialogs show directories as indented trees or lists. You never see what's beside you or the broader context. Directory MapView changes this:
- Directories appear as connected pathways/roads with labels
- Current path highlighted like a navigation route
- "You are here" marker at current location
- Zoom out to see the big picture, zoom in for details
- Pan around to explore like Google Maps
### Interaction Model
- **Mouse wheel**: Zoom in/out
- **Left-click + drag**: Pan the view
- **Click on directory**: Navigate there
- **Hover**: Show directory info
## Development Commands
```bash
# Install for development
pip install -e ".[dev]"
# Run tests
pytest
# Run the demo
python -m dir_mapview.demo
```
## Architecture
### Technical Approach
- **PyQt6/PySide6** for the widget
- **QGraphicsScene** for zoomable/pannable canvas
- **Tree layout algorithm** for positioning directories
- Lazy loading for large filesystems
- Caching for performance
### Key Modules
- `src/dir_mapview/widget.py` - Main MapView widget (QGraphicsView subclass)
- `src/dir_mapview/scene.py` - Scene management and directory rendering
- `src/dir_mapview/layout.py` - Directory tree layout algorithm
- `src/dir_mapview/scanner.py` - Filesystem scanning with lazy loading
- `src/dir_mapview/dialog.py` - Drop-in file picker dialog replacement
### Key Paths
- **Source code**: `src/dir_mapview/`
- **Tests**: `tests/`
- **Documentation**: `docs/` (symlink to project-docs)
## Documentation
Documentation for this project lives in the centralized docs system:
- **Source**: `~/PycharmProjects/project-docs/docs/projects/dir-mapview/`
- **Public URL**: `https://pages.brrd.tech/rob/dir-mapview/`
When updating documentation:
1. Edit files in `docs/` (the symlink) or the full path above
2. Use `public: true` frontmatter for public-facing docs
3. Use `<!-- PRIVATE_START -->` / `<!-- PRIVATE_END -->` to hide sections
4. Run `~/PycharmProjects/project-docs/scripts/build-public-docs.sh dir-mapview --deploy` to publish
Do NOT create documentation files directly in this repository.

39
README.md Normal file
View File

@ -0,0 +1,39 @@
# Directory MapView
Map-style directory navigator with zoom and pan
## Installation
```bash
pip install -e .
```
## Usage
*TODO: Add usage instructions*
## Documentation
Full documentation is available at: https://pages.brrd.tech/rob/dir-mapview/
## Development
```bash
# Clone the repository
git clone https://gitea.brrd.tech/rob/dir-mapview.git
cd dir-mapview
# Create virtual environment
python -m venv .venv
source .venv/bin/activate
# Install for development
pip install -e ".[dev]"
# Run tests
pytest
```
## License
*TODO: Add license*

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[237],{2237(e,t,i){i.r(t),i.d(t,{default:()=>l});i(6540);var o=i(1312),n=i(5500),s=i(1656),r=i(3363),a=i(4848);function l(){const e=(0,o.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}},3363(e,t,i){i.d(t,{A:()=>a});i(6540);var o=i(4164),n=i(1312),s=i(1107),r=i(4848);function a({className:e}){return(0,r.jsx)("main",{className:(0,o.A)("container margin-vert--xl",e),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(n.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(n.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(n.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]);

View File

@ -1 +0,0 @@
"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[647],{7121(e,c,s){s.r(c),s.d(c,{default:()=>t});s(6540);var r=s(4164),u=s(7559),a=s(5500),l=s(2831),o=s(1656),p=s(4848);function t(e){return(0,p.jsx)(a.e3,{className:(0,r.A)(u.G.wrapper.docsPages),children:(0,p.jsx)(o.A,{children:(0,l.v)(e.route.routes)})})}}}]);

View File

@ -1 +0,0 @@
"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[894],{7836(e,i,s){s.r(i),s.d(i,{assets:()=>r,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"goals","title":"Goals","description":"Active","source":"@site/docs/goals.md","sourceDirName":".","slug":"/goals","permalink":"/rob/dir-mapview/goals","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"type":"goals","project":"dir-mapview","updated":"2026-01-08T00:00:00.000Z"},"sidebar":"docs","previous":{"title":"Directory MapView","permalink":"/rob/dir-mapview/"},"next":{"title":"Ideas & Exploration","permalink":"/rob/dir-mapview/ideas-and-exploration"}}');var a=s(4848),n=s(8453);const l={type:"goals",project:"dir-mapview",updated:new Date("2026-01-08T00:00:00.000Z")},o="Goals",r={},c=[{value:"Active",id:"active",level:2},{value:"Future",id:"future",level:2},{value:"Non-Goals",id:"non-goals",level:2}];function d(e){const i={h1:"h1",h2:"h2",header:"header",input:"input",li:"li",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.header,{children:(0,a.jsx)(i.h1,{id:"goals",children:"Goals"})}),"\n",(0,a.jsx)(i.h2,{id:"active",children:"Active"}),"\n",(0,a.jsxs)(i.ul,{className:"contains-task-list",children:["\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ","Create a map-style directory visualization that displays filesystem structure like a road map #high"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ","Provide zoom and pan navigation for exploring directory hierarchies #high"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ",'Show "you are here" marker for clear context of current location #medium']}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ","Enable click-to-navigate for intuitive directory traversal #high"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ","Support hover previews for quick directory information #medium"]}),"\n"]}),"\n",(0,a.jsx)(i.h2,{id:"future",children:"Future"}),"\n",(0,a.jsxs)(i.ul,{className:"contains-task-list",children:["\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ","Replace standard file picker dialogs with MapView component #high"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ",'Visualize disk usage through directory "road" widths #medium']}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ","Integrate with Artifact Editor for save location navigation #medium"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ","Integrate with CmdForge for tool configuration paths #low"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ","Provide customizable visualization themes #low"]}),"\n"]}),"\n",(0,a.jsx)(i.h2,{id:"non-goals",children:"Non-Goals"}),"\n",(0,a.jsxs)(i.ul,{className:"contains-task-list",children:["\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ",(0,a.jsx)(i.strong,{children:"Real-time file system monitoring"})," - Not a file watcher #medium"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ",(0,a.jsx)(i.strong,{children:"File content preview/editing"})," - Focus is on navigation only #medium"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ",(0,a.jsx)(i.strong,{children:"Replace full-featured file managers"})," - This is a navigation widget #medium"]}),"\n",(0,a.jsxs)(i.li,{className:"task-list-item",children:[(0,a.jsx)(i.input,{type:"checkbox",disabled:!0})," ",(0,a.jsx)(i.strong,{children:"Support for network/remote filesystems"})," - Local filesystem focus initially #medium"]}),"\n"]})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,a.jsx)(i,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453(e,i,s){s.d(i,{R:()=>l,x:()=>o});var t=s(6540);const a={},n=t.createContext(a);function l(e){const i=t.useContext(n);return t.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]);

View File

@ -1 +0,0 @@
"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[574],{921(e,t,n){n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"milestones","title":"Milestones","description":"M1: Proof of Concept","source":"@site/docs/milestones.md","sourceDirName":".","slug":"/milestones","permalink":"/rob/dir-mapview/milestones","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"type":"milestones","project":"dir-mapview","updated":"2026-01-08T00:00:00.000Z"},"sidebar":"docs","previous":{"title":"Ideas & Exploration","permalink":"/rob/dir-mapview/ideas-and-exploration"},"next":{"title":"Dir-MapView TODOs","permalink":"/rob/dir-mapview/todos"}}');var i=n(4848),r=n(8453);const s={type:"milestones",project:"dir-mapview",updated:new Date("2026-01-08T00:00:00.000Z")},a="Milestones",c={},d=[{value:"M1: Proof of Concept",id:"m1-proof-of-concept",level:4},{value:"M2: File Picker Integration",id:"m2-file-picker-integration",level:4},{value:"M3: Advanced Features",id:"m3-advanced-features",level:4}];function l(e){const t={h1:"h1",h4:"h4",header:"header",hr:"hr",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"milestones",children:"Milestones"})}),"\n",(0,i.jsx)(t.h4,{id:"m1-proof-of-concept",children:"M1: Proof of Concept"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Target"}),": Q2 2026\n",(0,i.jsx)(t.strong,{children:"Status"}),": Not Started"]}),"\n",(0,i.jsx)(t.p,{children:"Create the foundational map-style directory visualization widget with basic navigation capabilities. This proves the concept of a zoomable, pannable filesystem view."}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h4,{id:"m2-file-picker-integration",children:"M2: File Picker Integration"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Target"}),": Q3 2026\n",(0,i.jsx)(t.strong,{children:"Status"}),": Not Started"]}),"\n",(0,i.jsx)(t.p,{children:"Replace or augment standard file dialogs with the MapView component, adding hover previews and performance optimizations for real-world usage."}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h4,{id:"m3-advanced-features",children:"M3: Advanced Features"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Target"}),": Q4 2026\n",(0,i.jsx)(t.strong,{children:"Status"}),": Not Started"]}),"\n",(0,i.jsx)(t.p,{children:"Extend functionality with disk usage visualization, custom themes, and integrations with other ecosystem tools (Artifact Editor, CmdForge)."}),"\n",(0,i.jsx)(t.hr,{})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453(e,t,n){n.d(t,{R:()=>s,x:()=>a});var o=n(6540);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]);

View File

@ -1 +0,0 @@
"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[176],{1178(e){e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","href":"/rob/dir-mapview/","label":"Directory MapView","docId":"overview","unlisted":false},{"type":"link","href":"/rob/dir-mapview/goals","label":"Goals","docId":"goals","unlisted":false},{"type":"link","href":"/rob/dir-mapview/ideas-and-exploration","label":"Ideas & Exploration","docId":"ideas-and-exploration","unlisted":false},{"type":"link","href":"/rob/dir-mapview/milestones","label":"Milestones","docId":"milestones","unlisted":false},{"type":"link","href":"/rob/dir-mapview/todos","label":"Dir-MapView TODOs","docId":"todos","unlisted":false}]},"docs":{"goals":{"id":"goals","title":"Goals","description":"Active","sidebar":"docs"},"ideas-and-exploration":{"id":"ideas-and-exploration","title":"Ideas & Exploration","description":"Ideas","sidebar":"docs"},"milestones":{"id":"milestones","title":"Milestones","description":"M1: Proof of Concept","sidebar":"docs"},"overview":{"id":"overview","title":"Directory MapView","description":"Map-style directory navigator with zoom and pan - a reimagined file picker dialog.","sidebar":"docs"},"todos":{"id":"todos","title":"Dir-MapView TODOs","description":"Active Tasks","sidebar":"docs"}}}}')}}]);

View File

@ -1 +0,0 @@
"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[98],{1723(n,e,s){s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(5500);function o(n,e){return`docs-${n}-${e}`}var c=s(3025),t=s(2831),i=s(1463),u=s(4848);function l(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(i.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function a(n){const{version:e,route:s}=n;return(0,u.jsx)(r.e3,{className:e.className,children:(0,u.jsx)(c.n,{version:e,children:(0,t.v)(s.routes)})})}function d(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(l,{...n}),(0,u.jsx)(a,{...n})]})}}}]);

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[742],{7093(c){c.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]);

View File

@ -1 +0,0 @@
"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[207],{7271(e,t,i){i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"ideas-and-exploration","title":"Ideas & Exploration","description":"Ideas","source":"@site/docs/ideas-and-exploration.md","sourceDirName":".","slug":"/ideas-and-exploration","permalink":"/rob/dir-mapview/ideas-and-exploration","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"type":"ideas","project":"dir-mapview","updated":"2026-01-08T00:00:00.000Z"},"sidebar":"docs","previous":{"title":"Goals","permalink":"/rob/dir-mapview/goals"},"next":{"title":"Milestones","permalink":"/rob/dir-mapview/milestones"}}');var n=i(4848),a=i(8453);const o={type:"ideas",project:"dir-mapview",updated:new Date("2026-01-08T00:00:00.000Z")},r="Ideas & Exploration",l={},d=[{value:"Ideas",id:"ideas",level:2}];function c(e){const t={h1:"h1",h2:"h2",header:"header",input:"input",li:"li",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"ideas--exploration",children:"Ideas & Exploration"})}),"\n",(0,n.jsx)(t.h2,{id:"ideas",children:"Ideas"}),"\n",(0,n.jsxs)(t.ul,{className:"contains-task-list",children:["\n",(0,n.jsxs)(t.li,{className:"task-list-item",children:[(0,n.jsx)(t.input,{type:"checkbox",disabled:!0})," ","Metro/subway map style visualization option #medium"]}),"\n",(0,n.jsxs)(t.li,{className:"task-list-item",children:[(0,n.jsx)(t.input,{type:"checkbox",disabled:!0})," ","Force-directed graph layout as alternative to tree layout #medium"]}),"\n",(0,n.jsxs)(t.li,{className:"task-list-item",children:[(0,n.jsx)(t.input,{type:"checkbox",disabled:!0})," ","Integration with version control (show git status on directories) #high"]}),"\n",(0,n.jsxs)(t.li,{className:"task-list-item",children:[(0,n.jsx)(t.input,{type:"checkbox",disabled:!0})," ","Bookmarks/favorites for frequently accessed directories #medium"]}),"\n",(0,n.jsxs)(t.li,{className:"task-list-item",children:[(0,n.jsx)(t.input,{type:"checkbox",disabled:!0})," ","Search overlay for quick directory jumping #high"]}),"\n",(0,n.jsxs)(t.li,{className:"task-list-item",children:[(0,n.jsx)(t.input,{type:"checkbox",disabled:!0})," ","Animation transitions when navigating #low"]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453(e,t,i){i.d(t,{R:()=>o,x:()=>r});var s=i(6540);const n={},a=s.createContext(n);function o(e){const t=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]);

File diff suppressed because one or more lines are too long

View File

@ -1,61 +0,0 @@
/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
* @license MIT */
/**
* @license React
* react-dom-client.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-dom.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-jsx-runtime.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

View File

@ -1 +0,0 @@
(()=>{"use strict";var e,r,t,a,o,n={},i={};function c(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={id:e,loaded:!1,exports:{}};return n[e].call(t.exports,t,t.exports,c),t.loaded=!0,t.exports}c.m=n,c.c=i,e=[],c.O=(r,t,a,o)=>{if(!t){var n=1/0;for(l=0;l<e.length;l++){for(var[t,a,o]=e[l],i=!0,d=0;d<t.length;d++)(!1&o||n>=o)&&Object.keys(c.O).every(e=>c.O[e](t[d]))?t.splice(d--,1):(i=!1,o<n&&(n=o));if(i){e.splice(l--,1);var f=a();void 0!==f&&(r=f)}}return r}o=o||0;for(var l=e.length;l>0&&e[l-1][2]>o;l--)e[l]=e[l-1];e[l]=[t,a,o]},c.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return c.d(r,{a:r}),r},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);c.r(o);var n={};r=r||[null,t({}),t([]),t(t)];for(var i=2&a&&e;("object"==typeof i||"function"==typeof i)&&!~r.indexOf(i);i=t(i))Object.getOwnPropertyNames(i).forEach(r=>n[r]=()=>e[r]);return n.default=()=>e,c.d(o,n),o},c.d=(e,r)=>{for(var t in r)c.o(r,t)&&!c.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce((r,t)=>(c.f[t](e,r),r),[])),c.u=e=>"assets/js/"+({48:"a94703ab",98:"a7bd4aaa",176:"a34f593b",207:"e719f3dc",393:"1db78e9f",401:"17896441",413:"1db64337",574:"817f7194",647:"5e95c892",742:"aba21aa0",894:"5eebbccf"}[e]||e)+"."+{48:"b8c77466",98:"3ba34601",176:"ac5944a9",207:"1290d273",237:"447ba118",393:"144c1dae",401:"a2525508",413:"ff583722",574:"a8d1a093",647:"a3b66919",742:"4a552a5c",894:"e6e4c75f"}[e]+".js",c.miniCssF=e=>{},c.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),a={},o="project-public-docs:",c.l=(e,r,t,n)=>{if(a[e])a[e].push(r);else{var i,d;if(void 0!==t)for(var f=document.getElementsByTagName("script"),l=0;l<f.length;l++){var u=f[l];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==o+t){i=u;break}}i||(d=!0,(i=document.createElement("script")).charset="utf-8",c.nc&&i.setAttribute("nonce",c.nc),i.setAttribute("data-webpack",o+t),i.src=e),a[e]=[r];var b=(r,t)=>{i.onerror=i.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(e=>e(t)),r)return r(t)},s=setTimeout(b.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=b.bind(null,i.onerror),i.onload=b.bind(null,i.onload),d&&document.head.appendChild(i)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.p="/rob/dir-mapview/",c.gca=function(e){return e={17896441:"401",a94703ab:"48",a7bd4aaa:"98",a34f593b:"176",e719f3dc:"207","1db78e9f":"393","1db64337":"413","817f7194":"574","5e95c892":"647",aba21aa0:"742","5eebbccf":"894"}[e]||e,c.p+c.u(e)},(()=>{var e={354:0,869:0};c.f.j=(r,t)=>{var a=c.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(354|869)$/.test(r))e[r]=0;else{var o=new Promise((t,o)=>a=e[r]=[t,o]);t.push(a[2]=o);var n=c.p+c.u(r),i=new Error;c.l(n,t=>{if(c.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+n+")",i.name="ChunkLoadError",i.type=o,i.request=n,a[1](i)}},"chunk-"+r,r)}},c.O.j=r=>0===e[r];var r=(r,t)=>{var a,o,[n,i,d]=t,f=0;if(n.some(r=>0!==e[r])){for(a in i)c.o(i,a)&&(c.m[a]=i[a]);if(d)var l=d(c)}for(r&&r(t);f<n.length;f++)o=n[f],c.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return c.O(l)},t=globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})()})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

23
pyproject.toml Normal file
View File

@ -0,0 +1,23 @@
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "dir-mapview"
version = "0.1.0"
description = "Map-style directory navigator with zoom and pan"
readme = "README.md"
requires-python = ">=3.10"
dependencies = []
[project.optional-dependencies]
dev = [
"pytest>=7.0",
"pytest-cov>=4.0",
]
[tool.setuptools.packages.find]
where = ["src"]
[tool.pytest.ini_options]
testpaths = ["tests"]

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://pages.brrd.tech/rob/dir-mapview/goals/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://pages.brrd.tech/rob/dir-mapview/ideas-and-exploration/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://pages.brrd.tech/rob/dir-mapview/milestones/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://pages.brrd.tech/rob/dir-mapview/todos/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://pages.brrd.tech/rob/dir-mapview/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url></urlset>

File diff suppressed because one or more lines are too long